diff --git a/.gitignore b/.gitignore
index 4cf4d4a..5ed38af6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -125,6 +125,7 @@
 /chrome/setup_unittests.xml
 /chrome/supplement.gypi
 /chrome/sync_integration_tests_run.xml
+/chrome/test/android/telemetry_tests/browser_tests/*.wpr
 /chrome/test/chromeos/autotest/files/client/deps/chrome_test/test_src/
 /chrome/test/chromeos/autotest/files/client/deps/page_cycler_dep/test_src/
 /chrome/test/chromeos/autotest/files/client/deps/perf_data_dep/test_src/
@@ -419,7 +420,8 @@
 /third_party/pywebsocket/src
 /third_party/re2/src
 /third_party/requests/src
-/third_party/robolectric/lib
+/third_party/robolectric/lib/*.jar
+/third_party/robolectric/robolectric
 /third_party/scons-2.0.1
 /third_party/sfntly/src
 /third_party/shaderc/src
diff --git a/DEPS b/DEPS
index 0c55cc12..4d6b5492 100644
--- a/DEPS
+++ b/DEPS
@@ -36,11 +36,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '2adecda92b2f2ac49d78326a3c76442a0f1c4139',
+  'skia_revision': 'b8113780c3cfed640016b263194b7f1531d43312',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '4a6e53465637027d6abc2f90ab84b5d2fb2aea9d',
+  'v8_revision': 'd07de081faf9efb1e1b4e2ae3e11403f23bbf3bf',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -56,7 +56,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': 'e283e47aa3e6786dad94392db292e08ce18ccd5e',
+  'pdfium_revision': 'd8cc503575463ff3d81b22dad292665f2c88911e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -76,11 +76,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling lss
   # and whatever else without interference from each other.
-  'lss_revision': '4fc942258fe5509549333b9487ec018e3c8c5b10',
+  'lss_revision': '3f6478ac95edf86cd3da300c2c0d34a438f5dbeb',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling NaCl
   # and whatever else without interference from each other.
-  'nacl_revision': '0ea1fef9391b6084be99b9238542b4782365e23c',
+  'nacl_revision': '412a6e2bb153f39f22b9b3e47bc1ed0abb82df3f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype-android
   # and whatever else without interference from each other.
@@ -88,7 +88,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': 'c3cf2e8ef854b67718e1185ad0b5f53cf2fa0016',
+  'catapult_revision': '47a90721995444d046be36ab26a654833d96e3d2',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -106,7 +106,7 @@
 
 deps = {
   'src/breakpad/src':
-   Var('chromium_git') + '/breakpad/breakpad/src.git' + '@' + '7c70f47255713629c8053826008bd00f98d71ced',
+   Var('chromium_git') + '/breakpad/breakpad/src.git' + '@' + '51db53eec7293a35cb6fc10bd2e333f22dd9d201',
 
   'src/buildtools':
    Var('chromium_git') + '/chromium/buildtools.git' + '@' +  Var('buildtools_revision'),
@@ -184,7 +184,7 @@
     Var('chromium_git') + '/external/selenium/py.git' + '@' + '5fd78261a75fe08d27ca4835fb6c5ce4b42275bd',
 
   'src/third_party/libvpx/source/libvpx':
-   Var('chromium_git') + '/webm/libvpx.git' + '@' +  '4b073bc39a39283577c485ed1e56c92cf0eaaa89',
+   Var('chromium_git') + '/webm/libvpx.git' + '@' +  '82070ae9393b1e79559d81fcf1aa89c2e4aa58ee',
 
   'src/third_party/ffmpeg':
    Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + '24ea727552a0eaa95c8de72f99cba8d70ae658cb',
@@ -362,7 +362,7 @@
      Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
 
     'src/third_party/lss':
-      Var('chromium_git') + '/external/linux-syscall-support/lss.git' + '@' + Var('lss_revision'),
+      Var('chromium_git') + '/linux-syscall-support.git' + '@' + Var('lss_revision'),
 
     # For Linux and Chromium OS.
     'src/third_party/cros_system_api':
@@ -377,7 +377,7 @@
 
     # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
     'src/third_party/chromite':
-     Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '8c1b19c098bd84bdefdea93da75821b082f0b395',
+     Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '6da947426f1479bd148fcec6543eb5baac1ea401',
 
     # Dependency of chromite.git and skia.
     'src/third_party/pyelftools':
@@ -462,8 +462,8 @@
     'src/third_party/netty4/src':
       Var('chromium_git') + '/external/netty4.git' + '@' + 'e0f26303b4ce635365be19414d0ac81f2ef6ba3c',
 
-    'src/third_party/robolectric/lib':
-      Var('chromium_git') + '/chromium/third_party/robolectric.git' + '@' + '6b63c99a8b6967acdb42cbed0adb067c80efc810',
+    'src/third_party/robolectric/robolectric':
+      Var('chromium_git') + '/external/robolectric.git' + '@' + 'fdf24a09a4550b9fe47028fb1e24f9f119573bd7',
 
     'src/third_party/ub-uiautomator/lib':
       Var('chromium_git') + '/chromium/third_party/ub-uiautomator.git' + '@' + '00270549ce3161ae72ceb24712618ea28b4f9434',
@@ -472,7 +472,7 @@
       Var('chromium_git') + '/external/github.com/square/leakcanary.git' + '@' + '608ded739e036a3aa69db47ac43777dcee506f8e',
 
     'src/third_party/lss':
-      Var('chromium_git') + '/external/linux-syscall-support/lss.git' + '@' + Var('lss_revision'),
+      Var('chromium_git') + '/linux-syscall-support.git' + '@' + Var('lss_revision'),
 
     'src/third_party/requests/src':
       Var('chromium_git') + '/external/github.com/kennethreitz/requests.git' + '@' + 'f172b30356d821d180fa4ecfa3e71c7274a32de4',
@@ -634,6 +634,16 @@
     ],
   },
   {
+    'name': 'robolectric_libs',
+    'pattern': '.',
+    'action': ['python',
+               'src/build/android/update_deps/update_third_party_deps.py',
+               'download',
+               '-b', 'chromium-robolectric',
+               '-l', 'third_party/robolectric'
+    ],
+  },
+  {
     'name': 'apache_velocity',
     'pattern': '.',
     'action': ['python',
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 2fad49d..7d8c4a7 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -185,8 +185,6 @@
             r"simple_platform_shared_buffer_posix\.cc$",
         r"^net[\\\/]disk_cache[\\\/]cache_util\.cc$",
         r"^net[\\\/]url_request[\\\/]test_url_fetcher_factory\.cc$",
-        r"^remoting[\\\/]host[\\\/]security_key[\\\/]"
-            "security_key_auth_handler_linux\.cc$",
         r"^ui[\\\/]base[\\\/]material_design[\\\/]"
             "material_design_controller\.cc$",
         r"^ui[\\\/]gl[\\\/]init[\\\/]gl_initializer_mac\.cc$",
@@ -1498,6 +1496,32 @@
   return results
 
 
+def _CheckMojoUsesNewWrapperTypes(input_api, output_api):
+  """Checks to make sure that all newly added mojom targets map array/map/string
+     to STL (for chromium) or WTF (for blink) types.
+     TODO(yzshen): remove this check once crbug.com/624136 is completed.
+  """
+  files = []
+  pattern = input_api.re.compile(r'use_new_wrapper_types.*false',
+                                 input_api.re.MULTILINE)
+
+  for f in input_api.AffectedFiles():
+    if not f.LocalPath().endswith(('.gyp', '.gypi', 'gn', 'gni')):
+      continue
+
+    for _, line in f.ChangedContents():
+      if pattern.search(line):
+        files.append(f)
+        break
+
+  if len(files):
+    return [output_api.PresubmitError(
+        'Do not introduce new mojom targets with use_new_wrapper_types set to '
+        'false. The mode is deprecated and will be removed soon.',
+        files)]
+  return []
+
+
 def _CheckAndroidToastUsage(input_api, output_api):
   """Checks that code uses org.chromium.ui.widget.Toast instead of
      android.widget.Toast (Chromium Toast doesn't force hardware
@@ -1962,6 +1986,7 @@
   results.extend(_CheckPydepsNeedsUpdating(input_api, output_api))
   results.extend(_CheckJavaStyle(input_api, output_api))
   results.extend(_CheckIpcOwners(input_api, output_api))
+  results.extend(_CheckMojoUsesNewWrapperTypes(input_api, output_api))
 
   if any('PRESUBMIT.py' == f.LocalPath() for f in input_api.AffectedFiles()):
     results.extend(input_api.canned_checks.RunUnitTestsInDirectory(
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc
index abf4fb9..a6ce29ec 100644
--- a/android_webview/browser/aw_content_browser_client.cc
+++ b/android_webview/browser/aw_content_browser_client.cc
@@ -408,18 +408,6 @@
   return browser_context_->GetAwURLRequestContext()->GetNetLog();
 }
 
-bool AwContentBrowserClient::IsFastShutdownPossible() {
-  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kSingleProcess)) {
-    NOTREACHED()
-        << "Android WebView is single process, so IsFastShutdownPossible"
-        << " should never be called";
-    return false;
-  } else {
-    return true;
-  }
-}
-
 void AwContentBrowserClient::ClearCache(content::RenderFrameHost* rfh) {
   RemoveHttpDiskCache(rfh->GetProcess());
 }
diff --git a/android_webview/browser/aw_content_browser_client.h b/android_webview/browser/aw_content_browser_client.h
index 03bd4cac2..cdd9b60 100644
--- a/android_webview/browser/aw_content_browser_client.h
+++ b/android_webview/browser/aw_content_browser_client.h
@@ -108,7 +108,6 @@
                        bool* no_javascript_access) override;
   void ResourceDispatcherHostCreated() override;
   net::NetLog* GetNetLog() override;
-  bool IsFastShutdownPossible() override;
   void ClearCache(content::RenderFrameHost* rfh) override;
   void ClearCookies(content::RenderFrameHost* rfh) override;
   base::FilePath GetDefaultDownloadDirectory() override;
diff --git a/android_webview/gpu/aw_content_gpu_client.cc b/android_webview/gpu/aw_content_gpu_client.cc
index a841d3c..fcd3eec7 100644
--- a/android_webview/gpu/aw_content_gpu_client.cc
+++ b/android_webview/gpu/aw_content_gpu_client.cc
@@ -12,9 +12,6 @@
 
 AwContentGpuClient::~AwContentGpuClient() {}
 
-void AwContentGpuClient::ExposeInterfacesToBrowser(
-    shell::InterfaceRegistry* registry) {}
-
 gpu::SyncPointManager* AwContentGpuClient::GetSyncPointManager() {
   return sync_point_manager_callback_.Run();
 }
diff --git a/android_webview/gpu/aw_content_gpu_client.h b/android_webview/gpu/aw_content_gpu_client.h
index be294f0..931b8a1 100644
--- a/android_webview/gpu/aw_content_gpu_client.h
+++ b/android_webview/gpu/aw_content_gpu_client.h
@@ -19,7 +19,6 @@
   ~AwContentGpuClient() override;
 
   // content::ContentGpuClient implementation.
-  void ExposeInterfacesToBrowser(shell::InterfaceRegistry* registry) override;
   gpu::SyncPointManager* GetSyncPointManager() override;
 
  private:
diff --git a/ash/ash.gyp b/ash/ash.gyp
index f6cf70eb..a280c48 100644
--- a/ash/ash.gyp
+++ b/ash/ash.gyp
@@ -184,6 +184,14 @@
       'common/system/chromeos/network/vpn_delegate.h',
       'common/system/chromeos/network/vpn_list_view.cc',
       'common/system/chromeos/network/vpn_list_view.h',
+      'common/system/chromeos/palette/palette_ids.cc',
+      'common/system/chromeos/palette/palette_ids.h',
+      'common/system/chromeos/palette/palette_tool.cc',
+      'common/system/chromeos/palette/palette_tool.h',
+      'common/system/chromeos/palette/palette_tool_manager.cc',
+      'common/system/chromeos/palette/palette_tool_manager.h',
+      'common/system/chromeos/palette/palette_tray.cc',
+      'common/system/chromeos/palette/palette_tray.h',
       'common/system/chromeos/power/battery_notification.cc',
       'common/system/chromeos/power/battery_notification.h',
       'common/system/chromeos/power/dual_role_notification.cc',
@@ -294,8 +302,6 @@
       'common/system/tray/tray_constants.h',
       'common/system/tray/tray_details_view.cc',
       'common/system/tray/tray_details_view.h',
-      'common/system/tray/tray_empty.cc',
-      'common/system/tray/tray_empty.h',
       'common/system/tray/tray_event_filter.cc',
       'common/system/tray/tray_event_filter.h',
       'common/system/tray/tray_image_item.cc',
@@ -844,6 +850,8 @@
       'test/test_suite_init.mm',
       'test/test_system_tray_delegate.cc',
       'test/test_system_tray_delegate.h',
+      'test/test_system_tray_item.cc',
+      'test/test_system_tray_item.h',
       'test/test_user_wallpaper_delegate.cc',
       'test/test_user_wallpaper_delegate.h',
       'test/test_volume_control_delegate.cc',
@@ -912,6 +920,7 @@
       'common/system/chromeos/brightness/tray_brightness_unittest.cc',
       'common/system/chromeos/ime_menu/ime_menu_tray_unittest.cc',
       'common/system/chromeos/media_security/multi_profile_media_tray_item_unittest.cc',
+      'common/system/chromeos/palette/palette_tool_manager_unittest.cc',
       'common/system/chromeos/power/power_status_unittest.cc',
       'common/system/chromeos/power/power_status_view_unittest.cc',
       'common/system/chromeos/power/tray_power_unittest.cc',
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd
index 6e54599..81ee1055 100644
--- a/ash/ash_strings.grd
+++ b/ash/ash_strings.grd
@@ -363,6 +363,10 @@
         Previous menu
       </message>
 
+      <message name="IDS_ASH_PALETTE_TITLE" desc="The title of the palette in the ash shelf.">
+        Palette
+      </message>
+
       <message name="IDS_ASH_TOAST_DISMISS_BUTTON" desc="The text button shown in toasts to close the toast immediately without waiting timeout.">
         DISMISS
       </message>
diff --git a/ash/common/strings/ash_strings_am.xtb b/ash/common/strings/ash_strings_am.xtb
index 6bd767d..5383ff15 100644
--- a/ash/common/strings/ash_strings_am.xtb
+++ b/ash/common/strings/ash_strings_am.xtb
@@ -182,6 +182,7 @@
 <translation id="6585808820553845416">ክፍለ-ጊዜ በ<ph name="SESSION_TIME_REMAINING" /> ውስጥ ያበቃል።</translation>
 <translation id="6596816719288285829">IP አድራሻ</translation>
 <translation id="6650933572246256093">የብሉቱዝ መሣሪያ «<ph name="DEVICE_NAME" />» ለመጣመር ፍቃድ ይፈልጋል። እባክዎ ይህን የይለፍ ቁልፍ በዚህ መሣሪያ ላይ ያስገቡ፦ <ph name="PASSKEY" /></translation>
+<translation id="6700713906295497288">የIME ምናሌ አዝራር</translation>
 <translation id="6713285437468012787">የብሉቱዝ መሣሪያ «<ph name="DEVICE_NAME" />» ተጣምሯል፣ እና አሁን ለሁሉም ተጠቃሚዎች ይገኛል። ቅንብሮችን በመጠቀም ይህን ጥምረት ማስወገድ ይችላሉ።</translation>
 <translation id="6785414152754474415">ባትሪው <ph name="PERCENTAGE" />% ሙሉ ሆኖ በተጨማሪም ኃይል እየሞላ ነው።</translation>
 <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/common/strings/ash_strings_ar.xtb b/ash/common/strings/ash_strings_ar.xtb
index 5b3802a1..ab986e5 100644
--- a/ash/common/strings/ash_strings_ar.xtb
+++ b/ash/common/strings/ash_strings_ar.xtb
@@ -181,6 +181,7 @@
 <translation id="6585808820553845416">تنتهي الجلسة في <ph name="SESSION_TIME_REMAINING" />.</translation>
 <translation id="6596816719288285829">‏عنوان IP</translation>
 <translation id="6650933572246256093">يريد جهاز بلوتوث "<ph name="DEVICE_NAME" />" الحصول على إذن للإقران. الرجاء إدخال مفتاح المرور هذا في هذا الجهاز: <ph name="PASSKEY" /></translation>
+<translation id="6700713906295497288">‏زر قائمة أداة تحرير أسلوب الإدخال (IME)</translation>
 <translation id="6713285437468012787">تم إقران جهاز بلوتوث "<ph name="DEVICE_NAME" />" وهو الآن متاح لجميع المستخدمين. يمكنك إزالة هذا الإقران باستخدام الإعدادات.</translation>
 <translation id="6785414152754474415">اكتمل شحن <ph name="PERCENTAGE" />% من البطارية ويجري شحنها.</translation>
 <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/common/strings/ash_strings_bg.xtb b/ash/common/strings/ash_strings_bg.xtb
index 3a4dfa4..005b94a 100644
--- a/ash/common/strings/ash_strings_bg.xtb
+++ b/ash/common/strings/ash_strings_bg.xtb
@@ -182,6 +182,7 @@
 <translation id="6585808820553845416">Сесията приключва след <ph name="SESSION_TIME_REMAINING" />.</translation>
 <translation id="6596816719288285829">IP адрес</translation>
 <translation id="6650933572246256093">Устройството с Bluetooth „<ph name="DEVICE_NAME" />“ иска разрешение за сдвояване. Моля, въведете на него следния ключ за достъп: <ph name="PASSKEY" /></translation>
+<translation id="6700713906295497288">Бутон за меню на редактора за метод на въвеждане</translation>
 <translation id="6713285437468012787">Устройството с Bluetooth „<ph name="DEVICE_NAME" />“ е сдвоено и сега е налице за всички потребители. Може да премахнете това сдвояване посредством „Настройки“.</translation>
 <translation id="6785414152754474415">Батерията е <ph name="PERCENTAGE" />% пълна и се зарежда.</translation>
 <translation id="683971173229319003">търсене + L</translation>
diff --git a/ash/common/strings/ash_strings_en-GB.xtb b/ash/common/strings/ash_strings_en-GB.xtb
index f3041a3..965edfa3 100644
--- a/ash/common/strings/ash_strings_en-GB.xtb
+++ b/ash/common/strings/ash_strings_en-GB.xtb
@@ -182,6 +182,7 @@
 <translation id="6585808820553845416">Session ends in <ph name="SESSION_TIME_REMAINING" />.</translation>
 <translation id="6596816719288285829">IP Address</translation>
 <translation id="6650933572246256093">Bluetooth device "<ph name="DEVICE_NAME" />" would like permission to pair. Please enter this passkey on that device: <ph name="PASSKEY" /></translation>
+<translation id="6700713906295497288">IME menu button</translation>
 <translation id="6713285437468012787">Bluetooth device "<ph name="DEVICE_NAME" />" has been paired and is now available to all users. You may remove this pairing using Settings.</translation>
 <translation id="6785414152754474415">Battery is <ph name="PERCENTAGE" />% full and charging.</translation>
 <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/common/strings/ash_strings_ko.xtb b/ash/common/strings/ash_strings_ko.xtb
index 76a3767..3844a047 100644
--- a/ash/common/strings/ash_strings_ko.xtb
+++ b/ash/common/strings/ash_strings_ko.xtb
@@ -182,6 +182,7 @@
 <translation id="6585808820553845416">세션이 <ph name="SESSION_TIME_REMAINING" /> 후에 종료됩니다.</translation>
 <translation id="6596816719288285829">IP 주소</translation>
 <translation id="6650933572246256093">블루투스 기기 '<ph name="DEVICE_NAME" />'에서 페어링 허가를 요청합니다. 해당 기기에서 다음 패스키를 입력하세요. <ph name="PASSKEY" /></translation>
+<translation id="6700713906295497288">IME 메뉴 버튼</translation>
 <translation id="6713285437468012787">블루투스 기기 '<ph name="DEVICE_NAME" />'이(가) 페어링되어 이제 모든 사용자가 사용할 수 있습니다. 설정에서 이 페어링을 삭제할 수 있습니다.</translation>
 <translation id="6785414152754474415">배터리가 <ph name="PERCENTAGE" />% 충전되었으며 충전 중입니다.</translation>
 <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/common/strings/ash_strings_ms.xtb b/ash/common/strings/ash_strings_ms.xtb
index 678a9323..4f8d4106 100644
--- a/ash/common/strings/ash_strings_ms.xtb
+++ b/ash/common/strings/ash_strings_ms.xtb
@@ -181,6 +181,7 @@
 <translation id="6585808820553845416">Sesi berakhir dalam <ph name="SESSION_TIME_REMAINING" />.</translation>
 <translation id="6596816719288285829">Alamat IP</translation>
 <translation id="6650933572246256093">Peranti Bluetooth "<ph name="DEVICE_NAME" />" ingin kebenaran untuk berpasangan. Sila masukkan kekunci laluan ini pada peranti tersebut: <ph name="PASSKEY" /></translation>
+<translation id="6700713906295497288">Butang menu IME</translation>
 <translation id="6713285437468012787">Peranti Bluetooth "<ph name="DEVICE_NAME" />" telah dipasangkan dan kini tersedia untuk semua pengguna. Anda boleh mengalih keluar pasangan ini menggunakan Tetapan.</translation>
 <translation id="6785414152754474415">Bateri <ph name="PERCENTAGE" />% penuh dan sedang dicas.</translation>
 <translation id="683971173229319003">Carian+L</translation>
diff --git a/ash/common/strings/ash_strings_sv.xtb b/ash/common/strings/ash_strings_sv.xtb
index 290d8ee..da1bed0 100644
--- a/ash/common/strings/ash_strings_sv.xtb
+++ b/ash/common/strings/ash_strings_sv.xtb
@@ -181,6 +181,7 @@
 <translation id="6585808820553845416">Sessionen upphör om <ph name="SESSION_TIME_REMAINING" />.</translation>
 <translation id="6596816719288285829">IP-adress</translation>
 <translation id="6650933572246256093">Bluetooth-enheten <ph name="DEVICE_NAME" /> har begärt tillstånd för koppling. Ange denna lösenordsnyckel på den enheten: <ph name="PASSKEY" /></translation>
+<translation id="6700713906295497288">IME-menyknapp</translation>
 <translation id="6713285437468012787">Bluetooth-enheten <ph name="DEVICE_NAME" /> har kopplats och är nu tillgänglig för alla användare. Du kan ta bort kopplingen i Inställningar.</translation>
 <translation id="6785414152754474415">Batteriet är fullt till <ph name="PERCENTAGE" /> % och laddas.</translation>
 <translation id="683971173229319003">Sök+L</translation>
diff --git a/ash/common/strings/ash_strings_sw.xtb b/ash/common/strings/ash_strings_sw.xtb
index 39b9f3d..0553672 100644
--- a/ash/common/strings/ash_strings_sw.xtb
+++ b/ash/common/strings/ash_strings_sw.xtb
@@ -182,6 +182,7 @@
 <translation id="6585808820553845416">Kipindi kitakwisha baada ya <ph name="SESSION_TIME_REMAINING" />.</translation>
 <translation id="6596816719288285829">Anwani ya IP</translation>
 <translation id="6650933572246256093">Kifaa cha Bluetooth cha "<ph name="DEVICE_NAME" />" kinaomba idhini ya kuoanisha. Tafadhali weka nenosiri hili kwenye kifaa hicho: <ph name="PASSKEY" /></translation>
+<translation id="6700713906295497288">Kitufe cha menyu ya IME</translation>
 <translation id="6713285437468012787">Kifaa cha Bluetooth cha "<ph name="DEVICE_NAME" />" kimeoanishwa na sasa kinapatikana kwa watumiaji wote. Unaweza kuondoa uoanishaji huu kwa kutumia Mipangilio.</translation>
 <translation id="6785414152754474415">Betri imejaa <ph name="PERCENTAGE" />% na inachaji.</translation>
 <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/common/strings/ash_strings_vi.xtb b/ash/common/strings/ash_strings_vi.xtb
index 5559bb1..72df4a2 100644
--- a/ash/common/strings/ash_strings_vi.xtb
+++ b/ash/common/strings/ash_strings_vi.xtb
@@ -182,6 +182,7 @@
 <translation id="6585808820553845416">Phiên sẽ kết thúc sau <ph name="SESSION_TIME_REMAINING" />.</translation>
 <translation id="6596816719288285829">Địa chỉ IP</translation>
 <translation id="6650933572246256093">Thiết bị Bluetooth "<ph name="DEVICE_NAME" />" muốn được phép ghép nối. Vui lòng nhập mã xác nhận này trên thiết bị đó: <ph name="PASSKEY" /></translation>
+<translation id="6700713906295497288">Nút menu IME</translation>
 <translation id="6713285437468012787">Thiết bị Bluetooth "<ph name="DEVICE_NAME" />"đã được ghép nối và hiện khả dụng với tất cả người dùng. Bạn có thể xóa ghép nối này bằng Cài đặt.</translation>
 <translation id="6785414152754474415">Pin đầy <ph name="PERCENTAGE" />% và đang sạc.</translation>
 <translation id="683971173229319003">Search+L</translation>
diff --git a/ash/common/system/audio/tray_audio.cc b/ash/common/system/audio/tray_audio.cc
index 6653582d..8ff0987 100644
--- a/ash/common/system/audio/tray_audio.cc
+++ b/ash/common/system/audio/tray_audio.cc
@@ -42,7 +42,7 @@
 
 TrayAudio::TrayAudio(SystemTray* system_tray,
                      std::unique_ptr<system::TrayAudioDelegate> audio_delegate)
-    : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_VOLUME_MUTE),
+    : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_VOLUME_MUTE, UMA_AUDIO),
       audio_delegate_(std::move(audio_delegate)),
       volume_view_(NULL),
       pop_up_volume_view_(false) {
diff --git a/ash/common/system/audio/volume_view.cc b/ash/common/system/audio/volume_view.cc
index 786910a..51f24459 100644
--- a/ash/common/system/audio/volume_view.cc
+++ b/ash/common/system/audio/volume_view.cc
@@ -142,7 +142,7 @@
   separator_->SetBorder(views::Border::CreateEmptyBorder(
       kSeparatorVerticalInset, 0, kSeparatorVerticalInset, kBoxLayoutPadding));
 
-  more_region_ = new TrayPopupItemContainer(separator_, true, false);
+  more_region_ = new TrayPopupItemContainer(separator_, true);
   more_region_->SetBorder(
       views::Border::CreateEmptyBorder(0, 0, 0, kTrayPopupPaddingBetweenItems));
   AddChildView(more_region_);
diff --git a/ash/common/system/cast/tray_cast.cc b/ash/common/system/cast/tray_cast.cc
index 7fe11386..316e2a9 100644
--- a/ash/common/system/cast/tray_cast.cc
+++ b/ash/common/system/cast/tray_cast.cc
@@ -532,7 +532,8 @@
 
 }  // namespace tray
 
-TrayCast::TrayCast(SystemTray* system_tray) : SystemTrayItem(system_tray) {
+TrayCast::TrayCast(SystemTray* system_tray)
+    : SystemTrayItem(system_tray, UMA_CAST) {
   WmShell::Get()->AddShellObserver(this);
 }
 
diff --git a/ash/common/system/chromeos/bluetooth/tray_bluetooth.cc b/ash/common/system/chromeos/bluetooth/tray_bluetooth.cc
index 482d4f0..16d683f6 100644
--- a/ash/common/system/chromeos/bluetooth/tray_bluetooth.cc
+++ b/ash/common/system/chromeos/bluetooth/tray_bluetooth.cc
@@ -394,7 +394,9 @@
 }  // namespace tray
 
 TrayBluetooth::TrayBluetooth(SystemTray* system_tray)
-    : SystemTrayItem(system_tray), default_(NULL), detailed_(NULL) {
+    : SystemTrayItem(system_tray, UMA_BLUETOOTH),
+      default_(nullptr),
+      detailed_(nullptr) {
   WmShell::Get()->system_tray_notifier()->AddBluetoothObserver(this);
 }
 
diff --git a/ash/common/system/chromeos/brightness/tray_brightness.cc b/ash/common/system/chromeos/brightness/tray_brightness.cc
index 8703cb2..cdfb641 100644
--- a/ash/common/system/chromeos/brightness/tray_brightness.cc
+++ b/ash/common/system/chromeos/brightness/tray_brightness.cc
@@ -171,7 +171,7 @@
 }  // namespace tray
 
 TrayBrightness::TrayBrightness(SystemTray* system_tray)
-    : SystemTrayItem(system_tray),
+    : SystemTrayItem(system_tray, UMA_DISPLAY_BRIGHTNESS),
       brightness_view_(NULL),
       current_percent_(100.0),
       got_current_percent_(false),
diff --git a/ash/common/system/chromeos/enterprise/tray_enterprise.cc b/ash/common/system/chromeos/enterprise/tray_enterprise.cc
index 380f0b7..f58f670 100644
--- a/ash/common/system/chromeos/enterprise/tray_enterprise.cc
+++ b/ash/common/system/chromeos/enterprise/tray_enterprise.cc
@@ -16,7 +16,7 @@
 namespace ash {
 
 TrayEnterprise::TrayEnterprise(SystemTray* system_tray)
-    : SystemTrayItem(system_tray), tray_view_(NULL) {
+    : SystemTrayItem(system_tray, UMA_ENTERPRISE), tray_view_(nullptr) {
   WmShell::Get()->system_tray_notifier()->AddEnterpriseDomainObserver(this);
 }
 
diff --git a/ash/common/system/chromeos/media_security/multi_profile_media_tray_item.cc b/ash/common/system/chromeos/media_security/multi_profile_media_tray_item.cc
index fa32b6a..3f55b8b 100644
--- a/ash/common/system/chromeos/media_security/multi_profile_media_tray_item.cc
+++ b/ash/common/system/chromeos/media_security/multi_profile_media_tray_item.cc
@@ -62,7 +62,8 @@
 }  // namespace tray
 
 MultiProfileMediaTrayItem::MultiProfileMediaTrayItem(SystemTray* system_tray)
-    : SystemTrayItem(system_tray), tray_view_(nullptr) {}
+    : SystemTrayItem(system_tray, UMA_MULTI_PROFILE_MEDIA),
+      tray_view_(nullptr) {}
 
 MultiProfileMediaTrayItem::~MultiProfileMediaTrayItem() {}
 
diff --git a/ash/common/system/chromeos/network/tray_network.cc b/ash/common/system/chromeos/network/tray_network.cc
index 318b5eb..b094425 100644
--- a/ash/common/system/chromeos/network/tray_network.cc
+++ b/ash/common/system/chromeos/network/tray_network.cc
@@ -235,7 +235,7 @@
 }  // namespace tray
 
 TrayNetwork::TrayNetwork(SystemTray* system_tray)
-    : SystemTrayItem(system_tray),
+    : SystemTrayItem(system_tray, UMA_NETWORK),
       tray_(NULL),
       default_(NULL),
       detailed_(NULL),
diff --git a/ash/common/system/chromeos/network/tray_sms.cc b/ash/common/system/chromeos/network/tray_sms.cc
index 77e58cad..95c61518 100644
--- a/ash/common/system/chromeos/network/tray_sms.cc
+++ b/ash/common/system/chromeos/network/tray_sms.cc
@@ -294,7 +294,7 @@
 };
 
 TraySms::TraySms(SystemTray* system_tray)
-    : SystemTrayItem(system_tray),
+    : SystemTrayItem(system_tray, UMA_SMS),
       default_(nullptr),
       detailed_(nullptr),
       notification_(nullptr) {
diff --git a/ash/common/system/chromeos/network/tray_vpn.cc b/ash/common/system/chromeos/network/tray_vpn.cc
index ac80f52..bb797c6 100644
--- a/ash/common/system/chromeos/network/tray_vpn.cc
+++ b/ash/common/system/chromeos/network/tray_vpn.cc
@@ -112,7 +112,9 @@
 }  // namespace tray
 
 TrayVPN::TrayVPN(SystemTray* system_tray)
-    : SystemTrayItem(system_tray), default_(NULL), detailed_(NULL) {
+    : SystemTrayItem(system_tray, UMA_VPN),
+      default_(nullptr),
+      detailed_(nullptr) {
   network_state_observer_.reset(new TrayNetworkStateObserver(this));
 }
 
diff --git a/ash/common/system/chromeos/palette/palette_ids.cc b/ash/common/system/chromeos/palette/palette_ids.cc
new file mode 100644
index 0000000..5d5f4851
--- /dev/null
+++ b/ash/common/system/chromeos/palette/palette_ids.cc
@@ -0,0 +1,42 @@
+// 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 "ash/common/system/chromeos/palette/palette_ids.h"
+#include "base/logging.h"
+
+namespace ash {
+
+std::string PaletteToolIdToString(PaletteToolId tool_id) {
+  switch (tool_id) {
+    case PaletteToolId::NONE:
+      return "NONE";
+    case PaletteToolId::CREATE_NOTE:
+      return "CREATE_NOTE";
+    case PaletteToolId::CAPTURE_REGION:
+      return "CAPTURE_REGION";
+    case PaletteToolId::CAPTURE_SCREEN:
+      return "CAPTURE_SCREEN";
+    case PaletteToolId::LASER_POINTER:
+      return "LASER_POINTER";
+    case PaletteToolId::MAGNIFY:
+      return "MAGNIFY";
+  }
+
+  NOTREACHED();
+  return std::string();
+}
+
+std::string PaletteGroupToString(PaletteGroup group) {
+  switch (group) {
+    case PaletteGroup::ACTION:
+      return "ACTION";
+    case PaletteGroup::MODE:
+      return "MODE";
+  }
+
+  NOTREACHED();
+  return std::string();
+}
+
+}  // namespace ash
diff --git a/ash/common/system/chromeos/palette/palette_ids.h b/ash/common/system/chromeos/palette/palette_ids.h
new file mode 100644
index 0000000..bc33f972
--- /dev/null
+++ b/ash/common/system/chromeos/palette/palette_ids.h
@@ -0,0 +1,35 @@
+// 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 ASH_COMMON_SYSTEM_CHROMEOS_PALETTE_PALETTE_IDS_H_
+#define ASH_COMMON_SYSTEM_CHROMEOS_PALETTE_PALETTE_IDS_H_
+
+#include <string>
+
+#include "ash/ash_export.h"
+
+namespace ash {
+
+// Palette tools are grouped into different categories. Each tool corresponds to
+// exactly one group, and at most one tool can be active per group. Actions are
+// actions the user wants to do, such as take a screenshot, and modes generally
+// change OS behavior, like showing a laser pointer instead of a cursor.
+enum class PaletteGroup { ACTION, MODE };
+
+enum class PaletteToolId {
+  NONE,
+  CREATE_NOTE,
+  CAPTURE_REGION,
+  CAPTURE_SCREEN,
+  LASER_POINTER,
+  MAGNIFY,
+};
+
+// Helper functions that convert PaletteToolIds and PaletteGroups to strings.
+ASH_EXPORT std::string PaletteToolIdToString(PaletteToolId tool_id);
+ASH_EXPORT std::string PaletteGroupToString(PaletteGroup group);
+
+}  // namespace ash
+
+#endif  // ASH_COMMON_SYSTEM_CHROMEOS_PALETTE_PALETTE_IDS_H_
diff --git a/ash/common/system/chromeos/palette/palette_tool.cc b/ash/common/system/chromeos/palette/palette_tool.cc
new file mode 100644
index 0000000..c258c706
--- /dev/null
+++ b/ash/common/system/chromeos/palette/palette_tool.cc
@@ -0,0 +1,31 @@
+// 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 "ash/common/system/chromeos/palette/palette_tool.h"
+
+#include "base/logging.h"
+#include "ui/gfx/vector_icons_public.h"
+
+namespace ash {
+
+// static
+void PaletteTool::RegisterToolInstances(PaletteToolManager* tool_manager) {}
+
+PaletteTool::PaletteTool(Delegate* delegate) : delegate_(delegate) {}
+
+PaletteTool::~PaletteTool() {}
+
+void PaletteTool::OnEnable() {
+  enabled_ = true;
+}
+
+void PaletteTool::OnDisable() {
+  enabled_ = false;
+}
+
+gfx::VectorIconId PaletteTool::GetActiveTrayIcon() {
+  return gfx::VectorIconId::VECTOR_ICON_NONE;
+}
+
+}  // namespace ash
diff --git a/ash/common/system/chromeos/palette/palette_tool.h b/ash/common/system/chromeos/palette/palette_tool.h
new file mode 100644
index 0000000..fdc6e44
--- /dev/null
+++ b/ash/common/system/chromeos/palette/palette_tool.h
@@ -0,0 +1,106 @@
+// 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 ASH_COMMON_SYSTEM_CHROMEOS_PALETTE_PALETTE_TOOL_H_
+#define ASH_COMMON_SYSTEM_CHROMEOS_PALETTE_PALETTE_TOOL_H_
+
+#include <map>
+#include <memory>
+#include <vector>
+
+#include "ash/ash_export.h"
+#include "base/callback.h"
+#include "base/macros.h"
+#include "ui/gfx/vector_icon_types.h"
+
+namespace views {
+class View;
+}
+
+namespace ash {
+
+class WmWindow;
+
+enum class PaletteGroup;
+enum class PaletteToolId;
+class PaletteToolManager;
+
+// A PaletteTool is a generalized action inside of the palette menu in the
+// shelf. Only one tool per group is active at any given time. When the tool is
+// active, it should be showing some specializied UI. The tool is no longer
+// active if it completes its action, if the user selects another tool with the
+// same group, or if the user just cancels the action from the palette.
+class ASH_EXPORT PaletteTool {
+ public:
+  class Delegate {
+   public:
+    Delegate() {}
+    virtual ~Delegate() {}
+
+    // Enable or disable a specific tool.
+    virtual void EnableTool(PaletteToolId tool_id) = 0;
+    virtual void DisableTool(PaletteToolId tool_id) = 0;
+
+    // Hide the entire palette. This should not change any tool state.
+    virtual void HidePalette() = 0;
+
+    // Returns the root window.
+    virtual WmWindow* GetWindow() = 0;
+
+   private:
+    DISALLOW_COPY_AND_ASSIGN(Delegate);
+  };
+
+  // Adds all available PaletteTool instances to the tool_manager.
+  static void RegisterToolInstances(PaletteToolManager* tool_manager);
+
+  // |delegate| must outlive this tool instance.
+  explicit PaletteTool(Delegate* delegate);
+  virtual ~PaletteTool();
+
+  // The group this tool belongs to. Only one tool per group can be active at
+  // any given time.
+  virtual PaletteGroup GetGroup() const = 0;
+
+  // The unique identifier for this tool. This should be the only tool that ever
+  // has this ID.
+  virtual PaletteToolId GetToolId() const = 0;
+
+  // Called when the user activates the tool. Only one tool per group can be
+  // active at any given time.
+  virtual void OnEnable();
+
+  // Disable the tool, either because this tool called DisableSelf(), the
+  // user cancelled the tool, or the user activated another tool within the
+  // same group.
+  virtual void OnDisable();
+
+  // Create a view that will be used in the palette. The view is owned by the
+  // caller. OnViewDestroyed is called when the view has been deallocated by its
+  // owner.
+  virtual views::View* CreateView() = 0;
+  virtual void OnViewDestroyed() = 0;
+
+  // Returns an icon to use in the tray if this tool is active. Only one tool
+  // (per-group) should ever have an active icon at any given time.
+  virtual gfx::VectorIconId GetActiveTrayIcon();
+
+ protected:
+  // Enables/disables the tool.
+  bool enabled() const { return enabled_; }
+
+  Delegate* delegate() { return delegate_; }
+
+ private:
+  bool enabled_ = false;
+
+  // Unowned pointer to the delegate. The delegate should outlive this instance.
+  Delegate* delegate_;
+
+  DISALLOW_COPY_AND_ASSIGN(PaletteTool);
+};
+
+}  // namespace ash
+
+#endif  // ASH_COMMON_SYSTEM_CHROMEOS_PALETTE_PALETTE_TOOL_H_
diff --git a/ash/common/system/chromeos/palette/palette_tool_manager.cc b/ash/common/system/chromeos/palette/palette_tool_manager.cc
new file mode 100644
index 0000000..c3b0d3d
--- /dev/null
+++ b/ash/common/system/chromeos/palette/palette_tool_manager.cc
@@ -0,0 +1,123 @@
+// 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 "ash/common/system/chromeos/palette/palette_tool_manager.h"
+
+#include <algorithm>
+
+#include "ash/common/system/chromeos/palette/palette_tool.h"
+#include "base/bind.h"
+#include "ui/gfx/vector_icons_public.h"
+
+namespace ash {
+
+PaletteToolManager::PaletteToolManager(Delegate* delegate)
+    : delegate_(delegate) {
+  DCHECK(delegate_);
+}
+
+PaletteToolManager::~PaletteToolManager() {}
+
+void PaletteToolManager::AddTool(std::unique_ptr<PaletteTool> tool) {
+  // The same PaletteToolId cannot be registered twice.
+  DCHECK_EQ(0, std::count_if(tools_.begin(), tools_.end(),
+                             [&tool](const std::unique_ptr<PaletteTool>& t) {
+                               return t->GetToolId() == tool->GetToolId();
+                             }));
+
+  tools_.emplace_back(std::move(tool));
+}
+
+void PaletteToolManager::ActivateTool(PaletteToolId tool_id) {
+  PaletteTool* new_tool = FindToolById(tool_id);
+  DCHECK(new_tool);
+
+  PaletteTool* previous_tool = active_tools_[new_tool->GetGroup()];
+
+  if (new_tool == previous_tool)
+    return;
+
+  if (previous_tool)
+    previous_tool->OnDisable();
+
+  active_tools_[new_tool->GetGroup()] = new_tool;
+  new_tool->OnEnable();
+
+  delegate_->OnActiveToolChanged();
+}
+
+void PaletteToolManager::DeactivateTool(PaletteToolId tool_id) {
+  PaletteTool* tool = FindToolById(tool_id);
+  DCHECK(tool);
+
+  active_tools_[tool->GetGroup()] = nullptr;
+  tool->OnDisable();
+
+  delegate_->OnActiveToolChanged();
+}
+
+bool PaletteToolManager::IsToolActive(PaletteToolId tool_id) {
+  PaletteTool* tool = FindToolById(tool_id);
+  DCHECK(tool);
+
+  return active_tools_[tool->GetGroup()] == tool;
+}
+
+PaletteToolId PaletteToolManager::GetActiveTool(PaletteGroup group) {
+  PaletteTool* active_tool = active_tools_[group];
+  return active_tool ? active_tool->GetToolId() : PaletteToolId::NONE;
+}
+
+gfx::VectorIconId PaletteToolManager::GetActiveTrayIcon(PaletteToolId tool_id) {
+  PaletteTool* tool = FindToolById(tool_id);
+  if (!tool)
+    return gfx::VectorIconId::PALETTE_TRAY_ICON_DEFAULT;
+
+  return tool->GetActiveTrayIcon();
+}
+
+std::vector<PaletteToolView> PaletteToolManager::CreateViews() {
+  std::vector<PaletteToolView> views(tools_.size());
+
+  for (size_t i = 0; i < tools_.size(); ++i) {
+    PaletteToolView* view = &views[i];
+    view->group = tools_[i]->GetGroup();
+    view->tool_id = tools_[i]->GetToolId();
+    view->view = tools_[i]->CreateView();
+  }
+
+  return views;
+}
+
+void PaletteToolManager::NotifyViewsDestroyed() {
+  for (std::unique_ptr<PaletteTool>& tool : tools_)
+    tool->OnViewDestroyed();
+}
+
+void PaletteToolManager::EnableTool(PaletteToolId tool_id) {
+  ActivateTool(tool_id);
+}
+
+void PaletteToolManager::DisableTool(PaletteToolId tool_id) {
+  DeactivateTool(tool_id);
+}
+
+void PaletteToolManager::HidePalette() {
+  delegate_->HidePalette();
+}
+
+WmWindow* PaletteToolManager::GetWindow() {
+  return delegate_->GetWindow();
+}
+
+PaletteTool* PaletteToolManager::FindToolById(PaletteToolId tool_id) {
+  for (std::unique_ptr<PaletteTool>& tool : tools_) {
+    if (tool->GetToolId() == tool_id)
+      return tool.get();
+  }
+
+  return nullptr;
+}
+
+}  // namespace ash
diff --git a/ash/common/system/chromeos/palette/palette_tool_manager.h b/ash/common/system/chromeos/palette/palette_tool_manager.h
new file mode 100644
index 0000000..503a168
--- /dev/null
+++ b/ash/common/system/chromeos/palette/palette_tool_manager.h
@@ -0,0 +1,109 @@
+// 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 ASH_COMMON_SYSTEM_CHROMEOS_PALETTE_PALETTE_TOOL_MANAGER_H_
+#define ASH_COMMON_SYSTEM_CHROMEOS_PALETTE_PALETTE_TOOL_MANAGER_H_
+
+#include <map>
+#include <memory>
+#include <vector>
+
+#include "ash/ash_export.h"
+#include "ash/common/system/chromeos/palette/palette_ids.h"
+#include "ash/common/system/chromeos/palette/palette_tool.h"
+#include "base/callback.h"
+#include "base/macros.h"
+
+namespace views {
+class View;
+}
+
+namespace ash {
+
+class PaletteTool;
+enum class PaletteGroup;
+enum class PaletteToolId;
+class WmWindow;
+
+struct ASH_EXPORT PaletteToolView {
+  PaletteGroup group;
+  PaletteToolId tool_id;
+  views::View* view;
+};
+
+class ASH_EXPORT PaletteToolManager : public PaletteTool::Delegate {
+ public:
+  class Delegate {
+   public:
+    Delegate() {}
+    virtual ~Delegate() {}
+
+    // Hide the palette (if shown).
+    virtual void HidePalette() = 0;
+
+    // Called when the active tool has changed.
+    virtual void OnActiveToolChanged() = 0;
+
+    // Return the window associated with this palette.
+    virtual WmWindow* GetWindow() = 0;
+
+   private:
+    DISALLOW_COPY_AND_ASSIGN(Delegate);
+  };
+
+  // Creates the tool manager.
+  PaletteToolManager(Delegate* delegate);
+  ~PaletteToolManager() override;
+
+  // Adds the given |tool| to the tool manager. The tool is assumed to be in a
+  // deactivated state. This class takes ownership over |tool|.
+  void AddTool(std::unique_ptr<PaletteTool> tool);
+
+  // Activates tool_id and deactivates any other active tool in the same
+  // group as tool_id.
+  void ActivateTool(PaletteToolId tool_id);
+
+  // Deactivates the given tool.
+  void DeactivateTool(PaletteToolId tool_id);
+
+  // Optional methods that are not likely to be needed, but will be
+  // implemented if necessary.
+  bool IsToolActive(PaletteToolId tool_id);
+  PaletteToolId GetActiveTool(PaletteGroup group);
+
+  // Fetch the active tray icon for the given tool. Returns
+  // gfx::VectorIconId::VECTOR_ICON_NONE if not available.
+  gfx::VectorIconId GetActiveTrayIcon(PaletteToolId tool_id);
+
+  // Create views for all of the registered tools.
+  std::vector<PaletteToolView> CreateViews();
+
+  // Called when the views returned by CreateViews have been destroyed. This
+  // should clear any (now) stale references.
+  void NotifyViewsDestroyed();
+
+ private:
+  // PaleteTool::Delegate overrides.
+  void EnableTool(PaletteToolId tool_id) override;
+  void DisableTool(PaletteToolId tool_id) override;
+  void HidePalette() override;
+  WmWindow* GetWindow() override;
+
+  PaletteTool* FindToolById(PaletteToolId tool_id);
+
+  // Unowned pointer to the delegate to provide external functionality.
+  Delegate* delegate_;
+
+  // Unowned pointer to the active tool / group.
+  std::map<PaletteGroup, PaletteTool*> active_tools_;
+
+  // Owned list of all tools.
+  std::vector<std::unique_ptr<PaletteTool>> tools_;
+
+  DISALLOW_COPY_AND_ASSIGN(PaletteToolManager);
+};
+
+}  // namespace ash
+
+#endif  // ASH_COMMON_SYSTEM_CHROMEOS_PALETTE_PALETTE_TOOL_MANAGER_H_
diff --git a/ash/common/system/chromeos/palette/palette_tool_manager_unittest.cc b/ash/common/system/chromeos/palette/palette_tool_manager_unittest.cc
new file mode 100644
index 0000000..45b4c41
--- /dev/null
+++ b/ash/common/system/chromeos/palette/palette_tool_manager_unittest.cc
@@ -0,0 +1,134 @@
+// 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 "ash/common/system/chromeos/palette/palette_tool.h"
+#include "ash/common/system/chromeos/palette/palette_tool_manager.h"
+#include "base/bind.h"
+#include "base/logging.h"
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using namespace ash;
+
+namespace {
+
+// A simple tool instance that exposes some additional data for testing.
+class TestTool : public PaletteTool {
+ public:
+  TestTool(Delegate* delegate, PaletteGroup group, PaletteToolId tool_id)
+      : PaletteTool(delegate), group_(group), tool_id_(tool_id) {}
+
+  // PaletteTool:
+  PaletteGroup GetGroup() const override { return group_; }
+  PaletteToolId GetToolId() const override { return tool_id_; }
+
+  // Shadows the parent declaration since PaletteTool::enabled is not virtual.
+  bool enabled() const { return PaletteTool::enabled(); }
+
+ private:
+  // PaletteTool:
+  views::View* CreateView() override {
+    NOTREACHED();
+    return nullptr;
+  }
+  void OnViewDestroyed() override { FAIL(); }
+
+  PaletteGroup group_;
+  PaletteToolId tool_id_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestTool);
+};
+
+// Base class for tool manager unittests.
+class PaletteToolManagerTest : public ::testing::Test,
+                               public PaletteToolManager::Delegate,
+                               public PaletteTool::Delegate {
+ public:
+  PaletteToolManagerTest()
+      : palette_tool_manager_(new PaletteToolManager(this)) {}
+  ~PaletteToolManagerTest() override {}
+
+ protected:
+  // PaletteToolManager::Delegate:
+  void HidePalette() override {}
+  void OnActiveToolChanged() override { ++tool_changed_count_; }
+  WmWindow* GetWindow() override {
+    NOTREACHED();
+    return nullptr;
+  }
+
+  // PaletteTool::Delegate:
+  void EnableTool(PaletteToolId tool_id) override {}
+  void DisableTool(PaletteToolId tool_id) override {}
+
+  // Helper method for returning an unowned pointer to the constructed tool
+  // while also adding it to the PaletteToolManager.
+  TestTool* BuildTool(PaletteGroup group, PaletteToolId tool_id) {
+    auto* tool = new TestTool(this, group, tool_id);
+    palette_tool_manager_->AddTool(base::WrapUnique(tool));
+    return tool;
+  }
+
+  int tool_changed_count_ = 0;
+  std::unique_ptr<PaletteToolManager> palette_tool_manager_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(PaletteToolManagerTest);
+};
+
+}  // namespace
+
+// Verifies that tools can be enabled/disabled and that enabling a tool disables
+// only active tools in the same group.
+TEST_F(PaletteToolManagerTest, MultipleToolsActivateDeactivate) {
+  // Register actions/modes.
+  TestTool* action_1 =
+      BuildTool(PaletteGroup::ACTION, PaletteToolId::CREATE_NOTE);
+  TestTool* action_2 =
+      BuildTool(PaletteGroup::ACTION, PaletteToolId::CAPTURE_REGION);
+  TestTool* mode_1 = BuildTool(PaletteGroup::MODE, PaletteToolId::MAGNIFY);
+  TestTool* mode_2 =
+      BuildTool(PaletteGroup::MODE, PaletteToolId::LASER_POINTER);
+
+  // Enable mode 1.
+  EXPECT_EQ(0, tool_changed_count_);
+  palette_tool_manager_->ActivateTool(mode_1->GetToolId());
+  EXPECT_FALSE(action_1->enabled());
+  EXPECT_FALSE(action_2->enabled());
+  EXPECT_TRUE(mode_1->enabled());
+  EXPECT_FALSE(mode_2->enabled());
+
+  // Turn a single action on/off. Enabling/disabling the tool does not change
+  // any other group's state.
+  palette_tool_manager_->ActivateTool(action_1->GetToolId());
+  EXPECT_TRUE(action_1->enabled());
+  EXPECT_FALSE(action_2->enabled());
+  EXPECT_TRUE(mode_1->enabled());
+  EXPECT_FALSE(mode_2->enabled());
+  palette_tool_manager_->DeactivateTool(action_1->GetToolId());
+  EXPECT_FALSE(action_1->enabled());
+  EXPECT_FALSE(action_2->enabled());
+  EXPECT_TRUE(mode_1->enabled());
+  EXPECT_FALSE(mode_2->enabled());
+
+  // Activating a tool on will deactivate any other active tools in the same
+  // group.
+  palette_tool_manager_->ActivateTool(action_1->GetToolId());
+  EXPECT_TRUE(action_1->enabled());
+  EXPECT_FALSE(action_2->enabled());
+  palette_tool_manager_->ActivateTool(action_2->GetToolId());
+  EXPECT_FALSE(action_1->enabled());
+  EXPECT_TRUE(action_2->enabled());
+  palette_tool_manager_->DeactivateTool(action_2->GetToolId());
+
+  // Activating an already active tool will not do anything.
+  palette_tool_manager_->ActivateTool(action_1->GetToolId());
+  EXPECT_TRUE(action_1->enabled());
+  EXPECT_FALSE(action_2->enabled());
+  palette_tool_manager_->ActivateTool(action_1->GetToolId());
+  EXPECT_TRUE(action_1->enabled());
+  EXPECT_FALSE(action_2->enabled());
+  palette_tool_manager_->DeactivateTool(action_1->GetToolId());
+}
diff --git a/ash/common/system/chromeos/palette/palette_tray.cc b/ash/common/system/chromeos/palette/palette_tray.cc
new file mode 100644
index 0000000..c4cdadf
--- /dev/null
+++ b/ash/common/system/chromeos/palette/palette_tray.cc
@@ -0,0 +1,316 @@
+// 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 "ash/common/system/chromeos/palette/palette_tray.h"
+
+#include "ash/common/material_design/material_design_controller.h"
+#include "ash/common/shelf/shelf_constants.h"
+#include "ash/common/shelf/wm_shelf.h"
+#include "ash/common/shelf/wm_shelf_util.h"
+#include "ash/common/shell_window_ids.h"
+#include "ash/common/system/chromeos/palette/palette_tool.h"
+#include "ash/common/system/chromeos/palette/palette_tool_manager.h"
+#include "ash/common/system/tray/system_tray_delegate.h"
+#include "ash/common/system/tray/tray_bubble_wrapper.h"
+#include "ash/common/system/tray/tray_constants.h"
+#include "ash/common/system/tray/tray_popup_header_button.h"
+#include "ash/common/wm_lookup.h"
+#include "ash/common/wm_root_window_controller.h"
+#include "ash/common/wm_shell.h"
+#include "ash/common/wm_window.h"
+#include "base/sys_info.h"
+#include "grit/ash_resources.h"
+#include "grit/ash_strings.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/gfx/paint_vector_icon.h"
+#include "ui/views/controls/image_view.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/controls/separator.h"
+#include "ui/views/layout/box_layout.h"
+#include "ui/views/layout/fill_layout.h"
+
+namespace ash {
+
+namespace {
+
+// Predefined padding for the icon used in this tray. These are to be set to the
+// border of the icon, depending on the current |shelf_alignment()|.
+const int kHorizontalShelfHorizontalPadding = 8;
+const int kHorizontalShelfVerticalPadding = 4;
+const int kVerticalShelfHorizontalPadding = 2;
+const int kVerticalShelfVerticalPadding = 5;
+
+// Width of the palette itself (dp).
+const int kPaletteWidth = 360;
+
+// Returns true if the command line flag is present that enables the palette.
+bool IsPaletteEnabled() {
+  // TODO(jdufault): Hookup this function when the flag is in Chrome.
+  return false;
+}
+
+// Creates a separator.
+views::Separator* CreateSeparator(views::Separator::Orientation orientation) {
+  const int kSeparatorInset = 10;
+
+  views::Separator* separator =
+      new views::Separator(views::Separator::HORIZONTAL);
+  separator->SetColor(ash::kBorderDarkColor);
+  separator->SetBorder(
+      views::Border::CreateEmptyBorder(kSeparatorInset, 0, kSeparatorInset, 0));
+  return separator;
+}
+
+// Creates the title-bar view.
+views::View* CreateTitleView() {
+  auto& rb = ui::ResourceBundle::GetSharedInstance();
+
+  auto* root = new views::View();
+  auto* box_layout =
+      new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0);
+  root->SetLayoutManager(box_layout);
+  root->SetBorder(views::Border::CreateEmptyBorder(
+      0, ash::kTrayPopupPaddingHorizontal, 0, 0));
+
+  views::Label* text_label =
+      new views::Label(l10n_util::GetStringUTF16(IDS_ASH_PALETTE_TITLE));
+  text_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+  text_label->SetFontList(rb.GetFontList(ui::ResourceBundle::BoldFont));
+  root->AddChildView(text_label);
+  box_layout->SetFlexForView(text_label, 1);
+
+  // TODO(jdufault): Use proper icons.
+  ash::TrayPopupHeaderButton* help_button = new ash::TrayPopupHeaderButton(
+      nullptr, IDR_AURA_UBER_TRAY_SHUTDOWN, IDR_AURA_UBER_TRAY_SHUTDOWN,
+      IDR_AURA_UBER_TRAY_SHUTDOWN_HOVER, IDR_AURA_UBER_TRAY_SHUTDOWN_HOVER,
+      IDS_ASH_STATUS_TRAY_SHUTDOWN);
+  help_button->SetTooltipText(
+      l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SHUTDOWN));
+  root->AddChildView(help_button);
+
+  root->AddChildView(CreateSeparator(views::Separator::VERTICAL));
+
+  // TODO(jdufault): Use proper icons.
+  ash::TrayPopupHeaderButton* settings_button = new ash::TrayPopupHeaderButton(
+      nullptr, IDR_AURA_UBER_TRAY_SHUTDOWN, IDR_AURA_UBER_TRAY_SHUTDOWN,
+      IDR_AURA_UBER_TRAY_SHUTDOWN_HOVER, IDR_AURA_UBER_TRAY_SHUTDOWN_HOVER,
+      IDS_ASH_STATUS_TRAY_SHUTDOWN);
+  settings_button->SetTooltipText(
+      l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SHUTDOWN));
+  root->AddChildView(settings_button);
+
+  return root;
+}
+
+}  // namespace
+
+PaletteTray::PaletteTray(WmShelf* wm_shelf)
+    : TrayBackgroundView(wm_shelf),
+      palette_tool_manager_(new PaletteToolManager(this)) {
+  PaletteTool::RegisterToolInstances(palette_tool_manager_.get());
+
+  SetContentsBackground();
+
+  SetLayoutManager(new views::FillLayout());
+  icon_ = new views::ImageView();
+  UpdateTrayIcon();
+
+  SetIconBorderForShelfAlignment();
+  tray_container()->AddChildView(icon_);
+
+  WmShell::Get()->AddShellObserver(this);
+  WmShell::Get()->GetSessionStateDelegate()->AddSessionStateObserver(this);
+
+  UpdateIconVisibility();
+}
+
+PaletteTray::~PaletteTray() {
+  if (bubble_)
+    bubble_->bubble_view()->reset_delegate();
+
+  WmShell::Get()->RemoveShellObserver(this);
+  WmShell::Get()->GetSessionStateDelegate()->RemoveSessionStateObserver(this);
+}
+
+bool PaletteTray::PerformAction(const ui::Event& event) {
+  if (bubble_) {
+    bubble_.reset();
+    return true;
+  }
+
+  return OpenBubble();
+}
+
+bool PaletteTray::OpenBubble() {
+  views::TrayBubbleView::InitParams init_params(
+      views::TrayBubbleView::ANCHOR_TYPE_TRAY, GetAnchorAlignment(),
+      kPaletteWidth, kPaletteWidth);
+  init_params.first_item_has_no_margin = true;
+  init_params.can_activate = true;
+  init_params.close_on_deactivate = true;
+
+  DCHECK(tray_container());
+
+  // Create view, customize it.
+  views::TrayBubbleView* bubble_view =
+      views::TrayBubbleView::Create(tray_container(), this, &init_params);
+  bubble_view->SetArrowPaintType(views::BubbleBorder::PAINT_NONE);
+  bubble_view->UseCompactMargins();
+  bubble_view->set_margins(gfx::Insets(bubble_view->margins().top(), 0, 0, 0));
+
+  // Add child views.
+  bubble_view->AddChildView(CreateTitleView());
+  bubble_view->AddChildView(CreateSeparator(views::Separator::HORIZONTAL));
+  AddToolsToView(bubble_view);
+
+  // Show the bubble.
+  bubble_.reset(new ash::TrayBubbleWrapper(this, bubble_view));
+
+  SetDrawBackgroundAsActive(true);
+
+  return true;
+}
+
+void PaletteTray::AddToolsToView(views::View* host) {
+  std::vector<PaletteToolView> views = palette_tool_manager_->CreateViews();
+
+  // There may not be any registered tools.
+  if (!views.size())
+    return;
+
+  PaletteGroup group = views[0].group;
+  for (const PaletteToolView& view : views) {
+    // If the group changes, add a separator.
+    if (group != view.group) {
+      group = view.group;
+      host->AddChildView(CreateSeparator(views::Separator::HORIZONTAL));
+    }
+
+    host->AddChildView(view.view);
+  }
+}
+
+void PaletteTray::SessionStateChanged(
+    SessionStateDelegate::SessionState state) {
+  UpdateIconVisibility();
+}
+
+void PaletteTray::ClickedOutsideBubble() {
+  HidePalette();
+}
+
+base::string16 PaletteTray::GetAccessibleNameForTray() {
+  return l10n_util::GetStringUTF16(IDS_ASH_PALETTE_TITLE);
+}
+
+void PaletteTray::HideBubbleWithView(const views::TrayBubbleView* bubble_view) {
+  if (bubble_->bubble_view() == bubble_view)
+    bubble_.reset();
+}
+
+void PaletteTray::BubbleViewDestroyed() {
+  palette_tool_manager_->NotifyViewsDestroyed();
+  SetDrawBackgroundAsActive(false);
+}
+
+void PaletteTray::OnMouseEnteredView() {}
+
+void PaletteTray::OnMouseExitedView() {}
+
+base::string16 PaletteTray::GetAccessibleNameForBubble() {
+  return GetAccessibleNameForTray();
+}
+
+gfx::Rect PaletteTray::GetAnchorRect(
+    views::Widget* anchor_widget,
+    views::TrayBubbleView::AnchorType anchor_type,
+    views::TrayBubbleView::AnchorAlignment anchor_alignment) const {
+  gfx::Rect r =
+      GetBubbleAnchorRect(anchor_widget, anchor_type, anchor_alignment);
+
+  // Move the palette to the left so the right edge of the palette aligns with
+  // the right edge of the tray button.
+  if (IsHorizontalAlignment(shelf_alignment()))
+    r.Offset(-r.width() + tray_container()->width(), 0);
+  else
+    r.Offset(0, -r.height() + tray_container()->height());
+
+  return r;
+}
+
+void PaletteTray::OnBeforeBubbleWidgetInit(
+    views::Widget* anchor_widget,
+    views::Widget* bubble_widget,
+    views::Widget::InitParams* params) const {
+  // Place the bubble in the same root window as |anchor_widget|.
+  WmLookup::Get()
+      ->GetWindowForWidget(anchor_widget)
+      ->GetRootWindowController()
+      ->ConfigureWidgetInitParamsForContainer(
+          bubble_widget, kShellWindowId_SettingBubbleContainer, params);
+}
+
+void PaletteTray::HideBubble(const views::TrayBubbleView* bubble_view) {
+  HideBubbleWithView(bubble_view);
+}
+
+void PaletteTray::HidePalette() {
+  bubble_.reset();
+}
+
+void PaletteTray::OnActiveToolChanged() {
+  UpdateTrayIcon();
+}
+
+WmWindow* PaletteTray::GetWindow() {
+  return shelf()->GetWindow();
+}
+
+void PaletteTray::SetShelfAlignment(ShelfAlignment alignment) {
+  if (alignment == shelf_alignment())
+    return;
+
+  TrayBackgroundView::SetShelfAlignment(alignment);
+  SetIconBorderForShelfAlignment();
+}
+
+void PaletteTray::AnchorUpdated() {
+  if (bubble_)
+    bubble_->bubble_view()->UpdateBubble();
+}
+
+void PaletteTray::SetIconBorderForShelfAlignment() {
+  // TODO(tdanderson): Ensure PaletteTray follows material design specs. See
+  // crbug.com/630464.
+  if (IsHorizontalAlignment(shelf_alignment())) {
+    icon_->SetBorder(views::Border::CreateEmptyBorder(gfx::Insets(
+        kHorizontalShelfVerticalPadding, kHorizontalShelfHorizontalPadding)));
+  } else {
+    icon_->SetBorder(views::Border::CreateEmptyBorder(gfx::Insets(
+        kVerticalShelfVerticalPadding, kVerticalShelfHorizontalPadding)));
+  }
+}
+
+void PaletteTray::UpdateTrayIcon() {
+  gfx::VectorIconId icon = palette_tool_manager_->GetActiveTrayIcon(
+      palette_tool_manager_->GetActiveTool(ash::PaletteGroup::MODE));
+  icon_->SetImage(CreateVectorIcon(icon, kShelfIconColor));
+}
+
+void PaletteTray::UpdateIconVisibility() {
+  if (!IsPaletteEnabled())
+    return;
+
+  SessionStateDelegate* session_state_delegate =
+      WmShell::Get()->GetSessionStateDelegate();
+
+  SetVisible(!session_state_delegate->IsScreenLocked() &&
+             session_state_delegate->GetSessionState() ==
+                 SessionStateDelegate::SESSION_STATE_ACTIVE &&
+             WmShell::Get()->system_tray_delegate()->GetUserLoginStatus() !=
+                 LoginStatus::KIOSK_APP);
+}
+
+}  // namespace ash
diff --git a/ash/common/system/chromeos/palette/palette_tray.h b/ash/common/system/chromeos/palette/palette_tray.h
new file mode 100644
index 0000000..dcd387c
--- /dev/null
+++ b/ash/common/system/chromeos/palette/palette_tray.h
@@ -0,0 +1,97 @@
+// 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 ASH_COMMON_SYSTEM_CHROMEOS_PALETTE_PALETTE_BUTTON_TRAY_H_
+#define ASH_COMMON_SYSTEM_CHROMEOS_PALETTE_PALETTE_BUTTON_TRAY_H_
+
+#include <map>
+#include <memory>
+
+#include "ash/ash_export.h"
+#include "ash/common/session/session_state_observer.h"
+#include "ash/common/shell_observer.h"
+#include "ash/common/system/chromeos/palette/palette_tool_manager.h"
+#include "ash/common/system/tray/tray_background_view.h"
+#include "base/macros.h"
+
+namespace views {
+class ImageView;
+class Widget;
+}
+
+namespace ash {
+
+class TrayBubbleWrapper;
+class PaletteToolManager;
+
+// The PaletteTray shows the palette in the bottom area of the screen. This
+// class also controls the lifetime for all of the tools available in the
+// palette.
+class ASH_EXPORT PaletteTray : public TrayBackgroundView,
+                               public SessionStateObserver,
+                               public ShellObserver,
+                               public PaletteToolManager::Delegate,
+                               public views::TrayBubbleView::Delegate {
+ public:
+  explicit PaletteTray(WmShelf* wm_shelf);
+  ~PaletteTray() override;
+
+  // ActionableView:
+  bool PerformAction(const ui::Event& event) override;
+
+  // SessionStateObserver:
+  void SessionStateChanged(SessionStateDelegate::SessionState state) override;
+
+  // TrayBackgroundView:
+  void ClickedOutsideBubble() override;
+  base::string16 GetAccessibleNameForTray() override;
+  void HideBubbleWithView(const views::TrayBubbleView* bubble_view) override;
+  void SetShelfAlignment(ShelfAlignment alignment) override;
+  void AnchorUpdated() override;
+
+ private:
+  // views::TrayBubbleView::Delegate:
+  void BubbleViewDestroyed() override;
+  void OnMouseEnteredView() override;
+  void OnMouseExitedView() override;
+  base::string16 GetAccessibleNameForBubble() override;
+  gfx::Rect GetAnchorRect(views::Widget* anchor_widget,
+                          AnchorType anchor_type,
+                          AnchorAlignment anchor_alignment) const override;
+  void OnBeforeBubbleWidgetInit(
+      views::Widget* anchor_widget,
+      views::Widget* bubble_widget,
+      views::Widget::InitParams* params) const override;
+  void HideBubble(const views::TrayBubbleView* bubble_view) override;
+
+  // PaletteToolManager::Delegate:
+  void HidePalette() override;
+  void OnActiveToolChanged() override;
+  WmWindow* GetWindow() override;
+
+  // Creates a new border for the icon. The padding is determined based on the
+  // alignment of the shelf.
+  void SetIconBorderForShelfAlignment();
+
+  // Updates the tray icon from the palette tool manager.
+  void UpdateTrayIcon();
+
+  // Sets the icon to visible if the palette can be used.
+  void UpdateIconVisibility();
+
+  bool OpenBubble();
+  void AddToolsToView(views::View* host);
+
+  std::unique_ptr<PaletteToolManager> palette_tool_manager_;
+  std::unique_ptr<TrayBubbleWrapper> bubble_;
+
+  // Weak pointer, will be parented by TrayContainer for its lifetime.
+  views::ImageView* icon_;
+
+  DISALLOW_COPY_AND_ASSIGN(PaletteTray);
+};
+
+}  // namespace ash
+
+#endif  // ASH_COMMON_SYSTEM_CHROMEOS_PALETTE_PALETTE_BUTTON_TRAY_H_
diff --git a/ash/common/system/chromeos/power/tray_power.cc b/ash/common/system/chromeos/power/tray_power.cc
index 21f44f97..250c273e 100644
--- a/ash/common/system/chromeos/power/tray_power.cc
+++ b/ash/common/system/chromeos/power/tray_power.cc
@@ -143,7 +143,7 @@
 const char TrayPower::kUsbNotificationId[] = "usb-charger";
 
 TrayPower::TrayPower(SystemTray* system_tray, MessageCenter* message_center)
-    : SystemTrayItem(system_tray),
+    : SystemTrayItem(system_tray, UMA_POWER),
       message_center_(message_center),
       power_tray_(NULL),
       notification_state_(NOTIFICATION_NONE),
diff --git a/ash/common/system/chromeos/screen_security/screen_capture_tray_item.cc b/ash/common/system/chromeos/screen_security/screen_capture_tray_item.cc
index a6ab6ab..74d8557 100644
--- a/ash/common/system/chromeos/screen_security/screen_capture_tray_item.cc
+++ b/ash/common/system/chromeos/screen_security/screen_capture_tray_item.cc
@@ -27,7 +27,7 @@
 }  // namespace
 
 ScreenCaptureTrayItem::ScreenCaptureTrayItem(SystemTray* system_tray)
-    : ScreenTrayItem(system_tray) {
+    : ScreenTrayItem(system_tray, UMA_SCREEN_CAPTURE) {
   WmShell::Get()->AddShellObserver(this);
   WmShell::Get()->system_tray_notifier()->AddScreenCaptureObserver(this);
 }
diff --git a/ash/common/system/chromeos/screen_security/screen_share_tray_item.cc b/ash/common/system/chromeos/screen_security/screen_share_tray_item.cc
index a868f23..7af2ea85 100644
--- a/ash/common/system/chromeos/screen_security/screen_share_tray_item.cc
+++ b/ash/common/system/chromeos/screen_security/screen_share_tray_item.cc
@@ -25,7 +25,7 @@
 }
 
 ScreenShareTrayItem::ScreenShareTrayItem(SystemTray* system_tray)
-    : ScreenTrayItem(system_tray) {
+    : ScreenTrayItem(system_tray, UMA_SCREEN_SHARE) {
   WmShell::Get()->system_tray_notifier()->AddScreenShareObserver(this);
 }
 
diff --git a/ash/common/system/chromeos/screen_security/screen_tray_item.cc b/ash/common/system/chromeos/screen_security/screen_tray_item.cc
index 0940bcf..d6f0e1e 100644
--- a/ash/common/system/chromeos/screen_security/screen_tray_item.cc
+++ b/ash/common/system/chromeos/screen_security/screen_tray_item.cc
@@ -119,8 +119,8 @@
 
 }  // namespace tray
 
-ScreenTrayItem::ScreenTrayItem(SystemTray* system_tray)
-    : SystemTrayItem(system_tray),
+ScreenTrayItem::ScreenTrayItem(SystemTray* system_tray, UmaType uma_type)
+    : SystemTrayItem(system_tray, uma_type),
       tray_view_(NULL),
       default_view_(NULL),
       is_started_(false),
diff --git a/ash/common/system/chromeos/screen_security/screen_tray_item.h b/ash/common/system/chromeos/screen_security/screen_tray_item.h
index 8d01d2fd..0659099 100644
--- a/ash/common/system/chromeos/screen_security/screen_tray_item.h
+++ b/ash/common/system/chromeos/screen_security/screen_tray_item.h
@@ -91,7 +91,7 @@
 // can stop the screen capture/sharing by pressing the stop button.
 class ASH_EXPORT ScreenTrayItem : public SystemTrayItem {
  public:
-  explicit ScreenTrayItem(SystemTray* system_tray);
+  ScreenTrayItem(SystemTray* system_tray, UmaType uma_type);
   ~ScreenTrayItem() override;
 
   tray::ScreenTrayView* tray_view() { return tray_view_; }
diff --git a/ash/common/system/chromeos/session/tray_session_length_limit.cc b/ash/common/system/chromeos/session/tray_session_length_limit.cc
index 766b142..d004601e 100644
--- a/ash/common/system/chromeos/session/tray_session_length_limit.cc
+++ b/ash/common/system/chromeos/session/tray_session_length_limit.cc
@@ -44,7 +44,7 @@
     "chrome://session/timeout";
 
 TraySessionLengthLimit::TraySessionLengthLimit(SystemTray* system_tray)
-    : SystemTrayItem(system_tray),
+    : SystemTrayItem(system_tray, UMA_SESSION_LENGTH_LIMIT),
       limit_state_(LIMIT_NONE),
       last_limit_state_(LIMIT_NONE),
       tray_bubble_view_(NULL) {
diff --git a/ash/common/system/chromeos/settings/tray_settings.cc b/ash/common/system/chromeos/settings/tray_settings.cc
index 9df583b..1cc25f92 100644
--- a/ash/common/system/chromeos/settings/tray_settings.cc
+++ b/ash/common/system/chromeos/settings/tray_settings.cc
@@ -126,7 +126,7 @@
 }  // namespace tray
 
 TraySettings::TraySettings(SystemTray* system_tray)
-    : SystemTrayItem(system_tray), default_view_(NULL) {}
+    : SystemTrayItem(system_tray, UMA_SETTINGS), default_view_(nullptr) {}
 
 TraySettings::~TraySettings() {}
 
diff --git a/ash/common/system/chromeos/supervised/tray_supervised_user.cc b/ash/common/system/chromeos/supervised/tray_supervised_user.cc
index 695f4e0..a048ef5 100644
--- a/ash/common/system/chromeos/supervised/tray_supervised_user.cc
+++ b/ash/common/system/chromeos/supervised/tray_supervised_user.cc
@@ -28,7 +28,7 @@
     "chrome://user/locally-managed";
 
 TraySupervisedUser::TraySupervisedUser(SystemTray* system_tray)
-    : SystemTrayItem(system_tray),
+    : SystemTrayItem(system_tray, UMA_SUPERVISED_USER),
       tray_view_(NULL),
       status_(LoginStatus::NOT_LOGGED_IN),
       is_user_supervised_(false) {
diff --git a/ash/common/system/chromeos/tray_caps_lock.cc b/ash/common/system/chromeos/tray_caps_lock.cc
index c215b6a..5217309a 100644
--- a/ash/common/system/chromeos/tray_caps_lock.cc
+++ b/ash/common/system/chromeos/tray_caps_lock.cc
@@ -134,7 +134,7 @@
 };
 
 TrayCapsLock::TrayCapsLock(SystemTray* system_tray)
-    : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_CAPS_LOCK),
+    : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_CAPS_LOCK, UMA_CAPS_LOCK),
       default_(NULL),
       detailed_(NULL),
       caps_lock_enabled_(CapsLockIsEnabled()),
diff --git a/ash/common/system/chromeos/tray_tracing.cc b/ash/common/system/chromeos/tray_tracing.cc
index 011feb6..cb99406 100644
--- a/ash/common/system/chromeos/tray_tracing.cc
+++ b/ash/common/system/chromeos/tray_tracing.cc
@@ -76,7 +76,8 @@
 // ash::TrayTracing
 
 TrayTracing::TrayTracing(SystemTray* system_tray)
-    : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_TRACING), default_(NULL) {
+    : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_TRACING, UMA_TRACING),
+      default_(nullptr) {
   DCHECK(system_tray);
   WmShell::Get()->system_tray_notifier()->AddTracingObserver(this);
 }
diff --git a/ash/common/system/date/tray_date.cc b/ash/common/system/date/tray_date.cc
index d2c0ec5..7264f47 100644
--- a/ash/common/system/date/tray_date.cc
+++ b/ash/common/system/date/tray_date.cc
@@ -19,7 +19,7 @@
 namespace ash {
 
 TrayDate::TrayDate(SystemTray* system_tray)
-    : SystemTrayItem(system_tray),
+    : SystemTrayItem(system_tray, UMA_DATE),
       time_tray_(NULL),
       default_view_(NULL),
       login_status_(LoginStatus::NOT_LOGGED_IN) {
diff --git a/ash/common/system/ime/tray_ime_chromeos.cc b/ash/common/system/ime/tray_ime_chromeos.cc
index 46d8da9..f0d68e28 100644
--- a/ash/common/system/ime/tray_ime_chromeos.cc
+++ b/ash/common/system/ime/tray_ime_chromeos.cc
@@ -224,7 +224,7 @@
 }  // namespace tray
 
 TrayIME::TrayIME(SystemTray* system_tray)
-    : SystemTrayItem(system_tray),
+    : SystemTrayItem(system_tray, UMA_IME),
       tray_label_(NULL),
       default_(NULL),
       detailed_(NULL),
diff --git a/ash/common/system/status_area_widget.cc b/ash/common/system/status_area_widget.cc
index ee7f773..0d95965a 100644
--- a/ash/common/system/status_area_widget.cc
+++ b/ash/common/system/status_area_widget.cc
@@ -19,6 +19,7 @@
 
 #if defined(OS_CHROMEOS)
 #include "ash/common/system/chromeos/ime_menu/ime_menu_tray.h"
+#include "ash/common/system/chromeos/palette/palette_tray.h"
 #include "ash/common/system/chromeos/session/logout_button_tray.h"
 #include "ash/common/system/chromeos/virtual_keyboard/virtual_keyboard_tray.h"
 #endif
@@ -28,12 +29,13 @@
 StatusAreaWidget::StatusAreaWidget(WmWindow* status_container,
                                    WmShelf* wm_shelf)
     : status_area_widget_delegate_(new StatusAreaWidgetDelegate),
-      overview_button_tray_(NULL),
-      system_tray_(NULL),
-      web_notification_tray_(NULL),
+      overview_button_tray_(nullptr),
+      system_tray_(nullptr),
+      web_notification_tray_(nullptr),
 #if defined(OS_CHROMEOS)
-      logout_button_tray_(NULL),
-      virtual_keyboard_tray_(NULL),
+      logout_button_tray_(nullptr),
+      palette_tray_(nullptr),
+      virtual_keyboard_tray_(nullptr),
       ime_menu_tray_(nullptr),
 #endif
       login_status_(LoginStatus::NOT_LOGGED_IN),
@@ -59,6 +61,7 @@
   AddWebNotificationTray();
 #if defined(OS_CHROMEOS)
   AddLogoutButtonTray();
+  AddPaletteTray();
   AddVirtualKeyboardTray();
   AddImeMenuTray();
 #endif
@@ -84,20 +87,20 @@
   // hierarchy. Do not used scoped pointers since we don't want to destroy them
   // in the destructor if Shutdown() is not called (e.g. in tests).
   delete web_notification_tray_;
-  web_notification_tray_ = NULL;
+  web_notification_tray_ = nullptr;
   // Must be destroyed after |web_notification_tray_|.
   delete system_tray_;
-  system_tray_ = NULL;
+  system_tray_ = nullptr;
 #if defined(OS_CHROMEOS)
   delete ime_menu_tray_;
   ime_menu_tray_ = nullptr;
   delete virtual_keyboard_tray_;
-  virtual_keyboard_tray_ = NULL;
+  virtual_keyboard_tray_ = nullptr;
   delete logout_button_tray_;
-  logout_button_tray_ = NULL;
+  logout_button_tray_ = nullptr;
 #endif
   delete overview_button_tray_;
-  overview_button_tray_ = NULL;
+  overview_button_tray_ = nullptr;
 }
 
 bool StatusAreaWidget::ShouldShowShelf() const {
@@ -130,6 +133,7 @@
   virtual_keyboard_tray_->SchedulePaint();
   logout_button_tray_->SchedulePaint();
   ime_menu_tray_->SchedulePaint();
+  palette_tray_->SchedulePaint();
 #endif
   overview_button_tray_->SchedulePaint();
 }
@@ -168,6 +172,11 @@
   status_area_widget_delegate_->AddTray(logout_button_tray_);
 }
 
+void StatusAreaWidget::AddPaletteTray() {
+  palette_tray_ = new PaletteTray(wm_shelf_);
+  status_area_widget_delegate_->AddTray(palette_tray_);
+}
+
 void StatusAreaWidget::AddVirtualKeyboardTray() {
   virtual_keyboard_tray_ = new VirtualKeyboardTray(wm_shelf_);
   status_area_widget_delegate_->AddTray(virtual_keyboard_tray_);
@@ -197,6 +206,8 @@
     virtual_keyboard_tray_->SetShelfAlignment(alignment);
   if (ime_menu_tray_)
     ime_menu_tray_->SetShelfAlignment(alignment);
+  if (palette_tray_)
+    palette_tray_->SetShelfAlignment(alignment);
 #endif
   if (overview_button_tray_)
     overview_button_tray_->SetShelfAlignment(alignment);
diff --git a/ash/common/system/status_area_widget.h b/ash/common/system/status_area_widget.h
index a8c8c1f8..550555f7 100644
--- a/ash/common/system/status_area_widget.h
+++ b/ash/common/system/status_area_widget.h
@@ -22,6 +22,7 @@
 #if defined(OS_CHROMEOS)
 class ImeMenuTray;
 class LogoutButtonTray;
+class PaletteTray;
 class VirtualKeyboardTray;
 #endif
 
@@ -79,6 +80,7 @@
   void AddWebNotificationTray();
 #if defined(OS_CHROMEOS)
   void AddLogoutButtonTray();
+  void AddPaletteTray();
   void AddVirtualKeyboardTray();
   void AddImeMenuTray();
 #endif
@@ -91,6 +93,7 @@
   WebNotificationTray* web_notification_tray_;
 #if defined(OS_CHROMEOS)
   LogoutButtonTray* logout_button_tray_;
+  PaletteTray* palette_tray_;
   VirtualKeyboardTray* virtual_keyboard_tray_;
   ImeMenuTray* ime_menu_tray_;
 #endif
diff --git a/ash/common/system/tray/system_tray.cc b/ash/common/system/tray/system_tray.cc
index 73c0ba6..979e3a1 100644
--- a/ash/common/system/tray/system_tray.cc
+++ b/ash/common/system/tray/system_tray.cc
@@ -751,6 +751,8 @@
 void SystemTray::RecordSystemMenuMetrics() {
   DCHECK(system_bubble_);
 
+  system_bubble_->bubble()->RecordVisibleRowMetrics();
+
   TrayBubbleView* bubble_view = system_bubble_->bubble_view();
   int num_rows = 0;
   for (int i = 0; i < bubble_view->child_count(); i++) {
diff --git a/ash/common/system/tray/system_tray_bubble.cc b/ash/common/system/tray/system_tray_bubble.cc
index ebe9414..1fa5f6b 100644
--- a/ash/common/system/tray/system_tray_bubble.cc
+++ b/ash/common/system/tray/system_tray_bubble.cc
@@ -4,6 +4,9 @@
 
 #include "ash/common/system/tray/system_tray_bubble.h"
 
+#include <utility>
+#include <vector>
+
 #include "ash/common/system/tray/system_tray.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/system_tray_item.h"
@@ -11,6 +14,7 @@
 #include "ash/common/system/tray/tray_constants.h"
 #include "ash/common/system/tray/tray_popup_item_container.h"
 #include "ash/common/wm_shell.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
@@ -64,7 +68,7 @@
     const std::vector<ash::SystemTrayItem*>& items,
     BubbleType bubble_type)
     : tray_(tray),
-      bubble_view_(NULL),
+      bubble_view_(nullptr),
       items_(items),
       bubble_type_(bubble_type),
       autoclose_delay_(0) {}
@@ -203,7 +207,8 @@
   if (!manager || manager->GetFocusedView())
     return;
 
-  views::View* view = manager->GetNextFocusableView(NULL, NULL, false, false);
+  views::View* view =
+      manager->GetNextFocusableView(nullptr, nullptr, false, false);
   if (view)
     view->RequestFocus();
 }
@@ -226,7 +231,7 @@
 }
 
 void SystemTrayBubble::BubbleViewDestroyed() {
-  bubble_view_ = NULL;
+  bubble_view_ = nullptr;
 }
 
 void SystemTrayBubble::StartAutoCloseTimer(int seconds) {
@@ -274,8 +279,23 @@
   return false;
 }
 
+void SystemTrayBubble::RecordVisibleRowMetrics() {
+  if (bubble_type_ != BUBBLE_TYPE_DEFAULT)
+    return;
+
+  for (const std::pair<SystemTrayItem::UmaType, views::View*>& pair :
+       tray_item_view_map_) {
+    if (pair.second->visible() &&
+        pair.first != SystemTrayItem::UMA_NOT_RECORDED) {
+      UMA_HISTOGRAM_ENUMERATION("Ash.SystemMenu.DefaultView.VisibleRows",
+                                pair.first, SystemTrayItem::UMA_COUNT);
+    }
+  }
+}
+
 void SystemTrayBubble::CreateItemViews(LoginStatus login_status) {
-  std::vector<views::View*> item_views;
+  tray_item_view_map_.clear();
+
   // If a system modal dialog is present, create the same tray as
   // in locked state.
   if (WmShell::Get()->IsSystemModalWindowOpen() &&
@@ -283,34 +303,42 @@
     login_status = LoginStatus::LOCKED;
   }
 
-  views::View* focus_view = NULL;
+  std::vector<TrayPopupItemContainer*> item_containers;
+  views::View* focus_view = nullptr;
+  const bool is_default_bubble = bubble_type_ == BUBBLE_TYPE_DEFAULT;
   for (size_t i = 0; i < items_.size(); ++i) {
-    views::View* view = NULL;
+    views::View* item_view = nullptr;
     switch (bubble_type_) {
       case BUBBLE_TYPE_DEFAULT:
-        view = items_[i]->CreateDefaultView(login_status);
+        item_view = items_[i]->CreateDefaultView(login_status);
         if (items_[i]->restore_focus())
-          focus_view = view;
+          focus_view = item_view;
         break;
       case BUBBLE_TYPE_DETAILED:
-        view = items_[i]->CreateDetailedView(login_status);
+        item_view = items_[i]->CreateDetailedView(login_status);
         break;
       case BUBBLE_TYPE_NOTIFICATION:
-        view = items_[i]->CreateNotificationView(login_status);
+        item_view = items_[i]->CreateNotificationView(login_status);
         break;
     }
-    if (view)
-      item_views.push_back(view);
+    if (item_view) {
+      TrayPopupItemContainer* tray_popup_item_container =
+          new TrayPopupItemContainer(item_view, is_default_bubble);
+      bubble_view_->AddChildView(tray_popup_item_container);
+      item_containers.push_back(tray_popup_item_container);
+      tray_item_view_map_[items_[i]->uma_type()] = tray_popup_item_container;
+    }
   }
 
-  bool is_default_bubble = bubble_type_ == BUBBLE_TYPE_DEFAULT;
-  for (size_t i = 0; i < item_views.size(); ++i) {
-    // For default view, draw bottom border for each item, except the last
-    // 2 items, which are the bottom header row and the one just above it.
-    bubble_view_->AddChildView(new TrayPopupItemContainer(
-        item_views[i], is_default_bubble,
-        is_default_bubble && (i < item_views.size() - 2)));
+  // For default view, draw bottom border for each item, except the last
+  // 2 items, which are the bottom header row and the one just above it.
+  if (is_default_bubble) {
+    const int last_item_with_border =
+        static_cast<int>(item_containers.size()) - 2;
+    for (int i = 0; i < last_item_with_border; ++i)
+      item_containers.at(i)->SetDrawBorder(true);
   }
+
   if (focus_view)
     focus_view->RequestFocus();
 }
diff --git a/ash/common/system/tray/system_tray_bubble.h b/ash/common/system/tray/system_tray_bubble.h
index 7714710..1fed3521 100644
--- a/ash/common/system/tray/system_tray_bubble.h
+++ b/ash/common/system/tray/system_tray_bubble.h
@@ -5,10 +5,12 @@
 #ifndef ASH_COMMON_SYSTEM_TRAY_SYSTEM_TRAY_BUBBLE_H_
 #define ASH_COMMON_SYSTEM_TRAY_SYSTEM_TRAY_BUBBLE_H_
 
+#include <map>
 #include <memory>
 #include <vector>
 
 #include "ash/common/login_status.h"
+#include "ash/common/system/tray/system_tray_item.h"
 #include "base/macros.h"
 #include "base/timer/timer.h"
 #include "ui/views/bubble/tray_bubble_view.h"
@@ -59,6 +61,10 @@
   // ShouldShowShelf().
   bool ShouldShowShelf() const;
 
+  // Records metrics for visible system menu rows. Only implemented for the
+  // BUBBLE_TYPE_DEFAULT BubbleType.
+  void RecordVisibleRowMetrics();
+
  private:
   void CreateItemViews(LoginStatus login_status);
 
@@ -67,6 +73,9 @@
   std::vector<ash::SystemTrayItem*> items_;
   BubbleType bubble_type_;
 
+  // Tracks the views created in the last call to CreateItemViews().
+  std::map<SystemTrayItem::UmaType, views::View*> tray_item_view_map_;
+
   int autoclose_delay_;
   base::OneShotTimer autoclose_;
 
diff --git a/ash/common/system/tray/system_tray_item.cc b/ash/common/system/tray/system_tray_item.cc
index 629c4f8c..59902be 100644
--- a/ash/common/system/tray/system_tray_item.cc
+++ b/ash/common/system/tray/system_tray_item.cc
@@ -10,8 +10,8 @@
 
 namespace ash {
 
-SystemTrayItem::SystemTrayItem(SystemTray* system_tray)
-    : system_tray_(system_tray), restore_focus_(false) {}
+SystemTrayItem::SystemTrayItem(SystemTray* system_tray, UmaType uma_type)
+    : system_tray_(system_tray), uma_type_(uma_type), restore_focus_(false) {}
 
 SystemTrayItem::~SystemTrayItem() {}
 
diff --git a/ash/common/system/tray/system_tray_item.h b/ash/common/system/tray/system_tray_item.h
index 09c5f82d..4925f6a 100644
--- a/ash/common/system/tray/system_tray_item.h
+++ b/ash/common/system/tray/system_tray_item.h
@@ -16,11 +16,48 @@
 
 namespace ash {
 class SystemTray;
+class SystemTrayBubble;
 class TrayItemView;
 
 class ASH_EXPORT SystemTrayItem {
  public:
-  explicit SystemTrayItem(SystemTray* system_tray);
+  // The different types of SystemTrayItems.
+  //
+  // NOTE: These values are used for UMA metrics so do NOT re-order this enum
+  // and only insert items before the COUNT item.
+  enum UmaType {
+    // SystemTrayItem's with this type are not recorded in the histogram.
+    UMA_NOT_RECORDED = 0,
+    // Used for testing purposes only.
+    UMA_TEST = 1,
+    UMA_ACCESSIBILITY = 2,
+    UMA_AUDIO = 3,
+    UMA_BLUETOOTH = 4,
+    UMA_CAPS_LOCK = 5,
+    UMA_CAST = 6,
+    UMA_DATE = 7,
+    UMA_DISPLAY = 8,
+    UMA_DISPLAY_BRIGHTNESS = 9,
+    UMA_ENTERPRISE = 10,
+    UMA_IME = 11,
+    UMA_MULTI_PROFILE_MEDIA = 12,
+    UMA_NETWORK = 13,
+    UMA_SETTINGS = 14,
+    UMA_UPDATE = 15,
+    UMA_POWER = 16,
+    UMA_ROTATION_LOCK = 17,
+    UMA_SCREEN_CAPTURE = 18,
+    UMA_SCREEN_SHARE = 19,
+    UMA_SESSION_LENGTH_LIMIT = 20,
+    UMA_SMS = 21,
+    UMA_SUPERVISED_USER = 22,
+    UMA_TRACING = 23,
+    UMA_USER = 24,
+    UMA_VPN = 25,
+    UMA_COUNT = 26,
+  };
+
+  SystemTrayItem(SystemTray* system_tray, UmaType type);
   virtual ~SystemTrayItem();
 
   // Create* functions may return NULL if nothing should be displayed for the
@@ -107,7 +144,13 @@
   void set_restore_focus(bool restore_focus) { restore_focus_ = restore_focus; }
 
  private:
+  // Accesses uma_type().
+  friend class SystemTrayBubble;
+
+  UmaType uma_type() const { return uma_type_; }
+
   SystemTray* system_tray_;
+  UmaType uma_type_;
   bool restore_focus_;
 
   DISALLOW_COPY_AND_ASSIGN(SystemTrayItem);
diff --git a/ash/common/system/tray/system_tray_unittest.cc b/ash/common/system/tray/system_tray_unittest.cc
index 0ee90eb..abc9d05 100644
--- a/ash/common/system/tray/system_tray_unittest.cc
+++ b/ash/common/system/tray/system_tray_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "ash/common/system/tray/system_tray.h"
 
+#include <string>
 #include <vector>
 
 #include "ash/common/accessibility_delegate.h"
@@ -20,15 +21,14 @@
 #include "ash/common/wm_window.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/test/status_area_widget_test_helper.h"
+#include "ash/test/test_system_tray_item.h"
 #include "base/run_loop.h"
-#include "base/strings/utf_string_conversions.h"
+#include "base/test/histogram_tester.h"
 #include "ui/base/ui_base_types.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/rect.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/layout/fill_layout.h"
 #include "ui/views/view.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_delegate.h"
@@ -42,92 +42,8 @@
 
 namespace {
 
-// Trivial item implementation that tracks its views for testing.
-class TestItem : public SystemTrayItem {
- public:
-  TestItem()
-      : SystemTrayItem(AshTestBase::GetPrimarySystemTray()),
-        tray_view_(nullptr),
-        default_view_(nullptr),
-        detailed_view_(nullptr),
-        notification_view_(nullptr) {}
-
-  views::View* CreateTrayView(LoginStatus status) override {
-    tray_view_ = new views::View;
-    // Add a label so it has non-zero width.
-    tray_view_->SetLayoutManager(new views::FillLayout);
-    tray_view_->AddChildView(new views::Label(base::UTF8ToUTF16("Tray")));
-    return tray_view_;
-  }
-
-  views::View* CreateDefaultView(LoginStatus status) override {
-    default_view_ = new views::View;
-    default_view_->SetLayoutManager(new views::FillLayout);
-    default_view_->AddChildView(new views::Label(base::UTF8ToUTF16("Default")));
-    return default_view_;
-  }
-
-  views::View* CreateDetailedView(LoginStatus status) override {
-    detailed_view_ = new views::View;
-    detailed_view_->SetLayoutManager(new views::FillLayout);
-    detailed_view_->AddChildView(
-        new views::Label(base::UTF8ToUTF16("Detailed")));
-    return detailed_view_;
-  }
-
-  views::View* CreateNotificationView(LoginStatus status) override {
-    notification_view_ = new views::View;
-    return notification_view_;
-  }
-
-  void DestroyTrayView() override { tray_view_ = NULL; }
-
-  void DestroyDefaultView() override { default_view_ = NULL; }
-
-  void DestroyDetailedView() override { detailed_view_ = NULL; }
-
-  void DestroyNotificationView() override { notification_view_ = NULL; }
-
-  void UpdateAfterLoginStatusChange(LoginStatus status) override {}
-
-  views::View* tray_view() const { return tray_view_; }
-  views::View* default_view() const { return default_view_; }
-  views::View* detailed_view() const { return detailed_view_; }
-  views::View* notification_view() const { return notification_view_; }
-
- private:
-  views::View* tray_view_;
-  views::View* default_view_;
-  views::View* detailed_view_;
-  views::View* notification_view_;
-};
-
-// Trivial item implementation that returns NULL from tray/default/detailed
-// view creation methods.
-class TestNoViewItem : public SystemTrayItem {
- public:
-  TestNoViewItem() : SystemTrayItem(AshTestBase::GetPrimarySystemTray()) {}
-
-  views::View* CreateTrayView(LoginStatus status) override { return nullptr; }
-
-  views::View* CreateDefaultView(LoginStatus status) override {
-    return nullptr;
-  }
-
-  views::View* CreateDetailedView(LoginStatus status) override {
-    return nullptr;
-  }
-
-  views::View* CreateNotificationView(LoginStatus status) override {
-    return nullptr;
-  }
-
-  void DestroyTrayView() override {}
-  void DestroyDefaultView() override {}
-  void DestroyDetailedView() override {}
-  void DestroyNotificationView() override {}
-  void UpdateAfterLoginStatusChange(LoginStatus status) override {}
-};
+const char kVisibleRowsHistogramName[] =
+    "Ash.SystemMenu.DefaultView.VisibleRows";
 
 class ModalWidgetDelegate : public views::WidgetDelegateView {
  public:
@@ -145,6 +61,136 @@
 
 typedef AshTestBase SystemTrayTest;
 
+// Verifies only the visible default views are recorded in the
+// "Ash.SystemMenu.DefaultView.VisibleItems" histogram.
+TEST_F(SystemTrayTest, OnlyVisibleItemsRecorded) {
+  SystemTray* tray = GetPrimarySystemTray();
+  ASSERT_TRUE(tray->GetWidget());
+
+  TestSystemTrayItem* test_item = new TestSystemTrayItem();
+  tray->AddTrayItem(test_item);
+
+  base::HistogramTester histogram_tester;
+
+  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
+  RunAllPendingInMessageLoop();
+  histogram_tester.ExpectBucketCount(kVisibleRowsHistogramName,
+                                     SystemTrayItem::UMA_TEST, 1);
+
+  ASSERT_TRUE(tray->CloseSystemBubble());
+  RunAllPendingInMessageLoop();
+
+  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
+  RunAllPendingInMessageLoop();
+  histogram_tester.ExpectBucketCount(kVisibleRowsHistogramName,
+                                     SystemTrayItem::UMA_TEST, 2);
+
+  ASSERT_TRUE(tray->CloseSystemBubble());
+  RunAllPendingInMessageLoop();
+
+  test_item->set_views_are_visible(false);
+
+  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
+  RunAllPendingInMessageLoop();
+  histogram_tester.ExpectBucketCount(kVisibleRowsHistogramName,
+                                     SystemTrayItem::UMA_TEST, 2);
+
+  ASSERT_TRUE(tray->CloseSystemBubble());
+  RunAllPendingInMessageLoop();
+}
+
+// Verifies a visible UMA_NOT_RECORDED default view is not recorded in the
+// "Ash.SystemMenu.DefaultView.VisibleItems" histogram.
+TEST_F(SystemTrayTest, NotRecordedtemsAreNotRecorded) {
+  SystemTray* tray = GetPrimarySystemTray();
+  ASSERT_TRUE(tray->GetWidget());
+
+  TestSystemTrayItem* test_item =
+      new TestSystemTrayItem(SystemTrayItem::UMA_NOT_RECORDED);
+  tray->AddTrayItem(test_item);
+
+  base::HistogramTester histogram_tester;
+
+  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
+  RunAllPendingInMessageLoop();
+  histogram_tester.ExpectBucketCount(kVisibleRowsHistogramName,
+                                     SystemTrayItem::UMA_NOT_RECORDED, 0);
+
+  ASSERT_TRUE(tray->CloseSystemBubble());
+  RunAllPendingInMessageLoop();
+}
+
+// Verifies null default views are not recorded in the
+// "Ash.SystemMenu.DefaultView.VisibleItems" histogram.
+TEST_F(SystemTrayTest, NullDefaultViewIsNotRecorded) {
+  SystemTray* tray = GetPrimarySystemTray();
+  ASSERT_TRUE(tray->GetWidget());
+
+  TestSystemTrayItem* test_item = new TestSystemTrayItem();
+  test_item->set_has_views(false);
+  tray->AddTrayItem(test_item);
+
+  base::HistogramTester histogram_tester;
+
+  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
+  RunAllPendingInMessageLoop();
+  histogram_tester.ExpectBucketCount(kVisibleRowsHistogramName,
+                                     SystemTrayItem::UMA_TEST, 0);
+
+  ASSERT_TRUE(tray->CloseSystemBubble());
+  RunAllPendingInMessageLoop();
+}
+
+// Verifies visible detailed views are not recorded in the
+// "Ash.SystemMenu.DefaultView.VisibleItems" histogram.
+TEST_F(SystemTrayTest, VisibleDetailedViewsIsNotRecorded) {
+  SystemTray* tray = GetPrimarySystemTray();
+  ASSERT_TRUE(tray->GetWidget());
+
+  TestSystemTrayItem* test_item = new TestSystemTrayItem();
+  tray->AddTrayItem(test_item);
+
+  base::HistogramTester histogram_tester;
+
+  tray->ShowDetailedView(test_item, 0, false, BUBBLE_CREATE_NEW);
+  RunAllPendingInMessageLoop();
+
+  histogram_tester.ExpectTotalCount(kVisibleRowsHistogramName, 0);
+
+  ASSERT_TRUE(tray->CloseSystemBubble());
+  RunAllPendingInMessageLoop();
+}
+
+// Verifies visible default views are not recorded for menu re-shows in the
+// "Ash.SystemMenu.DefaultView.VisibleItems" histogram.
+TEST_F(SystemTrayTest, VisibleDefaultViewIsNotRecordedOnReshow) {
+  SystemTray* tray = GetPrimarySystemTray();
+  ASSERT_TRUE(tray->GetWidget());
+
+  TestSystemTrayItem* test_item = new TestSystemTrayItem();
+  tray->AddTrayItem(test_item);
+
+  base::HistogramTester histogram_tester;
+
+  tray->ShowDefaultView(BUBBLE_CREATE_NEW);
+  RunAllPendingInMessageLoop();
+  histogram_tester.ExpectBucketCount(kVisibleRowsHistogramName,
+                                     SystemTrayItem::UMA_TEST, 1);
+
+  tray->ShowDetailedView(test_item, 0, false, BUBBLE_USE_EXISTING);
+  RunAllPendingInMessageLoop();
+  histogram_tester.ExpectBucketCount(kVisibleRowsHistogramName,
+                                     SystemTrayItem::UMA_TEST, 1);
+
+  tray->ShowDefaultView(BUBBLE_USE_EXISTING);
+  RunAllPendingInMessageLoop();
+  histogram_tester.ExpectBucketCount(kVisibleRowsHistogramName,
+                                     SystemTrayItem::UMA_TEST, 1);
+
+  ASSERT_TRUE(tray->CloseSystemBubble());
+  RunAllPendingInMessageLoop();
+}
+
 TEST_F(SystemTrayTest, SystemTrayDefaultView) {
   SystemTray* tray = GetPrimarySystemTray();
   ASSERT_TRUE(tray->GetWidget());
@@ -201,8 +247,8 @@
   SystemTray* tray = GetPrimarySystemTray();
   ASSERT_TRUE(tray->GetWidget());
 
-  TestItem* test_item = new TestItem;
-  TestItem* detailed_item = new TestItem;
+  TestSystemTrayItem* test_item = new TestSystemTrayItem();
+  TestSystemTrayItem* detailed_item = new TestSystemTrayItem();
   tray->AddTrayItem(test_item);
   tray->AddTrayItem(detailed_item);
 
@@ -239,7 +285,8 @@
   ASSERT_TRUE(tray->GetWidget());
 
   // Verify that no crashes occur on items lacking some views.
-  TestNoViewItem* no_view_item = new TestNoViewItem;
+  TestSystemTrayItem* no_view_item = new TestSystemTrayItem();
+  no_view_item->set_has_views(false);
   tray->AddTrayItem(no_view_item);
   tray->ShowDefaultView(BUBBLE_CREATE_NEW);
   tray->ShowDetailedView(no_view_item, 0, false, BUBBLE_USE_EXISTING);
@@ -251,12 +298,12 @@
   ASSERT_TRUE(tray->GetWidget());
 
   // Add an initial tray item so that the tray gets laid out correctly.
-  TestItem* initial_item = new TestItem;
+  TestSystemTrayItem* initial_item = new TestSystemTrayItem();
   tray->AddTrayItem(initial_item);
 
   gfx::Size initial_size = tray->GetWidget()->GetWindowBoundsInScreen().size();
 
-  TestItem* new_item = new TestItem;
+  TestSystemTrayItem* new_item = new TestSystemTrayItem();
   tray->AddTrayItem(new_item);
 
   gfx::Size new_size = tray->GetWidget()->GetWindowBoundsInScreen().size();
@@ -279,8 +326,8 @@
   SystemTray* tray = GetPrimarySystemTray();
   ASSERT_TRUE(tray->GetWidget());
 
-  TestItem* test_item = new TestItem;
-  TestItem* detailed_item = new TestItem;
+  TestSystemTrayItem* test_item = new TestSystemTrayItem();
+  TestSystemTrayItem* detailed_item = new TestSystemTrayItem();
   tray->AddTrayItem(test_item);
   tray->AddTrayItem(detailed_item);
 
@@ -314,7 +361,7 @@
   SystemTray* tray = GetPrimarySystemTray();
   ASSERT_TRUE(tray->GetWidget());
 
-  TestItem* test_item = new TestItem;
+  TestSystemTrayItem* test_item = new TestSystemTrayItem();
   tray->AddTrayItem(test_item);
 
   // Ensure the tray views are created.
@@ -384,7 +431,7 @@
   SystemTray* tray = GetPrimarySystemTray();
   ASSERT_TRUE(tray->GetWidget());
 
-  TestItem* test_item = new TestItem;
+  TestSystemTrayItem* test_item = new TestSystemTrayItem();
   tray->AddTrayItem(test_item);
 
   std::unique_ptr<views::Widget> widget(CreateTestWidget(
diff --git a/ash/common/system/tray/tray_bubble_wrapper.h b/ash/common/system/tray/tray_bubble_wrapper.h
index 2f77a9b..1a7877a9 100644
--- a/ash/common/system/tray/tray_bubble_wrapper.h
+++ b/ash/common/system/tray/tray_bubble_wrapper.h
@@ -31,6 +31,7 @@
 
   const TrayBackgroundView* tray() const { return tray_; }
   TrayBackgroundView* tray() { return tray_; }
+  views::TrayBubbleView* bubble_view() { return bubble_view_; }
   const views::TrayBubbleView* bubble_view() const { return bubble_view_; }
   const views::Widget* bubble_widget() const { return bubble_widget_; }
 
diff --git a/ash/common/system/tray/tray_details_view_unittest.cc b/ash/common/system/tray/tray_details_view_unittest.cc
index 4b9f1db..42c4efb 100644
--- a/ash/common/system/tray/tray_details_view_unittest.cc
+++ b/ash/common/system/tray/tray_details_view_unittest.cc
@@ -65,7 +65,7 @@
 class TestItem : public SystemTrayItem {
  public:
   TestItem()
-      : SystemTrayItem(AshTestBase::GetPrimarySystemTray()),
+      : SystemTrayItem(AshTestBase::GetPrimarySystemTray(), UMA_TEST),
         tray_view_(nullptr),
         default_view_(nullptr),
         detailed_view_(nullptr) {}
diff --git a/ash/common/system/tray/tray_empty.cc b/ash/common/system/tray/tray_empty.cc
deleted file mode 100644
index 05261a0..0000000
--- a/ash/common/system/tray/tray_empty.cc
+++ /dev/null
@@ -1,62 +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 "ash/common/system/tray/tray_empty.h"
-
-#include "ui/views/background.h"
-#include "ui/views/border.h"
-#include "ui/views/layout/box_layout.h"
-#include "ui/views/view.h"
-
-namespace {
-
-class EmptyBackground : public views::Background {
- public:
-  EmptyBackground() {}
-  ~EmptyBackground() override {}
-
- private:
-  void Paint(gfx::Canvas* canvas, views::View* view) const override {}
-
-  DISALLOW_COPY_AND_ASSIGN(EmptyBackground);
-};
-}
-
-namespace ash {
-
-TrayEmpty::TrayEmpty(SystemTray* system_tray) : SystemTrayItem(system_tray) {}
-
-TrayEmpty::~TrayEmpty() {}
-
-views::View* TrayEmpty::CreateTrayView(LoginStatus status) {
-  return NULL;
-}
-
-views::View* TrayEmpty::CreateDefaultView(LoginStatus status) {
-  if (status == LoginStatus::NOT_LOGGED_IN)
-    return NULL;
-
-  views::View* view = new views::View;
-  view->set_background(new EmptyBackground());
-  view->SetBorder(views::Border::CreateEmptyBorder(10, 0, 0, 0));
-  view->SetLayoutManager(
-      new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0));
-  view->SetPaintToLayer(true);
-  view->layer()->SetFillsBoundsOpaquely(false);
-  return view;
-}
-
-views::View* TrayEmpty::CreateDetailedView(LoginStatus status) {
-  return NULL;
-}
-
-void TrayEmpty::DestroyTrayView() {}
-
-void TrayEmpty::DestroyDefaultView() {}
-
-void TrayEmpty::DestroyDetailedView() {}
-
-void TrayEmpty::UpdateAfterLoginStatusChange(LoginStatus status) {}
-
-}  // namespace ash
diff --git a/ash/common/system/tray/tray_empty.h b/ash/common/system/tray/tray_empty.h
deleted file mode 100644
index 59af39a..0000000
--- a/ash/common/system/tray/tray_empty.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_COMMON_SYSTEM_TRAY_TRAY_EMPTY_H_
-#define ASH_COMMON_SYSTEM_TRAY_TRAY_EMPTY_H_
-
-#include "ash/common/system/tray/system_tray_item.h"
-#include "base/macros.h"
-
-namespace ash {
-
-class TrayEmpty : public SystemTrayItem {
- public:
-  explicit TrayEmpty(SystemTray* system_tray);
-  ~TrayEmpty() override;
-
- private:
-  // Overridden from SystemTrayItem.
-  views::View* CreateTrayView(LoginStatus status) override;
-  views::View* CreateDefaultView(LoginStatus status) override;
-  views::View* CreateDetailedView(LoginStatus status) override;
-  void DestroyTrayView() override;
-  void DestroyDefaultView() override;
-  void DestroyDetailedView() override;
-  void UpdateAfterLoginStatusChange(LoginStatus status) override;
-
-  DISALLOW_COPY_AND_ASSIGN(TrayEmpty);
-};
-
-}  // namespace ash
-
-#endif  // ASH_COMMON_SYSTEM_TRAY_TRAY_EMPTY_H_
diff --git a/ash/common/system/tray/tray_image_item.cc b/ash/common/system/tray/tray_image_item.cc
index 590be18f..941a3e8 100644
--- a/ash/common/system/tray/tray_image_item.cc
+++ b/ash/common/system/tray/tray_image_item.cc
@@ -54,8 +54,10 @@
 
 }  // namespace
 
-TrayImageItem::TrayImageItem(SystemTray* system_tray, int resource_id)
-    : SystemTrayItem(system_tray),
+TrayImageItem::TrayImageItem(SystemTray* system_tray,
+                             int resource_id,
+                             UmaType uma_type)
+    : SystemTrayItem(system_tray, uma_type),
       resource_id_(resource_id),
       tray_view_(nullptr) {}
 
diff --git a/ash/common/system/tray/tray_image_item.h b/ash/common/system/tray/tray_image_item.h
index eb22c9e..5786941 100644
--- a/ash/common/system/tray/tray_image_item.h
+++ b/ash/common/system/tray/tray_image_item.h
@@ -18,7 +18,7 @@
 
 class ASH_EXPORT TrayImageItem : public SystemTrayItem {
  public:
-  TrayImageItem(SystemTray* system_tray, int resource_id);
+  TrayImageItem(SystemTray* system_tray, int resource_id, UmaType uma_type);
   ~TrayImageItem() override;
 
   views::View* tray_view();
diff --git a/ash/common/system/tray/tray_popup_item_container.cc b/ash/common/system/tray/tray_popup_item_container.cc
index 3659ea6..103788f 100644
--- a/ash/common/system/tray/tray_popup_item_container.cc
+++ b/ash/common/system/tray/tray_popup_item_container.cc
@@ -13,14 +13,9 @@
 namespace ash {
 
 TrayPopupItemContainer::TrayPopupItemContainer(views::View* view,
-                                               bool change_background,
-                                               bool draw_border)
+                                               bool change_background)
     : active_(false), change_background_(change_background) {
   set_notify_enter_exit_on_child(true);
-  if (draw_border) {
-    SetBorder(
-        views::Border::CreateSolidSidedBorder(0, 0, 1, 0, kBorderLightColor));
-  }
   views::BoxLayout* layout =
       new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0);
   layout->SetDefaultFlex(1);
@@ -35,6 +30,12 @@
 
 TrayPopupItemContainer::~TrayPopupItemContainer() {}
 
+void TrayPopupItemContainer::SetDrawBorder(bool draw_border) {
+  SetBorder(draw_border ? views::Border::CreateSolidSidedBorder(
+                              0, 0, 1, 0, kBorderLightColor)
+                        : nullptr);
+}
+
 void TrayPopupItemContainer::SetActive(bool active) {
   if (!change_background_ || active_ == active)
     return;
diff --git a/ash/common/system/tray/tray_popup_item_container.h b/ash/common/system/tray/tray_popup_item_container.h
index b0b753fe..e031c88 100644
--- a/ash/common/system/tray/tray_popup_item_container.h
+++ b/ash/common/system/tray/tray_popup_item_container.h
@@ -14,12 +14,12 @@
 // hovering or a user is interacting via touch.
 class TrayPopupItemContainer : public views::View {
  public:
-  TrayPopupItemContainer(views::View* view,
-                         bool change_background,
-                         bool draw_border);
+  TrayPopupItemContainer(views::View* view, bool change_background);
 
   ~TrayPopupItemContainer() override;
 
+  void SetDrawBorder(bool draw_border);
+
   bool active() { return active_; }
 
  private:
diff --git a/ash/common/system/tray_accessibility.cc b/ash/common/system/tray_accessibility.cc
index 14c8d70..b078698 100644
--- a/ash/common/system/tray_accessibility.cc
+++ b/ash/common/system/tray_accessibility.cc
@@ -303,7 +303,9 @@
 // ash::TrayAccessibility
 
 TrayAccessibility::TrayAccessibility(SystemTray* system_tray)
-    : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_ACCESSIBILITY),
+    : TrayImageItem(system_tray,
+                    IDR_AURA_UBER_TRAY_ACCESSIBILITY,
+                    UMA_ACCESSIBILITY),
       default_(NULL),
       detailed_popup_(NULL),
       detailed_menu_(NULL),
diff --git a/ash/common/system/update/tray_update.cc b/ash/common/system/update/tray_update.cc
index b5d3b6a0a..4111ade 100644
--- a/ash/common/system/update/tray_update.cc
+++ b/ash/common/system/update/tray_update.cc
@@ -86,7 +86,7 @@
 }  // namespace
 
 TrayUpdate::TrayUpdate(SystemTray* system_tray)
-    : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_UPDATE) {
+    : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_UPDATE, UMA_UPDATE) {
   WmShell::Get()->system_tray_notifier()->AddUpdateObserver(this);
 }
 
diff --git a/ash/common/system/user/tray_user.cc b/ash/common/system/user/tray_user.cc
index 93f7064..0148898 100644
--- a/ash/common/system/user/tray_user.cc
+++ b/ash/common/system/user/tray_user.cc
@@ -38,7 +38,7 @@
 namespace ash {
 
 TrayUser::TrayUser(SystemTray* system_tray, UserIndex index)
-    : SystemTrayItem(system_tray),
+    : SystemTrayItem(system_tray, UMA_USER),
       user_index_(index),
       user_(nullptr),
       layout_view_(nullptr),
diff --git a/ash/common/system/user/tray_user_separator.cc b/ash/common/system/user/tray_user_separator.cc
index 328f4a6..445c550 100644
--- a/ash/common/system/user/tray_user_separator.cc
+++ b/ash/common/system/user/tray_user_separator.cc
@@ -11,7 +11,7 @@
 namespace ash {
 
 TrayUserSeparator::TrayUserSeparator(SystemTray* system_tray)
-    : SystemTrayItem(system_tray), separator_shown_(false) {}
+    : SystemTrayItem(system_tray, UMA_NOT_RECORDED), separator_shown_(false) {}
 
 views::View* TrayUserSeparator::CreateTrayView(LoginStatus status) {
   return NULL;
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc
index 9832b13..30854ef 100644
--- a/ash/shelf/shelf_layout_manager_unittest.cc
+++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -29,10 +29,10 @@
 #include "ash/test/ash_test_base.h"
 #include "ash/test/display_manager_test_api.h"
 #include "ash/test/shelf_test_api.h"
+#include "ash/test/test_system_tray_item.h"
 #include "ash/wm/window_state_aura.h"
 #include "ash/wm/window_util.h"
 #include "base/command_line.h"
-#include "base/strings/utf_string_conversions.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/client/window_tree_client.h"
 #include "ui/aura/window.h"
@@ -45,8 +45,6 @@
 #include "ui/display/screen.h"
 #include "ui/events/gesture_detection/gesture_configuration.h"
 #include "ui/events/test/event_generator.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/layout/fill_layout.h"
 #include "ui/views/view.h"
 #include "ui/views/widget/widget.h"
 
@@ -262,68 +260,6 @@
   DISALLOW_COPY_AND_ASSIGN(ShelfLayoutObserverTest);
 };
 
-// Trivial item implementation that tracks its views for testing.
-class TestItem : public SystemTrayItem {
- public:
-  TestItem()
-      : SystemTrayItem(GetSystemTray()),
-        tray_view_(nullptr),
-        default_view_(nullptr),
-        detailed_view_(nullptr),
-        notification_view_(nullptr) {}
-
-  views::View* CreateTrayView(LoginStatus status) override {
-    tray_view_ = new views::View;
-    // Add a label so it has non-zero width.
-    tray_view_->SetLayoutManager(new views::FillLayout);
-    tray_view_->AddChildView(new views::Label(base::UTF8ToUTF16("Tray")));
-    return tray_view_;
-  }
-
-  views::View* CreateDefaultView(LoginStatus status) override {
-    default_view_ = new views::View;
-    default_view_->SetLayoutManager(new views::FillLayout);
-    default_view_->AddChildView(new views::Label(base::UTF8ToUTF16("Default")));
-    return default_view_;
-  }
-
-  views::View* CreateDetailedView(LoginStatus status) override {
-    detailed_view_ = new views::View;
-    detailed_view_->SetLayoutManager(new views::FillLayout);
-    detailed_view_->AddChildView(
-        new views::Label(base::UTF8ToUTF16("Detailed")));
-    return detailed_view_;
-  }
-
-  views::View* CreateNotificationView(LoginStatus status) override {
-    notification_view_ = new views::View;
-    return notification_view_;
-  }
-
-  void DestroyTrayView() override { tray_view_ = nullptr; }
-
-  void DestroyDefaultView() override { default_view_ = nullptr; }
-
-  void DestroyDetailedView() override { detailed_view_ = nullptr; }
-
-  void DestroyNotificationView() override { notification_view_ = nullptr; }
-
-  void UpdateAfterLoginStatusChange(LoginStatus status) override {}
-
-  views::View* tray_view() const { return tray_view_; }
-  views::View* default_view() const { return default_view_; }
-  views::View* detailed_view() const { return detailed_view_; }
-  views::View* notification_view() const { return notification_view_; }
-
- private:
-  views::View* tray_view_;
-  views::View* default_view_;
-  views::View* detailed_view_;
-  views::View* notification_view_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestItem);
-};
-
 }  // namespace
 
 class ShelfLayoutManagerTest : public test::AshTestBase {
@@ -2122,7 +2058,7 @@
       EXPECT_FALSE(status_area_widget->IsMessageBubbleShown());
     } else {
       // In our second iteration we show a bubble.
-      TestItem* item = new TestItem;
+      test::TestSystemTrayItem* item = new test::TestSystemTrayItem();
       tray->AddTrayItem(item);
       tray->ShowNotificationView(item);
       EXPECT_TRUE(status_area_widget->IsMessageBubbleShown());
diff --git a/ash/shelf/shelf_view_unittest.cc b/ash/shelf/shelf_view_unittest.cc
index 1031275..59765d8 100644
--- a/ash/shelf/shelf_view_unittest.cc
+++ b/ash/shelf/shelf_view_unittest.cc
@@ -30,7 +30,6 @@
 #include "ash/test/overflow_bubble_view_test_api.h"
 #include "ash/test/shelf_test_api.h"
 #include "ash/test/shelf_view_test_api.h"
-#include "ash/test/shell_test_api.h"
 #include "ash/test/test_shelf_delegate.h"
 #include "ash/test/test_shelf_item_delegate.h"
 #include "ash/test/test_shell_delegate.h"
@@ -314,8 +313,7 @@
 
   void SetUp() override {
     AshTestBase::SetUp();
-    ShellTestApi test_api(Shell::GetInstance());
-    model_ = test_api.shelf_model();
+    model_ = WmShell::Get()->shelf_model();
     Shelf* shelf = Shelf::ForPrimaryDisplay();
     shelf_view_ = ShelfTestAPI(shelf).shelf_view();
 
diff --git a/ash/shelf/shelf_window_watcher_unittest.cc b/ash/shelf/shelf_window_watcher_unittest.cc
index 989363d..606e7be6 100644
--- a/ash/shelf/shelf_window_watcher_unittest.cc
+++ b/ash/shelf/shelf_window_watcher_unittest.cc
@@ -11,10 +11,10 @@
 #include "ash/common/shell_window_ids.h"
 #include "ash/common/wm/window_resizer.h"
 #include "ash/common/wm/window_state.h"
+#include "ash/common/wm_shell.h"
 #include "ash/shelf/shelf_util.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
-#include "ash/test/shell_test_api.h"
 #include "ash/wm/window_state_aura.h"
 #include "ash/wm/window_util.h"
 #include "base/command_line.h"
@@ -31,7 +31,7 @@
 
   void SetUp() override {
     test::AshTestBase::SetUp();
-    model_ = test::ShellTestApi(Shell::GetInstance()).shelf_model();
+    model_ = WmShell::Get()->shelf_model();
   }
 
   void TearDown() override {
diff --git a/ash/system/chromeos/rotation/tray_rotation_lock.cc b/ash/system/chromeos/rotation/tray_rotation_lock.cc
index ffc1290..0a44b74 100644
--- a/ash/system/chromeos/rotation/tray_rotation_lock.cc
+++ b/ash/system/chromeos/rotation/tray_rotation_lock.cc
@@ -105,7 +105,9 @@
 }  // namespace tray
 
 TrayRotationLock::TrayRotationLock(SystemTray* system_tray)
-    : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_AUTO_ROTATION_LOCKED),
+    : TrayImageItem(system_tray,
+                    IDR_AURA_UBER_TRAY_AUTO_ROTATION_LOCKED,
+                    UMA_ROTATION_LOCK),
       observing_rotation_(false),
       observing_shell_(true) {
   WmShell::Get()->AddShellObserver(this);
diff --git a/ash/system/chromeos/tray_display.cc b/ash/system/chromeos/tray_display.cc
index f595dedf..66c184b9 100644
--- a/ash/system/chromeos/tray_display.cc
+++ b/ash/system/chromeos/tray_display.cc
@@ -318,7 +318,7 @@
 };
 
 TrayDisplay::TrayDisplay(SystemTray* system_tray)
-    : SystemTrayItem(system_tray), default_(NULL) {
+    : SystemTrayItem(system_tray, UMA_DISPLAY), default_(nullptr) {
   WmShell::Get()->AddDisplayObserver(this);
   UpdateDisplayInfo(NULL);
 }
diff --git a/ash/system/web_notification/web_notification_tray_unittest.cc b/ash/system/web_notification/web_notification_tray_unittest.cc
index 0059431..59f4a32 100644
--- a/ash/system/web_notification/web_notification_tray_unittest.cc
+++ b/ash/system/web_notification/web_notification_tray_unittest.cc
@@ -69,7 +69,7 @@
 // Trivial item implementation for testing PopupAndSystemTray test case.
 class TestItem : public SystemTrayItem {
  public:
-  TestItem() : SystemTrayItem(GetSystemTray()) {}
+  TestItem() : SystemTrayItem(GetSystemTray(), UMA_TEST) {}
 
   views::View* CreateDefaultView(LoginStatus status) override {
     views::View* default_view = new views::View;
diff --git a/ash/sysui/stub_context_factory.h b/ash/sysui/stub_context_factory.h
index f1f5d65..e168604 100644
--- a/ash/sysui/stub_context_factory.h
+++ b/ash/sysui/stub_context_factory.h
@@ -45,6 +45,9 @@
                             const gfx::ColorSpace& color_space) override;
   void SetAuthoritativeVSyncInterval(ui::Compositor* compositor,
                                      base::TimeDelta interval) override {}
+  void SetDisplayVSyncParameters(ui::Compositor* compositor,
+                                 base::TimeTicks timebase,
+                                 base::TimeDelta interval) override {}
   void SetOutputIsSecure(ui::Compositor* compositor, bool secure) override {}
   void AddObserver(ui::ContextFactoryObserver* observer) override {}
   void RemoveObserver(ui::ContextFactoryObserver* observer) override {}
diff --git a/ash/test/shell_test_api.cc b/ash/test/shell_test_api.cc
index b904335..8c8293c 100644
--- a/ash/test/shell_test_api.cc
+++ b/ash/test/shell_test_api.cc
@@ -4,9 +4,7 @@
 
 #include "ash/test/shell_test_api.h"
 
-#include "ash/aura/wm_shell_aura.h"
 #include "ash/common/session/session_state_delegate.h"
-#include "ash/common/shell_delegate.h"
 #include "ash/display/display_configuration_controller.h"
 #include "ash/root_window_controller.h"
 #include "ash/shell.h"
@@ -32,19 +30,10 @@
   return shell_->native_cursor_manager_;
 }
 
-ShelfModel* ShellTestApi::shelf_model() {
-  // TODO(jamescook): Remove this and access WmShell::shelf_model() directly.
-  return shell_->wm_shell_->shelf_model();
-}
-
 DragDropController* ShellTestApi::drag_drop_controller() {
   return shell_->drag_drop_controller_.get();
 }
 
-app_list::AppListPresenter* ShellTestApi::app_list_presenter() {
-  return shell_->wm_shell_->delegate()->GetAppListPresenter();
-}
-
 void ShellTestApi::DisableDisplayAnimator() {
   shell_->display_configuration_controller()->ResetAnimatorForTest();
 }
diff --git a/ash/test/shell_test_api.h b/ash/test/shell_test_api.h
index 4915934..236258be 100644
--- a/ash/test/shell_test_api.h
+++ b/ash/test/shell_test_api.h
@@ -7,18 +7,12 @@
 
 #include "base/macros.h"
 
-namespace app_list {
-class AppListPresenter;
-}
-
 namespace ash {
 class AshNativeCursorManager;
 class DragDropController;
 class MaximizeModeWindowManager;
 class SessionStateDelegate;
 class ScreenPositionController;
-class ShelfDelegate;
-class ShelfModel;
 class Shell;
 class SystemGestureEventFilter;
 class WorkspaceController;
@@ -34,9 +28,7 @@
   WorkspaceController* workspace_controller();
   ScreenPositionController* screen_position_controller();
   AshNativeCursorManager* ash_native_cursor_manager();
-  ShelfModel* shelf_model();
   DragDropController* drag_drop_controller();
-  app_list::AppListPresenter* app_list_presenter();
   MaximizeModeWindowManager* maximize_mode_window_manager();
   void DisableDisplayAnimator();
 
diff --git a/ash/test/test_system_tray_item.cc b/ash/test/test_system_tray_item.cc
new file mode 100644
index 0000000..8370575
--- /dev/null
+++ b/ash/test/test_system_tray_item.cc
@@ -0,0 +1,95 @@
+// 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 "ash/test/test_system_tray_item.h"
+
+#include "ash/test/ash_test_base.h"
+#include "base/strings/utf_string_conversions.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/layout/fill_layout.h"
+#include "ui/views/view.h"
+
+namespace ash {
+namespace test {
+
+TestSystemTrayItem::TestSystemTrayItem() : TestSystemTrayItem(UMA_TEST) {}
+
+TestSystemTrayItem::TestSystemTrayItem(SystemTrayItem::UmaType uma_type)
+    : SystemTrayItem(AshTestBase::GetPrimarySystemTray(), uma_type),
+      has_views_(true),
+      views_are_visible_(true),
+      tray_view_(nullptr),
+      default_view_(nullptr),
+      detailed_view_(nullptr),
+      notification_view_(nullptr) {}
+
+TestSystemTrayItem::~TestSystemTrayItem() {}
+
+views::View* TestSystemTrayItem::CreateTrayView(LoginStatus status) {
+  if (!has_views_) {
+    tray_view_ = nullptr;
+    return tray_view_;
+  }
+  tray_view_ = new views::View;
+  // Add a label so it has non-zero width.
+  tray_view_->SetLayoutManager(new views::FillLayout);
+  tray_view_->AddChildView(new views::Label(base::UTF8ToUTF16("Tray")));
+  tray_view_->SetVisible(views_are_visible_);
+  return tray_view_;
+}
+
+views::View* TestSystemTrayItem::CreateDefaultView(LoginStatus status) {
+  if (!has_views_) {
+    default_view_ = nullptr;
+    return default_view_;
+  }
+  default_view_ = new views::View;
+  default_view_->SetLayoutManager(new views::FillLayout);
+  default_view_->AddChildView(new views::Label(base::UTF8ToUTF16("Default")));
+  default_view_->SetVisible(views_are_visible_);
+  return default_view_;
+}
+
+views::View* TestSystemTrayItem::CreateDetailedView(LoginStatus status) {
+  if (!has_views_) {
+    detailed_view_ = nullptr;
+    return detailed_view_;
+  }
+  detailed_view_ = new views::View;
+  detailed_view_->SetLayoutManager(new views::FillLayout);
+  detailed_view_->AddChildView(new views::Label(base::UTF8ToUTF16("Detailed")));
+  detailed_view_->SetVisible(views_are_visible_);
+  return detailed_view_;
+}
+
+views::View* TestSystemTrayItem::CreateNotificationView(LoginStatus status) {
+  if (!has_views_) {
+    notification_view_ = nullptr;
+    return notification_view_;
+  }
+  notification_view_ = new views::View;
+  notification_view_->SetVisible(views_are_visible_);
+  return notification_view_;
+}
+
+void TestSystemTrayItem::DestroyTrayView() {
+  tray_view_ = nullptr;
+}
+
+void TestSystemTrayItem::DestroyDefaultView() {
+  default_view_ = nullptr;
+}
+
+void TestSystemTrayItem::DestroyDetailedView() {
+  detailed_view_ = nullptr;
+}
+
+void TestSystemTrayItem::DestroyNotificationView() {
+  notification_view_ = nullptr;
+}
+
+void TestSystemTrayItem::UpdateAfterLoginStatusChange(LoginStatus status) {}
+
+}  // namespace test
+}  // namespace ash
diff --git a/ash/test/test_system_tray_item.h b/ash/test/test_system_tray_item.h
new file mode 100644
index 0000000..888e249
--- /dev/null
+++ b/ash/test/test_system_tray_item.h
@@ -0,0 +1,56 @@
+// 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 ASH_COMMON_SYSTEM_TRAY_TEST_TEST_SYSTEM_TRAY_ITEM_H_
+#define ASH_COMMON_SYSTEM_TRAY_TEST_TEST_SYSTEM_TRAY_ITEM_H_
+
+#include "ash/common/system/tray/system_tray_item.h"
+
+namespace ash {
+namespace test {
+
+// Trivial item implementation that tracks its views for testing. By default
+// views are created and returned by the Create*View() methods and they are
+// configured to be visible. Use set_has_views() and set_views_are_visible() to
+// change this behavior.
+class TestSystemTrayItem : public SystemTrayItem {
+ public:
+  TestSystemTrayItem();
+  explicit TestSystemTrayItem(SystemTrayItem::UmaType uma_type);
+  ~TestSystemTrayItem() override;
+
+  void set_has_views(bool has_views) { has_views_ = has_views; }
+  void set_views_are_visible(bool visible) { views_are_visible_ = visible; }
+
+  views::View* tray_view() const { return tray_view_; }
+  views::View* default_view() const { return default_view_; }
+  views::View* detailed_view() const { return detailed_view_; }
+  views::View* notification_view() const { return notification_view_; }
+
+  // SystemTrayItem:
+  views::View* CreateTrayView(LoginStatus status) override;
+  views::View* CreateDefaultView(LoginStatus status) override;
+  views::View* CreateDetailedView(LoginStatus status) override;
+  views::View* CreateNotificationView(LoginStatus status) override;
+  void DestroyTrayView() override;
+  void DestroyDefaultView() override;
+  void DestroyDetailedView() override;
+  void DestroyNotificationView() override;
+  void UpdateAfterLoginStatusChange(LoginStatus status) override;
+
+ private:
+  bool has_views_;
+  bool views_are_visible_;
+  views::View* tray_view_;
+  views::View* default_view_;
+  views::View* detailed_view_;
+  views::View* notification_view_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestSystemTrayItem);
+};
+
+}  // namespace test
+}  // namespace ash
+
+#endif  // ASH_COMMON_SYSTEM_TRAY_TEST_TEST_SYSTEM_TRAY_ITEM_H_
diff --git a/ash/wm/dock/docked_window_resizer_unittest.cc b/ash/wm/dock/docked_window_resizer_unittest.cc
index d9b3b2a..da018ec 100644
--- a/ash/wm/dock/docked_window_resizer_unittest.cc
+++ b/ash/wm/dock/docked_window_resizer_unittest.cc
@@ -13,6 +13,7 @@
 #include "ash/common/wm/panels/panel_layout_manager.h"
 #include "ash/common/wm/window_state.h"
 #include "ash/common/wm/wm_event.h"
+#include "ash/common/wm_shell.h"
 #include "ash/display/window_tree_host_manager.h"
 #include "ash/root_window_controller.h"
 #include "ash/screen_util.h"
@@ -22,7 +23,6 @@
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/test/cursor_manager_test_api.h"
-#include "ash/test/shell_test_api.h"
 #include "ash/test/test_shelf_delegate.h"
 #include "ash/wm/drag_window_resizer.h"
 #include "ash/wm/window_state_aura.h"
@@ -51,8 +51,7 @@
   void SetUp() override {
     AshTestBase::SetUp();
     UpdateDisplay("600x400");
-    test::ShellTestApi test_api(Shell::GetInstance());
-    model_ = test_api.shelf_model();
+    model_ = WmShell::Get()->shelf_model();
   }
 
   void TearDown() override { AshTestBase::TearDown(); }
diff --git a/ash/wm/panels/panel_layout_manager_unittest.cc b/ash/wm/panels/panel_layout_manager_unittest.cc
index 3ea0f31..3f5622e 100644
--- a/ash/wm/panels/panel_layout_manager_unittest.cc
+++ b/ash/wm/panels/panel_layout_manager_unittest.cc
@@ -23,7 +23,6 @@
 #include "ash/test/ash_test_base.h"
 #include "ash/test/shelf_test_api.h"
 #include "ash/test/shelf_view_test_api.h"
-#include "ash/test/shell_test_api.h"
 #include "ash/test/test_shelf_delegate.h"
 #include "ash/wm/window_state_aura.h"
 #include "ash/wm/window_util.h"
@@ -195,8 +194,8 @@
     test::ShelfViewTestAPI test_api(shelf_view);
     test_api.SetAnimationDuration(1);
     test_api.RunMessageLoopUntilAnimationsDone();
-    ShelfModel* model = test::ShellTestApi(Shell::GetInstance()).shelf_model();
-    int index = model->ItemIndexByID(GetShelfIDForWindow(window));
+    int index = WmShell::Get()->shelf_model()->ItemIndexByID(
+        GetShelfIDForWindow(window));
     gfx::Rect bounds = test_api.GetButton(index)->GetBoundsInScreen();
 
     ui::test::EventGenerator& event_generator = GetEventGenerator();
diff --git a/ash/wm/panels/panel_window_resizer_unittest.cc b/ash/wm/panels/panel_window_resizer_unittest.cc
index 0740697..fd3fd9a 100644
--- a/ash/wm/panels/panel_window_resizer_unittest.cc
+++ b/ash/wm/panels/panel_window_resizer_unittest.cc
@@ -10,6 +10,7 @@
 #include "ash/common/shell_window_ids.h"
 #include "ash/common/wm/window_state.h"
 #include "ash/common/wm/wm_event.h"
+#include "ash/common/wm_shell.h"
 #include "ash/root_window_controller.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_layout_manager.h"
@@ -18,7 +19,6 @@
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/test/cursor_manager_test_api.h"
-#include "ash/test/shell_test_api.h"
 #include "ash/test/test_shelf_delegate.h"
 #include "ash/wm/drag_window_resizer.h"
 #include "ash/wm/window_state_aura.h"
@@ -41,8 +41,7 @@
   void SetUp() override {
     AshTestBase::SetUp();
     UpdateDisplay("600x400");
-    test::ShellTestApi test_api(Shell::GetInstance());
-    model_ = test_api.shelf_model();
+    model_ = WmShell::Get()->shelf_model();
     shelf_delegate_ = test::TestShelfDelegate::instance();
   }
 
diff --git a/base/process/kill.h b/base/process/kill.h
index c664f33..f4247c7 100644
--- a/base/process/kill.h
+++ b/base/process/kill.h
@@ -39,6 +39,7 @@
   TERMINATION_STATUS_OOM_PROTECTED,        // child was protected from oom kill
 #endif
   TERMINATION_STATUS_LAUNCH_FAILED,        // child process never launched
+  TERMINATION_STATUS_OOM,                  // Process died due to oom
   TERMINATION_STATUS_MAX_ENUM
 };
 
diff --git a/base/process/kill_win.cc b/base/process/kill_win.cc
index 358590e7..42e58df 100644
--- a/base/process/kill_win.cc
+++ b/base/process/kill_win.cc
@@ -14,6 +14,7 @@
 #include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/process/memory.h"
 #include "base/process/process_iterator.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/win/object_watcher.h"
@@ -146,6 +147,8 @@
     case kDebuggerTerminatedExitCode:  // Debugger terminated process.
     case kProcessKilledExitCode:  // Task manager kill.
       return TERMINATION_STATUS_PROCESS_WAS_KILLED;
+    case base::win::kOomExceptionCode:  // Ran out of memory.
+      return TERMINATION_STATUS_OOM;
     default:
       // All other exit codes indicate crashes.
       return TERMINATION_STATUS_PROCESS_CRASHED;
diff --git a/base/test/test_io_thread.cc b/base/test/test_io_thread.cc
index 1fa04125..ce4a8d10 100644
--- a/base/test/test_io_thread.cc
+++ b/base/test/test_io_thread.cc
@@ -4,19 +4,7 @@
 
 #include "base/test/test_io_thread.h"
 
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/synchronization/waitable_event.h"
-
-namespace {
-
-void PostTaskAndWaitHelper(base::WaitableEvent* event,
-                           const base::Closure& task) {
-  task.Run();
-  event->Signal();
-}
-
-}  // namespace
+#include "base/logging.h"
 
 namespace base {
 
@@ -54,13 +42,4 @@
   task_runner()->PostTask(from_here, task);
 }
 
-void TestIOThread::PostTaskAndWait(const tracked_objects::Location& from_here,
-                                   const base::Closure& task) {
-  base::WaitableEvent event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                            WaitableEvent::InitialState::NOT_SIGNALED);
-  task_runner()->PostTask(from_here,
-                          base::Bind(&PostTaskAndWaitHelper, &event, task));
-  event.Wait();
-}
-
 }  // namespace base
diff --git a/base/test/test_io_thread.h b/base/test/test_io_thread.h
index c2ed187..5d3885e8 100644
--- a/base/test/test_io_thread.h
+++ b/base/test/test_io_thread.h
@@ -18,6 +18,13 @@
 // Create and run an IO thread with a MessageLoop, and
 // making the MessageLoop accessible from its client.
 // It also provides some ideomatic API like PostTaskAndWait().
+//
+// This API is not thread-safe:
+//   - Start()/Stop() should only be called from the main (creation) thread.
+//   - PostTask()/message_loop()/task_runner() are also safe to call from the
+//     underlying thread itself (to post tasks from other threads: get the
+//     task_runner() from the main thread first, it is then safe to pass _it_
+//     around).
 class TestIOThread {
  public:
   enum Mode { kAutoStart, kManualStart };
@@ -25,19 +32,14 @@
   // Stops the I/O thread if necessary.
   ~TestIOThread();
 
-  // |Start()|/|Stop()| should only be called from the main (creation) thread.
-  // After |Stop()|, |Start()| may be called again to start a new I/O thread.
-  // |Stop()| may be called even when the I/O thread is not started.
+  // After Stop(), Start() may be called again to start a new I/O thread.
+  // Stop() may be called even when the I/O thread is not started.
   void Start();
   void Stop();
 
   // Post |task| to the IO thread.
   void PostTask(const tracked_objects::Location& from_here,
                 const base::Closure& task);
-  // Posts |task| to the IO-thread with an WaitableEvent associated blocks on
-  // it until the posted |task| is executed, then returns.
-  void PostTaskAndWait(const tracked_objects::Location& from_here,
-                       const base::Closure& task);
 
   base::MessageLoopForIO* message_loop() {
     return static_cast<base::MessageLoopForIO*>(io_thread_.message_loop());
diff --git a/base/trace_event/memory_dump_manager_unittest.cc b/base/trace_event/memory_dump_manager_unittest.cc
index fc81ec5..864209f 100644
--- a/base/trace_event/memory_dump_manager_unittest.cc
+++ b/base/trace_event/memory_dump_manager_unittest.cc
@@ -19,6 +19,7 @@
 #include "base/test/test_io_thread.h"
 #include "base/test/trace_event_analyzer.h"
 #include "base/threading/platform_thread.h"
+#include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/sequenced_worker_pool.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -94,6 +95,20 @@
     quit_closure.Run();
 }
 
+// Posts |task| to |task_runner| and blocks until it is executed.
+void PostTaskAndWait(const tracked_objects::Location& from_here,
+                     SequencedTaskRunner* task_runner,
+                     const base::Closure& task) {
+  base::WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
+                            WaitableEvent::InitialState::NOT_SIGNALED);
+  task_runner->PostTask(from_here, task);
+  task_runner->PostTask(
+      FROM_HERE, base::Bind(&WaitableEvent::Signal, base::Unretained(&event)));
+  // The SequencedTaskRunner guarantees that |event| will only be signaled after
+  // |task| is executed.
+  event.Wait();
+}
+
 }  // namespace
 
 // Testing MemoryDumpManagerDelegate which, by default, short-circuits dump
@@ -688,13 +703,16 @@
   // unregister the other one.
   for (const std::unique_ptr<MockMemoryDumpProvider>& mdp : mdps) {
     int other_idx = (mdps.front() == mdp);
-    TestIOThread* other_thread = threads[other_idx].get();
+    // TestIOThread's task runner must be obtained from the main thread but can
+    // then be used from other threads.
+    scoped_refptr<SingleThreadTaskRunner> other_runner =
+        threads[other_idx]->task_runner();
     MockMemoryDumpProvider* other_mdp = mdps[other_idx].get();
-    auto on_dump = [this, other_thread, other_mdp, &on_memory_dump_call_count](
+    auto on_dump = [this, other_runner, other_mdp, &on_memory_dump_call_count](
         const MemoryDumpArgs& args, ProcessMemoryDump* pmd) {
-      other_thread->PostTaskAndWait(
-          FROM_HERE, base::Bind(&MemoryDumpManager::UnregisterDumpProvider,
-                                base::Unretained(&*mdm_), other_mdp));
+      PostTaskAndWait(FROM_HERE, other_runner.get(),
+                      base::Bind(&MemoryDumpManager::UnregisterDumpProvider,
+                                 base::Unretained(&*mdm_), other_mdp));
       on_memory_dump_call_count++;
       return true;
     };
@@ -739,9 +757,14 @@
   for (const std::unique_ptr<MockMemoryDumpProvider>& mdp : mdps) {
     int other_idx = (mdps.front() == mdp);
     TestIOThread* other_thread = threads[other_idx].get();
-    auto on_dump = [other_thread, &on_memory_dump_call_count](
+    // TestIOThread isn't thread-safe and must be stopped on the |main_runner|.
+    scoped_refptr<SequencedTaskRunner> main_runner =
+        SequencedTaskRunnerHandle::Get();
+    auto on_dump = [other_thread, main_runner, &on_memory_dump_call_count](
         const MemoryDumpArgs& args, ProcessMemoryDump* pmd) {
-      other_thread->Stop();
+      PostTaskAndWait(
+          FROM_HERE, main_runner.get(),
+          base::Bind(&TestIOThread::Stop, base::Unretained(other_thread)));
       on_memory_dump_call_count++;
       return true;
     };
@@ -1086,8 +1109,8 @@
       const MemoryDumpArgs&, ProcessMemoryDump*) -> bool {
     thread_ref = PlatformThread::CurrentRef();
     TestIOThread thread_for_unregistration(TestIOThread::kAutoStart);
-    thread_for_unregistration.PostTaskAndWait(
-        FROM_HERE,
+    PostTaskAndWait(
+        FROM_HERE, thread_for_unregistration.task_runner().get(),
         base::Bind(
             &MemoryDumpManager::UnregisterAndDeleteDumpProviderSoon,
             base::Unretained(MemoryDumpManager::GetInstance()),
diff --git a/base/version.cc b/base/version.cc
index 02213fbf..ca97a842 100644
--- a/base/version.cc
+++ b/base/version.cc
@@ -93,6 +93,8 @@
   components_.swap(parsed);
 }
 
+Version::Version(std::vector<uint32_t> components) : components_(components) {}
+
 bool Version::IsValid() const {
   return (!components_.empty());
 }
diff --git a/base/version.h b/base/version.h
index 25b570a..d044b2c 100644
--- a/base/version.h
+++ b/base/version.h
@@ -25,13 +25,17 @@
 
   Version(const Version& other);
 
-  ~Version();
-
   // Initializes from a decimal dotted version number, like "0.1.1".
   // Each component is limited to a uint16_t. Call IsValid() to learn
   // the outcome.
   explicit Version(const std::string& version_str);
 
+  // Initializes from a vector of components, like {1, 2, 3, 4}. Call IsValid()
+  // to learn the outcome.
+  explicit Version(std::vector<uint32_t> components);
+
+  ~Version();
+
   // Returns true if the object contains a valid version number.
   bool IsValid() const;
 
diff --git a/base/version_unittest.cc b/base/version_unittest.cc
index 5d9ea997..fe445fb 100644
--- a/base/version_unittest.cc
+++ b/base/version_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <stddef.h>
 #include <stdint.h>
+#include <utility>
 
 #include "base/macros.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -31,6 +32,14 @@
   EXPECT_EQ(v3, v1);
 }
 
+TEST(VersionTest, MoveSemantics) {
+  const std::vector<uint32_t> components = {1, 2, 3, 4};
+  Version v1(std::move(components));
+  EXPECT_TRUE(v1.IsValid());
+  Version v2("1.2.3.4");
+  EXPECT_EQ(v1, v2);
+}
+
 TEST(VersionTest, GetVersionFromString) {
   static const struct version_string {
     const char* input;
diff --git a/breakpad/breakpad.gyp b/breakpad/breakpad.gyp
index d24aec6e..eb8924a 100644
--- a/breakpad/breakpad.gyp
+++ b/breakpad/breakpad.gyp
@@ -576,6 +576,9 @@
               # linux_syscall_support.h:sys_clone()'s inline assembly.
               'cflags': ['-marm'],
             }],
+            ['chromeos==1', {
+              'defines': ['__CHROMEOS__'],
+            }],
             ['OS=="android"', {
               'include_dirs': [
                 'src/common/android/include',
diff --git a/build/android/pylib/local/device/local_device_environment.py b/build/android/pylib/local/device/local_device_environment.py
index f8cd530..43161437 100644
--- a/build/android/pylib/local/device/local_device_environment.py
+++ b/build/android/pylib/local/device/local_device_environment.py
@@ -3,12 +3,14 @@
 # found in the LICENSE file.
 
 import datetime
+import functools
 import logging
 import os
 import shutil
 import tempfile
 import threading
 
+from devil import base_error
 from devil.android import device_blacklist
 from devil.android import device_errors
 from devil.android import device_list
@@ -25,6 +27,50 @@
   return os.path.join(constants.GetOutDirectory(), file_name)
 
 
+def handle_shard_failures(f):
+  """A decorator that handles device failures for per-device functions.
+
+  Args:
+    f: the function being decorated. The function must take at least one
+      argument, and that argument must be the device.
+  """
+  return handle_shard_failures_with(None)(f)
+
+
+# TODO(jbudorick): Refactor this to work as a decorator or context manager.
+def handle_shard_failures_with(on_failure):
+  """A decorator that handles device failures for per-device functions.
+
+  This calls on_failure in the event of a failure.
+
+  Args:
+    f: the function being decorated. The function must take at least one
+      argument, and that argument must be the device.
+    on_failure: A binary function to call on failure.
+  """
+  def decorator(f):
+    @functools.wraps(f)
+    def wrapper(dev, *args, **kwargs):
+      try:
+        return f(dev, *args, **kwargs)
+      except device_errors.CommandTimeoutError:
+        logging.exception('Shard timed out: %s(%s)', f.__name__, str(dev))
+      except device_errors.DeviceUnreachableError:
+        logging.exception('Shard died: %s(%s)', f.__name__, str(dev))
+      except base_error.BaseError:
+        logging.exception('Shard failed: %s(%s)', f.__name__, str(dev))
+      except SystemExit:
+        logging.exception('Shard killed: %s(%s)', f.__name__, str(dev))
+        raise
+      if on_failure:
+        on_failure(dev, f.__name__)
+      return None
+
+    return wrapper
+
+  return decorator
+
+
 class LocalDeviceEnvironment(environment.Environment):
 
   def __init__(self, args, _error_func):
@@ -67,8 +113,12 @@
     if not self._devices:
       raise device_errors.NoDevicesError
 
-    if self._enable_device_cache:
-      for d in self._devices:
+    if self._logcat_output_file:
+      self._logcat_output_dir = tempfile.mkdtemp()
+
+    @handle_shard_failures_with(on_failure=self.BlacklistDevice)
+    def prepare_device(d):
+      if self._enable_device_cache:
         cache_path = _DeviceCachePath(d)
         if os.path.exists(cache_path):
           logging.info('Using device cache: %s', cache_path)
@@ -76,10 +126,8 @@
             d.LoadCacheData(f.read())
           # Delete cached file so that any exceptions cause it to be cleared.
           os.unlink(cache_path)
-    if self._logcat_output_file:
-      self._logcat_output_dir = tempfile.mkdtemp()
-    if self._logcat_output_dir:
-      for d in self._devices:
+
+      if self._logcat_output_dir:
         logcat_file = os.path.join(
             self._logcat_output_dir,
             '%s_%s' % (d.adb.GetDeviceSerial(),
@@ -89,6 +137,8 @@
         self._logcat_monitors.append(monitor)
         monitor.Start()
 
+    self.parallel_devices.pMap(prepare_device)
+
   @property
   def blacklist(self):
     return self._blacklist
@@ -121,17 +171,27 @@
 
   #override
   def TearDown(self):
-    # Write the cache even when not using it so that it will be ready the first
-    # time that it is enabled. Writing it every time is also necessary so that
-    # an invalid cache can be flushed just by disabling it for one run.
-    for d in self._devices:
+    @handle_shard_failures_with(on_failure=self.BlacklistDevice)
+    def tear_down_device(d):
+      # Write the cache even when not using it so that it will be ready the
+      # first time that it is enabled. Writing it every time is also necessary
+      # so that an invalid cache can be flushed just by disabling it for one
+      # run.
       cache_path = _DeviceCachePath(d)
       with open(cache_path, 'w') as f:
         f.write(d.DumpCacheData())
         logging.info('Wrote device cache: %s', cache_path)
+
+    self.parallel_devices.pMap(tear_down_device)
+
     for m in self._logcat_monitors:
-      m.Stop()
-      m.Close()
+      try:
+        m.Stop()
+        m.Close()
+      except base_error.BaseError:
+        logging.exception('Failed to stop logcat monitor for %s',
+                          m.adb.GetDeviceSerial())
+
     if self._logcat_output_file:
       file_utils.MergeFiles(
           self._logcat_output_file,
diff --git a/build/android/pylib/local/device/local_device_gtest_run.py b/build/android/pylib/local/device/local_device_gtest_run.py
index 3a299ef..72961708 100644
--- a/build/android/pylib/local/device/local_device_gtest_run.py
+++ b/build/android/pylib/local/device/local_device_gtest_run.py
@@ -232,7 +232,7 @@
 
   #override
   def SetUp(self):
-    @local_device_test_run.handle_shard_failures_with(
+    @local_device_environment.handle_shard_failures_with(
         on_failure=self._env.BlacklistDevice)
     def individual_device_set_up(dev):
       def install_apk():
@@ -313,7 +313,7 @@
     # Even when there's only one device, it still makes sense to retrieve the
     # test list so that tests can be split up and run in batches rather than all
     # at once (since test output is not streamed).
-    @local_device_test_run.handle_shard_failures_with(
+    @local_device_environment.handle_shard_failures_with(
         on_failure=self._env.BlacklistDevice)
     def list_tests(dev):
       raw_test_list = self._delegate.Run(
@@ -363,7 +363,7 @@
 
   #override
   def TearDown(self):
-    @local_device_test_run.handle_shard_failures
+    @local_device_environment.handle_shard_failures
     def individual_device_tear_down(dev):
       for s in self._servers.get(str(dev), []):
         s.TearDown()
diff --git a/build/android/pylib/local/device/local_device_instrumentation_test_run.py b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
index ee6f7a45..26d10f4d 100644
--- a/build/android/pylib/local/device/local_device_instrumentation_test_run.py
+++ b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
@@ -13,6 +13,7 @@
 from devil.utils import reraiser_thread
 from pylib import valgrind_tools
 from pylib.base import base_test_result
+from pylib.local.device import local_device_environment
 from pylib.local.device import local_device_test_run
 
 
@@ -67,7 +68,7 @@
       else:
         return d
 
-    @local_device_test_run.handle_shard_failures_with(
+    @local_device_environment.handle_shard_failures_with(
         self._env.BlacklistDevice)
     def individual_device_set_up(dev, host_device_tuples):
       def install_apk():
@@ -148,7 +149,7 @@
         self._test_instance.GetDataDependencies())
 
   def TearDown(self):
-    @local_device_test_run.handle_shard_failures_with(
+    @local_device_environment.handle_shard_failures_with(
         self._env.BlacklistDevice)
     def individual_device_tear_down(dev):
       if str(dev) in self._flag_changers:
diff --git a/build/android/pylib/local/device/local_device_perf_test_run.py b/build/android/pylib/local/device/local_device_perf_test_run.py
index 2981f49..11b904fb 100644
--- a/build/android/pylib/local/device/local_device_perf_test_run.py
+++ b/build/android/pylib/local/device/local_device_perf_test_run.py
@@ -9,6 +9,7 @@
 import pickle
 import shutil
 import tempfile
+import threading
 import time
 import zipfile
 
@@ -24,9 +25,41 @@
 from pylib import constants
 from pylib.base import base_test_result
 from pylib.constants import host_paths
+from pylib.local.device import local_device_environment
 from pylib.local.device import local_device_test_run
 
 
+class HeartBeat(object):
+
+  def __init__(self, shard, wait_time=60*10):
+    """ HeartBeat Logger constructor.
+
+    Args:
+      shard: A perf test runner device shard.
+      wait_time: time to wait between heartbeat messages.
+    """
+    self._shard = shard
+    self._running = False
+    self._timer = None
+    self._wait_time = wait_time
+
+  def Start(self):
+    if not self._running:
+      self._timer = threading.Timer(self._wait_time, self._LogMessage)
+      self._timer.start()
+      self._running = True
+
+  def Stop(self):
+    if self._running:
+      self._timer.cancel()
+      self._running = False
+
+  def _LogMessage(self):
+    logging.info('Currently working on test %s', self._shard.current_test)
+    self._timer = threading.Timer(self._wait_time, self._LogMessage)
+    self._timer.start()
+
+
 class TestShard(object):
   def __init__(
       self, env, test_instance, device, index, tests, retries=3, timeout=None):
@@ -35,6 +68,7 @@
     for t in tests:
       logging.info('  %s', t)
     self._battery = battery_utils.BatteryUtils(device)
+    self._current_test = None
     self._device = device
     self._env = env
     self._index = index
@@ -43,8 +77,9 @@
     self._test_instance = test_instance
     self._tests = tests
     self._timeout = timeout
+    self._heart_beat = HeartBeat(self)
 
-  @local_device_test_run.handle_shard_failures
+  @local_device_environment.handle_shard_failures
   def RunTestsOnShard(self):
     results = base_test_result.TestRunResults()
     for test in self._tests:
@@ -96,6 +131,9 @@
         or self._tests[test].get('archive_output_dir')):
       self._output_dir = tempfile.mkdtemp()
 
+    self._current_test = test
+    self._heart_beat.Start()
+
   def _RunSingleTest(self, test):
     self._test_instance.WriteBuildBotJson(self._output_dir)
 
@@ -204,7 +242,13 @@
       forwarder.Forwarder.UnmapAllDevicePorts(self._device)
     except Exception: # pylint: disable=broad-except
       logging.exception('Exception when resetting ports.')
+    finally:
+      self._heart_beat.Stop()
+      self._current_test = None
 
+  @property
+  def current_test(self):
+    return self._current_test
 
 class LocalDevicePerfTestRun(local_device_test_run.LocalDeviceTestRun):
 
@@ -308,7 +352,7 @@
 
     device_indices = range(min(len(self._devices), len(self._test_buckets)))
     shards = parallelizer.Parallelizer(device_indices).pMap(run_perf_tests)
-    return shards.pGet(self._timeout)
+    return [x for x in shards.pGet(self._timeout) if x is not None]
 
   # override
   def TestPackage(self):
diff --git a/build/android/pylib/local/device/local_device_test_run.py b/build/android/pylib/local/device/local_device_test_run.py
index 74e3d22..70946ac 100644
--- a/build/android/pylib/local/device/local_device_test_run.py
+++ b/build/android/pylib/local/device/local_device_test_run.py
@@ -3,20 +3,18 @@
 # found in the LICENSE file.
 
 import fnmatch
-import functools
 import imp
 import logging
 import signal
 import thread
 import threading
 
-from devil import base_error
-from devil.android import device_errors
 from devil.utils import signal_handler
 from pylib import valgrind_tools
 from pylib.base import base_test_result
 from pylib.base import test_run
 from pylib.base import test_collection
+from pylib.local.device import local_device_environment
 
 
 def IncrementalInstall(device, apk_helper, installer_script):
@@ -41,49 +39,6 @@
                     permissions=None)  # Auto-grant permissions from manifest.
 
 
-def handle_shard_failures(f):
-  """A decorator that handles device failures for per-device functions.
-
-  Args:
-    f: the function being decorated. The function must take at least one
-      argument, and that argument must be the device.
-  """
-  return handle_shard_failures_with(None)(f)
-
-
-def handle_shard_failures_with(on_failure):
-  """A decorator that handles device failures for per-device functions.
-
-  This calls on_failure in the event of a failure.
-
-  Args:
-    f: the function being decorated. The function must take at least one
-      argument, and that argument must be the device.
-    on_failure: A binary function to call on failure.
-  """
-  def decorator(f):
-    @functools.wraps(f)
-    def wrapper(dev, *args, **kwargs):
-      try:
-        return f(dev, *args, **kwargs)
-      except device_errors.CommandTimeoutError:
-        logging.exception('Shard timed out: %s(%s)', f.__name__, str(dev))
-      except device_errors.DeviceUnreachableError:
-        logging.exception('Shard died: %s(%s)', f.__name__, str(dev))
-      except base_error.BaseError:
-        logging.exception('Shard failed: %s(%s)', f.__name__, str(dev))
-      except SystemExit:
-        logging.exception('Shard killed: %s(%s)', f.__name__, str(dev))
-        raise
-      if on_failure:
-        on_failure(dev, f.__name__)
-      return None
-
-    return wrapper
-
-  return decorator
-
-
 class LocalDeviceTestRun(test_run.TestRun):
 
   def __init__(self, env, test_instance):
@@ -96,7 +51,7 @@
 
     exit_now = threading.Event()
 
-    @handle_shard_failures
+    @local_device_environment.handle_shard_failures
     def run_tests_on_device(dev, tests, results):
       for test in tests:
         if exit_now.isSet():
diff --git a/build/android/resource_sizes.py b/build/android/resource_sizes.py
index 6d59f8a..16f9e610 100755
--- a/build/android/resource_sizes.py
+++ b/build/android/resource_sizes.py
@@ -217,17 +217,20 @@
   total_install_size = total_apk_size
 
   for group in FILE_GROUPS:
-    apk_size = sum(member.compress_size for member in found_files[group])
-    install_size = apk_size
-    install_bytes = sum(f.file_size for f in found_files[group]
-                        if group.extracted(f.filename))
+    uncompressed_size = sum(member.file_size for member in found_files[group])
+    packed_size = sum(member.compress_size for member in found_files[group])
+    install_size = packed_size
+    install_bytes = sum(member.file_size for member in found_files[group]
+                        if group.extracted(member.filename))
     install_size += install_bytes
     total_install_size += install_bytes
 
     ReportPerfResult(chartjson, apk_basename + '_Breakdown',
-                     group.name + ' size', apk_size, 'bytes')
+                     group.name + ' size', packed_size, 'bytes')
     ReportPerfResult(chartjson, apk_basename + '_InstallBreakdown',
                      group.name + ' size', install_size, 'bytes')
+    ReportPerfResult(chartjson, apk_basename + '_Uncompressed',
+                     group.name + ' size', uncompressed_size, 'bytes')
 
   transfer_size = _CalculateCompressedSize(apk_filename)
   ReportPerfResult(chartjson, apk_basename + '_InstallSize',
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 6da9a33c..194c494 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -48,8 +48,11 @@
   "//third_party/netty4:netty_all",
   "//third_party/netty-tcnative:netty-tcnative",
   "//third_party/robolectric:android-all-4.3_r2-robolectric-0",
+  "//third_party/robolectric:android-all-5.0.0_r2-robolectric-1",
   "//third_party/robolectric:json-20080701",
   "//third_party/robolectric:tagsoup-1.2",
+  "//third_party/robolectric:shadows-core-3.0",
+  "//third_party/robolectric:shadows-multidex-3.0",
 ]
 
 # Targets that match the whitelist but are not actually java targets.
diff --git a/build/config/arm.gni b/build/config/arm.gni
index cc468d8..75c5ea9d 100644
--- a/build/config/arm.gni
+++ b/build/config/arm.gni
@@ -57,6 +57,9 @@
     if (arm_float_abi == "") {
       if (current_os == "android" || target_os == "android") {
         arm_float_abi = "softfp"
+      } else if (current_os == "linux" && current_cpu != v8_current_cpu) {
+        # Default to the same as Android for V8 simulator builds.
+        arm_float_abi = "softfp"
       } else {
         arm_float_abi = "hard"
       }
diff --git a/build/config/ios/rules.gni b/build/config/ios/rules.gni
index 5fdd640..5ee83af 100644
--- a/build/config/ios/rules.gni
+++ b/build/config/ios/rules.gni
@@ -210,7 +210,6 @@
     }
 
     _link_executable = _target_name + "_executable"
-    _executable_path = "$target_out_dir/$_output_name"
 
     if (ios_enable_code_signing) {
       _link_executable_visibility = [ ":$_target_name" ]
@@ -230,8 +229,6 @@
       _link_executable_visibility = []
       _link_executable_visibility = [ ":$_lipo_executable" ]
       _link_executable = _target_name + "_arch_executable"
-
-      _arch_executable_path = "$target_out_dir/$current_cpu/$_output_name"
     }
 
     executable(_link_executable) {
@@ -253,11 +250,12 @@
 
       visibility = _link_executable_visibility
 
+      output_name = _output_name
       output_prefix_override = true
       if (_is_fat_build) {
-        output_name = rebase_path(_arch_executable_path, root_build_dir)
+        output_dir = "$target_out_dir/$current_cpu"
       } else {
-        output_name = rebase_path(_executable_path, root_build_dir)
+        output_dir = target_out_dir
       }
 
       if (!defined(libs)) {
@@ -279,10 +277,10 @@
         visibility = _lipo_executable_visibility
         script = "//build/toolchain/mac/linker_driver.py"
         outputs = [
-          _executable_path,
+          "$target_out_dir/$_output_name",
         ]
         inputs = [
-          _arch_executable_path,
+          "$target_out_dir/$current_cpu/$_output_name",
         ]
         deps = [
           ":$_link_executable",
@@ -993,7 +991,6 @@
     }
 
     _xctest_loadable_module_target = _xctest_target + "_loadable_module"
-    _xctest_loadable_module_path = "$target_out_dir/$_xctest_output"
 
     if (!ios_enable_code_signing) {
       _xctest_loadable_module_bundle =
@@ -1008,8 +1005,6 @@
       _xctest_lipo_loadable_module_target = _xctest_loadable_module_target
       _xctest_lipo_loadable_module_visibility =
           _xctest_loadable_module_visibility
-      _arch_xctest_loadable_module_path =
-          "$target_out_dir/$current_cpu/$_xctest_output"
 
       _xctest_loadable_module_visibility = []
       _xctest_loadable_module_visibility =
@@ -1025,12 +1020,12 @@
       configs += [ "//build/config/ios:xctest_config" ]
 
       if (_is_fat_build) {
-        output_name =
-            rebase_path(_arch_xctest_loadable_module_path, root_out_dir)
+        output_dir = "$target_out_dir/$current_cpu"
       } else {
-        output_name = rebase_path(_xctest_loadable_module_path, root_out_dir)
+        output_dir = target_out_dir
       }
 
+      output_name = _xctest_output
       output_prefix_override = true
       output_extension = ""
     }
@@ -1040,10 +1035,10 @@
         visibility = _xctest_lipo_loadable_module_visibility
         script = "//build/toolchain/mac/linker_driver.py"
         outputs = [
-          _xctest_loadable_module_path,
+          "$target_out_dir/$_xctest_output",
         ]
         inputs = [
-          _arch_xctest_loadable_module_path,
+          "$target_out_dir/$current_cpu/$_xctest_output",
         ]
         deps = [
           ":$_xctest_loadable_module_target",
diff --git a/build/toolchain/mac/BUILD.gn b/build/toolchain/mac/BUILD.gn
index c330f644..5ccda9a 100644
--- a/build/toolchain/mac/BUILD.gn
+++ b/build/toolchain/mac/BUILD.gn
@@ -92,7 +92,7 @@
         "TOOL_VERSION=${tool_versions.linker_driver} " +
         rebase_path("//build/toolchain/mac/linker_driver.py", root_build_dir)
 
-    if (is_ios && additional_toolchains != []) {
+    if (invoker.toolchain_os == "ios" && additional_toolchains != []) {
       # For a fat build, the generation of dSYM needs to be performed after the
       # generation of the fat binaries using "lipo". So disable the generation
       # of the dSYM for intermediate architecture specific binaries.
@@ -114,7 +114,7 @@
 
     # If dSYMs are enabled, this flag will be added to the link tools.
     if (_enable_dsyms) {
-      dsym_switch = " -Wcrl,dsym," + rebase_path(root_out_dir) + " "
+      dsym_switch = " -Wcrl,dsym,{{root_out_dir}} "
       _dsym_output =
           "{{root_out_dir}}/{{target_output_name}}{{output_extension}}.dSYM/"
     } else {
diff --git a/cc/DEPS b/cc/DEPS
index 3518958e..1a32581c 100644
--- a/cc/DEPS
+++ b/cc/DEPS
@@ -5,6 +5,7 @@
   "+gpu/command_buffer/client/gles2_interface_stub.h", # for tests
   "+gpu/command_buffer/client/gpu_memory_buffer_manager.h",
   "+gpu/command_buffer/common/capabilities.h",
+  "+gpu/command_buffer/common/gles2_cmd_format.h",
   "+gpu/command_buffer/common/gpu_memory_allocation.h",
   "+gpu/command_buffer/common/mailbox.h",
   "+gpu/command_buffer/common/mailbox_holder.h",
diff --git a/cc/ipc/BUILD.gn b/cc/ipc/BUILD.gn
index 46895f17..9a161e2 100644
--- a/cc/ipc/BUILD.gn
+++ b/cc/ipc/BUILD.gn
@@ -30,6 +30,7 @@
     "//ui/events/ipc",
     "//ui/gfx",
     "//ui/gfx/ipc",
+    "//ui/gfx/ipc/color",
     "//ui/gfx/ipc/geometry",
     "//ui/gfx/ipc/skia",
   ]
diff --git a/cc/ipc/cc_ipc.gyp b/cc/ipc/cc_ipc.gyp
index e26f565..414259b 100644
--- a/cc/ipc/cc_ipc.gyp
+++ b/cc/ipc/cc_ipc.gyp
@@ -22,6 +22,7 @@
         '../../ui/gfx/gfx.gyp:gfx',
         '../../ui/gfx/gfx.gyp:gfx_geometry',
         '../../ui/gfx/ipc/gfx_ipc.gyp:gfx_ipc',
+        '../../ui/gfx/ipc/color/gfx_ipc_color.gyp:gfx_ipc_color',
         '../../ui/gfx/ipc/geometry/gfx_ipc_geometry.gyp:gfx_ipc_geometry',
         '../../ui/gfx/ipc/skia/gfx_ipc_skia.gyp:gfx_ipc_skia',
       ],
diff --git a/cc/ipc/cc_param_traits_macros.h b/cc/ipc/cc_param_traits_macros.h
index 655ea26..ee34ec6 100644
--- a/cc/ipc/cc_param_traits_macros.h
+++ b/cc/ipc/cc_param_traits_macros.h
@@ -25,6 +25,7 @@
 #include "cc/surfaces/surface_id.h"
 #include "cc/surfaces/surface_sequence.h"
 #include "ui/events/ipc/latency_info_param_traits.h"
+#include "ui/gfx/ipc/color/gfx_param_traits.h"
 #include "ui/gfx/ipc/gfx_param_traits.h"
 #include "ui/gfx/ipc/skia/gfx_skia_param_traits.h"
 
@@ -148,6 +149,7 @@
   IPC_STRUCT_TRAITS_MEMBER(read_lock_fences_enabled)
   IPC_STRUCT_TRAITS_MEMBER(is_software)
   IPC_STRUCT_TRAITS_MEMBER(is_overlay_candidate)
+  IPC_STRUCT_TRAITS_MEMBER(color_space)
 IPC_STRUCT_TRAITS_END()
 
 IPC_STRUCT_TRAITS_BEGIN(cc::ReturnedResource)
diff --git a/cc/output/direct_renderer.h b/cc/output/direct_renderer.h
index d0687cd..d10962a 100644
--- a/cc/output/direct_renderer.h
+++ b/cc/output/direct_renderer.h
@@ -14,7 +14,6 @@
 #include "cc/output/overlay_processor.h"
 #include "cc/output/renderer.h"
 #include "cc/quads/tile_draw_quad.h"
-#include "cc/raster/task_graph_runner.h"
 #include "cc/resources/resource_provider.h"
 #include "cc/resources/scoped_resource.h"
 #include "gpu/command_buffer/common/texture_in_use_response.h"
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index a5f7159..de3a2a4 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -20,6 +20,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "cc/base/container_util.h"
@@ -41,10 +42,12 @@
 #include "cc/quads/stream_video_draw_quad.h"
 #include "cc/quads/texture_draw_quad.h"
 #include "cc/raster/scoped_gpu_raster.h"
+#include "cc/resources/resource_pool.h"
 #include "cc/resources/scoped_resource.h"
 #include "gpu/GLES2/gl2extchromium.h"
 #include "gpu/command_buffer/client/context_support.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
+#include "gpu/command_buffer/common/gles2_cmd_format.h"
 #include "gpu/command_buffer/common/gpu_memory_allocation.h"
 #include "skia/ext/texture_handle.h"
 #include "third_party/skia/include/core/SkBitmap.h"
@@ -3638,13 +3641,35 @@
 
 void GLRenderer::ScheduleCALayers(DrawingFrame* frame) {
   scoped_refptr<CALayerOverlaySharedState> shared_state;
+  size_t copied_render_pass_count = 0;
   for (const CALayerOverlay& ca_layer_overlay : frame->ca_layer_overlay_list) {
+    if (!overlay_resource_pool_) {
+      overlay_resource_pool_ = ResourcePool::CreateForGpuMemoryBufferResources(
+          resource_provider_, base::ThreadTaskRunnerHandle::Get().get());
+    }
+
+    ResourceId contents_resource_id = ca_layer_overlay.contents_resource_id;
+    Resource* resource = nullptr;
+    // Some CALayers require a final round of processing.
+    if (ca_layer_overlay.render_pass_id.IsValid()) {
+      CopyRenderPassToOverlayResource(ca_layer_overlay.render_pass_id,
+                                      &resource);
+      contents_resource_id = resource->id();
+      ++copied_render_pass_count;
+    }
+
     unsigned texture_id = 0;
-    if (ca_layer_overlay.contents_resource_id) {
+    if (contents_resource_id) {
       pending_overlay_resources_.push_back(
           base::WrapUnique(new ResourceProvider::ScopedReadLockGL(
-              resource_provider_, ca_layer_overlay.contents_resource_id)));
+              resource_provider_, contents_resource_id)));
       texture_id = pending_overlay_resources_.back()->texture_id();
+
+      if (resource) {
+        // Once a resource is released, it is marked as "busy". It will be
+        // available for reuse after the ScopedReadLockGL is destroyed.
+        overlay_resource_pool_->ReleaseResource(resource);
+      }
     }
     GLfloat contents_rect[4] = {
         ca_layer_overlay.contents_rect.x(), ca_layer_overlay.contents_rect.y(),
@@ -3673,10 +3698,37 @@
           ca_layer_overlay.shared_state->opacity, is_clipped, clip_rect,
           sorting_context_id, transform);
     }
+    if (!ca_layer_overlay.filter_effects.empty()) {
+      std::vector<GLCALayerFilterEffect> effects;
+      effects.resize(ca_layer_overlay.filter_effects.size());
+      for (size_t i = 0; i < ca_layer_overlay.filter_effects.size(); ++i) {
+        const ui::CARendererLayerParams::FilterEffect& filter_effect =
+            ca_layer_overlay.filter_effects[i];
+        GLCALayerFilterEffect& effect = effects[i];
+        effect.type = static_cast<GLint>(filter_effect.type);
+        effect.amount = filter_effect.amount;
+        effect.drop_shadow_offset_x = filter_effect.drop_shadow_offset.x();
+        effect.drop_shadow_offset_y = filter_effect.drop_shadow_offset.y();
+
+        static_assert(sizeof(GLuint) == sizeof(SkColor),
+                      "GLuint and SkColor must have the same size.");
+        effect.drop_shadow_color =
+            static_cast<GLuint>(filter_effect.drop_shadow_color);
+      }
+
+      gl_->ScheduleCALayerFilterEffectsCHROMIUM(effects.size(), effects.data());
+    }
     gl_->ScheduleCALayerCHROMIUM(
         texture_id, contents_rect, ca_layer_overlay.background_color,
         ca_layer_overlay.edge_aa_mask, bounds_rect, filter);
   }
+
+  // Take the number of copied render passes in this frame, and use 3 times that
+  // amount as the cache limit.
+  if (overlay_resource_pool_) {
+    overlay_resource_pool_->SetResourceUsageLimits(
+        std::numeric_limits<std::size_t>::max(), copied_render_pass_count * 3);
+  }
 }
 
 void GLRenderer::ScheduleOverlays(DrawingFrame* frame) {
@@ -3702,4 +3754,34 @@
   }
 }
 
+void GLRenderer::CopyRenderPassToOverlayResource(
+    const RenderPassId& render_pass_id,
+    Resource** resource) {
+  ScopedResource* contents_texture =
+      render_pass_textures_[render_pass_id].get();
+  DCHECK(contents_texture);
+  DCHECK(contents_texture->id());
+  // TODO(erikchen): Fix this to allow the creation of IOSurfaces.
+  // https://crbug.com/581526.
+  *resource = overlay_resource_pool_->AcquireResource(
+      contents_texture->size(), ResourceFormat::RGBA_8888);
+  ResourceProvider::ScopedWriteLockGL destination(resource_provider_,
+                                                  (*resource)->id(), false);
+
+  GLuint source_texture = 0;
+  std::unique_ptr<ResourceProvider::ScopedReadLockGL> source;
+  if (current_framebuffer_lock_ &&
+      current_framebuffer_lock_->texture_id() == contents_texture->id()) {
+    source_texture = current_framebuffer_lock_->texture_id();
+  } else {
+    source.reset(new ResourceProvider::ScopedReadLockGL(
+        resource_provider_, contents_texture->id()));
+    source_texture = source->texture_id();
+  }
+  gl_->CopySubTextureCHROMIUM(source_texture, destination.texture_id(), 0, 0, 0,
+                              0, contents_texture->size().width(),
+                              contents_texture->size().height(), GL_TRUE,
+                              GL_FALSE, GL_FALSE);
+}
+
 }  // namespace cc
diff --git a/cc/output/gl_renderer.h b/cc/output/gl_renderer.h
index 30c22736..008161b 100644
--- a/cc/output/gl_renderer.h
+++ b/cc/output/gl_renderer.h
@@ -35,6 +35,7 @@
 class GLRendererShaderTest;
 class OutputSurface;
 class PictureDrawQuad;
+class ResourcePool;
 class ScopedResource;
 class StreamVideoDrawQuad;
 class TextureDrawQuad;
@@ -263,6 +264,11 @@
   void ScheduleCALayers(DrawingFrame* frame);
   void ScheduleOverlays(DrawingFrame* frame);
 
+  // Copies the contents of the render pass to an overlay resource, returned in
+  // |resource|. The resource is allocated from |overlay_resource_pool_|.
+  void CopyRenderPassToOverlayResource(const RenderPassId& render_pass_id,
+                                       Resource** resource);
+
   using OverlayResourceLock =
       std::unique_ptr<ResourceProvider::ScopedReadLockGL>;
   using OverlayResourceLockList = std::vector<OverlayResourceLock>;
@@ -521,6 +527,10 @@
   bool use_blend_equation_advanced_;
   bool use_blend_equation_advanced_coherent_;
 
+  // Some overlays require that content is copied from a render pass into an
+  // overlay resource. This means the GLRenderer needs its own ResourcePool.
+  std::unique_ptr<ResourcePool> overlay_resource_pool_;
+
   BoundGeometry bound_geometry_;
   DISALLOW_COPY_AND_ASSIGN(GLRenderer);
 };
diff --git a/cc/output/output_surface.h b/cc/output/output_surface.h
index a3f5d0ce..3e8e9ee 100644
--- a/cc/output/output_surface.h
+++ b/cc/output/output_surface.h
@@ -20,8 +20,6 @@
 #include "cc/resources/returned_resource.h"
 #include "gpu/command_buffer/common/texture_in_use_response.h"
 
-namespace base { class SingleThreadTaskRunner; }
-
 namespace ui {
 class LatencyInfo;
 }
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
index ebf5cce..fc033752 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -1474,6 +1474,7 @@
                                            it->mailbox_holder.texture_target));
       resource->read_lock_fences_enabled = it->read_lock_fences_enabled;
       resource->is_overlay_candidate = it->is_overlay_candidate;
+      resource->color_space = it->color_space;
     }
     resource->child_id = child;
     // Don't allocate a texture for a child.
@@ -1600,6 +1601,7 @@
   resource->size = source->size;
   resource->read_lock_fences_enabled = source->read_lock_fences_enabled;
   resource->is_overlay_candidate = source->is_overlay_candidate;
+  resource->color_space = source->color_space;
 
   if (source->type == RESOURCE_TYPE_BITMAP) {
     resource->mailbox_holder.mailbox = source->shared_bitmap_id;
diff --git a/cc/resources/resource_provider.h b/cc/resources/resource_provider.h
index 4f38ca9..70f34c1 100644
--- a/cc/resources/resource_provider.h
+++ b/cc/resources/resource_provider.h
@@ -37,6 +37,7 @@
 #include "third_party/khronos/GLES2/gl2.h"
 #include "third_party/khronos/GLES2/gl2ext.h"
 #include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/gfx/color_space.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 
@@ -587,6 +588,7 @@
     SharedBitmapId shared_bitmap_id;
     SharedBitmap* shared_bitmap;
     std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer;
+    gfx::ColorSpace color_space;
 
    private:
     SynchronizationState synchronization_state_ = SYNCHRONIZED;
diff --git a/cc/resources/texture_mailbox.h b/cc/resources/texture_mailbox.h
index 8dcf98ed..4f8065d 100644
--- a/cc/resources/texture_mailbox.h
+++ b/cc/resources/texture_mailbox.h
@@ -13,6 +13,7 @@
 #include "base/memory/shared_memory.h"
 #include "cc/base/cc_export.h"
 #include "gpu/command_buffer/common/mailbox_holder.h"
+#include "ui/gfx/color_space.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace cc {
@@ -62,6 +63,10 @@
   void set_nearest_neighbor(bool nearest_neighbor) {
     nearest_neighbor_ = nearest_neighbor;
   }
+  const gfx::ColorSpace& color_space() const { return color_space_; }
+  void set_color_space(const gfx::ColorSpace& color_space) {
+    color_space_ = color_space;
+  }
 
   // This is valid if allow_overlau() or IsSharedMemory() is true.
   gfx::Size size_in_pixels() const { return size_in_pixels_; }
@@ -76,6 +81,7 @@
   bool is_overlay_candidate_;
   bool secure_output_only_;
   bool nearest_neighbor_;
+  gfx::ColorSpace color_space_;
 };
 
 }  // namespace cc
diff --git a/cc/resources/transferable_resource.h b/cc/resources/transferable_resource.h
index ea63441..ec15702 100644
--- a/cc/resources/transferable_resource.h
+++ b/cc/resources/transferable_resource.h
@@ -13,6 +13,7 @@
 #include "cc/base/resource_id.h"
 #include "cc/resources/resource_format.h"
 #include "gpu/command_buffer/common/mailbox_holder.h"
+#include "ui/gfx/color_space.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace cc {
@@ -39,6 +40,7 @@
   bool read_lock_fences_enabled;
   bool is_software;
   bool is_overlay_candidate;
+  gfx::ColorSpace color_space;
 };
 
 }  // namespace cc
diff --git a/cc/surfaces/display.cc b/cc/surfaces/display.cc
index 847e58c8..e27174d 100644
--- a/cc/surfaces/display.cc
+++ b/cc/surfaces/display.cc
@@ -7,7 +7,6 @@
 #include <stddef.h>
 
 #include "base/memory/ptr_util.h"
-#include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
 #include "cc/debug/benchmark_instrumentation.h"
 #include "cc/output/compositor_frame.h"
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc
index 2dc73ee..c0735c7 100644
--- a/cc/trees/draw_property_utils.cc
+++ b/cc/trees/draw_property_utils.cc
@@ -58,6 +58,11 @@
                                       const int target_transform_id,
                                       const EffectTree& effect_tree,
                                       const TransformTree& transform_tree) {
+  if (target_effect_id == -1) {
+    // This can happen when PaintArtifactCompositor builds property trees as it
+    // doesn't set effect ids on clip nodes.
+    return;
+  }
   const TransformNode* target_transform_node =
       transform_tree.Node(target_transform_id);
   const EffectNode* target_effect_node = effect_tree.Node(target_effect_id);
@@ -100,7 +105,7 @@
                                                  target_effect_node->id,
                                                  &clip_to_target)) {
       // We don't have to apply surface contents scale when target is root.
-      if (target_node_id != 0) {
+      if (target_effect_node->id != 1) {
         PostConcatSurfaceContentsScale(target_effect_node, &clip_to_target);
 #if DCHECK_IS_ON()
         const TransformTree& transform_tree = property_trees->transform_tree;
@@ -179,7 +184,7 @@
     // If transform is not invertible, cannot apply clip.
     return ConditionalClip{false, gfx::RectF()};
   // We don't have to apply surface contents scale when target is root.
-  if (target_transform_id != 0) {
+  if (target_effect_id != 1) {
     const EffectTree& effect_tree = property_trees->effect_tree;
     const EffectNode* target_effect_node = effect_tree.Node(target_effect_id);
     PostConcatSurfaceContentsScale(target_effect_node, &current_to_target);
@@ -522,9 +527,9 @@
         layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
         continue;
       }
-      if (target_node_id != 0) {
-        const EffectNode* target_effect_node =
-            ContentsTargetEffectNode(layer->effect_tree_index(), effect_tree);
+      const EffectNode* target_effect_node =
+          ContentsTargetEffectNode(layer->effect_tree_index(), effect_tree);
+      if (target_effect_node->id != 1) {
         ConcatInverseSurfaceContentsScale(target_effect_node, &target_to_layer);
 #if DCHECK_IS_ON()
         VerifySurfaceContentsScalesMatch(target_effect_node->id, target_node_id,
@@ -735,6 +740,11 @@
 
 void PostConcatSurfaceContentsScale(const EffectNode* effect_node,
                                     gfx::Transform* transform) {
+  if (!effect_node) {
+    // This can happen when PaintArtifactCompositor builds property trees as it
+    // doesn't set effect ids on clip nodes.
+    return;
+  }
   DCHECK(effect_node->has_render_surface);
   transform->matrix().postScale(effect_node->surface_contents_scale.x(),
                                 effect_node->surface_contents_scale.y(), 1.f);
@@ -795,7 +805,7 @@
           parent_target_transform_node->id, clip_node->target_effect_id,
           &parent_to_current);
       // We don't have to apply surface contents scale when target is root.
-      if (clip_node->target_transform_id != 0) {
+      if (clip_node->target_effect_id != 1) {
         const EffectNode* target_effect_node =
             effect_tree.Node(clip_node->target_effect_id);
         PostConcatSurfaceContentsScale(target_effect_node, &parent_to_current);
@@ -805,7 +815,7 @@
                                          effect_tree, transform_tree);
 #endif
       }
-      if (parent_clip_node->target_transform_id != 0) {
+      if (parent_clip_node->target_effect_id != 1) {
         const EffectNode* parent_target_effect_node =
             effect_tree.Node(parent_clip_node->target_effect_id);
         ConcatInverseSurfaceContentsScale(parent_target_effect_node,
@@ -878,7 +888,7 @@
         success = property_trees->ComputeTransformToTarget(
             transform_node->id, clip_node->target_effect_id, &source_to_target);
         // We don't have to apply surface contents scale when target is root.
-        if (clip_node->target_transform_id != 0) {
+        if (clip_node->target_effect_id != 1) {
           const EffectNode* target_effect_node =
               effect_tree.Node(clip_node->target_effect_id);
           PostConcatSurfaceContentsScale(target_effect_node, &source_to_target);
@@ -1039,7 +1049,7 @@
   property_trees->ComputeTransformToTarget(source_id, target_effect_node->id,
                                            &draw_transform);
   // We don't have to apply surface contents scale when target is root.
-  if (destination_id != 0) {
+  if (target_effect_node->id != 1) {
     PostConcatSurfaceContentsScale(target_effect_node, &draw_transform);
 #if DCHECK_IS_ON()
     VerifySurfaceContentsScalesMatch(layer->effect_tree_index(), destination_id,
@@ -1234,17 +1244,17 @@
   }
 
   gfx::Transform render_surface_transform;
-  const TransformNode* target_transform_node =
-      transform_tree.Node(transform_tree.TargetId(transform_node->id));
   const EffectNode* target_effect_node =
       effect_tree.Node(effect_node->target_id);
   property_trees->ComputeTransformToTarget(
       transform_node->id, target_effect_node->id, &render_surface_transform);
   // We don't have to apply surface contents scale when target is root.
-  if (target_transform_node->id != 0) {
+  if (effect_node->target_id != 1) {
     PostConcatSurfaceContentsScale(target_effect_node,
                                    &render_surface_transform);
 #if DCHECK_IS_ON()
+    const TransformNode* target_transform_node =
+        transform_tree.Node(transform_tree.TargetId(transform_node->id));
     VerifySurfaceContentsScalesMatch(effect_node->target_id,
                                      target_transform_node->id, effect_tree,
                                      transform_tree);
@@ -1303,7 +1313,7 @@
   }
 
   // We don't have to apply surface contents scale when target is root.
-  if (transform_tree.TargetId(transform_node->id) != 0) {
+  if (render_surface->EffectTreeIndex() != 1) {
     const EffectNode* effect_node =
         effect_tree.Node(render_surface->EffectTreeIndex());
     PostConcatSurfaceContentsScale(effect_node, &clip_parent_target_to_target);
@@ -1394,7 +1404,7 @@
   const EffectTree& effect_tree = property_trees->effect_tree;
   const EffectNode* surface_effect_node =
       effect_tree.Node(render_surface->EffectTreeIndex());
-  if (render_surface->TransformTreeIndex() != 0) {
+  if (render_surface->EffectTreeIndex() != 1) {
     replica_to_surface.Scale(surface_effect_node->surface_contents_scale.x(),
                              surface_effect_node->surface_contents_scale.y());
 #if DCHECK_IS_ON()
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc
index 33b7094a..e6bec2b 100644
--- a/cc/trees/layer_tree_host_common_unittest.cc
+++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -129,14 +129,15 @@
 
     gfx::Transform identity;
 
-    SetLayerPropertiesForTesting(root, identity, gfx::Point3F(), gfx::PointF(),
-                                 gfx::Size(500, 500), true, false, true);
-    SetLayerPropertiesForTesting(target, identity, gfx::Point3F(),
-                                 gfx::PointF(target_rect.origin()),
-                                 target_rect.size(), true, false, true);
-    SetLayerPropertiesForTesting(drawing_layer, layer_transform, gfx::Point3F(),
-                                 gfx::PointF(layer_rect.origin()),
-                                 layer_rect.size(), true, false, false);
+    root->SetBounds(gfx::Size(500, 500));
+    root->test_properties()->force_render_surface = true;
+    target->SetPosition(gfx::PointF(target_rect.origin()));
+    target->SetBounds(target_rect.size());
+    target->test_properties()->force_render_surface = true;
+    drawing_layer->SetTransform(layer_transform);
+    drawing_layer->SetPosition(gfx::PointF(layer_rect.origin()));
+    drawing_layer->SetBounds(layer_rect.size());
+    drawing_layer->test_properties()->should_flatten_transform = false;
 
     host_impl()->active_tree()->property_trees()->needs_rebuild = true;
     ExecuteCalculateDrawProperties(root);
@@ -156,12 +157,7 @@
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
 
   gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(), true, false);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(), true, false);
+  parent->SetBounds(gfx::Size(100, 100));
 
   ExecuteCalculateDrawProperties(parent);
 
@@ -182,11 +178,9 @@
   child->SetDrawsContent(true);
 
   gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(10, 10), gfx::Size(100, 100), true,
-                               false);
+  parent->SetBounds(gfx::Size(100, 100));
+  child->SetPosition(gfx::PointF(10, 10));
+  child->SetBounds(gfx::Size(100, 100));
   child->test_properties()->opacity = 0.f;
   ExecuteCalculateDrawProperties(parent);
   EffectTree& effect_tree =
@@ -203,20 +197,16 @@
   LayerImpl* root = root_layer_for_testing();
   LayerImpl* layer = AddChild<LayerImpl>(root);
 
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(1, 2), true, false);
-
   TransformTree& transform_tree =
       host_impl()->active_tree()->property_trees()->transform_tree;
   EffectTree& effect_tree =
       host_impl()->active_tree()->property_trees()->effect_tree;
 
-  // Case 2: Setting the bounds of the layer should not affect either the draw
+  root->SetBounds(gfx::Size(1, 2));
+
+  // Case 1: Setting the bounds of the layer should not affect either the draw
   // transform or the screenspace transform.
-  gfx::Transform translation_to_center;
-  translation_to_center.Translate(5.0, 6.0);
-  SetLayerPropertiesForTesting(layer, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 12), true, false);
+  layer->SetBounds(gfx::Size(10, 12));
   ExecuteCalculateDrawProperties(root);
   EXPECT_TRANSFORMATION_MATRIX_EQ(
       identity_matrix,
@@ -225,11 +215,10 @@
       identity_matrix,
       draw_property_utils::ScreenSpaceTransform(layer, transform_tree));
 
-  // Case 3: The anchor point by itself (without a layer transform) should have
+  // Case 2: The anchor point by itself (without a layer transform) should have
   // no effect on the transforms.
-  SetLayerPropertiesForTesting(layer, identity_matrix,
-                               gfx::Point3F(2.5f, 3.0f, 0.f), gfx::PointF(),
-                               gfx::Size(10, 12), true, false);
+  layer->test_properties()->transform_origin = gfx::Point3F(2.5f, 3.0f, 0.f);
+  layer->SetBounds(gfx::Size(10, 12));
   host_impl()->active_tree()->property_trees()->needs_rebuild = true;
   ExecuteCalculateDrawProperties(root);
   EXPECT_TRANSFORMATION_MATRIX_EQ(
@@ -239,13 +228,11 @@
       identity_matrix,
       draw_property_utils::ScreenSpaceTransform(layer, transform_tree));
 
-  // Case 4: A change in actual position affects both the draw transform and
+  // Case 3: A change in actual position affects both the draw transform and
   // screen space transform.
   gfx::Transform position_transform;
   position_transform.Translate(0.f, 1.2f);
-  SetLayerPropertiesForTesting(
-      layer, identity_matrix, gfx::Point3F(2.5f, 3.0f, 0.f),
-      gfx::PointF(0.f, 1.2f), gfx::Size(10, 12), true, false);
+  layer->SetPosition(gfx::PointF(0.f, 1.2f));
   host_impl()->active_tree()->property_trees()->needs_rebuild = true;
   ExecuteCalculateDrawProperties(root);
   EXPECT_TRANSFORMATION_MATRIX_EQ(
@@ -255,13 +242,14 @@
       position_transform,
       draw_property_utils::ScreenSpaceTransform(layer, transform_tree));
 
-  // Case 5: In the correct sequence of transforms, the layer transform should
-  // pre-multiply the translation_to_center. This is easily tested by using a
+  // Case 4: In the correct sequence of transforms, the layer transform should
+  // pre-multiply the translation-to-center. This is easily tested by using a
   // scale transform, because scale and translation are not commutative.
   gfx::Transform layer_transform;
   layer_transform.Scale3d(2.0, 2.0, 1.0);
-  SetLayerPropertiesForTesting(layer, layer_transform, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 12), true, false);
+  layer->SetTransform(layer_transform);
+  layer->test_properties()->transform_origin = gfx::Point3F();
+  layer->SetPosition(gfx::PointF());
   host_impl()->active_tree()->property_trees()->needs_rebuild = true;
   ExecuteCalculateDrawProperties(root);
   EXPECT_TRANSFORMATION_MATRIX_EQ(
@@ -271,14 +259,12 @@
       layer_transform,
       draw_property_utils::ScreenSpaceTransform(layer, transform_tree));
 
-  // Case 6: The layer transform should occur with respect to the anchor point.
+  // Case 5: The layer transform should occur with respect to the anchor point.
   gfx::Transform translation_to_anchor;
   translation_to_anchor.Translate(5.0, 0.0);
   gfx::Transform expected_result =
       translation_to_anchor * layer_transform * Inverse(translation_to_anchor);
-  SetLayerPropertiesForTesting(layer, layer_transform,
-                               gfx::Point3F(5.0f, 0.f, 0.f), gfx::PointF(),
-                               gfx::Size(10, 12), true, false);
+  layer->test_properties()->transform_origin = gfx::Point3F(5.f, 0.f, 0.f);
   host_impl()->active_tree()->property_trees()->needs_rebuild = true;
   ExecuteCalculateDrawProperties(root);
   EXPECT_TRANSFORMATION_MATRIX_EQ(
@@ -288,14 +274,12 @@
       expected_result,
       draw_property_utils::ScreenSpaceTransform(layer, transform_tree));
 
-  // Case 7: Verify that position pre-multiplies the layer transform.  The
+  // Case 6: Verify that position pre-multiplies the layer transform.  The
   // current implementation of CalculateDrawProperties does this implicitly, but
   // it is still worth testing to detect accidental regressions.
   expected_result = position_transform * translation_to_anchor *
                     layer_transform * Inverse(translation_to_anchor);
-  SetLayerPropertiesForTesting(
-      layer, layer_transform, gfx::Point3F(5.0f, 0.f, 0.f),
-      gfx::PointF(0.f, 1.2f), gfx::Size(10, 12), true, false);
+  layer->SetPosition(gfx::PointF(0.f, 1.2f));
   host_impl()->active_tree()->property_trees()->needs_rebuild = true;
   ExecuteCalculateDrawProperties(root);
   EXPECT_TRANSFORMATION_MATRIX_EQ(
@@ -326,16 +310,12 @@
       LayerImpl::Create(host_impl.active_tree(), 1));
   LayerImpl* sublayer = sublayer_scoped_ptr.get();
   sublayer->SetDrawsContent(true);
-  SetLayerPropertiesForTesting(sublayer, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(500, 500), true, false,
-                               false);
+  sublayer->SetBounds(gfx::Size(500, 500));
 
   std::unique_ptr<LayerImpl> scroll_layer_scoped_ptr(
       LayerImpl::Create(host_impl.active_tree(), 2));
   LayerImpl* scroll_layer = scroll_layer_scoped_ptr.get();
-  SetLayerPropertiesForTesting(scroll_layer, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 20), true, false,
-                               false);
+  scroll_layer->SetBounds(gfx::Size(10, 20));
   std::unique_ptr<LayerImpl> clip_layer_scoped_ptr(
       LayerImpl::Create(host_impl.active_tree(), 4));
   LayerImpl* clip_layer = clip_layer_scoped_ptr.get();
@@ -357,9 +337,7 @@
 
   std::unique_ptr<LayerImpl> root(
       LayerImpl::Create(host_impl.active_tree(), 3));
-  SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(3, 4), true, false,
-                               false);
+  root->SetBounds(gfx::Size(3, 4));
   root->test_properties()->AddChild(std::move(clip_layer_scoped_ptr));
   root->SetHasRenderSurface(true);
   LayerImpl* root_layer = root.get();
@@ -384,9 +362,7 @@
   const float kTranslateX = 10.6f;
   const float kTranslateY = 20.6f;
   arbitrary_translate.Translate(kTranslateX, kTranslateY);
-  SetLayerPropertiesForTesting(scroll_layer, arbitrary_translate,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(10, 20),
-                               true, false, false);
+  scroll_layer->SetTransform(arbitrary_translate);
   root_layer->layer_tree_impl()->property_trees()->needs_rebuild = true;
   ExecuteCalculateDrawProperties(root_layer, kDeviceScale, page_scale,
                                  scroll_layer->test_properties()->parent);
@@ -435,8 +411,7 @@
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
 
   // One-time setup of root layer
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(1, 2), true, false);
+  root->SetBounds(gfx::Size(1, 2));
 
   TransformTree& transform_tree =
       host_impl()->active_tree()->property_trees()->transform_tree;
@@ -444,13 +419,10 @@
       host_impl()->active_tree()->property_trees()->effect_tree;
 
   // Case 1: parent's anchor point should not affect child or grand_child.
-  SetLayerPropertiesForTesting(parent, identity_matrix,
-                               gfx::Point3F(2.5f, 3.0f, 0.f), gfx::PointF(),
-                               gfx::Size(10, 12), true, false);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(16, 18), true, false);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(76, 78), true, false);
+  parent->test_properties()->transform_origin = gfx::Point3F(2.5f, 3.0f, 0.f);
+  parent->SetBounds(gfx::Size(10, 12));
+  child->SetBounds(gfx::Size(16, 18));
+  grand_child->SetBounds(gfx::Size(76, 78));
   ExecuteCalculateDrawProperties(root);
 
   EXPECT_TRANSFORMATION_MATRIX_EQ(
@@ -469,13 +441,7 @@
   // Case 2: parent's position affects child and grand_child.
   gfx::Transform parent_position_transform;
   parent_position_transform.Translate(0.f, 1.2f);
-  SetLayerPropertiesForTesting(
-      parent, identity_matrix, gfx::Point3F(2.5f, 3.0f, 0.f),
-      gfx::PointF(0.f, 1.2f), gfx::Size(10, 12), true, false);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(16, 18), true, false);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(76, 78), true, false);
+  parent->SetPosition(gfx::PointF(0.f, 1.2f));
   host_impl()->active_tree()->property_trees()->needs_rebuild = true;
   ExecuteCalculateDrawProperties(root);
   EXPECT_TRANSFORMATION_MATRIX_EQ(
@@ -499,13 +465,8 @@
   gfx::Transform parent_composite_transform =
       parent_translation_to_anchor * parent_layer_transform *
       Inverse(parent_translation_to_anchor);
-  SetLayerPropertiesForTesting(parent, parent_layer_transform,
-                               gfx::Point3F(2.5f, 3.0f, 0.f), gfx::PointF(),
-                               gfx::Size(10, 12), true, false);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(16, 18), true, false);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(76, 78), true, false);
+  parent->SetTransform(parent_layer_transform);
+  parent->SetPosition(gfx::PointF());
   host_impl()->active_tree()->property_trees()->needs_rebuild = true;
   ExecuteCalculateDrawProperties(root);
   EXPECT_TRANSFORMATION_MATRIX_EQ(
@@ -528,16 +489,6 @@
   LayerImpl* parent = AddChildToRoot<LayerImpl>();
   LayerImpl* child = AddChild<LayerImpl>(parent);
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
-  grand_child->SetDrawsContent(true);
-
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(1, 2), true, false,
-                               true);
-
-  // Child is set up so that a new render surface should be created.
-  child->test_properties()->opacity = 0.5f;
-  child->SetDrawsContent(true);
 
   gfx::Transform parent_layer_transform;
   parent_layer_transform.Scale3d(1.f, 0.9f, 1.f);
@@ -556,15 +507,14 @@
   gfx::Transform surface_sublayer_composite_transform =
       parent_composite_transform * Inverse(surface_sublayer_transform);
 
-  SetLayerPropertiesForTesting(parent, parent_layer_transform,
-                               gfx::Point3F(25.0f, 30.0f, 0.f), gfx::PointF(),
-                               gfx::Size(100, 120), true, false, false);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(16, 18), true, false,
-                               true);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(8, 10), true, false,
-                               false);
+  root->SetBounds(gfx::Size(1, 2));
+  parent->SetTransform(parent_layer_transform);
+  parent->test_properties()->transform_origin = gfx::Point3F(2.5f, 30.f, 0.f);
+  parent->SetBounds(gfx::Size(100, 120));
+  child->SetBounds(gfx::Size(16, 18));
+  child->test_properties()->force_render_surface = true;
+  grand_child->SetBounds(gfx::Size(8, 10));
+  grand_child->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root);
 
   // Render surface should have been created now.
@@ -596,12 +546,6 @@
   LayerImpl* parent = AddChildToRoot<LayerImpl>();
   LayerImpl* child = AddChild<LayerImpl>(parent);
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
-  grand_child->SetDrawsContent(true);
-
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
 
   gfx::Transform parent_transform;
   parent_transform.Translate(10.0, 10.0);
@@ -609,16 +553,15 @@
   gfx::Transform child_transform;
   child_transform.Rotate(45.0);
 
-  // child gets a render surface when surfaces are enabled.
-  SetLayerPropertiesForTesting(parent, parent_transform, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
-  SetLayerPropertiesForTesting(child, child_transform, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               true);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(2.0, 2.0), gfx::Size(20, 20), true,
-                               false, false);
+  root->SetBounds(gfx::Size(100, 100));
+  parent->SetTransform(parent_transform);
+  parent->SetBounds(gfx::Size(10, 10));
+  child->SetTransform(child_transform);
+  child->SetBounds(gfx::Size(10, 10));
+  child->test_properties()->force_render_surface = true;
+  grand_child->SetPosition(gfx::PointF(2.f, 2.f));
+  grand_child->SetBounds(gfx::Size(20, 20));
+  grand_child->SetDrawsContent(true);
 
   gfx::Transform expected_grand_child_screen_space_transform;
   expected_grand_child_screen_space_transform.Translate(10.0, 10.0);
@@ -651,19 +594,9 @@
   LayerImpl* parent = AddChildToRoot<LayerImpl>();
   LayerImpl* child = AddChild<LayerImpl>(parent);
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
-  grand_child->SetDrawsContent(true);
   std::unique_ptr<LayerImpl> child_replica =
       LayerImpl::Create(host_impl()->active_tree(), 100);
 
-  // One-time setup of root layer
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(1, 2), true, false,
-                               true);
-
-  // Child is set up so that a new render surface should be created.
-  child->test_properties()->opacity = 0.5f;
-
   gfx::Transform parent_layer_transform;
   parent_layer_transform.Scale3d(2.0, 2.0, 1.0);
   gfx::Transform parent_translation_to_anchor;
@@ -682,22 +615,17 @@
   gfx::Transform replica_composite_transform =
       parent_composite_transform * replica_layer_transform *
       Inverse(surface_sublayer_transform);
-  child_replica->SetDrawsContent(true);
-  // Child's render surface should not exist yet.
-  ASSERT_FALSE(child->render_surface());
 
-  SetLayerPropertiesForTesting(parent, parent_layer_transform,
-                               gfx::Point3F(2.5f, 3.0f, 0.f), gfx::PointF(),
-                               gfx::Size(10, 12), true, false, false);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(16, 18), true, false,
-                               true);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(-0.5f, -0.5f), gfx::Size(1, 1), true,
-                               false, false);
-  SetLayerPropertiesForTesting(child_replica.get(), replica_layer_transform,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(), true,
-                               false, false);
+  root->SetBounds(gfx::Size(1, 2));
+  parent->test_properties()->transform_origin = gfx::Point3F(2.5f, 3.0f, 0.f);
+  parent->SetTransform(parent_layer_transform);
+  parent->SetBounds(gfx::Size(10, 12));
+  child->SetBounds(gfx::Size(16, 18));
+  child->test_properties()->force_render_surface = true;
+  grand_child->SetPosition(gfx::PointF(-0.5f, -0.5f));
+  grand_child->SetBounds(gfx::Size(1, 1));
+
+  child_replica->SetTransform(replica_layer_transform);
   child->test_properties()->SetReplicaLayer(std::move(child_replica));
 
   ExecuteCalculateDrawProperties(root);
@@ -758,12 +686,6 @@
   render_surface1->test_properties()->opacity = 0.5f;
   render_surface2->test_properties()->opacity = 0.33f;
 
-  // One-time setup of root layer
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(1, 2), true, false,
-                               true);
-
   // All layers in the tree are initialized with an anchor at .25 and a size of
   // (10,10).  matrix "A" is the composite layer transform used in all layers,
   // Matrix "R" is the composite replica transform used in all replica layers.
@@ -803,39 +725,50 @@
   // the owning layer
   gfx::Transform S2 = Inverse(surface2_sublayer_transform);
 
-  SetLayerPropertiesForTesting(parent, layer_transform,
-                               gfx::Point3F(2.5f, 0.f, 0.f), gfx::PointF(),
-                               gfx::Size(10, 10), true, false, false);
-  SetLayerPropertiesForTesting(render_surface1, layer_transform,
-                               gfx::Point3F(2.5f, 0.f, 0.f), gfx::PointF(),
-                               gfx::Size(10, 10), true, false, true);
-  SetLayerPropertiesForTesting(render_surface2, layer_transform,
-                               gfx::Point3F(2.5f, 0.f, 0.f), gfx::PointF(),
-                               gfx::Size(10, 10), true, false, true);
-  SetLayerPropertiesForTesting(child_of_root, layer_transform,
-                               gfx::Point3F(2.5f, 0.f, 0.f), gfx::PointF(),
-                               gfx::Size(10, 10), true, false, false);
-  SetLayerPropertiesForTesting(child_of_rs1, layer_transform,
-                               gfx::Point3F(2.5f, 0.f, 0.f), gfx::PointF(),
-                               gfx::Size(10, 10), true, false, false);
-  SetLayerPropertiesForTesting(child_of_rs2, layer_transform,
-                               gfx::Point3F(2.5f, 0.f, 0.f), gfx::PointF(),
-                               gfx::Size(10, 10), true, false, false);
-  SetLayerPropertiesForTesting(grand_child_of_root, layer_transform,
-                               gfx::Point3F(2.5f, 0.f, 0.f), gfx::PointF(),
-                               gfx::Size(10, 10), true, false, false);
-  SetLayerPropertiesForTesting(grand_child_of_rs1, layer_transform,
-                               gfx::Point3F(2.5f, 0.f, 0.f), gfx::PointF(),
-                               gfx::Size(10, 10), true, false, false);
-  SetLayerPropertiesForTesting(grand_child_of_rs2, layer_transform,
-                               gfx::Point3F(2.5f, 0.f, 0.f), gfx::PointF(),
-                               gfx::Size(10, 10), true, false, false);
-  SetLayerPropertiesForTesting(replica_of_rs1.get(), replica_layer_transform,
-                               gfx::Point3F(2.5f, 0.f, 0.f), gfx::PointF(),
-                               gfx::Size(), true, false, false);
-  SetLayerPropertiesForTesting(replica_of_rs2.get(), replica_layer_transform,
-                               gfx::Point3F(2.5f, 0.f, 0.f), gfx::PointF(),
-                               gfx::Size(), true, false, false);
+  root->SetBounds(gfx::Size(1, 2));
+  parent->test_properties()->transform_origin = gfx::Point3F(2.5f, 0.f, 0.f);
+  parent->SetTransform(layer_transform);
+  parent->SetBounds(gfx::Size(10, 10));
+  render_surface1->test_properties()->transform_origin =
+      gfx::Point3F(2.5f, 0.f, 0.f);
+  render_surface1->SetTransform(layer_transform);
+  render_surface1->SetBounds(gfx::Size(10, 10));
+  render_surface1->test_properties()->force_render_surface = true;
+  render_surface2->test_properties()->transform_origin =
+      gfx::Point3F(2.5f, 0.f, 0.f);
+  render_surface2->SetTransform(layer_transform);
+  render_surface2->SetBounds(gfx::Size(10, 10));
+  render_surface2->test_properties()->force_render_surface = true;
+  child_of_root->test_properties()->transform_origin =
+      gfx::Point3F(2.5f, 0.f, 0.f);
+  child_of_root->SetTransform(layer_transform);
+  child_of_root->SetBounds(gfx::Size(10, 10));
+  child_of_rs1->test_properties()->transform_origin =
+      gfx::Point3F(2.5f, 0.f, 0.f);
+  child_of_rs1->SetTransform(layer_transform);
+  child_of_rs1->SetBounds(gfx::Size(10, 10));
+  child_of_rs2->test_properties()->transform_origin =
+      gfx::Point3F(2.5f, 0.f, 0.f);
+  child_of_rs2->SetTransform(layer_transform);
+  child_of_rs2->SetBounds(gfx::Size(10, 10));
+  grand_child_of_root->test_properties()->transform_origin =
+      gfx::Point3F(2.5f, 0.f, 0.f);
+  grand_child_of_root->SetTransform(layer_transform);
+  grand_child_of_root->SetBounds(gfx::Size(10, 10));
+  grand_child_of_rs1->test_properties()->transform_origin =
+      gfx::Point3F(2.5f, 0.f, 0.f);
+  grand_child_of_rs1->SetTransform(layer_transform);
+  grand_child_of_rs1->SetBounds(gfx::Size(10, 10));
+  grand_child_of_rs2->test_properties()->transform_origin =
+      gfx::Point3F(2.5f, 0.f, 0.f);
+  grand_child_of_rs2->SetTransform(layer_transform);
+  grand_child_of_rs2->SetBounds(gfx::Size(10, 10));
+  replica_of_rs1->test_properties()->transform_origin =
+      gfx::Point3F(2.5f, 0.f, 0.f);
+  replica_of_rs1->SetTransform(replica_layer_transform);
+  replica_of_rs2->test_properties()->transform_origin =
+      gfx::Point3F(2.5f, 0.f, 0.f);
+  replica_of_rs2->SetTransform(replica_layer_transform);
 
   // We need to set parent on replica layers for property tree building.
   replica_of_rs1->test_properties()->parent = render_surface1;
@@ -981,19 +914,13 @@
   gfx::Transform rotation_about_y_axis;
   rotation_about_y_axis.RotateAboutYAxis(30.0);
 
-  const gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, rotation_about_y_axis, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               true);
-  SetLayerPropertiesForTesting(grand_child, rotation_about_y_axis,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(10, 10),
-                               true, false, false);
-  SetLayerPropertiesForTesting(great_grand_child, identity_matrix,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(10, 10),
-                               true, false, false);
+  root->SetBounds(gfx::Size(100, 100));
+  child->SetTransform(rotation_about_y_axis);
+  child->SetBounds(gfx::Size(10, 10));
+  child->test_properties()->force_render_surface = true;
+  grand_child->SetTransform(rotation_about_y_axis);
+  grand_child->SetBounds(gfx::Size(10, 10));
+  great_grand_child->SetBounds(gfx::Size(10, 10));
 
   // No layers in this test should preserve 3d.
   ASSERT_TRUE(root->test_properties()->should_flatten_transform);
@@ -1023,7 +950,7 @@
   EXPECT_TRANSFORMATION_MATRIX_EQ(
       expected_child_screen_space_transform,
       child->render_surface()->screen_space_transform());
-  EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, child->DrawTransform());
+  EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), child->DrawTransform());
   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_screen_space_transform,
                                   child->ScreenSpaceTransform());
   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_draw_transform,
@@ -1049,20 +976,13 @@
   gfx::Transform grand_child_transform;
   grand_child_transform.RotateAboutYAxis(90.0);
 
-  const gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(200, 200), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, child_transform, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
-  SetLayerPropertiesForTesting(grand_child, grand_child_transform,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, false, false);
-
+  root->SetBounds(gfx::Size(200, 200));
+  child->SetTransform(child_transform);
+  child->SetBounds(gfx::Size(10, 10));
+  grand_child->SetTransform(grand_child_transform);
+  grand_child->SetBounds(gfx::Size(100, 100));
   grand_child->test_properties()->should_flatten_transform = false;
   grand_child->SetDrawsContent(true);
-
   ExecuteCalculateDrawProperties(root);
 
   // Mapping grand_child's bounds to target space produces a non-empty rect
@@ -1087,27 +1007,20 @@
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
   grand_child->SetDrawsContent(true);
 
+  root->SetBounds(gfx::Size(100, 100));
   // The child height is zero, but has non-zero width that should be accounted
   // for while computing draw transforms.
-  const gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 0), true, false,
-                               true);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
-
+  child->SetBounds(gfx::Size(10, 0));
+  child->test_properties()->force_render_surface = true;
+  grand_child->SetBounds(gfx::Size(10, 10));
   ExecuteCalculateDrawProperties(root);
 
   ASSERT_TRUE(child->has_render_surface());
   // This is the real test, the rest are sanity checks.
-  EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
+  EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(),
                                   child->render_surface()->draw_transform());
-  EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, child->DrawTransform());
-  EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
+  EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), child->DrawTransform());
+  EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(),
                                   grand_child->DrawTransform());
 }
 
@@ -1118,19 +1031,17 @@
   LayerImpl* child = AddChild<LayerImpl>(render_surface);
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
 
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
   gfx::Transform translate;
   translate.Translate3d(5, 5, 5);
-  SetLayerPropertiesForTesting(render_surface, translate, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, translate, gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, false, false);
-  SetLayerPropertiesForTesting(grand_child, translate, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
+
+  root->SetBounds(gfx::Size(100, 100));
+  render_surface->SetTransform(translate);
+  render_surface->SetBounds(gfx::Size(100, 100));
+  render_surface->test_properties()->force_render_surface = true;
+  child->SetTransform(translate);
+  child->SetBounds(gfx::Size(100, 100));
+  grand_child->SetTransform(translate);
+  grand_child->SetBounds(gfx::Size(100, 100));
   grand_child->SetDrawsContent(true);
 
   // render_surface will have a sublayer scale because of device scale factor.
@@ -1154,18 +1065,13 @@
   // to child layers instead of applied to the root RenderSurface.
   const gfx::Transform identity_matrix;
   LayerImpl* root = root_layer_for_testing();
-  root->SetDrawsContent(true);
   LayerImpl* child = AddChild<LayerImpl>(root);
+
+  root->SetDrawsContent(true);
+  root->SetBounds(gfx::Size(20, 20));
   child->SetDrawsContent(true);
-
   child->SetScrollClipLayer(root->id());
-
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(20, 20), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(20, 20), true, false,
-                               false);
+  child->SetBounds(gfx::Size(20, 20));
 
   gfx::Transform translate;
   translate.Translate(50, 50);
@@ -1298,116 +1204,99 @@
 
 TEST_F(LayerTreeHostCommonTest,
        RenderSurfaceListForRenderSurfaceWithClippedLayer) {
-  LayerImpl* parent = root_layer_for_testing();
-  parent->SetMasksToBounds(true);
+  LayerImpl* root = root_layer_for_testing();
   LayerImpl* render_surface1 = AddChildToRoot<LayerImpl>();
   LayerImpl* child = AddChild<LayerImpl>(render_surface1);
+
+  root->SetBounds(gfx::Size(10, 10));
+  root->SetMasksToBounds(true);
+  render_surface1->SetBounds(gfx::Size(10, 10));
+  render_surface1->test_properties()->force_render_surface = true;
   child->SetDrawsContent(true);
+  child->SetPosition(gfx::PointF(30.f, 30.f));
+  child->SetBounds(gfx::Size(10, 10));
+  ExecuteCalculateDrawProperties(root);
 
-  const gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               true);
-  SetLayerPropertiesForTesting(render_surface1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(30.f, 30.f), gfx::Size(10, 10), true,
-                               false, false);
-
-  ExecuteCalculateDrawProperties(parent);
-
-  // The child layer's content is entirely outside the parent's clip rect, so
+  // The child layer's content is entirely outside the root's clip rect, so
   // the intermediate render surface should not be listed here, even if it was
   // forced to be created. Render surfaces without children or visible content
   // are unexpected at draw time (e.g. we might try to create a content texture
   // of size 0).
-  ASSERT_TRUE(parent->render_surface());
+  ASSERT_TRUE(root->render_surface());
   EXPECT_EQ(1U, render_surface_layer_list_impl()->size());
 }
 
 TEST_F(LayerTreeHostCommonTest, RenderSurfaceListForTransparentChild) {
-  LayerImpl* parent = root_layer_for_testing();
-  LayerImpl* render_surface1 = AddChild<LayerImpl>(parent);
+  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* render_surface1 = AddChild<LayerImpl>(root);
   LayerImpl* child = AddChild<LayerImpl>(render_surface1);
-  child->SetDrawsContent(true);
 
-  const gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(render_surface1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
+  render_surface1->SetBounds(gfx::Size(10, 10));
+  render_surface1->test_properties()->force_render_surface = true;
   render_surface1->test_properties()->opacity = 0.f;
+  child->SetBounds(gfx::Size(10, 10));
+  child->SetDrawsContent(true);
 
   LayerImplList render_surface_layer_list;
   LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
-      parent, parent->bounds(), &render_surface_layer_list);
+      root, root->bounds(), &render_surface_layer_list);
   inputs.can_adjust_raster_scales = true;
   LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs);
 
   // Since the layer is transparent, render_surface1->render_surface() should
   // not have gotten added anywhere.  Also, the drawable content rect should not
   // have been extended by the children.
-  ASSERT_TRUE(parent->render_surface());
-  EXPECT_EQ(0U, parent->render_surface()->layer_list().size());
+  ASSERT_TRUE(root->render_surface());
+  EXPECT_EQ(0U, root->render_surface()->layer_list().size());
   EXPECT_EQ(1U, render_surface_layer_list.size());
-  EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
-  EXPECT_EQ(gfx::Rect(), parent->drawable_content_rect());
+  EXPECT_EQ(root->id(), render_surface_layer_list.at(0)->id());
+  EXPECT_EQ(gfx::Rect(), root->drawable_content_rect());
 }
 
 TEST_F(LayerTreeHostCommonTest,
        RenderSurfaceListForTransparentChildWithBackgroundFilter) {
-  LayerImpl* parent = root_layer_for_testing();
-  LayerImpl* render_surface1 = AddChild<LayerImpl>(parent);
+  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* render_surface1 = AddChild<LayerImpl>(root);
   LayerImpl* child = AddChild<LayerImpl>(render_surface1);
-  child->SetDrawsContent(true);
 
-  const gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               true);
-  SetLayerPropertiesForTesting(render_surface1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
+  root->SetBounds(gfx::Size(10, 10));
+  render_surface1->SetBounds(gfx::Size(10, 10));
+  render_surface1->test_properties()->force_render_surface = true;
   render_surface1->test_properties()->opacity = 0.f;
   render_surface1->SetDrawsContent(true);
-  child->SetDrawsContent(true);
   FilterOperations filters;
   filters.Append(FilterOperation::CreateBlurFilter(1.5f));
   render_surface1->test_properties()->background_filters = filters;
+  child->SetBounds(gfx::Size(10, 10));
+  child->SetDrawsContent(true);
 
   {
     LayerImplList render_surface_layer_list;
     LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
-        parent, parent->bounds(), &render_surface_layer_list);
+        root, root->bounds(), &render_surface_layer_list);
     inputs.can_adjust_raster_scales = true;
     LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs);
     EXPECT_EQ(2U, render_surface_layer_list.size());
   }
   // The layer is fully transparent, but has a background filter, so it
   // shouldn't be skipped and should be drawn.
-  ASSERT_TRUE(parent->render_surface());
-  EXPECT_EQ(1U, parent->render_surface()->layer_list().size());
+  ASSERT_TRUE(root->render_surface());
+  EXPECT_EQ(1U, root->render_surface()->layer_list().size());
   EXPECT_EQ(gfx::RectF(0, 0, 10, 10),
-            parent->render_surface()->DrawableContentRect());
+            root->render_surface()->DrawableContentRect());
   EffectTree& effect_tree =
-      parent->layer_tree_impl()->property_trees()->effect_tree;
+      root->layer_tree_impl()->property_trees()->effect_tree;
   EffectNode* node = effect_tree.Node(render_surface1->effect_tree_index());
   EXPECT_TRUE(node->is_drawn);
 
-  // When parent is transparent, the layer should not be drawn.
-  parent->OnOpacityAnimated(0.f);
+  // When root is transparent, the layer should not be drawn.
+  root->OnOpacityAnimated(0.f);
   render_surface1->OnOpacityAnimated(1.f);
   render_surface1->set_visible_layer_rect(gfx::Rect());
   {
     LayerImplList render_surface_layer_list;
     LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
-        parent, parent->bounds(), &render_surface_layer_list);
+        root, root->bounds(), &render_surface_layer_list);
     inputs.can_adjust_raster_scales = true;
     LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs);
   }
@@ -1422,26 +1311,23 @@
   LayerImpl* parent = AddChild<LayerImpl>(root);
   LayerImpl* child1 = AddChild<LayerImpl>(parent);
   LayerImpl* child2 = AddChild<LayerImpl>(parent);
-  child1->SetDrawsContent(true);
-  child2->SetDrawsContent(true);
 
-  const gfx::Transform identity_matrix;
   gfx::Transform scale_matrix;
   scale_matrix.Scale(2.0f, 2.0f);
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(parent, scale_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(), true, false, true);
-  SetLayerPropertiesForTesting(child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(0, 0), gfx::Size(25, 25), true,
-                               false, true);
-  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(25, 25), gfx::Size(25, 25), true,
-                               false, true);
+
+  root->SetBounds(gfx::Size(100, 100));
+  parent->SetTransform(scale_matrix);
   FilterOperations filters;
   filters.Append(FilterOperation::CreateBlurFilter(10.0f));
   parent->test_properties()->filters = filters;
+  parent->test_properties()->force_render_surface = true;
+  child1->SetBounds(gfx::Size(25, 25));
+  child1->SetDrawsContent(true);
+  child1->test_properties()->force_render_surface = true;
+  child2->SetPosition(gfx::PointF(25, 25));
+  child2->SetBounds(gfx::Size(25, 25));
+  child2->SetDrawsContent(true);
+  child2->test_properties()->force_render_surface = true;
 
   LayerImplList render_surface_layer_list;
   LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
@@ -1463,20 +1349,15 @@
 TEST_F(LayerTreeHostCommonTest, DrawableContentRectForReferenceFilter) {
   LayerImpl* root = root_layer_for_testing();
   LayerImpl* child = AddChild<LayerImpl>(root);
+
+  root->SetBounds(gfx::Size(100, 100));
+  child->SetBounds(gfx::Size(25, 25));
   child->SetDrawsContent(true);
-
-  SetLayerPropertiesForTesting(root, gfx::Transform(), gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, gfx::Transform(), gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(25, 25), true, false,
-                               true);
-
+  child->test_properties()->force_render_surface = true;
   FilterOperations filters;
   filters.Append(FilterOperation::CreateReferenceFilter(
       SkOffsetImageFilter::Make(50, 50, nullptr)));
   child->test_properties()->filters = filters;
-
   ExecuteCalculateDrawProperties(root);
 
   // The render surface's size should be unaffected by the offset image filter;
@@ -1492,14 +1373,11 @@
 
   LayerImpl* root = root_layer_for_testing();
   LayerImpl* child = AddChild<LayerImpl>(root);
-  child->SetDrawsContent(true);
 
-  SetLayerPropertiesForTesting(root, gfx::Transform(), gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, gfx::Transform(), gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(25, 25), true, false,
-                               true);
+  root->SetBounds(gfx::Size(100, 100));
+  child->SetBounds(gfx::Size(25, 25));
+  child->SetDrawsContent(true);
+  child->test_properties()->force_render_surface = true;
 
   FilterOperations filters;
   filters.Append(FilterOperation::CreateReferenceFilter(
@@ -1518,23 +1396,16 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, RenderSurfaceForBlendMode) {
-  LayerImpl* parent = root_layer_for_testing();
-  LayerImpl* child = AddChild<LayerImpl>(parent);
+  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* child = AddChild<LayerImpl>(root);
+
+  root->SetBounds(gfx::Size(10, 10));
+  child->SetBounds(gfx::Size(10, 10));
   child->SetDrawsContent(true);
-
-  const gfx::Transform identity_matrix;
-  const SkXfermode::Mode blend_mode = SkXfermode::kMultiply_Mode;
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               true);
-
-  child->SetBlendMode(blend_mode);
+  child->SetBlendMode(SkXfermode::kMultiply_Mode);
   child->test_properties()->opacity = 0.5f;
-
-  ExecuteCalculateDrawProperties(parent);
+  child->test_properties()->force_render_surface = true;
+  ExecuteCalculateDrawProperties(root);
 
   // Since the child layer has a blend mode other than normal, it should get
   // its own render surface. Also, layer's draw_properties should contain the
@@ -1552,26 +1423,17 @@
   LayerImpl* not_surface = AddChild<LayerImpl>(surface1);
   LayerImpl* surface2 = AddChild<LayerImpl>(not_surface);
 
-  const gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               true);
-  SetLayerPropertiesForTesting(surface1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               true);
-  SetLayerPropertiesForTesting(not_surface, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
-  SetLayerPropertiesForTesting(surface2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               true);
+  root->SetBounds(gfx::Size(10, 10));
+  surface1->SetBounds(gfx::Size(10, 10));
   surface1->SetDrawsContent(true);
-  surface2->SetDrawsContent(true);
-
   surface1->test_properties()->opacity = 0.5f;
+  surface1->test_properties()->force_render_surface = true;
+  not_surface->SetBounds(gfx::Size(10, 10));
   not_surface->test_properties()->opacity = 0.5f;
+  surface2->SetBounds(gfx::Size(10, 10));
+  surface2->SetDrawsContent(true);
   surface2->test_properties()->opacity = 0.5f;
-
+  surface2->test_properties()->force_render_surface = true;
   ExecuteCalculateDrawProperties(root);
 
   ASSERT_TRUE(surface1->render_surface());
@@ -1597,42 +1459,25 @@
   LayerImpl* leaf_node1 = AddChild<LayerImpl>(grand_child);
   LayerImpl* leaf_node2 = AddChild<LayerImpl>(child2);
 
+  root->SetBounds(gfx::Size(100, 100));
   root->SetDrawsContent(true);
+  parent->SetBounds(gfx::Size(100, 100));
   parent->SetDrawsContent(true);
+  child1->SetBounds(gfx::Size(100, 100));
   child1->SetDrawsContent(true);
-  child2->SetDrawsContent(true);
-  grand_child->SetDrawsContent(true);
-  leaf_node1->SetDrawsContent(true);
-  leaf_node2->SetDrawsContent(true);
-
-  const gfx::Transform identity_matrix;
-
-  // child1 and grand_child get render surfaces when surfaces are enabled.
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
-  SetLayerPropertiesForTesting(child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(leaf_node1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
-  SetLayerPropertiesForTesting(leaf_node2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
-
   child1->test_properties()->opacity = 0.5f;
+  child1->test_properties()->force_render_surface = true;
+  child2->SetBounds(gfx::Size(100, 100));
+  child2->SetDrawsContent(true);
+  grand_child->SetBounds(gfx::Size(100, 100));
+  grand_child->SetDrawsContent(true);
   grand_child->test_properties()->opacity = 0.5f;
+  grand_child->test_properties()->force_render_surface = true;
+  leaf_node1->SetBounds(gfx::Size(100, 100));
+  leaf_node1->SetDrawsContent(true);
   leaf_node1->test_properties()->opacity = 0.5f;
+  leaf_node2->SetBounds(gfx::Size(100, 100));
+  leaf_node2->SetDrawsContent(true);
   leaf_node2->test_properties()->opacity = 0.5f;
 
   // With surfaces enabled, each layer's draw opacity is the product of layer
@@ -1661,34 +1506,29 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, ForceRenderSurface) {
-  LayerImpl* parent = root_layer_for_testing();
+  LayerImpl* root = root_layer_for_testing();
   LayerImpl* render_surface1 = AddChildToRoot<LayerImpl>();
   LayerImpl* child = AddChild<LayerImpl>(render_surface1);
 
-  const gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false);
-  SetLayerPropertiesForTesting(render_surface1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false);
-
-  child->SetDrawsContent(true);
+  root->SetBounds(gfx::Size(10, 10));
+  render_surface1->SetBounds(gfx::Size(10, 10));
   render_surface1->test_properties()->force_render_surface = true;
+  child->SetBounds(gfx::Size(10, 10));
+  child->SetDrawsContent(true);
 
   {
-    ExecuteCalculateDrawPropertiesWithPropertyTrees(parent);
+    ExecuteCalculateDrawPropertiesWithPropertyTrees(root);
 
     // The root layer always creates a render surface
-    EXPECT_TRUE(parent->has_render_surface());
+    EXPECT_TRUE(root->has_render_surface());
     EXPECT_TRUE(render_surface1->has_render_surface());
   }
 
   {
     render_surface1->test_properties()->force_render_surface = false;
     render_surface1->layer_tree_impl()->property_trees()->needs_rebuild = true;
-    ExecuteCalculateDrawPropertiesWithPropertyTrees(parent);
-    EXPECT_TRUE(parent->has_render_surface());
+    ExecuteCalculateDrawPropertiesWithPropertyTrees(root);
+    EXPECT_TRUE(root->has_render_surface());
     EXPECT_FALSE(render_surface1->has_render_surface());
   }
 }
@@ -1696,58 +1536,38 @@
 TEST_F(LayerTreeHostCommonTest, RenderSurfacesFlattenScreenSpaceTransform) {
   // Render surfaces act as a flattening point for their subtree, so should
   // always flatten the target-to-screen space transform seen by descendants.
-
   LayerImpl* root = root_layer_for_testing();
   LayerImpl* parent = AddChild<LayerImpl>(root);
   LayerImpl* child = AddChild<LayerImpl>(parent);
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
 
-  child->SetDrawsContent(true);
-  grand_child->SetDrawsContent(true);
-
   gfx::Transform rotation_about_y_axis;
   rotation_about_y_axis.RotateAboutYAxis(30.0);
-  // Make |parent| have a render surface.
-  parent->test_properties()->opacity = 0.9f;
 
-  const gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(parent, rotation_about_y_axis, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
-
+  root->SetBounds(gfx::Size(100, 100));
+  parent->SetTransform(rotation_about_y_axis);
+  parent->SetBounds(gfx::Size(10, 10));
+  parent->test_properties()->force_render_surface = true;
+  child->SetBounds(gfx::Size(10, 10));
+  child->SetDrawsContent(true);
+  grand_child->SetBounds(gfx::Size(10, 10));
+  grand_child->SetDrawsContent(true);
   grand_child->test_properties()->should_flatten_transform = false;
-
-  // Only grand_child should preserve 3d.
-  EXPECT_TRUE(root->test_properties()->should_flatten_transform);
-  EXPECT_TRUE(parent->test_properties()->should_flatten_transform);
-  EXPECT_TRUE(child->test_properties()->should_flatten_transform);
-  EXPECT_FALSE(grand_child->test_properties()->should_flatten_transform);
-
-  gfx::Transform flattened_rotation_about_y = rotation_about_y_axis;
-  flattened_rotation_about_y.FlattenTo2d();
-
   ExecuteCalculateDrawProperties(root);
 
   EXPECT_TRUE(parent->render_surface());
   EXPECT_FALSE(child->render_surface());
   EXPECT_FALSE(grand_child->render_surface());
 
-  EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, child->DrawTransform());
-  EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
+  EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), child->DrawTransform());
+  EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(),
                                   grand_child->DrawTransform());
 
   // The screen-space transform inherited by |child| and |grand_child| should
   // have been flattened at their render target. In particular, the fact that
   // |grand_child| happens to preserve 3d shouldn't affect this flattening.
+  gfx::Transform flattened_rotation_about_y = rotation_about_y_axis;
+  flattened_rotation_about_y.FlattenTo2d();
   EXPECT_TRANSFORMATION_MATRIX_EQ(flattened_rotation_about_y,
                                   child->ScreenSpaceTransform());
   EXPECT_TRANSFORMATION_MATRIX_EQ(flattened_rotation_about_y,
@@ -1762,7 +1582,7 @@
   //  - all layers except the leaf_nodes are forced to be a new render surface
   //  that have something to draw.
   //  - parent is a large container layer.
-  //  - child has masksToBounds=true to cause clipping.
+  //  - child has MasksToBounds=true to cause clipping.
   //  - grand_child is positioned outside of the child's bounds
   //  - great_grand_child is also kept outside child's bounds.
   //
@@ -1770,49 +1590,32 @@
   // outside the clip rect, and they should never get scheduled on the list of
   // render surfaces.
 
-  LayerImpl* parent = root_layer_for_testing();
+  LayerImpl* root = root_layer_for_testing();
   LayerImpl* child = AddChildToRoot<LayerImpl>();
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
   LayerImpl* great_grand_child = AddChild<LayerImpl>(grand_child);
 
-  // leaf_node1 ensures that parent and child are kept on the
+  // leaf_node1 ensures that root and child are kept on the
   // render_surface_layer_list, even though grand_child and great_grand_child
   // should be clipped.
   LayerImpl* leaf_node1 = AddChild<LayerImpl>(child);
-  leaf_node1->SetDrawsContent(true);
   LayerImpl* leaf_node2 = AddChild<LayerImpl>(great_grand_child);
-  leaf_node2->SetDrawsContent(true);
 
-  const gfx::Transform identity_matrix;
-
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(500, 500), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(20, 20), true, false,
-                               true);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(45.f, 45.f), gfx::Size(10, 10), true,
-                               false, false);
-  SetLayerPropertiesForTesting(great_grand_child, identity_matrix,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(10, 10),
-                               true, false, false);
-  SetLayerPropertiesForTesting(leaf_node1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(500, 500), true, false,
-                               false);
-  SetLayerPropertiesForTesting(leaf_node2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(20, 20), true, false,
-                               false);
-
+  root->SetBounds(gfx::Size(500, 500));
+  child->SetBounds(gfx::Size(20, 20));
   child->SetMasksToBounds(true);
-  child->test_properties()->opacity = 0.4f;
-  grand_child->test_properties()->opacity = 0.5f;
-  great_grand_child->test_properties()->opacity = 0.4f;
-
-  ExecuteCalculateDrawProperties(parent);
+  child->test_properties()->force_render_surface = true;
+  grand_child->SetPosition(gfx::PointF(45.f, 45.f));
+  grand_child->SetBounds(gfx::Size(10, 10));
+  great_grand_child->SetBounds(gfx::Size(10, 10));
+  leaf_node1->SetBounds(gfx::Size(500, 500));
+  leaf_node1->SetDrawsContent(true);
+  leaf_node1->SetBounds(gfx::Size(20, 20));
+  leaf_node2->SetDrawsContent(true);
+  ExecuteCalculateDrawProperties(root);
 
   ASSERT_EQ(2U, render_surface_layer_list_impl()->size());
-  EXPECT_EQ(parent->id(), render_surface_layer_list_impl()->at(0)->id());
+  EXPECT_EQ(root->id(), render_surface_layer_list_impl()->at(0)->id());
   EXPECT_EQ(child->id(), render_surface_layer_list_impl()->at(1)->id());
 }
 
@@ -1821,47 +1624,38 @@
   // of the surface.
 
   // The test tree is set up as follows:
-  //  - parent is a container layer that masksToBounds=true to cause clipping.
+  //  - root is a container layer that masksToBounds=true to cause clipping.
   //  - child is a render surface, which has a clip rect set to the bounds of
-  //  the parent.
+  //  the root.
   //  - grand_child is a render surface, and the only visible content in child.
-  //  It is positioned outside of the clip rect from parent.
+  //  It is positioned outside of the clip rect from root.
 
   // In this configuration, grand_child should be outside the clipped
   // content rect of the child, making grand_child not appear in the
   // render_surface_layer_list.
 
-  LayerImpl* parent = root_layer_for_testing();
+  LayerImpl* root = root_layer_for_testing();
   LayerImpl* child = AddChildToRoot<LayerImpl>();
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
   LayerImpl* leaf_node = AddChild<LayerImpl>(grand_child);
-  leaf_node->SetDrawsContent(true);
 
   const gfx::Transform identity_matrix;
 
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(20, 20), true, false,
-                               true);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(200.f, 200.f), gfx::Size(10, 10),
-                               true, false, true);
-  SetLayerPropertiesForTesting(leaf_node, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
-
-  parent->SetMasksToBounds(true);
-  child->test_properties()->opacity = 0.4f;
-  grand_child->test_properties()->opacity = 0.4f;
-
-  ExecuteCalculateDrawProperties(parent);
+  root->SetMasksToBounds(true);
+  root->SetBounds(gfx::Size(100, 100));
+  child->SetBounds(gfx::Size(20, 20));
+  child->test_properties()->force_render_surface = true;
+  grand_child->SetPosition(gfx::PointF(200.f, 200.f));
+  grand_child->SetBounds(gfx::Size(10, 10));
+  grand_child->test_properties()->force_render_surface = true;
+  leaf_node->SetBounds(gfx::Size(10, 10));
+  leaf_node->SetDrawsContent(true);
+  ExecuteCalculateDrawProperties(root);
 
   // We should cull child and grand_child from the
   // render_surface_layer_list.
   ASSERT_EQ(1U, render_surface_layer_list_impl()->size());
-  EXPECT_EQ(parent->id(), render_surface_layer_list_impl()->at(0)->id());
+  EXPECT_EQ(root->id(), render_surface_layer_list_impl()->at(0)->id());
 }
 
 TEST_F(LayerTreeHostCommonTest, IsClippedIsSetCorrectlyLayerImpl) {
@@ -1881,39 +1675,26 @@
   const gfx::Transform identity_matrix;
   LayerImpl* root = root_layer_for_testing();
   LayerImpl* parent = AddChild<LayerImpl>(root);
-  parent->SetDrawsContent(true);
   LayerImpl* child1 = AddChild<LayerImpl>(parent);
-  child1->SetDrawsContent(true);
   LayerImpl* child2 = AddChild<LayerImpl>(parent);
-  child2->SetDrawsContent(true);
   LayerImpl* grand_child = AddChild<LayerImpl>(child1);
-  grand_child->SetDrawsContent(true);
   LayerImpl* leaf_node1 = AddChild<LayerImpl>(grand_child);
-  leaf_node1->SetDrawsContent(true);
   LayerImpl* leaf_node2 = AddChild<LayerImpl>(child2);
-  leaf_node2->SetDrawsContent(true);
 
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
-  SetLayerPropertiesForTesting(child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
-  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
-  SetLayerPropertiesForTesting(leaf_node1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
-  SetLayerPropertiesForTesting(leaf_node2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
+  root->SetBounds(gfx::Size(100, 100));
+  parent->SetBounds(gfx::Size(100, 100));
+  parent->SetDrawsContent(true);
+  child1->SetBounds(gfx::Size(100, 100));
+  child1->SetDrawsContent(true);
+  child2->SetBounds(gfx::Size(100, 100));
+  child2->SetDrawsContent(true);
+  child2->test_properties()->force_render_surface = true;
+  grand_child->SetBounds(gfx::Size(100, 100));
+  grand_child->SetDrawsContent(true);
+  leaf_node1->SetBounds(gfx::Size(100, 100));
+  leaf_node1->SetDrawsContent(true);
+  leaf_node2->SetBounds(gfx::Size(100, 100));
+  leaf_node2->SetDrawsContent(true);
 
   // Case 1: nothing is clipped except the root render surface.
   ExecuteCalculateDrawProperties(root);
@@ -1931,7 +1712,7 @@
   EXPECT_FALSE(leaf_node1->is_clipped());
   EXPECT_FALSE(leaf_node2->is_clipped());
 
-  // Case 2: parent masksToBounds, so the parent, child1, and child2's
+  // Case 2: parent MasksToBounds, so the parent, child1, and child2's
   // surface are clipped. But layers that contribute to child2's surface are
   // not clipped explicitly because child2's surface already accounts for
   // that clip.
@@ -1955,7 +1736,7 @@
 
   parent->SetMasksToBounds(false);
 
-  // Case 3: child2 masksToBounds. The layer and subtree are clipped, and
+  // Case 3: child2 MasksToBounds. The layer and subtree are clipped, and
   // child2's render surface is not clipped.
   child2->SetMasksToBounds(true);
   host_impl()->active_tree()->property_trees()->needs_rebuild = true;
@@ -1983,21 +1764,12 @@
   LayerImpl* parent = AddChild<LayerImpl>(root);
   LayerImpl* child = AddChild<LayerImpl>(parent);
 
+  root->SetBounds(gfx::Size(100, 100));
   root->SetDrawsContent(true);
+  parent->SetBounds(gfx::Size(100, 100));
   parent->SetDrawsContent(true);
+  child->SetBounds(gfx::Size(100, 100));
   child->SetDrawsContent(true);
-
-  const gfx::Transform identity_matrix;
-
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
   child->SetMasksToBounds(true);
 
   ExecuteCalculateDrawProperties(root);
@@ -2008,7 +1780,7 @@
   EXPECT_EQ(gfx::Rect(100, 100), child->clip_rect());
 
   parent->SetMasksToBounds(true);
-  child->SetPosition(gfx::PointF(100, 100));
+  child->SetPosition(gfx::PointF(100.f, 100.f));
   host_impl()->active_tree()->property_trees()->needs_rebuild = true;
 
   ExecuteCalculateDrawProperties(root);
@@ -2032,44 +1804,25 @@
   LayerImpl* leaf_node1 = AddChild<LayerImpl>(grand_child);
   LayerImpl* leaf_node2 = AddChild<LayerImpl>(child2);
 
+  root->SetBounds(gfx::Size(100, 100));
   root->SetDrawsContent(true);
+  parent->SetBounds(gfx::Size(100, 100));
   parent->SetDrawsContent(true);
+  child1->SetBounds(gfx::Size(100, 100));
   child1->SetDrawsContent(true);
+  child1->test_properties()->force_render_surface = true;
+  child2->SetBounds(gfx::Size(100, 100));
   child2->SetDrawsContent(true);
+  grand_child->SetBounds(gfx::Size(100, 100));
   grand_child->SetDrawsContent(true);
+  grand_child->test_properties()->force_render_surface = true;
+  leaf_node1->SetBounds(gfx::Size(100, 100));
   leaf_node1->SetDrawsContent(true);
+  leaf_node2->SetBounds(gfx::Size(100, 100));
   leaf_node2->SetDrawsContent(true);
 
-  const gfx::Transform identity_matrix;
-
-  // child1 and grand_child get render surfaces when surfaces are enabled.
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
-  SetLayerPropertiesForTesting(child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(leaf_node1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
-  SetLayerPropertiesForTesting(leaf_node2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
-
   // Case 1: Nothing is clipped. In this case, is_clipped is always false, with
   // or without surfaces.
-  root->SetHasRenderSurface(true);
-  child1->SetHasRenderSurface(true);
-  grand_child->SetHasRenderSurface(true);
   ExecuteCalculateDrawProperties(root);
   EXPECT_FALSE(root->is_clipped());
   EXPECT_FALSE(parent->is_clipped());
@@ -2092,9 +1845,6 @@
   // next render surface. Without surfaces, the entire tree is clipped.
   root->SetMasksToBounds(true);
   host_impl()->active_tree()->property_trees()->needs_rebuild = true;
-  root->SetHasRenderSurface(true);
-  child1->SetHasRenderSurface(true);
-  grand_child->SetHasRenderSurface(true);
   ExecuteCalculateDrawProperties(root);
   EXPECT_TRUE(root->is_clipped());
   EXPECT_TRUE(parent->is_clipped());
@@ -2120,9 +1870,6 @@
   // clipped.
   parent->SetMasksToBounds(true);
   host_impl()->active_tree()->property_trees()->needs_rebuild = true;
-  root->SetHasRenderSurface(true);
-  child1->SetHasRenderSurface(true);
-  grand_child->SetHasRenderSurface(true);
   ExecuteCalculateDrawProperties(root);
   EXPECT_FALSE(root->is_clipped());
   EXPECT_TRUE(parent->is_clipped());
@@ -2148,9 +1895,6 @@
   // clipped.
   child1->SetMasksToBounds(true);
   host_impl()->active_tree()->property_trees()->needs_rebuild = true;
-  root->SetHasRenderSurface(true);
-  child1->SetHasRenderSurface(true);
-  grand_child->SetHasRenderSurface(true);
   ExecuteCalculateDrawProperties(root);
   EXPECT_FALSE(root->is_clipped());
   EXPECT_FALSE(parent->is_clipped());
@@ -2176,9 +1920,6 @@
   leaf_node1->SetMasksToBounds(true);
   leaf_node2->SetMasksToBounds(true);
   host_impl()->active_tree()->property_trees()->needs_rebuild = true;
-  root->SetHasRenderSurface(true);
-  child1->SetHasRenderSurface(true);
-  grand_child->SetHasRenderSurface(true);
   ExecuteCalculateDrawProperties(root);
   EXPECT_FALSE(root->is_clipped());
   EXPECT_FALSE(parent->is_clipped());
@@ -2200,13 +1941,13 @@
 
 TEST_F(LayerTreeHostCommonTest, DrawableContentRectForLayers) {
   // Verify that layers get the appropriate DrawableContentRect when their
-  // parent masksToBounds is true.
+  // parent MasksToBounds is true.
   //
   //   grand_child1 - completely inside the region; DrawableContentRect should
   //   be the layer rect expressed in target space.
-  //   grand_child2 - partially clipped but NOT masksToBounds; the clip rect
+  //   grand_child2 - partially clipped but NOT MasksToBounds; the clip rect
   //   will be the intersection of layer bounds and the mask region.
-  //   grand_child3 - partially clipped and masksToBounds; the
+  //   grand_child3 - partially clipped and MasksToBounds; the
   //   DrawableContentRect will still be the intersection of layer bounds and
   //   the mask region.
   //   grand_child4 - outside parent's clip rect; the DrawableContentRect should
@@ -2216,39 +1957,27 @@
   LayerImpl* parent = root_layer_for_testing();
   LayerImpl* child = AddChild<LayerImpl>(parent);
   LayerImpl* grand_child1 = AddChild<LayerImpl>(child);
-  grand_child1->SetDrawsContent(true);
   LayerImpl* grand_child2 = AddChild<LayerImpl>(child);
-  grand_child2->SetDrawsContent(true);
   LayerImpl* grand_child3 = AddChild<LayerImpl>(child);
-  grand_child3->SetDrawsContent(true);
   LayerImpl* grand_child4 = AddChild<LayerImpl>(child);
-  grand_child4->SetDrawsContent(true);
 
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(500, 500), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(20, 20), true, false,
-                               true);
-  SetLayerPropertiesForTesting(grand_child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(5.f, 5.f), gfx::Size(10, 10), true,
-                               false, false);
-  SetLayerPropertiesForTesting(grand_child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(15.f, 15.f), gfx::Size(10, 10), true,
-                               false, false);
-  SetLayerPropertiesForTesting(grand_child3, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(15.f, 15.f), gfx::Size(10, 10), true,
-                               false, false);
-  SetLayerPropertiesForTesting(grand_child4, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(45.f, 45.f), gfx::Size(10, 10), true,
-                               false, false);
-
+  parent->SetBounds(gfx::Size(500, 500));
   child->SetMasksToBounds(true);
+  child->SetBounds(gfx::Size(20, 20));
+  child->test_properties()->force_render_surface = true;
+  grand_child1->SetPosition(gfx::PointF(5.f, 5.f));
+  grand_child1->SetBounds(gfx::Size(10, 10));
+  grand_child1->SetDrawsContent(true);
+  grand_child2->SetPosition(gfx::PointF(15.f, 15.f));
+  grand_child2->SetBounds(gfx::Size(10, 10));
+  grand_child2->SetDrawsContent(true);
+  grand_child3->SetPosition(gfx::PointF(15.f, 15.f));
   grand_child3->SetMasksToBounds(true);
-
-  // Force child to be a render surface.
-  child->test_properties()->opacity = 0.4f;
-
+  grand_child3->SetBounds(gfx::Size(10, 10));
+  grand_child3->SetDrawsContent(true);
+  grand_child4->SetPosition(gfx::PointF(45.f, 45.f));
+  grand_child4->SetBounds(gfx::Size(10, 10));
+  grand_child4->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(parent);
 
   EXPECT_EQ(gfx::Rect(5, 5, 10, 10), grand_child1->drawable_content_rect());
@@ -2259,73 +1988,51 @@
 
 TEST_F(LayerTreeHostCommonTest, ClipRectIsPropagatedCorrectlyToSurfaces) {
   // Verify that render surfaces (and their layers) get the appropriate
-  // clip rects when their parent masksToBounds is true.
+  // clip rects when their parent MasksToBounds is true.
   //
   // Layers that own render surfaces (at least for now) do not inherit any
   // clipping; instead the surface will enforce the clip for the entire subtree.
   // They may still have a clip rect of their own layer bounds, however, if
-  // masksToBounds was true.
+  // MasksToBounds was true.
   LayerImpl* parent = root_layer_for_testing();
   LayerImpl* child = AddChildToRoot<LayerImpl>();
   LayerImpl* grand_child1 = AddChild<LayerImpl>(child);
   LayerImpl* grand_child2 = AddChild<LayerImpl>(child);
   LayerImpl* grand_child3 = AddChild<LayerImpl>(child);
   LayerImpl* grand_child4 = AddChild<LayerImpl>(child);
-  // the leaf nodes ensure that these grand_children become render surfaces for
+  // The leaf nodes ensure that these grand_children become render surfaces for
   // this test.
   LayerImpl* leaf_node1 = AddChild<LayerImpl>(grand_child1);
-  leaf_node1->SetDrawsContent(true);
   LayerImpl* leaf_node2 = AddChild<LayerImpl>(grand_child2);
-  leaf_node2->SetDrawsContent(true);
   LayerImpl* leaf_node3 = AddChild<LayerImpl>(grand_child3);
-  leaf_node3->SetDrawsContent(true);
   LayerImpl* leaf_node4 = AddChild<LayerImpl>(grand_child4);
-  leaf_node4->SetDrawsContent(true);
 
-  const gfx::Transform identity_matrix;
-
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(500, 500), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(20, 20), true, false,
-                               true);
-  SetLayerPropertiesForTesting(grand_child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(5.f, 5.f), gfx::Size(10, 10), true,
-                               false, true);
-  SetLayerPropertiesForTesting(grand_child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(15.f, 15.f), gfx::Size(10, 10), true,
-                               false, true);
-  SetLayerPropertiesForTesting(grand_child3, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(15.f, 15.f), gfx::Size(10, 10), true,
-                               false, true);
-  SetLayerPropertiesForTesting(grand_child4, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(45.f, 45.f), gfx::Size(10, 10), true,
-                               false, true);
-  SetLayerPropertiesForTesting(leaf_node1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
-  SetLayerPropertiesForTesting(leaf_node2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
-  SetLayerPropertiesForTesting(leaf_node3, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
-  SetLayerPropertiesForTesting(leaf_node4, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
-
+  parent->SetBounds(gfx::Size(500, 500));
+  child->SetBounds(gfx::Size(20, 20));
   child->SetMasksToBounds(true);
+  child->test_properties()->force_render_surface = true;
+  grand_child1->SetPosition(gfx::PointF(5.f, 5.f));
+  grand_child1->SetBounds(gfx::Size(10, 10));
+  grand_child1->test_properties()->force_render_surface = true;
+  grand_child2->SetPosition(gfx::PointF(15.f, 15.f));
+  grand_child2->SetBounds(gfx::Size(10, 10));
+  grand_child2->test_properties()->force_render_surface = true;
+  grand_child3->SetPosition(gfx::PointF(15.f, 15.f));
+  grand_child3->SetBounds(gfx::Size(10, 10));
   grand_child3->SetMasksToBounds(true);
+  grand_child3->test_properties()->force_render_surface = true;
+  grand_child4->SetPosition(gfx::PointF(45.f, 45.f));
+  grand_child4->SetBounds(gfx::Size(10, 10));
   grand_child4->SetMasksToBounds(true);
-
-  // Force everyone to be a render surface.
-  child->test_properties()->opacity = 0.4f;
-  grand_child1->test_properties()->opacity = 0.5f;
-  grand_child2->test_properties()->opacity = 0.5f;
-  grand_child3->test_properties()->opacity = 0.5f;
-  grand_child4->test_properties()->opacity = 0.5f;
-
+  grand_child4->test_properties()->force_render_surface = true;
+  leaf_node1->SetBounds(gfx::Size(10, 10));
+  leaf_node1->SetDrawsContent(true);
+  leaf_node2->SetBounds(gfx::Size(10, 10));
+  leaf_node2->SetDrawsContent(true);
+  leaf_node3->SetBounds(gfx::Size(10, 10));
+  leaf_node3->SetDrawsContent(true);
+  leaf_node4->SetBounds(gfx::Size(10, 10));
+  leaf_node4->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(parent);
 
   ASSERT_TRUE(grand_child1->render_surface());
@@ -2333,7 +2040,7 @@
   ASSERT_TRUE(grand_child3->render_surface());
 
   // Surfaces are clipped by their parent, but un-affected by the owning layer's
-  // masksToBounds.
+  // MasksToBounds.
   EXPECT_EQ(gfx::Rect(0, 0, 20, 20),
             grand_child1->render_surface()->clip_rect());
   EXPECT_EQ(gfx::Rect(0, 0, 20, 20),
@@ -2355,6 +2062,20 @@
   LayerImpl* leaf_node1 = AddChild<LayerImpl>(grand_child);
   LayerImpl* leaf_node2 = AddChild<LayerImpl>(child2);
 
+  root->SetBounds(gfx::Size(100, 100));
+  parent->SetPosition(gfx::PointF(2.f, 2.f));
+  parent->SetBounds(gfx::Size(400, 400));
+  child1->SetPosition(gfx::PointF(4.f, 4.f));
+  child1->SetBounds(gfx::Size(800, 800));
+  child2->SetPosition(gfx::PointF(3.f, 3.f));
+  child2->SetBounds(gfx::Size(800, 800));
+  grand_child->SetPosition(gfx::PointF(8.f, 8.f));
+  grand_child->SetBounds(gfx::Size(1500, 1500));
+  leaf_node1->SetPosition(gfx::PointF(16.f, 16.f));
+  leaf_node1->SetBounds(gfx::Size(2000, 2000));
+  leaf_node2->SetPosition(gfx::PointF(9.f, 9.f));
+  leaf_node2->SetBounds(gfx::Size(2000, 2000));
+
   root->SetDrawsContent(true);
   parent->SetDrawsContent(true);
   child1->SetDrawsContent(true);
@@ -2363,36 +2084,13 @@
   leaf_node1->SetDrawsContent(true);
   leaf_node2->SetDrawsContent(true);
 
-  const gfx::Transform identity_matrix;
-
-  // child1 and grand_child get render surfaces when surfaces are enabled.
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(2.f, 2.f), gfx::Size(400, 400), true,
-                               false);
-  SetLayerPropertiesForTesting(child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(4.f, 4.f), gfx::Size(800, 800), true,
-                               false);
-  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(3.f, 3.f), gfx::Size(800, 800), true,
-                               false);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(8.f, 8.f), gfx::Size(1500, 1500),
-                               true, false);
-  SetLayerPropertiesForTesting(leaf_node1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(16.f, 16.f), gfx::Size(2000, 2000),
-                               true, false);
-  SetLayerPropertiesForTesting(leaf_node2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(9.f, 9.f), gfx::Size(2000, 2000),
-                               true, false);
+  root->test_properties()->force_render_surface = true;
+  child1->test_properties()->force_render_surface = true;
+  grand_child->test_properties()->force_render_surface = true;
 
   // Case 1: Nothing is clipped. In this case, each layer's clip rect is its
   // bounds in target space. The only thing that changes when surfaces are
   // disabled is that target space is always screen space.
-  root->test_properties()->force_render_surface = true;
-  child1->test_properties()->force_render_surface = true;
-  grand_child->test_properties()->force_render_surface = true;
   ExecuteCalculateDrawProperties(root);
   EXPECT_TRUE(root->has_render_surface());
   EXPECT_FALSE(parent->has_render_surface());
@@ -2533,38 +2231,26 @@
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
   LayerImpl* leaf_node = AddChild<LayerImpl>(grand_child);
 
+  root->SetBounds(gfx::Size(100, 100));
+  parent->SetPosition(gfx::PointF(2.f, 2.f));
+  parent->SetBounds(gfx::Size(400, 400));
+  parent->SetMasksToBounds(true);
+  child->SetPosition(gfx::PointF(4.f, 4.f));
+  child->SetBounds(gfx::Size(800, 800));
+  child->SetMasksToBounds(true);
+  child->test_properties()->force_render_surface = true;
+  grand_child->SetPosition(gfx::PointF(8.f, 8.f));
+  grand_child->SetBounds(gfx::Size(1500, 1500));
+  grand_child->test_properties()->force_render_surface = true;
+  leaf_node->SetPosition(gfx::PointF(16.f, 16.f));
+  leaf_node->SetBounds(gfx::Size(2000, 2000));
+
   root->SetDrawsContent(true);
   parent->SetDrawsContent(true);
   child->SetDrawsContent(true);
   grand_child->SetDrawsContent(true);
   leaf_node->SetDrawsContent(true);
 
-  const gfx::Transform identity_matrix;
-
-  // child and grand_child will get render surfaces if surfaces are enabled.
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(2.f, 2.f), gfx::Size(400, 400), true,
-                               false, false);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(4.f, 4.f), gfx::Size(800, 800), true,
-                               false, true);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(8.f, 8.f), gfx::Size(1500, 1500),
-                               true, false, true);
-  SetLayerPropertiesForTesting(leaf_node, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(16.f, 16.f), gfx::Size(2000, 2000),
-                               true, false, false);
-
-  parent->SetMasksToBounds(true);
-  child->SetMasksToBounds(true);
-
-  root->SetHasRenderSurface(true);
-  child->SetHasRenderSurface(true);
-  grand_child->SetHasRenderSurface(true);
-
   host_impl()->set_resourceless_software_draw_for_testing();
   ExecuteCalculateDrawPropertiesWithoutSeparateSurfaces(root);
   gfx::PointF test_point(90.f, 90.f);
@@ -2583,38 +2269,26 @@
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
   LayerImpl* leaf_node = AddChild<LayerImpl>(grand_child);
 
+  root->SetBounds(gfx::Size(100, 100));
+  parent->SetPosition(gfx::PointF(2.f, 2.f));
+  parent->SetBounds(gfx::Size(400, 400));
+  parent->SetMasksToBounds(true);
+  child->SetPosition(gfx::PointF(4.f, 4.f));
+  child->SetBounds(gfx::Size(800, 800));
+  child->SetMasksToBounds(true);
+  child->test_properties()->force_render_surface = true;
+  grand_child->SetPosition(gfx::PointF(8.f, 8.f));
+  grand_child->SetBounds(gfx::Size(1500, 1500));
+  grand_child->test_properties()->force_render_surface = true;
+  leaf_node->SetPosition(gfx::PointF(16.f, 16.f));
+  leaf_node->SetBounds(gfx::Size(2000, 2000));
+
   root->SetDrawsContent(true);
   parent->SetDrawsContent(true);
   child->SetDrawsContent(true);
   grand_child->SetDrawsContent(true);
   leaf_node->SetDrawsContent(true);
 
-  const gfx::Transform identity_matrix;
-
-  // child and grand_child get render surfaces when surfaces are enabled.
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(2.f, 2.f), gfx::Size(400, 400), true,
-                               false, false);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(4.f, 4.f), gfx::Size(800, 800), true,
-                               false, true);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(8.f, 8.f), gfx::Size(1500, 1500),
-                               true, false, true);
-  SetLayerPropertiesForTesting(leaf_node, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(16.f, 16.f), gfx::Size(2000, 2000),
-                               true, false, false);
-
-  parent->SetMasksToBounds(true);
-  child->SetMasksToBounds(true);
-
-  root->SetHasRenderSurface(true);
-  child->SetHasRenderSurface(true);
-  grand_child->SetHasRenderSurface(true);
-
   gfx::Transform expected_leaf_draw_transform_with_surfaces;
   expected_leaf_draw_transform_with_surfaces.Translate(16.0, 16.0);
 
@@ -2628,10 +2302,6 @@
   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_leaf_draw_transform_with_surfaces,
                                   leaf_node->DrawTransform());
 
-  root->SetHasRenderSurface(true);
-  child->SetHasRenderSurface(true);
-  grand_child->SetHasRenderSurface(true);
-
   ExecuteCalculateDrawPropertiesWithoutSeparateSurfaces(root);
   EXPECT_TRUE(leaf_node->is_clipped());
   EXPECT_EQ(gfx::Rect(6, 6, 396, 396), leaf_node->clip_rect());
@@ -2639,10 +2309,6 @@
   EXPECT_TRANSFORMATION_MATRIX_EQ(expected_leaf_draw_transform_without_surfaces,
                                   leaf_node->DrawTransform());
 
-  root->SetHasRenderSurface(true);
-  child->SetHasRenderSurface(true);
-  grand_child->SetHasRenderSurface(true);
-
   ExecuteCalculateDrawProperties(root);
   EXPECT_FALSE(leaf_node->is_clipped());
   EXPECT_TRUE(leaf_node->render_target()->is_clipped());
@@ -2652,7 +2318,7 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, AnimationsForRenderSurfaceHierarchy) {
-  LayerImpl* parent = root_layer_for_testing();
+  LayerImpl* root = root_layer_for_testing();
   LayerImpl* render_surface1 = AddChildToRoot<LayerImpl>();
   LayerImpl* child_of_rs1 = AddChild<LayerImpl>(render_surface1);
   LayerImpl* grand_child_of_rs1 = AddChild<LayerImpl>(child_of_rs1);
@@ -2662,7 +2328,7 @@
   LayerImpl* child_of_root = AddChildToRoot<LayerImpl>();
   LayerImpl* grand_child_of_root = AddChild<LayerImpl>(child_of_root);
 
-  parent->SetDrawsContent(true);
+  root->SetDrawsContent(true);
   render_surface1->SetDrawsContent(true);
   child_of_rs1->SetDrawsContent(true);
   grand_child_of_rs1->SetDrawsContent(true);
@@ -2675,35 +2341,54 @@
   gfx::Transform layer_transform;
   layer_transform.Translate(1.0, 1.0);
 
-  SetLayerPropertiesForTesting(
-      parent, layer_transform, gfx::Point3F(0.25f, 0.f, 0.f),
-      gfx::PointF(2.5f, 0.f), gfx::Size(10, 10), true, false, true);
-  SetLayerPropertiesForTesting(
-      render_surface1, layer_transform, gfx::Point3F(0.25f, 0.f, 0.f),
-      gfx::PointF(2.5f, 0.f), gfx::Size(10, 10), true, false, true);
-  SetLayerPropertiesForTesting(
-      render_surface2, layer_transform, gfx::Point3F(0.25f, 0.f, 0.f),
-      gfx::PointF(2.5f, 0.f), gfx::Size(10, 10), true, false, true);
-  SetLayerPropertiesForTesting(
-      child_of_root, layer_transform, gfx::Point3F(0.25f, 0.f, 0.f),
-      gfx::PointF(2.5f, 0.f), gfx::Size(10, 10), true, false, false);
-  SetLayerPropertiesForTesting(
-      child_of_rs1, layer_transform, gfx::Point3F(0.25f, 0.f, 0.f),
-      gfx::PointF(2.5f, 0.f), gfx::Size(10, 10), true, false, false);
-  SetLayerPropertiesForTesting(
-      child_of_rs2, layer_transform, gfx::Point3F(0.25f, 0.f, 0.f),
-      gfx::PointF(2.5f, 0.f), gfx::Size(10, 10), true, false, false);
-  SetLayerPropertiesForTesting(
-      grand_child_of_root, layer_transform, gfx::Point3F(0.25f, 0.f, 0.f),
-      gfx::PointF(2.5f, 0.f), gfx::Size(10, 10), true, false, false);
-  SetLayerPropertiesForTesting(
-      grand_child_of_rs1, layer_transform, gfx::Point3F(0.25f, 0.f, 0.f),
-      gfx::PointF(2.5f, 0.f), gfx::Size(10, 10), true, false, false);
-  SetLayerPropertiesForTesting(
-      grand_child_of_rs2, layer_transform, gfx::Point3F(0.25f, 0.f, 0.f),
-      gfx::PointF(2.5f, 0.f), gfx::Size(10, 10), true, false, false);
+  root->SetTransform(layer_transform);
+  root->SetPosition(gfx::PointF(2.5f, 0.f));
+  root->SetBounds(gfx::Size(10, 10));
+  root->test_properties()->transform_origin = gfx::Point3F(0.25f, 0.f, 0.f);
+  render_surface1->SetTransform(layer_transform);
+  render_surface1->SetPosition(gfx::PointF(2.5f, 0.f));
+  render_surface1->SetBounds(gfx::Size(10, 10));
+  render_surface1->test_properties()->transform_origin =
+      gfx::Point3F(0.25f, 0.f, 0.f);
+  render_surface1->test_properties()->force_render_surface = true;
+  render_surface2->SetTransform(layer_transform);
+  render_surface2->SetPosition(gfx::PointF(2.5f, 0.f));
+  render_surface2->SetBounds(gfx::Size(10, 10));
+  render_surface2->test_properties()->transform_origin =
+      gfx::Point3F(0.25f, 0.f, 0.f);
+  render_surface2->test_properties()->force_render_surface = true;
+  child_of_root->SetTransform(layer_transform);
+  child_of_root->SetPosition(gfx::PointF(2.5f, 0.f));
+  child_of_root->SetBounds(gfx::Size(10, 10));
+  child_of_root->test_properties()->transform_origin =
+      gfx::Point3F(0.25f, 0.f, 0.f);
+  child_of_rs1->SetTransform(layer_transform);
+  child_of_rs1->SetPosition(gfx::PointF(2.5f, 0.f));
+  child_of_rs1->SetBounds(gfx::Size(10, 10));
+  child_of_rs1->test_properties()->transform_origin =
+      gfx::Point3F(0.25f, 0.f, 0.f);
+  child_of_rs2->SetTransform(layer_transform);
+  child_of_rs2->SetPosition(gfx::PointF(2.5f, 0.f));
+  child_of_rs2->SetBounds(gfx::Size(10, 10));
+  child_of_rs2->test_properties()->transform_origin =
+      gfx::Point3F(0.25f, 0.f, 0.f);
+  grand_child_of_root->SetTransform(layer_transform);
+  grand_child_of_root->SetPosition(gfx::PointF(2.5f, 0.f));
+  grand_child_of_root->SetBounds(gfx::Size(10, 10));
+  grand_child_of_root->test_properties()->transform_origin =
+      gfx::Point3F(0.25f, 0.f, 0.f);
+  grand_child_of_rs1->SetTransform(layer_transform);
+  grand_child_of_rs1->SetPosition(gfx::PointF(2.5f, 0.f));
+  grand_child_of_rs1->SetBounds(gfx::Size(10, 10));
+  grand_child_of_rs1->test_properties()->transform_origin =
+      gfx::Point3F(0.25f, 0.f, 0.f);
+  grand_child_of_rs2->SetTransform(layer_transform);
+  grand_child_of_rs2->SetPosition(gfx::PointF(2.5f, 0.f));
+  grand_child_of_rs2->SetBounds(gfx::Size(10, 10));
+  grand_child_of_rs2->test_properties()->transform_origin =
+      gfx::Point3F(0.25f, 0.f, 0.f);
 
-  parent->layer_tree_impl()->BuildLayerListAndPropertyTreesForTesting();
+  root->layer_tree_impl()->BuildLayerListAndPropertyTreesForTesting();
   SetElementIdsForTesting();
 
   // Put an animated opacity on the render surface.
@@ -2726,12 +2411,12 @@
   AddAnimatedTransformToElementWithPlayer(grand_child_of_rs2->element_id(),
                                           timeline_impl(), 10.0, 30, 0);
 
-  parent->layer_tree_impl()->property_trees()->needs_rebuild = true;
-  ExecuteCalculateDrawProperties(parent);
+  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  ExecuteCalculateDrawProperties(root);
 
   // Only layers that are associated with render surfaces should have an actual
   // RenderSurface() value.
-  ASSERT_TRUE(parent->render_surface());
+  ASSERT_TRUE(root->render_surface());
   ASSERT_FALSE(child_of_root->render_surface());
   ASSERT_FALSE(grand_child_of_root->render_surface());
 
@@ -2744,9 +2429,9 @@
   ASSERT_FALSE(grand_child_of_rs2->render_surface());
 
   // Verify all render target accessors
-  EXPECT_EQ(parent->render_surface(), parent->render_target());
-  EXPECT_EQ(parent->render_surface(), child_of_root->render_target());
-  EXPECT_EQ(parent->render_surface(), grand_child_of_root->render_target());
+  EXPECT_EQ(root->render_surface(), root->render_target());
+  EXPECT_EQ(root->render_surface(), child_of_root->render_target());
+  EXPECT_EQ(root->render_surface(), grand_child_of_root->render_target());
 
   EXPECT_EQ(render_surface1->render_surface(),
             render_surface1->render_target());
@@ -2761,7 +2446,7 @@
             grand_child_of_rs2->render_target());
 
   // Verify screen_space_transform_is_animating values
-  EXPECT_FALSE(parent->screen_space_transform_is_animating());
+  EXPECT_FALSE(root->screen_space_transform_is_animating());
   EXPECT_FALSE(child_of_root->screen_space_transform_is_animating());
   EXPECT_TRUE(grand_child_of_root->screen_space_transform_is_animating());
   EXPECT_FALSE(render_surface1->screen_space_transform_is_animating());
@@ -2774,7 +2459,7 @@
   // Sanity check. If these fail there is probably a bug in the test itself.
   // It is expected that we correctly set up transforms so that the y-component
   // of the screen-space transform encodes the "depth" of the layer in the tree.
-  EXPECT_FLOAT_EQ(1.0, parent->ScreenSpaceTransform().matrix().get(1, 3));
+  EXPECT_FLOAT_EQ(1.0, root->ScreenSpaceTransform().matrix().get(1, 3));
   EXPECT_FLOAT_EQ(2.0,
                   child_of_root->ScreenSpaceTransform().matrix().get(1, 3));
   EXPECT_FLOAT_EQ(
@@ -2794,54 +2479,42 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, LargeTransforms) {
-  LayerImpl* parent = root_layer_for_testing();
+  LayerImpl* root = root_layer_for_testing();
   LayerImpl* child = AddChildToRoot<LayerImpl>();
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
 
-  grand_child->SetDrawsContent(true);
-
   gfx::Transform large_transform;
   large_transform.Scale(SkDoubleToMScalar(1e37), SkDoubleToMScalar(1e37));
 
-  gfx::Transform identity;
-
-  SetLayerPropertiesForTesting(parent, identity, gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(10, 10), true, false, true);
-  SetLayerPropertiesForTesting(child, large_transform, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
-  SetLayerPropertiesForTesting(grand_child, large_transform, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
-  ExecuteCalculateDrawProperties(parent);
+  root->SetBounds(gfx::Size(10, 10));
+  child->SetTransform(large_transform);
+  child->SetBounds(gfx::Size(10, 10));
+  grand_child->SetTransform(large_transform);
+  grand_child->SetBounds(gfx::Size(10, 10));
+  grand_child->SetDrawsContent(true);
+  ExecuteCalculateDrawProperties(root);
 
   EXPECT_EQ(gfx::Rect(), grand_child->visible_layer_rect());
 }
 
 TEST_F(LayerTreeHostCommonTest,
        ScreenSpaceTransformIsAnimatingWithDelayedAnimation) {
-  LayerImpl* parent = root_layer_for_testing();
-  LayerImpl* child = AddChild<LayerImpl>(parent);
+  LayerImpl* root = root_layer_for_testing();
+  LayerImpl* child = AddChild<LayerImpl>(root);
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
   LayerImpl* great_grand_child = AddChild<LayerImpl>(grand_child);
 
-  parent->SetDrawsContent(true);
+  root->SetDrawsContent(true);
   child->SetDrawsContent(true);
   grand_child->SetDrawsContent(true);
   great_grand_child->SetDrawsContent(true);
 
   gfx::Transform identity;
 
-  SetLayerPropertiesForTesting(parent, identity, gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(10, 10), true, false, true);
-  SetLayerPropertiesForTesting(child, identity, gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(10, 10), true, false, false);
-  SetLayerPropertiesForTesting(grand_child, identity, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
-  SetLayerPropertiesForTesting(great_grand_child, identity, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
+  root->SetBounds(gfx::Size(10, 10));
+  child->SetBounds(gfx::Size(10, 10));
+  grand_child->SetBounds(gfx::Size(10, 10));
+  great_grand_child->SetBounds(gfx::Size(10, 10));
 
   SetElementIdsForTesting();
 
@@ -2853,9 +2526,9 @@
   animation->set_time_offset(base::TimeDelta::FromMilliseconds(-1000));
   AddAnimationToElementWithPlayer(grand_child->element_id(), timeline_impl(),
                                   std::move(animation));
-  ExecuteCalculateDrawProperties(parent);
+  ExecuteCalculateDrawProperties(root);
 
-  EXPECT_FALSE(parent->screen_space_transform_is_animating());
+  EXPECT_FALSE(root->screen_space_transform_is_animating());
   EXPECT_FALSE(child->screen_space_transform_is_animating());
 
   EXPECT_FALSE(grand_child->TransformIsAnimating());
@@ -3176,15 +2849,10 @@
 TEST_F(LayerTreeHostCommonTest,
        VisibleRectsForPositionedRootLayerClippedByViewport) {
   LayerImpl* root = root_layer_for_testing();
-  root->SetDrawsContent(true);
 
-  gfx::Transform identity_matrix;
-  // Root layer is positioned at (60, 70). The default device viewport size
-  // is (0, 0, 100x100) in target space. So the root layer's visible rect
-  // will be clipped by the viewport to be (0, 0, 40x30) in layer's space.
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(60, 70), gfx::Size(100, 100), true,
-                               false, true);
+  root->SetPosition(gfx::PointF(60, 70));
+  root->SetBounds(gfx::Size(100, 100));
+  root->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root);
 
   EXPECT_EQ(gfx::RectF(100.f, 100.f),
@@ -3198,26 +2866,18 @@
 TEST_F(LayerTreeHostCommonTest, DrawableAndVisibleContentRectsForSimpleLayers) {
   LayerImpl* root = root_layer_for_testing();
   LayerImpl* child1_layer = AddChildToRoot<LayerImpl>();
-  child1_layer->SetDrawsContent(true);
   LayerImpl* child2_layer = AddChildToRoot<LayerImpl>();
-  child2_layer->SetDrawsContent(true);
   LayerImpl* child3_layer = AddChildToRoot<LayerImpl>();
+
+  root->SetBounds(gfx::Size(100, 100));
+  child1_layer->SetBounds(gfx::Size(50, 50));
+  child1_layer->SetDrawsContent(true);
+  child2_layer->SetPosition(gfx::PointF(75.f, 75.f));
+  child2_layer->SetBounds(gfx::Size(50, 50));
+  child2_layer->SetDrawsContent(true);
+  child3_layer->SetPosition(gfx::PointF(125.f, 125.f));
+  child3_layer->SetBounds(gfx::Size(50, 50));
   child3_layer->SetDrawsContent(true);
-
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child1_layer, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(50, 50), true, false,
-                               false);
-  SetLayerPropertiesForTesting(child2_layer, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(75.f, 75.f), gfx::Size(50, 50), true,
-                               false, false);
-  SetLayerPropertiesForTesting(child3_layer, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(125.f, 125.f), gfx::Size(50, 50),
-                               true, false, false);
-
   ExecuteCalculateDrawProperties(root);
 
   EXPECT_EQ(gfx::RectF(100.f, 100.f),
@@ -3242,30 +2902,21 @@
   LayerImpl* root = root_layer_for_testing();
   LayerImpl* child = AddChildToRoot<LayerImpl>();
   LayerImpl* grand_child1 = AddChild<LayerImpl>(child);
-  grand_child1->SetDrawsContent(true);
   LayerImpl* grand_child2 = AddChild<LayerImpl>(child);
-  grand_child2->SetDrawsContent(true);
   LayerImpl* grand_child3 = AddChild<LayerImpl>(child);
-  grand_child3->SetDrawsContent(true);
 
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
-  SetLayerPropertiesForTesting(grand_child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(5.f, 5.f), gfx::Size(50, 50), true,
-                               false, false);
-  SetLayerPropertiesForTesting(grand_child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(75.f, 75.f), gfx::Size(50, 50), true,
-                               false, false);
-  SetLayerPropertiesForTesting(grand_child3, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(125.f, 125.f), gfx::Size(50, 50),
-                               true, false, false);
-
+  root->SetBounds(gfx::Size(100, 100));
+  child->SetBounds(gfx::Size(100, 100));
   child->SetMasksToBounds(true);
+  grand_child1->SetPosition(gfx::PointF(5.f, 5.f));
+  grand_child1->SetBounds(gfx::Size(50, 50));
+  grand_child1->SetDrawsContent(true);
+  grand_child2->SetPosition(gfx::PointF(75.f, 75.f));
+  grand_child2->SetBounds(gfx::Size(50, 50));
+  grand_child2->SetDrawsContent(true);
+  grand_child3->SetPosition(gfx::PointF(125.f, 125.f));
+  grand_child3->SetBounds(gfx::Size(50, 50));
+  grand_child3->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root);
 
   EXPECT_EQ(gfx::RectF(100.f, 100.f),
@@ -3296,17 +2947,13 @@
   child_scale_matrix.Scale(0.25f, 0.25f);
   gfx::Transform grand_child_scale_matrix;
   grand_child_scale_matrix.Scale(0.246f, 0.246f);
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, child_scale_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               false);
-  SetLayerPropertiesForTesting(grand_child, grand_child_scale_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, false, false);
 
+  root->SetBounds(gfx::Size(100, 100));
+  child->SetTransform(child_scale_matrix);
+  child->SetBounds(gfx::Size(10, 10));
   child->SetMasksToBounds(true);
+  grand_child->SetTransform(grand_child_scale_matrix);
+  grand_child->SetBounds(gfx::Size(100, 100));
   grand_child->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root);
 
@@ -3319,29 +2966,21 @@
   LayerImpl* root = root_layer_for_testing();
   LayerImpl* render_surface = AddChildToRoot<LayerImpl>();
   LayerImpl* child1 = AddChild<LayerImpl>(render_surface);
-  child1->SetDrawsContent(true);
   LayerImpl* child2 = AddChild<LayerImpl>(render_surface);
-  child2->SetDrawsContent(true);
   LayerImpl* child3 = AddChild<LayerImpl>(render_surface);
+
+  root->SetBounds(gfx::Size(100, 100));
+  render_surface->SetBounds(gfx::Size(3, 4));
+  render_surface->test_properties()->force_render_surface = true;
+  child1->SetPosition(gfx::PointF(5.f, 5.f));
+  child1->SetBounds(gfx::Size(50, 50));
+  child1->SetDrawsContent(true);
+  child2->SetPosition(gfx::PointF(75.f, 75.f));
+  child2->SetBounds(gfx::Size(50, 50));
+  child2->SetDrawsContent(true);
+  child3->SetPosition(gfx::PointF(125.f, 125.f));
+  child3->SetBounds(gfx::Size(50, 50));
   child3->SetDrawsContent(true);
-
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(render_surface, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(3, 4), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(5.f, 5.f), gfx::Size(50, 50), true,
-                               false, false);
-  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(75.f, 75.f), gfx::Size(50, 50), true,
-                               false, false);
-  SetLayerPropertiesForTesting(child3, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(125.f, 125.f), gfx::Size(50, 50),
-                               true, false, false);
-
   ExecuteCalculateDrawProperties(root);
 
   ASSERT_TRUE(render_surface->render_surface());
@@ -3379,6 +3018,24 @@
   LayerImpl* leaf_node1 = AddChild<LayerImpl>(grand_child1);
   LayerImpl* leaf_node2 = AddChild<LayerImpl>(grand_child2);
 
+  root->SetBounds(gfx::Size(100, 100));
+  parent->SetPosition(gfx::PointF(2.f, 2.f));
+  parent->SetBounds(gfx::Size(400, 400));
+  child1->SetPosition(gfx::PointF(4.f, 4.f));
+  child1->SetBounds(gfx::Size(800, 800));
+  child1->test_properties()->force_render_surface = true;
+  child2->SetPosition(gfx::PointF(3.f, 3.f));
+  child2->SetBounds(gfx::Size(800, 800));
+  child2->test_properties()->force_render_surface = true;
+  grand_child1->SetPosition(gfx::PointF(8.f, 8.f));
+  grand_child1->SetBounds(gfx::Size(1500, 1500));
+  grand_child2->SetPosition(gfx::PointF(7.f, 7.f));
+  grand_child2->SetBounds(gfx::Size(1500, 1500));
+  leaf_node1->SetPosition(gfx::PointF(16.f, 16.f));
+  leaf_node1->SetBounds(gfx::Size(2000, 2000));
+  leaf_node2->SetPosition(gfx::PointF(9.f, 9.f));
+  leaf_node2->SetBounds(gfx::Size(2000, 2000));
+
   root->SetDrawsContent(true);
   parent->SetDrawsContent(true);
   child1->SetDrawsContent(true);
@@ -3388,34 +3045,6 @@
   leaf_node1->SetDrawsContent(true);
   leaf_node2->SetDrawsContent(true);
 
-  const gfx::Transform identity_matrix;
-
-  // child1 and child2 get render surfaces when surfaces are enabled.
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(2.f, 2.f), gfx::Size(400, 400), true,
-                               false, false);
-  SetLayerPropertiesForTesting(child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(4.f, 4.f), gfx::Size(800, 800), true,
-                               false, true);
-  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(3.f, 3.f), gfx::Size(800, 800), true,
-                               false, true);
-  SetLayerPropertiesForTesting(grand_child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(8.f, 8.f), gfx::Size(1500, 1500),
-                               true, false, false);
-  SetLayerPropertiesForTesting(grand_child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(7.f, 7.f), gfx::Size(1500, 1500),
-                               true, false, false);
-  SetLayerPropertiesForTesting(leaf_node1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(16.f, 16.f), gfx::Size(2000, 2000),
-                               true, false, false);
-  SetLayerPropertiesForTesting(leaf_node2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(9.f, 9.f), gfx::Size(2000, 2000),
-                               true, false, false);
-
   // Case 1: No layers clip. Visible rects are clipped by the viewport, but the
   // viewport clip doesn't apply to layers that draw into unclipped surfaces.
   // Each layer's drawable content rect is its bounds in target space; the only
@@ -3472,9 +3101,6 @@
   // surfaces are disabled.
   parent->SetMasksToBounds(true);
   host_impl()->active_tree()->property_trees()->needs_rebuild = true;
-  root->SetHasRenderSurface(true);
-  child1->SetHasRenderSurface(true);
-  child2->SetHasRenderSurface(true);
   ExecuteCalculateDrawProperties(root);
   EXPECT_EQ(gfx::Rect(100, 100), root->visible_layer_rect());
   EXPECT_EQ(gfx::Rect(98, 98), parent->visible_layer_rect());
@@ -3522,9 +3148,6 @@
   child1->SetMasksToBounds(true);
   grand_child2->SetMasksToBounds(true);
   host_impl()->active_tree()->property_trees()->needs_rebuild = true;
-  root->SetHasRenderSurface(true);
-  child1->SetHasRenderSurface(true);
-  child2->SetHasRenderSurface(true);
   ExecuteCalculateDrawProperties(root);
   EXPECT_EQ(gfx::Rect(100, 100), root->visible_layer_rect());
   EXPECT_EQ(gfx::Rect(98, 98), parent->visible_layer_rect());
@@ -3571,23 +3194,17 @@
   LayerImpl* child1 = AddChild<LayerImpl>(root);
   LayerImpl* child2 = AddChild<LayerImpl>(root);
   LayerImpl* child3 = AddChild<LayerImpl>(root);
-  child1->SetDrawsContent(true);
-  child2->SetDrawsContent(true);
-  child3->SetDrawsContent(true);
 
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(5.f, 5.f), gfx::Size(50, 50), true,
-                               false, false);
-  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(75.f, 75.f), gfx::Size(50, 50), true,
-                               false, false);
-  SetLayerPropertiesForTesting(child3, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(125.f, 125.f), gfx::Size(50, 50),
-                               true, false, false);
+  root->SetBounds(gfx::Size(100, 100));
+  child1->SetPosition(gfx::PointF(5.f, 5.f));
+  child1->SetBounds(gfx::Size(50, 50));
+  child1->SetDrawsContent(true);
+  child2->SetPosition(gfx::PointF(75.f, 75.f));
+  child2->SetBounds(gfx::Size(50, 50));
+  child2->SetDrawsContent(true);
+  child3->SetPosition(gfx::PointF(125.f, 125.f));
+  child3->SetBounds(gfx::Size(50, 50));
+  child3->SetDrawsContent(true);
 
   LayerImplList render_surface_layer_list_impl;
   // Now set the root render surface an empty clip.
@@ -3614,6 +3231,10 @@
        DrawableAndVisibleContentRectsForLayersWithUninvertibleTransform) {
   LayerImpl* root = root_layer_for_testing();
   LayerImpl* child = AddChildToRoot<LayerImpl>();
+
+  root->SetBounds(gfx::Size(100, 100));
+  child->SetPosition(gfx::PointF(5.f, 5.f));
+  child->SetBounds(gfx::Size(50, 50));
   child->SetDrawsContent(true);
 
   // Case 1: a truly degenerate matrix
@@ -3621,13 +3242,7 @@
   gfx::Transform uninvertible_matrix(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
   ASSERT_FALSE(uninvertible_matrix.IsInvertible());
 
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, uninvertible_matrix, gfx::Point3F(),
-                               gfx::PointF(5.f, 5.f), gfx::Size(50, 50), true,
-                               false, false);
-
+  child->SetTransform(uninvertible_matrix);
   ExecuteCalculateDrawProperties(root);
 
   EXPECT_TRUE(child->visible_layer_rect().IsEmpty());
@@ -3639,10 +3254,7 @@
   uninvertible_matrix.matrix().set(2, 2, 0.0);
   ASSERT_FALSE(uninvertible_matrix.IsInvertible());
 
-  SetLayerPropertiesForTesting(child, uninvertible_matrix, gfx::Point3F(),
-                               gfx::PointF(5.f, 5.f), gfx::Size(50, 50), true,
-                               false, false);
-
+  child->SetTransform(uninvertible_matrix);
   ExecuteCalculateDrawProperties(root);
 
   EXPECT_TRUE(child->visible_layer_rect().IsEmpty());
@@ -3654,10 +3266,7 @@
   uninvertible_matrix.matrix().set(2, 2, 0.0);
   ASSERT_FALSE(uninvertible_matrix.IsInvertible());
 
-  SetLayerPropertiesForTesting(child, uninvertible_matrix, gfx::Point3F(),
-                               gfx::PointF(5.f, 5.f), gfx::Size(50, 50), true,
-                               false, false);
-
+  child->SetTransform(uninvertible_matrix);
   ExecuteCalculateDrawProperties(root);
 
   EXPECT_TRUE(child->visible_layer_rect().IsEmpty());
@@ -3669,8 +3278,6 @@
   LayerImpl* root = root_layer_for_testing();
   LayerImpl* child = AddChildToRoot<LayerImpl>();
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
-  child->SetDrawsContent(true);
-  grand_child->SetDrawsContent(true);
 
   gfx::Transform identity_matrix;
 
@@ -3680,16 +3287,18 @@
   gfx::Transform rotation;
   rotation.RotateAboutYAxis(45.0);
 
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child, perspective, gfx::Point3F(),
-                               gfx::PointF(10.f, 10.f), gfx::Size(100, 100),
-                               false, true, false);
-  SetLayerPropertiesForTesting(grand_child, rotation, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), false, true,
-                               false);
-
+  root->SetBounds(gfx::Size(100, 100));
+  child->SetTransform(perspective);
+  child->SetPosition(gfx::PointF(10.f, 10.f));
+  child->SetBounds(gfx::Size(100, 100));
+  child->SetDrawsContent(true);
+  child->Set3dSortingContextId(1);
+  child->test_properties()->should_flatten_transform = false;
+  grand_child->SetTransform(rotation);
+  grand_child->SetBounds(gfx::Size(100, 100));
+  grand_child->SetDrawsContent(true);
+  grand_child->Set3dSortingContextId(1);
+  grand_child->test_properties()->should_flatten_transform = false;
   ExecuteCalculateDrawProperties(root);
 
   // Though all layers have invertible transforms, matrix multiplication using
@@ -3735,28 +3344,17 @@
   surface_sibling->SetContentsOpaque(true);
   surface_child_mask->SetContentsOpaque(true);
 
-  surface->test_properties()->opacity = 0.5f;
-  surface_child->test_properties()->opacity = 0.6f;
-
-  gfx::Transform identity_matrix;
   gfx::Transform translate;
   translate.Translate(20.f, 20.f);
 
-  SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(1000, 1000), true,
-                               false, true);
-  SetLayerPropertiesForTesting(child.get(), identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(300, 300), false, true,
-                               false);
-  SetLayerPropertiesForTesting(surface.get(), translate, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(300, 300), false, true,
-                               true);
-  SetLayerPropertiesForTesting(surface_child.get(), identity_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(300, 300), false, false, true);
-  SetLayerPropertiesForTesting(surface_sibling.get(), identity_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(200, 200), false, false, false);
+  root->SetBounds(gfx::Size(1000, 1000));
+  child->SetBounds(gfx::Size(300, 300));
+  surface->SetTransform(translate);
+  surface->SetBounds(gfx::Size(300, 300));
+  surface->test_properties()->force_render_surface = true;
+  surface_child->SetBounds(gfx::Size(300, 300));
+  surface_child->test_properties()->force_render_surface = true;
+  surface_sibling->SetBounds(gfx::Size(200, 200));
 
   LayerImpl* surface_ptr = surface.get();
   LayerImpl* surface_child_ptr = surface_child.get();
@@ -3810,10 +3408,6 @@
       LayerImpl::Create(host_impl.active_tree(), 3);
   std::unique_ptr<LayerImpl> occluding_child =
       LayerImpl::Create(host_impl.active_tree(), 4);
-  child->SetDrawsContent(true);
-  grand_child->SetDrawsContent(true);
-  occluding_child->SetDrawsContent(true);
-  occluding_child->SetContentsOpaque(true);
 
   gfx::Transform identity_matrix;
   gfx::Transform perspective;
@@ -3822,18 +3416,23 @@
   gfx::Transform rotation;
   rotation.RotateAboutYAxis(45.0);
 
-  SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(1000, 1000), true,
-                               false, true);
-  SetLayerPropertiesForTesting(child.get(), perspective, gfx::Point3F(),
-                               gfx::PointF(10.f, 10.f), gfx::Size(300, 300),
-                               false, true, false);
-  SetLayerPropertiesForTesting(grand_child.get(), rotation, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(200, 200), false, true,
-                               false);
-  SetLayerPropertiesForTesting(occluding_child.get(), identity_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(200, 200), false, false, false);
+  root->SetBounds(gfx::Size(1000, 1000));
+  child->SetTransform(perspective);
+  child->SetPosition(gfx::PointF(10.f, 10.f));
+  child->SetBounds(gfx::Size(300, 300));
+  child->test_properties()->should_flatten_transform = false;
+  child->Set3dSortingContextId(1);
+  grand_child->SetTransform(rotation);
+  grand_child->SetBounds(gfx::Size(200, 200));
+  grand_child->test_properties()->should_flatten_transform = false;
+  grand_child->Set3dSortingContextId(1);
+  occluding_child->SetBounds(gfx::Size(200, 200));
+  occluding_child->test_properties()->should_flatten_transform = false;
+
+  child->SetDrawsContent(true);
+  grand_child->SetDrawsContent(true);
+  occluding_child->SetDrawsContent(true);
+  occluding_child->SetContentsOpaque(true);
 
   host_impl.SetViewportSize(root->bounds());
 
@@ -3877,31 +3476,22 @@
   LayerImpl* root = root_layer_for_testing();
   LayerImpl* render_surface = AddChildToRoot<LayerImpl>();
   LayerImpl* child1 = AddChild<LayerImpl>(render_surface);
-  child1->SetDrawsContent(true);
   LayerImpl* child2 = AddChild<LayerImpl>(render_surface);
-  child2->SetDrawsContent(true);
   LayerImpl* child3 = AddChild<LayerImpl>(render_surface);
-  child3->SetDrawsContent(true);
 
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(render_surface, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(3, 4), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(5.f, 5.f), gfx::Size(50, 50), true,
-                               false, false);
-  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(75.f, 75.f), gfx::Size(50, 50), true,
-                               false, false);
-  SetLayerPropertiesForTesting(child3, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(125.f, 125.f), gfx::Size(50, 50),
-                               true, false, false);
-
+  root->SetBounds(gfx::Size(100, 100));
   root->SetMasksToBounds(true);
-
+  render_surface->SetBounds(gfx::Size(3, 4));
+  render_surface->test_properties()->force_render_surface = true;
+  child1->SetPosition(gfx::PointF(5.f, 5.f));
+  child1->SetBounds(gfx::Size(50, 50));
+  child1->SetDrawsContent(true);
+  child2->SetPosition(gfx::PointF(75.f, 75.f));
+  child2->SetBounds(gfx::Size(50, 50));
+  child2->SetDrawsContent(true);
+  child3->SetPosition(gfx::PointF(125.f, 125.f));
+  child3->SetBounds(gfx::Size(50, 50));
+  child3->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root);
 
   ASSERT_TRUE(render_surface->render_surface());
@@ -3937,34 +3527,24 @@
   LayerImpl* render_surface1 = AddChildToRoot<LayerImpl>();
   LayerImpl* render_surface2 = AddChild<LayerImpl>(render_surface1);
   LayerImpl* child1 = AddChild<LayerImpl>(render_surface2);
-  child1->SetDrawsContent(true);
   LayerImpl* child2 = AddChild<LayerImpl>(render_surface2);
-  child2->SetDrawsContent(true);
   LayerImpl* child3 = AddChild<LayerImpl>(render_surface2);
-  child3->SetDrawsContent(true);
 
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(render_surface1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(3, 4), true, false,
-                               true);
-  SetLayerPropertiesForTesting(render_surface2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(7, 13), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(5.f, 5.f), gfx::Size(50, 50), true,
-                               false, false);
-  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(75.f, 75.f), gfx::Size(50, 50), true,
-                               false, false);
-  SetLayerPropertiesForTesting(child3, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(125.f, 125.f), gfx::Size(50, 50),
-                               true, false, false);
-
+  root->SetBounds(gfx::Size(100, 100));
   root->SetMasksToBounds(true);
-
+  render_surface1->SetBounds(gfx::Size(3, 4));
+  render_surface1->test_properties()->force_render_surface = true;
+  render_surface2->SetBounds(gfx::Size(7, 13));
+  render_surface2->test_properties()->force_render_surface = true;
+  child1->SetPosition(gfx::PointF(5.f, 5.f));
+  child1->SetBounds(gfx::Size(50, 50));
+  child1->SetDrawsContent(true);
+  child2->SetPosition(gfx::PointF(75.f, 75.f));
+  child2->SetBounds(gfx::Size(50, 50));
+  child2->SetDrawsContent(true);
+  child3->SetPosition(gfx::PointF(125.f, 125.f));
+  child3->SetBounds(gfx::Size(50, 50));
+  child3->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root);
 
   ASSERT_TRUE(render_surface1->render_surface());
@@ -4007,30 +3587,20 @@
   LayerImpl* child1 = AddChild<LayerImpl>(render_surface1);
   LayerImpl* child2 = AddChild<LayerImpl>(child1);
   LayerImpl* render_surface2 = AddChild<LayerImpl>(child2);
-  child1->SetDrawsContent(true);
-  child2->SetDrawsContent(true);
-  render_surface2->SetDrawsContent(true);
 
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(render_surface1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(500, 500), true, false,
-                               false);
-  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(700, 700), true, false,
-                               false);
-  SetLayerPropertiesForTesting(render_surface2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(1000, 1000), true,
-                               false, true);
+  root->SetBounds(gfx::Size(100, 100));
+  render_surface1->SetBounds(gfx::Size(100, 100));
+  render_surface1->test_properties()->force_render_surface = true;
+  child1->SetBounds(gfx::Size(500, 500));
+  child1->SetDrawsContent(true);
+  child2->SetBounds(gfx::Size(700, 700));
+  child2->SetDrawsContent(true);
+  render_surface2->SetBounds(gfx::Size(1000, 1000));
+  render_surface2->test_properties()->force_render_surface = true;
+  render_surface2->SetDrawsContent(true);
 
   child1->SetMasksToBounds(true);
   child2->SetMasksToBounds(true);
-
   ExecuteCalculateDrawProperties(root);
   EXPECT_EQ(gfx::Rect(500, 500), child1->visible_layer_rect());
   EXPECT_EQ(gfx::Rect(100, 100), render_surface2->visible_layer_rect());
@@ -4044,32 +3614,26 @@
   LayerImpl* clip_child = AddChild<LayerImpl>(render_surface1);
   LayerImpl* render_surface2 = AddChild<LayerImpl>(clip_child);
 
+  root->SetBounds(gfx::Size(100, 100));
+
+  clip_parent->SetBounds(gfx::Size(50, 50));
+  clip_parent->SetMasksToBounds(true);
+  clip_parent->test_properties()->clip_children =
+      base::MakeUnique<std::set<LayerImpl*>>();
+  clip_parent->test_properties()->clip_children->insert(clip_child);
+
+  render_surface1->SetBounds(gfx::Size(20, 20));
+  render_surface1->SetMasksToBounds(true);
   render_surface1->SetDrawsContent(true);
-  render_surface2->SetDrawsContent(true);
+  render_surface1->test_properties()->force_render_surface = true;
+
+  clip_child->SetBounds(gfx::Size(60, 60));
   clip_child->SetDrawsContent(true);
   clip_child->test_properties()->clip_parent = clip_parent;
-  std::unique_ptr<std::set<LayerImpl*>> clip_children(new std::set<LayerImpl*>);
-  clip_children->insert(clip_child);
-  clip_parent->test_properties()->clip_children.reset(clip_children.release());
 
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(clip_parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(50, 50), true, false,
-                               false);
-  SetLayerPropertiesForTesting(render_surface1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(20, 20), true, false,
-                               true);
-  SetLayerPropertiesForTesting(clip_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(60, 60), true, false,
-                               false);
-  SetLayerPropertiesForTesting(render_surface2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(60, 60), true, false,
-                               true);
-  clip_parent->SetMasksToBounds(true);
-  render_surface1->SetMasksToBounds(true);
+  render_surface2->SetBounds(gfx::Size(60, 60));
+  render_surface2->SetDrawsContent(true);
+  render_surface2->test_properties()->force_render_surface = true;
 
   ExecuteCalculateDrawProperties(root);
   EXPECT_EQ(gfx::Rect(20, 20), render_surface1->visible_layer_rect());
@@ -4084,30 +3648,26 @@
   LayerImpl* clip_child = AddChild<LayerImpl>(render_surface1);
   LayerImpl* render_surface2 = AddChild<LayerImpl>(clip_child);
 
+  root->SetBounds(gfx::Size(100, 100));
+
+  clip_parent->SetPosition(gfx::PointF(2.f, 2.f));
+  clip_parent->SetBounds(gfx::Size(50, 50));
+  clip_parent->test_properties()->clip_children =
+      base::MakeUnique<std::set<LayerImpl*>>();
+  clip_parent->test_properties()->clip_children->insert(clip_child);
+
+  render_surface1->SetBounds(gfx::Size(20, 20));
   render_surface1->SetDrawsContent(true);
-  render_surface2->SetDrawsContent(true);
+  render_surface1->test_properties()->force_render_surface = true;
+
+  clip_child->SetBounds(gfx::Size(60, 60));
   clip_child->SetDrawsContent(true);
   clip_child->test_properties()->clip_parent = clip_parent;
-  std::unique_ptr<std::set<LayerImpl*>> clip_children(new std::set<LayerImpl*>);
-  clip_children->insert(clip_child);
-  clip_parent->test_properties()->clip_children.reset(clip_children.release());
 
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(clip_parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(2.f, 2.f), gfx::Size(50, 50), true,
-                               false, false);
-  SetLayerPropertiesForTesting(render_surface1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(20, 20), true, false,
-                               true);
-  SetLayerPropertiesForTesting(clip_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(60, 60), true, false,
-                               false);
-  SetLayerPropertiesForTesting(render_surface2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(60, 60), true, false,
-                               true);
+  render_surface2->SetBounds(gfx::Size(60, 60));
+  render_surface2->SetDrawsContent(true);
+  render_surface2->test_properties()->force_render_surface = true;
+
   clip_parent->SetMasksToBounds(true);
   render_surface1->SetMasksToBounds(true);
 
@@ -4121,18 +3681,11 @@
   LayerImpl* surface = AddChildToRoot<LayerImpl>();
   LayerImpl* test_layer = AddChild<LayerImpl>(surface);
 
-  test_layer->SetDrawsContent(false);
+  root->SetBounds(gfx::Size(200, 200));
+  surface->SetBounds(gfx::Size(100, 100));
   surface->SetDrawsContent(true);
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(200, 200), true, false,
-                               true);
-  SetLayerPropertiesForTesting(surface, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(test_layer, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(150, 150), true, false,
-                               false);
+  surface->test_properties()->force_render_surface = true;
+  test_layer->SetBounds(gfx::Size(150, 150));
 
   ExecuteCalculateDrawProperties(root);
   EXPECT_EQ(gfx::Rect(100, 100), surface->render_surface()->content_rect());
@@ -4154,33 +3707,28 @@
   LayerImpl* clip_child = AddChild<LayerImpl>(unclipped_desc_surface);
   LayerImpl* clipped_surface = AddChild<LayerImpl>(clip_child);
 
-  unclipped_surface->SetDrawsContent(true);
-  unclipped_desc_surface->SetDrawsContent(true);
-  clipped_surface->SetDrawsContent(true);
-  clip_child->test_properties()->clip_parent = clip_parent;
-  std::unique_ptr<std::set<LayerImpl*>> clip_children(new std::set<LayerImpl*>);
-  clip_children->insert(clip_child);
-  clip_parent->test_properties()->clip_children.reset(clip_children.release());
+  root->SetBounds(gfx::Size(100, 100));
 
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(unclipped_surface, identity_matrix,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(30, 30),
-                               true, false, true);
-  SetLayerPropertiesForTesting(clip_parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(50, 50), true, false,
-                               false);
-  SetLayerPropertiesForTesting(unclipped_desc_surface, identity_matrix,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(20, 20),
-                               true, false, true);
-  SetLayerPropertiesForTesting(clip_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(60, 60), true, false,
-                               false);
-  SetLayerPropertiesForTesting(clipped_surface, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(60, 60), true, false,
-                               true);
+  unclipped_surface->SetBounds(gfx::Size(30, 30));
+  unclipped_surface->SetDrawsContent(true);
+  unclipped_surface->test_properties()->force_render_surface = true;
+
+  clip_parent->SetBounds(gfx::Size(50, 50));
+  clip_parent->test_properties()->clip_children =
+      base::MakeUnique<std::set<LayerImpl*>>();
+  clip_parent->test_properties()->clip_children->insert(clip_child);
+
+  unclipped_desc_surface->SetBounds(gfx::Size(20, 20));
+  unclipped_desc_surface->SetDrawsContent(true);
+  unclipped_desc_surface->test_properties()->force_render_surface = true;
+
+  clip_child->SetBounds(gfx::Size(60, 60));
+  clip_child->test_properties()->clip_parent = clip_parent;
+
+  clipped_surface->SetBounds(gfx::Size(60, 60));
+  clipped_surface->SetDrawsContent(true);
+  clipped_surface->test_properties()->force_render_surface = true;
+
   clip_parent->SetMasksToBounds(true);
 
   ExecuteCalculateDrawProperties(root);
@@ -4200,33 +3748,28 @@
   LayerImpl* clip_child = AddChild<LayerImpl>(unclipped_desc_surface);
   LayerImpl* clipped_surface = AddChild<LayerImpl>(clip_child);
 
-  unclipped_surface->SetDrawsContent(true);
-  unclipped_desc_surface->SetDrawsContent(true);
-  clipped_surface->SetDrawsContent(true);
-  clip_child->test_properties()->clip_parent = clip_parent;
-  std::unique_ptr<std::set<LayerImpl*>> clip_children(new std::set<LayerImpl*>);
-  clip_children->insert(clip_child);
-  clip_parent->test_properties()->clip_children.reset(clip_children.release());
+  root->SetBounds(gfx::Size(10, 10));
 
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false,
-                               true);
-  SetLayerPropertiesForTesting(unclipped_surface, identity_matrix,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(50, 50),
-                               true, false, true);
-  SetLayerPropertiesForTesting(clip_parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(50, 50), true, false,
-                               false);
-  SetLayerPropertiesForTesting(unclipped_desc_surface, identity_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, false, true);
-  SetLayerPropertiesForTesting(clip_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
-  SetLayerPropertiesForTesting(clipped_surface, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(50, 50), true, false,
-                               true);
+  unclipped_surface->SetBounds(gfx::Size(50, 50));
+  unclipped_surface->SetDrawsContent(true);
+  unclipped_surface->test_properties()->force_render_surface = true;
+
+  clip_parent->SetBounds(gfx::Size(50, 50));
+  clip_parent->test_properties()->clip_children =
+      base::MakeUnique<std::set<LayerImpl*>>();
+  clip_parent->test_properties()->clip_children->insert(clip_child);
+
+  unclipped_desc_surface->SetBounds(gfx::Size(100, 100));
+  unclipped_desc_surface->SetDrawsContent(true);
+  unclipped_desc_surface->test_properties()->force_render_surface = true;
+
+  clip_child->SetBounds(gfx::Size(100, 100));
+  clip_child->test_properties()->clip_parent = clip_parent;
+
+  clipped_surface->SetBounds(gfx::Size(50, 50));
+  clipped_surface->SetDrawsContent(true);
+  clipped_surface->test_properties()->force_render_surface = true;
+
   clip_parent->SetMasksToBounds(true);
   unclipped_desc_surface->SetMasksToBounds(true);
 
@@ -4243,21 +3786,19 @@
   LayerImpl* root = root_layer_for_testing();
   LayerImpl* render_surface = AddChildToRoot<LayerImpl>();
   LayerImpl* child1 = AddChild<LayerImpl>(render_surface);
-  child1->SetDrawsContent(true);
 
   gfx::Transform identity_matrix;
   gfx::Transform child_rotation;
   child_rotation.Rotate(45.0);
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(render_surface, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(3, 4), true, false,
-                               true);
-  SetLayerPropertiesForTesting(
-      child1, child_rotation, gfx::Point3F(25, 25, 0.f),
-      gfx::PointF(25.f, 25.f), gfx::Size(50, 50), true, false, false);
 
+  root->SetBounds(gfx::Size(100, 100));
+  render_surface->SetBounds(gfx::Size(3, 4));
+  render_surface->test_properties()->force_render_surface = true;
+  child1->SetTransform(child_rotation);
+  child1->SetPosition(gfx::PointF(25.f, 25.f));
+  child1->SetBounds(gfx::Size(50, 50));
+  child1->SetDrawsContent(true);
+  child1->test_properties()->transform_origin = gfx::Point3F(25.f, 25.f, 0.f);
   ExecuteCalculateDrawProperties(root);
 
   ASSERT_TRUE(render_surface->render_surface());
@@ -4292,24 +3833,19 @@
   LayerImpl* root = root_layer_for_testing();
   LayerImpl* render_surface = AddChildToRoot<LayerImpl>();
   LayerImpl* child1 = AddChild<LayerImpl>(render_surface);
-  child1->SetDrawsContent(true);
 
-  gfx::Transform identity_matrix;
   gfx::Transform child_rotation;
   child_rotation.Rotate(45.0);
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(50, 50), true, false,
-                               true);
-  SetLayerPropertiesForTesting(render_surface, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(3, 4), true, false,
-                               true);
 
-  SetLayerPropertiesForTesting(
-      child1, child_rotation, gfx::Point3F(25, 25, 0.f),
-      gfx::PointF(25.f, 25.f), gfx::Size(50, 50), true, false, false);
-
+  root->SetBounds(gfx::Size(50, 50));
   root->SetMasksToBounds(true);
-
+  render_surface->SetBounds(gfx::Size(3, 4));
+  render_surface->test_properties()->force_render_surface = true;
+  child1->SetPosition(gfx::PointF(25.f, 25.f));
+  child1->SetBounds(gfx::Size(50, 50));
+  child1->SetDrawsContent(true);
+  child1->SetTransform(child_rotation);
+  child1->test_properties()->transform_origin = gfx::Point3F(25.f, 25.f, 0.f);
   ExecuteCalculateDrawProperties(root);
 
   ASSERT_TRUE(render_surface->render_surface());
@@ -4339,44 +3875,35 @@
   LayerImpl* root = root_layer_for_testing();
   FakePictureLayerImpl* render_surface1 =
       AddChildToRoot<FakePictureLayerImpl>();
-  render_surface1->SetDrawsContent(true);
   FakePictureLayerImpl* render_surface2 =
       AddChild<FakePictureLayerImpl>(render_surface1);
-  render_surface2->SetDrawsContent(true);
   FakePictureLayerImpl* child1 =
       AddChild<FakePictureLayerImpl>(render_surface2);
-  child1->SetDrawsContent(true);
   FakePictureLayerImpl* child2 =
       AddChild<FakePictureLayerImpl>(render_surface2);
-  child2->SetDrawsContent(true);
   FakePictureLayerImpl* child3 =
       AddChild<FakePictureLayerImpl>(render_surface2);
-  child3->SetDrawsContent(true);
 
-  gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
-  SetLayerPropertiesForTesting(render_surface1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(5.f, 5.f), gfx::Size(3, 4), true,
-                               false, true);
-  SetLayerPropertiesForTesting(render_surface2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(5.f, 5.f), gfx::Size(7, 13), true,
-                               false, true);
-  SetLayerPropertiesForTesting(child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(5.f, 5.f), gfx::Size(50, 50), true,
-                               false, false);
-  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(75.f, 75.f), gfx::Size(50, 50), true,
-                               false, false);
-  SetLayerPropertiesForTesting(child3, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(125.f, 125.f), gfx::Size(50, 50),
-                               true, false, false);
-
-  float device_scale_factor = 2.f;
-
+  root->SetBounds(gfx::Size(100, 100));
   root->SetMasksToBounds(true);
-
+  render_surface1->SetBounds(gfx::Size(3, 4));
+  render_surface1->SetPosition(gfx::PointF(5.f, 5.f));
+  render_surface1->SetDrawsContent(true);
+  render_surface1->test_properties()->force_render_surface = true;
+  render_surface2->SetBounds(gfx::Size(7, 13));
+  render_surface2->SetPosition(gfx::PointF(5.f, 5.f));
+  render_surface2->SetDrawsContent(true);
+  render_surface2->test_properties()->force_render_surface = true;
+  child1->SetBounds(gfx::Size(50, 50));
+  child1->SetPosition(gfx::PointF(5.f, 5.f));
+  child1->SetDrawsContent(true);
+  child2->SetBounds(gfx::Size(50, 50));
+  child2->SetPosition(gfx::PointF(75.f, 75.f));
+  child2->SetDrawsContent(true);
+  child3->SetBounds(gfx::Size(50, 50));
+  child3->SetPosition(gfx::PointF(125.f, 125.f));
+  child3->SetDrawsContent(true);
+  float device_scale_factor = 2.f;
   ExecuteCalculateDrawProperties(root, device_scale_factor);
 
   ASSERT_TRUE(render_surface1->render_surface());
@@ -4416,7 +3943,7 @@
   // "flattened" to each parent layer according to current W3C spec.
 
   const gfx::Transform identity_matrix;
-  LayerImpl* parent = root_layer_for_testing();
+  LayerImpl* root = root_layer_for_testing();
   LayerImpl* front_facing_child = AddChildToRoot<LayerImpl>();
   LayerImpl* back_facing_child = AddChildToRoot<LayerImpl>();
   LayerImpl* front_facing_surface = AddChildToRoot<LayerImpl>();
@@ -4459,41 +3986,28 @@
   backface_matrix.RotateAboutYAxis(180.0);
   backface_matrix.Translate(-50.0, -50.0);
 
-  // Having a descendant and opacity will force these to have render surfaces.
-  front_facing_surface->test_properties()->opacity = 0.5f;
-  back_facing_surface->test_properties()->opacity = 0.5f;
+  root->SetBounds(gfx::Size(100, 100));
+  front_facing_child->SetBounds(gfx::Size(100, 100));
+  back_facing_child->SetBounds(gfx::Size(100, 100));
+  front_facing_surface->SetBounds(gfx::Size(100, 100));
+  back_facing_surface->SetBounds(gfx::Size(100, 100));
+  front_facing_child_of_front_facing_surface->SetBounds(gfx::Size(100, 100));
+  back_facing_child_of_front_facing_surface->SetBounds(gfx::Size(100, 100));
+  front_facing_child_of_back_facing_surface->SetBounds(gfx::Size(100, 100));
+  back_facing_child_of_back_facing_surface->SetBounds(gfx::Size(100, 100));
 
-  // Nothing preserves 3d. According to current W3C CSS gfx::Transforms spec,
-  // these layers should blindly use their own local transforms to determine
-  // back-face culling.
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(front_facing_child, identity_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(back_facing_child, backface_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(front_facing_surface, identity_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(back_facing_surface, backface_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(front_facing_child_of_front_facing_surface,
-                               identity_matrix, gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(back_facing_child_of_front_facing_surface,
-                               backface_matrix, gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(front_facing_child_of_back_facing_surface,
-                               identity_matrix, gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(back_facing_child_of_back_facing_surface,
-                               backface_matrix, gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, false);
+  front_facing_surface->test_properties()->force_render_surface = true;
+  back_facing_surface->test_properties()->force_render_surface = true;
 
-  ExecuteCalculateDrawPropertiesWithPropertyTrees(parent);
+  back_facing_child->SetTransform(backface_matrix);
+  back_facing_surface->SetTransform(backface_matrix);
+  back_facing_child_of_front_facing_surface->SetTransform(backface_matrix);
+  back_facing_child_of_back_facing_surface->SetTransform(backface_matrix);
+
+  // Note: No layers preserve 3d. According to current W3C CSS gfx::Transforms
+  // spec, these layers should blindly use their own local transforms to
+  // determine back-face culling.
+  ExecuteCalculateDrawPropertiesWithPropertyTrees(root);
 
   // Verify which render surfaces were created.
   EXPECT_FALSE(front_facing_child->has_render_surface());
@@ -4520,7 +4034,7 @@
   // is used.
 
   const gfx::Transform identity_matrix;
-  LayerImpl* parent = root_layer_for_testing();
+  LayerImpl* root = root_layer_for_testing();
   LayerImpl* front_facing_child = AddChildToRoot<LayerImpl>();
   LayerImpl* back_facing_child = AddChildToRoot<LayerImpl>();
   LayerImpl* front_facing_surface = AddChildToRoot<LayerImpl>();
@@ -4572,42 +4086,36 @@
   backface_matrix.RotateAboutYAxis(180.0);
   backface_matrix.Translate(-50.0, -50.0);
 
+  root->SetBounds(gfx::Size(100, 100));
+  front_facing_child->SetBounds(gfx::Size(100, 100));
+  back_facing_child->SetBounds(gfx::Size(100, 100));
+  front_facing_surface->SetBounds(gfx::Size(100, 100));
+  back_facing_surface->SetBounds(gfx::Size(100, 100));
+  front_facing_child_of_front_facing_surface->SetBounds(gfx::Size(100, 100));
+  back_facing_child_of_front_facing_surface->SetBounds(gfx::Size(100, 100));
+  front_facing_child_of_back_facing_surface->SetBounds(gfx::Size(100, 100));
+  back_facing_child_of_back_facing_surface->SetBounds(gfx::Size(100, 100));
+
+  back_facing_child->SetTransform(backface_matrix);
+  back_facing_surface->SetTransform(backface_matrix);
+  back_facing_child_of_front_facing_surface->SetTransform(backface_matrix);
+  back_facing_child_of_back_facing_surface->SetTransform(backface_matrix);
+
   // Each surface creates its own new 3d rendering context (as defined by W3C
   // spec).  According to current W3C CSS gfx::Transforms spec, layers in a 3d
   // rendering context should use the transform with respect to that context.
   // This 3d rendering context occurs when (a) parent's transform style is flat
   // and (b) the layer's transform style is preserve-3d.
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true,
-                               false);  // parent transform style is flat.
-  SetLayerPropertiesForTesting(front_facing_child, identity_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(back_facing_child, backface_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, false);
-  // surface transform style is preserve-3d.
-  SetLayerPropertiesForTesting(front_facing_surface, identity_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), false, true);
-  // surface transform style is preserve-3d.
-  SetLayerPropertiesForTesting(back_facing_surface, backface_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), false, true);
-  SetLayerPropertiesForTesting(front_facing_child_of_front_facing_surface,
-                               identity_matrix, gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, true);
-  SetLayerPropertiesForTesting(back_facing_child_of_front_facing_surface,
-                               backface_matrix, gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, true);
-  SetLayerPropertiesForTesting(front_facing_child_of_back_facing_surface,
-                               identity_matrix, gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, true);
-  SetLayerPropertiesForTesting(back_facing_child_of_back_facing_surface,
-                               backface_matrix, gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, true);
+  front_facing_surface->test_properties()->should_flatten_transform = false;
+  front_facing_surface->Set3dSortingContextId(1);
+  back_facing_surface->test_properties()->should_flatten_transform = false;
+  back_facing_surface->Set3dSortingContextId(1);
+  front_facing_child_of_front_facing_surface->Set3dSortingContextId(1);
+  back_facing_child_of_front_facing_surface->Set3dSortingContextId(1);
+  front_facing_child_of_back_facing_surface->Set3dSortingContextId(1);
+  back_facing_child_of_back_facing_surface->Set3dSortingContextId(1);
 
-  ExecuteCalculateDrawPropertiesWithPropertyTrees(parent);
+  ExecuteCalculateDrawPropertiesWithPropertyTrees(root);
 
   // Verify which render surfaces were created and used.
   EXPECT_FALSE(front_facing_child->has_render_surface());
@@ -4636,7 +4144,7 @@
   // Even layers that are animating get culled if their back face is showing and
   // they are not double sided.
   const gfx::Transform identity_matrix;
-  LayerImpl* parent = root_layer_for_testing();
+  LayerImpl* root = root_layer_for_testing();
   LayerImpl* child = AddChildToRoot<LayerImpl>();
   LayerImpl* animating_surface = AddChildToRoot<LayerImpl>();
   LayerImpl* child_of_animating_surface =
@@ -4672,22 +4180,19 @@
   AddAnimatedTransformToElementWithPlayer(animating_child->element_id(),
                                           timeline_impl(), 10.0, 30, 0);
 
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(child, backface_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(animating_surface, backface_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, false, true);
-  SetLayerPropertiesForTesting(child_of_animating_surface, backface_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(animating_child, backface_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false);
+  root->SetBounds(gfx::Size(100, 100));
+  child->SetBounds(gfx::Size(100, 100));
+  child->SetTransform(backface_matrix);
+  animating_surface->SetBounds(gfx::Size(100, 100));
+  animating_surface->SetTransform(backface_matrix);
+  animating_surface->test_properties()->force_render_surface = true;
+  child_of_animating_surface->SetBounds(gfx::Size(100, 100));
+  child_of_animating_surface->SetTransform(backface_matrix);
+  animating_child->SetBounds(gfx::Size(100, 100));
+  animating_child->SetTransform(backface_matrix);
+  child2->SetBounds(gfx::Size(100, 100));
 
-  ExecuteCalculateDrawPropertiesWithPropertyTrees(parent);
+  ExecuteCalculateDrawPropertiesWithPropertyTrees(root);
 
   EXPECT_FALSE(child->has_render_surface());
   EXPECT_TRUE(animating_surface->has_render_surface());
@@ -4714,7 +4219,7 @@
   // created when it flattens its subtree, and its parent has preserves-3d.
 
   const gfx::Transform identity_matrix;
-  LayerImpl* parent = root_layer_for_testing();
+  LayerImpl* root = root_layer_for_testing();
   LayerImpl* front_facing_surface = AddChildToRoot<LayerImpl>();
   LayerImpl* back_facing_surface = AddChildToRoot<LayerImpl>();
   LayerImpl* child1 = AddChild<LayerImpl>(front_facing_surface);
@@ -4735,26 +4240,19 @@
   backface_matrix.RotateAboutYAxis(180.0);
   backface_matrix.Translate(-50.0, -50.0);
 
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), false,
-                               true);  // parent transform style is preserve3d.
-  SetLayerPropertiesForTesting(front_facing_surface, identity_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true,
-                               true);  // surface transform style is flat.
-  SetLayerPropertiesForTesting(back_facing_surface, backface_matrix,
-                               gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(100, 100), true,
-                               true);  // surface transform style is flat.
-  SetLayerPropertiesForTesting(child1, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false);
+  root->SetBounds(gfx::Size(100, 100));
+  front_facing_surface->SetBounds(gfx::Size(100, 100));
+  front_facing_surface->test_properties()->force_render_surface = true;
+  back_facing_surface->SetBounds(gfx::Size(100, 100));
+  back_facing_surface->SetTransform(backface_matrix);
+  back_facing_surface->test_properties()->force_render_surface = true;
+  child1->SetBounds(gfx::Size(100, 100));
+  child2->SetBounds(gfx::Size(100, 100));
 
   front_facing_surface->Set3dSortingContextId(1);
   back_facing_surface->Set3dSortingContextId(1);
 
-  ExecuteCalculateDrawPropertiesWithPropertyTrees(parent);
+  ExecuteCalculateDrawPropertiesWithPropertyTrees(root);
 
   // Verify which render surfaces were created and used.
   EXPECT_TRUE(front_facing_surface->has_render_surface());
@@ -4773,54 +4271,50 @@
   // Verify draw and screen space transforms of layers not in a surface.
   gfx::Transform identity_matrix;
 
-  LayerImpl* parent = root_layer_for_testing();
-  parent->SetDrawsContent(true);
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), false, true,
-                               true);
+  LayerImpl* root = root_layer_for_testing();
+  root->SetBounds(gfx::Size(100, 100));
+  root->SetDrawsContent(true);
 
   LayerImpl* child = AddChildToRoot<LayerImpl>();
+  child->SetPosition(gfx::PointF(2.f, 2.f));
+  child->SetBounds(gfx::Size(10, 10));
   child->SetDrawsContent(true);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(2.f, 2.f), gfx::Size(10, 10), false,
-                               true, false);
 
   LayerImpl* child2 = AddChildToRoot<LayerImpl>();
+  child2->SetPosition(gfx::PointF(2.f, 2.f));
+  child2->SetBounds(gfx::Size(5, 5));
   child2->SetDrawsContent(true);
-  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(2.f, 2.f), gfx::Size(5, 5), false,
-                               true, false);
 
   float device_scale_factor = 2.5f;
   gfx::Size viewport_size(100, 100);
-  ExecuteCalculateDrawProperties(parent, device_scale_factor);
+  ExecuteCalculateDrawProperties(root, device_scale_factor);
 
-  EXPECT_IDEAL_SCALE_EQ(device_scale_factor, parent);
+  EXPECT_IDEAL_SCALE_EQ(device_scale_factor, root);
   EXPECT_IDEAL_SCALE_EQ(device_scale_factor, child);
   EXPECT_IDEAL_SCALE_EQ(device_scale_factor, child2);
 
   EXPECT_EQ(1u, render_surface_layer_list_impl()->size());
 
-  // Verify parent transforms
-  gfx::Transform expected_parent_transform;
-  expected_parent_transform.Scale(device_scale_factor, device_scale_factor);
-  EXPECT_TRANSFORMATION_MATRIX_EQ(expected_parent_transform,
-                                  parent->ScreenSpaceTransform());
-  EXPECT_TRANSFORMATION_MATRIX_EQ(expected_parent_transform,
-                                  parent->DrawTransform());
+  // Verify root transforms
+  gfx::Transform expected_root_transform;
+  expected_root_transform.Scale(device_scale_factor, device_scale_factor);
+  EXPECT_TRANSFORMATION_MATRIX_EQ(expected_root_transform,
+                                  root->ScreenSpaceTransform());
+  EXPECT_TRANSFORMATION_MATRIX_EQ(expected_root_transform,
+                                  root->DrawTransform());
 
-  // Verify results of transformed parent rects
-  gfx::RectF parent_bounds(gfx::SizeF(parent->bounds()));
+  // Verify results of transformed root rects
+  gfx::RectF root_bounds(gfx::SizeF(root->bounds()));
 
-  gfx::RectF parent_draw_rect =
-      MathUtil::MapClippedRect(parent->DrawTransform(), parent_bounds);
-  gfx::RectF parent_screen_space_rect =
-      MathUtil::MapClippedRect(parent->ScreenSpaceTransform(), parent_bounds);
+  gfx::RectF root_draw_rect =
+      MathUtil::MapClippedRect(root->DrawTransform(), root_bounds);
+  gfx::RectF root_screen_space_rect =
+      MathUtil::MapClippedRect(root->ScreenSpaceTransform(), root_bounds);
 
-  gfx::RectF expected_parent_draw_rect(gfx::SizeF(parent->bounds()));
-  expected_parent_draw_rect.Scale(device_scale_factor);
-  EXPECT_FLOAT_RECT_EQ(expected_parent_draw_rect, parent_draw_rect);
-  EXPECT_FLOAT_RECT_EQ(expected_parent_draw_rect, parent_screen_space_rect);
+  gfx::RectF expected_root_draw_rect(gfx::SizeF(root->bounds()));
+  expected_root_draw_rect.Scale(device_scale_factor);
+  EXPECT_FLOAT_RECT_EQ(expected_root_draw_rect, root_draw_rect);
+  EXPECT_FLOAT_RECT_EQ(expected_root_draw_rect, root_screen_space_rect);
 
   // Verify child and child2 transforms. They should match.
   gfx::Transform expected_child_transform;
@@ -4869,33 +4363,28 @@
   scale_small_matrix.Scale(SK_MScalar1 / 10.f, SK_MScalar1 / 12.f);
 
   LayerImpl* root = root_layer_for_testing();
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), false, true,
-                               false);
+  root->SetBounds(gfx::Size(100, 100));
 
   LayerImpl* page_scale = AddChildToRoot<LayerImpl>();
-  SetLayerPropertiesForTesting(page_scale, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), false, true,
-                               false);
+  page_scale->SetBounds(gfx::Size(100, 100));
 
   LayerImpl* parent = AddChild<LayerImpl>(page_scale);
+  parent->SetBounds(gfx::Size(100, 100));
   parent->SetDrawsContent(true);
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), false, true,
-                               false);
 
   LayerImpl* perspective_surface = AddChild<LayerImpl>(parent);
-  SetLayerPropertiesForTesting(perspective_surface,
-                               perspective_matrix * scale_small_matrix,
-                               gfx::Point3F(), gfx::PointF(2.f, 2.f),
-                               gfx::Size(10, 10), false, true, true);
+  perspective_surface->SetPosition(gfx::PointF(2.f, 2.f));
+  perspective_surface->SetBounds(gfx::Size(10, 10));
+  perspective_surface->SetTransform(perspective_matrix * scale_small_matrix);
   perspective_surface->SetDrawsContent(true);
+  perspective_surface->test_properties()->force_render_surface = true;
 
   LayerImpl* scale_surface = AddChild<LayerImpl>(parent);
-  SetLayerPropertiesForTesting(scale_surface, scale_small_matrix,
-                               gfx::Point3F(), gfx::PointF(2.f, 2.f),
-                               gfx::Size(10, 10), false, true, true);
+  scale_surface->SetPosition(gfx::PointF(2.f, 2.f));
+  scale_surface->SetBounds(gfx::Size(10, 10));
+  scale_surface->SetTransform(scale_small_matrix);
   scale_surface->SetDrawsContent(true);
+  scale_surface->test_properties()->force_render_surface = true;
 
   float device_scale_factor = 2.5f;
   float page_scale_factor = 3.f;
@@ -4975,16 +4464,15 @@
   root->SetBounds(gfx::Size(100, 100));
 
   LayerImpl* parent = AddChildToRoot<LayerImpl>();
+  parent->SetBounds(gfx::Size(100, 100));
+  parent->SetTransform(parent_scale_matrix);
   parent->SetDrawsContent(true);
-  SetLayerPropertiesForTesting(parent, parent_scale_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), false, true,
-                               false);
 
   LayerImpl* child_scale = AddChild<LayerImpl>(parent);
+  child_scale->SetPosition(gfx::PointF(2.f, 2.f));
+  child_scale->SetBounds(gfx::Size(10, 10));
+  child_scale->SetTransform(child_scale_matrix);
   child_scale->SetDrawsContent(true);
-  SetLayerPropertiesForTesting(child_scale, child_scale_matrix, gfx::Point3F(),
-                               gfx::PointF(2.f, 2.f), gfx::Size(10, 10), false,
-                               true, false);
 
   float device_scale_factor = 2.5f;
   float page_scale_factor = 0.01f;
@@ -5019,51 +4507,48 @@
   root->SetBounds(gfx::Size(100, 100));
 
   LayerImpl* parent = AddChildToRoot<LayerImpl>();
+  parent->SetBounds(gfx::Size(100, 100));
+  parent->SetTransform(parent_scale_matrix);
   parent->SetDrawsContent(true);
-  SetLayerPropertiesForTesting(parent, parent_scale_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), false, true,
-                               false);
 
   LayerImpl* child_scale = AddChild<LayerImpl>(parent);
+  child_scale->SetBounds(gfx::Size(10, 10));
+  child_scale->SetPosition(gfx::PointF(2.f, 2.f));
+  child_scale->SetTransform(child_scale_matrix);
   child_scale->SetDrawsContent(true);
-  SetLayerPropertiesForTesting(child_scale, child_scale_matrix, gfx::Point3F(),
-                               gfx::PointF(2.f, 2.f), gfx::Size(10, 10), false,
-                               true, false);
 
-  {
-    ExecuteCalculateDrawProperties(root);
+  ExecuteCalculateDrawProperties(root);
 
-    EXPECT_IDEAL_SCALE_EQ(initial_parent_scale, parent);
-    // Animating layers compute ideal scale in the same way as when
-    // they are static.
-    EXPECT_IDEAL_SCALE_EQ(initial_child_scale * initial_parent_scale,
-                          child_scale);
-  }
+  EXPECT_IDEAL_SCALE_EQ(initial_parent_scale, parent);
+  // Animating layers compute ideal scale in the same way as when
+  // they are static.
+  EXPECT_IDEAL_SCALE_EQ(initial_child_scale * initial_parent_scale,
+                        child_scale);
 }
 
 TEST_F(LayerTreeHostCommonTest, RenderSurfaceTransformsInHighDPI) {
   gfx::Transform identity_matrix;
 
   LayerImpl* parent = root_layer_for_testing();
+  parent->SetBounds(gfx::Size(30, 30));
   parent->SetDrawsContent(true);
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(30, 30), false, true,
-                               true);
+  parent->Set3dSortingContextId(1);
+  parent->test_properties()->should_flatten_transform = false;
 
   LayerImpl* child = AddChildToRoot<LayerImpl>();
+  child->SetBounds(gfx::Size(10, 10));
+  child->SetPosition(gfx::PointF(2.f, 2.f));
   child->SetDrawsContent(true);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(2.f, 2.f), gfx::Size(10, 10), false,
-                               true, true);
+  child->test_properties()->force_render_surface = true;
 
   gfx::Transform replica_transform;
   replica_transform.Scale(1.0, -1.0);
 
   std::unique_ptr<LayerImpl> replica =
       LayerImpl::Create(host_impl()->active_tree(), 7);
-  SetLayerPropertiesForTesting(replica.get(), replica_transform, gfx::Point3F(),
-                               gfx::PointF(2.f, 2.f), gfx::Size(10, 10), false,
-                               true, false);
+  replica->SetPosition(gfx::PointF(2.f, 2.f));
+  replica->SetTransform(replica_transform);
+
   // We need to set parent on replica layer for property tree building.
   replica->test_properties()->parent = child;
   child->test_properties()->SetReplicaLayer(std::move(replica));
@@ -5071,10 +4556,8 @@
   // This layer should end up in the same surface as child, with the same draw
   // and screen space transforms.
   LayerImpl* duplicate_child_non_owner = AddChild<LayerImpl>(child);
+  duplicate_child_non_owner->SetBounds(gfx::Size(10, 10));
   duplicate_child_non_owner->SetDrawsContent(true);
-  SetLayerPropertiesForTesting(duplicate_child_non_owner, identity_matrix,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(10, 10),
-                               false, true, false);
 
   float device_scale_factor = 1.5f;
   ExecuteCalculateDrawProperties(parent, device_scale_factor);
@@ -5159,24 +4642,19 @@
   gfx::Transform identity_matrix;
 
   LayerImpl* parent = root_layer_for_testing();
+  parent->SetBounds(gfx::Size(33, 31));
   parent->SetDrawsContent(true);
-  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(33, 31), false, true,
-                               true);
 
   LayerImpl* child = AddChildToRoot<LayerImpl>();
+  child->SetBounds(gfx::Size(13, 11));
   child->SetDrawsContent(true);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(13, 11), false, true,
-                               true);
+  child->test_properties()->force_render_surface = true;
 
   gfx::Transform replica_transform;
   replica_transform.Scale(1.0, -1.0);
   std::unique_ptr<LayerImpl> replica =
       LayerImpl::Create(host_impl()->active_tree(), 7);
-  SetLayerPropertiesForTesting(replica.get(), replica_transform, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(13, 11), false, true,
-                               false);
+  replica->SetTransform(replica_transform);
   child->test_properties()->SetReplicaLayer(std::move(replica));
 
   float device_scale_factor = 1.7f;
@@ -5234,20 +4712,13 @@
   LayerImpl* root = root_layer_for_testing();
   LayerImpl* child = AddChild<LayerImpl>(root);
   LayerImpl* grand_child = AddChild<LayerImpl>(child);
-  grand_child->SetDrawsContent(true);
 
-  const gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false);
-  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false);
-  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(10, 10), true, false);
-
+  root->SetBounds(gfx::Size(100, 100));
+  child->SetBounds(gfx::Size(10, 10));
   child->test_properties()->opacity = 0.5f;
-
+  grand_child->SetBounds(gfx::Size(10, 10));
+  grand_child->SetDrawsContent(true);
   ExecuteCalculateDrawProperties(root);
-
   EXPECT_FALSE(child->has_render_surface());
 }
 
@@ -5260,18 +4731,12 @@
   host_impl.CreatePendingTree();
   std::unique_ptr<LayerImpl> root =
       LayerImpl::Create(host_impl.pending_tree(), 1);
-
-  const gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               false);
+  root->SetBounds(gfx::Size(100, 100));
   root->SetDrawsContent(true);
 
   std::unique_ptr<LayerImpl> child =
       LayerImpl::Create(host_impl.pending_tree(), 2);
-  SetLayerPropertiesForTesting(child.get(), identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(50, 50), true, false,
-                               false);
+  child->SetBounds(gfx::Size(50, 50));
   child->SetDrawsContent(true);
   child->test_properties()->opacity = 0.0f;
 
@@ -5416,15 +4881,12 @@
     grand_child_->SetDrawsContent(true);
 
     gfx::Transform identity_matrix;
-    SetLayerPropertiesForTesting(root_, identity_matrix, gfx::Point3F(),
-                                 gfx::PointF(), gfx::Size(1, 1), true, false,
-                                 true);
-    SetLayerPropertiesForTesting(child_, identity_matrix, gfx::Point3F(),
-                                 gfx::PointF(), gfx::Size(1, 1), true, false,
-                                 std::tr1::get<2>(GetParam()));
-    SetLayerPropertiesForTesting(grand_child_, identity_matrix, gfx::Point3F(),
-                                 gfx::PointF(), gfx::Size(1, 1), true, false,
-                                 false);
+    root_->SetBounds(gfx::Size(1, 1));
+    child_->SetBounds(gfx::Size(1, 1));
+    grand_child_->SetBounds(gfx::Size(1, 1));
+
+    child_->test_properties()->force_render_surface =
+        std::tr1::get<2>(GetParam());
   }
 
   bool can_use_lcd_text_;
@@ -5599,24 +5061,18 @@
 
   std::unique_ptr<LayerImpl> root =
       LayerImpl::Create(host_impl.pending_tree(), 1);
-  LayerImpl* root_layer = root.get();
-  SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(50, 50), true, false,
-                               false);
+  root->SetBounds(gfx::Size(50, 50));
   root->SetDrawsContent(true);
+  LayerImpl* root_layer = root.get();
 
   std::unique_ptr<LayerImpl> child =
       LayerImpl::Create(host_impl.pending_tree(), 2);
-  SetLayerPropertiesForTesting(child.get(), identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(40, 40), true, false,
-                               false);
+  child->SetBounds(gfx::Size(40, 40));
   child->SetDrawsContent(true);
 
   std::unique_ptr<LayerImpl> grand_child =
       LayerImpl::Create(host_impl.pending_tree(), 3);
-  SetLayerPropertiesForTesting(grand_child.get(), identity_matrix,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(30, 30),
-                               true, false, false);
+  grand_child->SetBounds(gfx::Size(30, 30));
   grand_child->SetDrawsContent(true);
   grand_child->test_properties()->hide_layer_and_subtree = true;
 
@@ -5650,25 +5106,19 @@
 
   std::unique_ptr<LayerImpl> root =
       LayerImpl::Create(host_impl.pending_tree(), 1);
-  SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(50, 50), true, false,
-                               true);
+  root->SetBounds(gfx::Size(50, 50));
   root->SetDrawsContent(true);
   LayerImpl* root_layer = root.get();
 
   std::unique_ptr<LayerImpl> child =
       LayerImpl::Create(host_impl.pending_tree(), 2);
-  SetLayerPropertiesForTesting(child.get(), identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(40, 40), true, false,
-                               false);
+  child->SetBounds(gfx::Size(40, 40));
   child->SetDrawsContent(true);
   child->test_properties()->hide_layer_and_subtree = true;
 
   std::unique_ptr<LayerImpl> grand_child =
       LayerImpl::Create(host_impl.pending_tree(), 3);
-  SetLayerPropertiesForTesting(grand_child.get(), identity_matrix,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(30, 30),
-                               true, false, false);
+  grand_child->SetBounds(gfx::Size(30, 30));
   grand_child->SetDrawsContent(true);
 
   child->test_properties()->AddChild(std::move(grand_child));
@@ -5701,66 +5151,52 @@
 
   std::unique_ptr<LayerImpl> root =
       LayerImpl::Create(host_impl.pending_tree(), 1);
-  SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(50, 50), true, false,
-                               true);
+  root->SetBounds(gfx::Size(50, 50));
   root->SetDrawsContent(true);
   LayerImpl* root_layer = root.get();
 
   std::unique_ptr<LayerImpl> copy_grand_parent =
       LayerImpl::Create(host_impl.pending_tree(), 2);
-  SetLayerPropertiesForTesting(copy_grand_parent.get(), identity_matrix,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(40, 40),
-                               true, false, false);
+  copy_grand_parent->SetBounds(gfx::Size(40, 40));
   copy_grand_parent->SetDrawsContent(true);
   LayerImpl* copy_grand_parent_layer = copy_grand_parent.get();
 
   std::unique_ptr<LayerImpl> copy_parent =
       LayerImpl::Create(host_impl.pending_tree(), 3);
-  SetLayerPropertiesForTesting(copy_parent.get(), identity_matrix,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(30, 30),
-                               true, false, true);
+  copy_parent->SetBounds(gfx::Size(30, 30));
   copy_parent->SetDrawsContent(true);
+  copy_parent->test_properties()->force_render_surface = true;
   LayerImpl* copy_parent_layer = copy_parent.get();
 
   std::unique_ptr<LayerImpl> copy_request =
       LayerImpl::Create(host_impl.pending_tree(), 4);
-  SetLayerPropertiesForTesting(copy_request.get(), identity_matrix,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(20, 20),
-                               true, false, true);
+  copy_request->SetBounds(gfx::Size(20, 20));
   copy_request->SetDrawsContent(true);
+  copy_request->test_properties()->force_render_surface = true;
   LayerImpl* copy_layer = copy_request.get();
 
   std::unique_ptr<LayerImpl> copy_child =
       LayerImpl::Create(host_impl.pending_tree(), 5);
-  SetLayerPropertiesForTesting(copy_child.get(), identity_matrix,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(20, 20),
-                               true, false, false);
+  copy_child->SetBounds(gfx::Size(20, 20));
   copy_child->SetDrawsContent(true);
   LayerImpl* copy_child_layer = copy_child.get();
 
   std::unique_ptr<LayerImpl> copy_grand_child =
       LayerImpl::Create(host_impl.pending_tree(), 6);
-  SetLayerPropertiesForTesting(copy_grand_child.get(), identity_matrix,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(20, 20),
-                               true, false, false);
-  copy_child->SetDrawsContent(true);
+  copy_grand_child->SetBounds(gfx::Size(20, 20));
+  copy_grand_child->SetDrawsContent(true);
   LayerImpl* copy_grand_child_layer = copy_grand_child.get();
 
   std::unique_ptr<LayerImpl> copy_grand_parent_sibling_before =
       LayerImpl::Create(host_impl.pending_tree(), 7);
-  SetLayerPropertiesForTesting(copy_grand_parent_sibling_before.get(),
-                               identity_matrix, gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(40, 40), true, false, false);
+  copy_grand_parent_sibling_before->SetBounds(gfx::Size(40, 40));
   copy_grand_parent_sibling_before->SetDrawsContent(true);
   LayerImpl* copy_grand_parent_sibling_before_layer =
       copy_grand_parent_sibling_before.get();
 
   std::unique_ptr<LayerImpl> copy_grand_parent_sibling_after =
       LayerImpl::Create(host_impl.pending_tree(), 8);
-  SetLayerPropertiesForTesting(copy_grand_parent_sibling_after.get(),
-                               identity_matrix, gfx::Point3F(), gfx::PointF(),
-                               gfx::Size(40, 40), true, false, false);
+  copy_grand_parent_sibling_after->SetBounds(gfx::Size(40, 40));
   copy_grand_parent_sibling_after->SetDrawsContent(true);
   LayerImpl* copy_grand_parent_sibling_after_layer =
       copy_grand_parent_sibling_after.get();
@@ -5862,31 +5298,23 @@
 
   std::unique_ptr<LayerImpl> root =
       LayerImpl::Create(host_impl.pending_tree(), 1);
-  SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(50, 50), true, false,
-                               true);
+  root->SetBounds(gfx::Size(50, 50));
   root->SetDrawsContent(true);
 
   std::unique_ptr<LayerImpl> copy_parent =
       LayerImpl::Create(host_impl.pending_tree(), 2);
-  SetLayerPropertiesForTesting(copy_parent.get(), identity_matrix,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(), true,
-                               false, false);
   copy_parent->SetDrawsContent(true);
   copy_parent->SetMasksToBounds(true);
 
   std::unique_ptr<LayerImpl> copy_layer =
       LayerImpl::Create(host_impl.pending_tree(), 3);
-  SetLayerPropertiesForTesting(copy_layer.get(), identity_matrix,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(30, 30),
-                               true, false, true);
+  copy_layer->SetBounds(gfx::Size(30, 30));
   copy_layer->SetDrawsContent(true);
+  copy_layer->test_properties()->force_render_surface = true;
 
   std::unique_ptr<LayerImpl> copy_child =
       LayerImpl::Create(host_impl.pending_tree(), 4);
-  SetLayerPropertiesForTesting(copy_child.get(), identity_matrix,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(20, 20),
-                               true, false, false);
+  copy_child->SetBounds(gfx::Size(20, 20));
   copy_child->SetDrawsContent(true);
 
   copy_layer->test_properties()->copy_requests.push_back(
@@ -5919,41 +5347,34 @@
   const gfx::Transform identity_matrix;
 
   LayerImpl* root = root_layer_for_testing();
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(50, 50), true, false,
-                               true);
+  root->SetBounds(gfx::Size(50, 50));
   root->SetDrawsContent(true);
   root->SetMasksToBounds(true);
 
   LayerImpl* copy_layer = AddChild<LayerImpl>(root);
-  SetLayerPropertiesForTesting(copy_layer, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(100, 100), true, false,
-                               true);
+  copy_layer->SetBounds(gfx::Size(100, 100));
   copy_layer->SetDrawsContent(true);
+  copy_layer->test_properties()->force_render_surface = true;
 
   LayerImpl* copy_child = AddChild<LayerImpl>(copy_layer);
-  SetLayerPropertiesForTesting(copy_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(40, 40), gfx::Size(20, 20), true,
-                               false, false);
+  copy_child->SetPosition(gfx::PointF(40.f, 40.f));
+  copy_child->SetBounds(gfx::Size(20, 20));
   copy_child->SetDrawsContent(true);
 
   LayerImpl* copy_clip = AddChild<LayerImpl>(copy_layer);
-  SetLayerPropertiesForTesting(copy_clip, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(55, 55), true, false,
-                               false);
+  copy_clip->SetBounds(gfx::Size(55, 55));
   copy_clip->SetMasksToBounds(true);
 
   LayerImpl* copy_clipped_child = AddChild<LayerImpl>(copy_clip);
-  SetLayerPropertiesForTesting(copy_clipped_child, identity_matrix,
-                               gfx::Point3F(), gfx::PointF(40, 40),
-                               gfx::Size(20, 20), true, false, false);
+  copy_clipped_child->SetPosition(gfx::PointF(40.f, 40.f));
+  copy_clipped_child->SetBounds(gfx::Size(20, 20));
   copy_clipped_child->SetDrawsContent(true);
 
   LayerImpl* copy_surface = AddChild<LayerImpl>(copy_clip);
-  SetLayerPropertiesForTesting(copy_surface, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(45, 45), gfx::Size(20, 20), true,
-                               false, true);
+  copy_surface->SetPosition(gfx::PointF(45.f, 45.f));
+  copy_surface->SetBounds(gfx::Size(20, 20));
   copy_surface->SetDrawsContent(true);
+  copy_surface->test_properties()->force_render_surface = true;
 
   copy_layer->test_properties()->copy_requests.push_back(
       CopyOutputRequest::CreateRequest(base::Bind(&EmptyCopyOutputCallback)));
@@ -6003,19 +5424,12 @@
   LayerImpl* surface = AddChild<LayerImpl>(root);
   LayerImpl* surface_child = AddChild<LayerImpl>(surface);
 
-  const gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(50, 50), true, false,
-                               true);
-  SetLayerPropertiesForTesting(surface, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(-10, 20), gfx::Size(), true, false,
-                               true);
-  SetLayerPropertiesForTesting(surface_child, identity_matrix, gfx::Point3F(),
-                               gfx::PointF(), gfx::Size(50, 50), true, false,
-                               false);
+  root->SetBounds(gfx::Size(50, 50));
   root->SetDrawsContent(true);
+  surface->SetPosition(gfx::PointF(-10, 20));
+  surface->test_properties()->force_render_surface = true;
+  surface_child->SetBounds(gfx::Size(50, 50));
   surface_child->SetDrawsContent(true);
-
   ExecuteCalculateDrawProperties(root);
 
   // The visible_layer_rect for the |surface_child| should not be clipped by
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index 2904658..7c4adcb8 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -1005,7 +1005,7 @@
               it->render_surface()->TransformTreeIndex(),
               occlusion_surface->EffectTreeIndex(), &draw_transform);
           // We don't have to apply surface contents scale when target is root.
-          if (occlusion_surface->TransformTreeIndex() != 0) {
+          if (occlusion_surface->EffectTreeIndex() != 1) {
             const EffectNode* occlusion_effect_node =
                 property_trees()->effect_tree.Node(
                     occlusion_surface->EffectTreeIndex());
diff --git a/cc/trees/occlusion_tracker.cc b/cc/trees/occlusion_tracker.cc
index 3b69c68..ad2f1a8 100644
--- a/cc/trees/occlusion_tracker.cc
+++ b/cc/trees/occlusion_tracker.cc
@@ -350,8 +350,9 @@
   if (layer->draw_opacity() < 1)
     return;
 
-  if (!layer->uses_default_blend_mode())
-    return;
+  // The only currently supported draw_blend_mode is SrcOver mode, so
+  // draw_blend_mode does not affect occlusion.
+  DCHECK_EQ(layer->draw_blend_mode(), SkXfermode::kSrcOver_Mode);
 
   if (layer->Is3dSorted())
     return;
diff --git a/cc/trees/occlusion_tracker_unittest.cc b/cc/trees/occlusion_tracker_unittest.cc
index 709b880..d817c55 100644
--- a/cc/trees/occlusion_tracker_unittest.cc
+++ b/cc/trees/occlusion_tracker_unittest.cc
@@ -1986,10 +1986,13 @@
     EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty());
 
     this->VisitLayer(blend_mode_layer, &occlusion);
-    // |top_layer| occludes but not |blend_mode_layer|.
+    // |top_layer| and |blend_mode_layer| both occlude, since the blend mode
+    // gets applied by blend_mode_layer's render surface, not when drawing the
+    // layer itself.
+    EXPECT_EQ(gfx::Rect(100, 100).ToString(),
+              occlusion.occlusion_from_inside_target().ToString());
     EXPECT_EQ(gfx::Rect(10, 12, 20, 22).ToString(),
               occlusion.occlusion_from_outside_target().ToString());
-    EXPECT_TRUE(occlusion.occlusion_from_inside_target().IsEmpty());
 
     this->VisitContributingSurface(blend_mode_layer, &occlusion);
     // |top_layer| occludes but not |blend_mode_layer|.
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc
index 1176007..cae3c1f4 100644
--- a/cc/trees/property_tree.cc
+++ b/cc/trees/property_tree.cc
@@ -898,7 +898,7 @@
     gfx::Transform transform;
     property_trees()->transform_tree.ComputeTransform(source_id, destination_id,
                                                       &transform);
-    if (destination_id != 0) {
+    if (effect_node->id != 1) {
       transform.matrix().postScale(effect_node->surface_contents_scale.x(),
                                    effect_node->surface_contents_scale.y(),
                                    1.f);
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
index ee1ff08..8b3ab7af 100644
--- a/chrome/BUILD.gn
+++ b/chrome/BUILD.gn
@@ -622,6 +622,10 @@
     public_deps = [
       ":chrome_helper_app",
 
+      # Before bundling the versioned app components, delete any existing
+      # versions.
+      ":clean_up_old_versions",
+
       # keystone_registration_framework copies the framework into the framework
       # bundle via a script that performs additional actions, rather than
       # relying on a bundle_data to copy it.
@@ -633,6 +637,18 @@
     ]
   }
 
+  action("clean_up_old_versions") {
+    script = "//chrome/tools/build/mac/clean_up_old_versions.py"
+    outputs = [
+      "$root_gen_dir/run_$target_name.stamp",
+    ]
+    args = [
+             rebase_path("$root_out_dir/$chrome_product_full_name.app",
+                         root_build_dir),
+             "$chrome_version_full",
+           ] + rebase_path(outputs, root_build_dir)
+  }
+
   tweak_info_plist("chrome_helper_plist") {
     info_plist = "app/helper-Info.plist"
     args = [
diff --git a/chrome/VERSION b/chrome/VERSION
index ba18a3d..80bd1fb 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=54
 MINOR=0
-BUILD=2808
+BUILD=2809
 PATCH=0
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
index 295d3dd..a0b5f74 100644
--- a/chrome/android/java/AndroidManifest.xml
+++ b/chrome/android/java/AndroidManifest.xml
@@ -212,9 +212,9 @@
             </intent-filter>
             <meta-data android:name="android.app.searchable"
                 android:resource="@xml/searchable" />
-            {% if target_sdk_version == 'NMR1' %}
+            {% if target_sdk_version|int > 24 %}
             <meta-data android:name="android.app.shortcuts"
-                android:resource="@xml/launchershortcuts"/>
+                android:resource="@xml/launchershortcuts" />
             {% endif %}
 
         </activity-alias>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java
index 7992cf9..b764dd9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java
@@ -141,6 +141,11 @@
                 new SpanInfo("<link>", "</link>",
                         new BluetoothClickableSpan(LinkType.EXPLAIN_BLUETOOTH, mActivity)));
 
+        SpannableString statusActive = SpanApplier.applySpans(
+                mActivity.getString(R.string.bluetooth_not_seeing_it),
+                new SpanInfo("<link>", "</link>",
+                        new BluetoothClickableSpan(LinkType.EXPLAIN_BLUETOOTH, mActivity)));
+
         SpannableString statusIdleSomeFound = SpanApplier.applySpans(
                 mActivity.getString(R.string.bluetooth_not_seeing_it_idle_some_found),
                 new SpanInfo("<link1>", "</link1>",
@@ -149,7 +154,7 @@
                         new BluetoothClickableSpan(LinkType.RESTART_SEARCH, mActivity)));
 
         ItemChooserDialog.ItemChooserLabels labels =
-                new ItemChooserDialog.ItemChooserLabels(title, searching, noneFound,
+                new ItemChooserDialog.ItemChooserLabels(title, searching, noneFound, statusActive,
                         statusIdleNoneFound, statusIdleSomeFound, positiveButton);
         mItemChooserDialog = new ItemChooserDialog(mActivity, this, labels);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
index 1c9be71..a415606 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -963,7 +963,7 @@
                     @Override
                     public void onFinishGetBitmap(Bitmap bitmap, int response) {
                         // Check whether this page is an offline page, and use its online URL if so.
-                        String url = currentTab.getOfflinePageOriginalUrl();
+                        String url = currentTab.getOriginalUrl();
                         RecordHistogram.recordBooleanHistogram(
                                 "OfflinePages.SharedPageWasOffline", url != null);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index 67a5265..9dcd3e2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -714,6 +714,8 @@
                 TabOpenType tabOpenType, String externalAppId, int tabIdToBringToFront,
                 boolean hasUserGesture, Intent intent) {
             TabModel tabModel = getCurrentTabModel();
+            boolean fromLauncherShortcut = IntentUtils.safeGetBooleanExtra(
+                    intent, IntentHandler.EXTRA_INVOKED_FROM_SHORTCUT, false);
             switch (tabOpenType) {
                 case REUSE_URL_MATCHING_TAB_ELSE_NEW_TAB:
                     // Used by the bookmarks application.
@@ -778,10 +780,12 @@
                     openNewTab(url, referer, headers, externalAppId, intent, false);
                     break;
                 case OPEN_NEW_TAB:
+                    if (fromLauncherShortcut) recordLauncherShortcutAction(false);
                     openNewTab(url, referer, headers, externalAppId, intent, true);
                     break;
                 case OPEN_NEW_INCOGNITO_TAB:
                     if (url == null || url.equals(UrlConstants.NTP_URL)) {
+                        if (fromLauncherShortcut) recordLauncherShortcutAction(true);
                         if (TextUtils.equals(externalAppId, getPackageName())) {
                             // Used by the Account management screen to open a new incognito tab.
                             // Account management screen collects its metrics separately.
@@ -1112,6 +1116,14 @@
                 action, BACK_PRESSED_COUNT);
     }
 
+    private void recordLauncherShortcutAction(boolean isIncognito) {
+        if (isIncognito) {
+            RecordUserAction.record("Android.LauncherShortcut.NewIncognitoTab");
+        } else {
+            RecordUserAction.record("Android.LauncherShortcut.NewTab");
+        }
+    }
+
     private void moveTabToOtherWindow(Tab tab) {
         Class<? extends Activity> targetActivity =
                 MultiWindowUtils.getInstance().getOpenInOtherWindowActivity(this);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
index 44cc6694..b250f78c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
@@ -110,6 +110,12 @@
     public static final String EXTRA_INVOKED_FROM_FRE = "com.android.chrome.invoked_from_fre";
 
     /**
+     * An extra to indicate that the intent was triggered from a launcher shortcut.
+     */
+    public static final String EXTRA_INVOKED_FROM_SHORTCUT =
+            "com.android.chrome.invoked_from_shortcut";
+
+    /**
      * Intent extra used to identify the sending application.
      */
     private static final String TRUSTED_APPLICATION_CODE_EXTRA = "trusted_application_code_extra";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java
index 76656307..934bb24 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java
@@ -95,6 +95,9 @@
         public final CharSequence searching;
         // The message to show when no results were produced.
         public final CharSequence noneFound;
+        // A status message to show above the button row after an item has
+        // been added and discovery is still ongoing.
+        public final CharSequence statusActive;
         // A status message to show above the button row after discovery has
         // stopped and no devices have been found.
         public final CharSequence statusIdleNoneFound;
@@ -105,11 +108,12 @@
         public final CharSequence positiveButton;
 
         public ItemChooserLabels(CharSequence title, CharSequence searching, CharSequence noneFound,
-                CharSequence statusIdleNoneFound, CharSequence statusIdleSomeFound,
-                CharSequence positiveButton) {
+                CharSequence statusActive, CharSequence statusIdleNoneFound,
+                CharSequence statusIdleSomeFound, CharSequence positiveButton) {
             this.title = title;
             this.searching = searching;
             this.noneFound = noneFound;
+            this.statusActive = statusActive;
             this.statusIdleNoneFound = statusIdleNoneFound;
             this.statusIdleSomeFound = statusIdleSomeFound;
             this.positiveButton = positiveButton;
@@ -119,7 +123,7 @@
     /**
      * The various states the dialog can represent.
      */
-    private enum State { STARTING, DISCOVERY_IDLE }
+    private enum State { STARTING, PROGRESS_UPDATE_AVAILABLE, DISCOVERY_IDLE }
 
     /**
      * An adapter for keeping track of which items to show in the dialog.
@@ -181,6 +185,8 @@
         @Override
         public void clear() {
             mSelectedItem = ListView.INVALID_POSITION;
+            mDisabledEntries.clear();
+            mItemDescriptionMap.clear();
             mConfirmButton.setEnabled(false);
             super.clear();
         }
@@ -415,7 +421,7 @@
     public void addItemToList(ItemChooserRow item) {
         mProgressBar.setVisibility(View.GONE);
         mItemAdapter.add(item);
-        setState(State.DISCOVERY_IDLE);
+        setState(State.PROGRESS_UPDATE_AVAILABLE);
     }
 
     /**
@@ -472,6 +478,11 @@
                 mProgressBar.setVisibility(View.VISIBLE);
                 mEmptyMessage.setVisibility(View.GONE);
                 break;
+            case PROGRESS_UPDATE_AVAILABLE:
+                mStatus.setText(mLabels.statusActive);
+                mProgressBar.setVisibility(View.GONE);
+                mListView.setVisibility(View.VISIBLE);
+                break;
             case DISCOVERY_IDLE:
                 boolean showEmptyMessage = mItemAdapter.isEmpty();
                 mStatus.setText(showEmptyMessage
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/LauncherShortcutActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/LauncherShortcutActivity.java
index 5c41da7dd..f1fb3e7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/LauncherShortcutActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/LauncherShortcutActivity.java
@@ -37,6 +37,7 @@
         newIntent.setAction(Intent.ACTION_VIEW);
         newIntent.setData(Uri.parse(UrlConstants.NTP_URL));
         newIntent.setClass(this, ChromeLauncherActivity.class);
+        newIntent.putExtra(IntentHandler.EXTRA_INVOKED_FROM_SHORTCUT, true);
         IntentHandler.addTrustedIntentExtras(newIntent, this);
 
         if (intentAction.equals(ACTION_OPEN_NEW_INCOGNITO_TAB)) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/UsbChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/UsbChooserDialog.java
index 6513cd9..9aafe06 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/UsbChooserDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/UsbChooserDialog.java
@@ -67,7 +67,7 @@
 
         String searching = "";
         String noneFound = activity.getString(R.string.usb_chooser_dialog_no_devices_found_prompt);
-        SpannableString statusIdleNoneFound =
+        SpannableString statusActive =
                 SpanApplier.applySpans(
                         activity.getString(R.string.usb_chooser_dialog_footnote_text),
                         new SpanInfo("<link>", "</link>", new NoUnderlineClickableSpan() {
@@ -83,11 +83,12 @@
                                 view.invalidate();
                             }
                         }));
-        SpannableString statusIdleSomeFound = statusIdleNoneFound;
+        SpannableString statusIdleNoneFound = statusActive;
+        SpannableString statusIdleSomeFound = statusActive;
         String positiveButton = activity.getString(R.string.usb_chooser_dialog_connect_button_text);
 
         ItemChooserDialog.ItemChooserLabels labels =
-                new ItemChooserDialog.ItemChooserLabels(title, searching, noneFound,
+                new ItemChooserDialog.ItemChooserLabels(title, searching, noneFound, statusActive,
                         statusIdleNoneFound, statusIdleSomeFound, positiveButton);
         mItemChooserDialog = new ItemChooserDialog(activity, this, labels);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java
index 1f607eff..ad336a5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java
@@ -33,7 +33,6 @@
 import org.chromium.chrome.browser.util.IntentUtils;
 import org.chromium.components.bookmarks.BookmarkId;
 import org.chromium.components.bookmarks.BookmarkType;
-import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
 import org.chromium.ui.base.DeviceFormFactor;
 
 /**
@@ -71,7 +70,7 @@
             parent = bookmarkModel.getDefaultFolder();
         }
 
-        String url = DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl(tab.getUrl());
+        String url = tab.getOriginalUrl();
         BookmarkId bookmarkId = bookmarkModel.addBookmark(parent,
                 bookmarkModel.getChildCount(parent), tab.getTitle(), url);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java
index 375ede60..882111f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java
@@ -145,7 +145,6 @@
                 .setTimeRemainingInMillis(timeRemainingInMs)
                 .setHasUserGesture(hasUserGesture)
                 .setIsPaused(isPaused)
-                .setIsResumable(!isOffTheRecord)
                 .setIsOffTheRecord(isOffTheRecord)
                 .build();
         sDownloadNotificationService.onDownloadUpdated(downloadInfo);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
index be8f535..7232dbb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
@@ -117,7 +117,6 @@
 
     private final LongSparseArray<DownloadItem> mSystemDownloadIdMap =
             new LongSparseArray<DownloadItem>();
-    // Using vector for thread safety.
     @VisibleForTesting protected final List<String> mAutoResumableDownloadIds =
             new ArrayList<String>();
     private final List<DownloadUmaStatsEntry> mUmaEntries = new ArrayList<DownloadUmaStatsEntry>();
@@ -556,16 +555,14 @@
                     }
                     break;
                 case DOWNLOAD_STATUS_FAILED:
-                    mDownloadNotifier.notifyDownloadFailed(info);
                     downloadItems.add(item);
+                    mDownloadNotifier.notifyDownloadFailed(info);
                     Log.w(TAG, "Download failed: " + info.getFilePath());
                     break;
                 case DOWNLOAD_STATUS_IN_PROGRESS:
                     if (info.isPaused()) {
-                        mDownloadNotifier.notifyDownloadPaused(info, false);
-                        if (info.isResumable()) {
-                            recordDownloadResumption(UMA_DOWNLOAD_RESUMPTION_MANUAL_PAUSE);
-                        }
+                        mDownloadNotifier.notifyDownloadPaused(info);
+                        recordDownloadResumption(UMA_DOWNLOAD_RESUMPTION_MANUAL_PAUSE);
                     } else {
                         mDownloadNotifier.notifyDownloadProgress(info,
                                 progress.mStartTimeInMillis, progress.mCanDownloadWhileMetered);
@@ -575,7 +572,7 @@
                     mDownloadNotifier.notifyDownloadCanceled(item.getId());
                     break;
                 case DOWNLOAD_STATUS_INTERRUPTED:
-                    mDownloadNotifier.notifyDownloadPaused(info, progress.mIsAutoResumable);
+                    mDownloadNotifier.notifyDownloadInterrupted(info, progress.mIsAutoResumable);
                     break;
                 default:
                     assert false;
@@ -1104,18 +1101,18 @@
                 progress.mCanDownloadWhileMetered = isActiveNetworkMetered(mContext);
             }
         }
-        nativeResumeDownload(getNativeDownloadManagerService(), item.getId());
+        nativeResumeDownload(getNativeDownloadManagerService(), item.getId(),
+                item.getDownloadInfo().isOffTheRecord());
     }
 
     /**
      * Called to cancel a download.
      * @param downloadGuid GUID of the download.
+     * @param isOffTheRecord Whether the download is off the record.
      * @param isNotificationDismissed Whether cancel is caused by dismissing the notification.
      */
-    void cancelDownload(String downloadGuid, boolean isNotificationDismissed) {
-        DownloadProgress progress = mDownloadProgressMap.get(downloadGuid);
-        boolean isOffTheRecord = progress == null
-                ? false : progress.mDownloadItem.getDownloadInfo().isOffTheRecord();
+    void cancelDownload(String downloadGuid, boolean isOffTheRecord,
+            boolean isNotificationDismissed) {
         nativeCancelDownload(getNativeDownloadManagerService(), downloadGuid, isOffTheRecord,
                 isNotificationDismissed);
         recordDownloadFinishedUMA(DOWNLOAD_STATUS_CANCELLED, downloadGuid, 0);
@@ -1124,9 +1121,10 @@
     /**
      * Called to pause a download.
      * @param downloadGuid GUID of the download.
+     * @param isOffTheRecord Whether the download is off the record.
      */
-    void pauseDownload(String downloadGuid) {
-        nativePauseDownload(getNativeDownloadManagerService(), downloadGuid);
+    void pauseDownload(String downloadGuid, boolean isOffTheRecord) {
+        nativePauseDownload(getNativeDownloadManagerService(), downloadGuid, isOffTheRecord);
         DownloadProgress progress = mDownloadProgressMap.get(downloadGuid);
         // Calling pause will stop listening to the download item. Update its progress now.
         // If download is already completed, canceled or failed, there is no need to update the
@@ -1562,10 +1560,11 @@
 
     private native long nativeInit();
     private native void nativeResumeDownload(
-            long nativeDownloadManagerService, String downloadGuid);
+            long nativeDownloadManagerService, String downloadGuid, boolean isOffTheRecord);
     private native void nativeCancelDownload(
             long nativeDownloadManagerService, String downloadGuid, boolean isOffTheRecord,
             boolean isNotificationDismissed);
-    private native void nativePauseDownload(long nativeDownloadManagerService, String downloadGuid);
+    private native void nativePauseDownload(long nativeDownloadManagerService, String downloadGuid,
+            boolean isOffTheRecord);
     private native void nativeGetAllDownloads(long nativeDownloadManagerService);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
index c3ce1ad7..a1012af 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
@@ -46,6 +46,7 @@
     static final String EXTRA_DOWNLOAD_GUID = "DownloadGuid";
     static final String EXTRA_DOWNLOAD_FILE_NAME = "DownloadFileName";
     static final String EXTRA_NOTIFICATION_DISMISSED = "NotificationDismissed";
+    static final String EXTRA_DOWNLOAD_IS_OFF_THE_RECORD = "DownloadIsOffTheRecord";
     static final String ACTION_DOWNLOAD_CANCEL =
             "org.chromium.chrome.browser.download.DOWNLOAD_CANCEL";
     static final String ACTION_DOWNLOAD_PAUSE =
@@ -193,11 +194,11 @@
      *        the percentage can be determined, or -1 if it is unknown.
      * @param timeRemainingInMillis Remaining download time in milliseconds.
      * @param startTime Time when download started.
-     * @param isResumable Whether the download can be resumed.
+     * @param isOffTheRecord Whether the download is off the record.
      * @param canDownloadWhileMetered Whether the download can happen in metered network.
      */
     public void notifyDownloadProgress(String downloadGuid, String fileName, int percentage,
-            long timeRemainingInMillis, long startTime, boolean isResumable,
+            long timeRemainingInMillis, long startTime, boolean isOffTheRecord,
             boolean canDownloadWhileMetered) {
         boolean indeterminate = percentage == INVALID_DOWNLOAD_PERCENTAGE;
         NotificationCompat.Builder builder = buildNotification(
@@ -218,18 +219,18 @@
         }
         int notificationId = getNotificationId(downloadGuid);
         addOrReplaceSharedPreferenceEntry(new DownloadSharedPreferenceEntry(
-                notificationId, isResumable, canDownloadWhileMetered, downloadGuid, fileName));
+                notificationId, isOffTheRecord, canDownloadWhileMetered, downloadGuid, fileName));
         if (startTime > 0) builder.setWhen(startTime);
+        Intent cancelIntent = buildActionIntent(
+                ACTION_DOWNLOAD_CANCEL, notificationId, downloadGuid, fileName);
         builder.addAction(R.drawable.bookmark_cancel_active,
                 mContext.getResources().getString(R.string.download_notification_cancel_button),
-                buildPendingIntent(ACTION_DOWNLOAD_CANCEL, notificationId, downloadGuid, fileName,
-                        false));
-        if (isResumable) {
-            builder.addAction(R.drawable.ic_vidcontrol_pause,
-                    mContext.getResources().getString(R.string.download_notification_pause_button),
-                    buildPendingIntent(ACTION_DOWNLOAD_PAUSE, notificationId, downloadGuid,
-                            fileName, false));
-        }
+                buildPendingIntent(cancelIntent, notificationId));
+        Intent pauseIntent = buildActionIntent(
+                ACTION_DOWNLOAD_PAUSE, notificationId, downloadGuid, fileName);
+        builder.addAction(R.drawable.ic_vidcontrol_pause,
+                mContext.getResources().getString(R.string.download_notification_pause_button),
+                buildPendingIntent(pauseIntent, notificationId));
         updateNotification(notificationId, builder.build());
         if (!mDownloadsInProgress.contains(downloadGuid)) {
             mDownloadsInProgress.add(downloadGuid);
@@ -261,32 +262,37 @@
     /**
      * Change a download notification to paused state.
      * @param downloadGuid GUID of the download.
+     * @param isResumable Whether download can be resumed.
      * @param isAutoResumable whether download is can be resumed automatically.
      */
-    public void notifyDownloadPaused(String downloadGuid, boolean isAutoResumable) {
+    public void notifyDownloadPaused(String downloadGuid, boolean isResumable,
+            boolean isAutoResumable) {
         DownloadSharedPreferenceEntry entry = getDownloadSharedPreferenceEntry(downloadGuid);
         if (entry == null) return;
+        if (!isResumable) {
+            notifyDownloadFailed(downloadGuid, entry.fileName);
+            return;
+        }
         NotificationCompat.Builder builder = buildNotification(
                 android.R.drawable.ic_media_pause, entry.fileName,
                 mContext.getResources().getString(R.string.download_notification_paused));
-        PendingIntent cancelIntent = buildPendingIntent(ACTION_DOWNLOAD_CANCEL,
-                entry.notificationId, entry.downloadGuid, entry.fileName, false);
-        PendingIntent dismissIntent = buildPendingIntent(ACTION_DOWNLOAD_CANCEL,
-                entry.notificationId, entry.downloadGuid, entry.fileName, true);
-        builder.setDeleteIntent(dismissIntent);
+        Intent cancelIntent = buildActionIntent(
+                ACTION_DOWNLOAD_CANCEL, entry.notificationId, entry.downloadGuid, entry.fileName);
+        Intent dismissIntent = new Intent(cancelIntent);
+        dismissIntent.putExtra(EXTRA_NOTIFICATION_DISMISSED, true);
+        builder.setDeleteIntent(buildPendingIntent(dismissIntent, entry.notificationId));
         builder.addAction(R.drawable.bookmark_cancel_active,
                 mContext.getResources().getString(R.string.download_notification_cancel_button),
-                cancelIntent);
-        if (entry.isResumable) {
-            builder.addAction(R.drawable.ic_get_app_white_24dp,
-                    mContext.getResources().getString(
-                            R.string.download_notification_resume_button),
-                    buildPendingIntent(ACTION_DOWNLOAD_RESUME, entry.notificationId,
-                            entry.downloadGuid, entry.fileName, false));
-        }
+                buildPendingIntent(cancelIntent, entry.notificationId));
+        Intent resumeIntent = buildActionIntent(
+                ACTION_DOWNLOAD_RESUME, entry.notificationId, entry.downloadGuid, entry.fileName);
+        resumeIntent.putExtra(EXTRA_DOWNLOAD_IS_OFF_THE_RECORD, entry.isOffTheRecord);
+        builder.addAction(R.drawable.ic_get_app_white_24dp,
+                mContext.getResources().getString(R.string.download_notification_resume_button),
+                buildPendingIntent(resumeIntent, entry.notificationId));
         updateNotification(entry.notificationId, builder.build());
         // If download is not auto resumable, there is no need to keep it in SharedPreferences.
-        if (!entry.isResumable || !isAutoResumable) {
+        if (entry.isOffTheRecord || !isAutoResumable) {
             removeSharedPreferenceEntry(downloadGuid);
         }
         mDownloadsInProgress.remove(downloadGuid);
@@ -345,21 +351,29 @@
     void pauseAllDownloads() {
         for (int i = 0; i < mDownloadSharedPreferenceEntries.size(); ++i) {
             DownloadSharedPreferenceEntry entry = mDownloadSharedPreferenceEntries.get(i);
-            notifyDownloadPaused(entry.downloadGuid, true);
+            notifyDownloadPaused(entry.downloadGuid, !entry.isOffTheRecord, true);
         }
     }
 
     /**
-     * Helper method to build a PendingIntent from the provided information.
+     * Helper method to build a PendingIntent from the provided intent.
+     * @param intent Intent to broadcast.
+     * @param notificationId ID of the notification.
+     */
+    private PendingIntent buildPendingIntent(Intent intent, int notificationId) {
+        return PendingIntent.getBroadcast(
+                mContext, notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+    }
+
+    /**
+     * Helper method to build an download action Intent from the provided information.
      * @param action Download action to perform.
      * @param notificationId ID of the notification.
      * @param downloadGuid GUID of the download.
      * @param fileName Name of the download file.
-     * @param isNotificationDismissed Whether the intent is from dismissing the notification.
      */
-    private PendingIntent buildPendingIntent(
-            String action, int notificationId, String downloadGuid, String fileName,
-            boolean isNotificationDismissed) {
+    private Intent buildActionIntent(
+            String action, int notificationId, String downloadGuid, String fileName) {
         ComponentName component = new ComponentName(
                 mContext.getPackageName(), DownloadBroadcastReceiver.class.getName());
         Intent intent = new Intent(action);
@@ -367,9 +381,7 @@
         intent.putExtra(EXTRA_DOWNLOAD_NOTIFICATION_ID, notificationId);
         intent.putExtra(EXTRA_DOWNLOAD_GUID, downloadGuid);
         intent.putExtra(EXTRA_DOWNLOAD_FILE_NAME, fileName);
-        intent.putExtra(EXTRA_NOTIFICATION_DISMISSED, isNotificationDismissed);
-        return PendingIntent.getBroadcast(
-                mContext, notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+        return intent;
     }
 
     /**
@@ -396,16 +408,17 @@
      */
     private DownloadSharedPreferenceEntry getDownloadEntryFromIntent(Intent intent) {
         if (intent.getAction() == ACTION_DOWNLOAD_RESUME_ALL) return null;
-        String guid = IntentUtils.safeGetStringExtra(
-                intent, DownloadNotificationService.EXTRA_DOWNLOAD_GUID);
+        String guid = IntentUtils.safeGetStringExtra(intent, EXTRA_DOWNLOAD_GUID);
         DownloadSharedPreferenceEntry entry = getDownloadSharedPreferenceEntry(guid);
         if (entry != null) return entry;
         int notificationId = IntentUtils.safeGetIntExtra(
-                intent, DownloadNotificationService.EXTRA_DOWNLOAD_NOTIFICATION_ID, -1);
-        String fileName = IntentUtils.safeGetStringExtra(
-                intent, DownloadNotificationService.EXTRA_DOWNLOAD_FILE_NAME);
+                intent, EXTRA_DOWNLOAD_NOTIFICATION_ID, -1);
+        String fileName = IntentUtils.safeGetStringExtra(intent, EXTRA_DOWNLOAD_FILE_NAME);
         boolean metered = DownloadManagerService.isActiveNetworkMetered(mContext);
-        return new DownloadSharedPreferenceEntry(notificationId, true, metered, guid, fileName);
+        boolean isOffTheRecord =  IntentUtils.safeGetBooleanExtra(
+                intent, EXTRA_DOWNLOAD_IS_OFF_THE_RECORD, false);
+        return new DownloadSharedPreferenceEntry(
+                notificationId, isOffTheRecord, metered, guid, fileName);
     }
 
     /**
@@ -419,7 +432,7 @@
             // If browser process already goes away, the download should have already paused. Do
             // nothing in that case.
             if (!DownloadManagerService.hasDownloadManagerService()) {
-                notifyDownloadPaused(entry.downloadGuid, false);
+                notifyDownloadPaused(entry.downloadGuid, !entry.isOffTheRecord, false);
                 return;
             }
         } else if (intent.getAction() == ACTION_DOWNLOAD_RESUME) {
@@ -453,15 +466,16 @@
                         // SD card, and remove the download ID from the SharedPreferences so we
                         // don't need to restart the browser process. http://crbug.com/579643.
                         cancelNotification(entry.notificationId, entry.downloadGuid);
-                        service.cancelDownload(entry.downloadGuid, IntentUtils.safeGetBooleanExtra(
-                                intent, EXTRA_NOTIFICATION_DISMISSED, false));
+                        service.cancelDownload(entry.downloadGuid, entry.isOffTheRecord,
+                                IntentUtils.safeGetBooleanExtra(
+                                        intent, EXTRA_NOTIFICATION_DISMISSED, false));
                         break;
                     case ACTION_DOWNLOAD_PAUSE:
-                        service.pauseDownload(entry.downloadGuid);
+                        service.pauseDownload(entry.downloadGuid, entry.isOffTheRecord);
                         break;
                     case ACTION_DOWNLOAD_RESUME:
                         notifyDownloadProgress(entry.downloadGuid, entry.fileName,
-                                INVALID_DOWNLOAD_PERCENTAGE, 0, 0, true,
+                                INVALID_DOWNLOAD_PERCENTAGE, 0, 0, entry.isOffTheRecord,
                                 entry.canDownloadWhileMetered);
                         service.resumeDownload(entry.buildDownloadItem(), true);
                         break;
@@ -574,10 +588,10 @@
                 DownloadManagerService.getDownloadManagerService(getApplicationContext());
         for (int i = 0; i < mDownloadSharedPreferenceEntries.size(); ++i) {
             DownloadSharedPreferenceEntry entry = mDownloadSharedPreferenceEntries.get(i);
-            if (!entry.canDownloadWhileMetered && isNetworkMetered) continue;
             if (mDownloadsInProgress.contains(entry.downloadGuid)) continue;
+            if (!entry.canDownloadWhileMetered && isNetworkMetered) continue;
             notifyDownloadProgress(entry.downloadGuid, entry.fileName,
-                    INVALID_DOWNLOAD_PERCENTAGE, 0, 0, true, entry.canDownloadWhileMetered);
+                    INVALID_DOWNLOAD_PERCENTAGE, 0, 0, false, entry.canDownloadWhileMetered);
             service.resumeDownload(entry.buildDownloadItem(), false);
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotifier.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotifier.java
index b24b779..f999892 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotifier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotifier.java
@@ -40,9 +40,15 @@
     /**
      * Update the download notification to paused.
      * @param downloadInfo info about in progress download.
+     */
+    void notifyDownloadPaused(DownloadInfo downloadInfo);
+
+    /**
+     * Update the download notification to paused.
+     * @param downloadInfo info about in progress download.
      * @param isAutoResumable Whether the download can be auto resumed when network is available.
      */
-    void notifyDownloadPaused(DownloadInfo downloadInfo, boolean isAutoResumable);
+    void notifyDownloadInterrupted(DownloadInfo downloadInfo, boolean isAutoResumable);
 
     /**
      * Cancel the notification for a download.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceEntry.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceEntry.java
index 3959e5a..e323b4a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceEntry.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceEntry.java
@@ -19,17 +19,17 @@
     private static final String TAG = "DownloadEntry";
     // Current version of the DownloadSharedPreferenceEntry. When changing the SharedPreference,
     // we need to change the version number too.
-    @VisibleForTesting static final int VERSION = 1;
+    @VisibleForTesting static final int VERSION = 2;
     public final int notificationId;
-    public final boolean isResumable;
+    public final boolean isOffTheRecord;  // Whether the download is public (non incognito).
     public boolean canDownloadWhileMetered;
     public final String fileName;
     public final String downloadGuid;
 
-    DownloadSharedPreferenceEntry(int notificationId, boolean isResumable,
+    DownloadSharedPreferenceEntry(int notificationId, boolean isOffTheRecord,
             boolean canDownloadWhileMetered, String guid, String fileName) {
         this.notificationId = notificationId;
-        this.isResumable = isResumable;
+        this.isOffTheRecord = isOffTheRecord;
         this.canDownloadWhileMetered = canDownloadWhileMetered;
         this.downloadGuid = guid;
         this.fileName = fileName;
@@ -48,17 +48,18 @@
             try {
                 int version = Integer.parseInt(values[0]);
                 // Ignore all SharedPreference entries that has an invalid version for now.
-                if (version != VERSION) {
+                if (version < 1) {
                     return new DownloadSharedPreferenceEntry(-1, false, false, null, "");
                 }
                 int id = Integer.parseInt(values[1]);
-                boolean isResumable = "1".equals(values[2]);
+                boolean isOffTheRecord =
+                        (version >= 2) ? "1".equals(values[2]) : "0".equals(values[2]);
                 boolean canDownloadWhileMetered = "1".equals(values[3]);
                 if (!isValidGUID(values[4])) {
                     return new DownloadSharedPreferenceEntry(-1, false, false, null, "");
                 }
                 return new DownloadSharedPreferenceEntry(
-                        id, isResumable, canDownloadWhileMetered, values[4], values[5]);
+                        id, isOffTheRecord, canDownloadWhileMetered, values[4], values[5]);
             } catch (NumberFormatException nfe) {
                 Log.w(TAG, "Exception while parsing pending download:" + sharedPrefString);
             }
@@ -71,7 +72,7 @@
      *         SharedPrefs.
      */
     String getSharedPreferenceString() {
-        return VERSION + "," + notificationId + "," + (isResumable ? "1" : "0") + ","
+        return VERSION + "," + notificationId + "," + (isOffTheRecord ? "1" : "0") + ","
                 + (canDownloadWhileMetered ? "1" : "0") + "," + downloadGuid + "," + fileName;
     }
 
@@ -101,7 +102,7 @@
         DownloadInfo info = new DownloadInfo.Builder()
                 .setDownloadGuid(downloadGuid)
                 .setFileName(fileName)
-                .setIsResumable(isResumable)
+                .setIsOffTheRecord(isOffTheRecord)
                 .build();
         return new DownloadItem(false, info);
     }
@@ -115,14 +116,14 @@
         return TextUtils.equals(downloadGuid, other.downloadGuid)
                 && TextUtils.equals(fileName, other.fileName)
                 && notificationId == other.notificationId
-                && isResumable == other.isResumable
+                && isOffTheRecord == other.isOffTheRecord
                 && canDownloadWhileMetered == other.canDownloadWhileMetered;
     }
 
     @Override
     public int hashCode() {
         int hash = 31;
-        hash = 37 * hash + (isResumable ? 1 : 0);
+        hash = 37 * hash + (isOffTheRecord ? 1 : 0);
         hash = 37 * hash + (canDownloadWhileMetered ? 1 : 0);
         hash = 37 * hash + notificationId;
         hash = 37 * hash + downloadGuid.hashCode();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java b/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java
index 5b54ed68..4d37e4d8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java
@@ -34,6 +34,7 @@
     private static final int DOWNLOAD_NOTIFICATION_TYPE_CANCEL = 3;
     private static final int DOWNLOAD_NOTIFICATION_TYPE_RESUME_ALL = 4;
     private static final int DOWNLOAD_NOTIFICATION_TYPE_PAUSE = 5;
+    private static final int DOWNLOAD_NOTIFICATION_TYPE_INTERRUPT = 6;
     private final Context mApplicationContext;
     private final Object mLock = new Object();
     @Nullable private DownloadNotificationService mBoundService;
@@ -204,9 +205,16 @@
     }
 
     @Override
-    public void notifyDownloadPaused(DownloadInfo downloadInfo, boolean isAutoResumable) {
+    public void notifyDownloadPaused(DownloadInfo downloadInfo) {
         PendingNotificationInfo info =
                 new PendingNotificationInfo(DOWNLOAD_NOTIFICATION_TYPE_PAUSE, downloadInfo);
+        updateDownloadNotification(info);
+    }
+
+    @Override
+    public void notifyDownloadInterrupted(DownloadInfo downloadInfo, boolean isAutoResumable) {
+        PendingNotificationInfo info =
+                new PendingNotificationInfo(DOWNLOAD_NOTIFICATION_TYPE_INTERRUPT, downloadInfo);
         info.isAutoResumable = isAutoResumable;
         updateDownloadNotification(info);
     }
@@ -261,13 +269,16 @@
                         mBoundService.notifyDownloadProgress(
                                 info.getDownloadGuid(), info.getFileName(),
                                 info.getPercentCompleted(), info.getTimeRemainingInMillis(),
-                                notificationInfo.startTime, info.isResumable(),
+                                notificationInfo.startTime, info.isOffTheRecord(),
                                 notificationInfo.canDownloadWhileMetered);
                         break;
                     case DOWNLOAD_NOTIFICATION_TYPE_PAUSE:
-                        assert info.isResumable();
+                        mBoundService.notifyDownloadPaused(info.getDownloadGuid(), true, false);
+                        break;
+                    case DOWNLOAD_NOTIFICATION_TYPE_INTERRUPT:
                         mBoundService.notifyDownloadPaused(
-                                info.getDownloadGuid(), notificationInfo.isAutoResumable);
+                                info.getDownloadGuid(), info.isResumable(),
+                                notificationInfo.isAutoResumable);
                         break;
                     case DOWNLOAD_NOTIFICATION_TYPE_SUCCESS:
                         final int notificationId = mBoundService.notifyDownloadSuccessful(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithGesturesHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithGesturesHandler.java
index 3c09f63..983e38a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithGesturesHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithGesturesHandler.java
@@ -14,7 +14,6 @@
 import org.chromium.chrome.browser.util.IntentUtils;
 
 import java.io.IOException;
-import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
 import java.util.Arrays;
 import java.util.concurrent.ExecutionException;
@@ -64,10 +63,8 @@
             protected SecureRandom doInBackground(Void... params) {
                 SecureRandom secureRandom = null;
                 try {
-                    secureRandom = SecureRandom.getInstance("SHA1PRNG");
+                    secureRandom = new SecureRandom();
                     SecureRandomInitializer.initialize(secureRandom);
-                } catch (NoSuchAlgorithmException e) {
-                    Log.e(TAG, "Cannot create SecureRandom", e);
                 } catch (IOException ioe) {
                     Log.e(TAG, "Cannot initialize SecureRandom", ioe);
                 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
index cd416e2..1060270 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
@@ -200,8 +200,8 @@
                 Tab foundTab = tabModelSelector.getTabById(tabId);
                 if (foundTab == null) return;
 
-                LoadUrlParams params = new LoadUrlParams(
-                        foundTab.getOfflinePageOriginalUrl(), PageTransition.RELOAD);
+                LoadUrlParams params =
+                        new LoadUrlParams(foundTab.getOriginalUrl(), PageTransition.RELOAD);
                 foundTab.loadUrl(params);
             }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
index cd4dd23..2de0a7c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -321,8 +321,19 @@
                     });
                 }
                 return true;
+            } else if (keyCode == KeyEvent.KEYCODE_BACK) {
+                if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {
+                    // Tell the framework to start tracking this event.
+                    getKeyDispatcherState().startTracking(event, this);
+                    return true;
+                } else if (event.getAction() == KeyEvent.ACTION_UP) {
+                    getKeyDispatcherState().handleUpEvent(event);
+                    if (event.isTracking() && !event.isCanceled()) {
+                        backKeyPressed();
+                        return true;
+                    }
+                }
             }
-
             return false;
         }
 
@@ -1952,8 +1963,7 @@
         }
     }
 
-    @Override
-    public void backKeyPressed() {
+    private void backKeyPressed() {
         hideSuggestions();
         UiUtils.hideKeyboard(mUrlBar);
         // Revert the URL to match the current page.
@@ -2068,7 +2078,7 @@
         Tab currentTab = getCurrentTab();
         if (currentTab == null) return "";
         if (currentTab.isOfflinePage()) {
-            return currentTab.getOfflinePageOriginalUrl().trim();
+            return currentTab.getOriginalUrl().trim();
         }
         return currentTab.getUrl().trim();
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
index 45dae29..ef895ee 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
@@ -20,10 +20,8 @@
 import android.text.style.ReplacementSpan;
 import android.util.AttributeSet;
 import android.view.GestureDetector;
-import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
-import android.view.View.OnKeyListener;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
 import android.view.accessibility.AccessibilityNodeInfo;
@@ -52,7 +50,7 @@
 /**
  * The URL text entry view for the Omnibox.
  */
-public class UrlBar extends VerticallyFixedEditText implements OnKeyListener {
+public class UrlBar extends VerticallyFixedEditText {
     private static final String TAG = "UrlBar";
 
     // TextView becomes very slow on long strings, so we limit maximum length
@@ -166,11 +164,6 @@
         void onTextChangedForAutocomplete(boolean textDeleted);
 
         /**
-         * Called to notify that back key has been pressed while the focus in on the url bar.
-         */
-        void backKeyPressed();
-
-        /**
          * @return Whether the light security theme should be used.
          */
         boolean shouldEmphasizeHttpsScheme();
@@ -225,7 +218,6 @@
 
         mAccessibilityManager =
                 (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
-        setOnKeyListener(this);
     }
 
     /**
@@ -509,24 +501,6 @@
     }
 
     @Override
-    public boolean onKey(View v, int keyCode, KeyEvent event) {
-        if (keyCode == KeyEvent.KEYCODE_BACK) {
-            if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {
-                // Tell the framework to start tracking this event.
-                getKeyDispatcherState().startTracking(event, this);
-                return true;
-            } else if (event.getAction() == KeyEvent.ACTION_UP) {
-                getKeyDispatcherState().handleUpEvent(event);
-                if (event.isTracking() && !event.isCanceled()) {
-                    mUrlBarDelegate.backKeyPressed();
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    @Override
     public boolean onTouchEvent(MotionEvent event) {
         if (!mFocused) {
             mGestureDetector.onTouchEvent(event);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
index b6a653d..b7ac8800 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
@@ -739,6 +739,8 @@
         mAddressEditor.edit(toEdit, new Callback<AutofillAddress>() {
             @Override
             public void onResult(AutofillAddress completeAddress) {
+                if (mUI == null) return;
+
                 if (completeAddress == null) {
                     mShippingAddressesSection.setSelectedItemIndex(SectionInformation.NO_SELECTION);
                 } else if (toEdit == null) {
@@ -764,6 +766,8 @@
         mContactEditor.edit(toEdit, new Callback<AutofillContact>() {
             @Override
             public void onResult(AutofillContact completeContact) {
+                if (mUI == null) return;
+
                 if (completeContact == null) {
                     mContactSection.setSelectedItemIndex(SectionInformation.NO_SELECTION);
                 } else if (toEdit == null) {
@@ -779,6 +783,8 @@
         mCardEditor.edit(toEdit, new Callback<AutofillPaymentInstrument>() {
             @Override
             public void onResult(AutofillPaymentInstrument completeCard) {
+                if (mUI == null) return;
+
                 if (completeCard == null) {
                     mPaymentMethodsSection.setSelectedItemIndex(SectionInformation.NO_SELECTION);
                 } else if (toEdit == null) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
index c23d95f..3b2e9514 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
@@ -946,11 +946,15 @@
      *  <li>Failure to process the payment.</li>
      *  <li>The JavaScript calling the abort() method in PaymentRequest API.</li>
      *  <li>The PaymentRequest JavaScript object being destroyed.</li>
+     *  <li>User closing all incognito windows with PaymentRequest UI open in an incognito
+     *      window.</li>
      * </ul>
      */
     @Override
     public void onDismiss(DialogInterface dialog) {
         mIsClosing = true;
+        if (mEditorView.isShowing()) mEditorView.dismiss();
+        if (mCardEditorView.isShowing()) mCardEditorView.dismiss();
         if (sObserverForTest != null) sObserverForTest.onPaymentRequestDismiss();
         if (!mIsClientClosing) mClient.onDismiss();
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/PassphraseCreationDialogFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/PassphraseCreationDialogFragment.java
index 1c12753b..10b6a53 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/PassphraseCreationDialogFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/PassphraseCreationDialogFragment.java
@@ -107,10 +107,12 @@
         String confirmPassphrase = mConfirmPassphrase.getText().toString();
 
         if (!passphrase.equals(confirmPassphrase)) {
+            mEnterPassphrase.setError(null);
             mConfirmPassphrase.setError(getString(R.string.sync_passphrases_do_not_match));
             mConfirmPassphrase.requestFocus();
             return;
         } else if (passphrase.isEmpty()) {
+            mConfirmPassphrase.setError(null);
             mEnterPassphrase.setError(getString(R.string.sync_passphrase_cannot_be_blank));
             mEnterPassphrase.requestFocus();
             return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
index b0c2b142..0dc4f334 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -2911,6 +2911,18 @@
     }
 
     /**
+     * @return Original url of the tab, if tab currently displays offline copy, would return url of
+     * the original page. Otherwise return the original url from DOMDistiller.
+     */
+    public String getOriginalUrl() {
+        if (isOfflinePage()) {
+            return getOfflinePageOriginalUrl();
+        } else {
+            return DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl(getUrl());
+        }
+    }
+
+    /**
      * If a Lo-Fi snackbar has not been shown yet for this page load, a Lo-Fi snackbar is shown.
      *
      * @param isPreview Whether the Lo-Fi response was a preview response.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
index 6e5ebf27..340b20f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
@@ -730,9 +730,6 @@
     public void setAutocompleteProfile(Profile profile) {}
 
     @Override
-    public void backKeyPressed() {}
-
-    @Override
     public void showAppMenuUpdateBadge() {}
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModelImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModelImpl.java
index 3debf7f9..c535e3eb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModelImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModelImpl.java
@@ -96,7 +96,7 @@
                         DomDistillerTabUtils.getFormattedUrlFromOriginalDistillerUrl(originalUrl);
             }
         } else if (mTab.isOfflinePage()) {
-            String originalUrl = mTab.getOfflinePageOriginalUrl();
+            String originalUrl = mTab.getOriginalUrl();
             displayText = OfflinePageUtils.stripSchemeFromOnlineUrl(
                   DomDistillerTabUtils.getFormattedUrlFromOriginalDistillerUrl(originalUrl));
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappAuthenticator.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappAuthenticator.java
index 838f29c..521cee1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappAuthenticator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappAuthenticator.java
@@ -212,7 +212,7 @@
                 @Override
                 public SecretKey call() throws Exception {
                     KeyGenerator generator = KeyGenerator.getInstance(MAC_ALGORITHM_NAME);
-                    SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
+                    SecureRandom random = new SecureRandom();
                     SecureRandomInitializer.initialize(random);
                     generator.init(MAC_KEY_BYTE_COUNT * 8, random);
                     return generator.generateKey();
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
index 799223f..cc3fd76 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -1262,6 +1262,9 @@
       <message name="IDS_BLUETOOTH_CONFIRM_BUTTON" desc="The button to confirm association of a website with a Bluetooth device. Use the same term as in 'Pair this Bluetooth headset with your phone.'">
         Pair
       </message>
+      <message name="IDS_BLUETOOTH_NOT_SEEING_IT" desc="The message to show at the bottom of the dialog when Bluetooth scanning has uncovered some items but is still scanning for others.">
+        Not seeing your device? <ph name="BEGIN_LINK">&lt;link&gt;</ph>Get help<ph name="END_LINK">&lt;/link&gt;</ph>.
+      </message>
       <message name="IDS_BLUETOOTH_NOT_SEEING_IT_IDLE_NONE_FOUND" desc="The message to show at the bottom of the dialog when Bluetooth scanning has not uncovered any devices and it is no longer discovering devices.">
         <ph name="BEGIN_LINK">&lt;link&gt;</ph>Get help<ph name="END_LINK">&lt;/link&gt;</ph>
       </message>
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 4a4dde29..ecdceee 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -78,11 +78,11 @@
 <translation id="1853692000353488670">አዲስ ማንነት የማያሳውቅ ትር</translation>
 <translation id="1871284979644508959">የሚያስፈልግ መስክ</translation>
 <translation id="189172778771606813">የአሰሳ መሳቢያ ዝጋ</translation>
-<translation id="1924956916668006832">የመላኪያ አድራሻን ይምረጡ</translation>
 <translation id="1933845786846280168">የተመረጠው ትር</translation>
 <translation id="194341124344773587">በ<ph name="BEGIN_LINK" />Android ቅንብሮች<ph name="END_LINK" /> ውስጥ ፍቃዶችን ለChrome ያብሩ።</translation>
 <translation id="1943432128510653496">የይለፍ ቃላትን አስቀምጥ</translation>
 <translation id="1944384637046898011">ከ<ph name="TIME" /> ጀምሮ በGoogle ይለፍ ቃል አመስጥር</translation>
+<translation id="1946821392246652573">ተቀባይነት ያገኙ ካርዶች</translation>
 <translation id="1966710179511230534">እባክዎ የመግቢያ ዝርዝሮችዎን ያዘምኑ።</translation>
 <translation id="1974060860693918893">የላቀ</translation>
 <translation id="1984321224716884559">የChrome ገንቢ ዕልባቶች</translation>
@@ -159,7 +159,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> ሰከንዶች ይቀራሉ</translation>
 <translation id="278029852808208386">ምንም የብሉቱዝ መሳሪያዎች አልተገኙም። <ph name="BEGIN_LINK" />እንደገና ይፈልጉ<ph name="END_LINK" />።</translation>
 <translation id="2781151931089541271">1 ሰከንድ ይቀራል</translation>
-<translation id="2781389167600714117">መላኪያ ይምረጡ</translation>
 <translation id="2811892995384186721">መሣሪያዎ አይታየዎትም? <ph name="BEGIN_LINK" />እገዛ ያግኙ<ph name="END_LINK" />።</translation>
 <translation id="2836148919159985482">ከሙሉ ማያ ገጽ ለመውጣት የተመለስ አዝራሩን ይንኩ።</translation>
 <translation id="2842985007712546952">ወላጅ አቃፊ</translation>
@@ -188,7 +187,6 @@
 <translation id="3117051980354074377">ዕልባቶችዎን ከሌሎች መሣሪያዎችዎ ለማግኘት ወደ Chrome ይግቡ።</translation>
 <translation id="3137521801621304719">ከማንነት የማያሳውቅ ሁነታ ይውጡ</translation>
 <translation id="3149891296864842641">የመላኪያ አማራጭ</translation>
-<translation id="3162882791484435636">የመላኪያ አማራጭ ምረጥ</translation>
 <translation id="3177909033752230686">የገጽ ቋንቋ፦</translation>
 <translation id="3190152372525844641">በ<ph name="BEGIN_LINK" />Android ቅንብሮች<ph name="END_LINK" /> ውስጥ ፍቃዶችን ለChrome ያብሩ።</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> የተከማቸ ውሂብ</translation>
@@ -216,6 +214,7 @@
 <translation id="3386292677130313581">ጣቢያዎች አካባቢዎን እንዲያውቁ ከመፍቀድዎ በፊት ይጠይቅ (የሚመከር)</translation>
 <translation id="3387650086002190359">በስርዓተ-ፋይል ስህተቶች ምክንያት <ph name="FILE_NAME" />ን ማውረድ አልተሳካም።</translation>
 <translation id="3414952576877147120">መጠን፦</translation>
+<translation id="3431636764301398940">ይህን ካርድ ወደዚህ መሣሪያ አስቀምጥ</translation>
 <translation id="3435896845095436175">አንቃ</translation>
 <translation id="3452612588551937789">የእርስዎን ዕልባቶች፣ የይለፍ ቃላት፣ ታሪክ እና ሌሎች ቅንብሮችን በሁሉም መሣሪያዎችዎ ላይ ለማግኘት በGoogle መለያዎ ይግቡ።</translation>
 <translation id="3485544713029068372">Smart Lock ለይለፍ ቃላት</translation>
@@ -261,7 +260,6 @@
 <translation id="4062305924942672200">የህግ መረጃ</translation>
 <translation id="4089831646916293264">ይህ ባህሪ በእርስዎ አገልግሎት አቅራቢ በሚቀርቡ ዋና የውሂብ አገልግሎቶች ላይ ጣልቃ ሊገባ ይችላል።</translation>
 <translation id="4095146165863963773">የመተግበሪያ ውሂብ ይሰረዝ?</translation>
-<translation id="4099423833822562131">የመላኪያ ዘዴዎች ለማረጋገጥ የመላኪያ አድራሻ ይምረጡ።</translation>
 <translation id="4099578267706723511">የአጠቃቀም ስታቲክሶችን እና የብልሽት ሪፖርቶችን ወደ Google በመላክ Chromeን የተሻለ ለማድረግ እገዛ ያድርጉ።</translation>
 <translation id="410351446219883937">ራስ-አጫውት</translation>
 <translation id="411254640334432676">ማውረድ አልተሳካም።</translation>
@@ -412,6 +410,7 @@
 <translation id="572328651809341494">የቅርብ ጊዜ ትሮች</translation>
 <translation id="5748802427693696783">ወደ መደበኛ ትሮች ቀይር</translation>
 <translation id="5749068826913805084">Chrome ፋይሎችን ለማውረድ የማከማቻ መዳረሻ ያስፈልገዋል።</translation>
+<translation id="57586589942790530">ልክ ያልሆነ የካርድ ቁጥር</translation>
 <translation id="5763382633136178763">ማንነት የማያሳውቁ ትሮች</translation>
 <translation id="5765780083710877561">መግለጫ</translation>
 <translation id="5771382037724542929">በ<ph name="DIRECTORY_NAME" /> ውስጥ ያለውን ነባር <ph name="FILE_NAME" /> መተካት ይፈልጋሉ?</translation>
@@ -430,7 +429,6 @@
 <translation id="5911030830365207728">Google ትርጉም</translation>
 <translation id="5916664084637901428">በርቷል</translation>
 <translation id="5939518447894949180">ዳግም አስጀምር</translation>
-<translation id="5961742032223302715">የእውቂያ ዝርዝሮችን ይምረጡ</translation>
 <translation id="5968595432776860642">«<ph name="VIDEO_TITLE" />»ን በመጫወት ላይ</translation>
 <translation id="6010869025736512584">የቪዲዮ ግብዓትን በመድረስ ላይ</translation>
 <translation id="6012342843556706400">Chrome እሱን ለዚህ ጣቢያ ለማጋራት የአካባቢ መዳረሻ ያስፈልገዋል።</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 5c778ae..9a1820b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -78,11 +78,11 @@
 <translation id="1853692000353488670">علامة تبويب جديدة للتصفح المتخفي</translation>
 <translation id="1871284979644508959">حقل مطلوب</translation>
 <translation id="189172778771606813">إغلاق لائحة التنقل</translation>
-<translation id="1924956916668006832">تحديد عنوان الشحن</translation>
 <translation id="1933845786846280168">علامة تبويب محددة</translation>
 <translation id="194341124344773587">‏تشغيل الإذن لـ Chrome في <ph name="BEGIN_LINK" />إعدادات Android<ph name="END_LINK" /></translation>
 <translation id="1943432128510653496">حفظ كلمات المرور</translation>
 <translation id="1944384637046898011">‏ترميز الكل باستخدام كلمة مرور Google بدءًا من <ph name="TIME" /></translation>
+<translation id="1946821392246652573">البطاقات المقبولة</translation>
 <translation id="1966710179511230534">الرجاء تحديث تفاصيل تسجيل الدخول.</translation>
 <translation id="1974060860693918893">إعدادات متقدمة</translation>
 <translation id="1984321224716884559">‏الإشارات المرجعية لإصدار مطوّري البرامج من Chrome</translation>
@@ -159,7 +159,6 @@
 <translation id="2777555524387840389">عدد الثواني المتبقية: <ph name="SECONDS" /></translation>
 <translation id="278029852808208386">لم يتم العثور على أجهزة بلوتوث. <ph name="BEGIN_LINK" />ابحث مرة أخرى<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">يتبقى ثانية واحدة</translation>
-<translation id="2781389167600714117">تحديد خيارات الشحن</translation>
 <translation id="2811892995384186721">ألا ترى جهازك؟ <ph name="BEGIN_LINK" />احصل على المساعدة<ph name="END_LINK" />.</translation>
 <translation id="2836148919159985482">المس زر الرجوع للخروج من وضع ملء الشاشة.</translation>
 <translation id="2842985007712546952">المجلد الرئيسي</translation>
@@ -188,7 +187,6 @@
 <translation id="3117051980354074377">‏للحصول على الإشارات من أجهزتك الأخرى، سجّل الدخول إلى Chrome.</translation>
 <translation id="3137521801621304719">مغادرة وضع التصفح المتخفي</translation>
 <translation id="3149891296864842641">خيار الشحن</translation>
-<translation id="3162882791484435636">حدد خيار الشحن</translation>
 <translation id="3177909033752230686">لغة الصفحة:</translation>
 <translation id="3190152372525844641">‏تشغيل الأذونات لـ Chrome في <ph name="BEGIN_LINK" />إعدادات Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> من البيانات المخزنة</translation>
@@ -214,6 +212,7 @@
 <translation id="3386292677130313581">السؤال قبل السماح للمواقع بمعرفة الموقع (موصى به)</translation>
 <translation id="3387650086002190359">أخفق تنزيل الملف <ph name="FILE_NAME" /> بسبب أخطاء في نظام الملف.</translation>
 <translation id="3414952576877147120">الحجم:</translation>
+<translation id="3431636764301398940">حفظ هذه البطاقة إلى هذا الجهاز</translation>
 <translation id="3435896845095436175">تمكين الإضافات</translation>
 <translation id="3452612588551937789">‏سجّل الدخول إلى حسابك في Google للحصول على الإشارات المرجعية، والسجل، وكلمات المرور، والإعدادات الأخرى على جميع أجهزتك.</translation>
 <translation id="3485544713029068372">‏Smart Lock لكلمات المرور</translation>
@@ -259,7 +258,6 @@
 <translation id="4062305924942672200">المعلومات القانونية</translation>
 <translation id="4089831646916293264">قد تتداخل هذه الميزة مع إمكانية الوصول إلى خدمات البيانات المتميزة التي يقدّمها مشغّل شبكة الجوال.</translation>
 <translation id="4095146165863963773">هل ترغب في حذف بيانات التطبيق؟</translation>
-<translation id="4099423833822562131">اختيار عنوان شحن للتحقّق من طرق الشحن.</translation>
 <translation id="4099578267706723511">‏ساعد في تحسين Chrome عن طريق إرسال إحصاءات الاستخدام وتقارير الأعطال إلى Google.</translation>
 <translation id="410351446219883937">تشغيل تلقائي</translation>
 <translation id="411254640334432676">فشلت عملية التنزيل</translation>
@@ -411,6 +409,7 @@
 <translation id="572328651809341494">علامات التبويب الأخيرة</translation>
 <translation id="5748802427693696783">تم التبديل إلى علامات التبويب القياسية</translation>
 <translation id="5749068826913805084">‏يحتاج Chrome الوصول إلى سعة التخزين لتنزيل الملفات.</translation>
+<translation id="57586589942790530">رقم البطاقة غير صالح</translation>
 <translation id="5763382633136178763">علامات تبويب التصفح المتخفي</translation>
 <translation id="5765780083710877561">الوصف:</translation>
 <translation id="5771382037724542929">هل تريد استبدال <ph name="FILE_NAME" /> الموجود في <ph name="DIRECTORY_NAME" />؟</translation>
@@ -429,7 +428,6 @@
 <translation id="5911030830365207728">‏الترجمة من Google</translation>
 <translation id="5916664084637901428">تشغيل</translation>
 <translation id="5939518447894949180">إعادة</translation>
-<translation id="5961742032223302715">تحديد تفاصيل جهة الاتصال</translation>
 <translation id="5968595432776860642">يتم الآن التشغيل "<ph name="VIDEO_TITLE" />"</translation>
 <translation id="6010869025736512584">جارٍ الوصول إلى إدخال الفيديو</translation>
 <translation id="6012342843556706400">‏يحتاج Chrome إلى الحصول على حق الوصول إلى الموقع لمشاركته مع موقع الويب هذا.</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 e38bd576..43a5096 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -78,11 +78,11 @@
 <translation id="1853692000353488670">Нов раздел „инкогнито“</translation>
 <translation id="1871284979644508959">Задължително поле</translation>
 <translation id="189172778771606813">Затваряне на слоя за навигация</translation>
-<translation id="1924956916668006832">Избиране на адрес за доставка</translation>
 <translation id="1933845786846280168">Избран раздел</translation>
 <translation id="194341124344773587">Включете разрешението за Chrome от <ph name="BEGIN_LINK" />настройките на Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Запазени пароли</translation>
 <translation id="1944384637046898011">Шифроване на всичко с паролата за Google от <ph name="TIME" /></translation>
+<translation id="1946821392246652573">Приемани карти</translation>
 <translation id="1966710179511230534">Моля, актуализирайте данните си за вход.</translation>
 <translation id="1974060860693918893">Разширени</translation>
 <translation id="1984321224716884559">Отметки от Chrome Dev</translation>
@@ -159,7 +159,6 @@
 <translation id="2777555524387840389">Остават <ph name="SECONDS" /> сек</translation>
 <translation id="278029852808208386">Няма намерени устройства с Bluetooth. <ph name="BEGIN_LINK" />Потърсете отново<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">Остава 1 сек</translation>
-<translation id="2781389167600714117">Избиране на опции за доставка</translation>
 <translation id="2811892995384186721">Не виждате устройството си? <ph name="BEGIN_LINK" />Получете помощ<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Докоснете бутона за връщане назад, за да излезете от режима на цял екран.</translation>
 <translation id="2842985007712546952">Основна папка</translation>
@@ -188,7 +187,6 @@
 <translation id="3117051980354074377">Влезте в Chrome, за да получите отметките си от другите си устройства.</translation>
 <translation id="3137521801621304719">Напускане на режима „инкогнито“</translation>
 <translation id="3149891296864842641">Опция за доставка</translation>
-<translation id="3162882791484435636">Избиране на опция за доставка</translation>
 <translation id="3177909033752230686">Език на страницата:</translation>
 <translation id="3190152372525844641">Включете разрешенията за Chrome от <ph name="BEGIN_LINK" />настройките на Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905">Съхранявани данни: <ph name="STORAGE_AMOUNT" /></translation>
@@ -216,6 +214,7 @@
 <translation id="3386292677130313581">Извеждане на запитване, преди на сайтовете да се разреши достъп до местоположението ви (препоръчително)</translation>
 <translation id="3387650086002190359">Изтеглянето на „<ph name="FILE_NAME" />“ не бе успешно поради грешки във файловата система.</translation>
 <translation id="3414952576877147120">Размер:</translation>
+<translation id="3431636764301398940">Запазване на картата на това устройство</translation>
 <translation id="3435896845095436175">Активиране</translation>
 <translation id="3452612588551937789">Влезте с профила си в Google, за да получите своите отметки, история, пароли и други настройки на всичките си устройства.</translation>
 <translation id="3485544713029068372">Smart Lock за пароли</translation>
@@ -261,7 +260,6 @@
 <translation id="4062305924942672200">Правна информация</translation>
 <translation id="4089831646916293264">Тази функция може да възпрепятства достъпа до предоставените от оператора ви платени услуги за данни.</translation>
 <translation id="4095146165863963773">Да се изтрият ли данните на приложенията?</translation>
-<translation id="4099423833822562131">Изберете адрес за доставка, за да проверите начините за доставяне.</translation>
 <translation id="4099578267706723511">Помогнете за подобряването на Chrome, като изпращате до Google статистически данни за употребата и сигнали за сривове.</translation>
 <translation id="410351446219883937">Автоматично възпроизвеждане</translation>
 <translation id="411254640334432676">Изтеглянето не бе успешно.</translation>
@@ -412,6 +410,7 @@
 <translation id="572328651809341494">Скорошни раздели</translation>
 <translation id="5748802427693696783">Превключихте към стандартните раздели</translation>
 <translation id="5749068826913805084">Chrome се нуждае от достъп до хранилището, за да изтегля файлове.</translation>
+<translation id="57586589942790530">Невалиден номер на карта</translation>
 <translation id="5763382633136178763">Раздели в режим „инкогнито“</translation>
 <translation id="5765780083710877561">Описание:</translation>
 <translation id="5771382037724542929">Искате ли да замените съществуващия файл „<ph name="FILE_NAME" />“ в/ъв „<ph name="DIRECTORY_NAME" />“?</translation>
@@ -430,7 +429,6 @@
 <translation id="5911030830365207728">Google Преводач</translation>
 <translation id="5916664084637901428">Включено</translation>
 <translation id="5939518447894949180">Нулиране</translation>
-<translation id="5961742032223302715">Избиране на данни за връзка</translation>
 <translation id="5968595432776860642">„<ph name="VIDEO_TITLE" />“ се възпроизвежда</translation>
 <translation id="6010869025736512584">Осъществява се достъп до видеовхода</translation>
 <translation id="6012342843556706400">Chrome се нуждае от достъп до местоположението, за да го сподели с този сайт.</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 54d54ea..39e2544d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Pestanya d'incògnit nova</translation>
 <translation id="1871284979644508959">Camp obligatori</translation>
 <translation id="189172778771606813">Tanca el tauler de navegació</translation>
-<translation id="1924956916668006832">Mostra les adreces d'enviament</translation>
 <translation id="1933845786846280168">Pestanya seleccionada</translation>
 <translation id="194341124344773587">Activeu el permís per a Chrome a la <ph name="BEGIN_LINK" />configuració d'Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Desa les contrasenyes</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">Queden <ph name="SECONDS" /> segons</translation>
 <translation id="278029852808208386">No s'ha trobat cap dispositiu Bluetooth. <ph name="BEGIN_LINK" />Torneu a fer la cerca<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">Queda 1 segon</translation>
-<translation id="2781389167600714117">Mostra les opcions d'enviament</translation>
 <translation id="2811892995384186721">No veieu el vostre dispositiu? <ph name="BEGIN_LINK" />Obteniu ajuda<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Toqueu el botó Enrere per sortir de la pantalla completa.</translation>
 <translation id="2842985007712546952">Carpeta principal</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Inicieu la sessió a Chrome per accedir a les adreces d'interès des dels altres dispositius que tingueu.</translation>
 <translation id="3137521801621304719">Surt del mode d'incògnit</translation>
 <translation id="3149891296864842641">Opció d'enviament</translation>
-<translation id="3162882791484435636">Seleccioneu l'opció d'enviament</translation>
 <translation id="3177909033752230686">Idioma de la pàgina:</translation>
 <translation id="3190152372525844641">Activeu els permisos per a Chrome a la <ph name="BEGIN_LINK" />configuració d'Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> de dades desades</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Informació legal</translation>
 <translation id="4089831646916293264">És possible que aquesta funció interfereixi en l'accés als serveis de dades premium que us proporciona l'operador de telefonia mòbil.</translation>
 <translation id="4095146165863963773">Voleu esborrar les dades de l'aplicació?</translation>
-<translation id="4099423833822562131">Seleccioneu una adreça d'enviament per veure els mètodes d'enviament.</translation>
 <translation id="4099578267706723511">Ajudeu a millorar Chrome mitjançant l'enviament d'estadístiques d'ús i d'informes d'error a Google.</translation>
 <translation id="410351446219883937">Reproducció automàtica</translation>
 <translation id="411254640334432676">S'ha produït un error durant la baixada.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Traductor de Google</translation>
 <translation id="5916664084637901428">Activat</translation>
 <translation id="5939518447894949180">Restableix</translation>
-<translation id="5961742032223302715">Seleccioneu les dades de contacte</translation>
 <translation id="5968595432776860642">S'està reproduint "<ph name="VIDEO_TITLE" />"</translation>
 <translation id="6010869025736512584">S'està accedint a l'entrada de vídeo</translation>
 <translation id="6012342843556706400">Chrome necessita accés a la ubicació per compartir-la amb aquest lloc web.</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 9c5e5465..858b85c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Nová anonymní karta</translation>
 <translation id="1871284979644508959">Povinné pole</translation>
 <translation id="189172778771606813">Zavřít vysouvací panel navigace</translation>
-<translation id="1924956916668006832">Vybrat dodací adresu</translation>
 <translation id="1933845786846280168">Vybraná karta</translation>
 <translation id="194341124344773587">Oprávnění pro Chrome zapnete v <ph name="BEGIN_LINK" />Nastavení pro Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Ukládání hesel</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">Zbývá: <ph name="SECONDS" /> s</translation>
 <translation id="278029852808208386">Nebyla nalezena žádná zařízení Bluetooth. <ph name="BEGIN_LINK" />Hledat znovu<ph name="END_LINK" /></translation>
 <translation id="2781151931089541271">Zbývá: 1 s</translation>
-<translation id="2781389167600714117">Vybrat způsob dopravy</translation>
 <translation id="2811892995384186721">Nevidíte své zařízení? <ph name="BEGIN_LINK" />Prohlédněte si nápovědu<ph name="END_LINK" />.</translation>
 <translation id="2836148919159985482">Režim celé obrazovky ukončíte klepnutím na tlačítko Zpět.</translation>
 <translation id="2842985007712546952">Nadřazená složka</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Chcete-li získat přístup k záložkám ze svých ostatních zařízení, přihlaste se do Chromu.</translation>
 <translation id="3137521801621304719">Ukončit anonymní režim</translation>
 <translation id="3149891296864842641">Způsob dopravy</translation>
-<translation id="3162882791484435636">Vyberte způsob dopravy</translation>
 <translation id="3177909033752230686">Jazyk stránky:</translation>
 <translation id="3190152372525844641">Oprávnění pro Chrome zapnete v <ph name="BEGIN_LINK" />Nastavení pro Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905">Uložená data: <ph name="STORAGE_AMOUNT" /></translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Právní informace</translation>
 <translation id="4089831646916293264">Tato funkce může být v konfliktu s prémiovými datovými službami poskytovanými vaším operátorem.</translation>
 <translation id="4095146165863963773">Vymazat data aplikace?</translation>
-<translation id="4099423833822562131">Chcete-li zobrazit způsoby dopravy, vyberte dodací adresu.</translation>
 <translation id="4099578267706723511">Pomozte Chrome zlepšovat – posílejte Googlu statistiky využití a zprávy o selhání.</translation>
 <translation id="410351446219883937">Automatické přehrávání</translation>
 <translation id="411254640334432676">Stahování se nezdařilo.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Překladač Google</translation>
 <translation id="5916664084637901428">Zapnuto</translation>
 <translation id="5939518447894949180">Resetovat</translation>
-<translation id="5961742032223302715">Vybrat kontaktní údaje</translation>
 <translation id="5968595432776860642">Přehrávání videa <ph name="VIDEO_TITLE" /></translation>
 <translation id="6010869025736512584">Přístup k vstupu videa</translation>
 <translation id="6012342843556706400">Aby Chrome mohl s těmito webovými stránkami sdílet polohu, musí k ní mít přístup.</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 0cbf5aa..ae93e013 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Ny inkognitofane</translation>
 <translation id="1871284979644508959">Obligatorisk felt</translation>
 <translation id="189172778771606813">Luk sidemenuen</translation>
-<translation id="1924956916668006832">Vælg leveringsadresse</translation>
 <translation id="1933845786846280168">Valgt fane</translation>
 <translation id="194341124344773587">Aktivér tilladelse for Chrome i <ph name="BEGIN_LINK" />indstillingerne for Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Gem adgangskoder</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> sekunder tilbage</translation>
 <translation id="278029852808208386">Der blev ikke fundet nogen enheder. <ph name="BEGIN_LINK" />Søg igen<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">1 sekund tilbage</translation>
-<translation id="2781389167600714117">Vælg forsendelse</translation>
 <translation id="2811892995384186721">Kan du ikke se din enhed? <ph name="BEGIN_LINK" />Få hjælp<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Tryk på tilbageknappen for at afslutte fuld skærm.</translation>
 <translation id="2842985007712546952">Overordnet mappe</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Log ind på Chrome for at se dine bogmærker på dine andre enheder.</translation>
 <translation id="3137521801621304719">Slå inkognitotilstand fra</translation>
 <translation id="3149891296864842641">Forsendelsesmuligheder</translation>
-<translation id="3162882791484435636">Vælg forsendelsesmulighed</translation>
 <translation id="3177909033752230686">Sidens sprog:</translation>
 <translation id="3190152372525844641">Aktivér tilladelse for Chrome i <ph name="BEGIN_LINK" />Indstillinger for Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> gemte data</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Juridiske oplysninger</translation>
 <translation id="4089831646916293264">Denne funktion kan forstyrre adgangen til eksklusive datatjenester, der leveres af dit mobilselskab.</translation>
 <translation id="4095146165863963773">Vil du slette appdata?</translation>
-<translation id="4099423833822562131">Vælg en leveringsadresse for at se forsendelsesmetoder.</translation>
 <translation id="4099578267706723511">Hjælp med at gøre Chrome bedre ved at sende brugsstatistik og nedbrudsrapporter til Google.</translation>
 <translation id="410351446219883937">Autoplay</translation>
 <translation id="411254640334432676">Download mislykkedes.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Oversæt</translation>
 <translation id="5916664084637901428">Til</translation>
 <translation id="5939518447894949180">Nulstil</translation>
-<translation id="5961742032223302715">Vælg kontaktoplysninger</translation>
 <translation id="5968595432776860642">Afspiller "<ph name="VIDEO_TITLE" />"</translation>
 <translation id="6010869025736512584">Åbner videoinput</translation>
 <translation id="6012342843556706400">Chrome skal have adgang til din placering for at kunne dele den med dette website.</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 44fea68..26efc49 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Neuer Inkognito-Tab</translation>
 <translation id="1871284979644508959">Pflichtfeld</translation>
 <translation id="189172778771606813">Navigationsleiste schließen</translation>
-<translation id="1924956916668006832">Lieferadresse auswählen</translation>
 <translation id="1933845786846280168">Ausgewählter Tab</translation>
 <translation id="194341124344773587">Berechtigung für Chrome in den <ph name="BEGIN_LINK" />Android-Einstellungen<ph name="END_LINK" /> aktivieren</translation>
 <translation id="1943432128510653496">Passwörter speichern</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> Sekunden übrig</translation>
 <translation id="278029852808208386">Keine Bluetooth-Geräte gefunden. <ph name="BEGIN_LINK" />Wiederholen Sie die Suche.<ph name="END_LINK" /></translation>
 <translation id="2781151931089541271">1 Sekunde übrig</translation>
-<translation id="2781389167600714117">Versand auswählen</translation>
 <translation id="2811892995384186721">Ihr Gerät ist nicht zu sehen? <ph name="BEGIN_LINK" />Hilfe aufrufen<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Tippen Sie zum Beenden des Vollbildmodus auf die Zurück-Taste.</translation>
 <translation id="2842985007712546952">Übergeordneter Ordner</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Melden Sie sich in Chrome an, um Lesezeichen von Ihren anderen Geräten abzurufen.</translation>
 <translation id="3137521801621304719">Inkognitomodus deaktivieren</translation>
 <translation id="3149891296864842641">Versandoption</translation>
-<translation id="3162882791484435636">Versandoption auswählen</translation>
 <translation id="3177909033752230686">Sprache der Seite:</translation>
 <translation id="3190152372525844641">Berechtigungen für Chrome in den <ph name="BEGIN_LINK" />Android-Einstellungen<ph name="END_LINK" /> aktivieren</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> gespeicherte Daten</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Rechtliche Hinweise</translation>
 <translation id="4089831646916293264">Diese Funktion beeinträchtigt möglicherweise den Zugang zu Premium-Datendiensten, die von Ihrem Mobilfunkanbieter bereitgestellt werden.</translation>
 <translation id="4095146165863963773">App-Daten löschen?</translation>
-<translation id="4099423833822562131">Wählen Sie eine Versandadresse aus, um die Versandmethoden zu sehen.</translation>
 <translation id="4099578267706723511">Nutzungsstatistiken und Absturzberichte zur Verbesserung von Chrome an Google senden</translation>
 <translation id="410351446219883937">Autoplay</translation>
 <translation id="411254640334432676">Fehler beim Download</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Übersetzer</translation>
 <translation id="5916664084637901428">An</translation>
 <translation id="5939518447894949180">Zurücksetzen</translation>
-<translation id="5961742032223302715">Kontaktdaten auswählen</translation>
 <translation id="5968595432776860642">"<ph name="VIDEO_TITLE" />" wird abgespielt.</translation>
 <translation id="6010869025736512584">Zugriff auf Video-Eingang</translation>
 <translation id="6012342843556706400">Chrome benötigt Zugriff auf den Standort, um ihn für diese Website freizugeben.</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 e013cc5..9979b248 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Νέα καρτέλα ανώνυμης περιήγησης</translation>
 <translation id="1871284979644508959">Απαιτούμενο πεδίο</translation>
 <translation id="189172778771606813">Κλείσιμο συρταριού πλοήγησης</translation>
-<translation id="1924956916668006832">Επιλογή διεύθυνσης αποστολής</translation>
 <translation id="1933845786846280168">Επιλεγμένη καρτέλα</translation>
 <translation id="194341124344773587">Ενεργοποίηση των αδειών για το Chrome στις <ph name="BEGIN_LINK" />Ρυθμίσεις Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Αποθήκευση κωδικών πρόσβασης</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">Απομένουν <ph name="SECONDS" /> δευτερόλεπτα</translation>
 <translation id="278029852808208386">Δεν βρέθηκαν συσκευές Bluetooth. <ph name="BEGIN_LINK" />Νέα αναζήτηση<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">Απομένει 1 δευτερόλεπτο</translation>
-<translation id="2781389167600714117">Επιλογή αποστολής</translation>
 <translation id="2811892995384186721">Δεν βλέπετε τη συσκευή σας; <ph name="BEGIN_LINK" />Λάβετε βοήθεια<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Πατήστε το κουμπί επιστροφής για έξοδο από την πλήρη οθόνη.</translation>
 <translation id="2842985007712546952">Γονικός φάκελος</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Για να εμφανίζονται οι σελιδοδείκτες από τις άλλες συσκευές σας, συνδεθείτε στο Chrome.</translation>
 <translation id="3137521801621304719">Έξοδος από την κατάσταση ανώνυμης περιήγησης</translation>
 <translation id="3149891296864842641">Επιλογή αποστολής</translation>
-<translation id="3162882791484435636">Ορίστε επιλογή αποστολής</translation>
 <translation id="3177909033752230686">Γλώσσα σελίδας:</translation>
 <translation id="3190152372525844641">Ενεργοποίηση των αδειών για το Chrome στις <ph name="BEGIN_LINK" />Ρυθμίσεις Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> αποθηκευμένα δεδομένα</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Νομικές πληροφορίες</translation>
 <translation id="4089831646916293264">Αυτή η λειτουργία ενδέχεται να εμποδίζει την πρόσβαση σε υπηρεσίες δεδομένων υψηλής ποιότητας που παρέχονται από την εταιρεία κινητής τηλεφωνίας.</translation>
 <translation id="4095146165863963773">Διαγραφή δεδομένων εφαρμογών;</translation>
-<translation id="4099423833822562131">Επιλέξτε μια διεύθυνση αποστολής, για να ελέγξετε τους τρόπους αποστολής.</translation>
 <translation id="4099578267706723511">Συμβάλετε στη βελτίωση του Chrome, στέλνοντας στην Google στατιστικά στοιχεία χρήσης και αναφορές σφαλμάτων.</translation>
 <translation id="410351446219883937">Αυτόματη αναπαραγωγή</translation>
 <translation id="411254640334432676">Αποτυχία λήψης.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Μετάφραση Google</translation>
 <translation id="5916664084637901428">Ενεργό</translation>
 <translation id="5939518447894949180">Επαναφορά</translation>
-<translation id="5961742032223302715">Επιλογή στοιχείων επικοινωνίας</translation>
 <translation id="5968595432776860642">Αναπαραγωγή "<ph name="VIDEO_TITLE" />"</translation>
 <translation id="6010869025736512584">Πρόσβαση στην είσοδο βίντεο</translation>
 <translation id="6012342843556706400">Το Chrome χρειάζεται πρόσβαση στην τοποθεσία προκειμένου να την μοιραστεί με αυτόν τον ιστότοπο.</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 91007fe0..cb3449f 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
@@ -78,11 +78,11 @@
 <translation id="1853692000353488670">New incognito tab</translation>
 <translation id="1871284979644508959">Required field</translation>
 <translation id="189172778771606813">Close navigation drawer</translation>
-<translation id="1924956916668006832">Select shipping address</translation>
 <translation id="1933845786846280168">Selected Tab</translation>
 <translation id="194341124344773587">Turn on permission for Chrome in <ph name="BEGIN_LINK" />Android Settings<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Save passwords</translation>
 <translation id="1944384637046898011">Encrypt all with Google password as of <ph name="TIME" /></translation>
+<translation id="1946821392246652573">Cards accepted</translation>
 <translation id="1966710179511230534">Please update your sign-in details.</translation>
 <translation id="1974060860693918893">Advanced</translation>
 <translation id="1984321224716884559">Chrome Dev bookmarks</translation>
@@ -159,7 +159,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> secs left</translation>
 <translation id="278029852808208386">No Bluetooth devices found. <ph name="BEGIN_LINK" />Search again<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">1 sec left</translation>
-<translation id="2781389167600714117">Select shipping</translation>
 <translation id="2811892995384186721">Not seeing your device? <ph name="BEGIN_LINK" />Get help<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Touch the back button to exit full screen.</translation>
 <translation id="2842985007712546952">Parent folder</translation>
@@ -188,7 +187,6 @@
 <translation id="3117051980354074377">To get your bookmarks your other devices, sign in to Chrome.</translation>
 <translation id="3137521801621304719">Leave incognito mode</translation>
 <translation id="3149891296864842641">Delivery option</translation>
-<translation id="3162882791484435636">Select shipping option</translation>
 <translation id="3177909033752230686">Page language:</translation>
 <translation id="3190152372525844641">Turn on permissions for Chrome in <ph name="BEGIN_LINK" />Android Settings<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> stored data</translation>
@@ -216,6 +214,7 @@
 <translation id="3386292677130313581">Ask before allowing sites to know your location (recommended)</translation>
 <translation id="3387650086002190359"><ph name="FILE_NAME" /> download failed due to file system errors.</translation>
 <translation id="3414952576877147120">Size:</translation>
+<translation id="3431636764301398940">Save this card to this device</translation>
 <translation id="3435896845095436175">Enable</translation>
 <translation id="3452612588551937789">Sign in with your Google Account to get your bookmarks, history, passwords and other settings on all your devices.</translation>
 <translation id="3485544713029068372">Smart Lock for Passwords</translation>
@@ -261,7 +260,6 @@
 <translation id="4062305924942672200">Legal information</translation>
 <translation id="4089831646916293264">This feature may interfere with access to premium data services provided by your operator.</translation>
 <translation id="4095146165863963773">Delete app data?</translation>
-<translation id="4099423833822562131">Select a delivery address to check delivery methods.</translation>
 <translation id="4099578267706723511">Help make Chrome better by sending usage statistics and crash reports to Google.</translation>
 <translation id="410351446219883937">Autoplay</translation>
 <translation id="411254640334432676">Download failed.</translation>
@@ -412,6 +410,7 @@
 <translation id="572328651809341494">Recent tabs</translation>
 <translation id="5748802427693696783">Switched to standard tabs</translation>
 <translation id="5749068826913805084">Chrome needs storage access to download files.</translation>
+<translation id="57586589942790530">Invalid card number</translation>
 <translation id="5763382633136178763">Incognito tabs</translation>
 <translation id="5765780083710877561">Description:</translation>
 <translation id="5771382037724542929">Do you want to replace the existing <ph name="FILE_NAME" /> in <ph name="DIRECTORY_NAME" />?</translation>
@@ -430,7 +429,6 @@
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5916664084637901428">On</translation>
 <translation id="5939518447894949180">Reset</translation>
-<translation id="5961742032223302715">Select contact details</translation>
 <translation id="5968595432776860642">Playing “<ph name="VIDEO_TITLE" />”</translation>
 <translation id="6010869025736512584">Accessing video input</translation>
 <translation id="6012342843556706400">Chrome needs location access to share it with this site.</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 a726226..28100d4 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
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Nueva pestaña de incógnito</translation>
 <translation id="1871284979644508959">Campo obligatorio</translation>
 <translation id="189172778771606813">Cerrar panel lateral de navegación</translation>
-<translation id="1924956916668006832">Seleccionar la dirección de envío</translation>
 <translation id="1933845786846280168">Pestaña seleccionada</translation>
 <translation id="194341124344773587">Activa el permiso para Chrome en <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Guardar contraseñas</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> segundos restantes</translation>
 <translation id="278029852808208386">No se encontraron dispositivos Bluetooth. <ph name="BEGIN_LINK" />Vuelve a buscar<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">1 segundo restante</translation>
-<translation id="2781389167600714117">Seleccionar el envío</translation>
 <translation id="2811892995384186721">¿No ves el dispositivo? <ph name="BEGIN_LINK" />Obtén ayuda<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Toca el botón Atrás para salir de la pantalla completa.</translation>
 <translation id="2842985007712546952">Carpeta principal</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Accede a Chrome para obtener los marcadores de tus otros dispositivos.</translation>
 <translation id="3137521801621304719">Salir del modo de navegación de incógnito</translation>
 <translation id="3149891296864842641">Opción de envío</translation>
-<translation id="3162882791484435636">Seleccionar la opción de envío</translation>
 <translation id="3177909033752230686">Idioma de la página:</translation>
 <translation id="3190152372525844641">Activa los permisos para Chrome en <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905">Datos almacenados: <ph name="STORAGE_AMOUNT" /></translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Información legal</translation>
 <translation id="4089831646916293264">Esta función puede interferir con el acceso a servicios de datos de alta calidad brindados por el proveedor.</translation>
 <translation id="4095146165863963773">¿Borrar datos de app?</translation>
-<translation id="4099423833822562131">Selecciona una dirección de envío para ver los métodos de envío.</translation>
 <translation id="4099578267706723511">Envía las estadísticas de uso y los informes de fallos a Google para ayudarnos a mejorar Chrome.</translation>
 <translation id="410351446219883937">Reproducción automática</translation>
 <translation id="411254640334432676">Se produjo un error durante la descarga.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Traductor</translation>
 <translation id="5916664084637901428">Activada</translation>
 <translation id="5939518447894949180">Restablecer</translation>
-<translation id="5961742032223302715">Seleccionar información de contacto</translation>
 <translation id="5968595432776860642">Reproduciendo "<ph name="VIDEO_TITLE" />"</translation>
 <translation id="6010869025736512584">Accediendo a la entrada de video</translation>
 <translation id="6012342843556706400">Chrome necesita acceso a la ubicación para compartirla con este sitio.</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 4dd0cef..5b7dad6e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Nueva pestaña de incógnito</translation>
 <translation id="1871284979644508959">Campo obligatorio</translation>
 <translation id="189172778771606813">Cerrar panel de navegación</translation>
-<translation id="1924956916668006832">Seleccionar dirección de envío</translation>
 <translation id="1933845786846280168">Pestaña seleccionada</translation>
 <translation id="194341124344773587">Activa el permiso para Chrome en los <ph name="BEGIN_LINK" />ajustes de Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Guardar contraseñas</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">Quedan <ph name="SECONDS" /> segundos</translation>
 <translation id="278029852808208386">No se han encontrado dispositivos Bluetooth. <ph name="BEGIN_LINK" />Repite la búsqueda<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">Queda 1 segundo</translation>
-<translation id="2781389167600714117">Seleccionar envío</translation>
 <translation id="2811892995384186721">¿No aparece tu dispositivo? <ph name="BEGIN_LINK" />Obtén ayuda<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Toca el botón de retroceso para salir de la pantalla completa.</translation>
 <translation id="2842985007712546952">Carpeta principal</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Inicia sesión en Chrome para ver los marcadores de tus otros dispositivos.</translation>
 <translation id="3137521801621304719">Salir del modo incógnito</translation>
 <translation id="3149891296864842641">Opción de envío</translation>
-<translation id="3162882791484435636">Seleccionar opción de envío</translation>
 <translation id="3177909033752230686">Idioma de la página:</translation>
 <translation id="3190152372525844641">Activa los permisos para Chrome en los <ph name="BEGIN_LINK" />ajustes de Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> de datos almacenados</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Información legal</translation>
 <translation id="4089831646916293264">Esta función puede interferir con el acceso a servicios de datos premium ofrecidos por el operador.</translation>
 <translation id="4095146165863963773">¿Eliminar datos de la aplicación?</translation>
-<translation id="4099423833822562131">Selecciona una dirección de envío para consultar los métodos de envío.</translation>
 <translation id="4099578267706723511">Ayuda a mejorar Chrome enviando estadísticas de uso e informes sobre fallos.</translation>
 <translation id="410351446219883937">Reproducción automática</translation>
 <translation id="411254640334432676">Error de descarga.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Traductor de Google</translation>
 <translation id="5916664084637901428">Activar</translation>
 <translation id="5939518447894949180">Restablecer</translation>
-<translation id="5961742032223302715">Seleccionar detalles de contacto</translation>
 <translation id="5968595432776860642">Reproduciendo "<ph name="VIDEO_TITLE" />"</translation>
 <translation id="6010869025736512584">Accediendo a la entrada de vídeo</translation>
 <translation id="6012342843556706400">Chrome necesita acceder a la información de ubicación para compartirla con este sitio web.</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 b78c538..57c056c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">برگه جدید ناشناس</translation>
 <translation id="1871284979644508959">قسمت الزامی</translation>
 <translation id="189172778771606813">بستن کشوی پیمایش</translation>
-<translation id="1924956916668006832">انتخاب آدرس تحویل کالا</translation>
 <translation id="1933845786846280168">برگه انتخاب‌شده</translation>
 <translation id="194341124344773587">‏مجوز Chrome را در <ph name="BEGIN_LINK" />تنظیمات Android <ph name="END_LINK" /> روشن کنید.</translation>
 <translation id="1943432128510653496">ذخیره گذرواژه‌ها</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> ثانیه باقی‌مانده است</translation>
 <translation id="278029852808208386">دستگاه بلوتوثی پیدا نشد. <ph name="BEGIN_LINK" />دوباره جستجو کنید<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">۱ ثانیه باقی‌مانده است</translation>
-<translation id="2781389167600714117">انتخاب تحویل کالا</translation>
 <translation id="2811892995384186721">دستگاهتان را نمی‌بینید؟ <ph name="BEGIN_LINK" />دریافت راهنمایی<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">برای خروج از حالت تمام صفحه، دکمه برگشت را لمس کنید.</translation>
 <translation id="2842985007712546952">پوشه اصلی</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">‏برای دسترسی به نشانک‌هایتان در دستگاه‌های دیگر، به سیستم Chrome وارد شوید.</translation>
 <translation id="3137521801621304719">خروج از حالت ناشناس</translation>
 <translation id="3149891296864842641">گزینه ارسال</translation>
-<translation id="3162882791484435636">انتخاب گزینه ارسال</translation>
 <translation id="3177909033752230686">زبان صفحه:</translation>
 <translation id="3190152372525844641">‏مجوزهای Chrome را در <ph name="BEGIN_LINK" />تنظیمات Android <ph name="END_LINK" /> روشن کنید.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> داده‌های ذخیره شده</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">اطلاعات حقوقی</translation>
 <translation id="4089831646916293264">ممکن است این قابلیت با دسترسی به خدمات داده‌های برتر ارائه شده توسط شرکت مخابراتی شما تداخل داشته باشد.</translation>
 <translation id="4095146165863963773">داده‌های برنامه پاک شود؟</translation>
-<translation id="4099423833822562131">برای بررسی روش‌های ارسال کالا، آدرس تحویل کالا را انتخاب کنید.</translation>
 <translation id="4099578267706723511">‏‫با ارسال آمار کاربرد و گزارش‌های خرابی به Google، به بهتر شدن Chrome کمک کنید.</translation>
 <translation id="410351446219883937">پخش خودکار</translation>
 <translation id="411254640334432676">بارگیری نشد.</translation>
@@ -429,7 +425,6 @@
 <translation id="5911030830365207728">‏‫مترجم Google‬</translation>
 <translation id="5916664084637901428">روشن</translation>
 <translation id="5939518447894949180">بازنشانی</translation>
-<translation id="5961742032223302715">انتخاب جزئیات تماس</translation>
 <translation id="5968595432776860642">در حال پخش «<ph name="VIDEO_TITLE" />»</translation>
 <translation id="6010869025736512584">در حال دسترسی به ورودی ویدیویی</translation>
 <translation id="6012342843556706400">‏Chrome باید به موقعیت مکانی دسترسی داشته باشد تا آن را با این سایت به اشتراک بگذارد.</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 3aff217..1471dfa 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Uusi incognito-välilehti</translation>
 <translation id="1871284979644508959">Pakollinen tieto</translation>
 <translation id="189172778771606813">Sulje navigoinnin vetopaneeli</translation>
-<translation id="1924956916668006832">Valitse toimitusosoite</translation>
 <translation id="1933845786846280168">Valittu välilehti</translation>
 <translation id="194341124344773587">Ota käyttöoikeus käyttöön Chromelle <ph name="BEGIN_LINK" />Android-asetuksissa<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Salasanojen tallentaminen</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> sekuntia jäljellä</translation>
 <translation id="278029852808208386">Bluetooth-laitteita ei löytynyt. <ph name="BEGIN_LINK" />Hae uudelleen<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">1 sekunti jäljellä</translation>
-<translation id="2781389167600714117">Valitse toimitusvaihtoehdot</translation>
 <translation id="2811892995384186721">Etkö näe laitettasi? <ph name="BEGIN_LINK" />Tutustu ohjeisiin.<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Poistu koko näytön tilasta Takaisin-painikkeella.</translation>
 <translation id="2842985007712546952">Ylätason kansio</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Käytä kirjanmerkkejä muilta laitteiltasi kirjautumalla Chromeen.</translation>
 <translation id="3137521801621304719">Poistu incognito-tilasta</translation>
 <translation id="3149891296864842641">Toimitustapa</translation>
-<translation id="3162882791484435636">Valitse toimitustapa</translation>
 <translation id="3177909033752230686">Sivun kieli:</translation>
 <translation id="3190152372525844641">Ota käyttöoikeudet käyttöön Chromelle <ph name="BEGIN_LINK" />Android-asetuksissa<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> tallennettua tietoa</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Oikeudelliset tiedot</translation>
 <translation id="4089831646916293264">Tämä ominaisuus voi häiritä operaattorisi tarjoamien premium-tietopalveluiden käyttöä.</translation>
 <translation id="4095146165863963773">Poistetaanko sovellustiedot?</translation>
-<translation id="4099423833822562131">Näet toimitusvaihtoehdot valitsemalla toimitusosoitteen.</translation>
 <translation id="4099578267706723511">Auta parantamaan Chromea lähettämällä käyttötilastoja ja virheraportteja Googlelle.</translation>
 <translation id="410351446219883937">Automaattinen toisto</translation>
 <translation id="411254640334432676">Lataus epäonnistui.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Kääntäjä</translation>
 <translation id="5916664084637901428">Käytössä</translation>
 <translation id="5939518447894949180">Tyhjennä</translation>
-<translation id="5961742032223302715">Valitse yhteystiedot</translation>
 <translation id="5968595432776860642">Toistetaan videota <ph name="VIDEO_TITLE" />.</translation>
 <translation id="6010869025736512584">Videotuloa käytetään</translation>
 <translation id="6012342843556706400">Chrome tarvitsee sijainnin käyttöoikeuden voidakseen jakaa sen tämän sivuston kanssa.</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 d0ca5d0..ab29ab55 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Bagong tab na incognito</translation>
 <translation id="1871284979644508959">Kinakailangang field</translation>
 <translation id="189172778771606813">Isara ang navigation drawer</translation>
-<translation id="1924956916668006832">Pumili ng shipping address</translation>
 <translation id="1933845786846280168">Napiling Tab</translation>
 <translation id="194341124344773587">I-on ang pahintulot para sa Chrome sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">I-save ang mga password</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> (na) segundo na lang ang natitira</translation>
 <translation id="278029852808208386">Walang nakitang mga bluetooth device. <ph name="BEGIN_LINK" />Muling maghanap<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">1 segundo na lang ang natitira</translation>
-<translation id="2781389167600714117">Pumili ng pagpapadala</translation>
 <translation id="2811892995384186721">Hindi mo ba nakikita ang iyong device? <ph name="BEGIN_LINK" />Humingi ng tulong<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Pindutin ang button na bumalik upang lumabas sa full screen.</translation>
 <translation id="2842985007712546952">Pangunahing folder</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Upang mailagay ang iyong mga bookmark sa iba mo pang mga device, mag-sign in sa Chrome.</translation>
 <translation id="3137521801621304719">Umalis sa mode na incognito</translation>
 <translation id="3149891296864842641">Opsyon sa pagpapadala</translation>
-<translation id="3162882791484435636">Pumili ng opsyon sa pagpapadala</translation>
 <translation id="3177909033752230686">Wika ng Page:</translation>
 <translation id="3190152372525844641">I-on ang mga pahintulot para sa Chrome sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> ang nakaimbak na data</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Impormasyong legal</translation>
 <translation id="4089831646916293264">Maaaring makasagabal ang feature na ito sa pag-access ng mga premium na data service mula sa iyong carrier.</translation>
 <translation id="4095146165863963773">I-delete ang data ng app?</translation>
-<translation id="4099423833822562131">Pumili ng address sa pagpapadala upang makita ang mga paraan ng pagpapadala.</translation>
 <translation id="4099578267706723511">Tulungang mapahusay ang Chrome sa pamamagitan ng pagpapadala sa Google ng mga istatistika ng paggamit at ulat ng pag-crash.</translation>
 <translation id="410351446219883937">I-autoplay</translation>
 <translation id="411254640334432676">Hindi na-download.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5916664084637901428">Naka-on</translation>
 <translation id="5939518447894949180">I-reset</translation>
-<translation id="5961742032223302715">Pumili ng mga detalye sa pakikipag-ugnayan</translation>
 <translation id="5968595432776860642">Pine-play ang “<ph name="VIDEO_TITLE" />”</translation>
 <translation id="6010869025736512584">Ina-access ang input ng video</translation>
 <translation id="6012342843556706400">Kailangan ng Chrome ng access sa lokasyon upang maibahagi ito sa site na ito.</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 9969a21..1f15cfb 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Nouvel onglet de navigation privée</translation>
 <translation id="1871284979644508959">Veuillez compléter ce champ.</translation>
 <translation id="189172778771606813">Fermer le panneau de navigation</translation>
-<translation id="1924956916668006832">Sélectionner une adresse de livraison</translation>
 <translation id="1933845786846280168">Onglet sélectionné</translation>
 <translation id="194341124344773587">Activer l'autorisation pour Chrome dans les <ph name="BEGIN_LINK" />paramètres Android<ph name="END_LINK" /></translation>
 <translation id="1943432128510653496">Enregistrer les mots de passe</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> secondes restantes</translation>
 <translation id="278029852808208386">Aucun appareil Bluetooth trouvé. <ph name="BEGIN_LINK" />Relancez la recherche<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">1 seconde restante</translation>
-<translation id="2781389167600714117">Sélectionner une option de livraison</translation>
 <translation id="2811892995384186721">Votre appareil ne s'affiche pas ? <ph name="BEGIN_LINK" />Obtenir de l'aide<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Appuyez sur le bouton Retour pour quitter le mode plein écran.</translation>
 <translation id="2842985007712546952">Dossier parent</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Connectez-vous à Chrome pour accéder à vos favoris sur vos autres appareils.</translation>
 <translation id="3137521801621304719">Désactiver le mode navigation privée</translation>
 <translation id="3149891296864842641">Option d'expédition</translation>
-<translation id="3162882791484435636">Sélectionner une option d'expédition</translation>
 <translation id="3177909033752230686">Langue de la page :</translation>
 <translation id="3190152372525844641">Activer les autorisations pour Chrome dans les <ph name="BEGIN_LINK" />paramètres Android<ph name="END_LINK" /></translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> de données stockées</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Informations légales</translation>
 <translation id="4089831646916293264">Cette fonctionnalité peut perturber l'accès aux services de données premium fournis par votre opérateur.</translation>
 <translation id="4095146165863963773">Supprimer les données de l'application ?</translation>
-<translation id="4099423833822562131">Sélectionnez une adresse de livraison pour vérifier les méthodes d'expédition.</translation>
 <translation id="4099578267706723511">Envoyez des statistiques d'utilisation et des rapports d'erreur pour améliorer Chrome.</translation>
 <translation id="410351446219883937">Lecture automatique</translation>
 <translation id="411254640334432676">Échec du téléchargement.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Traduction</translation>
 <translation id="5916664084637901428">Activé</translation>
 <translation id="5939518447894949180">Réinitialiser</translation>
-<translation id="5961742032223302715">Sélectionner des coordonnées</translation>
 <translation id="5968595432776860642">Lecture de la vidéo "<ph name="VIDEO_TITLE" />" en cours…</translation>
 <translation id="6010869025736512584">Accès à l'entrée vidéo en cours…</translation>
 <translation id="6012342843556706400">Chrome doit disposer de l'accès à votre position pour la partager avec ce site.</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 56866e5..86c03b6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">नया गुप्त टैब</translation>
 <translation id="1871284979644508959">आवश्यक फ़ील्ड</translation>
 <translation id="189172778771606813">मार्गदर्शक ड्रॉवर बंद करें</translation>
-<translation id="1924956916668006832">शिपिंग पता चुनें</translation>
 <translation id="1933845786846280168">चयनित टैब</translation>
 <translation id="194341124344773587"><ph name="BEGIN_LINK" />Android सेटिंग<ph name="END_LINK" /> में Chrome के लिए अनुमति चालू करें.</translation>
 <translation id="1943432128510653496">पासवर्ड सहेजें</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> सेकंड शेष</translation>
 <translation id="278029852808208386">कोई ब्‍लूटूथ डिवाइस नहीं मिला. <ph name="BEGIN_LINK" />फिर से खोजें<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">1 सेकंड शेष</translation>
-<translation id="2781389167600714117">शिपिंग चुनें</translation>
 <translation id="2811892995384186721">आपका डिवाइस दिखाई नहीं दे रहा है? <ph name="BEGIN_LINK" />सहायता प्राप्त करें<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">पूर्ण स्क्रीन से बाहर निकलने के लिए वापस जाएं बटन स्पर्श करें.</translation>
 <translation id="2842985007712546952">मूल फ़ोल्‍डर</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">अपने अन्य डिवाइस पर अपने बुकमार्क प्राप्‍त करने के लिए, Chrome में प्रवेश करें.</translation>
 <translation id="3137521801621304719">गुप्त मोड छोड़ें</translation>
 <translation id="3149891296864842641">शिपिंग विकल्प</translation>
-<translation id="3162882791484435636">शिपिंग विकल्प चुनें</translation>
 <translation id="3177909033752230686">पृष्ठ की भाषा:</translation>
 <translation id="3190152372525844641"><ph name="BEGIN_LINK" />Android सेटिंग<ph name="END_LINK" /> में Chrome के लिए अनुमतियां चालू करें.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> संग्रहीत डेटा</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">वैधानिक जानकारी</translation>
 <translation id="4089831646916293264">यह सुविधा आपके वाहक द्वारा प्रदान की जाने वाली प्रीमियम डेटा सुविधाओं की ऐक्‍सेस में हस्तक्षेप कर सकती है.</translation>
 <translation id="4095146165863963773">ऐप्लिकेशन डेटा हटाएं?</translation>
-<translation id="4099423833822562131">शिपिंग की विधियां देखने के लिए एक शिपिंग पता चुनें.</translation>
 <translation id="4099578267706723511">Google को उपयोग के आंकड़े और क्रैश रिपोर्ट भेजकर Chrome को बेहतर बनाने में सहायता करें.</translation>
 <translation id="410351446219883937">स्वतः चलाएं</translation>
 <translation id="411254640334432676">डाउनलोड विफल रहा.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google अनुवाद</translation>
 <translation id="5916664084637901428">चालू</translation>
 <translation id="5939518447894949180">रीसेट करें</translation>
-<translation id="5961742032223302715">संपर्क विवरण चुनें</translation>
 <translation id="5968595432776860642">“<ph name="VIDEO_TITLE" />” चल रहा है</translation>
 <translation id="6010869025736512584">वीडियो इनपुट ऐक्सेस हो रहा है</translation>
 <translation id="6012342843556706400">Chrome को स्थान ऐक्सेस की आवश्यकता है ताकि स्थान को इस साइट के साथ साझा किया जा सके.</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 ff78816c2..963b8d9 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Nova anonimna kartica</translation>
 <translation id="1871284979644508959">Obavezno polje</translation>
 <translation id="189172778771606813">Zatvori ladicu za navigaciju</translation>
-<translation id="1924956916668006832">Odaberite adresu za dostavu</translation>
 <translation id="1933845786846280168">Odabrana kartica</translation>
 <translation id="194341124344773587">Uključite dopuštenje za Chrome u <ph name="BEGIN_LINK" />Postavkama Androida<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Spremanje zaporki</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">Preostalo sekundi: <ph name="SECONDS" /></translation>
 <translation id="278029852808208386">Nije pronađen nijedan Bluetooth uređaj. <ph name="BEGIN_LINK" />Pretražite ponovo<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">Još 1 s</translation>
-<translation id="2781389167600714117">Odaberite dostavu</translation>
 <translation id="2811892995384186721">Ne vidite svoj uređaj? <ph name="BEGIN_LINK" />Potražite pomoć<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Dodirnite gumb Natrag da biste zatvorili prikaz na cijelom zaslonu.</translation>
 <translation id="2842985007712546952">Nadređena mapa</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Da bi se prikazale oznake s vaših ostalih uređaja, prijavite se na Chrome.</translation>
 <translation id="3137521801621304719">Izlaz iz anonimnog načina</translation>
 <translation id="3149891296864842641">Opcija otpreme</translation>
-<translation id="3162882791484435636">Odaberite opciju otpreme</translation>
 <translation id="3177909033752230686">Jezik stranice:</translation>
 <translation id="3190152372525844641">Uključite dopuštenja za Chrome u <ph name="BEGIN_LINK" />Postavkama Androida<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905">Pohranjeni podaci: <ph name="STORAGE_AMOUNT" /></translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Pravne informacije</translation>
 <translation id="4089831646916293264">Ta značajka može ometati pristup premium podatkovnim uslugama koje pruža vaš mobilni operater.</translation>
 <translation id="4095146165863963773">Želite li izbrisati podatke aplikacije?</translation>
-<translation id="4099423833822562131">Odaberite adresu za dostavu da biste provjerili načine dostave.</translation>
 <translation id="4099578267706723511">Poboljšajte Chrome šaljući Googleu statistike upotrebe i izvješća o rušenju.</translation>
 <translation id="410351446219883937">Automatska reprodukcija</translation>
 <translation id="411254640334432676">Preuzimanje nije uspjelo.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google prevoditelj</translation>
 <translation id="5916664084637901428">Uključi</translation>
 <translation id="5939518447894949180">Ponovno postavi</translation>
-<translation id="5961742032223302715">Odaberite podatke za kontakt</translation>
 <translation id="5968595432776860642">Reproducira se "<ph name="VIDEO_TITLE" />"</translation>
 <translation id="6010869025736512584">Pristupanje videoulazu</translation>
 <translation id="6012342843556706400">Chrome treba imati pristup lokaciji da bi je dijelio s ovom web-lokacijom.</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 97fa166a..9b7f0f68 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Új inkognitólap</translation>
 <translation id="1871284979644508959">Kötelező mező</translation>
 <translation id="189172778771606813">Navigációs fiók bezárása</translation>
-<translation id="1924956916668006832">Szállítási cím kiválasztása</translation>
 <translation id="1933845786846280168">Kiválasztott lap</translation>
 <translation id="194341124344773587">A Chrome-ra vonatkozó engedély aktiválása az <ph name="BEGIN_LINK" />Android beállításaiban<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Jelszavak mentése</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> másodperc van hátra</translation>
 <translation id="278029852808208386">Nem találhatók Bluetooth-eszközök. <ph name="BEGIN_LINK" />Újbóli keresés<ph name="END_LINK" /></translation>
 <translation id="2781151931089541271">1 másodperc van hátra</translation>
-<translation id="2781389167600714117">Szállítási lehetőségek kiválasztása</translation>
 <translation id="2811892995384186721">Nem látja eszközét? <ph name="BEGIN_LINK" />Kérjen segítséget<ph name="END_LINK" />.</translation>
 <translation id="2836148919159985482">A teljes képernyős megjelenítésből való kilépéshez koppintson a vissza gombra.</translation>
 <translation id="2842985007712546952">Szülőmappa</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Ha a többi eszközén is szeretné elérni könyvjelzőit, jelentkezzen be a Chrome-ba.</translation>
 <translation id="3137521801621304719">Kilépés inkognitómódból</translation>
 <translation id="3149891296864842641">Szállítási lehetőség</translation>
-<translation id="3162882791484435636">Szállítási lehetőség kiválasztása</translation>
 <translation id="3177909033752230686">Az oldal nyelve</translation>
 <translation id="3190152372525844641">A Chrome-ra vonatkozó engedélyek aktiválása az <ph name="BEGIN_LINK" />Android beállításaiban<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> tárolt adat</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Jogi információk</translation>
 <translation id="4089831646916293264">Ez a funkció megakadályozhatja a szolgáltatója által kínált prémium adatszolgáltatásokhoz való hozzáférést.</translation>
 <translation id="4095146165863963773">Törli az alkalmazásadatokat?</translation>
-<translation id="4099423833822562131">Válasszon szállítási címet a szállítási módok ellenőrzéséhez.</translation>
 <translation id="4099578267706723511">Használati statisztikák és hibajelentések küldésével segíthet a Google-nak a Chrome fejlesztésében.</translation>
 <translation id="410351446219883937">Automatikus lejátszás</translation>
 <translation id="411254640334432676">A letöltés sikertelen.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Fordító</translation>
 <translation id="5916664084637901428">Be</translation>
 <translation id="5939518447894949180">Visszaállítás</translation>
-<translation id="5961742032223302715">Részletes névjegyadatok kiválasztása</translation>
 <translation id="5968595432776860642">„<ph name="VIDEO_TITLE" />” lejátszása</translation>
 <translation id="6010869025736512584">Hozzáférés videobemenethez</translation>
 <translation id="6012342843556706400">A Chrome-nak rendelkeznie kell hozzáféréssel a tartózkodási helyhez, hogy megoszthassa ezzel a webhellyel.</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 0aa9f76..7246088 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Tab penyamaran baru</translation>
 <translation id="1871284979644508959">Bidang wajib diisi</translation>
 <translation id="189172778771606813">Tutup panel samping navigasi</translation>
-<translation id="1924956916668006832">Pilih alamat pengiriman</translation>
 <translation id="1933845786846280168">Tab yang Dipilih</translation>
 <translation id="194341124344773587">Aktifkan izin untuk Chrome di <ph name="BEGIN_LINK" />Setelan Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Simpan sandi</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> detik lagi</translation>
 <translation id="278029852808208386">Tidak ditemukan perangkat bluetooth. <ph name="BEGIN_LINK" />Telusuri lagi<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">1 detik lagi</translation>
-<translation id="2781389167600714117">Pilih opsi pengiriman</translation>
 <translation id="2811892995384186721">Tidak melihat perangkat? <ph name="BEGIN_LINK" />Dapatkan bantuan<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Ketuk tombol kembali untuk keluar dari mode layar penuh.</translation>
 <translation id="2842985007712546952">Folder induk</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Untuk mendapatkan bookmark dari perangkat lainnya, masuk ke Chrome.</translation>
 <translation id="3137521801621304719">Tutup mode penyamaran</translation>
 <translation id="3149891296864842641">Opsi pengiriman</translation>
-<translation id="3162882791484435636">Pilih opsi pengiriman</translation>
 <translation id="3177909033752230686">Bahasa Laman:</translation>
 <translation id="3190152372525844641">Aktifkan izin untuk Chrome di <ph name="BEGIN_LINK" />Setelan Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> data tersimpan</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Informasi hukum</translation>
 <translation id="4089831646916293264">Fitur ini dapat mengganggu akses ke layanan data premium yang disediakan oleh operator Anda.</translation>
 <translation id="4095146165863963773">Hapus data aplikasi?</translation>
-<translation id="4099423833822562131">Pilih alamat pengiriman untuk memeriksa metode pengiriman.</translation>
 <translation id="4099578267706723511">Bantu penyempurnaan Chrome dengan mengirimkan statistik penggunaan dan laporan kerusakan ke Google.</translation>
 <translation id="410351446219883937">Putar otomatis</translation>
 <translation id="411254640334432676">Unduhan gagal.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Terjemahan</translation>
 <translation id="5916664084637901428">Aktif</translation>
 <translation id="5939518447894949180">Setel ulang</translation>
-<translation id="5961742032223302715">Pilih detail kontak</translation>
 <translation id="5968595432776860642">Memutar “<ph name="VIDEO_TITLE" />”</translation>
 <translation id="6010869025736512584">Mengakses masukan video</translation>
 <translation id="6012342843556706400">Chrome memerlukan akses lokasi untuk berbagi dengan situs ini.</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 192c1be..d0787cf 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Nuova scheda in incognito</translation>
 <translation id="1871284979644508959">Campo obbligatorio</translation>
 <translation id="189172778771606813">Chiudi riquadro di navigazione a scomparsa</translation>
-<translation id="1924956916668006832">Seleziona indirizzo di spedizione</translation>
 <translation id="1933845786846280168">Scheda selezionata</translation>
 <translation id="194341124344773587">Abilita l'autorizzazione per Chrome in <ph name="BEGIN_LINK" />Impostazioni Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Salva password</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> sec rimanenti</translation>
 <translation id="278029852808208386">Nessun dispositivo Bluetooth trovato. <ph name="BEGIN_LINK" />Esegui di nuovo la ricerca<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">1 sec rimanente</translation>
-<translation id="2781389167600714117">Seleziona spedizione</translation>
 <translation id="2811892995384186721">Non trovi il tuo dispositivo? <ph name="BEGIN_LINK" />Ricevi assistenza<ph name="END_LINK" />.</translation>
 <translation id="2836148919159985482">Tocca il pulsante Indietro per uscire dalla modalità a schermo intero.</translation>
 <translation id="2842985007712546952">Cartella principale</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Accedi a Chrome per trovare i tuoi preferiti degli altri dispositivi.</translation>
 <translation id="3137521801621304719">Esci dalla modalità di navigazione in incognito</translation>
 <translation id="3149891296864842641">Opzione di spedizione</translation>
-<translation id="3162882791484435636">Seleziona un'opzione di spedizione</translation>
 <translation id="3177909033752230686">Lingua della pagina:</translation>
 <translation id="3190152372525844641">Abilita le autorizzazioni per Chrome in <ph name="BEGIN_LINK" />Impostazioni Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> di dati memorizzati</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Informazioni legali</translation>
 <translation id="4089831646916293264">Questa funzione potrebbe interferire con l'accesso ai servizi di dati premium forniti dal tuo operatore.</translation>
 <translation id="4095146165863963773">Eliminare i dati delle app?</translation>
-<translation id="4099423833822562131">Seleziona un indirizzo di spedizione per verificare i metodi di spedizione disponibili.</translation>
 <translation id="4099578267706723511">Aiutaci a migliorare Chrome inviando a Google statistiche sull'utilizzo e rapporti sugli arresti anomali.</translation>
 <translation id="410351446219883937">Riproduzione automatica</translation>
 <translation id="411254640334432676">Download non riuscito.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Traduttore</translation>
 <translation id="5916664084637901428">On</translation>
 <translation id="5939518447894949180">Ripristina</translation>
-<translation id="5961742032223302715">Seleziona le informazioni di contatto</translation>
 <translation id="5968595432776860642">"<ph name="VIDEO_TITLE" />" in riproduzione</translation>
 <translation id="6010869025736512584">Accesso all'input video in corso</translation>
 <translation id="6012342843556706400">Chrome deve avere accesso alla posizione per condividerla con questo sito.</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 1d0959a..645fa09 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">כרטיסייה חדשה לגלישה בסתר</translation>
 <translation id="1871284979644508959">שדה חובה</translation>
 <translation id="189172778771606813">סגור את חלונית ההזזה לניווט</translation>
-<translation id="1924956916668006832">בחר כתובת למשלוח</translation>
 <translation id="1933845786846280168">הכרטיסייה שנבחרה</translation>
 <translation id="194341124344773587">‏הפעל הרשאה בשביל Chrome ב<ph name="BEGIN_LINK" />הגדרות Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">שמור סיסמאות</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">נותרו <ph name="SECONDS" /> שניות</translation>
 <translation id="278029852808208386">‏לא נמצאו מכשירי Bluetooth. <ph name="BEGIN_LINK" />חפש שוב<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">נותרה שניה אחת</translation>
-<translation id="2781389167600714117">בחר אפשרויות משלוח</translation>
 <translation id="2811892995384186721">אינך רואה את המכשיר? <ph name="BEGIN_LINK" />קבל עזרה<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">כדי לצאת ממסך מלא, גע בלחצן 'הקודם'.</translation>
 <translation id="2842985007712546952">תיקיית אב</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">‏כדי לקבל את הסימניות מהמכשירים האחרים שלך, היכנס ל-Chrome.</translation>
 <translation id="3137521801621304719">צא ממצב גלישה בסתר</translation>
 <translation id="3149891296864842641">אפשרויות משלוח</translation>
-<translation id="3162882791484435636">בחר באפשרות משלוח</translation>
 <translation id="3177909033752230686">שפת הדף:</translation>
 <translation id="3190152372525844641">‏הפעל הרשאות בשביל Chrome ב<ph name="BEGIN_LINK" />הגדרות Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905">נתונים מאוחסנים בנפח <ph name="STORAGE_AMOUNT" /></translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">מידע משפטי</translation>
 <translation id="4089831646916293264">התכונה הזו עשויה להפריע לגישה אל שירותי נתונים בתשלום הניתנים על ידי הספק שלך.</translation>
 <translation id="4095146165863963773">למחוק נתוני יישומים?</translation>
-<translation id="4099423833822562131">בחר כתובת למשלוח כדי לבדוק את שיטות המשלוח.</translation>
 <translation id="4099578267706723511">‏עזור לשפר את Chrome על ידי שליחה של סטטיסטיקת שימוש ודוחות קריסה אל Google.</translation>
 <translation id="410351446219883937">הפעלה אוטומטית</translation>
 <translation id="411254640334432676">ההורדה נכשלה.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5916664084637901428">פועל</translation>
 <translation id="5939518447894949180">אפס</translation>
-<translation id="5961742032223302715">בחר פרטים ליצירת קשר</translation>
 <translation id="5968595432776860642">מפעיל את "<ph name="VIDEO_TITLE" />"</translation>
 <translation id="6010869025736512584">גישה לפלט אודיו</translation>
 <translation id="6012342843556706400">‏Chrome זקוק לגישה אל המיקום כדי לשתף אותו עם האתר הזה.</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 a2baa2e6..201d691 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">新しいシークレット タブ</translation>
 <translation id="1871284979644508959">必須フィールド</translation>
 <translation id="189172778771606813">操作パネルを閉じる</translation>
-<translation id="1924956916668006832">配送先住所を選択</translation>
 <translation id="1933845786846280168">選択したタブ</translation>
 <translation id="194341124344773587"><ph name="BEGIN_LINK" />Android の設定<ph name="END_LINK" />で Chrome の権限を有効にしてください。</translation>
 <translation id="1943432128510653496">パスワードを保存する</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">残り <ph name="SECONDS" /> 秒</translation>
 <translation id="278029852808208386">Bluetooth デバイスが見つかりませんでした。<ph name="BEGIN_LINK" />もう一度検索してください<ph name="END_LINK" />。</translation>
 <translation id="2781151931089541271">残り 1 秒</translation>
-<translation id="2781389167600714117">配送方法を選択</translation>
 <translation id="2811892995384186721">お使いの端末が表示されない場合は、<ph name="BEGIN_LINK" />ヘルプ<ph name="END_LINK" />をご覧ください。</translation>
 <translation id="2836148919159985482">全画面表示を終了するには戻るボタンをタップします。</translation>
 <translation id="2842985007712546952">親フォルダ</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">他の端末と同じブックマークを使用するには Chrome にログインします。</translation>
 <translation id="3137521801621304719">シークレット モードを終了</translation>
 <translation id="3149891296864842641">配送オプション</translation>
-<translation id="3162882791484435636">配送オプションを選択</translation>
 <translation id="3177909033752230686">ページの言語:</translation>
 <translation id="3190152372525844641"><ph name="BEGIN_LINK" />Android の設定<ph name="END_LINK" />で Chrome の権限を有効にしてください。</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> の保存データ</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">法的情報</translation>
 <translation id="4089831646916293264">この機能により、携帯通信会社が提供するプレミアム データサービスの利用に問題が発生する可能性があります。</translation>
 <translation id="4095146165863963773">アプリデータを削除しますか?</translation>
-<translation id="4099423833822562131">配送方法を確認するには配送先住所を選択します。</translation>
 <translation id="4099578267706723511">使用統計情報と障害レポートを Google に送信して、Chrome の品質向上にご協力ください。</translation>
 <translation id="410351446219883937">自動再生</translation>
 <translation id="411254640334432676">ダウンロードできませんでした。</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google 翻訳</translation>
 <translation id="5916664084637901428">オン</translation>
 <translation id="5939518447894949180">リセット</translation>
-<translation id="5961742032223302715">連絡先情報を選択</translation>
 <translation id="5968595432776860642">「<ph name="VIDEO_TITLE" />」を再生しています</translation>
 <translation id="6010869025736512584">ビデオ入力にアクセスしています</translation>
 <translation id="6012342843556706400">このサイトと位置情報を共有するには Chrome に位置情報へのアクセスを許可する必要があります。</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 1aad49a..981ebf0b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -78,11 +78,11 @@
 <translation id="1853692000353488670">새 시크릿 탭</translation>
 <translation id="1871284979644508959">필수 입력란</translation>
 <translation id="189172778771606813">탐색 창 닫기</translation>
-<translation id="1924956916668006832">배송지 주소 선택</translation>
 <translation id="1933845786846280168">선택된 탭</translation>
 <translation id="194341124344773587"><ph name="BEGIN_LINK" />Android 설정<ph name="END_LINK" />에서 Chrome 관련 권한을 설정합니다.</translation>
 <translation id="1943432128510653496">비밀번호 저장</translation>
 <translation id="1944384637046898011"><ph name="TIME" />에 Google 비밀번호로 전체 데이터 암호화</translation>
+<translation id="1946821392246652573">카드 사용 가능</translation>
 <translation id="1966710179511230534">로그인 세부정보를 업데이트하세요.</translation>
 <translation id="1974060860693918893">고급</translation>
 <translation id="1984321224716884559">Chrome 개발자 북마크</translation>
@@ -159,7 +159,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" />초 남음</translation>
 <translation id="278029852808208386">블루투스 기기를 찾을 수 없습니다. <ph name="BEGIN_LINK" />다시 검색하세요<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">1초 남음</translation>
-<translation id="2781389167600714117">배송 선택</translation>
 <translation id="2811892995384186721">기기가 표시되지 않나요? <ph name="BEGIN_LINK" />도움 받기<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">전체화면을 종료하려면 뒤로 버튼을 터치하세요.</translation>
 <translation id="2842985007712546952">상위 폴더</translation>
@@ -188,7 +187,6 @@
 <translation id="3117051980354074377">다른 기기에서 북마크를 가져오려면 Chrome에 로그인하세요.</translation>
 <translation id="3137521801621304719">시크릿 모드 나가기</translation>
 <translation id="3149891296864842641">배송 옵션</translation>
-<translation id="3162882791484435636">배송 옵션 선택</translation>
 <translation id="3177909033752230686">페이지 언어:</translation>
 <translation id="3190152372525844641"><ph name="BEGIN_LINK" />Android 설정<ph name="END_LINK" />에서 Chrome 관련 권한을 설정합니다.</translation>
 <translation id="3198916472715691905">저장 데이터 <ph name="STORAGE_AMOUNT" /></translation>
@@ -216,6 +214,7 @@
 <translation id="3386292677130313581">사이트에서 내 위치를 파악하도록 허용하기 전에 확인(권장)</translation>
 <translation id="3387650086002190359">파일 시스템에 오류가 발생하여 <ph name="FILE_NAME" />을(를) 다운로드할 수 없습니다.</translation>
 <translation id="3414952576877147120">크기:</translation>
+<translation id="3431636764301398940">기기에 카드 저장</translation>
 <translation id="3435896845095436175">사용</translation>
 <translation id="3452612588551937789">Google 계정으로 로그인하면 모든 기기에서 북마크, 방문 기록, 비밀번호 및 기타 설정을 사용할 수 있습니다.</translation>
 <translation id="3485544713029068372">비밀번호 대용 Smart Lock</translation>
@@ -261,7 +260,6 @@
 <translation id="4062305924942672200">법적 정보</translation>
 <translation id="4089831646916293264">이 기능을 사용하면 이동통신사에서 제공하는 프리미엄 데이터 서비스에 액세스하는 데 문제가 생길 수 있습니다.</translation>
 <translation id="4095146165863963773">앱 데이터를 삭제하시겠습니까?</translation>
-<translation id="4099423833822562131">배송 방법을 확인할 수 있도록 배송지 주소를 선택하세요.</translation>
 <translation id="4099578267706723511">사용 통계와 오류 보고서를 Google로 전송하면 Chrome 개선에 도움이 됩니다.</translation>
 <translation id="410351446219883937">자동재생</translation>
 <translation id="411254640334432676">다운로드에 실패했습니다.</translation>
@@ -412,6 +410,7 @@
 <translation id="572328651809341494">최근 탭</translation>
 <translation id="5748802427693696783">일반 탭으로 전환됨</translation>
 <translation id="5749068826913805084">Chrome에서 파일을 다운로드하려면 저장소 액세스 권한이 있어야 합니다.</translation>
+<translation id="57586589942790530">카드 번호가 잘못되었습니다.</translation>
 <translation id="5763382633136178763">시크릿 탭</translation>
 <translation id="5765780083710877561">설명:</translation>
 <translation id="5771382037724542929"><ph name="DIRECTORY_NAME" />에 있는 기존 <ph name="FILE_NAME" /> 파일을 바꾸시겠습니까?</translation>
@@ -430,7 +429,6 @@
 <translation id="5911030830365207728">Google 번역</translation>
 <translation id="5916664084637901428">사용</translation>
 <translation id="5939518447894949180">초기화</translation>
-<translation id="5961742032223302715">연락처 세부정보 선택</translation>
 <translation id="5968595432776860642">'<ph name="VIDEO_TITLE" />' 재생 중</translation>
 <translation id="6010869025736512584">비디오 입력 장치에 액세스 중</translation>
 <translation id="6012342843556706400">이 사이트에 공유하려면 Chrome에 위치 정보 액세스 권한이 있어야 합니다.</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 3e57ea8..fe9023ea 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Naujas inkognito skirtukas</translation>
 <translation id="1871284979644508959">Būtinas laukas</translation>
 <translation id="189172778771606813">Uždaryti naršymo skydelį</translation>
-<translation id="1924956916668006832">Pasirinkti pristatymo adresą</translation>
 <translation id="1933845786846280168">Pasirinktas skirtukas</translation>
 <translation id="194341124344773587">Įjunkite „Chrome“ leidimą <ph name="BEGIN_LINK" />„Android“ nustatymuose<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Slaptažodžių išsaugojimas</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">Liko <ph name="SECONDS" /> sek.</translation>
 <translation id="278029852808208386">Nerasta „Bluetooth“ įrenginių. <ph name="BEGIN_LINK" />Ieškokite dar kartą<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">Liko 1 sek.</translation>
-<translation id="2781389167600714117">Pasirinkti pristatymą</translation>
 <translation id="2811892995384186721">Nematote savo įrenginio? <ph name="BEGIN_LINK" />Gaukite pagalbos<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Palieskite mygtuką „Atgal“, kad išeitumėte iš viso ekrano režimo.</translation>
 <translation id="2842985007712546952">Viršaplankis</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Prisijunkite prie „Chrome“, kad pasiektumėte žymes iš kitų įrenginių.</translation>
 <translation id="3137521801621304719">Išjungti inkognito režimą</translation>
 <translation id="3149891296864842641">Pristatymo parinktis</translation>
-<translation id="3162882791484435636">Pasirinkti pristatymo parinktį</translation>
 <translation id="3177909033752230686">Puslapio kalba:</translation>
 <translation id="3190152372525844641">Įjunkite „Chrome“ leidimus <ph name="BEGIN_LINK" />„Android“ nustatymuose<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905">Išsaugota duomenų: <ph name="STORAGE_AMOUNT" /></translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Teisinė informacija</translation>
 <translation id="4089831646916293264">Ši funkcija gali trukdyti pasiekti papildomas operatoriaus teikiamas duomenų paslaugas.</translation>
 <translation id="4095146165863963773">Ištrinti programos duomenis?</translation>
-<translation id="4099423833822562131">Pasirinkite pristatymo adresą, kad patikrintumėte pristatymo metodus.</translation>
 <translation id="4099578267706723511">Padėkite tobulinti „Chrome“ siųsdami „Google“ naudojimo statistiką ir strigčių ataskaitas.</translation>
 <translation id="410351446219883937">Automatinis paleidimas</translation>
 <translation id="411254640334432676">Nepavyko atsisiųsti.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">„Google“ vertėjas</translation>
 <translation id="5916664084637901428">Įjungta</translation>
 <translation id="5939518447894949180">Nustatyti iš naujo</translation>
-<translation id="5961742032223302715">Pasirinkti išsamią kontaktinę informaciją</translation>
 <translation id="5968595432776860642">Leidžiamas „<ph name="VIDEO_TITLE" />“</translation>
 <translation id="6010869025736512584">Pasiekiama vaizdo įrašų įvestis</translation>
 <translation id="6012342843556706400">„Chrome“ reikia galimybės pasiekti vietovės informaciją, kad ją būtų galima bendrinti su šia svetaine.</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 20977df..dfa1f7d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Jauna inkognito cilne</translation>
 <translation id="1871284979644508959">Obligātais lauks</translation>
 <translation id="189172778771606813">Aizvērt navigācijas atvilktni</translation>
-<translation id="1924956916668006832">Atlasīt piegādes adresi</translation>
 <translation id="1933845786846280168">Atlasītā cilne</translation>
 <translation id="194341124344773587"><ph name="BEGIN_LINK" />Android iestatījumos<ph name="END_LINK" /> ieslēdziet atļauju pārlūkam Chrome.</translation>
 <translation id="1943432128510653496">Paroļu saglabāšana</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">Atlikušas <ph name="SECONDS" /> s</translation>
 <translation id="278029852808208386">Netika atrasta neviena Bluetooth ierīce. <ph name="BEGIN_LINK" />Meklējiet vēlreiz<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">Atlikusi 1 s</translation>
-<translation id="2781389167600714117">Atlasīt piegādes iespējas</translation>
 <translation id="2811892995384186721">Vai jūsu ierīce netiek rādīta? <ph name="BEGIN_LINK" />Saņemiet palīdzību<ph name="END_LINK" />.</translation>
 <translation id="2836148919159985482">Lai izietu no pilnekrāna režīma, pieskarieties pogai Atpakaļ.</translation>
 <translation id="2842985007712546952">Vecākmape</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Pierakstieties pārlūkā Chrome, lai būtu pieejamas grāmatzīmes no citām jūsu ierīcēm.</translation>
 <translation id="3137521801621304719">Iziet no inkognito režīma</translation>
 <translation id="3149891296864842641">Piegādes iespēja</translation>
-<translation id="3162882791484435636">Atlasīt piegādes iespēju</translation>
 <translation id="3177909033752230686">Lapas valoda:</translation>
 <translation id="3190152372525844641"><ph name="BEGIN_LINK" />Android iestatījumos<ph name="END_LINK" /> ieslēdziet atļaujas pārlūkam Chrome.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> saglabātu datu</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Juridiskā informācija</translation>
 <translation id="4089831646916293264">Šī funkcija var ietekmēt piekļuvi paaugstinātas maksas datu pakalpojumiem, kurus nodrošina jūsu mobilo sakaru operators.</translation>
 <translation id="4095146165863963773">Vai dzēst lietotnes datus?</translation>
-<translation id="4099423833822562131">Atlasiet piegādes adresi, lai skatītu piegādes veidus.</translation>
 <translation id="4099578267706723511">Uzlabojiet pārlūku Chrome, uzņēmumam Google sūtot lietojuma statistiku un avāriju pārskatus.</translation>
 <translation id="410351446219883937">Automātiskā atskaņošana</translation>
 <translation id="411254640334432676">Lejupielāde neizdevās.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google tulkotājs</translation>
 <translation id="5916664084637901428">Iesl.</translation>
 <translation id="5939518447894949180">Atiestatīt</translation>
-<translation id="5961742032223302715">Atlasīt kontaktinformāciju</translation>
 <translation id="5968595432776860642">Notiek videoklipa “<ph name="VIDEO_TITLE" />” atskaņošana</translation>
 <translation id="6010869025736512584">Notiek piekļūšana video ievadei</translation>
 <translation id="6012342843556706400">Pārlūkam Chrome ir nepieciešama piekļuve atrašanās vietai, lai kopīgotu to ar šo vietni.</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 1f960d0..b76387b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Nieuw incognitotabblad</translation>
 <translation id="1871284979644508959">Verplicht veld</translation>
 <translation id="189172778771606813">Zijmenu sluiten</translation>
-<translation id="1924956916668006832">Verzendadres selecteren</translation>
 <translation id="1933845786846280168">Geselecteerd tabblad</translation>
 <translation id="194341124344773587">Schakel het recht in voor Chrome via de <ph name="BEGIN_LINK" />Android-instellingen<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Wachtwoorden opslaan</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> seconden resterend</translation>
 <translation id="278029852808208386">Geen Bluetooth-apparaten gevonden. <ph name="BEGIN_LINK" />Zoek nogmaals<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">1 seconde resterend</translation>
-<translation id="2781389167600714117">Verzendoptie selecteren</translation>
 <translation id="2811892995384186721">Wordt je apparaat niet weergegeven? <ph name="BEGIN_LINK" />Raadpleeg de Help<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Tik op de knop Terug om het volledige scherm te sluiten.</translation>
 <translation id="2842985007712546952">Bovenliggende map</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Log in bij Chrome om de bladwijzers van je andere apparaten te bekijken.</translation>
 <translation id="3137521801621304719">Incognitomodus verlaten</translation>
 <translation id="3149891296864842641">Verzendoptie</translation>
-<translation id="3162882791484435636">Verzendoptie selecteren</translation>
 <translation id="3177909033752230686">Brontaal:</translation>
 <translation id="3190152372525844641">Schakel rechten in voor Chrome via de <ph name="BEGIN_LINK" />Android-instellingen<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> opgeslagen gegevens</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Juridische informatie</translation>
 <translation id="4089831646916293264">Deze functie kan problemen veroorzaken met toegang tot premium gegevensservices geleverd door je provider.</translation>
 <translation id="4095146165863963773">App-gegevens verwijderen?</translation>
-<translation id="4099423833822562131">Selecteer een verzendadres om verzendmethoden te bekijken.</translation>
 <translation id="4099578267706723511">Verzend automatisch gebruiksstatistieken en crashmeldingen naar Google.</translation>
 <translation id="410351446219883937">Automatisch afspelen</translation>
 <translation id="411254640334432676">Downloaden mislukt.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Translate</translation>
 <translation id="5916664084637901428">Aan</translation>
 <translation id="5939518447894949180">Resetten</translation>
-<translation id="5961742032223302715">Contactgegevens selecteren</translation>
 <translation id="5968595432776860642">'<ph name="VIDEO_TITLE" />' afspelen</translation>
 <translation id="6010869025736512584">Video-invoer openen</translation>
 <translation id="6012342843556706400">Chrome heeft locatietoegang nodig om het item te delen met deze site.</translation>
@@ -694,7 +689,7 @@
 <translation id="8920114477895755567">Wachten op gegevens van ouders.</translation>
 <translation id="8931159598799892500">Chrome + Fysieke web</translation>
 <translation id="8941248009481596111">Je verbinding met deze site is privé.</translation>
-<translation id="8941729603749328384">www.example.com</translation>
+<translation id="8941729603749328384">www.voorbeeld.com</translation>
 <translation id="8942627711005830162">Openen in een ander venster</translation>
 <translation id="8959122750345127698">Navigatie is onbereikbaar: <ph name="URL" /></translation>
 <translation id="8979340629087822094">de afgelopen dag</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 229c006..85b5b25 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Ny inkognitofane</translation>
 <translation id="1871284979644508959">Obligatorisk felt</translation>
 <translation id="189172778771606813">Lukk uttrekksmenyen</translation>
-<translation id="1924956916668006832">Velg leveringsadresse</translation>
 <translation id="1933845786846280168">Valgt fane</translation>
 <translation id="194341124344773587">Slå på tillatelsen for Chrome i <ph name="BEGIN_LINK" />Android-innstillingene<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Lagring av passord</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> sekunder igjen</translation>
 <translation id="278029852808208386">Ingen Bluetooth-enheter ble funnet. <ph name="BEGIN_LINK" />Søk igjen<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">1 sekund igjen</translation>
-<translation id="2781389167600714117">Velg levering</translation>
 <translation id="2811892995384186721">Ser du ikke enheten din? <ph name="BEGIN_LINK" />Få hjelp<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Trykk på tilbakeknappen for å avslutte fullskjerm.</translation>
 <translation id="2842985007712546952">Overordnet mappe</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">For å få bokmerkene dine fra de andre enhetene du bruker, logg på Chrome.</translation>
 <translation id="3137521801621304719">Avslutt inkognitomodus</translation>
 <translation id="3149891296864842641">Fraktalternativ</translation>
-<translation id="3162882791484435636">Velg fraktalternativ</translation>
 <translation id="3177909033752230686">Språket siden er på:</translation>
 <translation id="3190152372525844641">Slå på tillatelsene for Chrome i <ph name="BEGIN_LINK" />Android-innstillingene<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> lagrede data</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Juridisk informasjon</translation>
 <translation id="4089831646916293264">Det kan hende at dette elementet gjør at du ikke får tilgang til premium-datatjenester som tilbys av operatøren din.</translation>
 <translation id="4095146165863963773">Slette appdataene?</translation>
-<translation id="4099423833822562131">Velg en leveringsadresse for å sjekke leveringsmåtene.</translation>
 <translation id="4099578267706723511">Gjør Chrome bedre ved å sende bruksstatistikk og programstopprapporter til Google.</translation>
 <translation id="410351446219883937">Autoavspilling</translation>
 <translation id="411254640334432676">Nedlastingen mislyktes.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Oversetter</translation>
 <translation id="5916664084637901428">På</translation>
 <translation id="5939518447894949180">Tilbakestill</translation>
-<translation id="5961742032223302715">Velg kontaktinformasjon</translation>
 <translation id="5968595432776860642">Spiller av <ph name="VIDEO_TITLE" /> ...</translation>
 <translation id="6010869025736512584">Åpner videoinngang</translation>
 <translation id="6012342843556706400">Chrome må ha tilgang til posisjonen din for å kunne dele den med dette nettstedet.</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 d847033b..296e1bb 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Nowa karta incognito</translation>
 <translation id="1871284979644508959">Pole wymagane</translation>
 <translation id="189172778771606813">Zamknij panel nawigacji</translation>
-<translation id="1924956916668006832">Wybierz adres dostawy</translation>
 <translation id="1933845786846280168">Wybrana karta</translation>
 <translation id="194341124344773587">Przyznaj Chrome uprawnienie w <ph name="BEGIN_LINK" />ustawieniach Androida<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Zapisuj hasła</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">Pozostało: <ph name="SECONDS" /> s</translation>
 <translation id="278029852808208386">Nie znaleziono urządzeń Bluetooth. <ph name="BEGIN_LINK" />Wyszukaj ponownie<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">Pozostała sekunda</translation>
-<translation id="2781389167600714117">Wybierz dostawę</translation>
 <translation id="2811892995384186721">Nie widzisz swojego urządzenia? <ph name="BEGIN_LINK" />Skorzystaj z pomocy<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Kliknij przycisk Wstecz, by wyjść z trybu pełnoekranowego.</translation>
 <translation id="2842985007712546952">Folder nadrzędny</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Aby korzystać z zakładek ze swoich innych urządzeń, zaloguj się w Chrome.</translation>
 <translation id="3137521801621304719">Wyłącz tryb incognito</translation>
 <translation id="3149891296864842641">Sposób dostawy</translation>
-<translation id="3162882791484435636">Wybierz sposób dostawy</translation>
 <translation id="3177909033752230686">Język strony:</translation>
 <translation id="3190152372525844641">Przyznaj Chrome uprawnienia w <ph name="BEGIN_LINK" />ustawieniach Androida<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> zapisanych danych</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Informacje prawne</translation>
 <translation id="4089831646916293264">Ta funkcja może zakłócać dostęp do udostępnianych przez operatora płatnych usług transmisji danych.</translation>
 <translation id="4095146165863963773">Usunąć dane aplikacji?</translation>
-<translation id="4099423833822562131">Wybierz adres dostawy, by sprawdzić sposoby wysyłki.</translation>
 <translation id="4099578267706723511">Pomóż ulepszyć Chrome, wysyłając do Google statystyki użytkowania i raporty o awariach.</translation>
 <translation id="410351446219883937">Autoodtwarzanie</translation>
 <translation id="411254640334432676">Błąd pobierania.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Tłumacz Google</translation>
 <translation id="5916664084637901428">Włączone</translation>
 <translation id="5939518447894949180">Resetuj</translation>
-<translation id="5961742032223302715">Wybierz dane kontaktowe</translation>
 <translation id="5968595432776860642">Odtwarzam „<ph name="VIDEO_TITLE" />”</translation>
 <translation id="6010869025736512584">Otwieram wejście wideo</translation>
 <translation id="6012342843556706400">Aby zezwolić stronie na wykorzystanie danych o lokalizacji, Chrome musi mieć do nich dostęp.</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 56a2adf..841cec0 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
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Nova guia anônima</translation>
 <translation id="1871284979644508959">Campo obrigatório</translation>
 <translation id="189172778771606813">Fechar gaveta de navegação</translation>
-<translation id="1924956916668006832">Selecionar um endereço para envio</translation>
 <translation id="1933845786846280168">Guia selecionada</translation>
 <translation id="194341124344773587">Ative a permissão para o Chrome nas <ph name="BEGIN_LINK" />configurações do Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Salvar senhas</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> segundos restantes</translation>
 <translation id="278029852808208386">Nenhum dispositivo Bluetooth foi encontrado. <ph name="BEGIN_LINK" />Pesquisar novamente<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">Um segundo restante</translation>
-<translation id="2781389167600714117">Selecionar envio</translation>
 <translation id="2811892995384186721">Não está vendo seu dispositivo? <ph name="BEGIN_LINK" />Receba ajuda<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Toque no botão "Voltar" para sair da tela cheia.</translation>
 <translation id="2842985007712546952">Pasta mãe</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Para ver os favoritos dos seus outros dispositivos, faça login no Chrome.</translation>
 <translation id="3137521801621304719">Sair do modo de navegação anônima</translation>
 <translation id="3149891296864842641">Opção de envio</translation>
-<translation id="3162882791484435636">Selecionar opção de envio</translation>
 <translation id="3177909033752230686">Idioma da página:</translation>
 <translation id="3190152372525844641">Ative as permissões para o Chrome nas <ph name="BEGIN_LINK" />configurações do Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> de dados armazenados</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Informações legais</translation>
 <translation id="4089831646916293264">Este elemento pode interferir no acesso a serviços de dados Premium fornecidos pela sua operadora.</translation>
 <translation id="4095146165863963773">Excluir dados de apps?</translation>
-<translation id="4099423833822562131">Selecione um endereço de envio para verificar os métodos de entrega.</translation>
 <translation id="4099578267706723511">Ajude a melhorar o Chrome. Envie estatísticas de uso e relatório de falha ao Google.</translation>
 <translation id="410351446219883937">Reprodução automática</translation>
 <translation id="411254640334432676">Falha no download.</translation>
@@ -429,7 +425,6 @@
 <translation id="5911030830365207728">Google Tradutor</translation>
 <translation id="5916664084637901428">Ativado</translation>
 <translation id="5939518447894949180">Redefinir</translation>
-<translation id="5961742032223302715">Selecionar dados de contato</translation>
 <translation id="5968595432776860642">Reproduzindo “<ph name="VIDEO_TITLE" />”</translation>
 <translation id="6010869025736512584">Acessando entrada de vídeo</translation>
 <translation id="6012342843556706400">O Chrome precisa ter acesso ao local para compartilhá-lo com este site.</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 7837c5f0..de1ea52 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
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Novo separador de navegação anónima</translation>
 <translation id="1871284979644508959">Campo obrigatório</translation>
 <translation id="189172778771606813">Fechar a gaveta de navegação</translation>
-<translation id="1924956916668006832">Selecionar morada para envio</translation>
 <translation id="1933845786846280168">Separador selecionado</translation>
 <translation id="194341124344773587">Ative a autorização para o Chrome nas <ph name="BEGIN_LINK" />Definições do Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Guardar palavras-passe</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">Faltam <ph name="SECONDS" /> segundos</translation>
 <translation id="278029852808208386">Não foram encontrados dispositivos Bluetooth. <ph name="BEGIN_LINK" />Procure novamente<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">Falta 1 segundo</translation>
-<translation id="2781389167600714117">Selecionar envio</translation>
 <translation id="2811892995384186721">Não vê o seu dispositivo? <ph name="BEGIN_LINK" />Obter ajuda<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Toque no botão de retrocesso para sair do ecrã inteiro.</translation>
 <translation id="2842985007712546952">Pasta superior</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Para obter os marcadores dos seus outros dispositivos, inicie sessão no Chrome.</translation>
 <translation id="3137521801621304719">Sair do modo de navegação anónima</translation>
 <translation id="3149891296864842641">Opção de envio</translation>
-<translation id="3162882791484435636">Selecionar opção de envio</translation>
 <translation id="3177909033752230686">Idioma da página:</translation>
 <translation id="3190152372525844641">Ative as autorizações para o Chrome nas <ph name="BEGIN_LINK" />Definições do Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> de dados armazenados</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Informações legais</translation>
 <translation id="4089831646916293264">Esta funcionalidade pode interferir com o acesso a serviços de dados premium fornecidos pelo seu operador.</translation>
 <translation id="4095146165863963773">Pretende eliminar os dados da aplicação?</translation>
-<translation id="4099423833822562131">Selecione uma morada para envio para verificar os métodos de envio.</translation>
 <translation id="4099578267706723511">Ajude a melhorar o Chrome ao enviar estatísticas de utilização e relatórios de falhas para a Google.</translation>
 <translation id="410351446219883937">Reprodução automática</translation>
 <translation id="411254640334432676">A transferência falhou.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Tradutor</translation>
 <translation id="5916664084637901428">Ativado</translation>
 <translation id="5939518447894949180">Repor</translation>
-<translation id="5961742032223302715">Selecionar detalhes de contacto</translation>
 <translation id="5968595432776860642">A reproduzir "<ph name="VIDEO_TITLE" />"</translation>
 <translation id="6010869025736512584">A aceder à entrada de vídeo</translation>
 <translation id="6012342843556706400">O Chrome necessita de acesso à localização para a partilhar com este site.</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 179e7713..1337e18 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Filă incognito nouă</translation>
 <translation id="1871284979644508959">Câmp obligatoriu</translation>
 <translation id="189172778771606813">Închide panoul de navigare</translation>
-<translation id="1924956916668006832">Selectează adresa de expediere</translation>
 <translation id="1933845786846280168">Fila selectată</translation>
 <translation id="194341124344773587">Activează permisiunea pentru Chrome din <ph name="BEGIN_LINK" />Setări Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Parole salvate</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> sec. rămase</translation>
 <translation id="278029852808208386">Nu s-a găsit niciun dispozitiv Bluetooth. <ph name="BEGIN_LINK" />Caută din nou<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">1 sec. rămasă</translation>
-<translation id="2781389167600714117">Selectează expedierea</translation>
 <translation id="2811892995384186721">Dispozitivul nu apare? <ph name="BEGIN_LINK" />Obține ajutor<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Atinge butonul Înapoi pentru a ieși din ecranul complet.</translation>
 <translation id="2842985007712546952">Dosar părinte</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Pentru a accesa marcajele de pe alte dispozitive, conectează-te la Chrome.</translation>
 <translation id="3137521801621304719">Ieși din modul incognito</translation>
 <translation id="3149891296864842641">Opțiune de expediere</translation>
-<translation id="3162882791484435636">Selectează opțiunea de expediere</translation>
 <translation id="3177909033752230686">Limba paginii:</translation>
 <translation id="3190152372525844641">Activează permisiunile pentru Chrome din <ph name="BEGIN_LINK" />Setări Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905">Date stocate: <ph name="STORAGE_AMOUNT" /></translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Informații juridice</translation>
 <translation id="4089831646916293264">Această funcție poate afecta accesul la serviciile de date premium oferite de operator.</translation>
 <translation id="4095146165863963773">Ștergi datele aplicației?</translation>
-<translation id="4099423833822562131">Selectează o adresă de expediere pentru a vedea care sunt metodele de expediere.</translation>
 <translation id="4099578267706723511">Contribuie la îmbunătățirea Chrome trimițând statistici de utilizare și rapoarte de blocare la Google.</translation>
 <translation id="410351446219883937">Redare automată</translation>
 <translation id="411254640334432676">Nu s-a descărcat.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Traducere</translation>
 <translation id="5916664084637901428">Activat</translation>
 <translation id="5939518447894949180">Resetează</translation>
-<translation id="5961742032223302715">Selectează detaliile de contact</translation>
 <translation id="5968595432776860642">Se redă „<ph name="VIDEO_TITLE" />”</translation>
 <translation id="6010869025736512584">Se accesează intrarea video</translation>
 <translation id="6012342843556706400">Chrome are nevoie de acces la locație pentru a-l acorda acestui site.</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 2e1683a..d0c1501 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Новая вкладка инкогнито</translation>
 <translation id="1871284979644508959">Поле, обязательное для заполнения</translation>
 <translation id="189172778771606813">Закрыть панель навигации</translation>
-<translation id="1924956916668006832">Выбрать адрес доставки</translation>
 <translation id="1933845786846280168">Выбранная вкладка</translation>
 <translation id="194341124344773587">Разрешение для Chrome можно предоставить в <ph name="BEGIN_LINK" />настройках Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Сохранение паролей</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">Осталось <ph name="SECONDS" /> сек.</translation>
 <translation id="278029852808208386">Устройства Bluetooth не обнаружены. <ph name="BEGIN_LINK" />Повторите попытку<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">Осталась 1 сек.</translation>
-<translation id="2781389167600714117">Выбрать параметры доставки</translation>
 <translation id="2811892995384186721">Не можете найти устройство? <ph name="BEGIN_LINK" />Узнайте<ph name="END_LINK" />, как это исправить.</translation>
 <translation id="2836148919159985482">Чтобы выйти из полноэкранного режима, нажмите кнопку "Назад".</translation>
 <translation id="2842985007712546952">Родительская папка</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Чтобы получить доступ к закладкам на всех ваших устройствах, войдите в Chrome.</translation>
 <translation id="3137521801621304719">Выключить режим инкогнито</translation>
 <translation id="3149891296864842641">Выберите вариант отправки</translation>
-<translation id="3162882791484435636">Выбрать вариант отправки</translation>
 <translation id="3177909033752230686">Язык страницы:</translation>
 <translation id="3190152372525844641">Разрешения для Chrome можно предоставить в <ph name="BEGIN_LINK" />настройках Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905">В памяти занято: <ph name="STORAGE_AMOUNT" /></translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Юридическая информация</translation>
 <translation id="4089831646916293264">Эта функция может мешать доступу к премиум-службам, которые предоставляет ваш оператор связи.</translation>
 <translation id="4095146165863963773">Удалить данные приложения?</translation>
-<translation id="4099423833822562131">Чтобы узнать способы доставки, выберите адрес доставки.</translation>
 <translation id="4099578267706723511">Отправлять в Google статистику использования и отчеты о сбоях</translation>
 <translation id="410351446219883937">Автовоспроизведение</translation>
 <translation id="411254640334432676">Ошибка при скачивании</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Переводчик</translation>
 <translation id="5916664084637901428">ВКЛ</translation>
 <translation id="5939518447894949180">Сбросить</translation>
-<translation id="5961742032223302715">Выберите контактные данные</translation>
 <translation id="5968595432776860642">Воспроизведение видео "<ph name="VIDEO_TITLE" />"</translation>
 <translation id="6010869025736512584">Доступ к видеовходу</translation>
 <translation id="6012342843556706400">Предоставьте браузеру Chrome доступ к геоданным, чтобы продолжить работу на этом сайте.</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 963f94b..7fab029 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Nová karta inkognito</translation>
 <translation id="1871284979644508959">Povinné pole</translation>
 <translation id="189172778771606813">Zavrieť navigačný vysúvací panel</translation>
-<translation id="1924956916668006832">Vybrať dodaciu adresu</translation>
 <translation id="1933845786846280168">Vybratá karta</translation>
 <translation id="194341124344773587">Zapnite povolenie pre Chrome v <ph name="BEGIN_LINK" />nastaveniach Androidu<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Ukladanie hesiel</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">Zostáva: <ph name="SECONDS" /> s</translation>
 <translation id="278029852808208386">Nenašli sa žiadne zariadenia Bluetooth. <ph name="BEGIN_LINK" />Vyhľadať znova<ph name="END_LINK" /></translation>
 <translation id="2781151931089541271">Zostáva: 1 s</translation>
-<translation id="2781389167600714117">Vybrať možnosť dodania</translation>
 <translation id="2811892995384186721">Nezobrazuje sa vaše zariadenie? <ph name="BEGIN_LINK" />Získať pomoc<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Ukončite režim celej obrazovky klepnutím na tlačidlo Späť.</translation>
 <translation id="2842985007712546952">Nadradený priečinok</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Ak chcete získať svoje záložky z ostatných zariadení, prihláste sa do Chromu.</translation>
 <translation id="3137521801621304719">Ukončiť režim inkognito</translation>
 <translation id="3149891296864842641">Možnosť dodania</translation>
-<translation id="3162882791484435636">Vybrať možnosť dodania</translation>
 <translation id="3177909033752230686">Jazyk stránky:</translation>
 <translation id="3190152372525844641">Zapnite povolenia pre Chrome v <ph name="BEGIN_LINK" />nastaveniach Androidu<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> uložených údajov</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Právne informácie</translation>
 <translation id="4089831646916293264">Táto funkcia môže byť v konflikte s prémiovými dátovými službami poskytovanými vaším operátorom.</translation>
 <translation id="4095146165863963773">Odstrániť dáta aplikácie?</translation>
-<translation id="4099423833822562131">Vyberte dodaciu adresu a prezrite si spôsoby dodania.</translation>
 <translation id="4099578267706723511">Odosielanie štatistík používania a prehľadu chýb pomôže Googlu zlepšiť Chrome.</translation>
 <translation id="410351446219883937">Automatické prehrávanie</translation>
 <translation id="411254640334432676">Sťahovanie zlyhalo.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Prekladač Google</translation>
 <translation id="5916664084637901428">Zapnúť</translation>
 <translation id="5939518447894949180">Obnoviť</translation>
-<translation id="5961742032223302715">Vybrať kontaktné údaje</translation>
 <translation id="5968595432776860642">Prehráva sa video <ph name="VIDEO_TITLE" /></translation>
 <translation id="6010869025736512584">Pristupovanie k vstupu videa</translation>
 <translation id="6012342843556706400">Na to, aby Chrome mohol s týmito webovými stránkami zdieľať polohu, musí mať k nej prístup.</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 161e5e6e..582e33f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Nov zavihek brez beleženja zgodovine</translation>
 <translation id="1871284979644508959">Obvezno polje</translation>
 <translation id="189172778771606813">Zapri predal za krmarjenje</translation>
-<translation id="1924956916668006832">Izbira naslova za pošiljanje</translation>
 <translation id="1933845786846280168">Izbrani zavihek</translation>
 <translation id="194341124344773587">V <ph name="BEGIN_LINK" />nastavitvah za Android<ph name="END_LINK" /> vklopite dovoljenje za Chrome.</translation>
 <translation id="1943432128510653496">Shranjevanje gesel</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">Še <ph name="SECONDS" /> s</translation>
 <translation id="278029852808208386">Najdena ni bila nobena naprava Bluetooth. <ph name="BEGIN_LINK" />Iščite znova<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">Še 1 s</translation>
-<translation id="2781389167600714117">Izbira pošiljanja</translation>
 <translation id="2811892995384186721">Vaša naprava ni prikazana? <ph name="BEGIN_LINK" />Poiščite pomoč<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Dotaknite se gumba za nazaj, če želite zapreti celozaslonski način.</translation>
 <translation id="2842985007712546952">Nadrejena mapa</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Če želite dostopati do zaznamkov v drugih napravah, se prijavite v Chrome.</translation>
 <translation id="3137521801621304719">Izklop načina brez beleženja zgodovine</translation>
 <translation id="3149891296864842641">Možnost pošiljanja</translation>
-<translation id="3162882791484435636">Izbira možnosti pošiljanja</translation>
 <translation id="3177909033752230686">Jezik strani:</translation>
 <translation id="3190152372525844641">V <ph name="BEGIN_LINK" />nastavitvah za Android<ph name="END_LINK" /> vklopite dovoljenja za Chrome.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> shranjenih podatkov</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Pravne informacije</translation>
 <translation id="4089831646916293264">Ta funkcija lahko ovira dostop do plačljivih podatkovnih storitev operaterja.</translation>
 <translation id="4095146165863963773">Izbris podatkov aplikacije?</translation>
-<translation id="4099423833822562131">Izberite naslov za pošiljanje, če želite preveriti načine pošiljanja.</translation>
 <translation id="4099578267706723511">Pomagajte izboljšati Chrome s pošiljanjem statističnih podatkov o uporabi in poročil o zrušitvah Googlu.</translation>
 <translation id="410351446219883937">Samodejno predvajanje</translation>
 <translation id="411254640334432676">Prenos ni uspel.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Prevajalnik</translation>
 <translation id="5916664084637901428">Vklopljeno</translation>
 <translation id="5939518447894949180">Ponastavi</translation>
-<translation id="5961742032223302715">Izberi podrobnosti o stiku</translation>
 <translation id="5968595432776860642">Predvajanje: »<ph name="VIDEO_TITLE" />«</translation>
 <translation id="6010869025736512584">Dostopanje do videovhoda</translation>
 <translation id="6012342843556706400">Chrome potrebuje dostop do lokacije, če želite, da temu spletnemu mestu omogoči dostop do nje.</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 d8aecd2..c69652a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Нова картица без архивирања</translation>
 <translation id="1871284979644508959">Обавезно поље</translation>
 <translation id="189172778771606813">Затвори фиоку за навигацију</translation>
-<translation id="1924956916668006832">Изаберите адресу за испоруку</translation>
 <translation id="1933845786846280168">Изабране картице</translation>
 <translation id="194341124344773587">Укључите дозволу за Chrome у <ph name="BEGIN_LINK" />Android подешавањима<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Сачувај лозинке</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">Још <ph name="SECONDS" /> сек</translation>
 <translation id="278029852808208386">Није пронађен ниједан Bluetooth уређај. <ph name="BEGIN_LINK" />Претражите поново<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">Још 1 сек</translation>
-<translation id="2781389167600714117">Изаберите опције испоруке</translation>
 <translation id="2811892995384186721">Не видите уређај? <ph name="BEGIN_LINK" />Потражите помоћ<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Додирните дугме Назад да бисте изашли из режима целог екрана.</translation>
 <translation id="2842985007712546952">Надређени директоријум</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Да би вам обележивачи били доступни на другим уређајима, пријавите се у Chrome.</translation>
 <translation id="3137521801621304719">Изађи из режима без архивирања</translation>
 <translation id="3149891296864842641">Опције испоруке</translation>
-<translation id="3162882791484435636">Изабери опцију испоруке</translation>
 <translation id="3177909033752230686">Језик странице:</translation>
 <translation id="3190152372525844641">Укључите дозволе за Chrome у <ph name="BEGIN_LINK" />Android подешавањима<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> сачуваних података</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Правне информације</translation>
 <translation id="4089831646916293264">Ова функција може да омета приступ премијум услугама за пренос података које пружа мобилни оператер.</translation>
 <translation id="4095146165863963773">Желите ли да избришете податке апликације?</translation>
-<translation id="4099423833822562131">Изаберите адресу за испоруку да бисте видели начине испоруке.</translation>
 <translation id="4099578267706723511">Побољшајте Chrome слањем статистике коришћења и извештаја о отказивању Google-у.</translation>
 <translation id="410351446219883937">Аутоплеј</translation>
 <translation id="411254640334432676">Преузимање није успело.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google преводилац</translation>
 <translation id="5916664084637901428">Укључи</translation>
 <translation id="5939518447894949180">Ресетуј</translation>
-<translation id="5961742032223302715">Изаберите контакт информације</translation>
 <translation id="5968595432776860642">Репродукује се „<ph name="VIDEO_TITLE" />“</translation>
 <translation id="6010869025736512584">Приступа се видео улазу</translation>
 <translation id="6012342843556706400">Chrome-у је потребан приступ за локацију да би га делио са овим сајтом.</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 caaea20..177db7e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -78,11 +78,11 @@
 <translation id="1853692000353488670">Ny inkognitoflik</translation>
 <translation id="1871284979644508959">Obligatoriskt fält</translation>
 <translation id="189172778771606813">Stäng navigeringspanelen</translation>
-<translation id="1924956916668006832">Välj leveransadress</translation>
 <translation id="1933845786846280168">Vald flik</translation>
 <translation id="194341124344773587">Aktivera behörighet för Chrome i <ph name="BEGIN_LINK" />Android-inställningar<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Spara lösenord</translation>
 <translation id="1944384637046898011">Kryptera alla med Google-lösenordet från <ph name="TIME" /></translation>
+<translation id="1946821392246652573">Godkända kort</translation>
 <translation id="1966710179511230534">Uppdatera dina inloggningsuppgifter.</translation>
 <translation id="1974060860693918893">Avancerat</translation>
 <translation id="1984321224716884559">Bokmärken i Chrome Dev</translation>
@@ -159,7 +159,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> sekunder kvar</translation>
 <translation id="278029852808208386">Inga Bluetooth-enheter hittades. <ph name="BEGIN_LINK" />Gör om sökningen<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">1 sekund kvar</translation>
-<translation id="2781389167600714117">Välj frakt</translation>
 <translation id="2811892995384186721">Visas inte enheten? <ph name="BEGIN_LINK" />Få hjälp<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Tryck på bakåtknappen för att lämna helskärmsläget.</translation>
 <translation id="2842985007712546952">Överordnad mapp</translation>
@@ -188,7 +187,6 @@
 <translation id="3117051980354074377">Logga in i Chrome om du vill ha samma bokmärken tillgängliga på alla enheter.</translation>
 <translation id="3137521801621304719">Inaktivera inkognitoläge</translation>
 <translation id="3149891296864842641">Fraktalternativ</translation>
-<translation id="3162882791484435636">Välj fraktalternativ</translation>
 <translation id="3177909033752230686">Sidans språk:</translation>
 <translation id="3190152372525844641">Aktivera behörigheter för Chrome i <ph name="BEGIN_LINK" />Android-inställningar<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> sparad data</translation>
@@ -216,6 +214,7 @@
 <translation id="3386292677130313581">Fråga innan webbplatser tillåts att veta var du befinner dig (rekommenderas)</translation>
 <translation id="3387650086002190359">Det gick inte att ladda ned <ph name="FILE_NAME" /> på grund av filsystemfel.</translation>
 <translation id="3414952576877147120">Storlek:</translation>
+<translation id="3431636764301398940">Spara kortet på enheten</translation>
 <translation id="3435896845095436175">Aktivera</translation>
 <translation id="3452612588551937789">Logga in med ditt Google-konto så att du kan använda bokmärken, lösenord, historik med mera på alla dina enheter.</translation>
 <translation id="3485544713029068372">Smart Lock för lösenord</translation>
@@ -261,7 +260,6 @@
 <translation id="4062305924942672200">Juridisk information</translation>
 <translation id="4089831646916293264">Det kan hända att den här funktionen förhindrar åtkomst till premiumdatatjänster från operatören.</translation>
 <translation id="4095146165863963773">Vill du ta bort appdata?</translation>
-<translation id="4099423833822562131">Välj en leveransadress om du vill visa leveranssätt.</translation>
 <translation id="4099578267706723511">Hjälp till att förbättra Chrome genom att skicka användningsstatistik och felrapporter till Google.</translation>
 <translation id="410351446219883937">Automatisk uppspelning</translation>
 <translation id="411254640334432676">Nedladdningen misslyckades.</translation>
@@ -412,6 +410,7 @@
 <translation id="572328651809341494">Senaste flikarna</translation>
 <translation id="5748802427693696783">Bytte till standardflikar</translation>
 <translation id="5749068826913805084">Chrome måste ha åtkomst till lagringsutrymmet om det ska gå att ladda ned filer.</translation>
+<translation id="57586589942790530">Ogiltigt kortnummer</translation>
 <translation id="5763382633136178763">Inkognitoflikar</translation>
 <translation id="5765780083710877561">Beskrivning:</translation>
 <translation id="5771382037724542929">Vill du ersätta den befintliga filen <ph name="FILE_NAME" /> i <ph name="DIRECTORY_NAME" />?</translation>
@@ -430,7 +429,6 @@
 <translation id="5911030830365207728">Google Översätt</translation>
 <translation id="5916664084637901428">På</translation>
 <translation id="5939518447894949180">Återställ</translation>
-<translation id="5961742032223302715">Välj kontaktuppgifter</translation>
 <translation id="5968595432776860642">Spelar upp <ph name="VIDEO_TITLE" /></translation>
 <translation id="6010869025736512584">Får åtkomst till videoindata</translation>
 <translation id="6012342843556706400">Chrome behöver tillgång till platsinformation för att kunna dela den på den här webbplatsen.</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 e3e3b60..927931a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -78,11 +78,11 @@
 <translation id="1853692000353488670">Kichupo fiche kipya</translation>
 <translation id="1871284979644508959">Lazima sehemu hii ijazwe</translation>
 <translation id="189172778771606813">Funga droo ya kusogeza</translation>
-<translation id="1924956916668006832">Chagua anwani ya mahali bidhaa zitakapopelekwa</translation>
 <translation id="1933845786846280168">Kichupo Kilichochaguliwa</translation>
 <translation id="194341124344773587">Washa ruhusa ya Chrome katika <ph name="BEGIN_LINK" />Mipangilio ya Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Hifadhi manenosiri</translation>
 <translation id="1944384637046898011">Simba yote kwa njia fiche ukitumia nenosiri la Google kuanzia <ph name="TIME" /></translation>
+<translation id="1946821392246652573">Kadi zinazokubaliwa</translation>
 <translation id="1966710179511230534">Tafadhali sasisha maelezo yako ya kuingia katika akaunti.</translation>
 <translation id="1974060860693918893">Mipangilio ya kina</translation>
 <translation id="1984321224716884559">Alamisho za Chrome Dev</translation>
@@ -159,7 +159,6 @@
 <translation id="2777555524387840389">Zimesalia sekunde <ph name="SECONDS" /></translation>
 <translation id="278029852808208386">Hakuna vifaa vya bluetooth vilivyopatikana. <ph name="BEGIN_LINK" />Tafuta tena<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">Imesalia sekunde 1</translation>
-<translation id="2781389167600714117">Chagua mahali bidhaa zitakapopelekwa</translation>
 <translation id="2811892995384186721">Je, huoni kifaa chako? <ph name="BEGIN_LINK" />Pata usaidizi<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Gusa kitufe cha kurudi nyuma ili uondoke kwenye skrini nzima.</translation>
 <translation id="2842985007712546952">Folda kuu</translation>
@@ -188,7 +187,6 @@
 <translation id="3117051980354074377">Ili upate alamisho kutoka kwenye vifaa vyako vingine, ingia katika Chrome.</translation>
 <translation id="3137521801621304719">Ondoka kwenye hali fiche</translation>
 <translation id="3149891296864842641">Chaguo la usafirishaji</translation>
-<translation id="3162882791484435636">Teua chaguo la usafirishaji</translation>
 <translation id="3177909033752230686">Lugha ya Ukurasa:</translation>
 <translation id="3190152372525844641">Washa ruhusa za Chrome katika <ph name="BEGIN_LINK" />Mipangilio ya Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> za data iliyohifadhiwa</translation>
@@ -216,6 +214,7 @@
 <translation id="3386292677130313581">Uliza kabla ya kuruhusu tovuti zijue mahali ulipo (inapendekezwa)</translation>
 <translation id="3387650086002190359">Kipakuliwa cha <ph name="FILE_NAME" /> hakijafaulu kwa sababu ya hitilafu za mfumo wa faili.</translation>
 <translation id="3414952576877147120">Ukubwa:</translation>
+<translation id="3431636764301398940">Hifadhi kadi hii kwenye kifaa hiki</translation>
 <translation id="3435896845095436175">Washa</translation>
 <translation id="3452612588551937789">Ingia kwa kutumia Akaunti yako ya Google ili upate alamisho, historia, manenosiri na mipangilio mingine kwenye vifaa vyako vyote.</translation>
 <translation id="3485544713029068372">Smart Lock ya Manenosiri</translation>
@@ -261,7 +260,6 @@
 <translation id="4062305924942672200">Maelezo ya kisheria</translation>
 <translation id="4089831646916293264">Kipengele hiki kinaweza kutatiza ufikiaji wa huduma za data za kulipia unazopata kutoka kwa mtoa huduma wako.</translation>
 <translation id="4095146165863963773">Ungependa kufuta data ya programu?</translation>
-<translation id="4099423833822562131">Chagua anwani ya mahali bidhaa zitakapopelekwa ili uangalie mbinu za kusafirisha.</translation>
 <translation id="4099578267706723511">Saidia kuboresha Chrome kwa kutumia Google takwimu za matumizi na ripoti wakati wowote kivinjari hiki kinapoacha kufanya kazi.</translation>
 <translation id="410351446219883937">Kucheza kiotomatiki</translation>
 <translation id="411254640334432676">Upakuaji haujafaulu.</translation>
@@ -412,6 +410,7 @@
 <translation id="572328651809341494">Vichupo vya hivi majuzi</translation>
 <translation id="5748802427693696783">Imebadilisha kwenda vichupo muundo-msingi</translation>
 <translation id="5749068826913805084">Chrome inahitaji idhini ya kufikia hifadhi ili ipakue faili.</translation>
+<translation id="57586589942790530">Nambari ya kadi si sahihi</translation>
 <translation id="5763382633136178763">Vichupo fiche</translation>
 <translation id="5765780083710877561">Maelezo:</translation>
 <translation id="5771382037724542929">Je, unataka kubadilisha <ph name="FILE_NAME" /> iliyopo katika <ph name="DIRECTORY_NAME" />?</translation>
@@ -430,7 +429,6 @@
 <translation id="5911030830365207728">Google Tafsiri</translation>
 <translation id="5916664084637901428">Imewashwa</translation>
 <translation id="5939518447894949180">Weka upya</translation>
-<translation id="5961742032223302715">Chagua maelezo ya anwani</translation>
 <translation id="5968595432776860642">Inacheza “<ph name="VIDEO_TITLE" />”</translation>
 <translation id="6010869025736512584">Inafikia vifaa vya kuingiza sauti ya video</translation>
 <translation id="6012342843556706400">Chrome inahitaji idhini ya kufikia mahali ili ipashiriki na tovuti hii.</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 477efc7f..27e2d4f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">แท็บใหม่ที่ไม่ระบุตัวตน</translation>
 <translation id="1871284979644508959">ช่องที่ต้องกรอก</translation>
 <translation id="189172778771606813">ปิดลิ้นชักการนำทาง</translation>
-<translation id="1924956916668006832">เลือกที่อยู่สำหรับจัดส่ง</translation>
 <translation id="1933845786846280168">แท็บที่เลือก</translation>
 <translation id="194341124344773587">เปิดการใช้สิทธิ์สำหรับ Chrome ใน<ph name="BEGIN_LINK" />การตั้งค่า Android<ph name="END_LINK" /></translation>
 <translation id="1943432128510653496">บันทึกรหัสผ่าน</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">เหลือ <ph name="SECONDS" /> วิ</translation>
 <translation id="278029852808208386">ไม่พบอุปกรณ์บลูทูธ โปรด<ph name="BEGIN_LINK" />ค้นหาอีกครั้ง<ph name="END_LINK" /></translation>
 <translation id="2781151931089541271">เหลือ 1 วิ</translation>
-<translation id="2781389167600714117">เลือกการจัดส่ง</translation>
 <translation id="2811892995384186721">หากไม่เห็นอุปกรณ์ของคุณ โปรด<ph name="BEGIN_LINK" />ขอความช่วยเหลือ<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">แตะปุ่มกลับเพื่อออกจากโหมดเต็มหน้าจอ</translation>
 <translation id="2842985007712546952">โฟลเดอร์ระดับบนสุด</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">ลงชื่อเข้าใช้ Chrome เพื่อรับบุ๊กมาร์กในอุปกรณ์เครื่องอื่นๆ ของคุณ</translation>
 <translation id="3137521801621304719">ออกจากโหมดไม่ระบุตัวตน</translation>
 <translation id="3149891296864842641">ตัวเลือกการจัดส่ง</translation>
-<translation id="3162882791484435636">เลือกตัวเลือกในการจัดส่ง</translation>
 <translation id="3177909033752230686">ภาษาหน้าเว็บ:</translation>
 <translation id="3190152372525844641">เปิดการใช้สิทธิ์สำหรับ Chrome ใน<ph name="BEGIN_LINK" />การตั้งค่า Android<ph name="END_LINK" /></translation>
 <translation id="3198916472715691905">ข้อมูลที่จัดเก็บมี <ph name="STORAGE_AMOUNT" /></translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">ข้อมูลทางกฎหมาย</translation>
 <translation id="4089831646916293264">คุณลักษณะนี้อาจรบกวนการเข้าถึงบริการข้อมูลพรีเมียมที่ผู้ให้บริการของคุณจัดหาให้</translation>
 <translation id="4095146165863963773">ลบข้อมูลแอปไหม</translation>
-<translation id="4099423833822562131">เลือกที่อยู่สำหรับจัดส่งเพื่อตรวจสอบวิธีการจัดส่ง</translation>
 <translation id="4099578267706723511">ช่วยให้ Chrome ทำงานได้ดีขึ้นโดยส่งสถิติการใช้งานและรายงานข้อขัดข้องให้กับ Google</translation>
 <translation id="410351446219883937">เล่นอัตโนมัติ</translation>
 <translation id="411254640334432676">การดาวน์โหลดล้มเหลว</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google แปลภาษา</translation>
 <translation id="5916664084637901428">เปิด</translation>
 <translation id="5939518447894949180">รีเซ็ต</translation>
-<translation id="5961742032223302715">เลือกรายละเอียดของรายชื่อติดต่อ</translation>
 <translation id="5968595432776860642">กำลังเล่น “<ph name="VIDEO_TITLE" />”</translation>
 <translation id="6010869025736512584">กำลังเข้าถึงอินพุตวิดีโอ</translation>
 <translation id="6012342843556706400">Chrome ต้องการเข้าถึงตำแหน่งเพื่อแชร์กับเว็บไซต์นี้</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 fc4c8781..28aa79d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Yeni gizli sekme</translation>
 <translation id="1871284979644508959">Zorunlu alan</translation>
 <translation id="189172778771606813">Gezinme çekmecesini kapat</translation>
-<translation id="1924956916668006832">Gönderim adresi seç</translation>
 <translation id="1933845786846280168">Seçili Sekme</translation>
 <translation id="194341124344773587"><ph name="BEGIN_LINK" />Android Ayarları<ph name="END_LINK" />'nda Chrome için izni açın.</translation>
 <translation id="1943432128510653496">Şifreleri kaydetme</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> sn. kaldı</translation>
 <translation id="278029852808208386">Bluetooth cihaz bulunamadı. <ph name="BEGIN_LINK" />Tekrar arayın<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">1 sn. kaldı</translation>
-<translation id="2781389167600714117">Gönderimi seç</translation>
 <translation id="2811892995384186721">Cihazınızı görmüyor musunuz? <ph name="BEGIN_LINK" />Yardım alın<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Tam ekrandan çıkmak için geri düğmesine dokunun.</translation>
 <translation id="2842985007712546952">Ana klasör</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Diğer cihazlarınızdaki yer işaretlerinizi almak için Chrome'da oturum açın.</translation>
 <translation id="3137521801621304719">Gizli moddan çık</translation>
 <translation id="3149891296864842641">Gönderim seçeneği</translation>
-<translation id="3162882791484435636">Gönderim seçeneğini belirleyin</translation>
 <translation id="3177909033752230686">Sayfanın Dili:</translation>
 <translation id="3190152372525844641"><ph name="BEGIN_LINK" />Android Ayarları<ph name="END_LINK" />'nda Chrome için izinleri açın.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> depolanmış veri</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Yasal bilgiler</translation>
 <translation id="4089831646916293264">Bu özellik, operatörünüz tarafından sağlanan birinci sınıf veri hizmetlerine erişime engel olabilir.</translation>
 <translation id="4095146165863963773">Uygulama verileri silinsin mi?</translation>
-<translation id="4099423833822562131">Gönderim yöntemlerini kontrol etmek için bir gönderim adresi seçin.</translation>
 <translation id="4099578267706723511">Google'a kullanım istatistikleri ve kilitlenme raporları göndererek Chrome'u iyileştirmeye yardımcı olun.</translation>
 <translation id="410351446219883937">Otomatik oynatma</translation>
 <translation id="411254640334432676">İndirme başarısız oldu.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google Çeviri</translation>
 <translation id="5916664084637901428">Açık</translation>
 <translation id="5939518447894949180">Sıfırla</translation>
-<translation id="5961742032223302715">İletişim ayrıntılarını seçin</translation>
 <translation id="5968595432776860642">“<ph name="VIDEO_TITLE" />” oynatılıyor</translation>
 <translation id="6010869025736512584">Video girişine erişiliyor</translation>
 <translation id="6012342843556706400">Chrome'un konumu bu siteyle paylaşması için konum erişimine ihtiyacı var.</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 328ade87b..484d8267 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">Нова анонімна вкладка</translation>
 <translation id="1871284979644508959">Обов’язкове поле</translation>
 <translation id="189172778771606813">Закрити панель навігації</translation>
-<translation id="1924956916668006832">Вибрати адресу доставки</translation>
 <translation id="1933845786846280168">Вибрана вкладка</translation>
 <translation id="194341124344773587">Увімкніть дозвіл для Chrome у <ph name="BEGIN_LINK" />налаштуваннях Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Зберігання паролів</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">Залишилося <ph name="SECONDS" /> с</translation>
 <translation id="278029852808208386">Пристроїв Bluetooth не знайдено. <ph name="BEGIN_LINK" />Пошукайте ще раз<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">Залишилась 1 с</translation>
-<translation id="2781389167600714117">Вибрати варіант доставки</translation>
 <translation id="2811892995384186721">Немає вашого пристрою? <ph name="BEGIN_LINK" />Перегляньте довідку<ph name="END_LINK" />.</translation>
 <translation id="2836148919159985482">Щоб вийти з повноекранного режиму, торкніться кнопки "Назад".</translation>
 <translation id="2842985007712546952">Батьківська папка</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">Щоб мати доступ до закладок з інших пристроїв, увійдіть в обліковий запис Chrome.</translation>
 <translation id="3137521801621304719">Вийти з режиму анонімного перегляду</translation>
 <translation id="3149891296864842641">Варіант доставки</translation>
-<translation id="3162882791484435636">Вибрати варіант доставки</translation>
 <translation id="3177909033752230686">Мова сторінки:</translation>
 <translation id="3190152372525844641">Увімкніть дозволи для Chrome у <ph name="BEGIN_LINK" />налаштуваннях Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> збережених даних</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">Правова інформація</translation>
 <translation id="4089831646916293264">Ця функція може перешкоджати доступу до платних служб передавання даних, які надаються вашим оператором.</translation>
 <translation id="4095146165863963773">Видалити дані додатка?</translation>
-<translation id="4099423833822562131">Укажіть адресу, щоб переглянути способи доставки.</translation>
 <translation id="4099578267706723511">Допоможіть покращити Chrome, надсилаючи статистику та звіти про збої в Google.</translation>
 <translation id="410351446219883937">Автовідтворення</translation>
 <translation id="411254640334432676">Не завантажено.</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Перекладач Google</translation>
 <translation id="5916664084637901428">Увімкнути</translation>
 <translation id="5939518447894949180">Скинути</translation>
-<translation id="5961742032223302715">Виберіть контактні дані</translation>
 <translation id="5968595432776860642">Відео "<ph name="VIDEO_TITLE" />" відтворюється</translation>
 <translation id="6010869025736512584">Отримання доступу до відеовходу</translation>
 <translation id="6012342843556706400">Chrome потрібен доступ до геоданих, щоб дозволити цьому сайту використовувати їх.</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 3d1511a..dca26b3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -78,11 +78,11 @@
 <translation id="1853692000353488670">Tab ẩn danh mới</translation>
 <translation id="1871284979644508959">Trường bắt buộc</translation>
 <translation id="189172778771606813">Đóng ngăn điều hướng</translation>
-<translation id="1924956916668006832">Chọn địa chỉ giao hàng</translation>
 <translation id="1933845786846280168">Tab được chọn</translation>
 <translation id="194341124344773587">Bật quyền cho Chrome trong <ph name="BEGIN_LINK" />Cài đặt Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Lưu mật khẩu</translation>
 <translation id="1944384637046898011">Mã hóa tất cả dữ liệu bằng mật khẩu Google kể từ <ph name="TIME" /></translation>
+<translation id="1946821392246652573">Thẻ được chấp nhận</translation>
 <translation id="1966710179511230534">Vui lòng cập nhật chi tiết đăng nhập của bạn.</translation>
 <translation id="1974060860693918893">Nâng cao</translation>
 <translation id="1984321224716884559">Dấu trang Chrome Dev</translation>
@@ -159,7 +159,6 @@
 <translation id="2777555524387840389">Còn <ph name="SECONDS" /> giây</translation>
 <translation id="278029852808208386">Không tìm thấy thiết bị bluetooth. <ph name="BEGIN_LINK" />Tìm kiếm lại<ph name="END_LINK" />.</translation>
 <translation id="2781151931089541271">Còn 1 giây</translation>
-<translation id="2781389167600714117">Chọn giao hàng</translation>
 <translation id="2811892995384186721">Không thấy thiết bị của bạn? <ph name="BEGIN_LINK" />Nhận trợ giúp<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Chạm vào nút quay lại để thoát khỏi chế độ toàn màn hình.</translation>
 <translation id="2842985007712546952">Thư mục gốc</translation>
@@ -188,7 +187,6 @@
 <translation id="3117051980354074377">Để nhận dấu trang trên các thiết bị khác của bạn, hãy đăng nhập vào Chrome.</translation>
 <translation id="3137521801621304719">Thoát chế độ ẩn danh</translation>
 <translation id="3149891296864842641">Tùy chọn giao hàng</translation>
-<translation id="3162882791484435636">Chọn tùy chọn giao hàng</translation>
 <translation id="3177909033752230686">Ngôn ngữ trang:</translation>
 <translation id="3190152372525844641">Bật quyền cho Chrome trong <ph name="BEGIN_LINK" />Cài đặt Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> dữ liệu được lưu trữ</translation>
@@ -216,6 +214,7 @@
 <translation id="3386292677130313581">Hỏi trước khi cho phép các trang web biết vị trí của bạn (được đề xuất)</translation>
 <translation id="3387650086002190359">Tải xuống <ph name="FILE_NAME" /> không thành công do lỗi hệ thống tệp.</translation>
 <translation id="3414952576877147120">Kích thước:</translation>
+<translation id="3431636764301398940">Lưu thẻ này vào thiết bị này</translation>
 <translation id="3435896845095436175">Bật</translation>
 <translation id="3452612588551937789">Đăng nhập bằng Tài khoản Google để nhận dấu trang, lịch sử, mật khẩu và các cài đặt khác trên tất cả thiết bị của bạn.</translation>
 <translation id="3485544713029068372">Smart Lock cho Mật khẩu</translation>
@@ -261,7 +260,6 @@
 <translation id="4062305924942672200">Thông tin pháp lý</translation>
 <translation id="4089831646916293264">Tính năng này có thể ảnh hưởng đến quyền truy cập vào các dịch vụ dữ liệu cao cấp được nhà cung cấp dịch vụ của bạn cung cấp.</translation>
 <translation id="4095146165863963773">Xóa dữ liệu ứng dụng?</translation>
-<translation id="4099423833822562131">Chọn một địa chỉ giao hàng để xem phương thức giao hàng.</translation>
 <translation id="4099578267706723511">Giúp cải thiện Chrome bằng cách gửi số liệu thống kê sử dụng và báo cáo sự cố cho Google.</translation>
 <translation id="410351446219883937">Tự động phát</translation>
 <translation id="411254640334432676">Tải xuống không thành công.</translation>
@@ -412,6 +410,7 @@
 <translation id="572328651809341494">Các tab gần đây</translation>
 <translation id="5748802427693696783">Đã chuyển sang tab chuẩn</translation>
 <translation id="5749068826913805084">Chrome cần quyền truy cập bộ nhớ để tải xuống tệp.</translation>
+<translation id="57586589942790530">Số thẻ không hợp lệ</translation>
 <translation id="5763382633136178763">Tab ẩn danh</translation>
 <translation id="5765780083710877561">Mô tả:</translation>
 <translation id="5771382037724542929">Bạn có muốn thay thế <ph name="FILE_NAME" /> hiện tại trong <ph name="DIRECTORY_NAME" /> không?</translation>
@@ -430,7 +429,6 @@
 <translation id="5911030830365207728">Google Dịch</translation>
 <translation id="5916664084637901428">Bật</translation>
 <translation id="5939518447894949180">Đặt lại</translation>
-<translation id="5961742032223302715">Chọn chi tiết liên hệ</translation>
 <translation id="5968595432776860642">Đang phát “<ph name="VIDEO_TITLE" />”</translation>
 <translation id="6010869025736512584">Đang truy cập thiết bị đầu vào video</translation>
 <translation id="6012342843556706400">Chrome cần quyền truy cập vị trí để chia sẻ vị trí với trang web này.</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 3b721ecd4..32d85b6 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
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">新的隐身标签页</translation>
 <translation id="1871284979644508959">必填字段</translation>
 <translation id="189172778771606813">关闭抽屉式导航栏</translation>
-<translation id="1924956916668006832">选择送货地址</translation>
 <translation id="1933845786846280168">所选的标签页</translation>
 <translation id="194341124344773587">在 <ph name="BEGIN_LINK" />Android 设置<ph name="END_LINK" />中为 Chrome 启用这项权限。</translation>
 <translation id="1943432128510653496">保存密码</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">还剩 <ph name="SECONDS" /> 秒</translation>
 <translation id="278029852808208386">未发现任何蓝牙设备。<ph name="BEGIN_LINK" />重新搜索<ph name="END_LINK" />。</translation>
 <translation id="2781151931089541271">还剩 1 秒</translation>
-<translation id="2781389167600714117">选择送货</translation>
 <translation id="2811892995384186721">没看到您的设备?<ph name="BEGIN_LINK" />寻求帮助<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">触摸“返回”按钮即可退出全屏模式。</translation>
 <translation id="2842985007712546952">父文件夹</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">要在您的其他设备上访问您的书签,请登录 Chrome。</translation>
 <translation id="3137521801621304719">退出隐身模式</translation>
 <translation id="3149891296864842641">送货方式</translation>
-<translation id="3162882791484435636">选择送货方式</translation>
 <translation id="3177909033752230686">网页语言:</translation>
 <translation id="3190152372525844641">在 <ph name="BEGIN_LINK" />Android 设置<ph name="END_LINK" />中为 Chrome 启用这些权限。</translation>
 <translation id="3198916472715691905">已存储 <ph name="STORAGE_AMOUNT" /> 数据</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">法律信息</translation>
 <translation id="4089831646916293264">此功能可能会导致您无法使用运营商提供的付费数据网络服务。</translation>
 <translation id="4095146165863963773">要删除应用数据吗?</translation>
-<translation id="4099423833822562131">请选择一个送货地址,以便查看送货方式。</translation>
 <translation id="4099578267706723511">将使用情况统计信息和崩溃报告发送给 Google,帮助我们完善 Chrome。</translation>
 <translation id="410351446219883937">自动播放</translation>
 <translation id="411254640334432676">下载失败。</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google 翻译</translation>
 <translation id="5916664084637901428">启用</translation>
 <translation id="5939518447894949180">重置</translation>
-<translation id="5961742032223302715">选择详细联系信息</translation>
 <translation id="5968595432776860642">正在播放“<ph name="VIDEO_TITLE" />”</translation>
 <translation id="6010869025736512584">正在存取视频输入</translation>
 <translation id="6012342843556706400">Chrome 需要具有位置信息使用权,才能批准此网站的分享请求。</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 93ea9de..c230050 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
@@ -78,7 +78,6 @@
 <translation id="1853692000353488670">新增無痕式分頁</translation>
 <translation id="1871284979644508959">必填欄位</translation>
 <translation id="189172778771606813">關閉導覽匣</translation>
-<translation id="1924956916668006832">選擇收件地址</translation>
 <translation id="1933845786846280168">選取的分頁</translation>
 <translation id="194341124344773587">請在 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中為 Chrome 啟用這項權限。</translation>
 <translation id="1943432128510653496">儲存密碼</translation>
@@ -159,7 +158,6 @@
 <translation id="2777555524387840389">還剩 <ph name="SECONDS" /> 秒</translation>
 <translation id="278029852808208386">找不到藍牙裝置,請<ph name="BEGIN_LINK" />重新搜尋<ph name="END_LINK" />。</translation>
 <translation id="2781151931089541271">還剩 1 秒</translation>
-<translation id="2781389167600714117">選擇運送方式</translation>
 <translation id="2811892995384186721">找不到您的裝置嗎?<ph name="BEGIN_LINK" />尋求協助<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">輕觸返回按鈕即可結束全螢幕模式。</translation>
 <translation id="2842985007712546952">上層資料夾</translation>
@@ -188,7 +186,6 @@
 <translation id="3117051980354074377">如要存取您在其他裝置上建立的書籤,請登入 Chrome。</translation>
 <translation id="3137521801621304719">離開無痕模式</translation>
 <translation id="3149891296864842641">運送方式</translation>
-<translation id="3162882791484435636">選取運送方式</translation>
 <translation id="3177909033752230686">網頁語言:</translation>
 <translation id="3190152372525844641">請在 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中為 Chrome 啟用這些權限。</translation>
 <translation id="3198916472715691905">儲存了 <ph name="STORAGE_AMOUNT" /> 的資料</translation>
@@ -261,7 +258,6 @@
 <translation id="4062305924942672200">法律資訊</translation>
 <translation id="4089831646916293264">這項功能可能會讓您無法存取行動通訊業者提供的付費數據服務。</translation>
 <translation id="4095146165863963773">要刪除應用程式資料嗎?</translation>
-<translation id="4099423833822562131">選取運送地址即可查看運送方式。</translation>
 <translation id="4099578267706723511">將使用統計資料及當機報告傳送給 Google,助我們一臂之力,讓 Chrome 更臻完美。</translation>
 <translation id="410351446219883937">自動播放</translation>
 <translation id="411254640334432676">下載失敗。</translation>
@@ -430,7 +426,6 @@
 <translation id="5911030830365207728">Google 翻譯</translation>
 <translation id="5916664084637901428">開啟</translation>
 <translation id="5939518447894949180">重設</translation>
-<translation id="5961742032223302715">選取詳細聯絡資訊</translation>
 <translation id="5968595432776860642">正在播放「<ph name="VIDEO_TITLE" />」</translation>
 <translation id="6010869025736512584">正在存取視訊輸入</translation>
 <translation id="6012342843556706400">Chrome 需要存取位置資訊,才能與這個網站分享。</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java
index 67b8d8a..ee667fd 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java
@@ -224,8 +224,7 @@
         // the progress spinner should disappear, the Commit button should still
         // be disabled (since nothing's selected), and the list view should
         // show.
-        assertEquals(removeLinkTags(getActivity().getString(
-                R.string.bluetooth_not_seeing_it_idle_some_found)),
+        assertEquals(removeLinkTags(getActivity().getString(R.string.bluetooth_not_seeing_it)),
                 statusView.getText().toString());
         assertFalse(button.isEnabled());
         assertEquals(View.VISIBLE, items.getVisibility());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ItemChooserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ItemChooserDialogTest.java
index 91405288..696d278 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ItemChooserDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ItemChooserDialogTest.java
@@ -61,11 +61,12 @@
         SpannableString title = new SpannableString("title");
         SpannableString searching = new SpannableString("searching");
         SpannableString noneFound = new SpannableString("noneFound");
+        SpannableString statusActive = new SpannableString("statusActive");
         SpannableString statusIdleNoneFound = new SpannableString("statusIdleNoneFound");
         SpannableString statusIdleSomeFound = new SpannableString("statusIdleSomeFound");
         String positiveButton = new String("positiveButton");
         final ItemChooserDialog.ItemChooserLabels labels =
-                new ItemChooserDialog.ItemChooserLabels(title, searching, noneFound,
+                new ItemChooserDialog.ItemChooserLabels(title, searching, noneFound, statusActive,
                         statusIdleNoneFound, statusIdleSomeFound, positiveButton);
         ItemChooserDialog dialog = ThreadUtils.runOnUiThreadBlockingNoException(
                 new Callable<ItemChooserDialog>() {
@@ -134,6 +135,14 @@
         mChooserDialog.addItemToList(new ItemChooserDialog.ItemChooserRow("key", "key"));
         mChooserDialog.addItemToList(new ItemChooserDialog.ItemChooserRow("key2", "key2"));
 
+        // Two items showing, the empty view should be no more and the button
+        // should now be enabled.
+        assertEquals(View.VISIBLE, items.getVisibility());
+        assertEquals(View.GONE, items.getEmptyView().getVisibility());
+        assertEquals("statusActive", statusView.getText().toString());
+        assertFalse(button.isEnabled());
+
+        mChooserDialog.setIdleState();
         // After discovery stops the list should be visible with two items,
         // it should not show the empty view and the button should not be enabled.
         // The chooser should show the status idle text.
@@ -229,6 +238,8 @@
         assertEquals(itemAdapter.getItem(0), item1);
         assertEquals(itemAdapter.getItem(1), item2);
 
+        mChooserDialog.setIdleState();
+
         // Try removing an item that doesn't exist.
         mChooserDialog.removeItemFromList(nonExistentItem);
         assertEquals(2, itemAdapter.getCount());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadManagerServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadManagerServiceTest.java
index 3d4fe90..8e52cd05 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadManagerServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadManagerServiceTest.java
@@ -63,6 +63,7 @@
             DOWNLOAD_FAILED,
             DOWNLOAD_PROGRESS,
             DOWNLOAD_PAUSED,
+            DOWNLOAD_INTERRUPTED,
             CANCEL_DOWNLOAD_ID,
             CLEAR_PENDING_DOWNLOADS
         }
@@ -152,11 +153,16 @@
         }
 
         @Override
-        public void notifyDownloadPaused(DownloadInfo downloadInfo, boolean isAutoResumable) {
+        public void notifyDownloadPaused(DownloadInfo downloadInfo) {
             assertCorrectExpectedCall(MethodID.DOWNLOAD_PAUSED, downloadInfo);
         }
 
         @Override
+        public void notifyDownloadInterrupted(DownloadInfo downloadInfo, boolean isAutoResumable) {
+            assertCorrectExpectedCall(MethodID.DOWNLOAD_INTERRUPTED, downloadInfo);
+        }
+
+        @Override
         public void notifyDownloadCanceled(String downloadGuid) {
             assertCorrectExpectedCall(MethodID.CANCEL_DOWNLOAD_ID, downloadGuid);
         }
@@ -443,10 +449,10 @@
         DownloadManagerServiceForTest dService = new DownloadManagerServiceForTest(
                 getTestContext(), notifier, UPDATE_DELAY_FOR_TEST);
         DownloadManagerService.disableNetworkListenerForTest();
-        DownloadInfo paused =
+        DownloadInfo interrupted =
                 Builder.fromDownloadInfo(getDownloadInfo()).setIsResumable(true).build();
-        notifier.expect(MethodID.DOWNLOAD_PAUSED, paused);
-        dService.onDownloadInterrupted(paused, true);
+        notifier.expect(MethodID.DOWNLOAD_INTERRUPTED, interrupted);
+        dService.onDownloadInterrupted(interrupted, true);
         notifier.waitTillExpectedCallsComplete();
     }
 
@@ -479,13 +485,13 @@
         final DownloadManagerServiceForTest dService = new DownloadManagerServiceForTest(
                 getTestContext(), notifier, UPDATE_DELAY_FOR_TEST);
         DownloadManagerService.disableNetworkListenerForTest();
-        DownloadInfo paused =
+        DownloadInfo interrupted =
                 Builder.fromDownloadInfo(getDownloadInfo()).setIsResumable(true).build();
-        notifier.expect(MethodID.DOWNLOAD_PROGRESS, paused)
-                .andThen(MethodID.DOWNLOAD_PAUSED, paused);
-        dService.onDownloadUpdated(paused);
+        notifier.expect(MethodID.DOWNLOAD_PROGRESS, interrupted)
+                .andThen(MethodID.DOWNLOAD_INTERRUPTED, interrupted);
+        dService.onDownloadUpdated(interrupted);
         Thread.sleep(DELAY_BETWEEN_CALLS);
-        dService.onDownloadInterrupted(paused, true);
+        dService.onDownloadInterrupted(interrupted, true);
         notifier.waitTillExpectedCallsComplete();
         int resumableIdCount = dService.mAutoResumableDownloadIds.size();
         dService.onConnectionTypeChanged(ConnectionType.CONNECTION_WIFI);
@@ -506,13 +512,13 @@
         final DownloadManagerServiceForTest dService = new DownloadManagerServiceForTest(
                 getTestContext(), notifier, UPDATE_DELAY_FOR_TEST);
         DownloadManagerService.disableNetworkListenerForTest();
-        DownloadInfo paused =
+        DownloadInfo interrupted =
                 Builder.fromDownloadInfo(getDownloadInfo()).setIsResumable(true).build();
-        notifier.expect(MethodID.DOWNLOAD_PROGRESS, paused)
-                .andThen(MethodID.DOWNLOAD_PAUSED, paused);
-        dService.onDownloadUpdated(paused);
+        notifier.expect(MethodID.DOWNLOAD_PROGRESS, interrupted)
+                .andThen(MethodID.DOWNLOAD_INTERRUPTED, interrupted);
+        dService.onDownloadUpdated(interrupted);
         Thread.sleep(DELAY_BETWEEN_CALLS);
-        dService.onDownloadInterrupted(paused, true);
+        dService.onDownloadInterrupted(interrupted, true);
         notifier.waitTillExpectedCallsComplete();
         DownloadManagerService.setIsNetworkMeteredForTest(true);
         int resumableIdCount = dService.mAutoResumableDownloadIds.size();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
index c089ae7..3a62b26e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
@@ -140,7 +140,7 @@
         DownloadResumptionScheduler.setDownloadResumptionScheduler(scheduler);
         setupService();
         Set<String> notifications = new HashSet<String>();
-        notifications.add(new DownloadSharedPreferenceEntry(1, true, true,
+        notifications.add(new DownloadSharedPreferenceEntry(1, false, true,
                 UUID.randomUUID().toString(), "test1").getSharedPreferenceString());
         SharedPreferences sharedPrefs = ContextUtils.getAppSharedPreferences();
         SharedPreferences.Editor editor = sharedPrefs.edit();
@@ -183,9 +183,9 @@
         Context mockContext = new AdvancedMockContext(getSystemContext());
         getService().setContext(mockContext);
         Set<String> notifications = new HashSet<String>();
-        notifications.add(new DownloadSharedPreferenceEntry(1, true, true,
+        notifications.add(new DownloadSharedPreferenceEntry(1, false, true,
                 UUID.randomUUID().toString(), "test1").getSharedPreferenceString());
-        notifications.add(new DownloadSharedPreferenceEntry(2, true, true,
+        notifications.add(new DownloadSharedPreferenceEntry(2, false, true,
                 UUID.randomUUID().toString(), "test2").getSharedPreferenceString());
         SharedPreferences sharedPrefs =
                 ContextUtils.getAppSharedPreferences();
@@ -213,10 +213,10 @@
         getService().setContext(mockContext);
         Set<String> notifications = new HashSet<String>();
         String guid1 = UUID.randomUUID().toString();
-        notifications.add(new DownloadSharedPreferenceEntry(3, true, true, guid1, "success")
+        notifications.add(new DownloadSharedPreferenceEntry(3, false, true, guid1, "success")
                 .getSharedPreferenceString());
         String guid2 = UUID.randomUUID().toString();
-        notifications.add(new DownloadSharedPreferenceEntry(4, true, true, guid2, "failed")
+        notifications.add(new DownloadSharedPreferenceEntry(4, false, true, guid2, "failed")
                 .getSharedPreferenceString());
         SharedPreferences sharedPrefs = ContextUtils.getAppSharedPreferences();
         SharedPreferences.Editor editor = sharedPrefs.edit();
@@ -277,10 +277,10 @@
         getService().setContext(mockContext);
         Set<String> notifications = new HashSet<String>();
         String guid1 = UUID.randomUUID().toString();
-        notifications.add(new DownloadSharedPreferenceEntry(3, true, false, guid1, "success")
+        notifications.add(new DownloadSharedPreferenceEntry(3, false, false, guid1, "success")
                 .getSharedPreferenceString());
         String guid2 = UUID.randomUUID().toString();
-        notifications.add(new DownloadSharedPreferenceEntry(4, true, true, guid2, "failed")
+        notifications.add(new DownloadSharedPreferenceEntry(4, false, true, guid2, "failed")
                 .getSharedPreferenceString());
         SharedPreferences sharedPrefs = ContextUtils.getAppSharedPreferences();
         SharedPreferences.Editor editor = sharedPrefs.edit();
@@ -311,6 +311,32 @@
         assertEquals(manager.mDownloads.get(0).getDownloadInfo().getDownloadGuid(), guid1);
     }
 
+    /**
+     * Tests incognito download fails when browser gets killed.
+     */
+    @SmallTest
+    @Feature({"Download"})
+    public void testIncognitoDownloadFailsOnBrowserKill() throws Exception {
+        setupService();
+        Context mockContext = new AdvancedMockContext(getSystemContext());
+        getService().setContext(mockContext);
+        Set<String> notifications = new HashSet<String>();
+        String uuid = UUID.randomUUID().toString();
+        notifications.add(new DownloadSharedPreferenceEntry(1, true, true, uuid, "test1")
+                .getSharedPreferenceString());
+        SharedPreferences sharedPrefs =
+                ContextUtils.getAppSharedPreferences();
+        SharedPreferences.Editor editor = sharedPrefs.edit();
+        editor.putStringSet(
+                DownloadNotificationService.PENDING_DOWNLOAD_NOTIFICATIONS, notifications);
+        editor.apply();
+        startNotificationService();
+        assertTrue(getService().isPaused());
+        assertFalse(sharedPrefs.contains(
+                DownloadNotificationService.PENDING_DOWNLOAD_NOTIFICATIONS));
+        assertEquals(uuid, getService().getFailedDownloadGuid());
+    }
+
     @SmallTest
     @Feature({"Download"})
     public void testParseDownloadNotifications() {
@@ -321,15 +347,19 @@
                 DownloadSharedPreferenceEntry.parseFromString(notification);
         assertEquals(1, entry.notificationId);
         assertEquals("test.pdf", entry.fileName);
-        assertFalse(entry.isResumable);
+        assertFalse(entry.isOffTheRecord);
         assertEquals(uuid, entry.downloadGuid);
 
         notification = DownloadSharedPreferenceEntry.VERSION + ",2,1,1," + uuid + ",test,2.pdf";
         entry = DownloadSharedPreferenceEntry.parseFromString(notification);
         assertEquals(2, entry.notificationId);
         assertEquals("test,2.pdf", entry.fileName);
-        assertTrue(entry.isResumable);
+        assertTrue(entry.isOffTheRecord);
         assertEquals(uuid, entry.downloadGuid);
+
+        notification = "1,2,1,1," + uuid + ",test,2.pdf";
+        entry = DownloadSharedPreferenceEntry.parseFromString(notification);
+        assertFalse(entry.isOffTheRecord);
     }
 
     @SmallTest
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java
index 5e20c3e4..f5ff32c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java
@@ -18,6 +18,7 @@
     private boolean mPaused = false;
     private Context mContext;
     private int mLastNotificationId;
+    private String mFailedDownloadGuid;
 
     void setContext(Context context) {
         mContext = context;
@@ -50,10 +51,20 @@
         mNotificationIds.remove(Integer.valueOf(notificationId));
     }
 
+    @Override
+    public void notifyDownloadFailed(String downloadGuid, String fileName) {
+        super.notifyDownloadFailed(downloadGuid, fileName);
+        mFailedDownloadGuid = downloadGuid;
+    }
+
     public int getLastAddedNotificationId() {
         return mLastNotificationId;
     }
 
+    public String getFailedDownloadGuid() {
+        return mFailedDownloadGuid;
+    }
+
     @Override
     public Context getApplicationContext() {
         return mContext == null ? super.getApplicationContext() : mContext;
diff --git a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncCustomizationFragmentTest.java b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncCustomizationFragmentTest.java
index 65e5ca7..d373fbd 100644
--- a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncCustomizationFragmentTest.java
+++ b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncCustomizationFragmentTest.java
@@ -548,32 +548,42 @@
         clickButton(okButton);
         assertTrue(pcdf.isResumed());
         assertNotNull(enterPassphrase.getError());
+        assertNull(confirmPassphrase.getError());
 
         // Error if you try to submit with only the first box filled.
         clearError(confirmPassphrase);
         setText(enterPassphrase, "foo");
         clickButton(okButton);
         assertTrue(pcdf.isResumed());
+        assertNull(enterPassphrase.getError());
         assertNotNull(confirmPassphrase.getError());
 
-        // Error if you try to submit with only the second box filled.
+        // Remove first box should only show empty error message
         setText(enterPassphrase, "");
+        clickButton(okButton);
+        assertNotNull(enterPassphrase.getError());
+        assertNull(confirmPassphrase.getError());
+
+        // Error if you try to submit with only the second box filled.
         clearError(confirmPassphrase);
         setText(confirmPassphrase, "foo");
         clickButton(okButton);
         assertTrue(pcdf.isResumed());
+        assertNull(enterPassphrase.getError());
         assertNotNull(confirmPassphrase.getError());
 
         // No error if text doesn't match without button press.
         setText(enterPassphrase, "foo");
         clearError(confirmPassphrase);
         setText(confirmPassphrase, "bar");
+        assertNull(enterPassphrase.getError());
         assertNull(confirmPassphrase.getError());
 
         // Error if you try to submit unmatching text.
         clearError(confirmPassphrase);
         clickButton(okButton);
         assertTrue(pcdf.isResumed());
+        assertNull(enterPassphrase.getError());
         assertNotNull(confirmPassphrase.getError());
 
         // Success if text matches.
diff --git a/chrome/android/webapk/shell_apk/AndroidManifest.xml b/chrome/android/webapk/shell_apk/AndroidManifest.xml
index 14e2062..86bdbe169f 100644
--- a/chrome/android/webapk/shell_apk/AndroidManifest.xml
+++ b/chrome/android/webapk/shell_apk/AndroidManifest.xml
@@ -30,6 +30,12 @@
                 <data android:scheme="https" android:host="{{ scope_url_host }}" android:pathPrefix="/"></data>
             </intent-filter>
         </activity>
+        <activity android:name="org.chromium.webapk.shell_apk.NotificationSettingsLauncherActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.NOTIFICATION_PREFERENCES"/>
+            </intent-filter>
+        </activity>
         <meta-data android:name="runtimeHost" android:value="{{ runtime_host }}" />
         <meta-data android:name="startUrl" android:value="{{ start_url }}" />
         <meta-data android:name="name" android:value="{{ name }}" />
diff --git a/chrome/android/webapk/shell_apk/BUILD.gn b/chrome/android/webapk/shell_apk/BUILD.gn
index c15b38c..d5f4316 100644
--- a/chrome/android/webapk/shell_apk/BUILD.gn
+++ b/chrome/android/webapk/shell_apk/BUILD.gn
@@ -77,6 +77,7 @@
   java_files = [
     "src/org/chromium/webapk/shell_apk/HostBrowserClassLoader.java",
     "src/org/chromium/webapk/shell_apk/MainActivity.java",
+    "src/org/chromium/webapk/shell_apk/NotificationSettingsLauncherActivity.java",
     "src/org/chromium/webapk/shell_apk/WebApkSandboxedProcessService.java",
     "src/org/chromium/webapk/shell_apk/WebApkSandboxedProcessService0.java",
     "src/org/chromium/webapk/shell_apk/WebApkSandboxedProcessService1.java",
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/NotificationSettingsLauncherActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/NotificationSettingsLauncherActivity.java
new file mode 100644
index 0000000..fd405f2
--- /dev/null
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/NotificationSettingsLauncherActivity.java
@@ -0,0 +1,27 @@
+// 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.
+
+package org.chromium.webapk.shell_apk;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+
+/**
+ * Forwards NOTIFICATION_PREFERENCES intent to host browser.
+ */
+public class NotificationSettingsLauncherActivity extends Activity {
+
+    @Override
+    public void onCreate(Bundle savedInstance) {
+        super.onCreate(savedInstance);
+
+        String hostPackage = WebApkUtils.getHostBrowserPackageName(this);
+        Intent intent = getIntent();
+        intent.setPackage(hostPackage);
+        intent.setComponent(null);
+        startActivity(intent);
+        finish();
+    }
+}
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 03e8c57..300d7c5 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -7782,6 +7782,25 @@
       <message name="IDS_MD_FEEDBACK_SEND_REPORT_BUTTON" desc="Text for Send Report button of the feedback dialog. When clicked, the feedback report will be sent.">
         Send feedback
       </message>
+      <message name="IDS_MD_FEEDBACK_SCREENSHOT_LABEL" desc="Label for the checkbox to indicate whether the shown screenshot should be included in the feedback report.">
+        Include this screenshot:
+      </message>
+      <message name="IDS_MD_FEEDBACK_SEND_SYSTEM_INFO_LABEL" desc="Label for the checkbox to indicate whether the system info should be included in the feedback report.">
+        Send system information
+      </message>
+      <if expr="_google_chrome">
+        <message name="IDS_MD_FEEDBACK_PRIVACY_NOTE" desc="Text for the privacy note shown on the feedback dialog.">
+          Your Chrome and operating system version will be submitted in addition
+          to any information you choose to include above. If you include your email
+          address, Google may contact you regarding your feedback report. This feedback
+          is used to diagnose problems and help improve Chrome. Any personal information
+          you submit, whether explicitly or incidentally will be protected in
+          accordance with our privacy policies.<ph name="BEGIN_BOLD">&lt;strong&gt;
+          </ph> By submitting this feedback, you agree that Google may use feedback
+          that you provide to improve any Google product or service.
+          <ph name="END_BOLD">&lt;/strong&gt;</ph>
+        </message>
+      </if>
 
       <!-- Clear Browsing Data -->
       <message name="IDS_CLEAR_BROWSING_DATA_TITLE" desc="Dialog title">
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb
index be0291a..b0170d8 100644
--- a/chrome/app/resources/chromium_strings_am.xtb
+++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -53,6 +53,7 @@
 <translation id="2558641060352364164">ይህ ጣቢያ በቅርቡ የማይደገፍ የሚሆን የChromium ክፈፍ ተሰኪውን እየተጠቀመ ነው። እባክዎ ያራግፉትና ወደ ዘመናዊ አሳሽ ያሻሽሉ።</translation>
 <translation id="2572494885440352020">Chromium አጋዥ</translation>
 <translation id="2595977381794111014">መተግበሪያዎችዎን መድረሱን ለመቀጠል በChromium ዕልባቶች አሞሌ ውስጥ የ<ph name="APPS_ICON_IMAGE" /> አቋራጩን ይጠቀሙ።</translation>
+<translation id="2605472041568654097">የአሁኖቹን ቅንብሮች ሪፖርት በማድረግ Chromium የተሻለ እንዲሆን ያግዙ።</translation>
 <translation id="2636877269779209383">Chromium ይህን ለዚህ ጣቢያ ለማጋራት የካሜራ መዳረሻ ያስፈልገዋል።</translation>
 <translation id="2648074677641340862">በጭነት ጊዜ የስርዓተ ክወና ስህተት ተፈጥሯል። እባክዎ Chromiumን እንደገና ያውርዱት።</translation>
 <translation id="2685838254101182273">Chromium ማዘመን አቁሟል፣ እና ከአሁን በኋላ ይህን የስርዓተ ክወናዎን ስሪት አይደግፍም።</translation>
@@ -78,6 +79,7 @@
 
 <ph name="USER_DATA_DIRECTORY" /></translation>
 <translation id="328888136576916638">የGoogle ኤ ፒ አይ ቁልፎች ይጎድላሉ። አንዳንድ የChromium ተግባራት ይሰናከላሉ።</translation>
+<translation id="3289635842886789612">Chromium ጊዜው አልፎበታል።</translation>
 <translation id="3296368748942286671">Chromium ሲዘጋ የጀርባ መተግበሪያዎች ማሂዱን ይቀጥሉ</translation>
 <translation id="3312805357485578561">Chromium ያልተለመደ ባህሪይን አግኝቷል</translation>
 <translation id="331951419404882060">በመለያ ሲገባ በነበረ ስህተት ምክንያት Chromium OS ውሂብዎን ማመሳሰል አልቻለም።</translation>
@@ -96,14 +98,17 @@
 <translation id="3883381313049582448">በChromium የመነጨ የይለፍ ቃል ይጠቀሙ</translation>
 <translation id="3889543394854987837">Chromiumን ለመክፈት እና ማሰስ ለመጀመር ስምዎን ጠቅ ያድርጉት።</translation>
 <translation id="390894725198123737">Mac ላይ የይለፍ ቃላት በእርስዎ Keychain ላይ ሊቀመጡ ይችላሉ፣ እና ይህን የOS X መለያ በሚጋሩ ሌሎች የChromium ተጠቃሚዎች ሊደረስባቸው ወይም ሊሰመሩ ይችላሉ።</translation>
+<translation id="3994125055863078356">Chromium ነባሪው አሳሽ መሆን አልቻለም።</translation>
 <translation id="4050175100176540509">አስፈላጊ የደህንነት ማሻሻያዎች እና አዲስ ባህሪያት በቅርብ ጊዜው ስሪቱ ላይ ይገኛሉ።</translation>
 <translation id="4077262827416206768">ይህ ለውጥ እንዲተገበር እባክዎ የChromium መስኮቶችን ይዝጉና Chromiumን ዳግም ያስጀምሩ።</translation>
+<translation id="4182290826692170034">Chromiumን የእርስዎ ነባሪ አሳሽ ነው። ወንዳታ!</translation>
 <translation id="4207043877577553402"><ph name="BEGIN_BOLD" />ማስጠንቀቂያ፦<ph name="END_BOLD" /> Chromium ቅጥያዎች የአሰሳ ታሪክዎን እንዳይመዘግቡ መከልከል አይችልም። ይህን ቅጥያ ማንነትን በማያሳውቅ ሁነት ላይ ለማሰናከል ይህን አማራጭ አይምረጡ።</translation>
 <translation id="421369550622382712">ለChromium ምርጥ መተግበሪያዎችን፣ ጨዋታዎችን፣ ቅጥያዎችን እና ገጽታዎችን ያግኙ።</translation>
 <translation id="4222580632002216401">አሁን ወደ Chromium ገብተዋል! ማመሳሰል በአስተዳዳሪዎ ተሰናክሏል።</translation>
 <translation id="4224199872375172890">Chromium የተዘመነ ነው።</translation>
 <translation id="4230135487732243613">የChromium ውሂዎ ከዚህ መለያ ጋር ይገናኝ?</translation>
 <translation id="4246125976471362530">{SECONDS,plural, =1{Chromium በ1 ሰከንድ ውስጥ ዳግም ይጀምራል።}one{Chromium በ# ሰከንዶች ውስጥ ዳግም ይጀምራል።}other{Chromium በ# ሰከንዶች ውስጥ ዳግም ይጀምራል።}}</translation>
+<translation id="4271805377592243930">Chromium ላይ እገዛ ያግኙ</translation>
 <translation id="4285930937574705105">ተለይቶ ባልታወቀ ስህተት ምክንያት ጭነት ከሽፏል። Chromium አሁን እያሄደ ከሆነ እባክዎ ይዝጉትና እንደገና ይሞክሩ።</translation>
 <translation id="4330585738697551178">ይህ ሞዱል ከChromium ጋር የሚጋጭ መሆኑ ይታወቃል።</translation>
 <translation id="4423735387467980091">Chromiumን ያብጁ እና ይቆጣጠሩ</translation>
@@ -114,13 +119,16 @@
 <translation id="459535195905078186">የChromium መተግበሪያዎች</translation>
 <translation id="4621240073146040695">የተዘመነ ለመሆን ጥቂት ብቻ ቀርቷል! ማዘመን ለማጠናቀቅ Chromiumን ዳግም ያስጀምሩት።</translation>
 <translation id="4677944499843243528">መገለጫው በሌላ ኮምፒውተር (<ph name="HOST_NAME" />) ላይ በሌላ የChromium ሂደት (<ph name="PROCESS_ID" />) የተያዘ ይመስላል። Chromium መገለጫው እንዳይበላሽ ቆልፎታል።  ሌሎች ሂደቶች ይህን መገለጫ እየተጠቀሙበት እንዳልሆኑ እርግጠኛ ከሆኑ መገለጫውን አስከፍተው Chromiumን ዳግም ማስጀመር ይችላሉ።</translation>
+<translation id="469338717132742108">Chromium OS ላይ እገዛ ያግኙ</translation>
 <translation id="4743926867934016338">ተቀበል እና ፈልግ</translation>
 <translation id="4888717733111232871">Chromium ለmDNS ትራፊክ ለመፍቀድ የውስጥ ደንብ።</translation>
 <translation id="4943838377383847465">Chromium በጀርባ ሁነታ ላይ ነው።</translation>
 <translation id="4987820182225656817">እንግዳዎች ማንኛውንም ነገር ወደኋላ ሳይተዉ Chromium መጠቀም ይችላሉ።</translation>
 <translation id="4994636714258228724">እራስዎን በChromium ላይ ያክሉ</translation>
 <translation id="5032989939245619637">ዝርዝሮችን Chromium ውስጥ አስቀምጥ</translation>
+<translation id="5113946445248196174">Chromium ነባሪ አሳሹን ማወቅ ወይም ማቀናበር አልቻለም።</translation>
 <translation id="5116586539350239523">Chromium የግል መረጃዎችዎን ዳግም መተየብ እንዳይኖርብዎት በጥንቃቄ ያከማቻቸዋል።</translation>
+<translation id="5231355151045086930">ከChromium ዘግተው ይውጡ</translation>
 <translation id="5358375970380395591">በሚተዳደር መለያ እየገቡ ነው፣ እና አስተዳዳሪው በእርስዎ Chromium መገለጫ ላይ ቁጥጥር እየሰጡት ነው። እንደ እርስዎ  መተግበሪያዎች፣ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች ያሉ የእርስዎ Chromium ውሂብ እስከ መጨረሻው ከ<ph name="USER_NAME" /> ጋር የተያያዙ ይሆናሉ። ይህን ውሂብ በGoogle የመለያዎች Dashboard አማካኝነት ሊሰርዙት ይችላሉ፣ ነገር ግን ይህን ውሂብ ከሌላ መለያ ጋር ሊያጎዳኙት አይችሉም። <ph name="LEARN_MORE" /></translation>
 <translation id="5398878173008909840">አዲስ የChromium ስሪት አለ።</translation>
 <translation id="5427571867875391349">Chromium እንደ ነባሪ አሳሽዎ አድርገው ያዋቅሩት</translation>
@@ -180,6 +188,7 @@
 <translation id="705851970750939768">Chromiumን አዘምን</translation>
 <translation id="7064610482057367130">ምንም የሚዘምን የChromium ጭነት አልተገኘም።</translation>
 <translation id="7066436765290594559">Chromium OS የእርስዎን ውሂብ ማመሳሰል አልቻለም። የእርስዎን የማመሳሰያ የይለፍ ሐረግ እባክዎ ያዘምኑ።</translation>
+<translation id="707471633328071618">Google Payments (ወደ Chromium ተቀድቷል)</translation>
 <translation id="7090955637699162649">Chromium የአሰሳ ተሞክሮዎን ለማሻሻል <ph name="BEGIN_LINK" />የድር አገልግሎቶች<ph name="END_LINK" />ን ሊጠቀም ይችላል። በማንኛውም ጊዜ እነዚህን አገልግሎቶች በአማራጭነት ማሰናከል ይችላሉ።</translation>
 <translation id="7114836556269756734">{NUM_ITEMS,plural, =1{ይሄ $1 ንጥል እስከመጨረሻው ከዚህ መሣሪያ ይሰርዘዋል። ውሂብዎን በኋላ ላይ ሰርስረው ለማውጣት እንደ $2 ሆነው ወደ Chromium ይግቡ።}one{ይሄ $1 ንጥሎችን እስከመጨረሻው ከዚህ መሣሪያ ይሰርዛቸዋል። ውሂብዎን በኋላ ላይ ሰርስረው ለማውጣት እንደ $2 ሆነው ወደ Chromium ይግቡ።}other{ይሄ $1 ንጥሎችን እስከመጨረሻው ከዚህ መሣሪያ ይሰርዛቸዋል። ውሂብዎን በኋላ ላይ ሰርስረው ለማውጣት እንደ $2 ሆነው ወደ Chromium ይግቡ።}}</translation>
 <translation id="7138853919861947730">Chromium የማሰስ ተሞክሮዎን ለማሻሻል የድር አገልግሎቶችን ሊጠቀም ይችላል።</translation>
@@ -191,6 +200,7 @@
 <translation id="7223968959479464213">ተግባር መሪ - Chromium</translation>
 <translation id="722928257909516027">የChromium ምናሌን አሳይ</translation>
 <translation id="731644333568559921">&amp;Chromium ስርዓተ ክወናን አዘምን</translation>
+<translation id="731795002583552498">Chromiumን በማዘመን ላይ...</translation>
 <translation id="7318036098707714271">የምርጫዎች ፋይልዎ የተበላሸ ወይም ልክ ያልሆነ ነው።
 
 Chromium ቅንብሮችዎን ማስመለስ አልቻለም።</translation>
@@ -220,6 +230,7 @@
 <translation id="7937630085815544518">እንደ <ph name="USER_EMAIL_ADDRESS" /> ሆነው ወደ Chromium ገብተዋል። እባክዎ እንደገና ለመግባት ተመሳሳዩን መለያ ይጠቀሙ።</translation>
 <translation id="795025003224538582">ዳግም አታስጀምር</translation>
 <translation id="7962572577636132072">Chromium በራስ-ሰር ይዘመናል፣ ስለዚህ ሁልጊዜ አዲሱ ስሪት ይኖርዎታል።</translation>
+<translation id="7975919845073681630">ይሄ ሁለተኛ የChromium ጭነት ነው፣ እና ነባሪ አሳሽዎ ማድረግ አይቻልም።</translation>
 <translation id="7979877361127045932">በChromium ምናሌ ውስጥ ደብቅ</translation>
 <translation id="8030318113982266900">መሳሪያዎን ወደ <ph name="CHANNEL_NAME" /> ሰርጥ በማዘመን ላይ...</translation>
 <translation id="8033665941300843262">Chromium ይህን ለዚህ ጣቢያ ለማጋራት የፍቃዶች መዳረሻ ያስፈልገዋል።</translation>
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb
index e2f1d8b3..146b1b4 100644
--- a/chrome/app/resources/chromium_strings_ar.xtb
+++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -51,6 +51,7 @@
 <translation id="2558641060352364164">‏هذا الموقع يستخدم المكون الإضافي Chromium Frame والذي سيصبح غير معتمد قريبًا. يُرجى إلغاء تثبيته والترقية إلى متصفّح حديث.</translation>
 <translation id="2572494885440352020">‏أداة مساعدة Chromium</translation>
 <translation id="2595977381794111014">‏استخدام الاختصار <ph name="APPS_ICON_IMAGE" /> في شريط الإشارات المرجعية لـ Chromium لمواصلة الدخول إلى تطبيقاتك.</translation>
+<translation id="2605472041568654097">‏ساعد في تحسين Chromium من خلال الإبلاغ عن الإعدادات الحالية.</translation>
 <translation id="2636877269779209383">‏يحتاج Chromium الوصول إلى الكاميرا لمشاركتها مع هذا الموقع.</translation>
 <translation id="2648074677641340862">‏حدث خطأ في نظام التشغيل أثناء عملية التثبيت. الرجاء إعادة تنزيل Chromium.</translation>
 <translation id="2685838254101182273">‏توقف تحديث Chromium ولم يعد متوافقًا مع هذا الإصدار من نظام التشغيل.</translation>
@@ -76,6 +77,7 @@
 
 <ph name="USER_DATA_DIRECTORY" /></translation>
 <translation id="328888136576916638">‏مفاتيح واجهة برمجة تطبيقات Google مفقودة. وسيترتب على ذلك توقف بعض وظائف Chromium عن العمل.</translation>
+<translation id="3289635842886789612">‏إصدار Chromium قديم.</translation>
 <translation id="3296368748942286671">‏استمرار تشغيل تطبيقات الخلفية عند إغلاق Chromium</translation>
 <translation id="3312805357485578561">‏لقد اكتشف Chromium سلوكًا غير معتاد</translation>
 <translation id="331951419404882060">‏تعذر على نظام التشغيل Chromium مزامنة البيانات نظرًا لحدوث خطأ أثناء تسجيل الدخول.</translation>
@@ -94,14 +96,17 @@
 <translation id="3883381313049582448">‏استخدام كلمة المرور التي تم إنشاؤها بواسطة Chromium</translation>
 <translation id="3889543394854987837">‏انقر على اسمك لفتح Chromium وبدء التصفح.</translation>
 <translation id="390894725198123737">‏في نظام التشغيل Mac، قد يتم حفظ كلمات المرور في تطبيق Keychain والدخول إليها أو مزامنتها من قبل مستخدمي Chromium الآخرين الذين يشاركون حساب نظام التشغيل X هذا.</translation>
+<translation id="3994125055863078356">‏تعذر على Chromium أن يكون المتصفح الافتراضي.</translation>
 <translation id="4050175100176540509">تحسينات الأمان المهمة والميزات الجديدة متاحة في أحدث إصدار.</translation>
 <translation id="4077262827416206768">‏الرجاء إغلاق جميع نوافذ Chromium وإعادة تشغيل Chromium حتى يسري هذا التغيير.</translation>
+<translation id="4182290826692170034">‏Chromium هو متصفحك الافتراضي. رائع!</translation>
 <translation id="4207043877577553402"><ph name="BEGIN_BOLD" />تحذير:<ph name="END_BOLD" /> لا يستطيع منع الإضافات من تسجيل سجل التصفح. لتعطيل هذه الإضافة في وضع التصفح المخفي، ألغ تحديد هذا الخيار.</translation>
 <translation id="421369550622382712">‏اكتشف تطبيقات، وألعاب، وإضافات، ومظاهر رائعة لمتصفح Chromium.</translation>
 <translation id="4222580632002216401">‏لقد سجلت الدخول الآن إلى Chromium! عطّل المشرف المزامنة.</translation>
 <translation id="4224199872375172890">‏Chromium محدّث.</translation>
 <translation id="4230135487732243613">‏هل ترغب في ربط بياناتك في Chromium بهذا الحساب؟</translation>
 <translation id="4246125976471362530">{SECONDS,plural, =1{‏ستتم إعادة تشغيل Chromium خلال ثانية واحدة (1).}zero{‏ستتم إعادة تشغيل Chromium خلال # ثانية.}two{‏ستتم إعادة تشغيل Chromium خلال ثانيتين (#).}few{‏ستتم إعادة تشغيل Chromium خلال # ثوانٍ.}many{‏ستتم إعادة تشغيل Chromium خلال # ثانية.}other{‏ستتم إعادة تشغيل Chromium خلال # ثانية.}}</translation>
+<translation id="4271805377592243930">‏الحصول على مساعدة في Chromium</translation>
 <translation id="4285930937574705105">‏أخفقت عملية التثبيت بسبب خطأ غير محدد. إذا كان Chromium في حالة التشغيل حاليًا، فالرجاء إغلاقه وإعادة المحاولة.</translation>
 <translation id="4330585738697551178">‏هذه الوحدة معروف أنها تتعارض مع Chromium.</translation>
 <translation id="4423735387467980091">‏تخصيص Chromium والتحكم فيه</translation>
@@ -112,13 +117,16 @@
 <translation id="459535195905078186">‏تطبيقات Chromium</translation>
 <translation id="4621240073146040695">‏أوشك التحديث على الانتهاء! إعادة تشغيل Chromium لإنهاء التحديث.</translation>
 <translation id="4677944499843243528">‏يبدو أن الملف الشخصي قيد الاستخدام بواسطة عملية أخرى في Chromium (<ph name="PROCESS_ID" />) على جهاز كمبيوتر آخر (<ph name="HOST_NAME" />). وقد تمّ قفل الملف الشخصي من جانب Chromium لضمان عدم تعرضه للتلف. فإذا كنت واثقًا من عدم وجود عمليات أخرى قيد التشغيل على جهاز الكمبيوتر، فيُمكنك إلغاء قفل الملف الشخصي وإعادة تشغيل Chromium مجددًا.</translation>
+<translation id="469338717132742108">‏الحصول على مساعدة في نظام التشغيل Chromium</translation>
 <translation id="4743926867934016338">موافقة وبحث</translation>
 <translation id="4888717733111232871">‏قاعدة الوارد إلى Chromium للسماح بحركة مرور mDNS.</translation>
 <translation id="4943838377383847465">‏Chromium في وضع الخلفية.</translation>
 <translation id="4987820182225656817">‏يمكن للضيف استخدام Chromium بدون أن يترك أي أثر وراءه.</translation>
 <translation id="4994636714258228724">‏إضافة نفسك إلى Chromium</translation>
 <translation id="5032989939245619637">‏حفظ التفاصيل في Chromium</translation>
+<translation id="5113946445248196174">‏يتعذر على Chromium تحديد المتصفح الافتراضي أو تعيينه.</translation>
 <translation id="5116586539350239523">‏سيخزّن Chromium معلوماتك الشخصية بشكلٍ آمن حتى لا تُضطر إلى كتابتها مرةً أخرى.</translation>
+<translation id="5231355151045086930">‏الخروج من Chromium</translation>
 <translation id="5358375970380395591">‏أنت تسجل الدخول باستخدام حساب يخضع للإدارة وتتيح للمشرف إمكانية التحكم في ملفك الشخصي على Chromium. وستكون بياناتك في Chromium مثل تطبيقاتك وإشاراتك المرجعية وسجلك وكلمات المرور التابعة لك والإعدادات الأخرى مرتبطة دائمًا بالمستخدم <ph name="USER_NAME" />. ستتمكن من حذف هذه البيانات عبر لوحة تحكم حسابات Google، ولكنك لن تتمكن من إقران هذه البيانات بحساب آخر. <ph name="LEARN_MORE" /></translation>
 <translation id="5398878173008909840">‏يتوفر إصدار جديد من Chromium.</translation>
 <translation id="5427571867875391349">‏تعيين Chromium المتصفح الافتراضي</translation>
@@ -178,6 +186,7 @@
 <translation id="705851970750939768">‏تحديث Chromium</translation>
 <translation id="7064610482057367130">‏لم يتم العثور على تثبيت Chromium لإجراء التحديث.</translation>
 <translation id="7066436765290594559">‏تعذر على نظام التشغيل Chromium مزامنة البيانات. الرجاء تحديث عبارة مرور المزامنة.</translation>
+<translation id="707471633328071618">‏Google Payments (تم النسخ إلى Chromium)</translation>
 <translation id="7090955637699162649">‏قد يستخدم Chromium <ph name="BEGIN_LINK" />خدمات الويب<ph name="END_LINK" /> لتحسين تجربة التصفح. ويمكنك تعطيل هذه الخدمات اختياريًا في أي وقت.</translation>
 <translation id="7114836556269756734">{NUM_ITEMS,plural, =1{‏سيؤدي هذا إلى حذف عنصر $1 من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chromium باعتبارك ($2).}zero{‏سيؤدي هذا إلى حذف $1 عنصر من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chromium باعتبارك ($2).}two{‏سيؤدي هذا إلى حذف عنصرين ($1) من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chromium باعتبارك ($2).}few{‏سيؤدي هذا إلى حذف $1 عناصر من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chromium باعتبارك ($2).}many{‏سيؤدي هذا إلى حذف $1 عنصرًا من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chromium باعتبارك ($2).}other{‏سيؤدي هذا إلى حذف $1 عنصر من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chromium باعتبارك ($2).}}</translation>
 <translation id="7138853919861947730">‏قد يستخدم Chromium خدمات الويب لتحسين تجربة التصفح لديك.</translation>
@@ -189,6 +198,7 @@
 <translation id="7223968959479464213">‏إدارة المهام - Chromium</translation>
 <translation id="722928257909516027">‏إظهار قائمة Chromium</translation>
 <translation id="731644333568559921">‏تحديث ن&amp;ظام التشغيل Chromium</translation>
+<translation id="731795002583552498">‏تحديث Chromium</translation>
 <translation id="7318036098707714271">‏ملف التفضيلات تالف أو غير صالح.
 
 يتعذر على Chromium استعادة إعداداتك.</translation>
@@ -218,6 +228,7 @@
 <translation id="7937630085815544518">‏تم تسجيل دخولك إلى Chromium باعتبارك <ph name="USER_EMAIL_ADDRESS" />. الرجاء استخدام الحساب نفسه لتسجيل الدخول مرة أخرى.</translation>
 <translation id="795025003224538582">عدم إعادة التشغيل</translation>
 <translation id="7962572577636132072">‏يجري تحديث Chromium تلقائيًا بحيث يكون لديك أحدث إصدار.</translation>
+<translation id="7975919845073681630">‏هذا تثبيت ثانوي من Chromium، ولا يمكن جعله متصفحك الافتراضي.</translation>
 <translation id="7979877361127045932">‏الإخفاء في قائمة Chromium</translation>
 <translation id="8030318113982266900">جارٍ تحديث جهازك إلى قناة <ph name="CHANNEL_NAME" />...</translation>
 <translation id="8033665941300843262">‏يحتاج Chromium الوصول إلى الأذونات لمشاركتها مع هذا الموقع.</translation>
diff --git a/chrome/app/resources/chromium_strings_bg.xtb b/chrome/app/resources/chromium_strings_bg.xtb
index 5765740..0b5880c 100644
--- a/chrome/app/resources/chromium_strings_bg.xtb
+++ b/chrome/app/resources/chromium_strings_bg.xtb
@@ -51,6 +51,7 @@
 <translation id="2558641060352364164">Този сайт използва приставката Chromium Frame, чиято поддръжка скоро ще бъде прекратена. Моля, деинсталирайте я и надстройте до модерен браузър.</translation>
 <translation id="2572494885440352020">Chromium Helper</translation>
 <translation id="2595977381794111014">Използвайте прекия път <ph name="APPS_ICON_IMAGE" /> в лентата на отметките в Chromium, за да продължите да осъществявате достъп до приложенията си.</translation>
+<translation id="2605472041568654097">Помогнете за подобряването на Chromium, като подадете сигнал за текущите настройки.</translation>
 <translation id="2636877269779209383">Chromium се нуждае от достъп до камерата, за да я сподели с този сайт.</translation>
 <translation id="2648074677641340862">По време на инсталирането възникна грешка в операционната система. Моля, изтеглете отново Chromium.</translation>
 <translation id="2685838254101182273">Chromium спря да се актуализира и вече не поддържа тази версия на операционната ви система.</translation>
@@ -74,6 +75,7 @@
 <translation id="3256316712990552818">Копирано в Chromium</translation>
 <translation id="3258596308407688501">Chromium не може да чете и записва в директорията си за данни: <ph name="USER_DATA_DIRECTORY" /></translation>
 <translation id="328888136576916638">Ключовете на приложния програмен интерфейс (API) на Google липсват. Някои функции на Chromium ще бъдат деактивирани.</translation>
+<translation id="3289635842886789612">Chromium не е актуален.</translation>
 <translation id="3296368748942286671">Да продължават да се изпълняват приложения на заден план, когато Chromium е затворен</translation>
 <translation id="3312805357485578561">Chromium установи необичайно поведение</translation>
 <translation id="331951419404882060">Chromium OS не можа да синхронизира данните ви поради грешка при влизане в профила.</translation>
@@ -92,14 +94,17 @@
 <translation id="3883381313049582448">Използвайте парола, генерирана от Chromium</translation>
 <translation id="3889543394854987837">Кликнете върху името си, за да отворите Chromium и да започнете да сърфирате.</translation>
 <translation id="390894725198123737">Под Mac паролите може да се запазват в Keychain и да се използват или синхронизират от други потребители на Chromium, споделящи този профил в OS X.</translation>
+<translation id="3994125055863078356">Chromium не можа да се зададе като браузър по подразбиране.</translation>
 <translation id="4050175100176540509">В последната версия са налице важни подобрения в сигурността и нови функции.</translation>
 <translation id="4077262827416206768">Моля, затворете всички прозорци на Chromium и го стартирайте отново, за да влезе в сила тази промяна.</translation>
+<translation id="4182290826692170034">Chromium е браузърът ви по подразбиране. Ура!</translation>
 <translation id="4207043877577553402"><ph name="BEGIN_BOLD" />Предупреждение<ph name="END_BOLD" />: Chromium не може да попречи на разширенията да записват историята на сърфирането ви. За да деактивирате това разширение в режим „инкогнито“, премахнете отметката от тази опция.</translation>
 <translation id="421369550622382712">Открийте отлични приложения, игри, разширения и теми за Chromium.</translation>
 <translation id="4222580632002216401">Вече влязохте в Chromium! Синхронизирането е деактивирано от администратора ви.</translation>
 <translation id="4224199872375172890">Chromium е актуален.</translation>
 <translation id="4230135487732243613">Да се свържат ли данните ви в Chromium с този профил?</translation>
 <translation id="4246125976471362530">{SECONDS,plural, =1{Chromium ще се рестартира след 1 секунда.}other{Chromium ще се рестартира след # секунди.}}</translation>
+<translation id="4271805377592243930">Получаване на помощ за Chromium</translation>
 <translation id="4285930937574705105">Инсталирането не бе успешно поради неизвестна грешка. Ако Chromium понастоящем се изпълнява, моля, затворете го и опитайте отново.</translation>
 <translation id="4330585738697551178">За този модул е известно, че влиза в конфликт с Chromium.</translation>
 <translation id="4423735387467980091">Персонализиране и контролиране на Chromium</translation>
@@ -110,13 +115,16 @@
 <translation id="459535195905078186">Приложения в Chromium</translation>
 <translation id="4621240073146040695">Актуализирането почти завърши! Остава само да стартирате отново Chromium.</translation>
 <translation id="4677944499843243528">Изглежда, че потребителският профил се използва от друг процес на Chromium  (<ph name="PROCESS_ID" />) на друг компютър (<ph name="HOST_NAME" />). Chromium заключи потребителския профил, за да не се повреди. Ако сте сигурни, че нито един друг процес не го използва, можете да отключите потребителския профил и да стартирате Chromium повторно.</translation>
+<translation id="469338717132742108">Получаване на помощ за Chromium OS</translation>
 <translation id="4743926867934016338">Приемане и търсене</translation>
 <translation id="4888717733111232871">Правило за Chromium за допускане на входящия трафик за mDNS.</translation>
 <translation id="4943838377383847465">Chromium работи на заден план.</translation>
 <translation id="4987820182225656817">Гостите могат да използват Chromium, без да оставят следи.</translation>
 <translation id="4994636714258228724">Добавяне на вас към Chromium</translation>
 <translation id="5032989939245619637">Подробностите да се запазват в Chromium</translation>
+<translation id="5113946445248196174">Chromium не може да определи или зададе браузъра по подразбиране.</translation>
 <translation id="5116586539350239523">Chromium ще съхранява надеждно личните ви данни, за да не се налага да ги въвеждате отново.</translation>
+<translation id="5231355151045086930">Изход от Chromium</translation>
 <translation id="5358375970380395591">Влизате с управляван профил и давате на администратора му контрол над потребителския си профил в Chromium. Данните ви там, като например приложения, отметки, история, пароли и други настройки, ще се свържат за постоянно с/ъс <ph name="USER_NAME" />. Ще можете да ги изтриете чрез таблото за управление на Google Профили, но не и да ги свържете с друг профил. <ph name="LEARN_MORE" /></translation>
 <translation id="5398878173008909840">Налице е нова версия на Chromium.</translation>
 <translation id="5427571867875391349">Задаване на Chromium като браузър по подразбиране</translation>
@@ -174,6 +182,7 @@
 <translation id="705851970750939768">Актуализиране на Chromium</translation>
 <translation id="7064610482057367130">Няма намерена инсталация на Chromium, която да се актуализира.</translation>
 <translation id="7066436765290594559">Chromium OS не можа да синхронизира данните ви. Моля, актуализирайте пропуска си за синхронизиране.</translation>
+<translation id="707471633328071618">Google Payments (копирано в Chromium)</translation>
 <translation id="7090955637699162649">Chromium може да използва <ph name="BEGIN_LINK" />уеб услуги<ph name="END_LINK" />, за да подобри сърфирането ви. В състояние сте да ги деактивирате по всяко време.</translation>
 <translation id="7114836556269756734">{NUM_ITEMS,plural, =1{$1 елемент ще се изтрие за постоянно от това устройство. За да извлечете данните си по-късно, влезте в Chromium като $2.}other{$1 елемента ще се изтрият за постоянно от това устройство. За да извлечете данните си по-късно, влезте в Chromium като $2.}}</translation>
 <translation id="7138853919861947730">Chromium може да използва уеб услуги, за да подобри сърфирането ви.</translation>
@@ -185,6 +194,7 @@
 <translation id="7223968959479464213">Диспечер на задачите – Chromium</translation>
 <translation id="722928257909516027">Показване на менюто на Chromium</translation>
 <translation id="731644333568559921">Актуализиране на &amp;Chromium OS</translation>
+<translation id="731795002583552498">Chromium се актуализира</translation>
 <translation id="7318036098707714271">Файлът с предпочитанията ви е повреден или невалиден. Chromium не може да възстанови настройките ви.</translation>
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7339898014177206373">Нов прозорец</translation>
@@ -212,6 +222,7 @@
 <translation id="7937630085815544518">Бяхте влезли в Chromium като <ph name="USER_EMAIL_ADDRESS" />. Моля, използвайте същия профил, за да влезете отново.</translation>
 <translation id="795025003224538582">Без рестартиране</translation>
 <translation id="7962572577636132072">Chromium се актуализира автоматично, така че винаги да имате най-новата версия.</translation>
+<translation id="7975919845073681630">Тази инсталация на Chromium е алтернативна и не може да се зададе като браузър по подразбиране.</translation>
 <translation id="7979877361127045932">Скриване в менюто на Chromium</translation>
 <translation id="8030318113982266900">Устройството ви се актуализира до канал: <ph name="CHANNEL_NAME" />...</translation>
 <translation id="8033665941300843262">Chromium се нуждае от достъп до разрешенията, за да ги сподели с този сайт.</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb
index f7e1961..9878157 100644
--- a/chrome/app/resources/chromium_strings_en-GB.xtb
+++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -53,6 +53,7 @@
 <translation id="2558641060352364164">This site is using the Chromium Frame plug-in which will soon be unsupported. Please uninstall it and upgrade to a modern browser.</translation>
 <translation id="2572494885440352020">Chromium Helper</translation>
 <translation id="2595977381794111014">Use the <ph name="APPS_ICON_IMAGE" /> shortcut in the Chromium bookmarks bar to continue accessing your apps.</translation>
+<translation id="2605472041568654097">Help make Chromium better by reporting the current settings.</translation>
 <translation id="2636877269779209383">Chromium needs camera access to share it with this site.</translation>
 <translation id="2648074677641340862">An operating system error occurred during installation. Please download Chromium again.</translation>
 <translation id="2685838254101182273">Chromium has stopped updating and no longer supports this version of your operating system.</translation>
@@ -78,6 +79,7 @@
 
 <ph name="USER_DATA_DIRECTORY" /></translation>
 <translation id="328888136576916638">Google API keys are missing. Some functionality of Chromium will be disabled.</translation>
+<translation id="3289635842886789612">Chromium is out of date.</translation>
 <translation id="3296368748942286671">Continue running background apps when Chromium is closed</translation>
 <translation id="3312805357485578561">Chromium has detected unusual behaviour</translation>
 <translation id="331951419404882060">Chromium OS could not sync your data due to an error signing in.</translation>
@@ -96,14 +98,17 @@
 <translation id="3883381313049582448">Use password generated by Chromium</translation>
 <translation id="3889543394854987837">Click your name to open Chromium and start browsing.</translation>
 <translation id="390894725198123737">On Mac, passwords may be saved to your Keychain and accessed or synced by other Chromium users sharing this OS X account.</translation>
+<translation id="3994125055863078356">Chromium was not able to become the default browser.</translation>
 <translation id="4050175100176540509">Important security improvements and new features are available in the latest version.</translation>
 <translation id="4077262827416206768">Please close all Chromium windows and relaunch Chromium for this change to take effect.</translation>
+<translation id="4182290826692170034">Chromium is your default browser. Yeah!</translation>
 <translation id="4207043877577553402"><ph name="BEGIN_BOLD" />Warning:<ph name="END_BOLD" /> Chromium cannot prevent extensions from recording your browsing history. To disable this extension in incognito mode, unselect this option.</translation>
 <translation id="421369550622382712">Discover great apps, games, extensions and themes for Chromium.</translation>
 <translation id="4222580632002216401">You're now signed in to Chromium! Sync is disabled by your administrator.</translation>
 <translation id="4224199872375172890">Chromium is up to date.</translation>
 <translation id="4230135487732243613">Link my Chromium data to this account</translation>
 <translation id="4246125976471362530">{SECONDS,plural, =1{Chromium will restart in 1 second.}other{Chromium will restart in # seconds.}}</translation>
+<translation id="4271805377592243930">Get help with Chromium</translation>
 <translation id="4285930937574705105">Installation failed due to unspecified error. If Google Chrome is currently running, please close it and try again.</translation>
 <translation id="4330585738697551178">This module is known to conflict with Chromium.</translation>
 <translation id="4423735387467980091">Customise and control Chromium</translation>
@@ -114,13 +119,16 @@
 <translation id="459535195905078186">Chromium Apps</translation>
 <translation id="4621240073146040695">Nearly up to date! Relaunch Chromium to finish updating.</translation>
 <translation id="4677944499843243528">The profile appears to be in use by another Chromium process (<ph name="PROCESS_ID" />) on another computer (<ph name="HOST_NAME" />). Chromium has locked the profile so that it doesn't get corrupted. If you are sure that no other processes are using this profile, you can unlock the profile and relaunch Chromium.</translation>
+<translation id="469338717132742108">Get help with Chromium OS</translation>
 <translation id="4743926867934016338">Accept &amp; Search</translation>
 <translation id="4888717733111232871">Inbound rule for Chromium to allow mDNS traffic.</translation>
 <translation id="4943838377383847465">Chromium is in background mode.</translation>
 <translation id="4987820182225656817">Guests can use Chromium without leaving anything behind.</translation>
 <translation id="4994636714258228724">Add yourself to Chromium</translation>
 <translation id="5032989939245619637">Save details in Chromium</translation>
+<translation id="5113946445248196174">Chromium cannot determine or set the default browser.</translation>
 <translation id="5116586539350239523">Chromium will securely store your personal details so that you don't need to type them in again.</translation>
+<translation id="5231355151045086930">Sign out of Chromium</translation>
 <translation id="5358375970380395591">You are signing in with a managed account and giving its administrator control over your Chromium profile. Your Chromium data, such as your apps, bookmarks, history, passwords and other settings will become permanently tied to <ph name="USER_NAME" />. You will be able to delete this data via the Google Accounts Dashboard, but you will not be able to associate this data with another account. <ph name="LEARN_MORE" /></translation>
 <translation id="5398878173008909840">There is a new version of Chromium available.</translation>
 <translation id="5427571867875391349">Set Chromium as your default browser</translation>
@@ -180,6 +188,7 @@
 <translation id="705851970750939768">Update Chromium</translation>
 <translation id="7064610482057367130">No installation of Chromium found to update.</translation>
 <translation id="7066436765290594559">Chromium OS could not sync your data. Please update your Sync passphrase.</translation>
+<translation id="707471633328071618">Google Payments (copied to Chromium)</translation>
 <translation id="7090955637699162649">Chromium may use <ph name="BEGIN_LINK" />web services<ph name="END_LINK" /> to improve your browsing experience. You may optionally disable these services at any time.</translation>
 <translation id="7114836556269756734">{NUM_ITEMS,plural, =1{This will permanently delete $1 item from this device. To retrieve your data later, sign in to Chromium as $2.}other{This will permanently delete $1 items from this device. To retrieve your data later, sign in to Chromium as $2.}}</translation>
 <translation id="7138853919861947730">Chromium may use web services to improve your browsing experience.</translation>
@@ -191,6 +200,7 @@
 <translation id="7223968959479464213">Task Manager - Chromium</translation>
 <translation id="722928257909516027">Show Chromium menu</translation>
 <translation id="731644333568559921">Update &amp;Chromium OS</translation>
+<translation id="731795002583552498">Updating Chromium</translation>
 <translation id="7318036098707714271">Your preferences file is corrupt or invalid.
 
 Google Chrome is unable to recover your settings.</translation>
@@ -220,6 +230,7 @@
 <translation id="7937630085815544518">You were signed in to Chromium as <ph name="USER_EMAIL_ADDRESS" />. Please use the same account to sign in again.</translation>
 <translation id="795025003224538582">Don't restart</translation>
 <translation id="7962572577636132072">Chromium updates automatically so you always have the freshest version.</translation>
+<translation id="7975919845073681630">This is a secondary installation of Chromium, and cannot be made your default browser.</translation>
 <translation id="7979877361127045932">Hide in Chromium menu</translation>
 <translation id="8030318113982266900">Updating your device to <ph name="CHANNEL_NAME" /> channel...</translation>
 <translation id="8033665941300843262">Chromium needs permissions access to share them with this site.</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb
index 0a1fce64..9ed065f 100644
--- a/chrome/app/resources/chromium_strings_ko.xtb
+++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -53,6 +53,7 @@
 <translation id="2558641060352364164">이 사이트에서 곧 지원이 중단되는 Chromium 프레임 플러그인을 사용하고 있습니다. 플러그인을 제거하고 최신 브라우저로 업그레이드하세요.</translation>
 <translation id="2572494885440352020">Chromium 도우미</translation>
 <translation id="2595977381794111014">이제 앱에 액세스하려면 Chromium 북마크바의 <ph name="APPS_ICON_IMAGE" /> 단축키를 사용하세요.</translation>
+<translation id="2605472041568654097">현재 설정을 보고하여 Chromium 개선에 참여</translation>
 <translation id="2636877269779209383">Chromium이 이 사이트와 카메라를 공유하려면 카메라 액세스가 필요합니다.</translation>
 <translation id="2648074677641340862">설치 중 운영체제 오류가 발생했습니다. Chromium을 다시 다운로드하세요.</translation>
 <translation id="2685838254101182273">Chromium에서 업데이트를 중단했으며 이 버전의 운영체제를 더 이상 지원하지 않습니다.</translation>
@@ -78,6 +79,7 @@
 
 <ph name="USER_DATA_DIRECTORY" /></translation>
 <translation id="328888136576916638">Google API 키가 누락되었습니다. Chromium의 일부 기능이 사용 중지됩니다.</translation>
+<translation id="3289635842886789612">Chromium이 이전 버전입니다.</translation>
 <translation id="3296368748942286671">Chromium 종료 후에도 백그라운드 앱을 계속 실행</translation>
 <translation id="3312805357485578561">Chromium에서 비정상적인 동작을 감지했습니다.</translation>
 <translation id="331951419404882060">로그인 중 오류가 발생하여 Chromium OS에서 데이터를 동기화하지 못했습니다.</translation>
@@ -96,14 +98,17 @@
 <translation id="3883381313049582448">Chromium에서 생성한 비밀번호 사용</translation>
 <translation id="3889543394854987837">Chromium을 열고 탐색을 시작하려면 내 이름을 클릭하세요.</translation>
 <translation id="390894725198123737">Mac에서는 비밀번호가 키체인에 저장되어 이 OS X 계정을 공유하는 다른 Chromium 사용자가 액세스하거나 동기화할 수 있습니다.</translation>
+<translation id="3994125055863078356">Chromium을 기본 브라우저로 설정할 수 없습니다.</translation>
 <translation id="4050175100176540509">최신 버전에는 중요한 보안 개선사항 및 새로운 기능이 포함되어 있습니다.</translation>
 <translation id="4077262827416206768">모든 Chromium 창을 닫은 뒤 다시 Chromium을 실행하면 변경 사항이 반영됩니다.</translation>
+<translation id="4182290826692170034">Chromium이 기본 브라우저입니다.</translation>
 <translation id="4207043877577553402"><ph name="BEGIN_BOLD" />경고:<ph name="END_BOLD" /> Chromium은 확장 프로그램이 인터넷 사용기록을 저장하지 못하도록 할 수 없습니다. 시크릿 모드에서 이 확장 프로그램을 사용 중지하려면 옵션을 선택 취소하세요.</translation>
 <translation id="421369550622382712">Chromium에 유용한 앱, 게임, 확장 프로그램, 테마를 찾아보세요.</translation>
 <translation id="4222580632002216401">Chromium에 로그인했습니다! 관리자가 동기화를 사용 중지했습니다.</translation>
 <translation id="4224199872375172890">Chromium이 최신 버전입니다.</translation>
 <translation id="4230135487732243613">Chromium 데이터를 이 계정에 연결하시겠습니까?</translation>
 <translation id="4246125976471362530">{SECONDS,plural, =1{1초 후에 Chromium이 다시 시작됩니다.}other{#초 후에 Chromium이 다시 시작됩니다.}}</translation>
+<translation id="4271805377592243930">Chromium 도움말 보기</translation>
 <translation id="4285930937574705105">확인되지 않은 오류로 설치에 실패했습니다. Chromium이 실행 중인 경우 종료한 후 다시 실행하세요.</translation>
 <translation id="4330585738697551178">이 모듈은 Chromium과 충돌하는 것으로 알려져 있습니다.</translation>
 <translation id="4423735387467980091">Chromium 맞춤설정 및 제어</translation>
@@ -114,13 +119,16 @@
 <translation id="459535195905078186">Chromium 앱</translation>
 <translation id="4621240073146040695">업데이트가 거의 완료되었습니다. 업데이트를 완료하려면 Chromium을 다시 시작하세요.</translation>
 <translation id="4677944499843243528">다른 컴퓨터(<ph name="HOST_NAME" />)의 다른 Chromium 프로세스(<ph name="PROCESS_ID" />)에서 프로필을 사용 중인 것 같습니다. 프로필이 손상되지 않도록 Chromium에서 잠금 설정했습니다. 다른 프로세스에서 프로필을 사용 중이지 않은 것이 확실한 경우 프로필을 잠금 해제하고 Chromium을 다시 시작하세요.</translation>
+<translation id="469338717132742108">Chromium OS 도움말 보기</translation>
 <translation id="4743926867934016338">동의 및 검색</translation>
 <translation id="4888717733111232871">Chromium이 mDNS 트래픽을 허용하는 인바운드 규칙입니다.</translation>
 <translation id="4943838377383847465">Chromium이 백그라운드 모드로 실행 중입니다.</translation>
 <translation id="4987820182225656817">손님으로 사용 기록을 남기지 않고 Chromium을 사용할 수 있습니다.</translation>
 <translation id="4994636714258228724">Chromium에 본인 추가</translation>
 <translation id="5032989939245619637">Chromium에 세부정보 저장</translation>
+<translation id="5113946445248196174">Chromium에서 기본 브라우저를 결정하거나 설정할 수 없습니다.</translation>
 <translation id="5116586539350239523">Chromium은 개인정보를 안전하게 저장하므로 정보를 다시 입력할 필요가 없습니다.</translation>
+<translation id="5231355151045086930">Chromium에서 로그아웃</translation>
 <translation id="5358375970380395591">관리 계정으로 로그인하고 Chromium 프로필에 대한 관리자 제어권을 부여하려고 합니다. 앱, 북마크, 방문 기록, 비밀번호 및 기타 설정 등 Chromium 데이터가 <ph name="USER_NAME" /> 계정에 영구적으로 연결됩니다. 이후 이 데이터를 Google 계정 대시보드에서 삭제할 수는 있지만 다른 계정에 연결할 수는 없습니다. <ph name="LEARN_MORE" /></translation>
 <translation id="5398878173008909840">Chromium의 새 버전이 출시되었습니다.</translation>
 <translation id="5427571867875391349">Chromium을 기본 브라우저로 설정</translation>
@@ -180,6 +188,7 @@
 <translation id="705851970750939768">Chromium 업데이트</translation>
 <translation id="7064610482057367130">업데이트할 Chromium 설치가 없습니다.</translation>
 <translation id="7066436765290594559">Chromium OS에서 데이터를 동기화하지 못했습니다. 동기화 암호를 업데이트하세요.</translation>
+<translation id="707471633328071618">Google Payments(Chromium에 복사됨)</translation>
 <translation id="7090955637699162649">Chromium은 브라우저 사용 환경을 개선하기 위해 <ph name="BEGIN_LINK" />웹 서비스<ph name="END_LINK" />를 이용할 수 있습니다. 원하는 경우 언제든지 서비스를 사용 중지하실 수 있습니다.</translation>
 <translation id="7114836556269756734">{NUM_ITEMS,plural, =1{이 기기에서 $1개 항목이 완전히 삭제됩니다. 나중에 데이터를 검색하려면 $2(으)로 Chromium에 로그인하세요.}other{이 기기에서 $1개 항목이 완전히 삭제됩니다. 나중에 데이터를 검색하려면 $2(으)로 Chromium에 로그인하세요.}}</translation>
 <translation id="7138853919861947730">Chromium은 사용자의 탐색 환경을 개선하기 위해 웹 서비스를 사용할 수 있습니다.</translation>
@@ -191,6 +200,7 @@
 <translation id="7223968959479464213">작업 관리자 - Chromium</translation>
 <translation id="722928257909516027">Chromium 메뉴 표시</translation>
 <translation id="731644333568559921">Chrome OS 업데이트</translation>
+<translation id="731795002583552498">Chromium 업데이트 중</translation>
 <translation id="7318036098707714271">환경설정 파일이 손상되었거나 잘못되었습니다.
 
 Chromium에서 설정을 복구할 수 없습니다.</translation>
@@ -220,6 +230,7 @@
 <translation id="7937630085815544518"><ph name="USER_EMAIL_ADDRESS" />(으)로 Chromium에 로그인되어 있습니다. 같은 계정으로 다시 로그인해 주세요.</translation>
 <translation id="795025003224538582">다시 시작 안함</translation>
 <translation id="7962572577636132072">Chromium은 자동으로 업데이트되므로 항상 최신 버전을 사용할 수 있습니다.</translation>
+<translation id="7975919845073681630">Chromium의 보조 설치이며 기본 브라우저로 설정할 수 없습니다.</translation>
 <translation id="7979877361127045932">Chromium 메뉴에서 숨기기</translation>
 <translation id="8030318113982266900">기기를 <ph name="CHANNEL_NAME" /> 채널로 업데이트하는 중...</translation>
 <translation id="8033665941300843262">Chromium이 이 사이트와 권한을 공유하려면 권한 액세스가 필요합니다.</translation>
diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb
index 65cbe986..aeb1fc3 100644
--- a/chrome/app/resources/chromium_strings_ms.xtb
+++ b/chrome/app/resources/chromium_strings_ms.xtb
@@ -51,6 +51,7 @@
 <translation id="2558641060352364164">Tapak ini menggunakan pemalam Chromium Frame yang tidak akan disokong tidak lama lagi. Sila nyahpasangnya dan naik taraf kepada penyemak imbas moden.</translation>
 <translation id="2572494885440352020">Pembantu Chromium</translation>
 <translation id="2595977381794111014">Gunakan pintasan <ph name="APPS_ICON_IMAGE" /> dalam bar penanda halaman Chromium untuk terus mengakses apl anda.</translation>
+<translation id="2605472041568654097">Bantu jadikan Chromium lebih baik dengan melaporkan tetapan semasa.</translation>
 <translation id="2636877269779209383">Chromium memerlukan akses kamera untuk mengongsinya dengan tapak ini.</translation>
 <translation id="2648074677641340862">Ralat sistem pengendalian berlaku semasa pemasangan. Sila muat turun Chromium semula.</translation>
 <translation id="2685838254101182273">Chromium telah berhenti mengemas kini dan tidak lagi menyokong versi sistem pengendalian anda ini.</translation>
@@ -76,6 +77,7 @@
 
 <ph name="USER_DATA_DIRECTORY" /></translation>
 <translation id="328888136576916638">Kunci API Google tiada. Sesetengah fungsi Chromium akan dilumpuhkan.</translation>
+<translation id="3289635842886789612">Chromium sudah usang.</translation>
 <translation id="3296368748942286671">Terus menjalankan apl latar belakang apabila Chromium ditutup</translation>
 <translation id="3312805357485578561">Chromium telah mengesan gelagat yang luar biasa</translation>
 <translation id="331951419404882060">OS Chromium tidak dapat menyegerakkan data anda disebabkan oleh ralat melog masuk.</translation>
@@ -94,14 +96,17 @@
 <translation id="3883381313049582448">Gunakan kata laluan yang dijana oleh Chromium</translation>
 <translation id="3889543394854987837">Klik nama anda untuk membuka Chromium dan mula menyemak imbas.</translation>
 <translation id="390894725198123737">Pada Mac, kata laluan boleh disimpan pada Keychain anda dan boleh diakses atau disegerakkan oleh pengguna Chromium lain yang berkongsi akaun OS X ini.</translation>
+<translation id="3994125055863078356">Chromium tidak dapat dijadikan penyemak imbas lalai.</translation>
 <translation id="4050175100176540509">Peningkatan keselamatan penting dan ciri baharu tersedia dalam versi terkini.</translation>
 <translation id="4077262827416206768">Sila tutup semua tetingkap Chromium dan lancarkan semula Chromium agar perubahan ini boleh dilaksanakan.</translation>
+<translation id="4182290826692170034">Chromium ialah penyemak imbas lalai anda. Yei!</translation>
 <translation id="4207043877577553402"><ph name="BEGIN_BOLD" />Amaran:<ph name="END_BOLD" /> Chromium tidak dapat menghalang sambungan daripada merakamkan sejarah penyemakan imbas anda. Untuk melumpuhkan sambungan ini dalam mod inkognito, nyahpilih pilihan ini.</translation>
 <translation id="421369550622382712">Temui apl, permainan, sambungan dan tema yang hebat untuk Chromium.</translation>
 <translation id="4222580632002216401">Anda kini sedang log masuk ke Chromium! Penyegerakan dilumpuhkan oleh pentadbir anda.</translation>
 <translation id="4224199872375172890">Chromium telah dikemas kini</translation>
 <translation id="4230135487732243613">Paut data Chromium anda ke akaun ini?</translation>
 <translation id="4246125976471362530">{SECONDS,plural, =1{Chromium akan dimulakan semula dalam 1 saat.}other{Chromium akan dimulakan semula dalam # saat.}}</translation>
+<translation id="4271805377592243930">Dapatkan bantuan dengan Chromium</translation>
 <translation id="4285930937574705105">Pemasangan gagal disebabkan ralat yang tidak dinyatakan. Jika Chromium sedang dijalankan, sila tutup dan cuba semula.</translation>
 <translation id="4330585738697551178">Modul ini diketahui bercanggah dengan Chromium.</translation>
 <translation id="4423735387467980091">Sesuaikan dan kawal Chromium</translation>
@@ -112,13 +117,16 @@
 <translation id="459535195905078186">Apl Chromium</translation>
 <translation id="4621240073146040695">Hampir terkini! Lancarkan semula Chromium untuk menyelesaikan kemas kini.</translation>
 <translation id="4677944499843243528">Nampaknya profil digunakan oleh proses Chromium lain (<ph name="PROCESS_ID" />) pada komputer lain (<ph name="HOST_NAME" />). Chromium telah mengunci profil supaya profil tidak rosak. Jika anda pasti tiada proses lain yang menggunakan profil ini, anda boleh membuka profil dan melancarkan semula Chromium.</translation>
+<translation id="469338717132742108">Dapatkan bantuan dengan Chromium OS</translation>
 <translation id="4743926867934016338">Terima &amp; Cari</translation>
 <translation id="4888717733111232871">Peraturan masuk bagi Chromium untuk membolehkan trafik mDNS.</translation>
 <translation id="4943838377383847465">Chromium dalam mod latar belakang.</translation>
 <translation id="4987820182225656817">Tetamu boleh menggunakan Chromium tanpa meninggalkan apa-apa.</translation>
 <translation id="4994636714258228724">Tambahkan diri anda kepada Chromium</translation>
 <translation id="5032989939245619637">Simpan butiran di Chromium</translation>
+<translation id="5113946445248196174">Chromium tidak dapat menentukan atau menetapkan penyemak imbas lalai.</translation>
 <translation id="5116586539350239523">Chromium akan menyimpan butiran peribadi anda dengan selamat supaya anda tidak perlu menaipnya semula.</translation>
+<translation id="5231355151045086930">Log keluar daripada Chromium</translation>
 <translation id="5358375970380395591">Anda log masuk menggunakan akaun yang terurus dan memberikan pentadbirnya kawalan ke atas profil Chromium anda. Data Chromium anda, seperti apl, penanda halaman, sejarah, kata laluan dan tetapan anda yang lain akan terikat kepada <ph name="USER_NAME" /> secara kekal. Anda akan dapat memadamkan data ini melalui Papan Pemuka Akaun Google, tetapi anda tidak akan dapat mengaitkan data ini dengan akaun lain. <ph name="LEARN_MORE" /></translation>
 <translation id="5398878173008909840">Terdapat versi baharu Chromium tersedia.</translation>
 <translation id="5427571867875391349">Tetapkan Chromium sebagai penyemak imbas lalai anda</translation>
@@ -178,6 +186,7 @@
 <translation id="705851970750939768">Kemas kini Chromium</translation>
 <translation id="7064610482057367130">Pemasangan Chromium tidak ditemui untuk dikemas kini.</translation>
 <translation id="7066436765290594559">OS Chromium tidak dapat menyegerakkan data anda. Sila kemas kini frasa laluan Segerak anda.</translation>
+<translation id="707471633328071618">Google Payments (disalin ke Chromium)</translation>
 <translation id="7090955637699162649">Chromium mungkin menggunakan <ph name="BEGIN_LINK" />perkhidmatan web<ph name="END_LINK" /> untuk meningkatkan pengalaman penyemakan imbas anda. Anda boleh memilih untuk melumpuhkan perkhidmatan ini pada bila-bila masa.</translation>
 <translation id="7114836556269756734">{NUM_ITEMS,plural, =1{Tindakan ini akan memadamkan $1 item daripada peranti ini selama-lamanya. Untuk mendapatkan semula data anda kemudian, log masuk ke Chromium sebagai $2.}other{Tindakan ini akan memadamkan $1 item daripada peranti ini selama-lamanya. Untuk mendapatkan semula data anda kemudian, log masuk ke Chromium sebagai $2.}}</translation>
 <translation id="7138853919861947730">Chromium boleh menggunakan perkhidmatan web untuk meningkatkan pengalaman penyemakan imbas anda.</translation>
@@ -189,6 +198,7 @@
 <translation id="7223968959479464213">Pengurus Tugas - Chromium</translation>
 <translation id="722928257909516027">Paparkan menu Chromium</translation>
 <translation id="731644333568559921">Kemas kini &amp;Chromium OS</translation>
+<translation id="731795002583552498">Mengemas kini Chromium</translation>
 <translation id="7318036098707714271">Fail pilihan anda rosak atau tidak sah.
 
 Chromium tidak dapat mengembalikan tetapan anda.</translation>
@@ -218,6 +228,7 @@
 <translation id="7937630085815544518">Anda telah log masuk ke Chromium sebagai <ph name="USER_EMAIL_ADDRESS" />. Sila gunakan akaun yang sama untuk log masuk lagi.</translation>
 <translation id="795025003224538582">Jangan mulakan semula</translation>
 <translation id="7962572577636132072">Chromium dikemas kini secara automatik supaya anda sentiasa mempunyai versi yang terbaharu.</translation>
+<translation id="7975919845073681630">Ini adalah pemasangan kedua Chromium dan tidak boleh dijadikan penyemak imbas lalai anda.</translation>
 <translation id="7979877361127045932">Sembunyikan dalam menu Chromium</translation>
 <translation id="8030318113982266900">Mengemas kini peranti anda kepada saluran <ph name="CHANNEL_NAME" />...</translation>
 <translation id="8033665941300843262">Chromium memerlukan akses kebenaran untuk mengongsinya dengan tapak ini.</translation>
diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb
index 6b0fa99..355184b4 100644
--- a/chrome/app/resources/chromium_strings_sv.xtb
+++ b/chrome/app/resources/chromium_strings_sv.xtb
@@ -53,6 +53,7 @@
 <translation id="2558641060352364164">På den här webbplatsen används pluginprogrammet Chromium Frame som snart slutar stödjas. Avinstallera det och uppgradera till en modern webbläsare.</translation>
 <translation id="2572494885440352020">Hjälp för Chromium</translation>
 <translation id="2595977381794111014">Använd genvägen <ph name="APPS_ICON_IMAGE" /> i bokmärkesfältet i Chromium om du fortfarande vill ha tillgång till apparna.</translation>
+<translation id="2605472041568654097">Hjälp oss att förbättra Chromium genom att rapportera dina aktuella inställningar.</translation>
 <translation id="2636877269779209383">Chromium behöver tillgång till kameran för att kunna dela den på den här webbplatsen.</translation>
 <translation id="2648074677641340862">Ett operativsystemsfel inträffade under installationen. Ladda ned Chromium igen.</translation>
 <translation id="2685838254101182273">Chromium uppdateras inte längre och har inte längre stöd för den här versionen av ditt operativsystem.</translation>
@@ -78,6 +79,7 @@
 
 <ph name="USER_DATA_DIRECTORY" /></translation>
 <translation id="328888136576916638">Googles API-nycklar saknas. Vissa funktioner i Google Chromium kommer att vara inaktiverade.</translation>
+<translation id="3289635842886789612">Den här versionen av Chromium är inaktuell.</translation>
 <translation id="3296368748942286671">Fortsätt köra bakgrundsappar när Chromium avslutas</translation>
 <translation id="3312805357485578561">Chromium har upptäckt ovanligt beteende</translation>
 <translation id="331951419404882060">Det gick inte att synkronisera data med Chromium OS på grund av ett inloggningsfel.</translation>
@@ -96,14 +98,17 @@
 <translation id="3883381313049582448">Använd lösenordet som genererats av Chromium</translation>
 <translation id="3889543394854987837">Öppna Chromium genom att klicka på ditt namn och börja surfa.</translation>
 <translation id="390894725198123737">På Mac kan lösenord sparas på nyckelringen. Andra Chromium-användare som använder det här OS X-kontot kan komma åt lösenorden och synkronisera dem.</translation>
+<translation id="3994125055863078356">Det gick inte att ange Chromium som standardwebbläsare.</translation>
 <translation id="4050175100176540509">Den senaste versionen har viktiga säkerhetsförbättringar och nya funktioner.</translation>
 <translation id="4077262827416206768">Du måste stänga alla Chromium-fönster och starta om Chromium för att ändringen ska börja gälla.</translation>
+<translation id="4182290826692170034">Chromium är din standardwebbläsare.</translation>
 <translation id="4207043877577553402"><ph name="BEGIN_BOLD" />Varning!<ph name="END_BOLD" /> Chromium kan inte förhindra att tillägg registrerar din webbhistorik. Om du vill inaktivera det här tillägget i inkognitoläge avmarkerar du detta alternativ.</translation>
 <translation id="421369550622382712">Upptäck fantastiska appar, spel, tillägg och teman för Chromium.</translation>
 <translation id="4222580632002216401">Nu är du inloggad på Chromium. Synkronisering har inaktiverats av administratören.</translation>
 <translation id="4224199872375172890">Chromium är uppdaterat.</translation>
 <translation id="4230135487732243613">Vill du koppla dina uppgifter i Chromium till det här kontot?</translation>
 <translation id="4246125976471362530">{SECONDS,plural, =1{Chromium startas om om 1 sekund.}other{Chromium startas om om # sekunder.}}</translation>
+<translation id="4271805377592243930">Få hjälp med Chromium</translation>
 <translation id="4285930937574705105">Installationen misslyckades på grund av ett ospecificerat fel. Stäng Chromium om det är igång och försök sedan igen.</translation>
 <translation id="4330585738697551178">Den här modulen har tidigare varit i konflikt med Chromium.</translation>
 <translation id="4423735387467980091">Anpassa och kontrollera Chromium</translation>
@@ -114,13 +119,16 @@
 <translation id="459535195905078186">Chromium-appar</translation>
 <translation id="4621240073146040695">Nästan klart! Slutför uppdateringen genom att starta om Chromium.</translation>
 <translation id="4677944499843243528">Profilen verkar användas av en annan Chromium-process (<ph name="PROCESS_ID" />) på en annan dator (<ph name="HOST_NAME" />). Profilen har låsts så att den inte används på otillåtet sätt. Om du är säker på att profilen inte används i några andra processer låser du upp profilen och startar om Chromium.</translation>
+<translation id="469338717132742108">Få hjälp med Chromium OS</translation>
 <translation id="4743926867934016338">Acceptera och sök</translation>
 <translation id="4888717733111232871">Regel som tillåter inkommande mDNS-trafik för Chromium.</translation>
 <translation id="4943838377383847465">Chromium körs i bakgrundsläge.</translation>
 <translation id="4987820182225656817">Gäster kan använda Chromium utan att lämna spår efter sig.</translation>
 <translation id="4994636714258228724">Lägg till dig själv i Chromium</translation>
 <translation id="5032989939245619637">Spara information i Chromium</translation>
+<translation id="5113946445248196174">Chromium kan inte fastställa eller ange standardwebbläsaren.</translation>
 <translation id="5116586539350239523">Chromium sparar dina personliga uppgifter på ett säkert sätt så att du inte behöver ange dem på nytt.</translation>
+<translation id="5231355151045086930">Logga ut från Chromium</translation>
 <translation id="5358375970380395591">Du loggar in med ett hanterat konto och ger dess administratör kontroll över din Chromium-profil. Dina uppgifter i Chromium, t.ex. dina appar, bokmärken, din historik, ditt lösenord och andra inställningar, kopplas då permanent till <ph name="USER_NAME" />. Du kommer att kunna ta bort dessa uppgifter via instrumentpanelen i Google Konton, men du kommer inte att kunna koppla dem till något annat konto. <ph name="LEARN_MORE" /></translation>
 <translation id="5398878173008909840">Det finns en ny version av Chromium.</translation>
 <translation id="5427571867875391349">Använd Chromium som standardwebbläsare</translation>
@@ -180,6 +188,7 @@
 <translation id="705851970750939768">Uppdatera Chromium</translation>
 <translation id="7064610482057367130">Det finns ingen installation av Chromium att uppdatera.</translation>
 <translation id="7066436765290594559">Det gick inte att synkronisera data med Chromium. Uppdatera lösenfrasen för synkronisering.</translation>
+<translation id="707471633328071618">Google Payments (har kopierats till Chromium)</translation>
 <translation id="7090955637699162649"><ph name="BEGIN_LINK" />Webbtjänster<ph name="END_LINK" /> kan användas i Chromium för att förbättra din upplevelse när du surfar. Om du vill kan du inaktivera sådana tjänster.</translation>
 <translation id="7114836556269756734">{NUM_ITEMS,plural, =1{Det här innebär att minst $1 objekt raderas permanent från enheten. Logga in i Chromium som $2 om du vill kunna återställa data senare.}other{Det här innebär att minst $1 objekt raderas permanent från enheten. Logga in i Chromium som $2 om du vill kunna återställa data senare.}}</translation>
 <translation id="7138853919861947730">Chromium kan använda webbtjänster för att förbättra din upplevelse när du surfar.</translation>
@@ -191,6 +200,7 @@
 <translation id="7223968959479464213">Aktivitetshanteraren – Chromium</translation>
 <translation id="722928257909516027">Visa Chromium-menyn</translation>
 <translation id="731644333568559921">Uppdatera &amp;Chromium OS</translation>
+<translation id="731795002583552498">Chromium uppdateras</translation>
 <translation id="7318036098707714271">Inställningsfilen är skadad eller ogiltig.
 
 Chromium kan inte återställa dina inställningar.</translation>
@@ -220,6 +230,7 @@
 <translation id="7937630085815544518">Du var inloggad i Chromium som <ph name="USER_EMAIL_ADDRESS" />. Använd samma konto när du loggar in igen.</translation>
 <translation id="795025003224538582">Starta inte om</translation>
 <translation id="7962572577636132072">Chromium uppdateras automatiskt så att du alltid har den senaste versionen.</translation>
+<translation id="7975919845073681630">Det här är en sekundär installation av Chromium. Det går inte att göra den till standardwebbläsare.</translation>
 <translation id="7979877361127045932">Dölj i Chromium-menyn</translation>
 <translation id="8030318113982266900">Uppdaterar din enhet till kanalen <ph name="CHANNEL_NAME" /> ...</translation>
 <translation id="8033665941300843262">Chromium behöver tillgång till behörigheter för att kunna dela dem på den här webbplatsen.</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb
index 24a315f1f2..37d57ab 100644
--- a/chrome/app/resources/chromium_strings_sw.xtb
+++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -53,6 +53,7 @@
 <translation id="2558641060352364164">Tovuti hii inatumia programu-jalizi ya Fremu ya Chromium ambayo haitaweza kutumika hivi karibuni. Tafadhali iondoe na upate toleo jipya la kivinjari cha kisasa.</translation>
 <translation id="2572494885440352020">Kisaidizi cha Chromium</translation>
 <translation id="2595977381794111014">Tumia njia ya mkato ya <ph name="APPS_ICON_IMAGE" /> katika sehemu ya alamisho za Chromium ili uendelee kufikia programu zako.</translation>
+<translation id="2605472041568654097">Saidia kuboresha Chromium kwa kuripoti kuhusu mipangilio ya sasa.</translation>
 <translation id="2636877269779209383">Chromium inahitaji idhini ya kufikia kamera ili iishiriki na tovuti hii.</translation>
 <translation id="2648074677641340862">Hitilafu ya mfumo wa uendeshaji imetokea wakati wa usakinishaji. Tafadhali pakua Chromium tena.</translation>
 <translation id="2685838254101182273">Chromium imekoma kusasisha na haiwezi kutumiwa tena na toleo hili la mfumo wako wa uendeshaji.</translation>
@@ -78,6 +79,7 @@
 
 <ph name="USER_DATA_DIRECTORY" /></translation>
 <translation id="328888136576916638">Funguo za Google API zinakosekana. Utendaji fulani wa Chromium utazimwa.</translation>
+<translation id="3289635842886789612">Muda wa matumizi ya Chromium umekwisha.</translation>
 <translation id="3296368748942286671">Endelea kuendesha programu za mandharinyuma wakati Chromium imefungwa</translation>
 <translation id="3312805357485578561">Chromium imegundua tabia isiyo ya kawaida</translation>
 <translation id="331951419404882060">Mfumo wa Uendeshaji wa Chromium haukuweza kusawazisha data yako kutokana na hitilafu wakati wa kuingia katika akaunti.</translation>
@@ -96,14 +98,17 @@
 <translation id="3883381313049582448">Tumia nenosiri lililozalishwa na Chromium</translation>
 <translation id="3889543394854987837">Bofya jina lako ili ufungue Chromium na uanze kuvinjari.</translation>
 <translation id="390894725198123737">Kwenye Mac, manenosiri yanaweza kuhifadhiwa kwenye Msururu wako wa kitufe na yanaweza kufikiwa au kusawazishwa na watumiaji wengine wa Chromium wanaoshiriki akaunti hii ya OS X.</translation>
+<translation id="3994125055863078356">Chromium haikuwekwa kuwa kivinjari chaguo-msingi.</translation>
 <translation id="4050175100176540509">Maboresho muhimu ya usalama na vipengele vipya vinapatikana katika toleo jipya.</translation>
 <translation id="4077262827416206768">Tafadhali funga madirisha yote ya Chromium na uizindue upya Chromium ili mabadiliko haya yaanze kufanya kazi.</translation>
+<translation id="4182290826692170034">Chromium ndiyo kivinjari chako chaguo-msingi. Hongera!</translation>
 <translation id="4207043877577553402"><ph name="BEGIN_BOLD" />Ilani:<ph name="END_BOLD" /> Chromium haiwezi kuzuia viendelezi kurekodi historia yako ya kuvinjari. Ili kuzima kiendelezi hiki katika hali fiche, ondoa tiki kwenye chaguo hili.</translation>
 <translation id="421369550622382712">Gundua programu, michezo, viendelezi na mandhari bora ya Chromium.</translation>
 <translation id="4222580632002216401">Sasa umeingia kwenye Chromium! Usawazishaji umezimwa na msimamizi wako.</translation>
 <translation id="4224199872375172890">Chromium imesasishwa.</translation>
 <translation id="4230135487732243613">Ungependa kuunganisha data yako ya Chromium kwenye akaunti hii?</translation>
 <translation id="4246125976471362530">{SECONDS,plural, =1{Chromium itazimika na kuwaka tena baada ya sekunde 1.}other{Chromium itazimika na kuwaka tena baada ya sekunde #.}}</translation>
+<translation id="4271805377592243930">Pata usaidizi wa kutumia Chromium</translation>
 <translation id="4285930937574705105">Usanidi umeshindwa kwa sababu ya hitilafu isiyojulikana. Ikiwa Chromium inaendesha sasa, tafadhali ifunge na ujaribu tena.</translation>
 <translation id="4330585738697551178">Kijenzi hiki kinajulikana kwa kuwa na ukinzani na Chromium.</translation>
 <translation id="4423735387467980091">Dhibiti na ugeuze Chromium ikufae</translation>
@@ -114,13 +119,16 @@
 <translation id="459535195905078186">Programu za Chromium</translation>
 <translation id="4621240073146040695">Inakaribia kukamilisha kusasishwa! Anzisha Chromium upya ili ukamilishe kusasisha.</translation>
 <translation id="4677944499843243528">Wasifu unaonekana kuwa unatumika na mchakato mwingine wa Chromium (<ph name="PROCESS_ID" />) kwenye kompyuta nyingine (<ph name="HOST_NAME" />). Chromium imefunga wasifu huu ili usifisidiwe. Kama una uhakika hakuna michakato mingine inatumia wasifu huu, unaweza kufungua wasifu na uzindue tena Chromium.</translation>
+<translation id="469338717132742108">Pata usaidizi wa kutumia mfumo wa uendeshaji wa Chromium</translation>
 <translation id="4743926867934016338">Kubali na Utafute</translation>
 <translation id="4888717733111232871">Sheria ya ndani ya Chromium ili kuruhusu trafiki ya mDNS.</translation>
 <translation id="4943838377383847465">Chromium iko katika hali ya chini chini.</translation>
 <translation id="4987820182225656817">Walioalikwa wanaweza kutumia Chromium bila kuacha kitu chochote nyuma.</translation>
 <translation id="4994636714258228724">Jiongeze kwenye Chrome</translation>
 <translation id="5032989939245619637">Hifadhi maelezo katika Chromium</translation>
+<translation id="5113946445248196174">Chromium haijafaulu kubainisha wala kuweka kivinjari chaguo-msingi.</translation>
 <translation id="5116586539350239523">Chromium itahifadhi salama maelezo yako ya kibinafsi ili usihitaji kuyaandika tena.</translation>
+<translation id="5231355151045086930">Ondoka kwenye Chromium</translation>
 <translation id="5358375970380395591">Unaingia katika akaunti inayodhibitiwa na kumpa msimamizi wa akaunti hiyo udhibiti wa wasifu wako kwenye Chromium. Data yako ya Chromium, kama vile programu zako, alamisho, historia, manenosiri, na mipangilio miingine itahusishwa na <ph name="USER_NAME" /> kabisa. Utaweza kufuta data hii kupitia Dashibodi ya Akaunti za Google, lakini hutaweza  kuunganisha data hii na akaunti nyingine. <ph name="LEARN_MORE" /></translation>
 <translation id="5398878173008909840">Kuna toleo jipya la Chromium linalopatikana.</translation>
 <translation id="5427571867875391349">Weka Chromium kuwa kivinjari chako chaguo-msingi</translation>
@@ -180,6 +188,7 @@
 <translation id="705851970750939768">Sasisha Chromium</translation>
 <translation id="7064610482057367130">Hakuna usakinishi wa Chromium uliopatikana kusasishwa.</translation>
 <translation id="7066436765290594559">Mfumo wa Uendeshaji wa Chromium haukuweza kusawazisha data yako. Tafadhali sasisha kauli ya siri unayotumia kusawazisha.</translation>
+<translation id="707471633328071618">Google Payments (imenakiliwa kwenye Chromium)</translation>
 <translation id="7090955637699162649">Chromium inaweza kutumia <ph name="BEGIN_LINK" />huduma za wavuti<ph name="END_LINK" /> kuimarisha hali yako ya kuvinjari. Unaweza kuzima huduma hizi kwa hiari wakati wowote.</translation>
 <translation id="7114836556269756734">{NUM_ITEMS,plural, =1{Hatua hii itafuta kabisa kipengee $1 kwenye kifaa hiki. Ili urejeshe data yako baadaye, ingia katika Chromium ukitumia $2.}other{Hii itafuta kabisa vipengee $1 kwenye kifaa hiki. Ili urejeshe data yako baadaye, ingia katika Chromium ukitumia $2.}}</translation>
 <translation id="7138853919861947730">Huenda Chromium ikatumia huduma za wavuti kuboresha utumizi wako wa kuvinjari.</translation>
@@ -191,6 +200,7 @@
 <translation id="7223968959479464213">Kidhibiti cha Shughuli - Chromium</translation>
 <translation id="722928257909516027">Onyesha menyu ya Chromium</translation>
 <translation id="731644333568559921">Sasisha Chromium OS</translation>
+<translation id="731795002583552498">Inasasisha Chromium</translation>
 <translation id="7318036098707714271">Faili yako ya mapendeleo imeharibika au ni batili. 
 
 Chromium haiwezi kufufua mipangilio yako.</translation>
@@ -219,6 +229,7 @@
 <translation id="7937630085815544518">Uliingia kwenye Chromium kama <ph name="USER_EMAIL_ADDRESS" />. Tafadhali tumia akaunti hiyo hiyo kuingia tena.</translation>
 <translation id="795025003224538582">Usianzishe upya</translation>
 <translation id="7962572577636132072">Chromium husasisha kiotomatiki, kwa hivyo, utakuwa na toleo jipya zaidi wakati wowote.</translation>
+<translation id="7975919845073681630">Huu ni usakinishaji wa pili wa Chromium, na haiwezi kufanywa kuwa kivinjari chako chaguo-msingi.</translation>
 <translation id="7979877361127045932">Ficha katika menyu ya Chromium</translation>
 <translation id="8030318113982266900">Inasasisha kituo chako kwenda kituo cha <ph name="CHANNEL_NAME" />...</translation>
 <translation id="8033665941300843262">Chromium inahitaji idhini ya kufikia ruhusa ili izishiriki na tovuti hii.</translation>
diff --git a/chrome/app/resources/chromium_strings_vi.xtb b/chrome/app/resources/chromium_strings_vi.xtb
index 9215490..b08b1db 100644
--- a/chrome/app/resources/chromium_strings_vi.xtb
+++ b/chrome/app/resources/chromium_strings_vi.xtb
@@ -51,6 +51,7 @@
 <translation id="2558641060352364164">Trang web này đang sử dụng plugin Chromium Frame sắp không còn được hỗ trợ. Vui lòng gỡ cài đặt plugin này và nâng cấp lên một trình duyệt hiện đại.</translation>
 <translation id="2572494885440352020">Trình trợ giúp của Chromium</translation>
 <translation id="2595977381794111014">Hãy sử dụng lối tắt <ph name="APPS_ICON_IMAGE" /> trong thanh dấu trang Chromium để tiếp tục truy cập các ứng dụng của bạn.</translation>
+<translation id="2605472041568654097">Giúp cải thiện Chromium bằng cách báo cáo cài đặt hiện tại.</translation>
 <translation id="2636877269779209383">Chromium cần quyền truy cập vào máy ảnh để chia sẻ máy ảnh với trang web này.</translation>
 <translation id="2648074677641340862">Đã xảy ra lỗi hệ điều hành khi cài đặt. Hãy tải xuống Chromium lại lần nữa.</translation>
 <translation id="2685838254101182273">Chromium đã ngừng cập nhật và không còn hỗ trợ phiên bản hệ điều hành này của bạn.</translation>
@@ -76,6 +77,7 @@
 
 <ph name="USER_DATA_DIRECTORY" /></translation>
 <translation id="328888136576916638">Khóa API của Google bị thiếu. Một số chức năng của Chromium sẽ bị tắt.</translation>
+<translation id="3289635842886789612">Chromium đã lỗi thời.</translation>
 <translation id="3296368748942286671">Tiếp tục chạy các ứng dụng dưới nền khi Chromium bị đóng</translation>
 <translation id="3312805357485578561">Chromium đã phát hiện hành vi bất thường</translation>
 <translation id="331951419404882060">Chromium OS không thể đồng bộ hóa dữ liệu của bạn do lỗi khi đăng nhập.</translation>
@@ -94,14 +96,17 @@
 <translation id="3883381313049582448">Sử dụng mật khẩu do Chromium tạo</translation>
 <translation id="3889543394854987837">Nhấp vào tên của bạn để mở Chromium và bắt đầu duyệt web.</translation>
 <translation id="390894725198123737">Trên máy Mac, mật khẩu có thể được lưu vào Keychain và được truy cập hoặc đồng bộ hóa bởi những người dùng Chromium khác dùng chung tài khoản OS X này.</translation>
+<translation id="3994125055863078356">Chromium không thể trở thành trình duyệt mặc định.</translation>
 <translation id="4050175100176540509">Cải thiện bảo mật quan trọng và tính năng mới có trong phiên bản mới nhất.</translation>
 <translation id="4077262827416206768">Hãy đóng tất cả cửa sổ Chromium và chạy lại Chromium để thay đổi này có hiệu lực.</translation>
+<translation id="4182290826692170034">Chromium là trình duyệt mặc định của bạn. Tuyệt vời!</translation>
 <translation id="4207043877577553402"><ph name="BEGIN_BOLD" />Cảnh báo:<ph name="END_BOLD" /> Chromium không thể ngăn các tiện ích ghi lại lịch sử duyệt web của bạn. Để tắt tiện ích này trong chế độ ẩn danh, hãy bỏ chọn tùy chọn này.</translation>
 <translation id="421369550622382712">Khám phá các ứng dụng, trò chơi, tiện ích và chủ đề tuyệt vời cho Chromium.</translation>
 <translation id="4222580632002216401">Bạn hiện đã đăng nhập vào Chromium! Quản trị viên của bạn đã tắt tính năng Đồng bộ hóa.</translation>
 <translation id="4224199872375172890">Chromium đã được cập nhật.</translation>
 <translation id="4230135487732243613">Bạn muốn liên kết dữ liệu Chromium của bạn với tài khoản này?</translation>
 <translation id="4246125976471362530">{SECONDS,plural, =1{Chromium sẽ khởi động lại sau 1 giây.}other{Chromium sẽ khởi động lại sau # giây.}}</translation>
+<translation id="4271805377592243930">Nhận trợ giúp về Chromium</translation>
 <translation id="4285930937574705105">Không thể cài đặt do lỗi chưa xác định. Nếu Chromium hiện đang chạy, hãy đóng Chromium và thử lại.</translation>
 <translation id="4330585738697551178">Mô-đun này được xác định xung đột với Chromium.</translation>
 <translation id="4423735387467980091">Tùy chỉnh và điều khiển Chromium</translation>
@@ -112,13 +117,16 @@
 <translation id="459535195905078186">Ứng dụng Chromium</translation>
 <translation id="4621240073146040695">Gần được cập nhật! Hãy khởi chạy lại Chromium để hoàn tất cập nhật.</translation>
 <translation id="4677944499843243528">Dường như cấu hình này đang được quy trình Chromium khác (<ph name="PROCESS_ID" />) trên máy tính khác (<ph name="HOST_NAME" />) sử dụng. Chromium đã khóa cấu hình này để cấu hình không bị lỗi. Nếu bạn chắc chắn không có quy trình nào khác đang sử dụng cấu hình này, bạn có thể mở khóa cấu hình và chạy lại Chromium.</translation>
+<translation id="469338717132742108">Nhận trợ giúp về Chromium OS</translation>
 <translation id="4743926867934016338">Chấp nhận và tìm kiếm</translation>
 <translation id="4888717733111232871">Quy tắc kết nối để Chromium cho phép lưu lượng truy cập mDNS.</translation>
 <translation id="4943838377383847465">Chromium đang chạy trong nền.</translation>
 <translation id="4987820182225656817">Khách có thể sử dụng Chromium mà không phải thoát khỏi bất cứ nội dung nào.</translation>
 <translation id="4994636714258228724">Thêm chính bạn vào Chromium</translation>
 <translation id="5032989939245619637">Lưu chi tiết trong Chromium</translation>
+<translation id="5113946445248196174">Chromium không thể xác định hoặc đặt trình duyệt mặc định.</translation>
 <translation id="5116586539350239523">Chromium sẽ lưu trữ an toàn chi tiết cá nhân của bạn nên bạn không cần nhập lại thông tin này.</translation>
+<translation id="5231355151045086930">Đăng xuất khỏi Chromium</translation>
 <translation id="5358375970380395591">Bạn đang đăng nhập bằng tài khoản được quản lý và cấp cho quản trị viên của tài khoản quyền kiểm soát cấu hình Chromium của bạn. Dữ liệu Chromium của bạn, chẳng hạn như ứng dụng, dấu trang, lịch sử, mật khẩu và các cài đặt khác sẽ vĩnh viễn được liên kết với <ph name="USER_NAME" />. Bạn có thể xóa dữ liệu này thông qua Trang tổng quan của tài khoản Google nhưng không thể liên kết dữ liệu này với tài khoản khác. <ph name="LEARN_MORE" /></translation>
 <translation id="5398878173008909840">Hiện đã có phiên bản Chromium mới.</translation>
 <translation id="5427571867875391349">Đặt Chromium là trình duyệt mặc định của bạn</translation>
@@ -178,6 +186,7 @@
 <translation id="705851970750939768">Cập nhật Chromium</translation>
 <translation id="7064610482057367130">Không tìm thấy bản cài đặt Chromium cần cập nhật.</translation>
 <translation id="7066436765290594559">Chromium OS không thể đồng bộ hóa dữ liệu của bạn. Vui lòng cập nhật cụm mật khẩu Đồng bộ hóa của bạn.</translation>
+<translation id="707471633328071618">Google Payments (đã sao chép vào Chromium)</translation>
 <translation id="7090955637699162649">Chromium có thể sử dụng <ph name="BEGIN_LINK" />các dịch vụ web<ph name="END_LINK" /> để cải thiện trải nghiệm duyệt web của bạn. Bạn có thể tắt các dịch vụ này bất cứ lúc nào, nếu muốn.</translation>
 <translation id="7114836556269756734">{NUM_ITEMS,plural, =1{Thao tác này sẽ xóa vĩnh viễn $1 mục khỏi thiết bị này. Để truy xuất dữ liệu của bạn sau, hãy đăng nhập vào Chromium dưới dạng $2.}other{Thao tác này sẽ xóa vĩnh viễn $1 mục khỏi thiết bị này. Để truy xuất dữ liệu của bạn sau, hãy đăng nhập vào Chromium dưới dạng $2.}}</translation>
 <translation id="7138853919861947730">Chromium có thể sử dụng các dịch vụ web để cải thiện trải nghiệm duyệt web của bạn.</translation>
@@ -189,6 +198,7 @@
 <translation id="7223968959479464213">Trình quản lý tác vụ - Chromium</translation>
 <translation id="722928257909516027">Hiển thị menu Chromium</translation>
 <translation id="731644333568559921">Cập nhật &amp;Chromium OS</translation>
+<translation id="731795002583552498">Đang cập nhật Chromium</translation>
 <translation id="7318036098707714271">Tệp tùy chọn của bạn bị hỏng hoặc không hợp lệ. 
 
 Chromium không thể khôi phục cài đặt của bạn.</translation>
@@ -218,6 +228,7 @@
 <translation id="7937630085815544518">Bạn đã đăng nhập vào Chromium là <ph name="USER_EMAIL_ADDRESS" />. Vui lòng sử dụng cùng tài khoản để đăng nhập lại.</translation>
 <translation id="795025003224538582">Không khởi động lại</translation>
 <translation id="7962572577636132072">Chromium tự động cập nhật nên bạn luôn có phiên bản mới nhất.</translation>
+<translation id="7975919845073681630">Đây là cài đặt thứ cấp của Chromium và không thể trở thành trình duyệt mặc định của bạn.</translation>
 <translation id="7979877361127045932">Ẩn trong menu Chromium</translation>
 <translation id="8030318113982266900">Đang cập nhật thiết bị tới kênh <ph name="CHANNEL_NAME" />...</translation>
 <translation id="8033665941300843262">Chromium cần quyền truy cập vào các quyền để chia sẻ chúng với trang web này.</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 39f01c1..38fb848 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -34,6 +34,7 @@
 <translation id="1047431265488717055">የአገናኝ ጽሑፍ &amp;ቅዳ</translation>
 <translation id="1047726139967079566">ለእዚህ ገጽ ዕልባት አዘጋጅ…</translation>
 <translation id="1047956942837015229"><ph name="COUNT" /> ንጥሎችን በመሰረዝ ላይ...</translation>
+<translation id="1048286738600630630">ማሳያዎች</translation>
 <translation id="1048597748939794622">ለሁሉም ንብርብሮች በግዳጅ የነቃ</translation>
 <translation id="1049795001945932310">የ&amp;ቋንቋ ቅንብሮች...</translation>
 <translation id="1049926623896334335">የWord ሰነድ</translation>
@@ -98,6 +99,7 @@
 <translation id="1125520545229165057">ድቮራክ (ህሱ)</translation>
 <translation id="1128109161498068552">ማናቸውንም ጣቢያዎች ለሚመለከተው ስርዓት የተወሰኑ መልዕክቶችን MIDI መሳሪያዎችን ለመድረስ እንዲጠቀሙ አይፍቀዱ።</translation>
 <translation id="1128128132059598906">EAP-TTLS</translation>
+<translation id="1128591060186966949">የፍለጋ ፕሮግራምን ያርትዑ</translation>
 <translation id="1128987120443782698">የማከማቻ መሣሪያው <ph name="DEVICE_CAPACITY" /> መጠን አለው። እባክዎ ቢያንስ 4 ጊባ መጠን ያለው የSD ካርድ ወይም የUSB ማህደረ ትውስታ መሰኪያ ያስገቡ።</translation>
 <translation id="1132956125173653312">በእርስዎ Chromebook ላይ የAndroid መተግበሪያዎችን ያንቁ።</translation>
 <translation id="1137135726305341424">domContentLoaded እና ሁሉም የግብዓቶች ጭነቶች ከdomContentLoaded በፊት ጀምረዋል (ዋና ክፈፍ እና ተመሳሳይ ምንጭ ያላቸው iframes)።</translation>
@@ -107,6 +109,7 @@
 <translation id="1145292499998999162">ተሰኪ ታግዷል</translation>
 <translation id="1146204723345436916">ዕልባቶችን ከኤችቲኤምኤል ፋይል አስመጣ...</translation>
 <translation id="1148624853678088576">ተዘጋጅተዋል!</translation>
+<translation id="1149401351239820326">ጊዜው የሚያልፍበት ወር</translation>
 <translation id="1151972924205500581">የይለፍ ቃል ያስፈልጋል</translation>
 <translation id="1154228249304313899">ይህን ገጽ ክፈት፦</translation>
 <translation id="115443833402798225">ሃንጉል አንማቴ</translation>
@@ -118,6 +121,7 @@
 <translation id="1162223735669141505">ይህን ባህሪ ለመጠቀም <ph name="BEGIN_LINK" />ቤተኛ የደንበኛ ተሰኪ<ph name="END_LINK" /> መንቃት አለበት።</translation>
 <translation id="1163361280229063150">{NUM_DOWNLOAD,plural, =1{አንድ ማውረድ አሁን በሂደት ላይ ነው። ማውረዱን መተው እና ከማይታወቅ ሁነታ መውጣት ይፈልጋሉ?}one{# ማውረዶች አሁን በሂደት ላይ ናቸው። ማውረዶቹን መተው እና ከማይታወቅ ሁነታ መውጣት ይፈልጋሉ?}other{# ማውረዶች አሁን በሂደት ላይ ናቸው። ማውረዶቹን መተው እና ከማይታወቅ ሁነታ መውጣት ይፈልጋሉ?}}</translation>
 <translation id="1163931534039071049">የፍሬም መነሻ &amp;አሳይ</translation>
+<translation id="1164674268730883318">Smart Lock ለ<ph name="DEVICE_TYPE" /> ያጥፉ?</translation>
 <translation id="1165039591588034296">ስህተት</translation>
 <translation id="1166212789817575481">በቀኝ በኩል ያሉ ትሮችን ዝጋ</translation>
 <translation id="1166359541137214543">ABC</translation>
@@ -135,6 +139,7 @@
 <translation id="1181037720776840403">አስወግድ</translation>
 <translation id="1183083053288481515">በአስተዳዳሪ የቀረበ የእውቅና ማረጋገጫን በመጠቀም ላይ</translation>
 <translation id="1183237619868651138"><ph name="EXTERNAL_CRX_FILE" />ን በአካባቢያዊ መሸጎጫ ላይ መጫን አልተቻለም።</translation>
+<translation id="1183917921992319637">ፒን አዋቅር</translation>
 <translation id="1185924365081634987">እንዲሁም ይህን የአውታረ መረብ ስህተት ለማስተካከል <ph name="GUEST_SIGNIN_LINK_START" />እንደ እንግዳ ሆነው ለማሰስ<ph name="GUEST_SIGNIN_LINK_END" /> መሞከርም ይችላሉ።</translation>
 <translation id="1187722533808055681">ከመቦዘን ማንቂያዎች</translation>
 <translation id="1188807932851744811">የምዝግብ ማስታወሻ አልተዘመነም።</translation>
@@ -200,6 +205,7 @@
 <translation id="1277908057200820621">የመሣሪያ ዝርዝርን ይመልከቱ</translation>
 <translation id="1278049586634282054">እይታዎችን ይመርምሩ፦</translation>
 <translation id="1278813325885878377">የሃንጋሪኛ Qwerty ቁልፍ ሰሌዳ</translation>
+<translation id="1284355409890639046">የብሉቱዝ መሣሪያን ያጣምሩ</translation>
 <translation id="1285320974508926690">ይህን ጣቢያ በጭራሽ አትተርጉም</translation>
 <translation id="1285484354230578868">ውሂብ በእርስዎ Google Drive መለያ ላይ ያከማቹ</translation>
 <translation id="1290223615328246825">በራስ-መግባት አልተሳካም</translation>
@@ -304,6 +310,8 @@
 <translation id="1429740407920618615">የምልክት ጥንካሬ፦</translation>
 <translation id="143027896309062157">በጎበኟቸው ድር ጣቢያዎች ላይ ያለው ሁሉም ውሂብዎን ያነብባል እና ይቀይራል</translation>
 <translation id="1430915738399379752">አትም</translation>
+<translation id="1432581352905426595">የፍለጋ ፕሮግራሞችን ያቀናብሩ</translation>
+<translation id="1433811987160647649">ከመድረስ በፊት ጠይቅ</translation>
 <translation id="1434696352799406980">ይህ የእርስዎን የመነሻ ገጽ፣ አዲስ የትር ገጽ፣ የፍለጋ ፕሮግራምን እና የተሰኩ ትሮችን ዳግም ያቀናብራቸዋል። እንዲሁም ሁሉንም ቅጥያዎች ያሰናክላል እና እንደ ኩኪዎች ያለ ጊዜያዊ ውሂብን ያጸዳል። የእርስዎ ዕልባቶች፣ ታሪክ እና የተቀመጡ የይለፍ ቃላት አይጸዱም።</translation>
 <translation id="1434886155212424586">መነሻ ገጽ አዲሱ የትር ገጽ ነው</translation>
 <translation id="1435550882135542937">የቅጥያ መሣሪያ አሞሌ ዳግም ንድፍ</translation>
@@ -339,6 +347,7 @@
 <translation id="14720830734893704">የምናባዊ የቁልፍ ሰሌዳ ድጋፍን አንቃ።</translation>
 <translation id="1474079335130556426">ለPush ኤፒአይ የበስተጀርባ ሁነታን ያንቁ። ይህ Chrome የመጨረሻው መስኮት ከተዘጋ በኋላ መሥራቱን እንዲቀጥል እና Push ኤፒአይ ካስፈልገው በOS ጅምር ላይ እንዲያስጀምር ያስችለዋል።</translation>
 <translation id="1474339897586437869">«<ph name="FILENAME" />» አልተሰቀለም። በእርስዎ Google Drive ውስጥ በቂ የሆነ ነፃ ቦታ የለም።</translation>
+<translation id="1475502736924165259">ከሌሎች ማንኛቸውም መደቦች ጋር የማይገጣጠሙ የእውቅና ማረጋገጫዎች በፋይል ላይ አለዎት</translation>
 <translation id="1476607407192946488">የ&amp;ቋንቋ ቅንብሮች...</translation>
 <translation id="1476949146811612304">ከ<ph name="BEGIN_LINK" />ኦምኒቦክሱ<ph name="END_LINK" /> ሲፈለግ የትኛው የፍለጋ ፕሮግራም ስራ ላይ እንደሚውል ያዘጋጃል።</translation>
 <translation id="1477301030751268706">የመታወቂያ ኤ ፒ አይ ማስመሰያ መሸጎጫ</translation>
@@ -375,6 +384,7 @@
         ከሆኑ <ph name="LINK_START" />የተኪ ቅንብሮችዎን<ph name="LINK_END" /> ያስተካክሉ።</translation>
 <translation id="1510907582379248592">ለ<ph name="ORIGIN" /> የተቀመጡ የይለፍ ቃሎች፦</translation>
 <translation id="1511004689539562549">ጣቢያዎች የካሜራዎ መዳረሻ አይፍቀዱላቸው</translation>
+<translation id="1511388193702657997">የድር ይለፍ ቃላትዎን ለማስቀመጥ ጠይቅ</translation>
 <translation id="1511623662787566703">እንደ <ph name="USER_EMAIL_ADDRESS" /> ሆነው ገብተዋል። ማመሳሰል በGoogle ዳሽቦርዱ በኩል እንዲቆም ተደርጓል።</translation>
 <translation id="1514215615641002767">ወደ ዴስክቶፕ አክል</translation>
 <translation id="1514298457297359873">መተግበሪያዎች NaCl ሶኬት ኤ ፒ አይን እንዲጠቀሙ ያስችላል። የNaCl ተሰኪዎችን ለመሞከር ብቻ ይጠቀሙ።</translation>
@@ -386,6 +396,7 @@
 <translation id="1520505881707245707">ይህ ጥቆማ በአንጻፊው ላይ ያሉ ከድር ሱቁ የመጡ የቅጥያዎች ፋይሎች ውስጥ ያሉት ይዘቶች እንዲሆኑ ከሚጠበቁት ነገር ጋር የሚዛመዱ የመሆናቸው ማረጋገጫን ለማብራት ስራ ላይ መዋል ይችላል። ይሄ የማይበራ የሚሆን ባህሪን ለማብራት ሊያገለግል ይችላል፣ ነገር ግን እሱን ለማጥፋት ስራ ላይ መዋል አይችልም (ምክንያቱም ይህ ቅንብር በተንኮል-አዘል ዌር አላግባብ ሊነካካ ስለሚችል)።</translation>
 <translation id="1520635877184409083">አስተካክል...</translation>
 <translation id="1521442365706402292">ሰርተፊኬቶችን አቀናብር</translation>
+<translation id="152234381334907219">በጭራሽ አልተቀመጠም</translation>
 <translation id="1523350272063152305">Chromebox ለስብሰባዎች መሣሪያ ለመዋቀር ዝግጁ ነው።</translation>
 <translation id="1524152555482653726">ፊልም</translation>
 <translation id="1525835343380843286">የአገልጋይ ግንኙነት ስህተት</translation>
@@ -395,6 +406,7 @@
 <translation id="1529968269513889022">ያለፈው ሳምንት</translation>
 <translation id="1531004739673299060">የመተግበሪያ መስኮት</translation>
 <translation id="1531865825384516080">የSafeSearch ዩአርኤሎች ሪፖርት ማድረግ።</translation>
+<translation id="1532687502998799885">ፒን ቢያንስ 4 አሃዞች መሆን አለበት፦</translation>
 <translation id="1532697124104874386">የምናባዊ ቁልፍ ሰሌዳ ዘመናዊ ማሰማራትን አንቃ/አሰናክል።</translation>
 <translation id="1533897085022183721">ከ<ph name="MINUTES" /> በታች።</translation>
 <translation id="1533920822694388968">የቲቪ አሰላለፍ</translation>
@@ -423,6 +435,7 @@
 <translation id="1558988940633416251">የመሣሪያ ስርዓት ተሻጋሪውን የHarfBuzz አቀማመጥ ፕሮግራም ለበይነገጽ ያንቁ። በድር ይዘት ላይ ተጽዕኖ የለውም።</translation>
 <translation id="1559235587769913376">የዩኒኮድ ቁምፊዎችን ያስገባል</translation>
 <translation id="1561092721008294962">HarfBuzz ለዩአይ ጽሑፍ</translation>
+<translation id="1566049601598938765">ድር ጣቢያ</translation>
 <translation id="1566958206723629112">ፍላሽ እና ፒዲኤፍ</translation>
 <translation id="1567723158593978621">በሚነቃበት ጊዜ ወደ አሳሹ መግባት አዲስ የgaia በይለፍ ቃል የተለያየ መግባት ፍሰትን ይጠቀማል።</translation>
 <translation id="1567993339577891801">ጃቫስክሪፕት ኮንሶል</translation>
@@ -480,6 +493,7 @@
 <translation id="1645228020260124617"><ph name="PRECENTAGE" />%</translation>
 <translation id="1645870377513700713">ቤተኛ ማሳወቂያዎችን አንቃ።</translation>
 <translation id="1646136617204068573">የሃንጋሪኛ ሰሌዳ ቁልፍ</translation>
+<translation id="1646982517418478057">ይህን የዕውቅና ማረጋገጫ ፋይል ለማመስጠር እባክዎ የይለፍ ቃል ያስገቡ</translation>
 <translation id="164729547906544836">የታሚል ቁልፍ ሰሌዳ (itrans)</translation>
 <translation id="164814987133974965">በቁጥጥር ስር ያለ ተጠቃሚ እርስዎ እየመሩት ድርን ማሰስ ይችላል። በቁጥጥር ስር ያለ ተጠቃሚ አስተዳዳሪ እንደመሆንዎ፣ የሚከተሉትን ማድረግ ይችላሉ
 የተወሰኑ ድር ጣቢያዎችን <ph name="BEGIN_BOLD" />መፍቃድ ወይም መከልከል<ph name="END_BOLD" />፣
@@ -507,6 +521,7 @@
 <translation id="1673103856845176271">ይህ ፋይል በደህንነት ምክንያቶች ሊደረስበት አልተቻለም።</translation>
 <translation id="1675023460278456180">የቁሳዊ ድቅል</translation>
 <translation id="167832068858235403">ድምጽ ቀንስ</translation>
+<translation id="1678331212993975953">የጣቢያ ዝርዝሮች</translation>
 <translation id="1679068421605151609">የአዘጋጅ መሳሪያዎች</translation>
 <translation id="1681120471812444678">አታሚዎችን ለማከል ያዋቅሩ…</translation>
 <translation id="1682324559341535203"><ph name="DEVICE_TYPE" />ን አስመዝግብ</translation>
@@ -528,11 +543,13 @@
 <translation id="1699395855685456105">የሃርድዌር ክለሳ፦</translation>
 <translation id="1700199471143028312">የእርስዎ አስተዳዳሪ ክትትል የሚደረግባቸው ተጠቃሚዎችን እንዲፈጥሩ አይፈቅዱልዎትም።</translation>
 <translation id="1701062906490865540">ይህን ሰው አስወግድ</translation>
+<translation id="1702294042233267824">ከኦምኒቦክሱ ሲፈልጉ ጥቅም ላይ የሚውለው የፍለጋ ፕሮግራም</translation>
 <translation id="1702534956030472451">ምዕራባውያን</translation>
 <translation id="1707463636381878959">ይህን አውታረ መረብ ለሌሎች ተጠቃሚዎች ያጋሩ</translation>
 <translation id="1708199901407471282">በአዲስ የትር ገጽ የተጠቆመ ድረ-ገጽ በሚከፈቱበት ጊዜ አንድ ትር አስቀድሞ ለተጠቆመው የተከፈተ ከሆነ ጥቆማውን በአዲስ ትር ከመክፈት ይልቅ ወደዚያ ይቀይሩት።</translation>
 <translation id="1708338024780164500">(የቦዘነ)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (መታወቂያ፦ <ph name="ID_PH" />)</translation>
+<translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (ቤተኛ)</translation>
 <translation id="1711973684025117106">መጭመቅ አልተሳካም፣ ያልተጠበቀ ስህተት፦ $1</translation>
 <translation id="1715941336038158809">የተሳሳተ የተጠቃሚ ስም ወይም የይለፍ ቃል።</translation>
 <translation id="1717733954209022288">የGoogle ክፍያዎች ካርድ ቁጠባ አመልካች ሳጥን</translation>
@@ -627,6 +644,7 @@
 <translation id="1852799913675865625">ይህን ፋይል ለማንበብ በመሞከር ላይ ሳለ ስህተት ነበር፦ <ph name="ERROR_TEXT" />።</translation>
 <translation id="1856715684130786728">አካባቢ አክል...</translation>
 <translation id="1857166538520940818">ፋይል አያይዝ፦</translation>
+<translation id="1858585891038687145">የሶፍትዌር ሠሪዎችን ለመለየት ይህን የዕውቅና ማረጋገጫ እመን</translation>
 <translation id="1859234291848436338">የአፃፃፍ አቅጣጫ</translation>
 <translation id="1864111464094315414">ግባ</translation>
 <translation id="1864676585353837027">እነዚህ ፋይሎች እንዴት እንደሚጋሩ ይቀይሩ</translation>
@@ -658,6 +676,7 @@
 <translation id="1909880997794698664">እርግጠኛ ነዎት ይህን መሣሪያ በኪዮስክ ሁነታ እስከመጨረሻው ማቆየት ይፈልጋሉ?</translation>
 <translation id="1910572251697014317">Google ወደዚህ መሣሪያ ማሳወቂያ ልኳል። ከብሉቱዝ ጋር የእርስዎ ስልክ የእርስዎን <ph name="DEVICE_TYPE" /> ሳይቆለፍ ከ100 ጫማ ርቀት በላይ ሊያቆየው እንደሚችል ልብ ይበሉ። ይህ ችግር ሊሆንባቸው በሚችሉ አጋጣሚዎች፣ &lt;a&gt;በጊዜያዊነት ይህን ባህሪ ማሰናከል&lt;/a&gt; ይችላሉ።</translation>
 <translation id="1910721550319506122">እንኳን ደህና መጡ!</translation>
+<translation id="1911073860190924580">ብቸኛ የይለፍ ቃል</translation>
 <translation id="1916502483199172559">ነባሪ ቀይ አምሳያ</translation>
 <translation id="191688485499383649">ከ«<ph name="DEVICE_NAME" />» ጋር ለመገናኘት በመሞከር ላይ ሳለ ያልታወቀ የስህተት አይነት ተፈጥሯል።</translation>
 <translation id="1918141783557917887">&amp;አሳንስ</translation>
@@ -719,6 +738,8 @@
 <translation id="2007404777272201486">ችግር ሪፖርት አድርግ...</translation>
 <translation id="2011110593081822050">የድር ሰራተኛ፦ <ph name="WORKER_NAME" /></translation>
 <translation id="2012766523151663935">የጽኑ ትዕዛዝ ክለሳ፦</translation>
+<translation id="2013984794184160106">15</translation>
+<translation id="2016430552235416146">ተለምዷዊ</translation>
 <translation id="2017052954220678795">ተከታታይ የጂፒዩ ራስተር ሥራ</translation>
 <translation id="2017334798163366053">የአፈጻጸም የውሂብ መሰብሰብን አሰናክል</translation>
 <translation id="2018352199541442911">ይቅርታ፣ ውጫዊ ማከማቻዎ በዚህ ጊዜ አይደገፍም።</translation>
@@ -735,6 +756,7 @@
 <translation id="204497730941176055">Microsoft Certificate Template Name</translation>
 <translation id="2045969484888636535">ኩኪዎች ማገዱን ይቀጥሉ</translation>
 <translation id="204622017488417136">የእርስዎ መሣሪያ ወደ ቀደም ሲል ተጭኖ የነበረው የChrome ስሪት እንዲመለስ ይደረጋል። ሁሉም የተጠቃሚ መለያዎች እና የአካባቢ ውሂብ ይወገዳሉ። ይህ አንዴ ከተደረገ በኋላ ሊቀለበስ አይችልም።</translation>
+<translation id="2047962517134476164">ለመቀጠል መግቢያዎን ያረጋግጡ</translation>
 <translation id="2048182445208425546">የእርስዎን የአውታረ መረብ ትራፊክ ይድረስበት</translation>
 <translation id="2049137146490122801">ማሽንዎ ላይ የአካባቢያዊ ፋይሎች መዳረሻ በአስተዳዳሪዎ ተሰናክሏል።</translation>
 <translation id="204914487372604757">አቋራጭ ፍጠር</translation>
@@ -820,10 +842,13 @@
 <translation id="2155931291251286316">ሁልጊዜ ከ<ph name="HOST" /> ላይ የሚመጡ ብቅ-ባዮችን ፍቀድ</translation>
 <translation id="215753907730220065">ከሙሉ ገጽ ዕይታ ውጣ</translation>
 <translation id="2157875535253991059">ይህ ገጽ አሁን ሙሉ ማያ ገጽ ነው።</translation>
+<translation id="2161553589239083578">የእርስዎ ፒን ያረጋግጡ፦</translation>
 <translation id="216169395504480358">Wi-Fi ያክሉ...</translation>
 <translation id="2163470535490402084">ወደ የእርስዎ <ph name="DEVICE_TYPE" /> ለመግባት እባክዎ ከበይነመረብ ጋር ይገናኙ።</translation>
 <translation id="2164862903024139959">የቪዬትናምኛ ቁልፍ ሰሌዳ (ቲሲቪኤን)</translation>
 <translation id="2165453356262207111">Smart Lock (ቅድመ-ይሁንታ)</translation>
+<translation id="2166369534954157698">The quick brown fox jumps over the lazy dog
+ፈጣኑ ቀበሮ በሰነፉ ውሻ ላይ ዘልሎ አልፏል</translation>
 <translation id="2167276631610992935">JavaScript</translation>
 <translation id="2168214441502403371">የፋርስ ቁልፍ ሰሌዳ</translation>
 <translation id="2168725742002792683">የፋይል ቅጥያዎች</translation>
@@ -840,6 +865,7 @@
 <translation id="2190355936436201913">(ባዶ)</translation>
 <translation id="2190469909648452501">ቀንስ</translation>
 <translation id="2192505247865591433">ከ፦</translation>
+<translation id="2193365732679659387">የእምነት ቅንብሮች</translation>
 <translation id="2195729137168608510">የኢሜይል መከላከያ</translation>
 <translation id="2198315389084035571">ቀላል ቻይንኛ</translation>
 <translation id="2199829153606285995">በምናባዊ ቁልፍ ሰሌዳ ላይ የድምጽ ግብዓት</translation>
@@ -857,9 +883,11 @@
 <translation id="2213819743710253654">የገጽ ተግባር</translation>
 <translation id="2215277870964745766">እንኳን በደህና መጡ! ቋንቋዎን እና አውታረ መረብዎን ያዋቅሩ</translation>
 <translation id="2217501013957346740">አንድ ስም ይፍጠሩ -</translation>
+<translation id="2218019600945559112">መዳፊት እና መዳሰሻ</translation>
 <translation id="2218515861914035131">እንደ ስነጣ አልባ ጽሑፍ ለጥፍ</translation>
 <translation id="2218947405056773815">ኧረ ወዲያ! <ph name="API_NAME" /> ያልተጠበቀ ችግር ገጠመው።</translation>
 <translation id="2220529011494928058">ችግር ሪፖርት አድርግ</translation>
+<translation id="2220572644011485463">ፒን ወይም የይለፍ ቃል</translation>
 <translation id="2221240591176106785">የማያረጋግጥ ዳግም መጫንን አንቃ</translation>
 <translation id="2222641695352322289">መቀልበስ የሚቻልበት ብቸኛው መንገድ <ph name="IDS_SHORT_PRODUCT_OS_NAME" />ን ዳግም መጫን ነው።</translation>
 <translation id="2224444042887712269">ይህ ቅንብር የ<ph name="OWNER_EMAIL" /> ነው።</translation>
@@ -903,6 +931,7 @@
 <translation id="2258195278080713720">የቅርብ ጊዜዎቹ የረጉ የጃቫስክሪፕት ባህሪያት</translation>
 <translation id="2260567344816042527">ከሌላ አውታረ መረብ ጋር ካልተገናኙ Google Chrome የተንቀሳቃሽ ስልክ ውሂብን ይጠቀማል።</translation>
 <translation id="2260654768907572711">የአሳሽ ተሰኪ</translation>
+<translation id="2262477216570151239">ከመድገም በፊት አዘግይ</translation>
 <translation id="226269835214688456">Smart Lockን ለChrome ካጠፉ ስልክዎን ተጠቅመው የChrome መሣሪያዎችዎን ማስከፈት አይችሉም። የይለፍ ቃልዎን መተየብ ይኖርብዎታል።</translation>
 <translation id="2262903407161221567">የተወሰኑ የበይነገጽ ክፍሎች የንክኪ በይነግንኙነቶች ሲኖሩ ምስላዊ ግብረመልስ ያሳያሉ።</translation>
 <translation id="2263497240924215535">(የተሰናከለ)</translation>
@@ -916,6 +945,7 @@
 <translation id="2273562597641264981">ከዋኝ፦</translation>
 <translation id="2275694568175246751">ከቀኝ-ወደ-ግራ</translation>
 <translation id="2276503375879033601">ተጨማሪ መተግበሪያዎችን ያክሉ</translation>
+<translation id="2277255602909579701">ሁሉም ኩኪዎች እና የጣቢያ ውሂብ</translation>
 <translation id="2278098630001018905">የተለየ የመላኪያ አድራሻ ተጠቀም</translation>
 <translation id="2278562042389100163">የአሳሻ መስኮት ክፈት</translation>
 <translation id="2278988676849463018">የካናዳ ቁልፍ ሰሌዳ (ፎነቲክ)</translation>
@@ -956,6 +986,7 @@
 <translation id="2339120501444485379">አዲስ ስም ያስገቡ</translation>
 <translation id="2339641773402824483">የተሻሻሉ ነገሮች ካሉ በመፈተሽ ላይ ነው...</translation>
 <translation id="2342060820861917889">ረጅም (2000 ሚሴ)</translation>
+<translation id="2342282706041269970">ዘግተው ወጥተው እና ተመልሰው ለመግባት ይሞክሩ።</translation>
 <translation id="23434688402327542">የካዛክ ቁልፍሰሌዳ</translation>
 <translation id="2344028582131185878">የራስ ሰር ማውረዶች</translation>
 <translation id="2344262275956902282">የእጩ ዝርዝር ላይ ገጽ ለመፍጠር - እና = ይጠቀሙ</translation>
@@ -1070,6 +1101,7 @@
 <translation id="2494837236724268445">የጉጃራቲ ቁልፍ ሰሌዳ (ፎነቲክ)</translation>
 <translation id="2496180316473517155">ታሪክ አሰሳ</translation>
 <translation id="2496540304887968742">መሣሪያው 4 ጊባ ወይም ከዚያ በላይ ቦታ ሊኖረው ይገባል።</translation>
+<translation id="2497229222757901769">የመዳፊት ፍጥነት</translation>
 <translation id="249819058197909513">ለዚህ መተግበሪያ ዳግም አታስጠንቅቅ</translation>
 <translation id="2498436043474441766">አታሚዎችን ያክሉ</translation>
 <translation id="2498539833203011245">አሳንስ</translation>
@@ -1144,6 +1176,7 @@
 <translation id="2587203970400270934">የከዋኝ ኮድ፦</translation>
 <translation id="2587922270115112871">ክትትል የሚደረግበት ተጠቃሚ መፍጠር የGoogle መለያ አይፈጥርም፣ እና ቅንብሮቻቸው 
      እና ውሂባቸው በChrome አመሳስል በኩል እነሱን ተከትለው ወደ ሌላ መሣሪያ አይሄዱም። ክትትል የሚደረግበት ተጠቃሚ በዚህ መሳሪያ ላይ ብቻ ነው የሚሰራው።</translation>
+<translation id="25912682830130293">ሪፖርት የተደረጉ ቅንብሮችን ይመልከቱ</translation>
 <translation id="2594049137847833442">አስፈላጊ የጣቢያዎች አማራጮች በግልጽ አሰሳ ውሂብ መገናኛ ውስጥ</translation>
 <translation id="2594056015203442344">ሲነቃ በትር ቅንጥቡ ላይ ያሉ የተሰሚ አመልካቾች እንደ የትር ተሰሚ ድምጸ-ከል መቆጣጠሪያዎች ሆነው ደርበው ይሰራሉ። ይሄ እንዲሁም በርካታ በተመረጡ ትሮች ላይ ድምጸ-ከል ለማድረግ በትር አውድ ምናሌው ላይ ትዕዛዞችን ያክላል።</translation>
 <translation id="259421303766146093">አታጉላ</translation>
@@ -1196,6 +1229,7 @@
 <translation id="2665394472441560184">አዲስ ቃል ያክሉ</translation>
 <translation id="2665717534925640469">ይህ ገጽ አሁን ሙሉ ማያ ገጽ ነው፣ እናም የመዳፊትዎ ጠቋሚን አሰናክሎታል።</translation>
 <translation id="2665919335226618153">ኧረ ቴች! ቅርጸት በሚሰራለት ጊዜ የሆነ ስህተት ነበር።</translation>
+<translation id="2667463864537187133">ፊደል አራሚን ያቀናብሩ</translation>
 <translation id="2668079306436607263">የአልፎ-ማሸብለል ታሪክ አሰሳ</translation>
 <translation id="2670102641511624474"><ph name="APP_NAME" /> የChrome ትር እያጋራ ነው።</translation>
 <translation id="2670965183549957348">የChewing ግቤት ስልት</translation>
@@ -1218,7 +1252,9 @@
 <translation id="2694026874607847549">1 ኩኪ</translation>
 <translation id="2696862700756109583">የሙሉ ማያ ገጽ የማይመለከታቸው</translation>
 <translation id="2702540957532124911">የቁልፍ ሰሌዳ፦</translation>
+<translation id="2704142793323512908">በተጨማሪም ነባር ውሂብዎን ከዚህ መሣሪያ ላይ ያስወግዱ።</translation>
 <translation id="2704184184447774363">Microsoft Document Signing</translation>
+<translation id="270516211545221798">የመዳሰሻ ሰሌዳ ፍጥነት</translation>
 <translation id="2706892089432507937">USB መሣሪያዎች</translation>
 <translation id="2707024448553392710">ክፍለ አካል በማውረድ ላይ</translation>
 <translation id="270921614578699633">የዚህ አማካኝ፦</translation>
@@ -1397,6 +1433,7 @@
 <translation id="2902734494705624966">የአሜሪካ ተቀጥሎ</translation>
 <translation id="2903493209154104877">አድራሻዎች</translation>
 <translation id="290444763029043472"><ph name="DOWNLOADED_AMOUNT_MB" /> ሜባ / <ph name="TOTAL_AMOUNT_MB" /> ሜባ ወርዷል</translation>
+<translation id="2904456025988372123">አንድ ጣቢያ ከመጀመሪያው ፋይል በኋላ በራስ-ሰር ፋይሎችን ለማውረድ ሲሞክር ጠይቅ</translation>
 <translation id="2907619724991574506">ጀማሪ ዩ አር ኤሎች</translation>
 <translation id="2908162660801918428">የሚዲያ ማዕከለ ስዕላት በአቃፊ ያክሉ</translation>
 <translation id="2908789530129661844">ማያ ገጹን አሳንስ</translation>
@@ -1443,6 +1480,7 @@
 <translation id="2963151496262057773">የሚከተለው ተሰኪ ምላሽ አይሰጥም፦ <ph name="PLUGIN_NAME" />ሊያቆሙት ይፈልጋሉ?</translation>
 <translation id="2963783323012015985">የቱርክኛ ሰሌዳ ቁልፍ</translation>
 <translation id="2964193600955408481">Wi-Fiን አሰናክል</translation>
+<translation id="2964313852984024865">አርትዕ</translation>
 <translation id="2966459079597787514">የስዊድንኛ ቁልፍ ሰሌዳ</translation>
 <translation id="2966598748518102999">የ«Ok Google»ን ድምጽ በመላክ እና ትንሽ ቀደም ብሎ ለGoogle በመላክ የድምጽ ፍለጋን ያሻሽሉ።</translation>
 <translation id="2967544384642772068">ግደል</translation>
@@ -1591,6 +1629,7 @@
 <translation id="3150927491400159470">ከባድ ዳግም መጫን</translation>
 <translation id="315116470104423982">የተንቀሳቃሽ ስልክ ውሂብ</translation>
 <translation id="315141861755603168">«<ph name="BUNDLE_NAME" />» እነዚህን መተግበሪያዎች ያክላል፦</translation>
+<translation id="3151786313568798007">አቀማመጥ</translation>
 <translation id="3153177132960373163">ሁሉም ጣቢያዎች ኮምፒውተርዎን ለመድረስ አንድ ተሰኪ እንዲጠቀሙ ይፍቀዱ</translation>
 <translation id="3154429428035006212">ከአንድ ወር በላይ ከመስመር ውጪ</translation>
 <translation id="3157931365184549694">እነበረበት መልስ</translation>
@@ -1647,6 +1686,7 @@
 <translation id="3234666976984236645">ሁልጊዜ በዚህ ጣቢያ ላይ ያለ አስፈላጊ ይዘትን አግኝ</translation>
 <translation id="3236997602556743698">3 ሴት (390)</translation>
 <translation id="3237784613213365159"><ph name="NEW_PROFILE_NAME" /> አሁን ክትትል የሚደረግባቸው ተጠቃሚ ናቸው</translation>
+<translation id="323803881985677942">የቅጥያ አማራጮችን ይክፈቱ</translation>
 <translation id="324056286105023296"><ph name="PROFILE_NAME" /> አይደሉም?</translation>
 <translation id="3241680850019875542">ለመሸከፍ የቅጥያውን ስርወ ማውጫ ይምረጡ። ቅጥያውን ለማዘመን እንዲሁ የግል ቁልፍ ፋይልን እንደገና ለመጠቀም ይምረጡ።</translation>
 <translation id="3241720467332021590">አይሪሽ</translation>
@@ -1672,6 +1712,7 @@
 <translation id="3268451620468152448">ክፍት ትሮች</translation>
 <translation id="3269093882174072735">ምስል ጫን</translation>
 <translation id="3269101346657272573">እባክዎ ፒን ያስገቡ።</translation>
+<translation id="3269737334347286816">የመለያ መግቢያ ዝርዝሮች ጊዜ ያለፈባቸው ናቸው።</translation>
 <translation id="326999365752735949">የማውረድ ችግር</translation>
 <translation id="3270965368676314374">በኮምፒውተርዎ ላይ ያሉ ፎቶዎችን፣ ሙዚቃን እና ሌላ ማህደረመረጃ ያነብባል፣ ይቀይራል እና ይሰርዛል</translation>
 <translation id="3273410961255278341">ላክ ለ፦</translation>
@@ -1771,6 +1812,7 @@
 <translation id="3382073616108123819">ውይ! ስርዓቱ ለዚህ መሳሪያ የመሳሪያ መለያዎችን መወሰን አልቻለም።</translation>
 <translation id="3384773155383850738">ከፍተኛው የጥቆማ አስተያየቶች ቁጥር</translation>
 <translation id="3385050660708634073">ሁሉም የተሰመረ ውሂብ ከእራስዎ የተሰመረ ይለፍ ሐረግ ጋር ያመሳጥሩ።</translation>
+<translation id="3385131213214862288">የሚከተሉትን ንጥሎች አጽዳ ከ</translation>
 <translation id="338583716107319301">መለያ</translation>
 <translation id="3386219708421216619">ዕልባት ታክሏል</translation>
 <translation id="3391392691301057522">የድሮ ፒን፦</translation>
@@ -1784,6 +1826,7 @@
 <translation id="3401130144947259741">ከነቃ የክስተቶች ክትትል ወደ Event Tracing for Windows (ETW) እንዲላክ ይደረግና ከዚያ በመቀጠል እንደ UIForETW ወይም Xperf ባሉ መሣሪያዎች ሊያዝ ይችላል።</translation>
 <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED" />፣ <ph name="TIME_LEFT" /></translation>
 <translation id="340485819826776184">በአድራሻ አሞሌው የሚተየቡት ፍለጋዎችን እና ዩአርኤልዎችን ለማጠናቀቅ እንዲያግዝ የመገመቻ አገልግሎት ይጠቀሙ።</translation>
+<translation id="3405664148539009465">ቅርጸ-ቁምፊዎችን አብጅ</translation>
 <translation id="3405763860805964263">...</translation>
 <translation id="3406605057700382950">&amp;የዕልባቶች አሞሌ አሳይ</translation>
 <translation id="3412265149091626468">ወደ ተመረጠው ዝለል</translation>
@@ -1805,6 +1848,7 @@
 <translation id="3439153939049640737"><ph name="HOST" /> ሁልጊዜ የማይክሮፎንዎ መዳረሻ ይፈቀድለት</translation>
 <translation id="3439282137581679399">ለደህንነቱ የተጠበቀ አሰሳ ተጠቃሚዎች የመጥፎ ዝና ዝርዝር ውስጥ ላሉ ጣቢያዎች ፈቃዶችን የሚያግደውን የፈቃዶች የመጥፎ ዝና ዝርዝር ያነቃል።</translation>
 <translation id="3439970425423980614">PDF በቅድመ እይታ በመክፈት ላይ</translation>
+<translation id="3440761377721825626">አንድ ጣቢያ ኮምፒውተርዎን ለመድረስ አንድ ተሰኪን መጠቀም ሲፈልግ ጠይቅ</translation>
 <translation id="3441653493275994384">ማያ ገጽ</translation>
 <translation id="3441653695259810643">ለፈጣን አቀማመጥ የተለያዩ የቁምፊዎች መጠንን ለማቅረብ እንዲያገለግል በምስል ሰሪው ውስጥ የተሸጎጠ ቁምፊን ዳግመኛ ይጠቀሙ።</translation>
 <translation id="3445092916808119474">ዋናው አድርገው</translation>
@@ -1819,6 +1863,7 @@
 <translation id="3456236151053308041">እንደ ምናባዊ የቁልፍ ሰሌዳዎች ላሉ የተጠቃሚ ግቤት ብጁ እይታዎችን ለማቅረብ የአይኤምኢ ቅጥያዎችን ያንቁ።</translation>
 <translation id="345693547134384690">&amp;ምስል በአዲስ ትር ውስጥ ክፈት</translation>
 <translation id="3458620904104024826">የክስተት ክትትሎችን ወደ ETW መላክ አንቃ።</translation>
+<translation id="3459509316159669723">ማተም</translation>
 <translation id="3459774175445953971">ለመጨረሻ ጊዜ የተሻሻለው፦</translation>
 <translation id="3460771772332290399">ከመስመር ውጭ ራስ- ሰር ዳግም መጫን ሁነታ</translation>
 <translation id="3462413494201477527">የመለያ ቅንብር ይተው?</translation>
@@ -1862,6 +1907,7 @@
 <translation id="3508920295779105875">ሌላ አቃፊ ምረጥ…</translation>
 <translation id="3509527969829946096">ይህ አማራጭ የመድረክ ሃርድዌር በመጠቀም የቪዲዮ ልቀቶችን ለማመሳጠር የሚያስችለውን በCast Streaming ያለውን ድጋፍ ያነቃል።</translation>
 <translation id="3510797500218907545">WiMAX</translation>
+<translation id="3511200754045804813">ዳግም-ቃኝ</translation>
 <translation id="3511307672085573050">የአገናኝ አድ&amp;ራሻ ቅዳ</translation>
 <translation id="3511399794969432965">መገናኘት ላይ እየተቸገሩ ነው?</translation>
 <translation id="351152300840026870">ውሱን የቅርጸ ቁምፊ ስፋት</translation>
@@ -1931,6 +1977,7 @@
 <translation id="3590559774363307859">የይለፍ ቃል ተቀምጧል። ከማናቸውም አሳሽ ላይ እሱን እና ከሁሉም የእርስዎ <ph name="SAVED_PASSWORDS_LINK" /> ላይ ሊደርሱበት ይችላሉ።</translation>
 <translation id="3590587280253938212">ፈጣን</translation>
 <translation id="3592260987370335752">&amp;ተጨማሪ ይወቁ</translation>
+<translation id="3592313833691251126">ቅጥያዎች ከአሳሽ ከፈፍ ውጭ የሚከፈቱ የፓነል መስኮቶችን እንዲፈጥሩ ይፍቀዱላቸው። ካልነቃ አንድ ፓነል ለመክፈት የሚደረጉ ሙከራዎች በምትኩ ብቅ ባይን ይከፍታሉ። ነባሪው ባህሪ በተፈቀዱ ዝርዝር ውስጥ ላሉ ቅጥያዎች ማስቻል ብቻ ነው። የነቃ ባህሪ ሁሉንም ቅጥያዎች የሚያስችል ነው። የተሰናከለ ባህሪ ለማንኛውም ቅጥያ አይፈቅድም።</translation>
 <translation id="359283478042092570">አስገባ</translation>
 <translation id="3593152357631900254">ያልጠራ-በቻይና ፊደል መጻፊያ ሁነታን ያንቁ</translation>
 <translation id="3593965109698325041">የሰርቲፊኬት ስም እገዳዎች</translation>
@@ -2008,6 +2055,7 @@
 <translation id="3695919544155087829">እባክዎ ይህን የእውቅና ማረጋገጫ ፋይል ለማመስጠር ያገለገለውን የይለፍ ቃል ያስገቡ።</translation>
 <translation id="3696411085566228381">ምንም</translation>
 <translation id="3697100740575341996">የእርስዎ አይ ቲ አስተዳዳሪ Chrome Goodies ለመሣሪያዎ አሰናክሏል። <ph name="MORE_INFO_LINK" /></translation>
+<translation id="3699080292907545058">ከፍተኛውን የነቃ የTLS ስሪት ያቀናብሩ</translation>
 <translation id="3699624789011381381">የኢሜይል አድራሻ</translation>
 <translation id="3704162925118123524">እየተጠቀሙ ያሉት አውታረ መረብ በመለያ መግቢያ ገጹን እንዲጎበኙ ሊጠይቅዎት ይችላል።</translation>
 <translation id="3704331259350077894">የክንውን መቋረጥ</translation>
@@ -2053,10 +2101,12 @@
 <translation id="3758201569871381925">የእርስዎ የHotrod መሣሪያ መብራቱን እና ከቴሌቪዥን ጋር መገናኘቱን ያረጋግጡ።</translation>
 <translation id="375841316537350618">ተኪ ስክሪፕትን በማውረድ ላይ...</translation>
 <translation id="3759371141211657149">የከዋኝ ቅንብሮችን ያቀናብሩ...</translation>
+<translation id="3759553810934020361">ብሉቱዝ ጠፍቷል።</translation>
 <translation id="3759933321830434300">የድረ-ገጾች ክፍሎችን ያግዳል</translation>
 <translation id="3760460896538743390">&amp;የጀርባ ገጽ ይመርምሩ</translation>
 <translation id="37613671848467444">&amp;ማንነትን በማያሳውቅ መስኮት ውስጥ ክፈት</translation>
 <translation id="3763401818161139108">ሁልጊዜ በ <ph name="ORIGIN" /> ላይ አሂድ</translation>
+<translation id="3764314093345384080">ዝርዝር የግንብ መረጃ</translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{በዩኤስቢ መሣሪያ መልዕክት ይለዋወጡ}one{በ# ዩኤስቢ መሣሪያዎች መልዕክት ይለዋወጡ}other{በ# ዩኤስቢ መሣሪያዎች መልዕክት ይለዋወጡ}}</translation>
 <translation id="3764800135428056022">የድር ይለፍ ቃላትዎን ለማስቀመጥ ያቅርቡ።</translation>
 <translation id="3764986667044728669">መመዝገብ አልተቻለም</translation>
@@ -2086,6 +2136,7 @@
 <translation id="3798449238516105146">ስሪት</translation>
 <translation id="3798935682015223249">በፋይል አቀናባሪ ውስጥ የMTP ድጋፍ</translation>
 <translation id="3800764353337460026">የምልክት ቅጥ</translation>
+<translation id="3800806661949714323">ሁሉንም አሳይ (የሚመከር)</translation>
 <translation id="3801082500826908679">ፋሮኛ</translation>
 <translation id="3803991353670408298">ይህን ከማስወገድዎ በፊት እባክዎ ሌላ የግቤት ስልት ያክሉ።</translation>
 <translation id="380408572480438692">የአፈጻጸም ውሂብ ስብስብን ማንቃት Google ከጊዜ ወደ ጊዜ ስርዓቱን እንዲያሻሽለው ያግዘዋል። የግብረ መልስ ሪፖርት ፋይል እስኪያደርጉ (Alt-Shift-I) እና የአፈጻጸም ውሂብ እስኪያካትቱ ድረስ ምንም ውሂብ አይላክም። በማንኛውም ጊዜ ስብስቡን ለማሰናከል ወደዚህ ማያ ገጽ መመለስ ይችላሉ።</translation>
@@ -2103,6 +2154,7 @@
 <translation id="3819007103695653773">ሁሉም ጣቢያዎች የግፋ መልዕክቶችን እንዲልክ ፍቀድ</translation>
 <translation id="3819752733757735746">የማብሪያ/ማጥፊያ መዳረሻ (ኮምፒውተሩን በአንድ ወይም ሁለት ማብሪያ ማጥፊያዎች ይቆጣጠሩ)</translation>
 <translation id="3819800052061700452">&amp;በሙሉ ገጽ ማያ አሳይ</translation>
+<translation id="3821453754632750466">የድር ክፍያዎችን ያንቁ</translation>
 <translation id="3822265067668554284">ማናቸውንም ጣቢያዎች ትክክለኛ አካባቢዎን መከታተል እንዲችሉ አይፍቀዱ</translation>
 <translation id="3825863595139017598">የሞንጎሊያ ቁልፍ ሰሌዳ</translation>
 <translation id="3827306204503227641">በማጠሪያ ያልተቀመጡ ተሰኪዎችን መፍቀዱን ቀጥል</translation>
@@ -2164,9 +2216,11 @@
 <translation id="3899968422636198696"><ph name="ORGNAME" /> <ph name="HOSTNAME" /></translation>
 <translation id="3901991538546252627">ከ<ph name="NAME" /> ጋር በመገናኘት ላይ</translation>
 <translation id="3902799646152133632">ማከማቻ-አልባ ዋና ክፈፉን ይዘልላል</translation>
+<translation id="3904196543277238487">ከፍተኛው የTLS ስሪት ነቅቷል።</translation>
 <translation id="3905761538810670789">መተግበሪያ ይጠግኑ</translation>
 <translation id="390718707505136526">የባህሪ/ኤፒአይ ሙከራዎች መዳረሻን ለመቆጣጠር የምንጭ ሙከራዎችን ያነቃል።</translation>
 <translation id="3908501907586732282">ቅጥያውን አንቃ</translation>
+<translation id="3909690856344416952"><ph name="LANGUAGE_1" />፣ <ph name="LANGUAGE_2" /> እና 1 ሌላ</translation>
 <translation id="3909791450649380159">&amp;ቁረጥ</translation>
 <translation id="3910699493603749297">የክመር ቁልፍ ሰሌዳ</translation>
 <translation id="3911073280391218446"><ph name="USER_DISPLAY_NAME" /> (በዚህ መሣሪያ ላይ ስራ ላይ የዋለው ስም)</translation>
@@ -2186,6 +2240,7 @@
 <translation id="3930521966936686665">በሚከተለው ላይ ያጫውቱ፦</translation>
 <translation id="3936390757709632190">&amp;ተሰሚ/ኦዲዮ በአዲስ ትር ክፈት</translation>
 <translation id="3936768791051458634">ሰርጥ ቀይር...</translation>
+<translation id="3936925983113350642">የመረጡት የይለፍ ቃል ይህን የዕውቅና ማረጋገጫ በኋላ ላይ ለማስመለስ ያስፈልጋል።  እባክዎ ደህንነቱ በተጠበቀ ቦታ ላይ ይመዝግቡት።</translation>
 <translation id="3937640725563832867">የሰርቲፊኬት አቅራቢ ተለዋጭ ስም</translation>
 <translation id="3938113500786732264">በበለጠ ፍጥነት ሰዎችን ይቀይሩ</translation>
 <translation id="3940233957883229251">ራስ-ድገምን አንቃ</translation>
@@ -2253,9 +2308,10 @@
 <translation id="4034042927394659004">የቁልፍ ብሩህነት ቀንስ</translation>
 <translation id="4035758313003622889">&amp;ተግባር አስተዳዳሪ</translation>
 <translation id="4037084878352560732">ፈረስ</translation>
-<translation id="4037102579141982963">ይህ መሣሪያ የምርመራ እና የአጠቃቀም ውሂብን በራስ-ሰር ወደ Google ይልካል። ይህን በማንኛውም ጊዜ በመሣሪያዎ <ph name="BEGIN_LINK1" />ቅንብሮች<ph name="END_LINK1" /> ውስጥ መለወጥ ይችላሉ። <ph name="BEGIN_LINK2" />የበለጠ ለመረዳት<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">የAndroid ትር ቀያሪ ተደራሽነት አንቃ።</translation>
+<translation id="4037889604535939429">ሰውን ያርትዑ</translation>
 <translation id="4044260751144303020">የባለውሱን ቦታ ክፍሎች ጥንክር።</translation>
+<translation id="4044612648082411741">የእርስዎን የዕውቅና ማረጋገጫ ይለፍ ቃል ያስገቡ</translation>
 <translation id="404493185430269859">ነባሪ የፍለጋ ፕሮግራም</translation>
 <translation id="4047112090469382184">ይሄ እንዴት ደህንነቱ የተጠበቀ እንደሆነ</translation>
 <translation id="4047345532928475040">አይተግበሬ</translation>
@@ -2346,6 +2402,7 @@
 <translation id="417475959318757854">የመተግበሪያ አስጀማሪውን ወደመሃል አድርግ።</translation>
 <translation id="4176463684765177261">ተሰናክሏል</translation>
 <translation id="4179512409951755566">OSK አልፎ መሸብለያ አንቃ</translation>
+<translation id="418062721134714140">የእርስዎን የSSL ዕውቅና ማረጋገጫዎች እና ቅንብሮች ያቀናብሩ</translation>
 <translation id="4180788401304023883">የCA እውቅና ማረጋገጫ «<ph name="CERTIFICATE_NAME" />» ይሰረዝ?</translation>
 <translation id="418179967336296930">የሩሲያ የድምፅ አነባበብ (YaZHert) ቁልፍ ሰሌዳ</translation>
 <translation id="4181841719683918333">ቋንቋዎች</translation>
@@ -2360,6 +2417,7 @@
 <translation id="4195643157523330669">በአዲስ ትር ክፈት</translation>
 <translation id="4195814663415092787">ካቆምክበት ቀጥል</translation>
 <translation id="4197674956721858839">የጨመቃ ምርጫ</translation>
+<translation id="4200689466366162458">ብጁ ቃላት</translation>
 <translation id="4200983522494130825">አዲስ &amp;ትር</translation>
 <translation id="4206144641569145248">በዓድ ፍጥረት</translation>
 <translation id="420665587194630159">(ይህ ቅጥያ የተቀናበረ እና ሊወገድ ወይም ሊሰናከል የማይችል ነው።)</translation>
@@ -2456,10 +2514,12 @@
 <translation id="4350019051035968019">ይህ መሣሪያ በተለየ ጎራ የሚተዳደር መሆኑ ምልክት ስለተደረገበት የእርስዎ መለያ ባለበት ጎራ መመዝገብ አይችልም።</translation>
 <translation id="4354806558096370704">የቤተኛ CUPS ማተሚያ ደጀን መጠቀምን ያነቃል።</translation>
 <translation id="4355925451975609675">ወደፊት ለመሄድ |<ph name="ACCELERATOR1" />|+|<ph name="ACCELERATOR2" />| ይጫኑ</translation>
+<translation id="4358353773267946514"><ph name="LANGUAGE_1" />፣ <ph name="LANGUAGE_2" /></translation>
 <translation id="4358697938732213860">አድራሻ አክል</translation>
 <translation id="4359408040881008151">በጥገኛ ቅጥያ(ዎች) ምክንያት ተጭኗል።</translation>
 <translation id="4361190688154226069">በእይታዎች ውስጥ በa ላይ የተመሠረተ ማነጣጠር</translation>
 <translation id="4361765875689149937"><ph name="ORIGIN" /> ከዚህ ጋር መጣመር ይፈልጋል፦</translation>
+<translation id="4363771538994847871">ምንም የCast መድረሻዎች አልተገኙም። እገዛ አስፈለገዎት?</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> ወርዷል</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> አንድ መስኮት እያጋራ ነው።</translation>
 <translation id="4364830672918311045">ማሳወቂያዎችን አሳይ</translation>
@@ -2551,6 +2611,7 @@
 <translation id="4509345063551561634">አካባቢ፦</translation>
 <translation id="4514542542275172126">አዲስ ክትትል የሚደረግበት ተጠቃሚ ያዋቅሩ</translation>
 <translation id="4514914692061505365">ለሁሉም pexe ፋይሎች የPNaCl ፈጣን Subzero ተርጓሚን መጠቀም ያስገድዳል።</translation>
+<translation id="451515744433878153">አስወግድ</translation>
 <translation id="4516641987425683031">የሰመሩ ትሮች</translation>
 <translation id="4518677423782794009">Chrome ተበላሽቷል፣  ያልተለመዱ የጅማሬ ገጾች ወይም የመሣሪያ አሞሌዎች፣ ሊያስወግዱዋቸው የማይችሉዋቸው ወይም በሌላ መልኩ የእርስዎን የአሰሳ ተሞክሮ የሚለውጡ ያልተጠበቁ ማስታወቂያዎች እያሳየ ነው? የChrome ማጽጃ መሳሪያ በማስኬድ ችግሩን ሊያስተካክሉት ይችሉ ይሆናል።</translation>
 <translation id="452039078290142656">ከ<ph name="VENDOR_NAME" /> የመጡ ያልታወቁ መሣሪያዎች</translation>
@@ -2587,6 +2648,7 @@
 <translation id="4562991793854515912">እጅግ በጣም ሲበዛ አጭር (600 ሚሴ)</translation>
 <translation id="4563210852471260509">የመጀመሪያው የግቤት ቋንቋ ቻይንኛ ነው</translation>
 <translation id="456664934433279154">በToolkit-Views ላይ የተመሠረቱ የChrome መተግበሪያ መስኮቶችን መጠቀም ወይም አለመጠቀሙን ይቆጣጠራል።</translation>
+<translation id="4567772783389002344">ቃል አክል</translation>
 <translation id="4569998400745857585">ድብቅ ቅጥያዎችን የያዘ ምናሌ</translation>
 <translation id="4570444215489785449">አሁን በChrome አቀናባሪ ላይ ይህን መሣሪያ በርቀት መቆለፍ ይችላሉ።</translation>
 <translation id="4572659312570518089">ከ«<ph name="DEVICE_NAME" />» ጋር በመገናኘት ሳለ ፈቀዳ ተሰርዟል።</translation>
@@ -2598,11 +2660,13 @@
 <translation id="4582447636905308869">በGoogle ግቤት መሣሪያዎች HMM ሞተር ላይ የተመረኮዘ፣ አዲስ የኮርያኛ IME።</translation>
 <translation id="4582563038311694664">ሁሉንም ቅንብሮች ዳግም አስጀምር</translation>
 <translation id="4583537898417244378">ልክ ያልሆነ ወይም የተበላሸ ፋይል።</translation>
+<translation id="4585793705637313973">ገጽ ያርትዑ</translation>
 <translation id="4589268276914962177">አዲስ ተርሚናል</translation>
 <translation id="4590324241397107707">የውሂብ ጎታ ማከማቻ</translation>
 <translation id="4593021220803146968">&amp;ወደዚህ ሂድ <ph name="URL" /></translation>
 <translation id="4594109696316595112">የአንድ ጊዜ ማግበር፦ Smart Lockን ለማንቃት የይለፍ ቃልዎን ይተይቡ። በSmart Lock አማካኝነት የእርስዎ ስልክ ይህን <ph name="DEVICE_TYPE" /> ያስከፍተዋል—ያለይለፍ ቃል። ይህን ባህሪ ለመቀየር ወይም ለማጥፋት የእርስዎን የ<ph name="DEVICE_TYPE" /> ቅንብሮች ይጎብኙ።</translation>
 <translation id="4595560905247879544">መተግበሪያዎች እና ቅጥያዎች በአስተዳዳሪው ብቻ ነው ሊቀየሩ የሚችሉት (<ph name="CUSTODIAN_NAME" />)።</translation>
+<translation id="4596295440756783523">እነዚህን አገልጋዮች የሚለዩ የዕውቅና ማረጋገጫዎች በፋይሉ ላይ አሉዎት</translation>
 <translation id="4598556348158889687">የማከማቻ አስተዳደር</translation>
 <translation id="4601242977939794209">EMF ለዋጭ</translation>
 <translation id="4602466770786743961"><ph name="HOST" /> ሁልጊዜ ካሜራዎን እና ማይክሮፎንዎን እንዲደርስባቸው ይፍቀዱ</translation>
@@ -2668,6 +2732,7 @@
 <translation id="4697551882387947560">የአሰሳ ክፍለ-ጊዜው ሲያልቅ</translation>
 <translation id="4699172675775169585">የተሸጎጡ ምስሎች እና ፋይሎች</translation>
 <translation id="4699357559218762027">(በራስ-ጀምሯል)</translation>
+<translation id="4704677965327178154">ማንኛውም ጣቢያ ኮምፒውተዎን ለመድረስ ተሰኪ እንዲጠቀሙ አይፍቀዱለት።</translation>
 <translation id="4707302005824653064">አጠቃቀም እና ታሪክ chrome.com ላይ በአቀናባሪው (<ph name="CUSTODIAN_EMAIL" />) ሊከለሱ ይችላሉ።</translation>
 <translation id="4707579418881001319">L2TP/IPsec + የተጠቃሚ እውቅና ማረጋገጫ</translation>
 <translation id="4707934200082538898">ተጨማሪ መመሪያዎችን ለማግኘት እባክዎ በ<ph name="BEGIN_BOLD" /><ph name="MANAGER_EMAIL" /><ph name="END_BOLD" /> ላይ ያለውን ኢሜይልዎን ይመልከቱ።</translation>
@@ -2705,6 +2770,7 @@
 <translation id="4744574733485822359">ውርድዎ ተጠናቅቋል</translation>
 <translation id="4746971725921104503">ያንን ስም የያዘ ተጠቃሚ አስቀድመው እያስተዳደሩ ያሉ ይመስላሉ። <ph name="LINK_START" /><ph name="USER_DISPLAY_NAME" />ን ወደዚህ መሣሪያ ማስመጣት<ph name="LINK_END" /> ይፈልጋሉ?</translation>
 <translation id="4747271164117300400">መቄዶኒያኛ</translation>
+<translation id="4748762018725435655">የChrome የድር መደብር ቅጥያ ያስፈልገዋል</translation>
 <translation id="4749157430980974800">የጂዩርጂያ ቁልፍ ሰሌዳ</translation>
 <translation id="4750394297954878236">የአስተያየት ጥቆማዎች</translation>
 <translation id="475088594373173692">የመጀመሪያ ተጠቃሚ</translation>
@@ -2718,6 +2784,7 @@
 <translation id="4763830802490665879">ሲወጣ ከበርካታ ጣቢያዎች የመጡ ኩኪዎች ይጸዳሉ።</translation>
 <translation id="4764029864566166446">ተሰኪን ያዘምኑ...</translation>
 <translation id="4764865176798926079">የዋናው ክፈፍ domContentLoaded እና ሁሉም ግብዓቶች ጭነቶች ከdomContentLoaded በፊት ተጀምረዋል (iframes ችላ ተብለዋል)።</translation>
+<translation id="4768332406694066911">እርስዎን የሚለዩ ከእነዚህ ድርጅቶች የመጡ የዕውቅና ማረጋገጫዎች አሉዎት</translation>
 <translation id="4768698601728450387">ምስል ይከርክሙ</translation>
 <translation id="4773696473262035477">እሱን እና ሁሉንም የእርስዎን <ph name="SAVED_PASSWORDS_LINK" /> ከማናቸውም አሳሽ ላይ ሊደርሱባቸው ይችላሉ።</translation>
 <translation id="4776917500594043016">የ<ph name="USER_EMAIL_ADDRESS" /> ይለፍ ቃል</translation>
@@ -2735,10 +2802,12 @@
 <translation id="4793866834012505469">የድምፅ ሞዴል እንደገና አለማምድ</translation>
 <translation id="479536056609751218">ድረ-ገጽ፣ ኤች ቲ ኤም ኤል ብቻ</translation>
 <translation id="479989351350248267">ፈልግ</translation>
+<translation id="480036413855787547">ከማንኛውም መሣሪያ ላይ ሆነው የእርስዎን የይለፍ ቃላት በ<ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> ላይ ይድረሱባቸው። በMac ላይ የይለፍ ቃላት በእርስዎ Keychain ላይ የሚቀመጡ ሊሆኑ ይችላሉ፣ እና ይህን የOS X መለያ በሚጋሩ ሌሎች የChrome ተጠቃሚዎች ሊደረስባቸው ወይም ሊሰመሩ ይችላሉ።</translation>
 <translation id="4801257000660565496">የመተግበሪያ አቋራጮችን ፍጠር</translation>
 <translation id="4801448226354548035">መለያዎችን ደብቅ</translation>
 <translation id="4801512016965057443">የተንቀሳቃሽ ስልክ ውሂብ ዝውውር ይፍቀዱ</translation>
 <translation id="4801956050125744859">ሁለቱንም አስቀምጥ</translation>
+<translation id="4803121606678474433">የ2ል ሸራ ተለዋዋጭ ምስል ስራ ሁነታን ቅየራን አንቃ።</translation>
 <translation id="4803909571878637176">በማራገፍ ላይ</translation>
 <translation id="4804331037112292643">ፋይል ክፈት/ዝጋ ንግግር</translation>
 <translation id="4804818685124855865">ግንኙነት አቋርጥ</translation>
@@ -2757,6 +2826,7 @@
 <translation id="4824518112777153488">ለተንዣባቢ ንቁ በእጅ ተነኪ ማያዎች ድጋፍ</translation>
 <translation id="4827948050554950725">ክሬዲት ካርድ አክል</translation>
 <translation id="4828493911650550108">መተግበሪያዎች እና አገልግሎቶች የWi-Fi አውታረ መረቦችን እና የብሉቱዝ መሣሪያዎችን እንዲቃኙ በመፍቀድ የአካባቢ ትክክለኝነትን ያሻሽሉ።</translation>
+<translation id="4828937774870308359">አውስትራሊያዊ</translation>
 <translation id="4830573902900904548">የእርስዎ <ph name="DEVICE_TYPE" /> <ph name="NETWORK_NAME" />ን ተጠቅሞ ከበይነመረብ ጋር መገናኘት አልቻልም። እባክዎ ሌላ አውታረ መረብ ይምረጡ። <ph name="LEARN_MORE_LINK_START" />ተጨማሪ ለመረዳት<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">የ<ph name="ORGANIZATION" /> ማንነት <ph name="LOCALITY" /> ላይ በ<ph name="ISSUER" /> ተረጋግጧል። የሚሰራ የዕውቅና ማረጋገጫ መረጃ በአገልጋዩ ተሰጥቷል።</translation>
 <translation id="4834912470034578916">ለድር ማሳወቂያዎች ብጁ አቀማመጦችን አንቃ።</translation>
@@ -2775,6 +2845,7 @@
 <translation id="4849517651082200438">አትጫን</translation>
 <translation id="4850258771229959924">የገንቢ መሳሪያዎችን ውስጥ ይመልከቱ</translation>
 <translation id="4850458635498951714">መሣሪያ ያክሉ</translation>
+<translation id="4850669014075537160">ሽብለላ</translation>
 <translation id="4850886885716139402">አሳይ</translation>
 <translation id="4853020600495124913">&amp;በአዲስ መስኮት ውስጥ ክፈት</translation>
 <translation id="485316830061041779">ጀርመን</translation>
@@ -2822,6 +2893,7 @@
 <translation id="4903369323166982260">Chrome ማጽጃ መሳሪያ አሂድ</translation>
 <translation id="4906679076183257864">ወደ ነባሪ ዳግም አስጀምር</translation>
 <translation id="4907125798206348918">ደካማ MemoryCache።</translation>
+<translation id="4907306957610201395">የፈቃድ ምድብ</translation>
 <translation id="49088176676474409">የእሴቶች VPD ደብቅ።</translation>
 <translation id="4910021444507283344">WebGL</translation>
 <translation id="4910673011243110136">የግል አውታረ መረቦች</translation>
@@ -2848,6 +2920,7 @@
 <translation id="4938972461544498524">የመዳሰሻ ሰሌዳ ቅንብሮች</translation>
 <translation id="4940047036413029306">ጥቅስ</translation>
 <translation id="4941246025622441835">መሣሪያው ለድርጅት አስተዳደር ሲያስመዘግቡት ይህን የመሣሪያ መውረሻ ይጠቀሙ፦</translation>
+<translation id="4941627891654116707">የቅርፀ-ቁምፊ መጠን</translation>
 <translation id="4942394808693235155">ዝማኔዎች ካሉ ያረጋግጡ እና ይተግብሯቸው</translation>
 <translation id="494286511941020793">የተኪ ውቅር እገዛ</translation>
 <translation id="4950138595962845479">አማራጮች...</translation>
@@ -2858,6 +2931,7 @@
 <translation id="4956847150856741762">1</translation>
 <translation id="495931528404527476">በChrome ውስጥ</translation>
 <translation id="496226124210045887">የመረጡት አቃፊ ሊጎዱ የሚችሉ ፋይሎች አሉት። እርግጠኛ ነዎት ዘላቂ የዚህ አቃፊ የንባብ መዳረሻ ለ«$1» መስጠት ይፈልጋሉ?</translation>
+<translation id="4964455510556214366">አደራደር</translation>
 <translation id="4964673849688379040">በመፈተሽ ላይ...</translation>
 <translation id="4966802378343010715">አዲስ ተጠቃሚ ፍጠር</translation>
 <translation id="4967749818080339523">አንድ መለያ ይምረጡ</translation>
@@ -2885,6 +2959,7 @@
 <translation id="4992066212339426712">ድምጸ-ከል አንሳ</translation>
 <translation id="4992458225095111526">Powerwashን ያረጋግጡ</translation>
 <translation id="4992576607980257687">አንድ ጣቢያ ለሚመለከተው ስርዓት ብቻ የተወሰኑ መልዕክቶችን በመጠቀም MIDI መሳሪያዎችን ለመድረስ ሲፈልግ እኔን ጠይቀኝ (የሚመከር)</translation>
+<translation id="4994474651455208930">ጣቢያዎች ለፕሮቶኮሎች ነባሪ ከዋኞች እንዲሆኑ እንዲጠይቁ ፍቀድ</translation>
 <translation id="4998873842614926205">ለውጦችን ያረጋግጡ</translation>
 <translation id="4999273653895592255">ይህ ጥቆማ ለዴስክቶፕ አንሺ መምረጫ መስኮቱ የምናሳየው የድሮው ወይም አዲሱን በይነገጽ ይሁን ይቆጣጠራል።</translation>
 <translation id="499955951116857523">የፋይል አቀናባሪ</translation>
@@ -2981,6 +3056,7 @@
 <translation id="5144820558584035333">ሃንጉል 3 ስብስብ (390)</translation>
 <translation id="5145331109270917438">የተቀየረበት ቀን</translation>
 <translation id="5146631943508592569">የመሣሪያ ህይወት ማብቂያ ማሳወቂያን አሰናክል።</translation>
+<translation id="5147113189823897615">ይህ መለያ በ<ph name="DOMAIN" /> የሚተዳደር ስለሆነ የእርስዎ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች ከዚህ መሣሪያ ላይ እንዲጸዱ ይደረጋሉ። ይሁንና፣ የእርስዎ ውሂብ በGoogle መለያዎ ላይ እንደተከማቸ ይቆያል።</translation>
 <translation id="5147237161038757796">የቁሳዊ ቁልፍ ሰሌዳ ራስ-ሰር አራሚ</translation>
 <translation id="5148320352496581610">በአራት ማዕዘን-የተመሰረተ ዒላማ የንክኪ ምልክቱ ክልል በአራት ማዕዘን የሚወከል በሚሆንበት ጊዜ የአንድ ምልክት ዓላማ የመሆን ከፍተኛ ዕድል ያለው ለማወቅ አንድ ሂዩሪስቲክ ይጠቀማል።</translation>
 <translation id="5150254825601720210">የNetscape ሰርቲፊኬት SSL አገልጋይ ስም</translation>
@@ -3017,6 +3093,7 @@
 <translation id="5181140330217080051">በማውረድ ላይ</translation>
 <translation id="5182671122927417841">ቅጥያ አሰናክል</translation>
 <translation id="5184063094292164363">&amp;ጃቫስክሪፕት ኮንሶል</translation>
+<translation id="5184662919967270437">መሣሪያዎን በማዘመን ላይ</translation>
 <translation id="5185386675596372454">አዲሱ የ«<ph name="EXTENSION_NAME" />» መተግበሪያ ስሪት ተጨማሪ ፍቃዶችን ስለሚፈልግ ተሰናክሏል።</translation>
 <translation id="5185403602014064051">ይህ ባህሪ እርስዎ የይለፍ ቃል ሳያስፈልገዎት ማንኛውም በመለያ የገባ ተጠቃሚን በፍጥነት እንዲደርሱበት ያስችልዎታል።</translation>
 <translation id="5186650237607254032">በአቅራቢያው ሲሆኑ እንዲጠፋ የእርስዎን ስልክ ማያ ገጽ መቆለፊያ ያዘምኑ። ስልኩን በበለጠ ፍጥነት ይከፍቱታል፣ እንዲሁም በእርስዎ <ph name="DEVICE_TYPE" /> ላይ የተሻለ የSmart Lock ተሞክሮን በማግኘት ይዝናኑ።</translation>
@@ -3028,6 +3105,7 @@
 <translation id="5197255632782567636">በይነመረብ</translation>
 <translation id="5197680270886368025">ማመሳሰል ተጠናቅቋል።</translation>
 <translation id="5204967432542742771">የይለፍ ቃል ያስገቡ</translation>
+<translation id="5206215183583316675">«<ph name="CERTIFICATE_NAME" />» ይሰረዝ?</translation>
 <translation id="520621735928254154">የእውቅና ማረጋገጫ ማስመጣት ስህተት</translation>
 <translation id="5208988882104884956">ግማሽ ወርድ</translation>
 <translation id="5209320130288484488">ምንም መሣሪያዎች አልተገኙም</translation>
@@ -3045,6 +3123,7 @@
 <translation id="5227808808023563348">ቀዳሚውን ጽሑፍ ይፈልጋል</translation>
 <translation id="5228076606934445476">መሣሪያው ላይ የሆነ ችግር ተፈጥሯል።  ከዚህ ስህተት ለማገገም መሣሪያውን እንደገና ማስጀመርና እንደገና መሞከር ይኖርብዎታል።</translation>
 <translation id="5228962187251412618">መስመር ላይ ፍተሻ ብቻ</translation>
+<translation id="5229189185761556138">የግቤት ስልቶችን ያቀናብሩ</translation>
 <translation id="5229622432348746578">ኦዲዮን ለዴስክቶፕ ማጋራትን አሰናክል</translation>
 <translation id="5230516054153933099">መስኮት</translation>
 <translation id="5232178406098309195">እንደ «Ok Google» ያሉ የኦዲዮ ማግበሪያ ትዕዛዞችን ሲጠቀሙ ወይም የማይክሮፎን አዶ ሲነኩ የግል የድምጽ እና የኦዲዮ እንቅስቃሴዎ የተወሰነ ድምጽ እና ሌላ ኦዲዮ በመለያዎ ላይ ያከማቻል። የሚከተለው ንግግር/ኦዲዮ እና ጥቂት ሰከንዶች ቀደም ብሎ ያለ ቀረጻ ይከማቻል።</translation>
@@ -3224,7 +3303,6 @@
 <translation id="5439568486246921931">ይህ እርምጃ የዚህ ተጠቃሚ ውርዶችን፣ የመስመር ውጭ ፋይሎችን እና የአሰሳ ውሂብን እስከመጨረሻው ይሰርዘዋል። ይሄ ሊቀለበስ አይችልም።</translation>
 <translation id="544083962418256601">አቋራጮችን ይፍጠሩ...</translation>
 <translation id="5441100684135434593">ባለገመድ አውታረ መረብ</translation>
-<translation id="5445088910157062298">የGoogle አካባቢ አገልግሎት መተግበሪያዎች የእርስዎን አካባቢ በበለጠ ፍጥነት እና ትክክለኝነት እንዲያገኙት ያግዛቸዋል፣ ይህም የባትሪ ፍጆታን ሊቀንስ ይችላል። ስም-አልባ የአካባቢ ውሂብ ለGoogle ይላካል፣ ምንም እያሄዱ ያሉ መተግበሪያዎች ባይኖሩም እንኳ።</translation>
 <translation id="5448293924669608770">ውይ፣ መግባት ላይ የሆነ ችግር ተፈጥሯል</translation>
 <translation id="5449588825071916739">ለሁሉም ትሮች ዕልባት አብጅ</translation>
 <translation id="5449716055534515760">&amp;መስኮት ዝጋ</translation>
@@ -3387,6 +3465,7 @@
 <translation id="5675224880872496917">የገጽ ይዘት በሚሸበለልበት ጊዜ በቀስታ አንም።</translation>
 <translation id="5676267133227121599">ከማናቸውም መሣሪያ ላይ በ<ph name="MANAGEMENT_LINK" /> ላይ የእርስዎን የይለፍ ቃሎች ይድረሱባቸው።</translation>
 <translation id="5677503058916217575">የገጽ ቋንቋ፦</translation>
+<translation id="5677850799565527075">የሶስተኛ ወገን ኩኪዎችን አግድ።</translation>
 <translation id="5677928146339483299">ታግዷል</translation>
 <translation id="5678550637669481956">ወደ <ph name="VOLUME_NAME" /> የማንበብ እና የመጻፍ መዳረሻ ተሰጥቷል።</translation>
 <translation id="567881659373499783">ስሪት <ph name="PRODUCT_VERSION" /></translation>
@@ -3416,6 +3495,7 @@
 <translation id="5711983031544731014">ማስከፈት አልተቻለም። የይለፍ ቃልዎን ያስገቡ።</translation>
 <translation id="5712966208980506909">ከነቃ የchrome://md-policy ዩአርኤሉ የቁሳዊ ንድፍ መመሪያ ገጹን ይጭነዋል።</translation>
 <translation id="5715711091495208045">የተሰኪ አስማሚ፦ <ph name="PLUGIN_NAME" /></translation>
+<translation id="5719603411793408026">ነባሪ የፍለጋ ፕሮግራሞች</translation>
 <translation id="572328651809341494">የቅርብ ጊዜ ትሮች</translation>
 <translation id="5723508132121499792">ምንም የጀርባ መተግበሪያዎች እያሄዱ አይደሉም</translation>
 <translation id="5725124651280963564">ለ<ph name="HOST_NAME" /> ቁልፍ ለማመንጨት እባክዎ ወደ <ph name="TOKEN_NAME" /> ይግቡ።</translation>
@@ -3423,14 +3503,18 @@
 <translation id="572525680133754531">የንብብር ጥንክር ለማረም እና ለማጥናት እንዲያግዝ የተጠናከሩ ዝግጁ ንብርብሮች ዙሪያ ላይ ድንበር ያዘጋጃል።</translation>
 <translation id="5726521882516480114">የ2ል ሸራን ምስል ስራን ለማከናወን በሶፍትዌር ምስል ከመስራት ይልቅ ጂፒዩ መጠቀምን የሚያነቃ ነው።</translation>
 <translation id="5727728807527375859">ቅጥያዎች፣ መተግበሪያዎች እና ገፅታዎች ኮምፒውተርዎን ሊጎዱ ይችላሉ። እርግጠኛ ነዎት መቀጠል ይፈልጋሉ?</translation>
+<translation id="5727970983344022445">ማንኛውም ጣቢያ በቅጾች ውስጥ የቁልፍ ማመንጨትን እንዲጠቀም አትፍቀድ</translation>
 <translation id="5729712731028706266">&amp;እይታ</translation>
 <translation id="5729996640881880439">ይቅርታ፣ ለዚህ ስህተት ኮድ ማሳየት አንችልም።</translation>
 <translation id="5731247495086897348">ለ&amp;ጥፍና እና ሂድ</translation>
 <translation id="5731751937436428514">የቪዬትናምኛ ግቤት ስልት (VIQR)</translation>
 <translation id="5732790216998904518">ለሙከራ ዓላማ የሰነዶች፣ የሉሆች እና የተንሸራታቾች የOffice አርትዖት።</translation>
 <translation id="5734362860645681824">ተግባቦት</translation>
+<translation id="5739458112391494395">በጣም ትልቅ</translation>
+<translation id="5740331643563157105"><ph name="LANGUAGE_1" />፣ <ph name="LANGUAGE_2" /> እና <ph name="NUM_ADDITIONAL_LANGUAGES" /> ሌሎች</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />፦ አርትዕ ለማድረግ ይምረጡ</translation>
 <translation id="5741454054957165976">ለWebFonts ጭነት አዲስ የተጠቃሚ ወኪል ጣልቃ-ገብነት ስሪቱን ያንቁ።</translation>
+<translation id="5742598604154146709">ማንኛውንም ጣቢያ በርካታ ፋይሎችን በራስ-ሰር እንዲያወርድ አትፍቀድ።</translation>
 <translation id="574392208103952083">መካከለኛ</translation>
 <translation id="5744368829843057748">2016Q2 በይነገጽን ተርጉም</translation>
 <translation id="5745056705311424885">የUSB ማህደረ ትውስታ መሰኪያ ተገኝቷል</translation>
@@ -3613,6 +3697,7 @@
 <translation id="5996258716334177896">መገለጫዎ በትክክል ሊከፈት አልቻለም።
 
 አንዳንድ ባህሪያት ላይኖሩ ይችላሉ። እባክዎ መገለጫው መኖሩንና ይዘቶቹን ለማንበብና ለመፃፍ ፍቃድ እንዳለዎት ያረጋግጡ።</translation>
+<translation id="6001799583597751002">ፒኖች አይዛመዱም፦</translation>
 <translation id="6003177993629630467"><ph name="PRODUCT_NAME" /> እራሱን እያዘመነ ላይቀጥል ይችላል።</translation>
 <translation id="6003294706906016758">ለሚስተናገዱ መተግበሪያዎች የድር መተግበሪያ ቅጥ ክፈፍን ያነቃል</translation>
 <translation id="600424552813877586">ልክ ያልሆነ መተግበሪያ።</translation>
@@ -3638,6 +3723,7 @@
 <translation id="604001903249547235">የክላውድ ምትኬ</translation>
 <translation id="6040143037577758943">ዝጋ</translation>
 <translation id="604124094241169006">ራስ-ሰር</translation>
+<translation id="6041935588605837913">10</translation>
 <translation id="6042308850641462728">ተጨማሪ</translation>
 <translation id="604257181445267932">Smart Lock Google ላይ ያስቀመጡትን የይለፍ ቃል በመጠቀም በፍጥነት ወደ መተግበሪዎች እና ጣቢያዎች እንዲገቡ ያግዘዎታል።</translation>
 <translation id="6043317578411397101"><ph name="APP_NAME" /> አንድ የChrome ትር ለ<ph name="TAB_NAME" /> እያጋራ ነው።</translation>
@@ -3657,6 +3743,7 @@
 <translation id="6062697480277116433">የተንቀሳቃሽ ስልክ ውሂብ በመጠቀም ላይ ነዎት</translation>
 <translation id="6065289257230303064">የሰርቲፊኬት ርዕስ የማውጫ አይነታዎች</translation>
 <translation id="6071181508177083058">የይለፍ ቃል ያረጋግጡ</translation>
+<translation id="6073903501322152803">የተደራሽነት ባህሪያትን ያክሉ</translation>
 <translation id="6074825444536523002">Google ቅጽ</translation>
 <translation id="6075731018162044558">ውይ!  ስርዓቱ የዚህ መሣሪያ የረጅም ጊዜ ኤ ፒ አይ መዳረሻ ማስመሰያ ማግኘት አልቻለም።</translation>
 <translation id="6075880972317537864">በ<ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ላይ ያሉ አጥቂዎች መረጃዎን ለመስረቅ (ለምሳሌ፦ የይለፍ ቃላት፣ መልዕክቶች ወይም ክሬዲት ካርዶች) እርስዎን ለማታለል ሊሞክሩ ይችላሉ።</translation>
@@ -3691,7 +3778,6 @@
 <translation id="6110466548232134880">የ<ph name="ORGANIZATION" /> ማንነት <ph name="LOCALITY" /> ላይ በ<ph name="ISSUER" />ተረጋግጧል። የሚሰራ የዕውቅና ማረጋገጫ መረጃ በአገልጋዩ ተሰጥቷል።</translation>
 <translation id="6111770213269631447">በቋንቋ ፊደል መጻፍ (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">በነባሪነት የተፈቀደ</translation>
-<translation id="6112929985131461002">ይህ መሣሪያ የምርመራ እና የአጠቃቀም ውሂብ በራስ-ሰር ወደ Google ይልካል። ይህ <ph name="BEGIN_LINK1" />ቅንብር<ph name="END_LINK1" /> በእርስዎ አስተዳዳሪ ተፈጻሚ ይሆናል። <ph name="BEGIN_LINK2" />የበለጠ ለመረዳት<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">የቋንቋ እና ግቤት ቅንብሮችን ይቀይሩ</translation>
 <translation id="6120205520491252677">ይህን ገጽ የመነሻ ገጹ ላይ ይሰኩት...</translation>
 <translation id="6122081475643980456">የበይነመረብ ግንኙነትዎ ቁጥጥር እየተደረገበት ነው</translation>
@@ -3713,8 +3799,10 @@
 <translation id="6143186082490678276">እገዛ ያግኙ</translation>
 <translation id="6144697279259829572">{NUM_ITEMS,plural, =1{ይህ ቢያንስ $1 ንጥል ከዚህ መሣሪያ ይሰርዛል።}one{ይህ ቢያንስ $1 ንጥሎችን ከዚህ መሣሪያ ይሰርዛል።}other{ይህ ቢያንስ $1 ንጥሎችን ከዚህ መሣሪያ ይሰርዛል።}}</translation>
 <translation id="6144890426075165477">በአሁኑ ጊዜ <ph name="PRODUCT_NAME" /> መነሻ አሳሽዎ አየደለም።</translation>
+<translation id="6145860855437952742">በአጠቃላይ እይታ ሁነታ ውስጥ የመስኮት ራስጌዎችን ለመደበቅ ጭንብሎችን መጠቀም የሚችሉ እና ሞለል ያሉ ጥጎችን መጠቀም የሚችሉ የመስኮቶች ከፍተኛ ብዛት።</translation>
 <translation id="6147020289383635445">የህትመት ቅድመ-እይታ አልተሳካም።</translation>
 <translation id="614998064310228828">የመሣሪያ ሞዴል፦</translation>
+<translation id="6150555451039504280">ሰብስብ/ዘርጋ</translation>
 <translation id="6150853954427645995">ይህን ፋይል ከመስመር ውጪ ለመጠቀም መስመር ላይ ተመልሰው ይሂዱ፣ ፋይሉን በቀኝ ጠቅ ያድርጉትና የ<ph name="OFFLINE_CHECKBOX_NAME" /> አማራጩን ይምረጡ።</translation>
 <translation id="6151323131516309312"><ph name="SITE_NAME" />ን ለመፈለግ <ph name="SEARCH_KEY" /> ይጫኑ</translation>
 <translation id="6154697846084421647">በአሁኑ ጊዜ ገብተዋል</translation>
@@ -3812,6 +3900,7 @@
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{በእርስዎ አውታረ መረብ ላይ ያለ አዲስ አታሚ}one{በእርስዎ አውታረ መረብ ላይ ያሉ አዲስ አታሚዎች}other{በእርስዎ አውታረ መረብ ላይ ያሉ አዲስ አታሚዎች}}</translation>
 <translation id="6285395082104474418">የሁኔታ ትሪው የአሁኑን የእርስዎ አውታረ መረብ፣ ባትሪ እና ሌሎች ነገሮች ሁኔታ ያሳየዎታል።</translation>
 <translation id="6286684120317096255">የውሂብ አጠቃቀም በመለካት ላይ ነው</translation>
+<translation id="6286708577777130801">የተቀመጡ የይለፍ ቃላት ዝርዝሮች</translation>
 <translation id="6287852322318138013">ይህን ፋይል የሚከፍቱበት መተግበሪያ ይምረጡ</translation>
 <translation id="6288919040208869552">ተኪ ከተዋቀረ አብዛኛው ጊዜ ከተለዩ ተያዥ መግቢያዎች የመጡ ፈቀዳዎችን ይከለክላል። ይህ ዕልባት በአዲስ መስኮት ውስጥ የተኪ ቅንብሮችን ችላ የሚል የተያዥ መግቢያ ፈቀዳ መገናኛ መክፈትን ያነቃል።</translation>
 <translation id="6290556621549272952">በእርስዎ ቴሌቪዥን ወይም በሌሎች መሣሪያዎች ላይ ከChromium የመጡ ይዘቶችን ለማሳየት ይህን ባህሪ መጠቀም ይችላሉ።</translation>
@@ -3853,6 +3942,7 @@
 <translation id="6353618411602605519">የክሮሺያኛ ቁልፍ ሰሌዳ</translation>
 <translation id="6356936121715252359">የAdobe Flash Player ማከማቺያ ቅንብሮች …</translation>
 <translation id="6357619544108132570">እንኳን ወደ የ<ph name="SHORT_PRODUCT_NAME" /> ቤተሰብ በደህና መጡ። ይሄ የተለመደው ኮምፒውተር አይደለም።</translation>
+<translation id="63617602971594377">በድር ላይ የክፍያዎችን ኤፒአይ ያንቁ</translation>
 <translation id="6361850914223837199">የስህተት ዝርዝሮች፦</translation>
 <translation id="6362853299801475928">&amp;ችግር ሪፖርት አድርግ...</translation>
 <translation id="636343209757971102">IPv6 አድራሻ፦</translation>
@@ -3888,6 +3978,7 @@
 <translation id="6410063390789552572">የአውታረ መረብ ላይብረሪን መዳረስ አልተቻለም</translation>
 <translation id="6410257289063177456">የምስል ፋይሎች</translation>
 <translation id="6410328738210026208">ሰርጥ ቀይር እና Powerwash</translation>
+<translation id="6410668567036790476">የፍለጋ ፕሮግራም ያክሉ</translation>
 <translation id="641105183165925463">$1 ሜባ</translation>
 <translation id="6412931879992742813">አዲስ ስውር መስኮት</translation>
 <translation id="6418160186546245112">ወደ ቀዳሚው የተጫነው የ<ph name="IDS_SHORT_PRODUCT_NAME" /> ስሪት በማድኸር ላይ</translation>
@@ -3920,14 +4011,15 @@
 <translation id="6443783728907198276">ሲነቃ፣ በWebRTC የተፈጠሩ የስታን መልዕክቶች ምንጩን አርዕስት ይይዛሉ።</translation>
 <translation id="6444070574980481588">ቀን እና ሰዓት ያዘጋጁ</translation>
 <translation id="6445450263907939268">እነዚህን ለውጦች ካልፈለጓቸው ቀዳሚዎቹ ቅንብሮችዎን ወደነበሩበት መመለስ ይችላሉ።</translation>
+<translation id="6447388538018752757">በ2ል ሸራው ውስጥ እየተጠሩ ባሉ የስዕል ክወናዎች አይነቶች ላይ በመመስረት አፈጻጸምን ለማትባት የተለዋዋጭ ግራፊክስ ምስል ስራ ቧንቧ ቅየራን ያነቃል።</translation>
 <translation id="6447842834002726250">ኩኪዎች</translation>
 <translation id="6449285849137521213">የ«<ph name="EXTENSION_NAME" />» መተግበሪያው ታክሏል።</translation>
 <translation id="6450876761651513209">ከግላዊነት ጋር የሚዛመዱ ቅንብሮችዎን ይቀይራል</translation>
+<translation id="6451180435462401570">የደመና ሕትመት መሣሪያዎችን ያስተዳድሩ</translation>
 <translation id="6451650035642342749">ራስ-ከፋች ቅንብሮችን አጽዳ</translation>
 <translation id="6452181791372256707">አይቀበሉ</translation>
 <translation id="6454421252317455908">የቻይንኛ ግቤት ስልት (ፈጣን)</translation>
 <translation id="6455348477571378046">የእውቅና ማረጋገጫ አይነት፦</translation>
-<translation id="6456234919706689841">የእርስዎ አስተዳዳሪ የምርመራ እና የአጠቃቀም ውሂብን ወደ Google ለመላክ መመረጥ ይችላል። ይህን <ph name="BEGIN_LINK1" />ቅንብር<ph name="END_LINK1" /> እዚህ ላይ መመልከት ይችላሉ። <ph name="BEGIN_LINK2" />የበለጠ ለመረዳት<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">ጃቫስክሪፕትን ማገድ ቀጥል</translation>
 <translation id="6458308652667395253">JavaScript እገዳን አቀናብር…</translation>
 <translation id="6459488832681039634">ለማግኘት የተመረጡትን ተጠቀም</translation>
@@ -3981,10 +4073,12 @@
 <translation id="6526654154229718724">ትቶ ለመውጣት ተጠቃሚዎች Escን እንዲጫኑ የሚጠይቅ የቁልፍ ሰሌዳ መቆለፊያ ሁነታ ያለው የሙከራ ሙሉ ማያ ገጽ።</translation>
 <translation id="6527303717912515753">አጋራ</translation>
 <translation id="6528546217685656218">የዚህ ደንበኛ የዕውቅና ማረጋገጫ የሆነው የግል ቁልፍ ይጎድላል ወይም አይሰራም።</translation>
+<translation id="652948702951888897">የChrome ታሪክ</translation>
 <translation id="653019979737152879"><ph name="FILE_NAME" />ን በማመሳሰል ላይ...</translation>
 <translation id="6534583978616527129">ግንኙነቱን አስጀምር</translation>
 <translation id="654039047105555694"><ph name="BEGIN_BOLD" />ማስታወሻ፦<ph name="END_BOLD" /> የውሂብ መሰብሰብ አፈጻጸምን ስለሚቀንስ እያደረጉ ያሉትን ነገር የሚያውቁት ከሆነ ወይም እንዲያነቁ ከተጠየቁ ብቻ ያንቁ።</translation>
 <translation id="654233263479157500">የአሰሳ ስህተቶችን ለመቅረፍ እንዲያግዝ የድር አገልግሎት ይጠቀሙ</translation>
+<translation id="6545665334409411530">የድግግሞሽ ፍጥነት</translation>
 <translation id="6545834809683560467">በአድራሻ አሞሌ ወይም በመተግበሪያ ማስጀመሪያ ሳጥኑ ውስጥ የተተየቡ ፍለጋዎችን እና ዩአርኤሎችን ለማጠናቀቅ የመገመቻ አገልግሎት ይጠቀሙ።</translation>
 <translation id="6546686722964485737">የWiMAX አውታረ መረብ ይቀላቀሉ</translation>
 <translation id="6547316139431024316">ለዚህ ቅጥያ ዳግም አታስጠንቅቅ</translation>
@@ -4055,9 +4149,11 @@
 <translation id="6643016212128521049">አጽዳ</translation>
 <translation id="6644756108386233011">የተቀየሩ የ<ph name="IDS_SHORT_PRODUCT_NAME" /> ቅንብሮች ዳግም ይጀምሩ?</translation>
 <translation id="6647228709620733774">የNetscape ዕውቅና ማረጋገጫ ስልጣን መሻሪያ ዩአርኤል</translation>
+<translation id="6647838571840953560">በአሁኑ ጊዜ በ<ph name="CHANNEL_NAME" /> ላይ</translation>
 <translation id="6649018507441623493">አንዴ ይጠብቁ...</translation>
 <translation id="6649068951642910388">የክፍለ ጊዜ ዳግም መላሹ በይነገጽ በመረጃ አሞሌ ምትክ በአረፋማ መልኩ ይታያል።</translation>
 <translation id="665061930738760572">&amp;በአዲስ መስኮት ክፈት</translation>
+<translation id="6651237644330755633">ድር ጣቢያዎችን ለመለየት ይህን የዕውቅና ማረጋገጫ ይመኑ</translation>
 <translation id="6652975592920847366">የስርዓተ ክወና ዳግም ማግኛ ማህደረ መረጃ ይፍጠሩ</translation>
 <translation id="6653525630739667879">ወደ $1 ማስቀመጥ አልተቻለም። ሁሉም አርትዖቶች በውርዶች አቃፊው ውስጥ በ$2 ይቀመጣሉ።</translation>
 <translation id="6655190889273724601">የገንቢ ሁነት</translation>
@@ -4112,6 +4208,7 @@
 <translation id="6725970970008349185">በገጽ የሚታዩ የእጩዎች ብዛት</translation>
 <translation id="672609503628871915">ምን አዲስ ነገር እንዳለ ይመልከቱ</translation>
 <translation id="6727005317916125192">ቀዳሚ ንጥል</translation>
+<translation id="6727842159866499206">የመስኮት ራስጌዎችን ለመደበቅ ቅርጾችን መጠቀም የሚችሉ በአጠቃላይ ዕይታ ሁነታ ውስጥ ያሉ የመስኮቶች ከፍተኛ ብዛት።</translation>
 <translation id="6731320427842222405">ይሄ ጥቂት ደቂቃዎችን ሊወስደ ይችላል</translation>
 <translation id="6731638353631257659">V8 መሸጎጫ ሁነታ።</translation>
 <translation id="6732586201820838268">ከስልክዎ ጋር ግንኙነት መመስረት አልተቻለም። የበራ እና በቅርብ ርቀት ያለ ተኳሃኝ የሆነ የAndroid ስልክ እየተጠቀሙ መሆንዎን ያረጋግጡ። &lt;a&gt;ተጨማሪ ለመረዳት&lt;/a&gt;</translation>
@@ -4137,6 +4234,7 @@
 <translation id="6769712124046837540">አታሚን በማከል ላይ...</translation>
 <translation id="6771503742377376720">የእውቅና ማረጋገጫ ባለስልጣን ነው</translation>
 <translation id="6773575010135450071">ተጨማሪ እርምጃዎች...</translation>
+<translation id="677965093459947883">በጣም ትንሽ</translation>
 <translation id="6780439250949340171">ሌሎች ቅንብሮችን ያቀናብሩ</translation>
 <translation id="6786747875388722282">ቅጥያዎች</translation>
 <translation id="6787839852456839824">የቁልፍ ሰሌዳ አቋራጮች</translation>
@@ -4160,6 +4258,7 @@
 <translation id="6815353853907306610"><ph name="IDS_SHORT_PRODUCT_NAME" /> የእርስዎ አሳሽ ቅንብሮች እርስዎ ሳያውቁ ተቀይረው ሊሆኑ እንደሚችሉ ተስተውሏል። ወደ የመጀመሪያ ነባሪዎቻቸው ዳግም ሊያስጀምሯቸው ይፈልጋሉ?</translation>
 <translation id="6815551780062710681">አርትዕ</translation>
 <translation id="6817358880000653228">የዚህ ጣቢያ የተቀመጡ የይለፍ ቃሎች፦</translation>
+<translation id="6820008762872335722">ለመጠየቅ ዳግም አስጀምር</translation>
 <translation id="6820687829547641339">Gzip የታመቀ የtar ማህደር</translation>
 <translation id="682123305478866682">ዴስክቶፕ ውሰድ</translation>
 <translation id="6823506025919456619">የእርስዎን መሣሪያዎች ለማየት በመለያ ወደ የእርስዎ Chrome መግባት አለብዎት</translation>
@@ -4179,7 +4278,9 @@
 <translation id="6833901631330113163">ደቡብ ዩሮፕያን</translation>
 <translation id="683526731807555621">አዲስ የፍለጋ ፕሮግራም አክል</translation>
 <translation id="6835762382653651563">የእርስዎን <ph name="DEVICE_TYPE" /> ለማዘመን እባክዎ ከበይነመረብ ጋር ይገናኙ።</translation>
+<translation id="6839158130869314728">ማሳያዎችን አንጸባርቅ</translation>
 <translation id="6839225236531462745">የእውቅና ማረጋገጫ ስረዛ ስህተት</translation>
+<translation id="6840155290835956714">ከመላክ በፊት ጠይቅ</translation>
 <translation id="6840184929775541289">የእውቅና ማረጋገጫ ባለስልጣን አይደለም</translation>
 <translation id="6840313690797192085">$1 ፔባ</translation>
 <translation id="6841186874966388268">ስህተቶች</translation>
@@ -4189,6 +4290,7 @@
 <translation id="6847758263950452722">ገጽ እንደ ኤም ኤች ቲ ኤም ኤል አስቀምጥ</translation>
 <translation id="6853388645642883916">ማዘመኛ እያንቀላፋ ነው</translation>
 <translation id="68541483639528434">ሌሎች ትሮችን ዝጋ</translation>
+<translation id="6855099371444560844">መሣሪያ ያክሉ</translation>
 <translation id="6856701878604560493">የመስመር ውጭ ዕልባቶችን አንቃ</translation>
 <translation id="6860097299815761905">የተኪ ቅንብሮች...</translation>
 <translation id="6860427144121307915">በትር ውስጥ ክፈት</translation>
@@ -4270,11 +4372,13 @@
 <translation id="6980956047710795611">ሁሉንም የChrome ስርዓተ ክወና ውሂብ ወደ አዲሱ የይለፍ ቃል ያዛውሩ
 (ቀዳሚው የይለፍ ቃል ያስፈልገዋል)</translation>
 <translation id="6981982820502123353">ተደራሽነት</translation>
+<translation id="6981992744085917617">ወደ መለያዎ ተመልሰው ለመግባት ለመጠቀም የሚፈልጉትን ዘዴ ይምረጡ፦</translation>
 <translation id="6982896539684144327">ከ<ph name="VENDOR_NAME" /> ላይ ማተሚያ ተፈልጎ ተገኝቷል</translation>
 <translation id="6983783921975806247">የተመዘገበ OID</translation>
 <translation id="6983991971286645866">ሁሉም አርትዖቶች ወደ $1 ይቀመጣሉ።</translation>
 <translation id="6985235333261347343">Microsoft Key Recovery Agent</translation>
 <translation id="6985276906761169321">መታወቂያ፦</translation>
+<translation id="6985607387932385770">አታሚዎች</translation>
 <translation id="6986605181115043220">ውይ፣ ማመሳሰል መስራት አቁሟል። <ph name="BEGIN_LINK" />ተጨማሪ ለመረዳት<ph name="END_LINK" /></translation>
 <translation id="6989294135336900804">ምንም የተሰመሩ ትሮች የሉም</translation>
 <translation id="6990081529015358884">ቦታ አልቆዎብዎታል</translation>
@@ -4297,6 +4401,7 @@
 <translation id="7006844981395428048">$1 ድምጽ</translation>
 <translation id="7008270479623533562">ይህን ቅጥያ ማሄድ እንዲቻል ገጹን ማደስ አለብዎት። በቅጥያ አዶው ላይ በቀኝ-ጠቅ በማድረግ በዚህ ጣቢያ ላይ ይህን ቅጥያ በራስ-ስር ማስሄድ ይችላሉ።</translation>
 <translation id="7009045250432250765">በአንዲት-ጠቅታ ራስ-ሙላ</translation>
+<translation id="7009420427128923703">ጭምብሎችን መጠቀም የሚችሉ በአጠቃላይ ዕይታ ውስጥ ያሉ የመስኮቶች ከፍተኛ ብዛት።</translation>
 <translation id="7010160495478792664">ሲገኝ በሃርድዌር የተጣደፈ የቪዲዮ ኮድ መፍታት።</translation>
 <translation id="7010400591230614821">ቆፍጠን ያለ የትር ማስለቀቂያ ስትራቴጂ</translation>
 <translation id="701080569351381435">ሶርስ አሳይ</translation>
@@ -4342,6 +4447,7 @@
 <translation id="7061692898138851896">የይለፍ ቃልን በራስ ሰር አስቀምጥ</translation>
 <translation id="7062222374113411376">በቅርቡ የተዘጉ ጣቢያዎች ውሂብን መላክ እና መቀበል እንዲጨርሱ ፍቀድ (የሚመከር)</translation>
 <translation id="7063129466199351735">አቋራጮች በመስራት ላይ...</translation>
+<translation id="7063957500469387217">በGoogle ደመና ህትመት ውስጥ አታሚዎችን ያዋቅሩ ወይም ያቀናብሩ።</translation>
 <translation id="7065223852455347715">ይህ መሣሪያ የድርጅት ምዝገባን በሚከላከል ሁነታ ተቆልፏል። መሣሪያውን ማስመዘገብ ከፈለጉ በመጀመሪያ ወደ የጠፋ መሣሪያ ማግኛ መሄድ ያስፈልግዎታል።</translation>
 <translation id="7065534935986314333">ስለስርዓቱ</translation>
 <translation id="7066944511817949584">ከ«<ph name="DEVICE_NAME" />» ጋር መገናኘት አልተቻለም።</translation>
@@ -4404,6 +4510,7 @@
 <translation id="715118844758971915">አይነታቸው የሚታወቁ አታሚዎች</translation>
 <translation id="7154130902455071009">የመጀመሪያ ገጽዎን ወደሚከተለው ይቀይሩ፦ <ph name="START_PAGE" /></translation>
 <translation id="715487527529576698">የመጀመሪያ ቻይንኛ ሁነታ ቀላል ቻይንኛ ነው</translation>
+<translation id="7155171745945906037">ነባር ፎቶ ከካሜራ ወይም ከፋይል</translation>
 <translation id="715568033737470079">በWin32k መቆለፊያ ማጠሪያ መመሪያ ውስጥ የሚያሄዱት የPPAPI ተሰኪዎችን ይግለጹ (Windows 10 እና ከዚያ በላይ ብቻ)።</translation>
 <translation id="7156235233373189579">ይህ ፋይል የWindows ሶፍትዌር ለሚጠቀም ተኮ ነው የተቀየሰው። ይሄ Chrome OSን ከሚያሄደው መሣሪያዎ ጋር ተኳሃኝ አይደለም። ተገቢ የሆነ ምትክ መተግበሪያ ለማግኘት እባክዎ <ph name="BEGIN_LINK" />የChrome ድር መደብሩን<ph name="END_LINK" /> ይፈልጉ።<ph name="BEGIN_LINK_HELP" />ተጨማሪ ለመረዳት<ph name="END_LINK_HELP" /></translation>
 <translation id="7157063064925785854">ቀጥልን ጠቅ በማድረግ  በ<ph name="LEGAL_DOC_LINK_TEXT_1" />፣ <ph name="LEGAL_DOC_LINK_TEXT_2" />፣ <ph name="LEGAL_DOC_LINK_TEXT_3" /> እና <ph name="LEGAL_DOC_LINK_TEXT_4" /> ይስማማሉ።</translation>
@@ -4420,6 +4527,7 @@
 <translation id="7175353351958621980">የተጫነው ከ፦</translation>
 <translation id="7180611975245234373">አድስ</translation>
 <translation id="7180865173735832675">አብጅ</translation>
+<translation id="7185078796915954712">TLS 1.3</translation>
 <translation id="7185690883425432021">tabstrip በቁልል ሁነታ ውስጥ በሚሆንበት ጊዜ ንቁ ያልሆኑ ትሮችን የዝጋ አዝራሮች ይደብቃል።</translation>
 <translation id="7186088072322679094">በመሣሪያ አሞሌ ውስጥ አቆይ</translation>
 <translation id="719009910964971313">የአሜሪካ Dvorak ፕሮግራመር ቁልፍ ሰሌዳ</translation>
@@ -4459,6 +4567,8 @@
 <translation id="7240120331469437312">የሰርቲፊኬት ርዕስ ተለዋጭ ስም</translation>
 <translation id="7241389281993241388">የደንበኛ እውቅና ማረጋገጫውን ለማስመጣት እባክዎ ወደ <ph name="TOKEN_NAME" /> ይግቡ።</translation>
 <translation id="7243055093079293866">በአዲስ ትር ላይ «Ok Google» እና google.com ይበሉ</translation>
+<translation id="7243632151880336635">አጽዳና ዘግተህ ውጣ</translation>
+<translation id="7245628041916450754"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (ምርጥ)</translation>
 <translation id="724691107663265825">ፊት ያለው ጣቢያ ተንኮል-አዘል ዌር አለው</translation>
 <translation id="725109152065019550">ይቅርታ፣ አስተዳዳሪዎ በመለያዎ ላይ ውጫዊ ማከማቻን አሰናክሏል።</translation>
 <translation id="7252661675567922360">አትጫን</translation>
@@ -4472,7 +4582,9 @@
 <translation id="7262004276116528033">ይህ የመለያ መግቢያ አገልግሎት በ<ph name="SAML_DOMAIN" /> የሚስተናገድ ነው</translation>
 <translation id="7262221505565121">በማጠሪያ ውስጥ ያልገባ ተሰኪ መዳረሻ ልዩ ሁኔታዎች</translation>
 <translation id="7264275118036872269">የብሉቱዝ መሣሪያ ማግኛ መጀመር አልተቻለም።</translation>
+<translation id="7264454014834869122">ከChrome ድር መደብር ውስጥ ይምረጡ</translation>
 <translation id="726502072182862130">የGoogle መገለጫ ስም እና አዶ</translation>
+<translation id="7267186368513450821">5</translation>
 <translation id="7268365133021434339">ትሮችን ዝጋ</translation>
 <translation id="7268659760406822741">የሚገኙ አገልግሎቶች</translation>
 <translation id="7273110280511444812">ለመጨረሻ ጊዜ የተያያዘው በ<ph name="DATE" /> ላይ</translation>
@@ -4489,6 +4601,7 @@
 <translation id="7287143125007575591">መዳረሻ ተክልክሏል።</translation>
 <translation id="7288592446024861651">የእርስዎ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች ከGoogle መለያዎ ጋር ይሠምራሉ፣ በዚህም በሁሉም መሣሪያዎችዎ ላይ ሊጠቀሙባቸው ይችላሉ። በ<ph name="BEGIN_LINK" /> ውስጥ ምን እንደሚሠምር ይቆጣጠሩ።</translation>
 <translation id="7288676996127329262"><ph name="HORIZONTAL_DPI" />x<ph name="VERTICAL_DPI" /> dpi</translation>
+<translation id="7289225569524511578">የልጣፍ መተግበሪያውን ክፈት</translation>
 <translation id="7290242001003353852">ይህ በ<ph name="SAML_DOMAIN" /> የሚስተናገድ የመለያ መግቢያ አገልግሎት የእርስዎን ካሜራ እየደረሰበት ነው።</translation>
 <translation id="7290594223351252791">ምዝገባ ያረጋግጡ</translation>
 <translation id="7295019613773647480">ክትትል የሚደረግባቸው ተጠቃሚዎችን ያንቁ</translation>
@@ -4527,6 +4640,7 @@
 <translation id="7347751611463936647">ይህንን ቅጥያ ለመጠቀም «<ph name="EXTENSION_KEYWORD" />» ብለው፣ ከዚያ TAB፣ ከዚያ ትዕዛዝዎን ወይም ፍለጋዎን ይተይቡ።</translation>
 <translation id="7348093485538360975">የታይታ የቁልፍ ሰሌዳ</translation>
 <translation id="7348749398828259943">የአሜሪካ ዎርክማን አለምአቀፍ ቁልፍ ሰሌዳ</translation>
+<translation id="7352495173098919663">አርትዕ</translation>
 <translation id="7352651011704765696">የሆነ ችግር ተፈጥሯል</translation>
 <translation id="7353651168734309780"><ph name="EXTENSION_NAME" /> አዲስ ፍቃዶችን ይፈልጋል</translation>
 <translation id="7361039089383199231">$1 ባይት</translation>
@@ -4638,6 +4752,7 @@
 <translation id="749028671485790643">ሰው <ph name="VALUE" /></translation>
 <translation id="7491962110804786152">TAB</translation>
 <translation id="7493386493263658176">የ<ph name="EXTENSION_NAME" /> ቅጥያ እንደ የይለፍ ቃላት እና የክሬዲት ካርድ ቁጥሮች ያለ የሚተይቡትን ጽሑፍ ሁሉ ሊሰበስብ ይችላል። ይህን ቅጥያ መጠቀም ይፈልጋሉ?</translation>
+<translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="7495424355577885780">ከነቃ፣ አንድ ችግር ሪፖርት ማድረግ የቁሳዊ ንድፍ ግብረመልስ በይነገጹን ይጭነዋል።</translation>
 <translation id="7495778526395737099">የይለፍ ቃልዎን ረስተውታል?</translation>
 <translation id="7503191893372251637">የNetscape ሰርቲፊኬት አይነት</translation>
@@ -4709,7 +4824,6 @@
 <translation id="7587108133605326224">ባልቲክኛ</translation>
 <translation id="7589461650300748890">ኸረ፣ እዚ ጋር። ጠንቀቅ ይበሉ።</translation>
 <translation id="7589661784326793847">አንድ ሰከንድ ብቻ ይጠብቁ</translation>
-<translation id="7593635197364225277">የPlay መተግበሪያ ውሂብ ምትኬ ያስቀምጡና በራስ-ሰር Google Drive ላይ ወደነበረበት ይመልሱ። ይህን በማንኛውም ጊዜ በAndroid ቅንብሮች ውስጥ መቀየር ይችላሉ። <ph name="BEGIN_LINK1" />የበለጠ ለመረዳት<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (ስህተት ኮድ <ph name="ERROR_CODE" />)።</translation>
 <translation id="7596831438341298034">እሺ፣ አስመጣ</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" />ን በጭራሽ አትተርጉም</translation>
@@ -4755,6 +4869,7 @@
 <translation id="7654941827281939388">ይህ መለያ አስቀድሞ በዚህ ኮምፒውተር ላይ ስራ ላይ ውሏል።</translation>
 <translation id="7658239707568436148">ይቅር</translation>
 <translation id="7659584679870740384">ይህን መሣሪያ ለመጠቀም ስልጣን አልተሰጠዎትም። የመግባት ፍቃድ ለማግኘት አስተዳዳሪውን ያነጋግሩ።</translation>
+<translation id="7661259717474717992">ጣቢያዎች የኩኪ ውሂብ እንዲስቀምጡ እና እንዲያነብቡ ፍቀድ</translation>
 <translation id="7663719505383602579">ተቀባይ፦ <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7664620655576155379">የማይደገፍ የብሉቱዝ መሣሪያ፦ «<ph name="DEVICE_NAME" />»።</translation>
 <translation id="7665369617277396874">መለያ ያክሉ</translation>
@@ -4784,6 +4899,7 @@
 <translation id="7709152031285164251">አልተሳካም - <ph name="INTERRUPT_REASON" /></translation>
 <translation id="7709980197120276510">ቀጥልን ጠቅ በማድረግ  በ<ph name="LEGAL_DOC_LINK_TEXT_1" />፣ <ph name="LEGAL_DOC_LINK_TEXT_2" />፣ <ph name="LEGAL_DOC_LINK_TEXT_3" />፣ <ph name="LEGAL_DOC_LINK_TEXT_4" /> እና <ph name="LEGAL_DOC_LINK_TEXT_5" /> ይስማማሉ።</translation>
 <translation id="7712140766624186755">ጠይቅ በመመሪያ</translation>
+<translation id="7712196439824268605">ይህ ፒን ለመገመት ቀላል ነው፦</translation>
 <translation id="7713320380037170544">ሁሉም ጣቢያዎች ለሚመለከተው ስርዓት የተወሰኑ መልዕክቶችን MIDI መሳሪያዎችን ለመድረስ እንዲጠቀሙ ፍቀድ</translation>
 <translation id="7714464543167945231">ሰርቲፊኬት</translation>
 <translation id="7716020873543636594">የአይጤ ጠቋሚው ሲቆም በራስ-ሰር ጠቅ አድርግ</translation>
@@ -4791,6 +4907,8 @@
 <translation id="7716781361494605745">የNetscape እውቅና ማረጋገጫ ባለስልጣን መመሪያ ዩአርኤል</translation>
 <translation id="7716970641886237992">የተቀየረው በ</translation>
 <translation id="7717014941119698257">በማውረድ ላይ፦ <ph name="STATUS" /></translation>
+<translation id="7717845620320228976">ዝማኔዎች ካለ ተመልከት</translation>
+<translation id="7719367874908701697">ገጽ አጉላ</translation>
 <translation id="7719421816612904796">ማሰልጠን ጊዜ አልፎበታል</translation>
 <translation id="771953673318695590">QA</translation>
 <translation id="7720375555307821262">ይህን ሰው ለመከታተል <ph name="BEGIN_LINK" />ወደ Chrome ይግቡ<ph name="END_LINK" />።</translation>
@@ -4803,6 +4921,7 @@
 <translation id="7742762435724633909">የአቅራቢ ስም፦</translation>
 <translation id="774465434535803574">የጥቅል ቅጥያ ስህተት</translation>
 <translation id="7748528009589593815">ቀዳሚ ትር</translation>
+<translation id="7748734060566306235">የሥዕል መጠንን እና አሰላለፍን ለማስተካከል የቀስት ቁልፎችን ይጠቀሙ።</translation>
 <translation id="7751260505918304024">ሁሉንም አሳይ</translation>
 <translation id="7754704193130578113">እያንዳንዱ ፋይል ከመውረዱ በፊት የት እንደሚቀመጥ ጠይቅ</translation>
 <translation id="775622227562445982">ፈጣን የትር/መስኮት መዝጋት</translation>
@@ -4839,6 +4958,7 @@
 <translation id="7791543448312431591">አክል</translation>
 <translation id="7792012425874949788">መግባት ላይ የሆነ ችግር ተፈጥሯል</translation>
 <translation id="7792388396321542707">ማጋራት አቁም</translation>
+<translation id="7792744925237334808">የሦስተኛ ወገን የድርጣቢያዎች የኩኪ ውሂብን እንዳያስቀምጡ እና እንዳያነብቡ ከልክል።</translation>
 <translation id="7794058097940213561">ለመሣሪያው ቅርጸት ይስሩለት</translation>
 <translation id="7799329977874311193">የኤች ቲ ኤም ኤል ሰነድ</translation>
 <translation id="7800518121066352902">በሰዓት መዞሪያ አቅጣጫ &amp;ተቃራኒ አሽከርክር</translation>
@@ -4873,6 +4993,7 @@
 <translation id="7845849068167576533">ይህን ጣቢያ ከዚህ በፊት የጎበኙት ቢሆኑም እንኳ አሁን አደጋ አለው። Google የጥንቃቄ አሰሳ በቅርብ ጊዜ <ph name="SITE" /> ላይ <ph name="BEGIN_LINK" />ተንኮል-አዘል ዌር<ph name="END_LINK" /> አግኝቷል። በመደበኛ ጊዜ ደህንነታቸው የተጠበቁ ድር ጣቢያዎች አንዳንድ ጊዜ በተንኮል-አዘል ዌር ሊጠቁ ይችላሉ። ተንኮል-አዘል ይዘቱ የሚታወቅ የተንኮል-አዘል ዌር አሰራጭ ከሆነው <ph name="SUBRESOURCE_HOST" /> ነው የመጣው።</translation>
 <translation id="7845920762538502375"><ph name="PRODUCT_NAME" /> ከአመሳሳይ አገልጋዩ ጋር መገናኘት ስላልቻለ ውሂብዎን ማመሳሰል አይችልም። ዳግም በመሞከር ላይ...</translation>
 <translation id="7846076177841592234">ምርጫ ሰርዝ</translation>
+<translation id="7846634333498149051">የቁልፍ ሰሌዳ</translation>
 <translation id="7847212883280406910">ወደ <ph name="IDS_SHORT_PRODUCT_OS_NAME" /> ለመቀየር Ctrl + Alt + S ይጫኑ</translation>
 <translation id="7848981435749029886">የካሜራዎ መዳረሻ በአስተዳዳሪዎ ቁጥጥር ነው ያለው።</translation>
 <translation id="7849264908733290972">&amp;ምስል በአዲስ ትር ውስጥ ክፈት</translation>
@@ -4919,6 +5040,7 @@
 <translation id="7902482560616980555">FontCache ማመጣጠን</translation>
 <translation id="7903128267494448252">ይህን ሰው ሰርዝ</translation>
 <translation id="7903345046358933331">ገጹ ምላሽ የማይሰጥ ሆኗል። ምላሽ እስከሚሰጥ ሊጠብቁት ወይም ሊዘጉት ይችላሉ።</translation>
+<translation id="7903742244674067440">የእነዚህን ዕውቅና ማረጋገጫ ባለሥልጣናት የሚለዩ የዕውቅና ማረጋገጫዎች በፋይሉ ላይ አሉዎት</translation>
 <translation id="7903925330883316394">ፍጆታ፦ <ph name="UTILITY_TYPE" /></translation>
 <translation id="7903984238293908205">ካታካና</translation>
 <translation id="7904094684485781019">የዚህ መለያ አስተዳዳሪ ባለብዙ መለያ መግባትን ከልክሏል።</translation>
@@ -4966,6 +5088,7 @@
 <translation id="7973320858902175766">ክፍለ አካል ለጣፊ</translation>
 <translation id="7974067550340408553">Smart Lock የእርስዎን <ph name="DEVICE_TYPE" /> በከፈተ ቁጥር በስልክዎ ላይ ማሳወቂያ ያግኙ።</translation>
 <translation id="7974566588408714340"><ph name="EXTENSIONNAME" />ን መጠቀም እንደገና ይሞክሩ</translation>
+<translation id="7974936243149753750">ትርፍ ቅኝት</translation>
 <translation id="7977551819349545646">Chromeboxን በማዘመን ላይ...</translation>
 <translation id="7978412674231730200">የግል ቁልፍ</translation>
 <translation id="7979036127916589816">የማመሳሰል ስህተት</translation>
@@ -5037,9 +5160,11 @@
 <translation id="8054563304616131773">እባክዎ ትክክለኛ የኢሜይል አድራሻ ያስገቡ</translation>
 <translation id="8054921503121346576">የUSB ቁልፍ ሰሌዳ ተገናኝቷል</translation>
 <translation id="8056430285089645882">ገባኝ፣ ይህን ዳግም አታሳየኝ።</translation>
+<translation id="8058655154417507695">ጊዜው የሚያበቃበት ዓመት</translation>
 <translation id="8059178146866384858">«$1» የሚል ፋይል አስቀድሞ አለ። እባክዎ የተለየ ስም ይምረጡ።</translation>
 <translation id="8059417245945632445">&amp;መሣሪያዎችን መርምር</translation>
 <translation id="8061298200659260393">ማንኛቸውም ጣቢያዎች ተገፍተው የሚመጡ መልዕክቶችን እንዲልኩ አትፍቀድ</translation>
+<translation id="8061820249063924643">ክትትል የሚደረግባቸው ተጠቃሚዎችን አቀናብር</translation>
 <translation id="8063235345342641131">ነባሪ አረንጓዴ አምሳያ</translation>
 <translation id="8064671687106936412">ቁልፍ፦</translation>
 <translation id="806705617346045388">ያልተለመደ ባህሪይ ተገኝቷል</translation>
@@ -5047,7 +5172,9 @@
 <translation id="8069615408251337349">Google ዳመና ህትመት</translation>
 <translation id="8071942001314758122">በቀላሉ ሶስት ጊዜ «Ok Google» ይበሉ</translation>
 <translation id="8072988827236813198">ትሮችን ይሰኩ</translation>
+<translation id="8074127646604999664">በቅርቡ የተዘጉ ጣቢያዎች ውሂብን መላክ እና መቀበል እንዲጨርሱ ፍቀድ</translation>
 <translation id="8079530767338315840">ድገም</translation>
+<translation id="8081705606384362428">የእርስዎን ፒን ይምረጡ</translation>
 <translation id="8083739373364455075">ነጻ 100 ጊባ በGoogle Drive ያግኙ</translation>
 <translation id="8088137642766812908">ይጠንቀቁ፣ ይህ ባህሪ ሊያስቸግር ይችላል</translation>
 <translation id="8089520772729574115">ከ1 ሜባ ያነሰ</translation>
@@ -5200,6 +5327,7 @@
 <translation id="827097179112817503">መነሻ አዝራር አሳይ</translation>
 <translation id="8272443605911821513">በ«ተጨማሪ መሣሪያዎች» ምናሌው ውስጥ ቅጥያዎች የሚለውን ጠቅ በማድረግ ቅጥያዎችዎን ያቀናብሩ።</translation>
 <translation id="8275038454117074363">ከውጭ አስመጣ</translation>
+<translation id="827606011343515871">ምንም የዕውቅና ማረጋገጫዎች የሉዎትም</translation>
 <translation id="8276560076771292512">ባዶ መሸጎጫ እና ደረቅ ዳግም መጫን</translation>
 <translation id="8279388322240498158">የሶራኒ ኩርድኛ በእንግሊዝኛ ላይ የተመሠረተ ቁልፍ ሰሌዳ</translation>
 <translation id="8280151743281770066">የአርሜኒያ ፎነቲክ</translation>
@@ -5220,7 +5348,6 @@
 <translation id="8300607741108698921">የ1-ደቂቃ ማዋቀር</translation>
 <translation id="8303650969500425356">ጃቫስክሪፕት የማያ ገጽ አቀማመጡን ለመቆለፍ ያስችለዋል።</translation>
 <translation id="8303655282093186569">የፒንዪን ግቤት ቅንብሮች</translation>
-<translation id="830424806940379275">ቅጥያዎች ከአሳሽ ከፈፍ ውጭ የሚከፈቱ የፓነል መስኮቶችን እንዲፈጥሩ ይፍቀዱላቸው። በነባሪ ወይም ከተሰናከለ አንድ ፓነል ለመክፈት የሚደረግ ሙከራ በምትኩ ብቅ ባይን ይከፍታል። በዴስክቶፕ ሥርዓተ ክወናዎች ላይ ያሉ ፓነሎች ተቋርጠዋል እና በቅርቡ ይወገዳሉ።</translation>
 <translation id="8306534594034939679">የኤችቲቲፒ ባህሪዎች ሙከራ ለሆነው የተለዋጭ አገልግሎቶች ያንቁ።</translation>
 <translation id="8307376264102990850">ባትሪ በመሙላት ላይ
 ሙሉ እስኪሆን ድረስ ያለውን ጊዜ በማስላት ላይ</translation>
@@ -5245,9 +5372,11 @@
 <translation id="8337399713761067085">በአሁኑ ጊዜ ከመስመር ውጪ ነዎት</translation>
 <translation id="8338952601723052325">የገንቢ ድር ጣቢያ</translation>
 <translation id="8339012082103782726">ጣቢያዎች ማይክሮፎንዎን እንዲደርሱ አይፍቀዱ</translation>
+<translation id="8339059274628563283">በአካባቢው የተከማቸ የ<ph name="SITE" /> ውሂብ</translation>
 <translation id="8342318071240498787">ተመሳሳዩን ስም የያዘ ፋይል ወይም አቃፊ አስቀድሞ አለ።</translation>
 <translation id="834457929814110454">በእርስዎ ደህንነት ላይ የሚያመጣቸውን ስጋቶች ከተረዱ አደገኛ ፕሮግራሞቹ ከመወገዳቸው በፊት <ph name="BEGIN_LINK" />ይህን ጣቢያ መጎብኘት<ph name="END_LINK" /> ይችላሉ።</translation>
 <translation id="8345553596530559351">ከነቃ የchrome://history/ ዩአርኤሉ የቁሳዊ ንድፍ ታሪክ ገጹን ይጭነዋል።</translation>
+<translation id="8347045947573765315">ሁሉም ጣቢያዎች በቅጾች ውስጥ የቁልፍ ማመንጨትን እንዲጠቀሙ ፍቀድ</translation>
 <translation id="8351419472474436977">ይህ ቅጥያ የተኪ ቅንብሮችዎን ተቆጣጥሯል፣ ይህ ማለት መስመር ላይ የሚያደርጉትን ማንኛውም ነገር ሊቀይር፣ ሊሰብር ወይም በድብቅ ሊከታተል ይችላል። ይሄ ለምን እንደተከሰተ እርግጠኛ ካልሆኑ የማይፈልጉት ነገር ሳይሆን አይቀርም።</translation>
 <translation id="8352772353338965963">አንድ መለያ ባለብዙ መለያ መግቢያ ላይ ያክሉ። ሁሉም የተገባባቸው መለያዎች ያለይለፍ ቃል ሊደረስባቸው ይችላሉ፣ ስለዚህ ይህ ባህሪ በታመኑ መለያዎች ላይ ብቻ ነው መጠቀም ያለባቸው።</translation>
 <translation id="8353683614194668312">ይህንን ማድረግ ይችላል፦</translation>
@@ -5332,15 +5461,20 @@
 <translation id="845627346958584683">ጊዜው የሚቃጠልበት ጊዜ</translation>
 <translation id="8456681095658380701">ልክ ያልሆነ ስም</translation>
 <translation id="8457625695411745683">ጥሩ</translation>
+<translation id="8460336040822756677">ዘመናዊ ቁልፍን ለ<ph name="DEVICE_TYPE" /> ካጠፉ ስልክዎን ተጠቅመው የChrome መሣሪያዎችዎን ማስከፈት አይችሉም። የይለፍ ቃልዎን መተየብ ይኖርብዎታል።</translation>
+<translation id="84613761564611563">የአውታረ መረብ ውቅረት በይነገጽ ተጠይቋል፣ እባክዎ ይጠብቁ...</translation>
 <translation id="8461914792118322307">ተኪ</translation>
 <translation id="8463215747450521436">በክትትል ስር ያለው ተጠቃሚ በአስተዳዳሪው ተሰርዞ ወይም ተሰናክሎ ሊሆን ይችላል። ልክ እንደዚህ ተጠቃሚ መግባት ከፈለጉ እባክዎ አስተዳዳሪውን ያግኙ።</translation>
 <translation id="8464132254133862871">ይህ የተጠቃሚ መለያ ለአገልግሎቱ ብቁ አይደለም።</translation>
 <translation id="8464505512337106916">አስፈላጊ የተሰኪ ይዘት አግኝ እና አሂድ (የሚመከር)</translation>
+<translation id="8465252176946159372">ልክ ያልሆነ</translation>
 <translation id="8466234950814670489">የTar ማህደር</translation>
 <translation id="8467473010914675605">የኮሪያኛ ግቤት ስልት</translation>
+<translation id="8468750959626135884">የእርስዎን <ph name="DEVICE_TYPE" /> በAndroid ስልክዎ ይክፈቱት።</translation>
 <translation id="8472623782143987204">የሃርድዌር ደጀን ያለው</translation>
 <translation id="8475313423285172237">በኮምፒውተርዎ ላይ ያለ ሌላ ፕሮግራም Chrome የሚሰራበት መንገድ ሊቀይር የሚችል አንድ ቅጥያ አክሏል።</translation>
 <translation id="8475647382427415476">Google Drive አሁን «<ph name="FILENAME" />» ማስመር አልቻለም። Google Drive ቆይቶ እንደገና ይሞክራል።</translation>
+<translation id="8476195663057048998">አጽዳ እና ዳግም አስጀምር</translation>
 <translation id="8477241577829954800">ተተክቷል</translation>
 <translation id="8477384620836102176">&amp;አጠቃላይ</translation>
 <translation id="8480417584335382321">ገጽ አጉላ፦</translation>
@@ -5372,6 +5506,7 @@
 <translation id="8524066305376229396">የቋሚነት ማከማቻ፦</translation>
 <translation id="8525306231823319788">ሙሉ ማያ ገጽ</translation>
 <translation id="8528962588711550376">በመግባት ላይ.</translation>
+<translation id="8532294913309524834">ቋንቋዎችን በእርስዎ ፍላጎት መሠረት ይደርድሩ።</translation>
 <translation id="8535005006684281994">የNetscape ሰርቲፊኬት የእድሳት ጊዜ URL</translation>
 <translation id="8539727552378197395">አይ (ኤችቲቲፒ ብቻ)</translation>
 <translation id="8543181531796978784"><ph name="BEGIN_ERROR_LINK" />የፈልጎ ማግኘት ችግርን ሪፖርት ማድረግ<ph name="END_ERROR_LINK" />፣ ወይም ደግሞ በእርስዎ ደህንነት ላይ ሊያስከትል የሚችለውን አደጋ ከተረዱ <ph name="BEGIN_LINK" />ይህን ደህንነቱ ያልተጠበቀ ጣቢያ መጎብኘት<ph name="END_LINK" /> ይችላሉ።</translation>
@@ -5386,6 +5521,7 @@
 <translation id="855081842937141170">ትር አጣብቅ</translation>
 <translation id="8551388862522347954">ፍቃዶች</translation>
 <translation id="8551494947769799688">ላትቪያን</translation>
+<translation id="8553342806078037065">ሌሎች ሰዎችን አቀናብር</translation>
 <translation id="855705891482654011">ያልተጠቃለሉ ቅጥያዎችን ጫን</translation>
 <translation id="855773602626431402">በማጠሪያ ያልተቀመጠ ተሰኪ በዚህ ገጽ ላይ እንዳይሄድ ታግዷል።</translation>
 <translation id="8559694214572302298">ምስል ከጽምጽ ጋር አዛምዶ አንባቢ</translation>
@@ -5463,6 +5599,7 @@
 <translation id="8662978096466608964">Chrome የግድግዳ ወረቀቱን ሊያዘጋጅ አይችልም።</translation>
 <translation id="8663099077749055505">ሁልጊዜም ከ<ph name="HOST" /> ላይ በርካታ የራስ ሰር ማውረዶችን አግድ</translation>
 <translation id="8664389313780386848">የፍሬም መነሻ  &amp;አሳይ</translation>
+<translation id="866611985033792019">የኢሜይል ተጠቃሚዎችን ለመለየት ይህን የዕውቅና ማረጋገጫ እመን</translation>
 <translation id="8666678546361132282">እንግሊዝኛ</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> አሁን ሙሉ ማያ ገጽ ነው፣ እናም የመዳፊትዎ ጠቋሚን አሰናክሎታል።</translation>
 <translation id="8667808506758191620">የእርስዎ <ph name="DEVICE_TYPE" /> የተዘመነ ነው።</translation>
@@ -5586,6 +5723,7 @@
 <translation id="8813811964357448561">የወረቀት ሉክ</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="881799181680267069">ሌሎቹን ደብቅ</translation>
+<translation id="8818152010000655963">ልጣፍ</translation>
 <translation id="8818152613617627612">የክፍያ ዝርዝሮች</translation>
 <translation id="8820817407110198400">ዕልባቶች</translation>
 <translation id="8820961991571528294">በመሞከር ላይ</translation>
@@ -5596,8 +5734,10 @@
 <translation id="8828933418460119530">የDNS ስም</translation>
 <translation id="8830796635868321089">የአሁኑ ተኪ ቅንብሮችን ተጠቅሞ የዝማኔ ፍተሻ አልተሳካም። እባክዎ <ph name="PROXY_SETTINGS_LINK_START" />የተኪ ቅንብሮችዎ<ph name="PROXY_SETTINGS_LINK_END" />ን ያስተካክሉ።</translation>
 <translation id="8831623914872394308">የጠቋሚ ቅንብሮች</translation>
+<translation id="8833040047958643283">ድር ጣቢያዎች ምን ይዘት ለእርስዎ ማሳየት እንደሚችሉ እና እርስዎ በሚያስሱበት ጊዜ ምን መረጃ መጠቀም እንደሚችሉ ይቆጣጠሩ</translation>
 <translation id="8837103518490433332"><ph name="PASSWORD_MANAGER_BRAND" /> የእርስዎን የይለፍ ቃል ለ<ph name="ORIGIN" /> እንዲያስቀምጥ ይፈልጋሉ?</translation>
 <translation id="8838770651474809439">ሃምበርገር</translation>
+<translation id="8839157109304700852">Google ዳሽቦርድን ይከፍታል</translation>
 <translation id="8841142799574815336">Inert ምስላዊ መመልከቻ።</translation>
 <translation id="884264119367021077">የመላኪያ አድራሻ</translation>
 <translation id="8845001906332463065">እገዛ ያግኙ</translation>
@@ -5608,11 +5748,13 @@
 <translation id="885381502874625531">የቤላሩስ ቁልፍ ሰሌዳ</translation>
 <translation id="8856844195561710094">የብሉቱዝ መሣሪያን ማግኘት ማቆም አልተቻለም።</translation>
 <translation id="885701979325669005">ማከማቻ</translation>
+<translation id="8858798938034909167">በ<ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> ላይ የይለፍ ቃላትዎን ከማንኛውም መሣሪያ ይድረሱባቸው</translation>
 <translation id="8859057652521303089">ቋንቋዎትን ይምረጡ፦</translation>
 <translation id="8859116917079399781">ይዘት ታግዷል</translation>
 <translation id="8859174528519900719">ንዑስ ክፈፍ፦ <ph name="SUBFRAME_SITE" /></translation>
 <translation id="8860454412039442620">የExcel ተመን ሉህ</translation>
 <translation id="8863489667196658337">የዕልባት መተግበሪያዎችን ለመፍጠር አዲሱን ስርዓት ያነቃል።</translation>
+<translation id="8866013684546696613">ቅርጾችን መጠቀም የሚችሉ በአጠቃላይ ዕይታ ውስጥ ያሉ የመስኮቶች ከፍተኛ ብዛት።</translation>
 <translation id="8866441758832353668">የመሸብለያ መልሕቅ መጣል</translation>
 <translation id="8868245144144497543">የተፈጠረው በ</translation>
 <translation id="8868626022555786497">በጥቅም ላይ</translation>
@@ -5670,6 +5812,7 @@
 <translation id="894360074127026135">የNetscape አለምአቀፍ አወቃቀር</translation>
 <translation id="8944779739948852228">ማተሚያ ጥበቃ ተደርጎለታል</translation>
 <translation id="8944964446326379280"><ph name="APP_NAME" /> አንድ መስኮት ለ<ph name="TAB_NAME" /> እያጋራ ነው።</translation>
+<translation id="8946284507644756416">የእርስዎ <ph name="DEVICE_TYPE" /> በAndroid ስልክዎ ሊከፈት ይችላል።</translation>
 <translation id="8946359700442089734">የማረም ባህሪያት በዚህ የ<ph name="IDS_SHORT_PRODUCT_NAME" /> መሣሪያ ላይ ሙሉ ለሙሉ አልነቁም።</translation>
 <translation id="8946784827990177241">የWebUSB ድጋፍን አንቃ።</translation>
 <translation id="89515141420106838">ለአታሚ አንጻፊዎች የChrome ድር መደብር የሥነ ጥበብ ማዕከልን ያነቃል። መተግበሪያው ከተወሰነ የዩኤስቢ መታወቂያ ጋር ወደ የዩኤስቢ አታሚ ማተምን የሚደግፉ ቅጥያዎችን በChrome ድር መደብር ውስጥ ይፈልጋል።</translation>
@@ -5747,6 +5890,7 @@
 <translation id="9040185888511745258"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ላይ ያሉ አጥቂዎች የአሰሳ ተሞክሮዎን የሚጎዱ ፕሮግራሞችዎን እንዲጭኑ እርስዎን ለማታለል ሊሞክሩ ይችላሉ (ለምሳሌ፦ የመነሻ ገጽዎን በመቀየር ወይም በጎበኟቸው ጣቢያዎች ላይ ተጨማሪ ማስታወቂያዎችን በማሳየት)።</translation>
 <translation id="9040421302519041149">የዚህ አውታረ መረብ መዳረሻ የተጠበቀ ነው።</translation>
 <translation id="9041603713188951722">ቅንብሮችን በአንድ መስኮት ውስጥ አሳይ</translation>
+<translation id="9042893549633094279">ግላዊነት እና ደኅንነት</translation>
 <translation id="904451693890288097">እባክዎ የ«<ph name="DEVICE_NAME" />» ይለፍ ቁልፍ ያስገቡ፦</translation>
 <translation id="9049835026521739061">የሃንጉል ሁነታ</translation>
 <translation id="9050666287014529139">የይለፍ ሐረግ</translation>
@@ -5757,6 +5901,7 @@
 <translation id="9056810968620647706">ምንም ተዛማጆች አልተገኙም።</translation>
 <translation id="9059868303873565140">የሁኔታ ምናሌ</translation>
 <translation id="9064142312330104323">Google የመገለጫ ፎቶ (በመጫን ላይ)</translation>
+<translation id="9064275926664971810">በአንዲት ጠቅታ ራስ-ሙላ ቅጾችን እንዲሞላ ራስ-ሙላን ያንቁ</translation>
 <translation id="9064939804718829769">በማስተላለፍ ላይ...</translation>
 <translation id="9065203028668620118">አርትዕ</translation>
 <translation id="9066075624350113914">አንዳንድ የዚህ PDF ሰነድ ክፍሎች ሊታዩ አይችሉም።</translation>
@@ -5778,6 +5923,8 @@
 <translation id="9088917181875854783">እባክዎ ይህን የይለፍ ቁልፍ በ«<ph name="DEVICE_NAME" />» ላይ መታየቱን ያረጋግጡ፦</translation>
 <translation id="9092426026094675787">ደህንነታቸው ያልተረጋገጡ ምንጮችን ደህንነታቸው ያልተረጋገጡ የሚል ምልክት አድርግበት</translation>
 <translation id="9094033019050270033">የይለፍ ቃል ያዘምኑ</translation>
+<translation id="9094982973264386462">አስወግድ</translation>
+<translation id="9095253524804455615">አስወግድ</translation>
 <translation id="9100765901046053179">የላቁ ቅንብሮች</translation>
 <translation id="910077499156148110">ለአንድ ጣቢያ አንድ የማይመለከተው ያክሉ</translation>
 <translation id="9100825730060086615">የቁልፍ ሰሌዳ አይነት</translation>
@@ -5869,8 +6016,11 @@
 <translation id="9218430445555521422">እንደወረደ አዘጋጀው</translation>
 <translation id="9219103736887031265">ምስሎች</translation>
 <translation id="9220525904950070496">መለያ ያስወግዱ</translation>
+<translation id="9221503095691269353">ፈጣን ማስከፈትን ያዋቅሩ</translation>
 <translation id="923467487918828349">ሁሉንም አሳይ</translation>
+<translation id="927151012416335806">መሣሪያዎን ወደ <ph name="CHANNEL_NAME" /> ሰርጥ በማዘመን ላይ</translation>
 <translation id="930268624053534560">ዝርዝር የጊዜ ማህተሞች</translation>
+<translation id="931068751149008062">የቅርጸ-ቁምፊ ዓይነቶችን እና ምስጠራን ይምረጡ</translation>
 <translation id="932327136139879170">መነሻ</translation>
 <translation id="932508678520956232">ማተም ማስጀመር አልተቻለም።</translation>
 <translation id="936801553271523408">የስርዓት ምርመራ ውሂብ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 85ea8298..06dba2dd 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -34,6 +34,7 @@
 <translation id="1047431265488717055">نسخ ن&amp;ص الرابط</translation>
 <translation id="1047726139967079566">وضع إشارة مرجعية على هذه الصفحة...</translation>
 <translation id="1047956942837015229">جارٍ حذف <ph name="COUNT" /> من العناصر...</translation>
+<translation id="1048286738600630630">إعدادات العرض</translation>
 <translation id="1048597748939794622">تمكين الفرض لجميع الطبقات</translation>
 <translation id="1049795001945932310">إ&amp;عدادات اللغة</translation>
 <translation id="1049926623896334335">‏مستند Word</translation>
@@ -98,6 +99,7 @@
 <translation id="1125520545229165057">‏Dvorak ‏(Hsu)</translation>
 <translation id="1128109161498068552">‏عدم السماح لأي موقع باستخدام الرسائل الحصرية في النظام للدخول إلى أجهزة MIDI</translation>
 <translation id="1128128132059598906">EAP-TTLS</translation>
+<translation id="1128591060186966949">تعديل محرّك البحث</translation>
 <translation id="1128987120443782698">‏تبلغ سعة جهاز التخزين <ph name="DEVICE_CAPACITY" />. الرجاء إدخال بطاقة SD أو رقاقة ذاكرة USB بسعة 4 غيغابايت.</translation>
 <translation id="1132956125173653312">‏تمكين تطبيقات Android على جهاز Chromebook.</translation>
 <translation id="1137135726305341424">‏domContentLoaded وعمليات تحميل كل الموارد بدأت قبل domContentLoaded (الإطار الرئيسي ونفس إطارات iframe الأصلية).</translation>
@@ -107,6 +109,7 @@
 <translation id="1145292499998999162">تم حظر المكوّن الإضافي</translation>
 <translation id="1146204723345436916">‏استيراد الإشارات المرجعية من ملف HTML...</translation>
 <translation id="1148624853678088576">اكتملت المهمة</translation>
+<translation id="1149401351239820326">شهر انتهاء الصلاحية</translation>
 <translation id="1151972924205500581">كلمة المرور مطلوبة</translation>
 <translation id="1154228249304313899">فتح هذه الصفحة:</translation>
 <translation id="115443833402798225">هانغول أهنماتي</translation>
@@ -118,6 +121,7 @@
 <translation id="1162223735669141505">‏يجب تمكين <ph name="BEGIN_LINK" />مكوّن Native Client الإضافي<ph name="END_LINK" /> لاستخدام هذه الميزة.</translation>
 <translation id="1163361280229063150">{NUM_DOWNLOAD,plural, =1{هناك تنزيل قيد التقدم حاليًا. هل تريد إلغاء التنزيل والخروج من وضع التصفح المتخفي؟}zero{هناك # من التنزيلات قيد التقدم حاليًا. هل تريد إلغاء التنزيلات والخروج من وضع التصفح المتخفي؟}two{هناك تنزيلان (#) قيد التقدم حاليًا. هل تريد إلغاء التنزيلين والخروج من وضع التصفح المتخفي؟}few{هناك # تنزيلات قيد التقدم حاليًا. هل تريد إلغاء التنزيلات والخروج من وضع التصفح المتخفي؟}many{هناك # تنزيلاً قيد التقدم حاليًا. هل تريد إلغاء التنزيلات والخروج من وضع التصفح المتخفي؟}other{هناك # من التنزيلات قيد التقدم حاليًا. هل تريد إلغاء التنزيلات والخروج من وضع التصفح المتخفي؟}}</translation>
 <translation id="1163931534039071049">عرض م&amp;صدر الإطار</translation>
+<translation id="1164674268730883318">‏هل تريد إيقاف تشغيل Smart Lock لـ <ph name="DEVICE_TYPE" />؟</translation>
 <translation id="1165039591588034296">خطأ</translation>
 <translation id="1166212789817575481">إغلاق علامات تبويب في الجهة اليسرى</translation>
 <translation id="1166359541137214543">ABC</translation>
@@ -135,6 +139,7 @@
 <translation id="1181037720776840403">إزالة</translation>
 <translation id="1183083053288481515">يتم استخدام شهادة قدمها المشرف</translation>
 <translation id="1183237619868651138">تعذّر تثبيت <ph name="EXTERNAL_CRX_FILE" /> في ذاكرة التخزين المؤقت المحلية.</translation>
+<translation id="1183917921992319637">تهيئة رقم التعريف الشخصي</translation>
 <translation id="1185924365081634987">يمكنك أيضا أن تجرّب <ph name="GUEST_SIGNIN_LINK_START" />التصفح كضيف<ph name="GUEST_SIGNIN_LINK_END" /> لإصلاح هذا الخطأ في الشبكة.</translation>
 <translation id="1187722533808055681">عمليات التنشيط من الوضع بعيد</translation>
 <translation id="1188807932851744811">لم يتم تحميل السجل.</translation>
@@ -200,6 +205,7 @@
 <translation id="1277908057200820621">عرض قائمة الأجهزة</translation>
 <translation id="1278049586634282054">التحقق من العروض:</translation>
 <translation id="1278813325885878377">‏لوحة مفاتيح Qwerty المجرية</translation>
+<translation id="1284355409890639046">إقران جهاز بلوتوث</translation>
 <translation id="1285320974508926690">عدم ترجمة هذا الموقع مطلقًا</translation>
 <translation id="1285484354230578868">‏تخزين البيانات في حساب Google Drive</translation>
 <translation id="1290223615328246825">أخفق تسجيل الدخول التلقائي</translation>
@@ -305,6 +311,7 @@
 <translation id="143027896309062157">قراءة جميع بياناتك وتغييرها على جهاز الكمبيوتر، ومواقع الويب التي تزورها</translation>
 <translation id="1430915738399379752">طباعة</translation>
 <translation id="1432581352905426595">إدارة محركات البحث</translation>
+<translation id="1433811987160647649">السؤال قبل الوصول</translation>
 <translation id="1434696352799406980">سيعيد هذا تعيين صفحة بدء التشغيل، وصفحة علامة تبويب جديدة، ومحرك البحث، وعلامات التبويب المثبتة. وستعطِّل أيضًا جميع الإضافات وتمحو البيانات المؤقتة مثل ملفات تعريف الارتباط. ولن يتم محو الإشارات المرجعية، والسجل، وكلمات المرور المحفوظة.</translation>
 <translation id="1434886155212424586">الصفحة الرئيسية هي صفحة "علامة تبويب جديدة"</translation>
 <translation id="1435550882135542937">إعادة تصميم شريط أدوات الإضافات</translation>
@@ -340,6 +347,7 @@
 <translation id="14720830734893704">تمكين إتاحة لوحة المفاتيح الظاهرية.</translation>
 <translation id="1474079335130556426">‏تمكين وضع الخلفية لواجهة برمجة تطبيقات Push. يسمح هذا لـ Chrome بمتابعة التشغيل بعد إغلاق آخر نافذة، وبالإطلاق عند بدء تشغيل نظام التشغيل، إذا كانت واجهة برمجة تطبيقات Push تحتاج إليه.</translation>
 <translation id="1474339897586437869">‏لم يتم تحميل "<ph name="FILENAME" />". حيث لا توجد لديك مساحة فارغة كافية في Google Drive.</translation>
+<translation id="1475502736924165259">لديك شهادات في الملف لا تندرج تحت أي فئة من الفئات الأخرى</translation>
 <translation id="1476607407192946488">إ&amp;عدادات اللغة</translation>
 <translation id="1476949146811612304">تعيين محرك البحث الذي يتم استخدامه عند البحث في
         <ph name="BEGIN_LINK" />المربع متعدد الاستخدامات<ph name="END_LINK" />.</translation>
@@ -377,6 +385,7 @@
         خادم وكيل، فعليك بتعديل <ph name="LINK_START" />إعدادات الخادم الوكيل<ph name="LINK_END" />.</translation>
 <translation id="1510907582379248592">كلمات المرور المحفوظة لـ <ph name="ORIGIN" />:</translation>
 <translation id="1511004689539562549">عدم السماح لمواقع الويب باستخدام الكاميرا</translation>
+<translation id="1511388193702657997">عرض حفظ كلمات مرور الويب</translation>
 <translation id="1511623662787566703">‏تم تسجيل الدخول باعتبارك <ph name="USER_EMAIL_ADDRESS" />. تم إيقاف المزامنة عبر لوحة تحكم Google.</translation>
 <translation id="1514215615641002767">إضافة إلى سطح المكتب</translation>
 <translation id="1514298457297359873">‏السماح للتطبيقات باستخدام واجهة برمجة تطبيقات مقبس NaCl. ويُستخدم فقط لاختبار المكونات الإضافية لمقبس NaCl.</translation>
@@ -398,6 +407,7 @@
 <translation id="1529968269513889022">الأسبوع الماضي</translation>
 <translation id="1531004739673299060">نافذة التطبيق</translation>
 <translation id="1531865825384516080">‏تقارير عناوين URL للبحث الآمن</translation>
+<translation id="1532687502998799885">يجب أن يكون رقم التعريف الشخصي 4 أرقام على الأقل:</translation>
 <translation id="1532697124104874386">تمكين/تعطيل النشر الذكي للوحة المفاتيح الافتراضية.</translation>
 <translation id="1533897085022183721">أقل من <ph name="MINUTES" />.</translation>
 <translation id="1533920822694388968">محاذاة التليفزيون</translation>
@@ -426,6 +436,7 @@
 <translation id="1558988940633416251">‏مكّن برنامج تنسيق HarfBuzz عبر الأنظمة الأساسية لنص واجهة المستخدم. لا يؤثر على محتوى الويب.</translation>
 <translation id="1559235587769913376">‏إدخال أحرف Unicode</translation>
 <translation id="1561092721008294962">‏HarfBuzz لنص واجهة المستخدم</translation>
+<translation id="1566049601598938765">موقع ويب</translation>
 <translation id="1566958206723629112">‏Flash وPDF</translation>
 <translation id="1567723158593978621">‏في حالة التمكين، سيستخدم تسجيل الدخول إلى المتصفح تدفق تسجيل الدخول الجديد المفصول بكلمة مرور GAIA.</translation>
 <translation id="1567993339577891801">وحدة تحكم جافا سكريبت</translation>
@@ -483,6 +494,7 @@
 <translation id="1645228020260124617"><ph name="PRECENTAGE" />%</translation>
 <translation id="1645870377513700713">تمكين الإشعارات الأصلية.</translation>
 <translation id="1646136617204068573">لوحة المفاتيح المجرية</translation>
+<translation id="1646982517418478057">يُرجى إدخال كلمة مرور لتشفير هذه الشهادة</translation>
 <translation id="164729547906544836">‏لوحة المفاتيح التاميلية (itrans)</translation>
 <translation id="164814987133974965">يمكن للمستخدم الذي يخضع للإدارة استكشاف الويب بتوجيه منك. وبصفتك مديرًا للمستخدم الذي يخضع للإدارة، يمكنك
     <ph name="BEGIN_BOLD" />السماح لمواقع ويب معينة أو حظرها<ph name="END_BOLD" />،
@@ -510,6 +522,7 @@
 <translation id="1673103856845176271">تعذر الدخول إلى الملف لأسباب تتعلق بالأمان.</translation>
 <translation id="1675023460278456180">مختلط ومتعدد الأبعاد</translation>
 <translation id="167832068858235403">خفض الصوت</translation>
+<translation id="1678331212993975953">تفاصيل الموقع</translation>
 <translation id="1679068421605151609">أدوات مطوّري البرامج</translation>
 <translation id="1681120471812444678">الإعداد لإضافة طابعات...</translation>
 <translation id="1682324559341535203">تسجيل <ph name="DEVICE_TYPE" /></translation>
@@ -531,11 +544,13 @@
 <translation id="1699395855685456105">مراجعة الأجهزة:</translation>
 <translation id="1700199471143028312">لا يسمح المشرف بإنشاء مستخدمين تحت الإشراف.</translation>
 <translation id="1701062906490865540">إزالة هذا الشخص</translation>
+<translation id="1702294042233267824">محرّك البحث المستخدم عند البحث في المربّع متعدد الاستخدامات</translation>
 <translation id="1702534956030472451">غربيّ</translation>
 <translation id="1707463636381878959">مشاركة هذه الشبكة مع مستخدمين آخرين</translation>
 <translation id="1708199901407471282">عند فتح صفحة ويب مقترحة من صفحة علامة تبويب جديدة، إذا كانت علامة تبويب مفتوحة بالفعل للاقتراح، فبدِّل إلى علامة التبويب تلك بدلاً من تحميل الاقتراح في علامة التبويب الجديدة.</translation>
 <translation id="1708338024780164500">(غير نشطة)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (رقم التعريف: <ph name="ID_PH" />)</translation>
+<translation id="1709106626015023981">‏<ph name="WIDTH" /> x <ph name="HEIGHT" /> (الأصلي)</translation>
 <translation id="1711973684025117106">أخفق الضغط، خطأ غير متوقع: $1</translation>
 <translation id="1715941336038158809">اسم المستخدم أو كلمة المرور غير صالحة.</translation>
 <translation id="1717733954209022288">‏مربع اختيار حفظ Google Payments</translation>
@@ -630,6 +645,7 @@
 <translation id="1852799913675865625">حدث خطأ أثناء محاولة قراءة الملف: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1856715684130786728">إضافة موقع...</translation>
 <translation id="1857166538520940818">إرفاق ملف:</translation>
+<translation id="1858585891038687145">الوثوق بهذه الشهادة لتحديد هوية مصممي البرامج</translation>
 <translation id="1859234291848436338">اتجاه الكتابة</translation>
 <translation id="1864111464094315414">تسجيل الدخول</translation>
 <translation id="1864676585353837027">تغيير كيفية مشاركة هذه الملفات</translation>
@@ -661,6 +677,7 @@
 <translation id="1909880997794698664">هل تريد بالتأكيد تشغيل هذا الجهاز في وضع الكشك بشكل دائم؟</translation>
 <translation id="1910572251697014317">‏لقد أرسلت Google إشعارًا إلى هذا الهاتف. تجدر الإشارة إلى أنه يمكن لهاتفك باستخدام البلوتوث أن يحتفظ بإلغاء قفل <ph name="DEVICE_TYPE" /> من على بُعد أكثر من 100 قدم. إذا أحدث ذلك مشكلة لك، يمكنك &lt;a&gt; تعطيل هذه الميزة مؤقتًا&lt;/a&gt;.</translation>
 <translation id="1910721550319506122">مرحبًا!</translation>
+<translation id="1911073860190924580">كلمة المرور فقط</translation>
 <translation id="1916502483199172559">الصورة الرمزية الافتراضية الحمراء</translation>
 <translation id="191688485499383649">حدث خطأ غير معروف أثناء محاولة الاتصال بالجهاز "<ph name="DEVICE_NAME" />".</translation>
 <translation id="1918141783557917887">أص&amp;غر</translation>
@@ -722,6 +739,8 @@
 <translation id="2007404777272201486">الإبلاغ عن مشكلة...</translation>
 <translation id="2011110593081822050">عامل الويب: <ph name="WORKER_NAME" /></translation>
 <translation id="2012766523151663935">مراجعة البرامج الثابتة:</translation>
+<translation id="2013984794184160106">15</translation>
+<translation id="2016430552235416146">التقليدي</translation>
 <translation id="2017052954220678795">المسح المجالي لوحدة معالجة الرسومات التي تتضمن سلسلة محادثات</translation>
 <translation id="2017334798163366053">تعطيل جمع بيانات مستوى الأداء</translation>
 <translation id="2018352199541442911">عذرًا، لا يتوفر جهاز سعة التخزين الخارجية للاستخدام في الوقت الحالي.</translation>
@@ -738,6 +757,7 @@
 <translation id="204497730941176055">‏اسم قالب الشهادات لـ Microsoft</translation>
 <translation id="2045969484888636535">متابعة حظر تشغيل ملفات تعريف الارتباط</translation>
 <translation id="204622017488417136">‏سيتم إرجاع جهازك إلى إصدار Chrome المثبت مسبقًا. ستتم إزالة كل حسابات المستخدمين والبيانات المحلية. ولا يمكن التراجع عن ذلك.</translation>
+<translation id="2047962517134476164">تأكيد تسجيل الدخول للمتابعة</translation>
 <translation id="2048182445208425546">الدخول إلى عدد زيارات شبكتك</translation>
 <translation id="2049137146490122801">عطّل المشرف الدخول إلى الملفات المحلية على جهازك.</translation>
 <translation id="204914487372604757">إنشاء اختصار</translation>
@@ -822,10 +842,12 @@
 <translation id="2155931291251286316">السماح بعرض النوافذ المنبثقة من الموقع <ph name="HOST" /> دومًا</translation>
 <translation id="215753907730220065">إنهاء وضع ملء الشاشة</translation>
 <translation id="2157875535253991059">هذه الصفحة في وضع ملء الشاشة الآن.</translation>
+<translation id="2161553589239083578">تأكيد رقم التعريف الشخصي:</translation>
 <translation id="216169395504480358">‏إضافة Wi-Fi...</translation>
 <translation id="2163470535490402084">يُرجى الاتصال بالإنترنت لتسجيل الدخول إلى <ph name="DEVICE_TYPE" />.</translation>
 <translation id="2164862903024139959">‏لوحة المفاتيح الفيتنامية (TCVN)</translation>
 <translation id="2165453356262207111">القفل الذكي (الإصدار التجريبي)</translation>
+<translation id="2166369534954157698">أبجد هوز حطي كلمن سعفص قرشت ثخذ ضظغ</translation>
 <translation id="2167276631610992935">جافا سكريبت</translation>
 <translation id="2168214441502403371">لوحة المفاتيح الفارسية</translation>
 <translation id="2168725742002792683">إضافات الملف</translation>
@@ -842,6 +864,7 @@
 <translation id="2190355936436201913">(فارغ)</translation>
 <translation id="2190469909648452501">تقليل</translation>
 <translation id="2192505247865591433">من:</translation>
+<translation id="2193365732679659387">إعدادات الثقة</translation>
 <translation id="2195729137168608510">حماية البريد الإلكتروني</translation>
 <translation id="2198315389084035571">الصينية المبسطة</translation>
 <translation id="2199829153606285995">الإدخال الصوتي على لوحة المفاتيح الظاهرية</translation>
@@ -859,9 +882,11 @@
 <translation id="2213819743710253654">إجراءات الصفحة</translation>
 <translation id="2215277870964745766">مرحبًا، يمكنك تعيين اللغة والشبكة</translation>
 <translation id="2217501013957346740">أنشئ اسمًا -</translation>
+<translation id="2218019600945559112">الماوس ولوحة اللمس</translation>
 <translation id="2218515861914035131">لصق كنص عادي</translation>
 <translation id="2218947405056773815">للأسف! هناك مشكلة تواجه <ph name="API_NAME" />.</translation>
 <translation id="2220529011494928058">الإبلاغ عن مشكلة</translation>
+<translation id="2220572644011485463">رقم التعريف الشخصي أو كلمة المرور</translation>
 <translation id="2221240591176106785">تمكين إعادة التحميل دون التحقق</translation>
 <translation id="2222641695352322289">الوسيلة الوحيدة للتراجع عن هذا هي إعادة تثبيت <ph name="IDS_SHORT_PRODUCT_OS_NAME" />.</translation>
 <translation id="2224444042887712269">ينتمي هذا الإعداد إلى <ph name="OWNER_EMAIL" />.</translation>
@@ -905,6 +930,7 @@
 <translation id="2258195278080713720">أحدث ميزات جافا سكريبت الثابتة</translation>
 <translation id="2260567344816042527">‏سوف يستخدم Google Chrome بيانات شبكة الجوَال إذا كنت غير متصل بشبكة أخرى.</translation>
 <translation id="2260654768907572711">المكوّن الإضافي للمتصفح</translation>
+<translation id="2262477216570151239">تأخير قبل التكرار</translation>
 <translation id="226269835214688456">‏إذا قمت بإيقاف تشغيل Smart Lock في Chromebook، فلن تكون قادرًا على إلغاء قفل أجهزة Chrome باستخدام هاتفك. وستحتاج إلى كتابة كلمة المرور.</translation>
 <translation id="2262903407161221567">ستعرض بعض مكونات واجهة المستخدم تعليقات مرئية عند تفاعلات اللمس.</translation>
 <translation id="2263497240924215535">(معطل)</translation>
@@ -918,6 +944,7 @@
 <translation id="2273562597641264981">مشغّل الشبكة:</translation>
 <translation id="2275694568175246751">من اليمين إلى اليسار</translation>
 <translation id="2276503375879033601">إضافة المزيد من التطبيقات</translation>
+<translation id="2277255602909579701">جميع ملفات تعريف الارتباط وبيانات الموقع</translation>
 <translation id="2278098630001018905">استخدام عنوان شحن آخر</translation>
 <translation id="2278562042389100163">فتح نافذة المتصفح</translation>
 <translation id="2278988676849463018">لوحة مفاتيح الكانادا (صوتية)</translation>
@@ -958,6 +985,7 @@
 <translation id="2339120501444485379">أدخل اسمًا جديدًا</translation>
 <translation id="2339641773402824483">التحقّق من التحديثات...</translation>
 <translation id="2342060820861917889">طويل (2000 ميلي ثانية)</translation>
+<translation id="2342282706041269970">جرّب الخروج وتسجيل الدخول مرة أخرى.</translation>
 <translation id="23434688402327542">لوحة المفاتيح الكازاخية</translation>
 <translation id="2344028582131185878">التنزيلات التلقائية</translation>
 <translation id="2344262275956902282">استخدم مفتاحي - و = لإنشاء صفحة بقائمة المرشحين</translation>
@@ -1072,6 +1100,7 @@
 <translation id="2494837236724268445">لوحة المفاتيح الغوغاراتية (صوتية)</translation>
 <translation id="2496180316473517155">سجل التصفح</translation>
 <translation id="2496540304887968742">يجب أن تكون سعة الجهاز 4 غيغابايت أو أكثر.</translation>
+<translation id="2497229222757901769">سرعة الماوس</translation>
 <translation id="249819058197909513">لا أريد التحذير مرة أخرى بشأن هذا التطبيق</translation>
 <translation id="2498436043474441766">إضافة طابعات</translation>
 <translation id="2498539833203011245">تصغير</translation>
@@ -1145,6 +1174,7 @@
 <translation id="2587102772237859721">إلغاء أداة معالجة الحدث السلبية</translation>
 <translation id="2587203970400270934">رمز مشغل الشبكة:</translation>
 <translation id="2587922270115112871">‏لا يؤدي إنشاء مستخدم يخضع للإدارة إلى إنشاء حساب Google، ولن تنتقل الإعدادات والبيانات التابعة له إلى الأجهزة الأخرى التي تستخدم مزامنة Chrome. يسري المستخدم الذي يخضع للإدارة فقط على هذا الجهاز.</translation>
+<translation id="25912682830130293">عرض الإعدادات التي تم الإبلاغ عنها</translation>
 <translation id="2594049137847833442">خيارات المواقع المهمة في مربع الحوار "محو بيانات التصفُّح"</translation>
 <translation id="2594056015203442344">عند تمكين هذه الخاصية، تتضاعف مؤشرات الصوت في شريط علامات التبويب بالإضافة إلى وحدات التحكم لكتم الصوت بعلامة التبويب . كما يضيف ذلك أيضًا الأوامر في قائمة سياق التبويب لسرعة كتم علامات التبويب المتعددة المختارة.</translation>
 <translation id="259421303766146093">تصغير</translation>
@@ -1197,6 +1227,7 @@
 <translation id="2665394472441560184">إضافة كلمة جديدة</translation>
 <translation id="2665717534925640469">هذه الصفحة في وضع ملء الشاشة الآن وتم تعطيل مؤشر الماوس.</translation>
 <translation id="2665919335226618153">عذرًا، حدث خطأ أثناء التنسيق.</translation>
+<translation id="2667463864537187133">إدارة التدقيق الإملائي</translation>
 <translation id="2668079306436607263">التنقل عبر السجل بالتمرير الزائد</translation>
 <translation id="2670102641511624474">‏يشارك <ph name="APP_NAME" /> علامة تبويب متصفح Chrome.</translation>
 <translation id="2670965183549957348">‏أسلوب الإدخال "Chewing"</translation>
@@ -1219,7 +1250,9 @@
 <translation id="2694026874607847549">ملف تعريف ارتباط واحد</translation>
 <translation id="2696862700756109583">استثناءات ملء الشاشة</translation>
 <translation id="2702540957532124911">لوحة المفاتيح:</translation>
+<translation id="2704142793323512908">إزالة البيانات الحالية أيضًا من هذا الجهاز.</translation>
 <translation id="2704184184447774363">‏توقيع المستند لـ Microsoft</translation>
+<translation id="270516211545221798">سرعة لوحة اللمس</translation>
 <translation id="2706892089432507937">‏أجهزة USB</translation>
 <translation id="2707024448553392710">تنزيل المُكوّن</translation>
 <translation id="270921614578699633">تم تجاوز المعدل</translation>
@@ -1398,6 +1431,7 @@
 <translation id="2902734494705624966">أمريكية موسعة</translation>
 <translation id="2903493209154104877">العناوين</translation>
 <translation id="290444763029043472">تم تنزيل <ph name="DOWNLOADED_AMOUNT_MB" /> ميغابايت/<ph name="TOTAL_AMOUNT_MB" /> ميغابايت</translation>
+<translation id="2904456025988372123">السؤال عند محاولة أحد المواقع تنزيل الملفات تلقائيًا بعد الملف الأول</translation>
 <translation id="2907619724991574506">‏عناوين URL لبدء التشغيل</translation>
 <translation id="2908162660801918428">إضافة معرض الوسائط باستخدام الدليل</translation>
 <translation id="2908789530129661844">تصغير الشاشة</translation>
@@ -1444,6 +1478,7 @@
 <translation id="2963151496262057773">المكوّن الإضافي التالي غير مستجيب: <ph name="PLUGIN_NAME" />‏، هل تريد إيقافه؟</translation>
 <translation id="2963783323012015985">لوحة المفاتيح التركية</translation>
 <translation id="2964193600955408481">‏تعطيل Wi-Fi</translation>
+<translation id="2964313852984024865">تعديل</translation>
 <translation id="2966459079597787514">لوحة المفاتيح السويدية</translation>
 <translation id="2966598748518102999">‏تحسين البحث الصوتي عبر إرسال صوت "Ok Google"، وما قبل نطق ذلك ببضع ثوانِ إلى Google.</translation>
 <translation id="2967544384642772068">إنهاء</translation>
@@ -1592,6 +1627,7 @@
 <translation id="3150927491400159470">إعادة تحميل بشكل كامل</translation>
 <translation id="315116470104423982">بيانات الجوال</translation>
 <translation id="315141861755603168">يضيف <ph name="BUNDLE_NAME" /> هذه التطبيقات:</translation>
+<translation id="3151786313568798007">الاتجاه</translation>
 <translation id="3153177132960373163">السماح لجميع مواقع الويب باستخدام مكونات إضافية للوصول إلى جهاز الكمبيوتر</translation>
 <translation id="3154429428035006212">في وضع عدم الاتصال لمدة تتجاوز شهرًا</translation>
 <translation id="3157931365184549694">استعادة</translation>
@@ -1648,6 +1684,7 @@
 <translation id="3234666976984236645">الكشف دائمًا عن المحتوى المهم على هذا الموقع</translation>
 <translation id="3236997602556743698">المجموعة رقم 3 (390)</translation>
 <translation id="3237784613213365159">أصبح <ph name="NEW_PROFILE_NAME" /> الآن مستخدمًا تحت الإشراف</translation>
+<translation id="323803881985677942">فتح خيارات الإضافة</translation>
 <translation id="324056286105023296">أليس <ph name="PROFILE_NAME" />؟</translation>
 <translation id="3241680850019875542">حدد الدليل الجذر للإضافة المراد إنشاء حزمة لها، ولتحديث إضافة، حدد أيضًا ملف المفتاح الخاص لإعادة استخدامه.</translation>
 <translation id="3241720467332021590">الأيرلندية</translation>
@@ -1673,6 +1710,7 @@
 <translation id="3268451620468152448">علامات التبويب المفتوحة</translation>
 <translation id="3269093882174072735">تحميل الصورة</translation>
 <translation id="3269101346657272573">يُرجى إدخال رقم التعريف الشخصي.</translation>
+<translation id="3269737334347286816">تفاصيل تسجيل الدخول قديمة.</translation>
 <translation id="326999365752735949">تنزيل الاختلافات</translation>
 <translation id="3270965368676314374">التعرّف على الصور، والموسيقى، والوسائط الأخرى من الكمبيوتر وتغييرها وحذفها</translation>
 <translation id="3273410961255278341">الإرسال إلى:</translation>
@@ -1769,6 +1807,7 @@
 <translation id="3382073616108123819">عفوا! أخفق النظام في تحديد معرفات هذا الجهاز.</translation>
 <translation id="3384773155383850738">أقصى عدد مسموح به من الاقتراحات</translation>
 <translation id="3385050660708634073">تشفير كل البيانات المتزامنة مع عبارة مرور المزامنة.</translation>
+<translation id="3385131213214862288">محو العناصر التالية من</translation>
 <translation id="338583716107319301">فاصل</translation>
 <translation id="3386219708421216619">تمت إضافة إشارة</translation>
 <translation id="3391392691301057522">رقم التعريف الشخصي القديم:</translation>
@@ -1804,6 +1843,7 @@
 <translation id="3439153939049640737">السماح دائمًا لـ <ph name="HOST" /> بالدخول إلى الميكروفون</translation>
 <translation id="3439282137581679399">تُمكن القائمة السوداء للأذونات، والتي تحظر الأذونات للمواقع المضمنة في القائمة السوداء لمستخدمي التصفح الآمن.</translation>
 <translation id="3439970425423980614">‏جارٍ فتح ملف PDF في تطبيق المعاينة</translation>
+<translation id="3440761377721825626">السؤال عند محاولة أحد مواقع الويب استخدام مكون إضافي للوصول إلى جهاز الكمبيوتر</translation>
 <translation id="3441653493275994384">الشاشة</translation>
 <translation id="3441653695259810643">أعد استخدام خط مخزن مؤقتًا في العارض لعرض أحجام مختلفة من الخط من أجل تنسيق أسرع.</translation>
 <translation id="3445092916808119474">جعلها الأساسية</translation>
@@ -1818,6 +1858,7 @@
 <translation id="3456236151053308041">‏يمكنك تمكين إضافات أداة IME لتوفير طرق عرض مخصصة لإدخال المستخدم مثل لوحات المفاتيح الظاهرية.</translation>
 <translation id="345693547134384690">فتح &amp;الصورة في علامة تبويب جديدة</translation>
 <translation id="3458620904104024826">‏تمكين تصدير تتبع الأحداث إلى ETW.</translation>
+<translation id="3459509316159669723">الطباعة</translation>
 <translation id="3459774175445953971">آخر تعديل:</translation>
 <translation id="3460771772332290399">وضع إعادة التحميل التلقائي بلا اتصال</translation>
 <translation id="3462413494201477527">هل تريد إلغاء إنشاء الحساب؟</translation>
@@ -1861,6 +1902,7 @@
 <translation id="3508920295779105875">اختيار مجلد آخر ...</translation>
 <translation id="3509527969829946096">‏يُمكن هذا الخيار الدعم في Cast Streaming لتشفير مقاطع الفيديو المضمنة التي تستخدم أجهزة النظام الأساسي.</translation>
 <translation id="3510797500218907545">WiMAX</translation>
+<translation id="3511200754045804813">إعادة الفحص</translation>
 <translation id="3511307672085573050">نسخ &amp;عنوان الرابط</translation>
 <translation id="3511399794969432965">هل تعاني مشكلة في الاتصال؟</translation>
 <translation id="351152300840026870">خط ثابت العرض</translation>
@@ -1930,6 +1972,7 @@
 <translation id="3590559774363307859">تم حفظ كلمة المرور. يمكنك الوصول إليها وجميع <ph name="SAVED_PASSWORDS_LINK" /> من أي متصفح.</translation>
 <translation id="3590587280253938212">سريع</translation>
 <translation id="3592260987370335752">&amp;مزيد من المعلومات</translation>
+<translation id="3592313833691251126">السماح للإضافات بإنشاء نوافذ اللوحة التي تفتح خارج إطار المتصفح. وستؤدي محاولات فتح لوحة إلى فتح نافذة منبثقة بدلاً من ذلك في حالة عدم تمكينها. ويتمثَّل السلوك الافتراضي في السماح لإضافات القائمة البيضاء فحسب. أما السلوك المُمكَّن فيتمثَّل في السماح لجميع الإضافات. ويتمثَّل السلوك المُعطَّل في عدم السماح باللوحات لأي إضافات.</translation>
 <translation id="359283478042092570">الدخول</translation>
 <translation id="3593152357631900254">تمكين وضع شبيه بـ "بين ين"</translation>
 <translation id="3593965109698325041">قيود اسم الشهادة</translation>
@@ -2007,6 +2050,7 @@
 <translation id="3695919544155087829">الرجاء إدخال كلمة المرور التي تم استخدامها لتشفير ملف الشهادة هذا.</translation>
 <translation id="3696411085566228381">بدون</translation>
 <translation id="3697100740575341996">‏عطّل مشرف تقنية المعلومات ميزات Chrome الإضافية لجهازك. <ph name="MORE_INFO_LINK" /></translation>
+<translation id="3699080292907545058">تعيين الحد الأقصى لإصدار طبقة النقل الآمنة الممكن.</translation>
 <translation id="3699624789011381381">عنوان البريد الإلكتروني</translation>
 <translation id="3704162925118123524">قد تتطلب الشبكة التي تستخدمها زيارة صفحة تسجيل الدخول.</translation>
 <translation id="3704331259350077894">إيقاف العملية</translation>
@@ -2052,10 +2096,12 @@
 <translation id="3758201569871381925">‏يُرجى التأكد من أن جهاز Hotrod يعمل ومتصل بجهاز تلفزيون.</translation>
 <translation id="375841316537350618">جارٍ تنزيل النص البرمجي للخادم الوكيل...</translation>
 <translation id="3759371141211657149">إدارة إعدادات المعالج...</translation>
+<translation id="3759553810934020361">تم إيقاف تشغيل البلوتوث.</translation>
 <translation id="3759933321830434300">الأجزاء المقيدة من صفحات الويب</translation>
 <translation id="3760460896538743390">فحص &amp;صفحة الخلفية</translation>
 <translation id="37613671848467444">فتح في &amp;نافذة التصفح المتخفي</translation>
 <translation id="3763401818161139108">تشغيل على <ph name="ORIGIN" /> دائمًا</translation>
+<translation id="3764314093345384080">معلومات الإصدار التفصيلية</translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{‏الاتصال بجهاز USB}zero{‏الاتصال بـ # من أجهزة USB}two{‏الاتصال بجهازي USB (#)}few{‏الاتصال بـ # أجهزة USB}many{‏ الاتصال بـ # جهاز USB}other{‏ الاتصال بـ # من أجهزة USB}}</translation>
 <translation id="3764800135428056022">عرض حفظ كلمات مرور الويب.</translation>
 <translation id="3764986667044728669">تعذّر التسجيل</translation>
@@ -2085,6 +2131,7 @@
 <translation id="3798449238516105146">الإصدار</translation>
 <translation id="3798935682015223249">‏دعم بروتوكول نقل الوسائط (MTP) في مدير الملفات</translation>
 <translation id="3800764353337460026">أسلوب الرموز</translation>
+<translation id="3800806661949714323">عرض الكل (مستحسن)</translation>
 <translation id="3801082500826908679">الفاروية</translation>
 <translation id="3803991353670408298">الرجاء إضافة طريقة إدخال أخرى قبل إزالة هذه الطريقة.</translation>
 <translation id="380408572480438692">‏يساعد تمكين جمع بيانات مستوى الأداء Google في تحسين النظام بمرور الوقت. وتجدر الإشارة إلى أنه لا يتم إرسال أية بيانات حتى ترسل تقريرًا بتعليقاتك (Alt-Shift-I) مع تضمين بيانات مستوى الأداء. ويمكنك الرجوع إلى هذه الشاشة لتعطيل جمع البيانات متى شئت.</translation>
@@ -2102,6 +2149,7 @@
 <translation id="3819007103695653773">السماح لجميع المواقع بإرسال رسائل دفع في الخلفية</translation>
 <translation id="3819752733757735746">الوصول عبر مفتاح التحويل (التحكم في جهاز الكمبيوتر بمفتاح واحد فقط أو مفتاحين)</translation>
 <translation id="3819800052061700452">م&amp;لء الشاشة</translation>
+<translation id="3821453754632750466">تمكين دفعات الويب</translation>
 <translation id="3822265067668554284">عدم السماح لأي موقع ويب بتتبع الموقع الفعلي</translation>
 <translation id="3825863595139017598">لوحة المفاتيح المنغولية</translation>
 <translation id="3827306204503227641">متابعة السماح للمكونات الإضافية غير المحمية</translation>
@@ -2163,9 +2211,11 @@
 <translation id="3899968422636198696"><ph name="ORGNAME" /> <ph name="HOSTNAME" /></translation>
 <translation id="3901991538546252627">جارٍ الاتصال بـ <ph name="NAME" /></translation>
 <translation id="3902799646152133632">تتخطى الإطار الرئيسي بدون متاجر.</translation>
+<translation id="3904196543277238487">تمكين الحد الأقصى لإصدار طبقة النقل الآمنة.</translation>
 <translation id="3905761538810670789">إصلاح التطبيق</translation>
 <translation id="390718707505136526">تُمكن الإصدارات التجريبية الأصلية للتحكُّم في الدخول إلى تجارب واجهة برمجة التطبيقات/الميزات.</translation>
 <translation id="3908501907586732282">تمكين الإضافة</translation>
+<translation id="3909690856344416952"><ph name="LANGUAGE_1" />، و<ph name="LANGUAGE_2" />، ولغة أخرى</translation>
 <translation id="3909791450649380159">&amp;قص</translation>
 <translation id="3910699493603749297">لوحة مفاتيح اللغة الخميرية</translation>
 <translation id="3911073280391218446"><ph name="USER_DISPLAY_NAME" /> (الاسم المستخدم على هذا الجهاز)</translation>
@@ -2185,6 +2235,7 @@
 <translation id="3930521966936686665">تشغيل على</translation>
 <translation id="3936390757709632190">&amp;فتح ملف الصوت في علامة تبويب جديدة</translation>
 <translation id="3936768791051458634">تغيير القناة...</translation>
+<translation id="3936925983113350642">ستكون كلمة المرور التي تختارها مطلوبة لاستعادة هذه الشهادة لاحقًا. يُرجى تسجيلها في مكان آمن.</translation>
 <translation id="3937640725563832867">الاسم البديل لجهة إصدار الشهادة</translation>
 <translation id="3938113500786732264">تبديل الأشخاص بشكل أسرع</translation>
 <translation id="3940233957883229251">تمكين الإعادة التلقائية</translation>
@@ -2249,9 +2300,10 @@
 <translation id="4034042927394659004">تقليل سطوع المفاتيح</translation>
 <translation id="4035758313003622889">مدير الم&amp;هام</translation>
 <translation id="4037084878352560732">حصان</translation>
-<translation id="4037102579141982963">‏سيرسل هذا الجهاز تلقائيًا بيانات التشخيص والاستخدام إلى Google. ويمكنك تغيير ذلك في أي وقت في <ph name="BEGIN_LINK1" />إعدادات<ph name="END_LINK1" /> جهازك. <ph name="BEGIN_LINK2" />مزيد من المعلومات<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">‏تمكين محوّل علامة تبويب إمكانية الدخول لجهاز Android.</translation>
+<translation id="4037889604535939429">تعديل الشخص</translation>
 <translation id="4044260751144303020">التركيب لعناصر الموضع الثابت.</translation>
+<translation id="4044612648082411741">إدخال كلمة المرور للشهادة</translation>
 <translation id="404493185430269859">محرك البحث الافتراضي</translation>
 <translation id="4047112090469382184">كم هذا آمن</translation>
 <translation id="4047345532928475040">غير متوفّر</translation>
@@ -2344,6 +2396,7 @@
 <translation id="417475959318757854">‏حدد Launcher تطبيقات.</translation>
 <translation id="4176463684765177261">معطل</translation>
 <translation id="4179512409951755566">‏تمكين التمرير الزائد OSK</translation>
+<translation id="418062721134714140">إدارة إعدادات وشهادات طبقة المقابس الآمنة</translation>
 <translation id="4180788401304023883">‏هل تريد حذف شهادة المرجع المصدق (CA) "<ph name="CERTIFICATE_NAME" />"؟</translation>
 <translation id="418179967336296930">‏لوحة المفاتيح الروسية الصوتية (YaZHert)</translation>
 <translation id="4181841719683918333">اللغات</translation>
@@ -2358,6 +2411,7 @@
 <translation id="4195643157523330669">فتح الإشارة في علامة تبويب جديدة</translation>
 <translation id="4195814663415092787">المتابعة من حيث توقفت</translation>
 <translation id="4197674956721858839">تحديد ملف مضغوط</translation>
+<translation id="4200689466366162458">كلمات مخصصة</translation>
 <translation id="4200983522494130825">علا&amp;مة تبويب جديدة</translation>
 <translation id="4206144641569145248">كائن غريب</translation>
 <translation id="420665587194630159">(هذه الإضافة مدارة ولا يمكن إزالتها أو تعطيلها).</translation>
@@ -2454,10 +2508,12 @@
 <translation id="4350019051035968019">لا يمكن تسجيل هذا الجهاز في النطاق الذي ينتمي له حسابك نظرًا لأنه تم تصنيف الجهاز للعمل تحت إدارة نطاق آخر.</translation>
 <translation id="4354806558096370704">‏تمكين استخدام الواجهة الخلفية لنظام الطباعة CUPS الأصلي.</translation>
 <translation id="4355925451975609675">اضغط على |<ph name="ACCELERATOR1" />|+|<ph name="ACCELERATOR2" />| للانتقال إلى الأمام</translation>
+<translation id="4358353773267946514"><ph name="LANGUAGE_1" />، و<ph name="LANGUAGE_2" /></translation>
 <translation id="4358697938732213860">إضافة عنوان</translation>
 <translation id="4359408040881008151">تم التثبيت بسبب الإضافة (الإضافات) التابعة.</translation>
 <translation id="4361190688154226069">استهداف المستطيل في المشاهدات</translation>
 <translation id="4361765875689149937">يريد <ph name="ORIGIN" /> الاقتران مع:</translation>
+<translation id="4363771538994847871">لم يتم العثور على وجهات الإرسال. هل تريد المساعدة؟</translation>
 <translation id="4364444725319685468">تم تنزيل <ph name="FILE_NAME" /></translation>
 <translation id="4364567974334641491">يشارك <ph name="APP_NAME" /> نافذة.</translation>
 <translation id="4364830672918311045">عرض الإشعارات</translation>
@@ -2549,6 +2605,7 @@
 <translation id="4509345063551561634">المجلد:</translation>
 <translation id="4514542542275172126">إعداد مستخدم جديد تحت الإشراف</translation>
 <translation id="4514914692061505365">‏فرض استخدام أداة الترجمة السريعة Subzero لـ PNaCl لجميع ملفات pexe.</translation>
+<translation id="451515744433878153">إزالة</translation>
 <translation id="4516641987425683031">علامات التبويب التي تمت مزامنتها</translation>
 <translation id="4518677423782794009">‏هل يظهر تعطّل Chrome صفحات بدء تشغيل أو أشرطة أدوات غير معتادة، أو إعلانات غير متوقعة لا يمكنك التخلص منها، أو تغييرًا آخر في تجربة التصفح؟ قد تتمكن من إصلاح المشكلة من خلال تشغيل أداة إزالة البرامج من Chrome.</translation>
 <translation id="452039078290142656">أجهزة غير معروفة من <ph name="VENDOR_NAME" /></translation>
@@ -2585,6 +2642,7 @@
 <translation id="4562991793854515912">قصير للغاية (600 ميلي ثانية)</translation>
 <translation id="4563210852471260509">لغة الإدخال الأولية هي الصينية</translation>
 <translation id="456664934433279154">‏يتحكم فيما إذا كان ينبغي استخدام نوافذ تطبيقات Chrome القائمة على Toolkit-Views أم لا.</translation>
+<translation id="4567772783389002344">إضافة كلمة</translation>
 <translation id="4569998400745857585">قائمة تحتوي على إضافات مخفية</translation>
 <translation id="4570444215489785449">‏يمكنك الآن قفل هذا الجهاز عن بُعد في أي وقت عبر مدير Chrome.</translation>
 <translation id="4572659312570518089">تم إلغاء المصادقة أثناء الاتصال بالجهاز "<ph name="DEVICE_NAME" />".</translation>
@@ -2596,11 +2654,13 @@
 <translation id="4582447636905308869">‏محرر أسلوب الإدخال (IME) الكوري الجديد الذي يعتمد على محرك HMM لأدوات الإدخال من Google.</translation>
 <translation id="4582563038311694664">إعادة تعيين كل الإعدادات</translation>
 <translation id="4583537898417244378">ملف غير صالح أو تالف.</translation>
+<translation id="4585793705637313973">تعديل الصفحة</translation>
 <translation id="4589268276914962177">علامة تبويب طرفية جديدة</translation>
 <translation id="4590324241397107707">تخزين قاعدة البيانات</translation>
 <translation id="4593021220803146968">&amp;انتقال إلى <ph name="URL" /></translation>
 <translation id="4594109696316595112">‏تفعيل لمرة واحدة: اكتب كلمة المرور لتنشيط Smart Lock على <ph name="DEVICE_TYPE" />. مع Smart Lock، سيلغي هاتفك قفل الجهاز بدون كلمة مرور. لتغيير أو إيقاف تشغيل هذه الميزة، تفضل بزيارة إعدادات <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4595560905247879544">لا يمكن تعديل التطبيقات والإضافات إلا من قِبل المدير (<ph name="CUSTODIAN_NAME" />).</translation>
+<translation id="4596295440756783523">لديك شهادات في الملف تحدد هذه الخوادم</translation>
 <translation id="4598556348158889687">إدارة سعة التخزين</translation>
 <translation id="4601242977939794209">‏محول EMF</translation>
 <translation id="4602466770786743961">إتاحة دخول <ph name="HOST" /> دومًا إلى الكاميرا والميكروفون التابعين لك</translation>
@@ -2665,6 +2725,7 @@
 <translation id="4697551882387947560">عند انتهاء جلسة التصفح</translation>
 <translation id="4699172675775169585">الصور والملفات المخزنة مؤقتًا</translation>
 <translation id="4699357559218762027">(يتم تشغيله تلقائيًا)</translation>
+<translation id="4704677965327178154">عدم السماح لأي موقع ويب باستخدام مكونات إضافية للوصول إلى جهاز الكمبيوتر.</translation>
 <translation id="4707302005824653064">‏يمكن للمدير مراجعة الاستخدام والسجل (<ph name="CUSTODIAN_EMAIL" />) على chrome.com.</translation>
 <translation id="4707579418881001319">‏L2TP/IPSec + شهادة المستخدم</translation>
 <translation id="4707934200082538898">يُرجى التحقق من بريدك الإلكتروني على <ph name="BEGIN_BOLD" /><ph name="MANAGER_EMAIL" /><ph name="END_BOLD" /> للحصول على مزيد من الإرشادات.</translation>
@@ -2702,6 +2763,7 @@
 <translation id="4744574733485822359">اكتمل التنزيل</translation>
 <translation id="4746971725921104503">يبدو أنك تدير مستخدم بهذا الاسم فعلاً. هل تريد <ph name="LINK_START" />استيراد <ph name="USER_DISPLAY_NAME" /> إلى هذا الجهاز<ph name="LINK_END" />؟</translation>
 <translation id="4747271164117300400">المقدونية</translation>
+<translation id="4748762018725435655">‏يلزم إضافة من سوق Chrome الإلكتروني</translation>
 <translation id="4749157430980974800">لوحة المفاتيح الجورجية</translation>
 <translation id="4750394297954878236">الاقتراحات</translation>
 <translation id="475088594373173692">المستخدم الأول</translation>
@@ -2715,6 +2777,7 @@
 <translation id="4763830802490665879">سيتم محو ملفات تعريف الارتباط من مواقع متعددة عند الخروج.</translation>
 <translation id="4764029864566166446">تحديث المكوّن الإضافي...</translation>
 <translation id="4764865176798926079">‏domContentLoaded للإطار الرئيسي وعمليات تحميل كل الموارد بدأت قبل domContentLoaded (تم تجاهل إطارات iframe).</translation>
+<translation id="4768332406694066911">لديك شهادات تحدد هويتك من هذه المؤسسات</translation>
 <translation id="4768698601728450387">اقتصاص الصورة</translation>
 <translation id="4773696473262035477">يمكنك الوصول إليها وكل <ph name="SAVED_PASSWORDS_LINK" /> من أي متصفح.</translation>
 <translation id="4776917500594043016">كلمة مرور <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -2732,10 +2795,12 @@
 <translation id="4793866834012505469">إعادة تشكيل نموذج الصوت</translation>
 <translation id="479536056609751218">‏صفحة الويب، HTML فقط</translation>
 <translation id="479989351350248267">بحث</translation>
+<translation id="480036413855787547">‏يمكنك الوصول إلى كلمات المرور من أي جهاز على <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />. في نظام التشغيل Mac، قد يتم حفظ كلمات المرور في تطبيق Keychain ويمكن الدخول إليها أو مزامنتها من قبل مستخدمي Chrome الآخرين الذين يشاركون حساب نظام التشغيل X هذا.</translation>
 <translation id="4801257000660565496">إنشاء اختصارات للتطبيق</translation>
 <translation id="4801448226354548035">إخفاء الحسابات</translation>
 <translation id="4801512016965057443">السماح بتجوال بيانات الجوال</translation>
 <translation id="4801956050125744859">الاحتفاظ بالاثنتين</translation>
+<translation id="4803121606678474433">تمكين تبديل وضع العرض الديناميكي للوحات ثنائية الأبعاد.</translation>
 <translation id="4803909571878637176">إزالة</translation>
 <translation id="4804331037112292643">مربع حوار فتح/حفظ الملف</translation>
 <translation id="4804818685124855865">قطع الاتصال</translation>
@@ -2754,6 +2819,7 @@
 <translation id="4824518112777153488">الدعم للشاشات التي تعمل باللمس ويمكن التمرير عليها</translation>
 <translation id="4827948050554950725">إضافة بطاقة ائتمان</translation>
 <translation id="4828493911650550108">‏تحسين دقة المواقع عن طريق السماح للتطبيقات والخدمات بالبحث عن شبكات Wi-Fi وأجهزة البلوتوث.</translation>
+<translation id="4828937774870308359">أسترالي</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> غير قادر على الاتصال بالإنترنت باستخدام <ph name="NETWORK_NAME" />. يُرجى اختيار شبكة أخرى. <ph name="LEARN_MORE_LINK_START" />مزيد من المعلومات<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">تم التحقق من هوية <ph name="ORGANIZATION" /> في <ph name="LOCALITY" /> بواسطة <ph name="ISSUER" />. تم التزويد بمعلومات شفافية الشهادة الصالحة من خلال الخادم.</translation>
 <translation id="4834912470034578916">تمكين تنسيقات مخصصة لإشعارات الويب.</translation>
@@ -2772,6 +2838,7 @@
 <translation id="4849517651082200438">عدم التثبيت</translation>
 <translation id="4850258771229959924">عرض في أدوات مطوّري البرامج</translation>
 <translation id="4850458635498951714">إضافة جهاز</translation>
+<translation id="4850669014075537160">التمرير</translation>
 <translation id="4850886885716139402">عرض</translation>
 <translation id="4853020600495124913">فتح في &amp;نافذة جديدة</translation>
 <translation id="485316830061041779">الألمانية</translation>
@@ -2819,6 +2886,7 @@
 <translation id="4903369323166982260">‏أداة إزالة البرامج من Chrome</translation>
 <translation id="4906679076183257864">إعادة تعيين على الإعدادات الافتراضية</translation>
 <translation id="4907125798206348918">‏MemoryCache (ذاكرة تخزين مؤقت للذاكرة) ضعيفة.</translation>
+<translation id="4907306957610201395">فئة الإذن</translation>
 <translation id="49088176676474409">‏إخفاء قيم VPD.</translation>
 <translation id="4910021444507283344">WebGL</translation>
 <translation id="4910673011243110136">الشبكات الخاصة</translation>
@@ -2845,6 +2913,7 @@
 <translation id="4938972461544498524">إعدادات لوحة اللمس</translation>
 <translation id="4940047036413029306">علامة اقتباس</translation>
 <translation id="4941246025622441835">استخدام طلب الجهاز عند تسجيل الجهاز في إدارة المؤسسات:</translation>
+<translation id="4941627891654116707">حجم الخط</translation>
 <translation id="4942394808693235155">تحقق من وجود التحديثات وتطبيقها</translation>
 <translation id="494286511941020793">مساعدة تهيئة الخادم الوكيل</translation>
 <translation id="4950138595962845479">خيارات...</translation>
@@ -2855,6 +2924,7 @@
 <translation id="4956847150856741762">1</translation>
 <translation id="495931528404527476">‏في Chrome</translation>
 <translation id="496226124210045887">المجلد الذي حددته يشتمل على ملفات حساسة. فهل تريد بالتأكيد منح "$1" حق الدخول الدائم للقراءة في هذا المجلد؟</translation>
+<translation id="4964455510556214366">الترتيب</translation>
 <translation id="4964673849688379040">جارٍ التحقق...</translation>
 <translation id="4966802378343010715">إنشاء حساب مستخدم جديد</translation>
 <translation id="4967749818080339523">تحديد حساب</translation>
@@ -2978,6 +3048,7 @@
 <translation id="5144820558584035333">المجموعة رقم 3 الهانغولية (390)</translation>
 <translation id="5145331109270917438">تاريخ التعديل</translation>
 <translation id="5146631943508592569">تعطيل إشعار انتهاء دورة حياة الجهاز.</translation>
+<translation id="5147113189823897615">‏نظرًا لأنه تتم إدارة هذا الحساب بواسطة <ph name="DOMAIN" />، فسيتم محو الإشارات المرجعية والسجل وكلمات المرور وغيرها من الإعدادات من هذا الجهاز. ومع ذلك، ستظل بياناتك الحالية مخزنة في حسابك في Google.</translation>
 <translation id="5147237161038757796">التصحيح التلقائي للوحة المفاتيح الفعلية</translation>
 <translation id="5148320352496581610">يستخدم الاستهداف المستند إلى شكل المستطيل الموجِّه لتحديد الهدف الأكثر ترجيحًا للإيماءة، حيث يتم تمثيل منطقة اللمس بمستطيل.</translation>
 <translation id="5150254825601720210">‏اسم خادم بروتوكول SSL (طبقة المقابس الآمنة) لشهادة Netscape</translation>
@@ -3014,6 +3085,7 @@
 <translation id="5181140330217080051">تنزيل</translation>
 <translation id="5182671122927417841">تعطيل الإضافة</translation>
 <translation id="5184063094292164363">و&amp;حدة تحكم جافا سكريبت</translation>
+<translation id="5184662919967270437">تحديث جهازك</translation>
 <translation id="5185386675596372454">تم تعطيل أحدث إصدار من "<ph name="EXTENSION_NAME" />" لأنه يتطلب المزيد من الأذونات.</translation>
 <translation id="5185403602014064051">تسمح لك هذه الميزة بالدخول بسرعة إلى أي مستخدم تم تسجيل دخوله بدون طلب كلمة مرور.</translation>
 <translation id="5186650237607254032">‏حدّث قفل الشاشة في هاتفك بحيث يتم إيقاف التشغيل عندما تكون بالقرب منه. ستتمكن من إلغاء قفل الهاتف بشكل أسرع والتمتع بتجربة Smart Lock على جهاز <ph name="DEVICE_TYPE" />.</translation>
@@ -3025,6 +3097,7 @@
 <translation id="5197255632782567636">الإنترنت</translation>
 <translation id="5197680270886368025">اكتملت المزامنة.</translation>
 <translation id="5204967432542742771">إدخال كلمة المرور</translation>
+<translation id="5206215183583316675">هل تريد حذف "<ph name="CERTIFICATE_NAME" />"؟</translation>
 <translation id="520621735928254154">خطأ في استيراد الشهادة</translation>
 <translation id="5208988882104884956">نصف العرض</translation>
 <translation id="5209320130288484488">لم يتم العثور على أية أجهزة</translation>
@@ -3042,6 +3115,7 @@
 <translation id="5227808808023563348">العثور على النص السابق</translation>
 <translation id="5228076606934445476">هناك مشكلة ما في الجهاز. ولتلافي هذا الخطأ، ستحتاج إلى إعادة تشغيل الجهاز وإعادة المحاولة.</translation>
 <translation id="5228962187251412618">التحقق عبر الإنترنت فقط</translation>
+<translation id="5229189185761556138">إدارة طرق الإدخال</translation>
 <translation id="5229622432348746578">تعطيل مشاركة الصوت لسطح المكتب</translation>
 <translation id="5230516054153933099">نافذة</translation>
 <translation id="5232178406098309195">‏عند استخدام أوامر تنشيط الإعدادات الصوتية، مثل "Ok Google" أو لمس رمز الميكروفون، فإن صوتك أو نشاط إعداداتك الصوتية يعمل على تخزين بعض الأصوات وغيرها من الإعدادات الصوتية في حسابك. وسيتم تخزين تسجيل للكلام/الصوت التالي، بالإضافة إلى بضع ثوان قبلهما.</translation>
@@ -3221,7 +3295,6 @@
 <translation id="5439568486246921931">سيؤدي هذا الإجراء إلى حذف تنزيلات هذا المستخدم، والملفات في وضع عدم الاتصال، وبيانات التصفح نهائيًا. ولا يمكن التراجع عن ذلك.</translation>
 <translation id="544083962418256601">إنشاء اختصارات...</translation>
 <translation id="5441100684135434593">شبكة سلكية</translation>
-<translation id="5445088910157062298">‏السماح لخدمة موقع Google بمساعدة التطبيقات في العثور على موقعك بسرعة وبدقة، الأمر الذي يمكن أن يحد من استهلاك البطارية. وسيتم إرسال بيانات الموقع الجغرافي المجهولة الهوية إلى Google، حتى في حالة عدم تشغيل أي تطبيقات.</translation>
 <translation id="5448293924669608770">عفوًا، حدث خطأ ما عند تسجيل الدخول</translation>
 <translation id="5449588825071916739">وضع إشارة على جميع علامات التبويب</translation>
 <translation id="5449716055534515760">إغلاق &amp;النافذة</translation>
@@ -3384,6 +3457,7 @@
 <translation id="5675224880872496917">التحريك بسلاسة عند تمرير محتوى الصفحة.</translation>
 <translation id="5676267133227121599">الوصول إلى كلمات المرور من أي جهاز في <ph name="MANAGEMENT_LINK" />.</translation>
 <translation id="5677503058916217575">لغة الصفحة:</translation>
+<translation id="5677850799565527075">حظر ملفات تعريف الارتباط للجهات الخارجية.</translation>
 <translation id="5677928146339483299">تم المنع</translation>
 <translation id="5678550637669481956">تم منح إذن دخول للقراءة والكتابة إلى <ph name="VOLUME_NAME" />.</translation>
 <translation id="567881659373499783">الإصدار <ph name="PRODUCT_VERSION" /></translation>
@@ -3413,6 +3487,7 @@
 <translation id="5711983031544731014">يتعذر إلغاء القفل. أدخل كلمة المرور.</translation>
 <translation id="5712966208980506909">‏في حالة التمكين، سيعمل عنوان URL‏ chrome://md-policy على تحميل صفحة سياسة التصميم متعدد الأبعاد.</translation>
 <translation id="5715711091495208045">وسيط المكوّن الإضافي: <ph name="PLUGIN_NAME" /></translation>
+<translation id="5719603411793408026">محرّكات البحث الافتراضية</translation>
 <translation id="572328651809341494">علامات التبويب الأخيرة</translation>
 <translation id="5723508132121499792">ليس هناك تطبيقات خلفية قيد التشغيل</translation>
 <translation id="5725124651280963564">الرجاء تسجيل الدخول إلى <ph name="TOKEN_NAME" /> لإنشاء مفتاح لـ <ph name="HOST_NAME" />.</translation>
@@ -3420,14 +3495,18 @@
 <translation id="572525680133754531">لعرض حد حول طبقات العرض المركبة للمساعدة في إصلاح أخطاء التركيب ودراستها.</translation>
 <translation id="5726521882516480114">تُمكِّن استخدام وحدة معالجة الرسومات لإجراء عرض لوحات ثنائية الأبعاد بدلاً من استخدام عرض البرامج.</translation>
 <translation id="5727728807527375859">قد تلحق الإضافات والتطبيقات والمظاهر الضرر بالكمبيوتر، فهل تريد بالتأكيد المتابعة؟</translation>
+<translation id="5727970983344022445">عدم السماح لأي موقع ويب باستخدام إنشاء مفتاح في النماذج</translation>
 <translation id="5729712731028706266">&amp;عرض</translation>
 <translation id="5729996640881880439">عذرًا، لا يمكننا عرض الرمز لهذا الخطأ.</translation>
 <translation id="5731247495086897348">ل&amp;صق وانتقال</translation>
 <translation id="5731751937436428514">‏أسلوب الإدخال الفيتنامي (VIQR)</translation>
 <translation id="5732790216998904518">‏تعطيل تعديل Office للمستندات، وجداول البيانات، والعروض التقديمية لأغراض الاختبار.</translation>
 <translation id="5734362860645681824">الاتصالات</translation>
+<translation id="5739458112391494395">كبير جدًا</translation>
+<translation id="5740331643563157105"><ph name="LANGUAGE_1" />، و<ph name="LANGUAGE_2" />، و<ph name="NUM_ADDITIONAL_LANGUAGES" /> من اللغات الأخرى</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: حدد للتعديل</translation>
 <translation id="5741454054957165976">‏تمكين الإصدار الجديد المتاح من تحميل تدخل وكيل المستخدم لـ WebFonts.</translation>
+<translation id="5742598604154146709">عدم السماح لأي موقع ويب بتنزيل عدة ملفات تلقائيًا.</translation>
 <translation id="574392208103952083">متوسط</translation>
 <translation id="5744368829843057748">Translate 2016Q2 UI</translation>
 <translation id="5745056705311424885">‏اكتشاف رقاقة ذاكرة USB</translation>
@@ -3609,6 +3688,7 @@
 <translation id="5991774521050363748">تمكين تنسيقات مخصصة لإشعارات الويب. ستتضمن تحسينات تنسيقات دقيقة تعتبر غير ممكنة بخلاف ذلك.</translation>
 <translation id="5993332328670040093">لن يتم قياس استخدام البيانات بعد ذلك.</translation>
 <translation id="5996258716334177896">تعذر فتح ملفك الشخصي على نحو صحيح. قد تكون بعض الميزات غير متوفرة، الرجاء التحقق من وجود الملف الشخصي وأنه مصرح لك بقراءة محتوياته وكتابتها.</translation>
+<translation id="6001799583597751002">أرقام التعريف الشخصية غير متطابقة:</translation>
 <translation id="6003177993629630467">قد يكون <ph name="PRODUCT_NAME" /> غير قادر على تحديث نفسه.</translation>
 <translation id="6003294706906016758">تُمكن إطار نمط تطبيق الويب للتطبيقات المستضافة</translation>
 <translation id="600424552813877586">التطبيق غير صالح.</translation>
@@ -3634,6 +3714,7 @@
 <translation id="604001903249547235">النسخ الاحتياطي عبر السحاب.</translation>
 <translation id="6040143037577758943">إغلاق</translation>
 <translation id="604124094241169006">تلقائي</translation>
+<translation id="6041935588605837913">10</translation>
 <translation id="6042308850641462728">المزيد</translation>
 <translation id="604257181445267932">‏يساعدك Smart Lock على تسجيل الدخول بسرعة إلى التطبيقات والمواقع باستخدام كلمات المرور التي حفظتها مع Google.</translation>
 <translation id="6043317578411397101">‏يشارك <ph name="APP_NAME" /> علامة تبويب متصفح Chrome من خلال <ph name="TAB_NAME" />.</translation>
@@ -3653,6 +3734,7 @@
 <translation id="6062697480277116433">تستخدم الآن بيانات شبكة الجوَال</translation>
 <translation id="6065289257230303064">سمات دليل صاحب الشهادة</translation>
 <translation id="6071181508177083058">تأكيد كلمة المرور</translation>
+<translation id="6073903501322152803">إضافة ميزات إمكانية الوصول</translation>
 <translation id="6074825444536523002">‏نموذج Google</translation>
 <translation id="6075731018162044558">عفوًا! أخفق النظام في الحصول على رمز مميز للدخول لفترة زمنية طويلة إلى واجهة برمجة التطبيقات على هذا الجهاز.</translation>
 <translation id="6075880972317537864">قد يحاول المستهدفون الموجودون على <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> الاحتيال عليك لسرقة معلوماتك (على سبيل المثال، كلمات المرور أو الرسائل أو بطاقات الائتمان).</translation>
@@ -3687,7 +3769,6 @@
 <translation id="6110466548232134880">تم التحقق من هوية <ph name="ORGANIZATION" /> في <ph name="LOCALITY" /> بواسطة <ph name="ISSUER" />. لم يتم التزويد بأي من معلومات شفافية الشهادة من خلال الخادم.</translation>
 <translation id="6111770213269631447">‏التحويل الصوتي (ناماسكار ← নমস্কার)</translation>
 <translation id="6111974609785983504">تم السماح بها افتراضيًا</translation>
-<translation id="6112929985131461002">‏سيرسل هذا الجهاز تلقائيًا بيانات التشخيص والاستخدام إلى Google. يتم فرض هذا <ph name="BEGIN_LINK1" />الإعداد<ph name="END_LINK1" /> من خلال المشرف. <ph name="BEGIN_LINK2" />مزيد من المعلومات<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">تغيير إعدادات اللغة والإدخال</translation>
 <translation id="6120205520491252677">جارٍ إضافة هذه الصفحة إلى شاشة البدء...</translation>
 <translation id="6122081475643980456">يتم التحكم في اتصال الإنترنت التابع لك</translation>
@@ -3709,8 +3790,10 @@
 <translation id="6143186082490678276">الحصول على مساعدة</translation>
 <translation id="6144697279259829572">{NUM_ITEMS,plural, =1{سيؤدي هذا إلى حذف عنصر $1 على الأقل من هذا الجهاز نهائيًا.}zero{سيؤدي هذا إلى حذف $1 عنصر على الأقل من هذا الجهاز نهائيًا.}two{سيؤدي هذا إلى حذف عنصرين ($1) على الأقل من هذا الجهاز نهائيًا.}few{سيؤدي هذا إلى حذف $1 عناصر على الأقل من هذا الجهاز نهائيًا.}many{سيؤدي هذا إلى حذف $1 عنصرًا على الأقل من هذا الجهاز نهائيًا.}other{سيؤدي هذا إلى حذف $1 عنصر على الأقل من هذا الجهاز نهائيًا.}}</translation>
 <translation id="6144890426075165477">ليس <ph name="PRODUCT_NAME" /> المتصفّح الافتراضي حاليًا.</translation>
+<translation id="6145860855437952742">الحد الأقصى لعدد نوافذ المعاينة في وضع النظرة العامة التي يمكنها استخدام الأقنعة لإخفاء رؤوس النوافذ واستخدام الأركان المستديرة.</translation>
 <translation id="6147020289383635445">أخفقت معاينة الطباعة.</translation>
 <translation id="614998064310228828">طراز الجهاز:</translation>
+<translation id="6150555451039504280">تقليص/توسيع</translation>
 <translation id="6150853954427645995">لحفظ هذا الملف للاستخدام في وضع عدم الاتصال، عاود الاتصال بالإنترنت، وانقر بزر الماوس الأيمن على الملف، ثم حدد الخيار <ph name="OFFLINE_CHECKBOX_NAME" />.</translation>
 <translation id="6151323131516309312">اضغط على <ph name="SEARCH_KEY" /> للبحث في الموقع <ph name="SITE_NAME" /></translation>
 <translation id="6154697846084421647">مسجّل الدخول حاليًا</translation>
@@ -3809,6 +3892,7 @@
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{طابعة جديدة على شبكتك}zero{طابعات جديدة على شبكتك}two{طابعتان جديدتان على شبكتك}few{طابعات جديدة على شبكتك}many{طابعات جديدة على شبكتك}other{طابعات جديدة على شبكتك}}</translation>
 <translation id="6285395082104474418">يوضح لك شريط الحالة حالة كل من الشبكة والبطارية وغير ذلك.</translation>
 <translation id="6286684120317096255">يتم الآن قياس استخدام البيانات</translation>
+<translation id="6286708577777130801">تفاصيل كلمة المرور المحفوظة</translation>
 <translation id="6287852322318138013">حدد تطبيقًا لفتح هذا الملف من خلاله</translation>
 <translation id="6288919040208869552">إذا تمت تهيئة الوكيل، فإنه عادة ما يمنع من التفويض في المداخل المقيدة المختلفة. يُمكن ذلك من فتح مربع حوار تفويض المدخل المقيد في نافذة منفصلة، مما يؤدي إلى تجاهل إعدادات الوكيل.</translation>
 <translation id="6290556621549272952">‏يمكنك استخدام هذه الميزة لعرض المحتوى من Chromium على جهاز TV أو غيره من الأجهزة.</translation>
@@ -3850,6 +3934,7 @@
 <translation id="6353618411602605519">لوحة المفاتيح الكرواتية</translation>
 <translation id="6356936121715252359">‏إعدادات التخزين لبرنامج Adobe Flash Player...</translation>
 <translation id="6357619544108132570">مرحبًا بانضمامك إلى عائلة <ph name="SHORT_PRODUCT_NAME" />. معنا ستستمتع بجهاز كمبيوتر غير عادي.</translation>
+<translation id="63617602971594377">تمكين واجهة برمجة التطبيقات للدفعات على الويب</translation>
 <translation id="6361850914223837199">تفاصيل الخطأ:</translation>
 <translation id="6362853299801475928">&amp;الإبلاغ عن مشكلة...</translation>
 <translation id="636343209757971102">‏عنوان IPv6:</translation>
@@ -3885,6 +3970,7 @@
 <translation id="6410063390789552572">لا يمكن الدخول إلى مكتبة الشبكة</translation>
 <translation id="6410257289063177456">ملفات الصور</translation>
 <translation id="6410328738210026208">‏تغيير القناة وPowerwash</translation>
+<translation id="6410668567036790476">إضافة محرّك بحث</translation>
 <translation id="641105183165925463">$1 ميغابايت</translation>
 <translation id="6412931879992742813">نافذة جديدة للتصفح المتخفي</translation>
 <translation id="6418160186546245112">العودة إلى الإصدار المثبتة سابقًا من <ph name="IDS_SHORT_PRODUCT_NAME" /></translation>
@@ -3917,14 +4003,15 @@
 <translation id="6443783728907198276">‏في حالة تمكين هذا الخيار، ستحتوى رسائل Stun - التي تمّ إنشاؤها عن طريق WebRTC - على عنوان الأصل.</translation>
 <translation id="6444070574980481588">تعيين التاريخ والوقت</translation>
 <translation id="6445450263907939268">إذا كنت لا تريد هذه التغييرات، فيمكنك استعادة الإعدادات السابقة.</translation>
+<translation id="6447388538018752757">يمكّن تبديل مسار عرض الرسومات الديناميكية في اللوحات ثنائية الأبعاد لتحسين الأداء استنادًا إلى أنواع عمليات الرسم التي يتم استدعاؤها.</translation>
 <translation id="6447842834002726250">ملفّات تعريف الارتباط</translation>
 <translation id="6449285849137521213">تمت إضافة التطبيق "<ph name="EXTENSION_NAME" />".</translation>
 <translation id="6450876761651513209">تغيير الإعدادات المتعلقة بالخصوصية</translation>
+<translation id="6451180435462401570">إدارة أجهزة الطباعة في السحاب</translation>
 <translation id="6451650035642342749">محو إعدادات الفتح التلقائي</translation>
 <translation id="6452181791372256707">رفض</translation>
 <translation id="6454421252317455908">أسلوب الإدخال الصيني (سريع)</translation>
 <translation id="6455348477571378046">نوع الشهادة:</translation>
-<translation id="6456234919706689841">‏قد يختار مشرفك إرسال بيانات التشخيص والاستخدام لهذا الجهاز إلى Google. ويمكنك عرض هذا <ph name="BEGIN_LINK1" />الإعداد<ph name="END_LINK1" /> هنا. <ph name="BEGIN_LINK2" />مزيد من المعلومات<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">متابعة منع تشغيل جافا سكريبت</translation>
 <translation id="6458308652667395253">إدارة منع تشغيل جافا سكريبت...</translation>
 <translation id="6459488832681039634">استخدام التحديد للبحث</translation>
@@ -3978,10 +4065,12 @@
 <translation id="6526654154229718724">‏يتطلب وضع ملء الشاشة التجريبي مع قفل لوحة المفاتيح من المستخدمين الضغط مع الاستمرار على زر Esc للخروج.</translation>
 <translation id="6527303717912515753">مشاركة</translation>
 <translation id="6528546217685656218">المفتاح الخاص لشهادة العميل هذه مفقود أو غير صحيح.</translation>
+<translation id="652948702951888897">‏سجل Chrome</translation>
 <translation id="653019979737152879">جارٍ مزامنة <ph name="FILE_NAME" />...</translation>
 <translation id="6534583978616527129">تهيئة الاتصال</translation>
 <translation id="654039047105555694"><ph name="BEGIN_BOLD" />ملاحظة:<ph name="END_BOLD" /> يُوصى بعدم التمكين إلا إذا كنت تعرف ماذا تريد أو عندما يُطلب منك إجراء ذلك، ذلك أن جمع البيانات قد يقلل من مستوى الأداء.</translation>
 <translation id="654233263479157500">استخدام إحدى خدمات الويب للمساعدة على حل أخطاء التنقل</translation>
+<translation id="6545665334409411530">معدل التكرار</translation>
 <translation id="6545834809683560467">‏يمكنك استخدام خدمة التوقع لمساعدتك في إكمال عبارات البحث وعناوين URL التي تكتبها في شريط العناوين أو في مربع بحث تطبيقات Launcher</translation>
 <translation id="6546686722964485737">‏الانضمام إلى شبكة WiMAX</translation>
 <translation id="6547316139431024316">لا أريد التحذير مرة أخرى بشأن هذه الإضافة</translation>
@@ -4052,9 +4141,11 @@
 <translation id="6643016212128521049">محو</translation>
 <translation id="6644756108386233011">هل ترغب في إعادة تعيين إعدادات <ph name="IDS_SHORT_PRODUCT_NAME" /> التي خضعت للتغيير؟</translation>
 <translation id="6647228709620733774">‏عنوان URL لإبطال المرجع المصدق لـ Netscape</translation>
+<translation id="6647838571840953560">حاليًا على قناة <ph name="CHANNEL_NAME" /></translation>
 <translation id="6649018507441623493">لحظة من فضلك...</translation>
 <translation id="6649068951642910388">ستظهر واجهة مستخدم استعادة الجلسة في فقاعة تفسيرية بدلاً من شريط المعلومات.</translation>
 <translation id="665061930738760572">فتح في &amp;نافذة جديدة</translation>
+<translation id="6651237644330755633">الوثوق بهذه الشهادة لتحديد هوية مواقع الويب</translation>
 <translation id="6652975592920847366">إنشاء وسائط استعادة نظام التشغيل</translation>
 <translation id="6653525630739667879">يتعذر الحفظ في $1. سيتم حفظ جميع التعديلات في $2 في مجلد التنزيلات.</translation>
 <translation id="6655190889273724601">وضع مطوّر البرامج</translation>
@@ -4109,6 +4200,7 @@
 <translation id="6725970970008349185">عدد المرشحين المراد عرضهم لكل صفحة</translation>
 <translation id="672609503628871915">تعرف على الجديد</translation>
 <translation id="6727005317916125192">الجزء السابق</translation>
+<translation id="6727842159866499206">الحد الأقصى لعدد نوافذ المعاينة في وضع النظرة العامة التي يمكنها استخدام الأشكال لإخفاء رؤوس النوافذ.</translation>
 <translation id="6731320427842222405">قد يستغرق ذلك بضع دقائق</translation>
 <translation id="6731638353631257659">‏وضع التخزين المؤقت V8.</translation>
 <translation id="6732586201820838268">‏لا يمكن بناء اتصال مع هاتفك. تأكد من أنك تستخدم هاتف Android متوافقًا وأنه قيد التشغيل وعلى بعد ذراع. &lt;a&gt;مزيد من المعلومات&lt;/a&gt;</translation>
@@ -4134,6 +4226,7 @@
 <translation id="6769712124046837540">جارٍ إضافة طابعة...</translation>
 <translation id="6771503742377376720">هو مرجع مصدق</translation>
 <translation id="6773575010135450071">مزيد من الإجراءات...</translation>
+<translation id="677965093459947883">صغير جدًا</translation>
 <translation id="6780439250949340171">إدارة الإعدادات الأخرى</translation>
 <translation id="6786747875388722282">الإضافات</translation>
 <translation id="6787839852456839824">اختصارات لوحة المفاتيح</translation>
@@ -4157,6 +4250,7 @@
 <translation id="6815353853907306610">اكتشف <ph name="IDS_SHORT_PRODUCT_NAME" /> أن تغييرًا ما قد طرأ على إعدادات المتصفح بدون علمك. فهل ترغب في إعادة تعيين الإعدادات الافتراضية له؟</translation>
 <translation id="6815551780062710681">تعديل</translation>
 <translation id="6817358880000653228">كلمات المرور المحفوظة لهذا الموقع:</translation>
+<translation id="6820008762872335722">إعادة التعيين للسؤال</translation>
 <translation id="6820687829547641339">‏أرشيف tar مضغوط ببرنامج Gzip</translation>
 <translation id="682123305478866682">إرسال سطح المكتب</translation>
 <translation id="6823506025919456619">‏يلزمك تسجيل الدخول إلى Chrome للاطلاع على  أجهزتك</translation>
@@ -4176,7 +4270,9 @@
 <translation id="6833901631330113163">جنوب أوروبا</translation>
 <translation id="683526731807555621">إضافة محرك بحث جديد</translation>
 <translation id="6835762382653651563">يُرجى الاتصال بالإنترنت لتحديث <ph name="DEVICE_TYPE" />.</translation>
+<translation id="6839158130869314728">النسخ المطابق للعروض</translation>
 <translation id="6839225236531462745">خطأ حذف الشهادة</translation>
+<translation id="6840155290835956714">السؤال قبل الإرسال</translation>
 <translation id="6840184929775541289">ليس مرجعًا مصدقًا</translation>
 <translation id="6840313690797192085">$1 بيتابايت</translation>
 <translation id="6841186874966388268">أخطاء</translation>
@@ -4186,6 +4282,7 @@
 <translation id="6847758263950452722">‏حفظ الصفحة كـ MHTML</translation>
 <translation id="6853388645642883916">خدمة التحديث خاملة</translation>
 <translation id="68541483639528434">إغلاق علامات التبويب الأخرى</translation>
+<translation id="6855099371444560844">إضافة جهاز</translation>
 <translation id="6856701878604560493">تمكين الإشارات المرجعية في وضع عدم اتصال</translation>
 <translation id="6860097299815761905">إعدادات الخادم الوكيل...</translation>
 <translation id="6860427144121307915">فتح في علامة تبويب</translation>
@@ -4267,11 +4364,13 @@
 <translation id="6980956047710795611">‏ترحيل جميع بيانات نظام التشغيل Chrome إلى كلمة المرور الجديدة
 (يتطلب كلمة المرور السابقة)</translation>
 <translation id="6981982820502123353">إمكانية الدخول</translation>
+<translation id="6981992744085917617">اختيار الطريقة التي ترغب في استخدامها لتسجيل الدخول مرة أخرى إلى حسابك:</translation>
 <translation id="6982896539684144327">تم اكتشاف طابعة من <ph name="VENDOR_NAME" /></translation>
 <translation id="6983783921975806247">‏معرّف الكائنات (OID) المسجل</translation>
 <translation id="6983991971286645866">سيتم حفظ جميع التعديلات مقابل 1 دولار.</translation>
 <translation id="6985235333261347343">‏عامل استرداد مفتاح Microsoft</translation>
 <translation id="6985276906761169321">المعرِّف:</translation>
+<translation id="6985607387932385770">الطابعات</translation>
 <translation id="6986605181115043220">عذرًا، لقد توقفت المزامنة عن العمل. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
 <translation id="6989294135336900804">لا تتوفر علامات تبويب متزامنة</translation>
 <translation id="6990081529015358884">لقد نفدت المساحة</translation>
@@ -4294,6 +4393,7 @@
 <translation id="7006844981395428048">ملف صوت $1</translation>
 <translation id="7008270479623533562">من أجل تشغيل هذه الإضافة، تحتاج لتحديث الصفحة. يمكنك تشغيل هذه الإضافة تلقائيًا على هذا الموقع بالنقر بزر الماوس الأيمن على رمز الإضافة.</translation>
 <translation id="7009045250432250765">الملء التلقائي بنقرة واحدة</translation>
+<translation id="7009420427128923703">الحد الأقصى لعدد النوافذ في وضع النظرة العامة التي يمكنها استخدام الأقنعة.</translation>
 <translation id="7010160495478792664">فك تشفير فيديو الأجهزة المسرَّعة متى أمكن</translation>
 <translation id="7010400591230614821">إستراتيجية قوية لإصدار علامة التبويب</translation>
 <translation id="701080569351381435">عرض المصدر</translation>
@@ -4339,6 +4439,7 @@
 <translation id="7061692898138851896">حفظ كلمات المرور تلقائيًا</translation>
 <translation id="7062222374113411376">السماح لمواقع الويب التي تم إغلاقها مؤخرًا بإنهاء إرسال البيانات واستلامها (موصى به)</translation>
 <translation id="7063129466199351735">معالجة الاختصارات...</translation>
+<translation id="7063957500469387217">‏إعداد الطابعات أو إدارتها في الطباعة في السحاب من Google.</translation>
 <translation id="7065223852455347715">تم قفل هذا الجهاز في وضع يمنع التسجيل في المؤسسة.  إذا كنت ترغب في تسجيل الجهاز، ينبغي تنفيذ إجراءات استرداد الجهاز أولاً.</translation>
 <translation id="7065534935986314333">حول النظام</translation>
 <translation id="7066944511817949584">أخفق الاتصال بـ "<ph name="DEVICE_NAME" />".</translation>
@@ -4401,6 +4502,7 @@
 <translation id="715118844758971915">الطابعات التقليدية</translation>
 <translation id="7154130902455071009">تغيير الصفحة الرئيسية إلى: <ph name="START_PAGE" /></translation>
 <translation id="715487527529576698">الوضع الأولي للغة الصينية هو الصينية المبسطة.</translation>
+<translation id="7155171745945906037">صورة حالية من الكاميرا أو الملف</translation>
 <translation id="715568033737470079">‏تحديد المكونات الإضافية لـ PPAPI التي سيتم تشغيلها بموجب سياسة وضع الحماية لإغلاق Win32k (إصدار Windows 10 والإصدارات الأحدث فقط).</translation>
 <translation id="7156235233373189579">‏تم تصميم هذا الملف لجهاز كمبيوتر يستخدم برنامج Windows. وهذا البرنامج غير متوافق مع جهازك الذي يعمل بنظام تشغيل Chrome. يُرجى البحث في <ph name="BEGIN_LINK" />سوق Chrome الإلكتروني<ph name="END_LINK" /> للحصول على تطبيق بديل مناسب.<ph name="BEGIN_LINK_HELP" />مزيد من المعلومات<ph name="END_LINK_HELP" /></translation>
 <translation id="7157063064925785854">يُعد النقر على "متابعة" بمثابة موافقة منك على <ph name="LEGAL_DOC_LINK_TEXT_1" />، و<ph name="LEGAL_DOC_LINK_TEXT_2" />، و<ph name="LEGAL_DOC_LINK_TEXT_3" />، و<ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation>
@@ -4417,6 +4519,7 @@
 <translation id="7175353351958621980">تم التحميل من:</translation>
 <translation id="7180611975245234373">تحديث</translation>
 <translation id="7180865173735832675">تخصيص</translation>
+<translation id="7185078796915954712">طبقة النقل الآمنة 1.3</translation>
 <translation id="7185690883425432021">يخفي أزرار الإغلاق لعلامات التبويب غير النشطة عندما يكون شريط علامات التبويب في وضع الحزمة.</translation>
 <translation id="7186088072322679094">البقاء مثبتًا في شريط الأدوات</translation>
 <translation id="719009910964971313">‏لوحة مفاتيح المطور الأمريكية Dvorak</translation>
@@ -4456,6 +4559,8 @@
 <translation id="7240120331469437312">الاسم البديل لصاحب الشهادة</translation>
 <translation id="7241389281993241388">الرجاء تسجيل الدخول إلى <ph name="TOKEN_NAME" /> لاستيراد شهادة العميل.</translation>
 <translation id="7243055093079293866">‏قل "Ok Google" في علامة تبويب جديدة وgoogle.com</translation>
+<translation id="7243632151880336635">المحو والخروج</translation>
+<translation id="7245628041916450754">‏<ph name="WIDTH" /> x <ph name="HEIGHT" /> (الأفضل)</translation>
 <translation id="724691107663265825">يحتوي موقع الويب المقصود على برامج ضارة</translation>
 <translation id="725109152065019550">عذرًا، عطّل المشرف التخزين الخارجي بحسابك.</translation>
 <translation id="7252661675567922360">عدم التحميل</translation>
@@ -4469,7 +4574,9 @@
 <translation id="7262004276116528033">يستضيف <ph name="SAML_DOMAIN" /> خدمة تسجيل الدخول هذه.</translation>
 <translation id="7262221505565121">استثناءات الوصول إلى المكون الإضافي غير المحمي</translation>
 <translation id="7264275118036872269">أخفق بدء اكتشاف جهاز بلوتوث.</translation>
+<translation id="7264454014834869122">‏الاختيار من سوق Chrome الإلكتروني</translation>
 <translation id="726502072182862130">‏اسم ورمز الملف الشخصي في Google</translation>
+<translation id="7267186368513450821">5</translation>
 <translation id="7268365133021434339">إغلاق علامات التبويب</translation>
 <translation id="7268659760406822741">الخدمات المتوفرة</translation>
 <translation id="7273110280511444812">تم آخر توصيل في <ph name="DATE" /></translation>
@@ -4486,6 +4593,7 @@
 <translation id="7287143125007575591">تم رفض الدخول</translation>
 <translation id="7288592446024861651">‏ستتم مزامنة الإشارات المرجعية والسجل وكلمات المرور والإعدادات الأخرى إلى حسابك في Google حتى يتسنّى لك استخدامها على جميع أجهزتك. تحكَّم فيما تريد مزامنته على <ph name="BEGIN_LINK" /></translation>
 <translation id="7288676996127329262">‏<ph name="HORIZONTAL_DPI" />x<ph name="VERTICAL_DPI" /> نقطة لكل بوصة</translation>
+<translation id="7289225569524511578">فتح تطبيق الخلفية</translation>
 <translation id="7290242001003353852">تحاول خدمة تسجيل الدخول هذه، المُستضافة من قبل <ph name="SAML_DOMAIN" />، الدخول إلى الكاميرا.</translation>
 <translation id="7290594223351252791">تأكيد التسجيل</translation>
 <translation id="7295019613773647480">تمكين المستخدمين الخاضعين للإشراف</translation>
@@ -4524,6 +4632,7 @@
 <translation id="7347751611463936647">‏لاستخدام هذه الإضافة، اكتب "<ph name="EXTENSION_KEYWORD" />"، ثم TAB، ثم الأمر أو البحث.</translation>
 <translation id="7348093485538360975">لوحة المفاتيح على الشاشة</translation>
 <translation id="7348749398828259943">‏لوحة مفاتيح US Workman الدولية</translation>
+<translation id="7352495173098919663">تعديل</translation>
 <translation id="7352651011704765696">حدث خطأ ما</translation>
 <translation id="7353651168734309780"><ph name="EXTENSION_NAME" /> تتطلب أذونات جديدة</translation>
 <translation id="7361039089383199231">$1 بايت</translation>
@@ -4635,6 +4744,7 @@
 <translation id="749028671485790643">الشخص <ph name="VALUE" /></translation>
 <translation id="7491962110804786152">علامة تبويب</translation>
 <translation id="7493386493263658176">يمكن أن تجمع إضافة <ph name="EXTENSION_NAME" /> كل النصوص التي تكتبها، بما في ذلك المعلومات الشخصية مثل كلمات المرور وأرقام بطاقات الائتمان. هل تريد استخدام هذه الإضافة؟</translation>
+<translation id="7494694779888133066"><ph name="WIDTH" /> × <ph name="HEIGHT" /></translation>
 <translation id="7495424355577885780">في حالة التمكين، سيؤدي الإبلاغ عن مشكلة إلى تحميل واجهة المستخدم لتعليقات التصميم متعدد الأبعاد.</translation>
 <translation id="7495778526395737099">هل نسيت كلمة المرور القديمة؟</translation>
 <translation id="7503191893372251637">‏نوع شهادات Netscape</translation>
@@ -4706,7 +4816,6 @@
 <translation id="7587108133605326224">البلطيقيّة</translation>
 <translation id="7589461650300748890">توقف، وكن حذرًا.</translation>
 <translation id="7589661784326793847">انتظر قليلاً</translation>
-<translation id="7593635197364225277">‏احتفظ بنسخة احتياطية من بيانات تطبيق Play في Google Drive واستعدها تلقائيًا. ويمكنك تغيير ذلك في إعدادات Android في أي وقت. <ph name="BEGIN_LINK1" />مزيد من المعلومات<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (رمز الخطأ <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">حسنًا، استيراد</translation>
 <translation id="7600965453749440009">عدم الترجمة مطلقًا من اللغة <ph name="LANGUAGE" /></translation>
@@ -4752,6 +4861,7 @@
 <translation id="7654941827281939388">يتم الآن استخدام هذا الحساب فعلاً على هذا الكمبيوتر.</translation>
 <translation id="7658239707568436148">إلغاء</translation>
 <translation id="7659584679870740384">لا يصرح لك باستخدام هذا الجهاز. يُرجى الاتصال بالمسؤول، للحصول على إذن تسجيل الدخول.</translation>
+<translation id="7661259717474717992">السماح للمواقع بحفظ بيانات ملفات تعريف الارتباط وقراءتها</translation>
 <translation id="7663719505383602579">المتلقي: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7664620655576155379">جهاز بلوتوث غير متوافق: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="7665369617277396874">إضافة حساب</translation>
@@ -4781,6 +4891,7 @@
 <translation id="7709152031285164251">أخفق - <ph name="INTERRUPT_REASON" /></translation>
 <translation id="7709980197120276510">يُعد النقر على "متابعة" بمثابة موافقة منك على <ph name="LEGAL_DOC_LINK_TEXT_1" />، و<ph name="LEGAL_DOC_LINK_TEXT_2" />، و<ph name="LEGAL_DOC_LINK_TEXT_3" />، و<ph name="LEGAL_DOC_LINK_TEXT_4" />، و<ph name="LEGAL_DOC_LINK_TEXT_5" />.</translation>
 <translation id="7712140766624186755">الطلب وفقًا للسياسة</translation>
+<translation id="7712196439824268605">رقم التعريف الشخصي هذا سهل التخمين:</translation>
 <translation id="7713320380037170544">‏السماح لجميع المواقع باستخدام الرسائل الحصرية في النظام للدخول إلى أجهزة MIDI</translation>
 <translation id="7714464543167945231">شهادة</translation>
 <translation id="7716020873543636594">النقر تلقائيًا عند توقف مؤشر الماوس</translation>
@@ -4788,6 +4899,8 @@
 <translation id="7716781361494605745">‏عنوان URL لسياسة المرجع المصدق لـ Netscape</translation>
 <translation id="7716970641886237992">تم التعديل بواسطة</translation>
 <translation id="7717014941119698257">تنزيل: <ph name="STATUS" /></translation>
+<translation id="7717845620320228976">البحث عن تحديثات</translation>
+<translation id="7719367874908701697">تكبير/تصغير الصفحة</translation>
 <translation id="7719421816612904796">انتهاء وقت التدريب</translation>
 <translation id="771953673318695590">QA</translation>
 <translation id="7720375555307821262">‏للإشراف على هذا الشخص، <ph name="BEGIN_LINK" />سجّل الدخول إلى Chrome<ph name="END_LINK" />.</translation>
@@ -4800,6 +4913,7 @@
 <translation id="7742762435724633909">اسم المزود:</translation>
 <translation id="774465434535803574">خطأ في حزمة الإضافة</translation>
 <translation id="7748528009589593815">علامة التبويب السابقة</translation>
+<translation id="7748734060566306235">استخدم مفاتيح الأسهم لضبط حجم الصورة والمحاذاة.</translation>
 <translation id="7751260505918304024">عرض الكل</translation>
 <translation id="7754704193130578113">السؤال عن مكان حفظ الملفّات قبل التحميل</translation>
 <translation id="775622227562445982">الإغلاق السريع لعلامة التبويب/النافذة</translation>
@@ -4836,6 +4950,7 @@
 <translation id="7791543448312431591">إضافة</translation>
 <translation id="7792012425874949788">حدث خطأ ما عند تسجيل الدخول</translation>
 <translation id="7792388396321542707">إيقاف المشاركة</translation>
+<translation id="7792744925237334808">منع مواقع الويب التابعة لجهات خارجية من حفظ بيانات ملفات تعريف الارتباط وقراءتها.</translation>
 <translation id="7794058097940213561">تنسيق الجهاز</translation>
 <translation id="7799329977874311193">‏مستند HTML</translation>
 <translation id="7800518121066352902">تدوير ع&amp;كس اتجاه عقارب الساعة</translation>
@@ -4917,6 +5032,7 @@
 <translation id="7902482560616980555">‏تغيير حجم FontCache</translation>
 <translation id="7903128267494448252">حذف هذا الشخص</translation>
 <translation id="7903345046358933331">أصبحت الصفحة غير مستجيبة. يمكنك الانتظار حتى تصبح مستجيبة أو إغلاقها.</translation>
+<translation id="7903742244674067440">لديك شهادات في الملف تحدد صلاحيات الشهادة هذه</translation>
 <translation id="7903925330883316394">الأداة: <ph name="UTILITY_TYPE" /></translation>
 <translation id="7903984238293908205">كاتاكانا</translation>
 <translation id="7904094684485781019">لقد حظر مشرف هذا الحساب إمكانية الدخول المتعدد.</translation>
@@ -4964,6 +5080,7 @@
 <translation id="7973320858902175766">أداة تصحيح المُكوّنات</translation>
 <translation id="7974067550340408553">‏الحصول على إشعار على هاتفك في كل مرة يلغي فيها Smart Lock قفل جهاز <ph name="DEVICE_TYPE" />.</translation>
 <translation id="7974566588408714340">إعادة المحاولة باستخدام <ph name="EXTENSIONNAME" /></translation>
+<translation id="7974936243149753750">الخروج عن إطار الشاشة</translation>
 <translation id="7977551819349545646">‏جارٍ تحديث جهاز Chromebox...</translation>
 <translation id="7978412674231730200">مفتاح خاص</translation>
 <translation id="7979036127916589816">حدث خطأ في المزامنة</translation>
@@ -5030,9 +5147,11 @@
 <translation id="8054563304616131773">الرجاء إدخال عنوان بريد إلكتروني صالح</translation>
 <translation id="8054921503121346576">‏لوحة مفاتيح USB متصلة</translation>
 <translation id="8056430285089645882">أعي ذلك، عدم إظهار هذا لي مرة أخرى.</translation>
+<translation id="8058655154417507695">سنة انتهاء الصلاحية</translation>
 <translation id="8059178146866384858">الملف الذي يحمل الاسم "$1" موجود فعلاً. الرجاء اختيار اسم مختلف.</translation>
 <translation id="8059417245945632445">&amp;فحص الأجهزة</translation>
 <translation id="8061298200659260393">عدم السماح لأي مواقع بإرسال رسائل الدفع</translation>
+<translation id="8061820249063924643">إدارة المستخدمين تحت الإشراف</translation>
 <translation id="8063235345342641131">الصورة الرمزية الافتراضية الخضراء</translation>
 <translation id="8064671687106936412">المفتاح:</translation>
 <translation id="806705617346045388">تم اكتشاف سلوك غير معتاد</translation>
@@ -5040,7 +5159,9 @@
 <translation id="8069615408251337349">‏طباعة في السحاب من Google</translation>
 <translation id="8071942001314758122">‏فقط قل "Ok Google" ثلاث مرات</translation>
 <translation id="8072988827236813198">إضافة علامات التبويب</translation>
+<translation id="8074127646604999664">السماح لمواقع الويب التي تم إغلاقها مؤخرًا بإنهاء إرسال البيانات واستلامها</translation>
 <translation id="8079530767338315840">تكرار</translation>
+<translation id="8081705606384362428">اختيار رقم التعريف الشخصي:</translation>
 <translation id="8083739373364455075">‏احصل على 100 غيغابايت مجانية عند استخدام Google Drive</translation>
 <translation id="8088137642766812908">احذر، فهذه الميزة غير مأمونة النتائج</translation>
 <translation id="8089520772729574115">أقل من ميغابايت واحدة</translation>
@@ -5193,6 +5314,7 @@
 <translation id="827097179112817503">عرض زر الصفحة الرئيسية</translation>
 <translation id="8272443605911821513">يمكنك إدارة الإضافات من خلال النقر على "الإضافات" في قائمة "المزيد من الأدوات".</translation>
 <translation id="8275038454117074363">الاستيراد</translation>
+<translation id="827606011343515871">ليس لديك أي شهادات</translation>
 <translation id="8276560076771292512">إفراغ ذاكرة التخزين المؤقت وإعادة التحميل بشكل كامل</translation>
 <translation id="8279388322240498158">لوحة مفاتيح اللغة السورانية الكردية المدعمة بالإنجليزية</translation>
 <translation id="8280151743281770066">أرمينية صوتية</translation>
@@ -5213,7 +5335,6 @@
 <translation id="8300607741108698921">إعداد لمدة دقيقة</translation>
 <translation id="8303650969500425356">يسمح لجافا سكريبت بقفل اتجاه الشاشة.</translation>
 <translation id="8303655282093186569">إعدادات الإدخال بالبينيين</translation>
-<translation id="830424806940379275">السماح للإضافات بإنشاء نوافذ اللوحة التي تُفتح خارج إطار المتصفح. وبشكلٍ افتراضي أو في حالة تعطيلها، ستؤدي إحدى محاولات فتح أي لوحة إلى فتح نافذة منبثقة بدلاً من ذلك. تم إيقاف اللوحات على أنظمة تشغيل سطح المكتب وستتم إزالتها قريبًا.</translation>
 <translation id="8306534594034939679">‏تمكين الدعم للخدمات البديلة، وميزة HTTP التجريبية.</translation>
 <translation id="8307376264102990850">الشحن وحساب الوقت حتى ملء البطارية</translation>
 <translation id="8308179586020895837">الرجوع إليك عند رغبة <ph name="HOST" /> في الدخول إلى الكاميرا</translation>
@@ -5237,9 +5358,11 @@
 <translation id="8337399713761067085">أنت غير متصل حاليًا.</translation>
 <translation id="8338952601723052325">موقع الويب لمطوّر البرامج</translation>
 <translation id="8339012082103782726">عدم السماح لمواقع الويب باستخدام الميكروفون</translation>
+<translation id="8339059274628563283">بيانات <ph name="SITE" /> المخزنة محليًا</translation>
 <translation id="8342318071240498787">هناك ملف أو دليل موجود بهذا الاسم فعلاً.</translation>
 <translation id="834457929814110454">إذا كنت على دراية بالمخاطر التي تهدد أمانك، يمكنك <ph name="BEGIN_LINK" />زيارة هذا الموقع<ph name="END_LINK" /> قبل أن تتم إزالة البرامج الضارة.</translation>
 <translation id="8345553596530559351">‏في حالة التمكين، يحمّل عنوان URL "chrome://history/" صفحة سجل التصميم متعدد الأبعاد.</translation>
+<translation id="8347045947573765315">السماح لجميع مواقع الويب باستخدام إنشاء مفتاح في النماذج</translation>
 <translation id="8351419472474436977">أصبح بإمكان هذه الإضافة التحكم في إعدادات الخادم الوكيل التابعة لك، مما يعني أن بإمكانها تغيير أي إجراء لك عبر الإنترنت أو قطعه أو التجسس عليه. إذا كنت غير متيقن من سبب حدوث هذا التغيير، فأنت لا ترغب فيه على الأرجح.</translation>
 <translation id="8352772353338965963">يمكنك إضافة حساب إلى الدخول المتعدد. يمكن الدخول إلى جميع الحسابات التي تم تسجيل الدخول إليها بدون كلمة مرور، لذا فإن هذه الميزة لا يجب استخدامها إلا مع الحسابات الموثوق بها.</translation>
 <translation id="8353683614194668312">يمكنه:</translation>
@@ -5324,15 +5447,20 @@
 <translation id="845627346958584683">وقت انتهاء الصلاحية:</translation>
 <translation id="8456681095658380701">اسم غير صالح</translation>
 <translation id="8457625695411745683">جيد</translation>
+<translation id="8460336040822756677">‏إذا أوقفت تشغيل Smart Lock لـ <ph name="DEVICE_TYPE" />، فلن تكون قادرًا على إلغاء قفل أجهزة Chrome باستخدام هاتفك. وستحتاج إلى كتابة كلمة المرور.</translation>
+<translation id="84613761564611563">تم طلب واجهة المستخدم لتهيئة الشبكة، يُرجى الانتظار...</translation>
 <translation id="8461914792118322307">الخادم الوكيل</translation>
 <translation id="8463215747450521436">ربما يكون قد تم حذف هذا المستخدم الخاضع للإدارة أو تم تعطيله بواسطة المدير. يُرجى الاتصال بالمدير إذا كنت تريد متابعة تسجيل دخولك باسم هذا المستخدم.</translation>
 <translation id="8464132254133862871">حساب المستخدم هذا غير مؤهل للخدمة.</translation>
 <translation id="8464505512337106916">اكتشاف محتوى مكوّن إضافي مهم وتشغيله (موصى به)</translation>
+<translation id="8465252176946159372">غير صالح</translation>
 <translation id="8466234950814670489">‏أرشيف Tar</translation>
 <translation id="8467473010914675605">أسلوب الإدخال الكوري</translation>
+<translation id="8468750959626135884">‏إلغاء قفل <ph name="DEVICE_TYPE" /> باستخدام هاتف Android.</translation>
 <translation id="8472623782143987204">يستند إلى الجهاز</translation>
 <translation id="8475313423285172237">‏أضاف برنامج آخر بجهاز الكمبيوتر إضافة قد تؤدي إلى تغيير طريقة عمل Chrome.</translation>
 <translation id="8475647382427415476">‏تعذر على Google Drive مزامنة "<ph name="FILENAME" />" في الوقت الحالي. وسيعيد Google Drive المحاولة لاحقًا.</translation>
+<translation id="8476195663057048998">المحو وإعادة التعيين</translation>
 <translation id="8477241577829954800">تم استبدالها</translation>
 <translation id="8477384620836102176">&amp;عام</translation>
 <translation id="8480417584335382321">تكبير/تصغير الصفحة:</translation>
@@ -5364,6 +5492,7 @@
 <translation id="8524066305376229396">التخزين الثابت:</translation>
 <translation id="8525306231823319788">ملء الشاشة</translation>
 <translation id="8528962588711550376">جارٍ تسجيل الدخول.</translation>
+<translation id="8532294913309524834">ترتيب اللغات حسب تفضيلك.</translation>
 <translation id="8535005006684281994">‏عنوان URL لتجديد شهادة Netscape</translation>
 <translation id="8539727552378197395">‏لا (HttpOnly)</translation>
 <translation id="8543181531796978784">يمكنك <ph name="BEGIN_ERROR_LINK" />الإبلاغ عن اكتشاف مشكلة<ph name="END_ERROR_LINK" /> أو، إذا كنت تدرك المخاطر المتعلقة بالأمان، يمكنك <ph name="BEGIN_LINK" />زيارة هذا الموقع غير الآمن<ph name="END_LINK" />.</translation>
@@ -5378,6 +5507,7 @@
 <translation id="855081842937141170">تثبيت علامة التبويب</translation>
 <translation id="8551388862522347954">التراخيص</translation>
 <translation id="8551494947769799688">اللاتفية</translation>
+<translation id="8553342806078037065">إدارة الأشخاص الآخرين</translation>
 <translation id="855705891482654011">تحميل إضافات غير مضغوطة في حزمة</translation>
 <translation id="855773602626431402">تم منع تشغيل مكون إضافي غير محمي على هذه الصفحة.</translation>
 <translation id="8559694214572302298">أداة فك تشفير الصور</translation>
@@ -5455,6 +5585,7 @@
 <translation id="8662978096466608964">‏يتعذر على Chrome تعيين هذه الخلفية.</translation>
 <translation id="8663099077749055505">حظر التنزيلات المتعددة تلقائيًا بشكل دائم على <ph name="HOST" /></translation>
 <translation id="8664389313780386848">عرض م&amp;صدر الصفحة</translation>
+<translation id="866611985033792019">الوثوق بهذه الشهادة لتحديد هوية مستخدمي البريد الإلكتروني</translation>
 <translation id="8666678546361132282">الإنجليزية</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> في وضع ملء الشاشة الآن وتم تعطيل مؤشر الماوس.</translation>
 <translation id="8667808506758191620">جهاز <ph name="DEVICE_TYPE" /> مُحدّث.</translation>
@@ -5578,6 +5709,7 @@
 <translation id="8813811964357448561">أوراق</translation>
 <translation id="8814190375133053267">‏لاسلكي، Wi-Fi</translation>
 <translation id="881799181680267069">إخفاء النوافذ الأخرى</translation>
+<translation id="8818152010000655963">الخلفية</translation>
 <translation id="8818152613617627612">تفاصيل الفواتير</translation>
 <translation id="8820817407110198400">إشارات</translation>
 <translation id="8820961991571528294">اختبار</translation>
@@ -5588,8 +5720,10 @@
 <translation id="8828933418460119530">‏اسم نظام أسماء النطاقات (DNS)</translation>
 <translation id="8830796635868321089">أخفق البحث عن التحديثات باستخدام إعدادات الخادم الوكيل الحالية. الرجاء ضبط <ph name="PROXY_SETTINGS_LINK_START" />إعدادات الخادم الوكيل<ph name="PROXY_SETTINGS_LINK_END" />.</translation>
 <translation id="8831623914872394308">إعدادات المؤشر</translation>
+<translation id="8833040047958643283">التحكم في المحتوى الذي يمكن أن تعرضه مواقع الويب والمعلومات التي يمكن لتلك المواقع استخدامها أثناء تصفحك</translation>
 <translation id="8837103518490433332">هل تريد <ph name="PASSWORD_MANAGER_BRAND" /> لحفظ كلمة مرورك لـ <ph name="ORIGIN" />؟</translation>
 <translation id="8838770651474809439">هامبورجر</translation>
+<translation id="8839157109304700852">‏فتح لوحة تحكم Google</translation>
 <translation id="8841142799574815336">إطار العرض المرئي غير النشط.</translation>
 <translation id="884264119367021077">عنوان الشحن</translation>
 <translation id="8845001906332463065">الحصول على مساعدة</translation>
@@ -5600,11 +5734,13 @@
 <translation id="885381502874625531">لوحة المفاتيح البيلاروسية</translation>
 <translation id="8856844195561710094">أخفق إيقاف اكتشاف جهاز بلوتوث.</translation>
 <translation id="885701979325669005">التخزين</translation>
+<translation id="8858798938034909167">‏يمكنك الوصول إلى كلمات المرور من أي جهاز على <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="8859057652521303089">حدد لغتك:</translation>
 <translation id="8859116917079399781">تم حظر المحتوى</translation>
 <translation id="8859174528519900719">هيكل سفلي: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="8860454412039442620">‏جدول بيانات Excel</translation>
 <translation id="8863489667196658337">يمكن النظام الجديد من إنشاء تطبيقات الإشارة المرجعية.</translation>
+<translation id="8866013684546696613">الحد الأقصى لعدد النوافذ في وضع النظرة العامة التي يمكنها استخدام الأشكال.</translation>
 <translation id="8866441758832353668">تمرير التثبيت</translation>
 <translation id="8868245144144497543">تم الإنشاء بواسطة</translation>
 <translation id="8868626022555786497">قيد الاستخدام</translation>
@@ -5662,6 +5798,7 @@
 <translation id="894360074127026135">‏الترقية الدولية لـ Netscape</translation>
 <translation id="8944779739948852228">تم اكتشاف طابعة</translation>
 <translation id="8944964446326379280">يشارك <ph name="APP_NAME" /> نافذة من خلال <ph name="TAB_NAME" />.</translation>
+<translation id="8946284507644756416">‏يمكن إلغاء قفل <ph name="DEVICE_TYPE" /> باستخدام هاتفك Android.</translation>
 <translation id="8946359700442089734">لم يتم تمكين ميزات التصحيح كليًا على هذا الجهاز <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation>
 <translation id="8946784827990177241">‏تمكين دعم WebUSB.</translation>
 <translation id="89515141420106838">‏تمكين تطبيق معرض سوق Chrome الإلكتروني لبرامج تشغيل الطابعة. يبحث التطبيق في سوق Chrome الإلكتروني عن الإضافات التي تدعم الطباعة إلى طابعة USB مع رقم تعريف USB محدد.</translation>
@@ -5739,6 +5876,7 @@
 <translation id="9040185888511745258">قد يحاول المهاجمون في <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> خداعك من خلال تثبيت برامج تضر بتجربة التصفح (على سبيل المثال، من خلال تغيير صفحتك الرئيسية أو عرض إعلانات إضافية على المواقع التي تزورها).</translation>
 <translation id="9040421302519041149">الدخول إلى هذه الشبكة محمي.</translation>
 <translation id="9041603713188951722">عرض الإعدادات في نافذة</translation>
+<translation id="9042893549633094279">الخصوصية والأمان</translation>
 <translation id="904451693890288097">الرجاء إدخال مفتاح المرور لـ "<ph name="DEVICE_NAME" />":</translation>
 <translation id="9049835026521739061">وضع الحروف الكورية</translation>
 <translation id="9050666287014529139">عبارة المرور</translation>
@@ -5749,6 +5887,7 @@
 <translation id="9056810968620647706">لم يتم العثور على نتائج مطابقة.</translation>
 <translation id="9059868303873565140">قائمة الحالة</translation>
 <translation id="9064142312330104323">‏صورة الملف الشخصي في Google (جارٍ التحميل)</translation>
+<translation id="9064275926664971810">تمكين الملء التلقائي لملء النماذج بنقرة واحدة</translation>
 <translation id="9064939804718829769">جارٍ النقل...</translation>
 <translation id="9065203028668620118">تحرير</translation>
 <translation id="9066075624350113914">‏يتعذر عرض بعض أجزاء مستند PDF هذا.</translation>
@@ -5770,6 +5909,8 @@
 <translation id="9088917181875854783">الرجاء التأكيد أن مفتاح المرور هذا يظهر على "<ph name="DEVICE_NAME" />":</translation>
 <translation id="9092426026094675787">وضع علامة على الأصول غير الآمنة كغير آمنة.</translation>
 <translation id="9094033019050270033">تحديث كلمة المرور</translation>
+<translation id="9094982973264386462">إزالة</translation>
+<translation id="9095253524804455615">إزالة</translation>
 <translation id="9100765901046053179">الإعدادات المتقدمة</translation>
 <translation id="910077499156148110">إضافة استثناء لموقع ويب</translation>
 <translation id="9100825730060086615">نوع لوحة المفاتيح</translation>
@@ -5861,8 +6002,11 @@
 <translation id="9218430445555521422">تعيين كافتراضي</translation>
 <translation id="9219103736887031265">صور</translation>
 <translation id="9220525904950070496">إزالة الحساب</translation>
+<translation id="9221503095691269353">تهيئة إلغاء القفل السريع</translation>
 <translation id="923467487918828349">إظهار الكل</translation>
+<translation id="927151012416335806">تحديث جهازك إلى قناة <ph name="CHANNEL_NAME" /></translation>
 <translation id="930268624053534560">الطوابع الزمنية المفصلة</translation>
+<translation id="931068751149008062">اختيار أنواع الخط والتشفير</translation>
 <translation id="932327136139879170">الصفحة الرئيسية</translation>
 <translation id="932508678520956232">تعذر بدء الطباعة.</translation>
 <translation id="936801553271523408">بيانات تشخيص النظام</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 310c2949..d56736d 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -34,6 +34,7 @@
 <translation id="1047431265488717055">Копиране на тек&amp;ста на връзката</translation>
 <translation id="1047726139967079566">Запазване на отметка към тази страница...</translation>
 <translation id="1047956942837015229"><ph name="COUNT" /> елемента се изтриват...</translation>
+<translation id="1048286738600630630">Дисплеи</translation>
 <translation id="1048597748939794622">Принудително активиране за всички слоеве</translation>
 <translation id="1049795001945932310">&amp;Езикови настройки</translation>
 <translation id="1049926623896334335">Документ в Word</translation>
@@ -98,6 +99,7 @@
 <translation id="1125520545229165057">Дворак (хсу)</translation>
 <translation id="1128109161498068552">Да не се разрешава на сайтовете да използват специални системни съобщения за достъп до MIDI устройствата</translation>
 <translation id="1128128132059598906">EAP-TTLS</translation>
+<translation id="1128591060186966949">Редактиране на търсещата машина</translation>
 <translation id="1128987120443782698">Устройството за съхранение е с капацитет <ph name="DEVICE_CAPACITY" />. Моля, поставете SD карта или USB памет с обем поне 4 ГБ.</translation>
 <translation id="1132956125173653312">Активиране на приложения за Android на вашия Chromebook.</translation>
 <translation id="1137135726305341424">domContentLoaded и всички зареждания на ресурси, започнати преди domContentLoaded (основната рамка и вложените рамки от същия източник).</translation>
@@ -107,6 +109,7 @@
 <translation id="1145292499998999162">Приставката е блокирана</translation>
 <translation id="1146204723345436916">Импортиране на отметки от HTML файл...</translation>
 <translation id="1148624853678088576">Готови сте!</translation>
+<translation id="1149401351239820326">Месец на валидност</translation>
 <translation id="1151972924205500581">Изисква се парола</translation>
 <translation id="1154228249304313899">Отваряне на тази страница:</translation>
 <translation id="115443833402798225">Хангъл, анматае</translation>
@@ -118,6 +121,7 @@
 <translation id="1162223735669141505"><ph name="BEGIN_LINK" />Приставката за клиента с директно изпълнение<ph name="END_LINK" /> трябва да е активирана, за да използвате тази функция.</translation>
 <translation id="1163361280229063150">{NUM_DOWNLOAD,plural, =1{В момента се изтегля файл. Искате ли да анулирате изтеглянето и да излезете от режима „инкогнито“?}other{В момента се изтеглят # файла. Искате ли да анулирате изтеглянията и да излезете от режима „инкогнито“?}}</translation>
 <translation id="1163931534039071049">&amp;Преглед на изходния код на рамката</translation>
+<translation id="1164674268730883318">Да се изключи ли Smart Lock за <ph name="DEVICE_TYPE" />?</translation>
 <translation id="1165039591588034296">Грешка</translation>
 <translation id="1166212789817575481">Затваряне на разделите отдясно</translation>
 <translation id="1166359541137214543">ABC</translation>
@@ -135,6 +139,7 @@
 <translation id="1181037720776840403">Премахване</translation>
 <translation id="1183083053288481515">Използвате предоставен от администратора сертификат</translation>
 <translation id="1183237619868651138">„<ph name="EXTERNAL_CRX_FILE" />“ не може да се инсталира в локалния кеш.</translation>
+<translation id="1183917921992319637">Конфигуриране на ПИН кода</translation>
 <translation id="1185924365081634987">Може също да опитате <ph name="GUEST_SIGNIN_LINK_START" />да сърфирате като гост<ph name="GUEST_SIGNIN_LINK_END" />, за да се отстрани тази грешка в мрежата.</translation>
 <translation id="1187722533808055681">Събуждания при неактивност</translation>
 <translation id="1188807932851744811">Регистрационният файл не е качен.</translation>
@@ -200,6 +205,7 @@
 <translation id="1277908057200820621">Преглед на списъка с устройства</translation>
 <translation id="1278049586634282054">Инспектиране на изгледите:</translation>
 <translation id="1278813325885878377">Унгарска (QWERTY) клавиатура</translation>
+<translation id="1284355409890639046">Сдвояване на устройство с Bluetooth</translation>
 <translation id="1285320974508926690">Този сайт да не се превежда никога</translation>
 <translation id="1285484354230578868">Съхраняване на данните в профила ви в Google Диск</translation>
 <translation id="1290223615328246825">Автоматичният вход не бе успешен</translation>
@@ -305,6 +311,7 @@
 <translation id="143027896309062157">Четене и промяна на всичките ви данни на компютъра и в посещаваните от вас уебсайтове</translation>
 <translation id="1430915738399379752">Печат</translation>
 <translation id="1432581352905426595">Управление на търсещите машини</translation>
+<translation id="1433811987160647649">Извеждане на запитване преди осъществяване на достъп</translation>
 <translation id="1434696352799406980">Така ще се нулират началната страница, новият раздел в браузъра, търсещата машина и фиксираните раздели. Освен това ще се деактивират всички разширения и ще се изчистят временните данни, като например „бисквитките“. Отметките, историята и запазените ви пароли няма да бъдат премахнати.</translation>
 <translation id="1434886155212424586">Началната страница е новият раздел</translation>
 <translation id="1435550882135542937">Нов дизайн на лентата с инструменти за разширения</translation>
@@ -340,6 +347,7 @@
 <translation id="14720830734893704">Активирайте поддръжката за виртуална клавиатура.</translation>
 <translation id="1474079335130556426">Активиране на режима на заден план за приложния програмен интерфейс (API) за насочени съобщения. Това дава възможност на Chrome да продължи да работи след затварянето на последния прозорец и да започне да се изпълнява при стартиране на операционната система, ако този API го изисква.</translation>
 <translation id="1474339897586437869">Файлът „<ph name="FILENAME" />“ не бе качен. Нямате достатъчно свободно място в Google Диск.</translation>
+<translation id="1475502736924165259">Разполагате със сертификати, които не отговарят на нито една от другите категории</translation>
 <translation id="1476607407192946488">&amp;Езикови настройки</translation>
 <translation id="1476949146811612304">Задайте коя търсеща машина да се използва при търсене от <ph name="BEGIN_LINK" />полето за всичко<ph name="END_LINK" />.</translation>
 <translation id="1477301030751268706">Кеш на означенията за приложния програмен интерфейс (API) за самоличност</translation>
@@ -373,6 +381,7 @@
 <translation id="1510785804673676069">В случай че използвате прокси сървър, проверете настройките му или се свържете със системния си администратор, за да се уверите, че сървърът работи. Ако смятате, че не трябва да ползвате прокси сървър, коригирайте <ph name="LINK_START" />съответните настройки<ph name="LINK_END" />.</translation>
 <translation id="1510907582379248592">Запазване на паролите за <ph name="ORIGIN" />:</translation>
 <translation id="1511004689539562549">Забраняване на достъпа на сайтовете до камерата ви</translation>
+<translation id="1511388193702657997">Извеждане на предложение за запазване на паролите за мрежата</translation>
 <translation id="1511623662787566703">Влезли сте като <ph name="USER_EMAIL_ADDRESS" />. Синхронизирането е спряно чрез Google Табло за управление.</translation>
 <translation id="1514215615641002767">Добавяне към работния плот</translation>
 <translation id="1514298457297359873">Разрешава на приложенията да използват приложния програмен интерфейс (API) за сокетите за клиенти с директно изпълнение. Ползвайте само за тестване на приставки за такива клиенти.</translation>
@@ -394,6 +403,7 @@
 <translation id="1529968269513889022">последната седмица</translation>
 <translation id="1531004739673299060">Прозорец на приложението</translation>
 <translation id="1531865825384516080">Подаване на сигнали до Безопасно търсене относно URL адреси.</translation>
+<translation id="1532687502998799885">ПИН кодът трябва да съдържа поне 4 цифри:</translation>
 <translation id="1532697124104874386">Активирайте/деактивирайте интелигентното внедряване на виртуалната клавиатура.</translation>
 <translation id="1533897085022183721">По-малко от <ph name="MINUTES" />.</translation>
 <translation id="1533920822694388968">Подравняване на телевизора</translation>
@@ -422,6 +432,7 @@
 <translation id="1558988940633416251">Активирайте междуплатформената машина HarfBuzz за оформлението на текста на потребителския интерфейс. Не засяга уеб съдържанието.</translation>
 <translation id="1559235587769913376">Въвеждане на знаци от Уникод</translation>
 <translation id="1561092721008294962">HarfBuzz за текста в потребителския интерфейс</translation>
+<translation id="1566049601598938765">Уебсайт</translation>
 <translation id="1566958206723629112">Flash и PDF</translation>
 <translation id="1567723158593978621">Когато настройката е активирана, за влизането в браузъра ще се използва нова процедура на GAIA със задължително въвеждане на парола.</translation>
 <translation id="1567993339577891801">Конзола на JavaScript</translation>
@@ -479,6 +490,7 @@
 <translation id="1645228020260124617"><ph name="PRECENTAGE" />%</translation>
 <translation id="1645870377513700713">Активиране на известията с директно изпълнение.</translation>
 <translation id="1646136617204068573">Унгарска клавиатура</translation>
+<translation id="1646982517418478057">Моля, въведете парола за шифроване на този сертификат</translation>
 <translation id="164729547906544836">Тамилска клавиатура (itrans)</translation>
 <translation id="164814987133974965">Контролираният потребител може да изследва мрежата с ваше напътствие. Като негов мениджър сте в състояние:
 <ph name="BEGIN_BOLD" />да разрешавате или забранявате<ph name="END_BOLD" /> определени уебсайтове;
@@ -506,6 +518,7 @@
 <translation id="1673103856845176271">От съображения за сигурност не можа да бъде осъществен достъп до файла.</translation>
 <translation id="1675023460278456180">Material Hybrid</translation>
 <translation id="167832068858235403">сила на звука: намал.</translation>
+<translation id="1678331212993975953">Подробности за сайта</translation>
 <translation id="1679068421605151609">Инструменти за програмисти</translation>
 <translation id="1681120471812444678">Извършете настройване, за да добавите принтери…</translation>
 <translation id="1682324559341535203">Записване на <ph name="DEVICE_TYPE" /></translation>
@@ -527,11 +540,13 @@
 <translation id="1699395855685456105">Версия на хардуера:</translation>
 <translation id="1700199471143028312">Администраторът ви не разрешава да създавате контролирани потребители.</translation>
 <translation id="1701062906490865540">Премахване на този човек</translation>
+<translation id="1702294042233267824">Търсеща машина, използвана при търсене от полето за всичко</translation>
 <translation id="1702534956030472451">Западна Европа</translation>
 <translation id="1707463636381878959">Тази мрежа да се споделя с други потребители</translation>
 <translation id="1708199901407471282">При отваряне на предложена уеб страница от нов раздел в браузъра ще се превключва към вече отворения раздел за предложението, ако има такъв, вместо то да се зарежда в новия раздел.</translation>
 <translation id="1708338024780164500">(Неактивно)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (идент. №: <ph name="ID_PH" />)</translation>
+<translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (стандартно)</translation>
 <translation id="1711973684025117106">Компресирането не бе успешно. Неочаквана грешка: $1</translation>
 <translation id="1715941336038158809">Невалидно потребителско име или парола.</translation>
 <translation id="1717733954209022288">Квадратче за отметка за запазване на картите от Google Payments</translation>
@@ -626,6 +641,7 @@
 <translation id="1852799913675865625">Възникна грешка при опита за четене от файла: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1856715684130786728">Добавяне на местоположение...</translation>
 <translation id="1857166538520940818">Прикачване на файл:</translation>
+<translation id="1858585891038687145">Да се има доверие на този сертификат за идентифициране на производители на софтуер</translation>
 <translation id="1859234291848436338">Посока на писане</translation>
 <translation id="1864111464094315414">Вход</translation>
 <translation id="1864676585353837027">Промяна на начина на споделяне на тези файлове</translation>
@@ -657,6 +673,7 @@
 <translation id="1909880997794698664">Наистина ли искате това устройство да е постоянно в павилионен режим?</translation>
 <translation id="1910572251697014317">Google изпрати известие до този телефон. Обърнете внимание, че при работа с Bluetooth е възможно телефонът ви да предотвратява заключването на вашия <ph name="DEVICE_TYPE" /> от над 30 метра. В случаите, когато това може да е проблем, сте в състояние &lt;a&gt;временно да деактивирате функцията&lt;/a&gt;.</translation>
 <translation id="1910721550319506122">Добре дошли!</translation>
+<translation id="1911073860190924580">Само парола</translation>
 <translation id="1916502483199172559">Стандартен червен аватар</translation>
 <translation id="191688485499383649">При опита за установяване на връзка с/ъс <ph name="DEVICE_NAME" /> възникна неизвестна грешка.</translation>
 <translation id="1918141783557917887">&amp;По-малък</translation>
@@ -718,6 +735,8 @@
 <translation id="2007404777272201486">Подаване на сигнал за проблем...</translation>
 <translation id="2011110593081822050">Уеб работник: <ph name="WORKER_NAME" /></translation>
 <translation id="2012766523151663935">Версия на фърмуера:</translation>
+<translation id="2013984794184160106">15</translation>
+<translation id="2016430552235416146">Традиционно</translation>
 <translation id="2017052954220678795">Растеризиране с графичния процесор в отделна нишка</translation>
 <translation id="2017334798163366053">Деактивиране на събирането на данни за ефективността</translation>
 <translation id="2018352199541442911">За съжаление понастоящем външното ви устройство за съхранение не се поддържа.</translation>
@@ -734,6 +753,7 @@
 <translation id="204497730941176055">Име на шаблон за сертификат от Microsoft</translation>
 <translation id="2045969484888636535">Блокирането на „бисквитките“ да продължи</translation>
 <translation id="204622017488417136">Устройството ви ще се върне към предишната инсталирана версия на Chrome. Всички профили на потребители и локални данни ще бъдат премахнати. Това действие не може да се отмени.</translation>
+<translation id="2047962517134476164">Потвърдете данните си за вход, за да продължите</translation>
 <translation id="2048182445208425546">Достъп до трафика ви в мрежата</translation>
 <translation id="2049137146490122801">Достъпът до локални файлове на компютъра е деактивиран от администратора ви.</translation>
 <translation id="204914487372604757">Създаване на пряк път</translation>
@@ -818,10 +838,12 @@
 <translation id="2155931291251286316">Изскачащите прозорци от <ph name="HOST" /> да се показват винаги</translation>
 <translation id="215753907730220065">Изход от цял екран</translation>
 <translation id="2157875535253991059">Тази страница сега е на цял екран.</translation>
+<translation id="2161553589239083578">Потвърдете ПИН кода си:</translation>
 <translation id="216169395504480358">Добавяне на Wi-Fi...</translation>
 <translation id="2163470535490402084">Моля, свържете се с интернет, за да влезте в устройството си <ph name="DEVICE_TYPE" />.</translation>
 <translation id="2164862903024139959">Виетнамска клавиатура (TCVN)</translation>
 <translation id="2165453356262207111">Smart Lock (бета)</translation>
+<translation id="2166369534954157698">Ах, чудна българска земьо, полюшвай цъфтящи жита!</translation>
 <translation id="2167276631610992935">Javascript</translation>
 <translation id="2168214441502403371">Персийска клавиатура</translation>
 <translation id="2168725742002792683">Разширения на файловете</translation>
@@ -838,6 +860,7 @@
 <translation id="2190355936436201913">(празно)</translation>
 <translation id="2190469909648452501">Намаляване</translation>
 <translation id="2192505247865591433">От:</translation>
+<translation id="2193365732679659387">Настройки за доверие</translation>
 <translation id="2195729137168608510">Защита за имейли</translation>
 <translation id="2198315389084035571">опростен китайски</translation>
 <translation id="2199829153606285995">Гласово въвеждане за виртуалната клавиатура</translation>
@@ -855,9 +878,11 @@
 <translation id="2213819743710253654">Действие на страницата</translation>
 <translation id="2215277870964745766">Добре дошли! Задайте езика и мрежата си</translation>
 <translation id="2217501013957346740">Създаване на име –</translation>
+<translation id="2218019600945559112">Мишка и сензорен панел</translation>
 <translation id="2218515861914035131">Поставяне като неформатиран текст</translation>
 <translation id="2218947405056773815">Ами сега! <ph name="API_NAME" /> блокира.</translation>
 <translation id="2220529011494928058">Подаване на сигнал за проблем</translation>
+<translation id="2220572644011485463">ПИН код или парола</translation>
 <translation id="2221240591176106785">Активиране на презареждането без проверка</translation>
 <translation id="2222641695352322289">Единственият начин да отмените това е да преинсталирате <ph name="IDS_SHORT_PRODUCT_OS_NAME" />.</translation>
 <translation id="2224444042887712269">Тази настройка принадлежи на <ph name="OWNER_EMAIL" />.</translation>
@@ -901,6 +926,7 @@
 <translation id="2258195278080713720">Най-новите стабилни функции на JavaScript</translation>
 <translation id="2260567344816042527">Google Chrome ще използва мобилни данни, ако не сте свързани с друга мрежа.</translation>
 <translation id="2260654768907572711">ПРИСТАВКА ЗА БРАУЗЪР</translation>
+<translation id="2262477216570151239">Забавяне преди повтаряне</translation>
 <translation id="226269835214688456">Ако изключите Smart Lock за Chromebook, няма да можете да отключвате устройствата си с Chrome с телефона си. Ще трябва да въвеждате паролата си.</translation>
 <translation id="2262903407161221567">За определени компоненти на потребителския интерфейс ще се показва визуална обратна връзка при взаимодействия с докосване.</translation>
 <translation id="2263497240924215535">(Деактивирано)</translation>
@@ -914,6 +940,7 @@
 <translation id="2273562597641264981">Оператор:</translation>
 <translation id="2275694568175246751">От дясно наляво</translation>
 <translation id="2276503375879033601">Добавяне на още приложения</translation>
+<translation id="2277255602909579701">Всички „бисквитки“ и данни за сайтове</translation>
 <translation id="2278098630001018905">Използване на друг адрес за доставка</translation>
 <translation id="2278562042389100163">Отваряне на прозореца на браузъра</translation>
 <translation id="2278988676849463018">Каннада клавиатура (фонетична)</translation>
@@ -954,6 +981,7 @@
 <translation id="2339120501444485379">Въведете ново име</translation>
 <translation id="2339641773402824483">Извършва се проверка за актуализации...</translation>
 <translation id="2342060820861917889">дълго (2000 мсек)</translation>
+<translation id="2342282706041269970">Опитайте да излезете и отново да влезете в профила си.</translation>
 <translation id="23434688402327542">Клавиатура за казахски</translation>
 <translation id="2344028582131185878">Автоматични изтегляния</translation>
 <translation id="2344262275956902282">Да се използват клавишите „-“ и „=“ за прелистване на списъка с предложения</translation>
@@ -1068,6 +1096,7 @@
 <translation id="2494837236724268445">Гуджарати клавиатура (фонетична)</translation>
 <translation id="2496180316473517155">История на сърфирането</translation>
 <translation id="2496540304887968742">Устройството трябва да е с капацитет поне 4 ГБ.</translation>
+<translation id="2497229222757901769">Скорост на мишката</translation>
 <translation id="249819058197909513">Без повторно предупреждение за това приложение</translation>
 <translation id="2498436043474441766">Добавяне на принтери</translation>
 <translation id="2498539833203011245">Намаляване</translation>
@@ -1142,6 +1171,7 @@
 <translation id="2587203970400270934">Код на оператора:</translation>
 <translation id="2587922270115112871">Създаването на контролиран потребител не създава профил в Google и настройките
 и данните му няма да бъдат налични за него на други устройства чрез синхронизирането в Chrome. Контролираният потребител е валиден само за това устройство.</translation>
+<translation id="25912682830130293">Преглед на настройките, за които ще бъде подаден сигнал</translation>
 <translation id="2594049137847833442">Опции за важните сайтове в диалоговия прозорец за изчистване на данните за сърфирането</translation>
 <translation id="2594056015203442344">При активиране аудиоиндикаторите в лентата с раздели служат и за спиране на звука на разделите. Също така в контекстното меню на разделите се добавят команди за бързо заглушаване на звука на няколко избрани раздела.</translation>
 <translation id="259421303766146093">Намаляване</translation>
@@ -1194,6 +1224,7 @@
 <translation id="2665394472441560184">Добавяне на нова дума</translation>
 <translation id="2665717534925640469">Тази страница сега е на цял екран и е деактивирала курсора на мишката ви.</translation>
 <translation id="2665919335226618153">Ужас! При форматирането възникна грешка.</translation>
+<translation id="2667463864537187133">Управление на проверката на правописа</translation>
 <translation id="2668079306436607263">Придвижване в историята чрез превъртане до края</translation>
 <translation id="2670102641511624474"><ph name="APP_NAME" /> споделя раздел в Chrome.</translation>
 <translation id="2670965183549957348">Метод за въвеждане на чуинг</translation>
@@ -1216,7 +1247,9 @@
 <translation id="2694026874607847549">1 „бисквитка“</translation>
 <translation id="2696862700756109583">Изключения за цял екран</translation>
 <translation id="2702540957532124911">Клавиатура:</translation>
+<translation id="2704142793323512908">Премахване и на съществуващите ви данни от това устройство.</translation>
 <translation id="2704184184447774363">Подписване на документи от Microsoft</translation>
+<translation id="270516211545221798">Скорост на сензорния панел</translation>
 <translation id="2706892089432507937">USB устройства</translation>
 <translation id="2707024448553392710">Компонентът се изтегля</translation>
 <translation id="270921614578699633">Осредняване</translation>
@@ -1395,6 +1428,7 @@
 <translation id="2902734494705624966">Американска разширена клавиатура</translation>
 <translation id="2903493209154104877">Адреси</translation>
 <translation id="290444763029043472">Изтеглено: <ph name="DOWNLOADED_AMOUNT_MB" /> МБ/<ph name="TOTAL_AMOUNT_MB" /> МБ</translation>
+<translation id="2904456025988372123">Извеждане на запитване, когато сайт опита да изтегли автоматично повече от един файл</translation>
 <translation id="2907619724991574506">URL адреси при стартиране</translation>
 <translation id="2908162660801918428">Добавяне на медийна галерия по директория</translation>
 <translation id="2908789530129661844">Намаляване на мащаба на екрана</translation>
@@ -1441,6 +1475,7 @@
 <translation id="2963151496262057773">Следната приставка е блокирала: <ph name="PLUGIN_NAME" />. Искате ли да я спрете?</translation>
 <translation id="2963783323012015985">Турска клавиатура</translation>
 <translation id="2964193600955408481">Деактивиране на Wi-Fi</translation>
+<translation id="2964313852984024865">Редактиране</translation>
 <translation id="2966459079597787514">Шведска клавиатура</translation>
 <translation id="2966598748518102999">Подобряване на гласовото търсене чрез изпращане до Google на запис на произнасянето на „OK Google“ и няколко секунди от предхождащия звук.</translation>
 <translation id="2967544384642772068">Затваряне</translation>
@@ -1589,6 +1624,7 @@
 <translation id="3150927491400159470">Твърдо презареждане</translation>
 <translation id="315116470104423982">Мобилни данни</translation>
 <translation id="315141861755603168">„<ph name="BUNDLE_NAME" />“ ще добави следните приложения:</translation>
+<translation id="3151786313568798007">Ориентация</translation>
 <translation id="3153177132960373163">Разрешаване на всички сайтове да използват приставка за достъп до компютъра ви</translation>
 <translation id="3154429428035006212">Офлайн за повече от един месец</translation>
 <translation id="3157931365184549694">Възстановяване</translation>
@@ -1645,6 +1681,7 @@
 <translation id="3234666976984236645">Важното съдържание на този сайт да се открива винаги</translation>
 <translation id="3236997602556743698">Набор 3 (390)</translation>
 <translation id="3237784613213365159"><ph name="NEW_PROFILE_NAME" /> вече е контролиран потребител</translation>
+<translation id="323803881985677942">Отваряне на опциите на разширението</translation>
 <translation id="324056286105023296">Не сте <ph name="PROFILE_NAME" />?</translation>
 <translation id="3241680850019875542">Изберете основната директория на разширението, което ще се пакетира. За да актуализирате разширение, изберете и файла с личен ключ за повторно използване.</translation>
 <translation id="3241720467332021590">ирландски</translation>
@@ -1670,6 +1707,7 @@
 <translation id="3268451620468152448">Отворени раздели</translation>
 <translation id="3269093882174072735">Зареждане на изображението</translation>
 <translation id="3269101346657272573">Моля, въведете ПИН.</translation>
+<translation id="3269737334347286816">Данните за вход не са актуални.</translation>
 <translation id="326999365752735949">Файлът с разликите се изтегля</translation>
 <translation id="3270965368676314374">Четене, промяна и изтриване на снимки, музика и друга мултимедия от компютъра ви</translation>
 <translation id="3273410961255278341">Изпращане за:</translation>
@@ -1768,6 +1806,7 @@
 <translation id="3382073616108123819">Ами сега! Системата не успя да определи идентификаторите за това устройство.</translation>
 <translation id="3384773155383850738">Максимален брой предложения</translation>
 <translation id="3385050660708634073">Всички синхронизирани данни да се шифроват със собствения ви пропуск за синхронизиране.</translation>
+<translation id="3385131213214862288">Изчистване на следните елементи от</translation>
 <translation id="338583716107319301">Разделител</translation>
 <translation id="3386219708421216619">Отметката бе добавена</translation>
 <translation id="3391392691301057522">Стар ПИН:</translation>
@@ -1803,6 +1842,7 @@
 <translation id="3439153939049640737">Достъпът на <ph name="HOST" /> до микрофона ви винаги да е разрешен</translation>
 <translation id="3439282137581679399">Активира черния списък с разрешения, при което за сайтовете в него се блокират разрешенията за потребители на Безопасно сърфиране.</translation>
 <translation id="3439970425423980614">Отваря се визуализация на PDF</translation>
+<translation id="3440761377721825626">Извеждане на запитване, когато сайт иска да използва приставка за достъп до компютъра ви</translation>
 <translation id="3441653493275994384">Екран</translation>
 <translation id="3441653695259810643">Повторно използване на кеширан шрифт в програмата за визуализация с цел по-бързо изобразяване на оформления, включващи шрифтове с различни размери.</translation>
 <translation id="3445092916808119474">Да бъде основен</translation>
@@ -1817,6 +1857,7 @@
 <translation id="3456236151053308041">Активирайте разширенията за редактори за методи на въвеждане, за да предоставите на потребителите персонализирани изгледи за писане, като например виртуални клавиатури.</translation>
 <translation id="345693547134384690">Отваряне на &amp;изображението в нов раздел</translation>
 <translation id="3458620904104024826">Активиране на експортирането на проследяванията към ETW.</translation>
+<translation id="3459509316159669723">Отпечатване</translation>
 <translation id="3459774175445953971">Последна промяна:</translation>
 <translation id="3460771772332290399">Режим на автоматично презареждане след неуспех офлайн</translation>
 <translation id="3462413494201477527">Да се анулира ли настройването на профила?</translation>
@@ -1860,6 +1901,7 @@
 <translation id="3508920295779105875">Изберете друга папка...</translation>
 <translation id="3509527969829946096">Тази опция активира поддръжката в Cast Streaming за кодиране на видеопотоците посредством хардуера на платформата.</translation>
 <translation id="3510797500218907545">WiMAX</translation>
+<translation id="3511200754045804813">Повторно сканиране</translation>
 <translation id="3511307672085573050">Копиране на адреса на вр&amp;ъзката</translation>
 <translation id="3511399794969432965">Проблеми със свързването?</translation>
 <translation id="351152300840026870">Шрифт с фиксирана ширина</translation>
@@ -1929,6 +1971,7 @@
 <translation id="3590559774363307859">Паролата бе запазена. Тя и всичките ви <ph name="SAVED_PASSWORDS_LINK" /> са достъпни от всеки браузър.</translation>
 <translation id="3590587280253938212">бързина</translation>
 <translation id="3592260987370335752">&amp;Научете повече</translation>
+<translation id="3592313833691251126">Разрешете на разширенията да създават панелни прозорци, които се отварят извън рамката на браузъра. Ако настройката не е активирана, при опитите за отваряне на панел вместо него ще се извежда изскачащ прозорец. При стандартна конфигурация само разширенията в белия списък ще имат това разрешение. В случай че настройката е активирана, панелите ще са разрешени за всички разширения, а ако е деактивирана – ще са напълно забранени.</translation>
 <translation id="359283478042092570">Влизане</translation>
 <translation id="3593152357631900254">Активиране на режим „неточен пинин“</translation>
 <translation id="3593965109698325041">Ограничения за името на сертификата</translation>
@@ -2006,6 +2049,7 @@
 <translation id="3695919544155087829">Моля, въведете паролата, използвана за шифроването на този файл със сертификат.</translation>
 <translation id="3696411085566228381">няма</translation>
 <translation id="3697100740575341996">Системният ви администратор е деактивирал екстрите за Chrome за устройството ви. <ph name="MORE_INFO_LINK" /></translation>
+<translation id="3699080292907545058">Задаване на максималната версия на TLS, която да се активира.</translation>
 <translation id="3699624789011381381">Имейл адрес</translation>
 <translation id="3704162925118123524">Използваната от вас мрежа може да изисква да посетите страницата й за вход.</translation>
 <translation id="3704331259350077894">Прекратяване на действието</translation>
@@ -2051,10 +2095,12 @@
 <translation id="3758201569871381925">Моля, уверете се, че устройството ви Hotrod е включено и е свързано с телевизор.</translation>
 <translation id="375841316537350618">Скриптът за прокси сървъра се изтегля...</translation>
 <translation id="3759371141211657149">Управление на настройките за манипулатора...</translation>
+<translation id="3759553810934020361">Модулът за Bluetooth е изключен.</translation>
 <translation id="3759933321830434300">Блокиране на части от уеб страници</translation>
 <translation id="3760460896538743390">Инспектиране на &amp;фоновата страница</translation>
 <translation id="37613671848467444">Отваряне на прозорец в режим „&amp;инкогнито“</translation>
 <translation id="3763401818161139108">Стартиране винаги на <ph name="ORIGIN" /></translation>
+<translation id="3764314093345384080">Подробна информация за компилацията</translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Комуникация с USB устройство}other{Комуникация с # USB устройства}}</translation>
 <translation id="3764800135428056022">Извеждане на предложение за запазване на паролите за мрежата.</translation>
 <translation id="3764986667044728669">Записването не може да се извърши</translation>
@@ -2084,6 +2130,7 @@
 <translation id="3798449238516105146">Версия</translation>
 <translation id="3798935682015223249">Поддръжка за MTP в диспечера на файловете</translation>
 <translation id="3800764353337460026">Стил на символите</translation>
+<translation id="3800806661949714323">Показване на всички (препоръчително)</translation>
 <translation id="3801082500826908679">фарьорски</translation>
 <translation id="3803991353670408298">Моля, добавете друг метод за въвеждане, преди да премахнете този.</translation>
 <translation id="380408572480438692">Активирането на функцията за събиране на данни за ефективността ще помогне на Google да подобри системата с течение на времето. Те не се изпращат, докато не изготвите отчет с отзиви (Alt-Shift-I) и не включите в него съответната информация. Можете да се върнете към този екран по всяко време, за да деактивирате събирането й.</translation>
@@ -2101,6 +2148,7 @@
 <translation id="3819007103695653773">Разрешаване на всички сайтове да изпращат насочени съобщения на заден план</translation>
 <translation id="3819752733757735746">Достъп с превключване (контролиране на компютъра само с един или два превключвателя)</translation>
 <translation id="3819800052061700452">На &amp;цял екран</translation>
+<translation id="3821453754632750466">Активиране на плащанията в мрежата</translation>
 <translation id="3822265067668554284">Забраняване на сайтовете да проследяват физическото ви местоположение</translation>
 <translation id="3825863595139017598">Монголска клавиатура</translation>
 <translation id="3827306204503227641">Разрешаването на приставки извън тестова среда да продължи</translation>
@@ -2162,9 +2210,11 @@
 <translation id="3899968422636198696"><ph name="ORGNAME" /> – <ph name="HOSTNAME" /></translation>
 <translation id="3901991538546252627">Установява се връзка със: <ph name="NAME" /></translation>
 <translation id="3902799646152133632">Пропуска основната рамка с атрибут „no-store“.</translation>
+<translation id="3904196543277238487">Максимална версия на TLS, която да се активира.</translation>
 <translation id="3905761538810670789">Поправяне на приложението</translation>
 <translation id="390718707505136526">Активира изпитанията на източниците с цел контролиране на достъпа до експериментите с функции/API.</translation>
 <translation id="3908501907586732282">Активиране на разширението</translation>
+<translation id="3909690856344416952"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /> и още 1</translation>
 <translation id="3909791450649380159">Изрязва&amp;не</translation>
 <translation id="3910699493603749297">Кхмерска клавиатура</translation>
 <translation id="3911073280391218446"><ph name="USER_DISPLAY_NAME" /> (името се използва на това устройство)</translation>
@@ -2184,6 +2234,7 @@
 <translation id="3930521966936686665">Възпроизвеждане на</translation>
 <translation id="3936390757709632190">&amp;Отваряне на аудиоклипа в нов раздел</translation>
 <translation id="3936768791051458634">Промяна на канала...</translation>
+<translation id="3936925983113350642">Паролата, която изберете, ще се изисква по-късно за възстановяване на този сертификат. Моля, запишете я на сигурно място.</translation>
 <translation id="3937640725563832867">Алтернативно име на издателя на сертификата</translation>
 <translation id="3938113500786732264">По-бързо превключване между хората</translation>
 <translation id="3940233957883229251">Активиране на автоматичното повторение</translation>
@@ -2251,9 +2302,10 @@
 <translation id="4034042927394659004">Намаляване на яркостта на клавишите</translation>
 <translation id="4035758313003622889">Мени&amp;джър на задачите</translation>
 <translation id="4037084878352560732">Кон</translation>
-<translation id="4037102579141982963">Устройството автоматично ще изпраща до Google данни за диагностиката и употребата. Можете да промените това по всяко време от <ph name="BEGIN_LINK1" />настройките<ph name="END_LINK1" /> му. <ph name="BEGIN_LINK2" />Научете повече<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Активиране на осигуряващия достъпност превключвател на раздели за Android.</translation>
+<translation id="4037889604535939429">Редактиране на подстраницата за човека</translation>
 <translation id="4044260751144303020">Изграждане за елементи с фиксирана позиция.</translation>
+<translation id="4044612648082411741">Въведете паролата си за сертификата</translation>
 <translation id="404493185430269859">Основна търсеща машина</translation>
 <translation id="4047112090469382184">Защо това е сигурно</translation>
 <translation id="4047345532928475040">Няма данни</translation>
@@ -2346,6 +2398,7 @@
 <translation id="417475959318757854">Центриране на стартовия панел за приложения.</translation>
 <translation id="4176463684765177261">Деактивирано</translation>
 <translation id="4179512409951755566">Активиране на продължаващото превъртане за екранната клавиатура</translation>
+<translation id="418062721134714140">Управление на SSL сертификатите и настройките ви</translation>
 <translation id="4180788401304023883">Да се изтрие ли сертификатът на сертифициращ орган „<ph name="CERTIFICATE_NAME" />“?</translation>
 <translation id="418179967336296930">Руска фонетична клавиатура (YaZHert)</translation>
 <translation id="4181841719683918333">Езици</translation>
@@ -2360,6 +2413,7 @@
 <translation id="4195643157523330669">Отваряне в нов раздел</translation>
 <translation id="4195814663415092787">Продължаване оттам, откъдето сте прекъснали</translation>
 <translation id="4197674956721858839">Избор за компресиране</translation>
+<translation id="4200689466366162458">Персонализирани думи</translation>
 <translation id="4200983522494130825">Нов &amp;раздел</translation>
 <translation id="4206144641569145248">Извънземно</translation>
 <translation id="420665587194630159">(Това разширение е управлявано и не може да се премахне или деактивира.)</translation>
@@ -2456,10 +2510,12 @@
 <translation id="4350019051035968019">Това устройство не може да бъде регистрирано в домейна, към който принадлежи профилът ви, защото е означено за управление от друг домейн.</translation>
 <translation id="4354806558096370704">Активира използването на задния слой за отпечатване със стандартната система CUPS.</translation>
 <translation id="4355925451975609675">Натиснете |<ph name="ACCELERATOR1" />| + |<ph name="ACCELERATOR2" />|, за да преминете напред</translation>
+<translation id="4358353773267946514"><ph name="LANGUAGE_1" /> и <ph name="LANGUAGE_2" /></translation>
 <translation id="4358697938732213860">Добавяне на адрес</translation>
 <translation id="4359408040881008151">Инсталирано заради зависимо разширение или съответно разширения.</translation>
 <translation id="4361190688154226069">Основано на правоъгълник насочване в изгледите</translation>
 <translation id="4361765875689149937"><ph name="ORIGIN" /> иска да се сдвои със:</translation>
+<translation id="4363771538994847871">Няма намерени местоназначения за Cast. Нуждаете ли се от помощ?</translation>
 <translation id="4364444725319685468">„<ph name="FILE_NAME" />“ се изтегли</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> споделя прозорец.</translation>
 <translation id="4364830672918311045">Показване на известия</translation>
@@ -2551,6 +2607,7 @@
 <translation id="4509345063551561634">Местоположение:</translation>
 <translation id="4514542542275172126">Настройване на нов контролиран потребител</translation>
 <translation id="4514914692061505365">Принудително използване на бързия преобразувател Subzero на PNaCl за всички преносими изпълними файлове.</translation>
+<translation id="451515744433878153">Премахване</translation>
 <translation id="4516641987425683031">Синхронизирани раздели</translation>
 <translation id="4518677423782794009">Възникват ли сривове в Chrome, показват ли се необичайни страници при стартиране или ленти с инструменти, виждате ли неочаквани реклами, които не можете да премахнете, или друга промяна в практическата си работа при сърфиране? Възможно е да решите проблема, като стартирате инструмента за почистване на Chrome.</translation>
 <translation id="452039078290142656">неизвестни устройства от <ph name="VENDOR_NAME" /></translation>
@@ -2587,6 +2644,7 @@
 <translation id="4562991793854515912">изключително кратко (600 мсек)</translation>
 <translation id="4563210852471260509">Първоначалният език за въвеждане да бъде китайски</translation>
 <translation id="456664934433279154">Контролира дали за приложенията за Chrome да се използват прозорци, основани на изгледи с инструментариум.</translation>
+<translation id="4567772783389002344">Добавяне на дума</translation>
 <translation id="4569998400745857585">Менюто съдържа скрити разширения</translation>
 <translation id="4570444215489785449">Вече можете да заключвате това устройство отдалечено по всяко време чрез Chrome Manager.</translation>
 <translation id="4572659312570518089">Удостоверяването бе анулирано при установяването на връзка с/ъс <ph name="DEVICE_NAME" />.</translation>
@@ -2598,11 +2656,13 @@
 <translation id="4582447636905308869">Нов редактор за метод на въвеждане (IME) на корейски, основан на машината със скрити марковски модели (HMM) на Google Инструменти за въвеждане на текст.</translation>
 <translation id="4582563038311694664">Нулиране на всички настройки</translation>
 <translation id="4583537898417244378">Невалиден или повреден файл.</translation>
+<translation id="4585793705637313973">Редактиране на страницата</translation>
 <translation id="4589268276914962177">Нов терминален раздел</translation>
 <translation id="4590324241397107707">Хранилище за базата от данни</translation>
 <translation id="4593021220803146968">&amp;Към <ph name="URL" /></translation>
 <translation id="4594109696316595112">Еднократно активиране: Въведете паролата си, за да активирате Smart Lock на този <ph name="DEVICE_TYPE" />. С тази функция отключването на това устройство ще става от телефона ви – без парола. За да промените или изключите функцията, отворете настройките на своя <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4595560905247879544">Само мениджърът (<ph name="CUSTODIAN_NAME" />) може да променя приложенията и разширенията.</translation>
+<translation id="4596295440756783523">Разполагате със сертификати, които идентифицират тези сървъри</translation>
 <translation id="4598556348158889687">Управление на хранилището</translation>
 <translation id="4601242977939794209">Преобразуване в EMF</translation>
 <translation id="4602466770786743961">Достъпът на <ph name="HOST" /> до камерата и микрофона ви да е разрешен винаги</translation>
@@ -2667,6 +2727,7 @@
 <translation id="4697551882387947560">При приключване на сесията на сърфиране</translation>
 <translation id="4699172675775169585">Кеширани изображения и файлове</translation>
 <translation id="4699357559218762027">(автоматично стартирано)</translation>
+<translation id="4704677965327178154">Забраняване на сайтовете да използват приставка за достъп до компютъра ви.</translation>
 <translation id="4707302005824653064">Мениджърът (<ph name="CUSTODIAN_EMAIL" />) може да преглежда данните за употребата и историята на адрес chrome.com.</translation>
 <translation id="4707579418881001319">L2TP/IPsec с потребителски сертификат</translation>
 <translation id="4707934200082538898">Моля, проверете електронната си поща за <ph name="BEGIN_BOLD" /><ph name="MANAGER_EMAIL" /><ph name="END_BOLD" /> за следващи указания.</translation>
@@ -2704,6 +2765,7 @@
 <translation id="4744574733485822359">Изтеглянето ви завърши</translation>
 <translation id="4746971725921104503">Изглежда, че вече управлявате потребител с това име. Искате ли <ph name="LINK_START" />да импортирате <ph name="USER_DISPLAY_NAME" /> на устройството<ph name="LINK_END" />?</translation>
 <translation id="4747271164117300400">македонски</translation>
+<translation id="4748762018725435655">Изисква се разширение от уеб магазина на Chrome</translation>
 <translation id="4749157430980974800">Грузинска клавиатура</translation>
 <translation id="4750394297954878236">Предложения</translation>
 <translation id="475088594373173692">Първи потребител</translation>
@@ -2717,6 +2779,7 @@
 <translation id="4763830802490665879">„Бисквитките“ от няколко сайта ще бъдат изчистени при изход.</translation>
 <translation id="4764029864566166446">Актуализиране на приставката...</translation>
 <translation id="4764865176798926079">domContentLoaded за главната рамка и всички зареждания на ресурси, започнати преди domContentLoaded (вложените рамки се пренебрегват).</translation>
+<translation id="4768332406694066911">Имате идентифициращи ви сертификати от тези организации</translation>
 <translation id="4768698601728450387">Подрязване на изображението</translation>
 <translation id="4773696473262035477">Тя и всичките ви <ph name="SAVED_PASSWORDS_LINK" /> са достъпни от всеки браузър.</translation>
 <translation id="4776917500594043016">Парола за <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -2734,10 +2797,12 @@
 <translation id="4793866834012505469">Повторно обучение на гласовия модел</translation>
 <translation id="479536056609751218">Уеб страница, само HTML</translation>
 <translation id="479989351350248267">search</translation>
+<translation id="480036413855787547">Паролите ви са достъпни на адрес <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> от всяко устройство. На Mac те може да се запазват в Keychain и да се използват или синхронизират от други потребители на Chrome, ползващи този профил в OS X.</translation>
 <translation id="4801257000660565496">Създаване на преки пътища към приложението</translation>
 <translation id="4801448226354548035">Скриване на профилите</translation>
 <translation id="4801512016965057443">Разрешаване на роуминг за данни</translation>
 <translation id="4801956050125744859">Запазванe на двете версии</translation>
+<translation id="4803121606678474433">Активиране на превключването на режима за динамично изобразяване в двуизмерното платно.</translation>
 <translation id="4803909571878637176">Деинсталира се</translation>
 <translation id="4804331037112292643">Диалогов прозорец за отваряне/запазване на файлове</translation>
 <translation id="4804818685124855865">Изключване</translation>
@@ -2756,6 +2821,7 @@
 <translation id="4824518112777153488">Поддръжка за сензорни екрани със задействане от разстояние</translation>
 <translation id="4827948050554950725">Добавяне на кредитна карта</translation>
 <translation id="4828493911650550108">Подобрете точността на местоположението, като разрешите на приложенията и услугите да сканират за Wi-Fi мрежи и устройства с Bluetooth.</translation>
+<translation id="4828937774870308359">Обратно</translation>
 <translation id="4830573902900904548">Устройството ви <ph name="DEVICE_TYPE" /> не може да се свърже с интернет през „<ph name="NETWORK_NAME" />“. Моля, изберете друга мрежа. <ph name="LEARN_MORE_LINK_START" />Научете повече<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Самоличността на <ph name="ORGANIZATION" /> в/ъв <ph name="LOCALITY" /> е потвърдена от <ph name="ISSUER" />. Сървърът предостави валидна информация за прозрачност на сертификата.</translation>
 <translation id="4834912470034578916">Активиране на персонализираните оформления за известия от мрежата.</translation>
@@ -2774,6 +2840,7 @@
 <translation id="4849517651082200438">Да не се инсталира</translation>
 <translation id="4850258771229959924">Преглед в инструментите за програмисти</translation>
 <translation id="4850458635498951714">Добавяне на устройство</translation>
+<translation id="4850669014075537160">Превъртане</translation>
 <translation id="4850886885716139402">Изглед</translation>
 <translation id="4853020600495124913">Отваряне в &amp;нов прозорец</translation>
 <translation id="485316830061041779">немски</translation>
@@ -2821,6 +2888,7 @@
 <translation id="4903369323166982260">Стартиране на инструмента за почистване на Chrome</translation>
 <translation id="4906679076183257864">Възстановяване на настройката по подразбиране</translation>
 <translation id="4907125798206348918">MemoryCache със слаби референции.</translation>
+<translation id="4907306957610201395">Категория за разрешения</translation>
 <translation id="49088176676474409">Скриване на стойностите на VPD.</translation>
 <translation id="4910021444507283344">WebGL</translation>
 <translation id="4910673011243110136">Частни мрежи</translation>
@@ -2847,6 +2915,7 @@
 <translation id="4938972461544498524">Настройки за сензорния панел</translation>
 <translation id="4940047036413029306">Кавички</translation>
 <translation id="4941246025622441835">Използване на заявката за устройството при записването му за корпоративно управление:</translation>
+<translation id="4941627891654116707">Размер на шрифта</translation>
 <translation id="4942394808693235155">Проверка за актуализации и прилагане на наличните</translation>
 <translation id="494286511941020793">Помощ за конфигурация на прокси сървър</translation>
 <translation id="4950138595962845479">Опции...</translation>
@@ -2857,6 +2926,7 @@
 <translation id="4956847150856741762">1</translation>
 <translation id="495931528404527476">В Chrome</translation>
 <translation id="496226124210045887">Избраната от вас папка съдържа деликатни файлове. Наистина ли искате да предоставите на „$1“ постоянен достъп за четене от тази папка?</translation>
+<translation id="4964455510556214366">Подредба</translation>
 <translation id="4964673849688379040">Проверява се...</translation>
 <translation id="4966802378343010715">Създаване на нов потребител</translation>
 <translation id="4967749818080339523">Избиране на профил</translation>
@@ -2981,6 +3051,7 @@
 <translation id="5144820558584035333">Хангъл, 3 набора (390)</translation>
 <translation id="5145331109270917438">Дата на промяна</translation>
 <translation id="5146631943508592569">Деактивиране на известието за приключване на жизнения цикъл на устройството.</translation>
+<translation id="5147113189823897615">Тъй като профилът се управлява от <ph name="DOMAIN" />, вашите отметки, история, пароли и други настройки ще бъдат изчистени от това устройство. Данните ви обаче ще продължат да се съхраняват в профила ви в Google.</translation>
 <translation id="5147237161038757796">Автоматични поправки за физическата клавиатура</translation>
 <translation id="5148320352496581610">Основаното на правоъгълник насочване определя най-вероятната цел на жеста посредством евристичен метод, при който областта за докосване е представена чрез правоъгълник.</translation>
 <translation id="5150254825601720210">Име на SSL сървър за сертификат на Netscape</translation>
@@ -3017,6 +3088,7 @@
 <translation id="5181140330217080051">Изтегля се</translation>
 <translation id="5182671122927417841">Деактивиране на разширението</translation>
 <translation id="5184063094292164363">&amp;Конзола на JavaScript</translation>
+<translation id="5184662919967270437">Устройството ви се актуализира</translation>
 <translation id="5185386675596372454">Най-новата версия на „<ph name="EXTENSION_NAME" />“ бе деактивирана, тъй като изисква повече разрешения.</translation>
 <translation id="5185403602014064051">С тази функция получавате бърз достъп без парола до всеки влязъл потребител.</translation>
 <translation id="5186650237607254032">Актуализирайте функцията за заключване на екрана на телефона си, така че тя да се деактивира, когато сте наблизо. Ще отключвате телефона по-бързо и ще се наслаждавате на по-добра практическа работа със Smart Lock на своя <ph name="DEVICE_TYPE" />.</translation>
@@ -3028,6 +3100,7 @@
 <translation id="5197255632782567636">Интернет</translation>
 <translation id="5197680270886368025">Синхронизирането завърши.</translation>
 <translation id="5204967432542742771">Въведете парола</translation>
+<translation id="5206215183583316675">Да се изтрие ли „<ph name="CERTIFICATE_NAME" />“?</translation>
 <translation id="520621735928254154">Грешка при импортирането на сертификата</translation>
 <translation id="5208988882104884956">С половин ширина</translation>
 <translation id="5209320130288484488">Няма намерени устройства</translation>
@@ -3045,6 +3118,7 @@
 <translation id="5227808808023563348">Търсене на предишния текст</translation>
 <translation id="5228076606934445476">Нещо не е наред с устройството. За възстановяване от тази грешка ще трябва да рестартирате устройството и да опитате отново.</translation>
 <translation id="5228962187251412618">Само онлайн проверка</translation>
+<translation id="5229189185761556138">Управление на методите на въвеждане</translation>
 <translation id="5229622432348746578">Деактивиране на споделянето на звука за работния плот</translation>
 <translation id="5230516054153933099">Прозорец</translation>
 <translation id="5232178406098309195">Когато използвате команди за аудиоактивиране, като например „Ok Google“, или докоснете иконата на микрофон, частната ви функция за гласова и аудиоактивност съхранява гласови данни и друг звук в профила ви. Ще бъде съхранен запис на следващите говор и звук, както и на тези от няколко секунди преди това.</translation>
@@ -3224,7 +3298,6 @@
 <translation id="5439568486246921931">Така ще се изтрият за постоянно изтеглянията, офлайн файловете и данните за сърфирането на този потребител. Действието не може да бъде отменено.</translation>
 <translation id="544083962418256601">Създаване на преки пътища...</translation>
 <translation id="5441100684135434593">Кабелна мрежа</translation>
-<translation id="5445088910157062298">Позволете на услугата ни за местоположение да помага на приложенията да установяват бързо и точно къде се намирате. Това може да намали използването на батерията. До Google ще се изпращат анонимни данни за местоположението дори когато не се изпълняват приложения.</translation>
 <translation id="5448293924669608770">Ами сега! Нещо се обърка при влизане</translation>
 <translation id="5449588825071916739">Запазване на отметки към всички раздели</translation>
 <translation id="5449716055534515760">Затваряне на &amp;прозореца</translation>
@@ -3388,6 +3461,7 @@
 <translation id="5675224880872496917">Плавно анимиране при превъртане на съдържанието на страниците.</translation>
 <translation id="5676267133227121599">Осъществявайте достъп до паролите си от всяко устройство на адрес <ph name="MANAGEMENT_LINK" />.</translation>
 <translation id="5677503058916217575">Език на страницата:</translation>
+<translation id="5677850799565527075">Блокиране на „бисквитките“ на трети страни.</translation>
 <translation id="5677928146339483299">Блокирано</translation>
 <translation id="5678550637669481956">Предоставен е достъп до „<ph name="VOLUME_NAME" />“ за четене и запис.</translation>
 <translation id="567881659373499783">Версия <ph name="PRODUCT_VERSION" /></translation>
@@ -3417,6 +3491,7 @@
 <translation id="5711983031544731014">Не може да се отключи. Въведете паролата си.</translation>
 <translation id="5712966208980506909">Ако настройката е активирана, чрез URL адреса chrome://md-policy ще се зарежда основаната на material design страница с правила.</translation>
 <translation id="5715711091495208045">Посредник за приставки: <ph name="PLUGIN_NAME" /></translation>
+<translation id="5719603411793408026">Търсещи машини по подразбиране</translation>
 <translation id="572328651809341494">Скорошни раздели</translation>
 <translation id="5723508132121499792">Не се изпълняват приложения на заден план</translation>
 <translation id="5725124651280963564">Моля, влезте в/ъв <ph name="TOKEN_NAME" />, за да генерирате ключ за <ph name="HOST_NAME" />.</translation>
@@ -3424,14 +3499,18 @@
 <translation id="572525680133754531">Показва контур около комбинираните слоеве на изобразяване, за да помогне при отстраняването на грешки и изучаването на комбинирането на слоевете.</translation>
 <translation id="5726521882516480114">Активира използването на графичния процесор с цел двуизмерно изобразяване чрез елемента canvas, вместо да се ползва софтуерно изобразяване.</translation>
 <translation id="5727728807527375859">Разширенията, приложенията и темите могат да навредят на компютъра ви. Наистина ли искате да продължите?</translation>
+<translation id="5727970983344022445">Забраняване на сайтовете да генерират ключове във формуляри</translation>
 <translation id="5729712731028706266">&amp;Изглед</translation>
 <translation id="5729996640881880439">За съжаление не можем да покажем кода на тази грешка.</translation>
 <translation id="5731247495086897348">&amp;Поставяне и старт</translation>
 <translation id="5731751937436428514">Метод за въвеждане на виетнамски (VIQR)</translation>
 <translation id="5732790216998904518">Редактиране на файлове от Office в Документи, Таблици и Презентации с тестова цел.</translation>
 <translation id="5734362860645681824">Комуникации</translation>
+<translation id="5739458112391494395">Много голям</translation>
+<translation id="5740331643563157105"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /> и още <ph name="NUM_ADDITIONAL_LANGUAGES" /></translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: Изберете, за да редактирате</translation>
 <translation id="5741454054957165976">Активирайте новата версия на функцията за намеса на потребителския агент при зареждане на уеб шрифтове.</translation>
+<translation id="5742598604154146709">Забраняване на сайтовете да изтеглят автоматично няколко файла.</translation>
 <translation id="574392208103952083">Среден</translation>
 <translation id="5744368829843057748">Потребителски интерфейс на Преводач от второто тримесечие на 2016 г.</translation>
 <translation id="5745056705311424885">Открита е USB памет</translation>
@@ -3613,6 +3692,7 @@
 <translation id="5991774521050363748">Активирайте персонализираните оформления, които ще внесат прецизни и иначе неосъществими подобрения в облика на известията от мрежата.</translation>
 <translation id="5993332328670040093">Преносът на данни вече няма да се измерва.</translation>
 <translation id="5996258716334177896">Потребителският ви профил не можа да бъде отворен правилно. Възможно е да няма достъп до някои функции. Моля, уверете се, че потребителският профил съществува и имате разрешение за четене и запис на съдържанието му.</translation>
+<translation id="6001799583597751002">ПИН кодовете не са идентични:</translation>
 <translation id="6003177993629630467">Възможно е <ph name="PRODUCT_NAME" /> да не може да се поддържа актуален.</translation>
 <translation id="6003294706906016758">Активира за хостваните приложения рамка в стил уеб приложение</translation>
 <translation id="600424552813877586">Невалидно приложение.</translation>
@@ -3638,6 +3718,7 @@
 <translation id="604001903249547235">Резервни копия в облака</translation>
 <translation id="6040143037577758943">Затваряне</translation>
 <translation id="604124094241169006">Автоматично</translation>
+<translation id="6041935588605837913">10</translation>
 <translation id="6042308850641462728">Още</translation>
 <translation id="604257181445267932">Smart Lock ви помага да влизате бързо в приложения и сайтове посредством паролите, които сте запазили в Google.</translation>
 <translation id="6043317578411397101"><ph name="APP_NAME" /> споделя раздел в Chrome с/ъс „<ph name="TAB_NAME" />“.</translation>
@@ -3657,6 +3738,7 @@
 <translation id="6062697480277116433">Използвате мобилни данни</translation>
 <translation id="6065289257230303064">Атрибути за директорията на субекта на сертификата</translation>
 <translation id="6071181508177083058">потвърждаване на паролата</translation>
+<translation id="6073903501322152803">Добавяне на функции за достъпност</translation>
 <translation id="6074825444536523002">Формуляр на Google</translation>
 <translation id="6075731018162044558">Ами сега!  Системата не успя да получи дългосрочно означение за достъп на това устройство до приложния програмен интерфейс (API).</translation>
 <translation id="6075880972317537864">Извършителите на атака срещу <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> може да опитат да ви подведат, за да откраднат информацията ви (например пароли, съобщения или номера на кредитни карти).</translation>
@@ -3691,7 +3773,6 @@
 <translation id="6110466548232134880">Самоличността на <ph name="ORGANIZATION" /> в/ъв <ph name="LOCALITY" /> е потвърдена от <ph name="ISSUER" />. Сървърът не предостави информация за прозрачност на сертификата.</translation>
 <translation id="6111770213269631447">Транслитерация (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Разрешено по подразбиране</translation>
-<translation id="6112929985131461002">Устройството автоматично ще изпраща до Google данни за диагностиката и употребата. Тази <ph name="BEGIN_LINK1" />настройка<ph name="END_LINK1" /> е наложена от администратора ви. <ph name="BEGIN_LINK2" />Научете повече<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Промяна на настройките за език и въвеждане</translation>
 <translation id="6120205520491252677">Фиксиране на тази страница в стартовия екран...</translation>
 <translation id="6122081475643980456">Връзката ви с интернет се контролира</translation>
@@ -3713,8 +3794,10 @@
 <translation id="6143186082490678276">Получаване на помощ</translation>
 <translation id="6144697279259829572">{NUM_ITEMS,plural, =1{Поне $1 елемент ще се изтрие за постоянно от това устройство.}other{Поне $1 елемента ще се изтрият за постоянно от това устройство.}}</translation>
 <translation id="6144890426075165477">Понастоящем <ph name="PRODUCT_NAME" /> не е браузърът ви по подразбиране.</translation>
+<translation id="6145860855437952742">Максимален брой прозорци за визуализация в режима за общ преглед, в които могат да се използват маски за скриване на заглавията им, както и заоблени ъгли.</translation>
 <translation id="6147020289383635445">Визуализацията за печат не бе успешна.</translation>
 <translation id="614998064310228828">Модел на устройството:</translation>
+<translation id="6150555451039504280">Свиване/разгъване</translation>
 <translation id="6150853954427645995">За да запазите този файл за използване офлайн, върнете се онлайн, кликнете с десния бутон на мишката върху него и изберете опцията „<ph name="OFFLINE_CHECKBOX_NAME" />“.</translation>
 <translation id="6151323131516309312">Натиснете <ph name="SEARCH_KEY" />, за да търсите с <ph name="SITE_NAME" /></translation>
 <translation id="6154697846084421647">Сега сте в профила си</translation>
@@ -3812,6 +3895,7 @@
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Нов принтер в мрежата ви}other{Нови принтери в мрежата ви}}</translation>
 <translation id="6285395082104474418">В тази лента се показва текущото състояние на мрежата, батерията и др.</translation>
 <translation id="6286684120317096255">Преносът на данни се измерва</translation>
+<translation id="6286708577777130801">Подробности за запазената парола</translation>
 <translation id="6287852322318138013">Изберете приложение за отваряне на този файл</translation>
 <translation id="6288919040208869552">Ако е конфигуриран прокси сървър, това обикновено пречи на упълномощаването в различни портали за удостоверяване. Този флаг активира отварянето на отделен диалогов прозорец за упълномощаването към портала, като за прозореца се пренебрегват настройките за прокси сървър.</translation>
 <translation id="6290556621549272952">С помощта на тази функция съдържанието от Chromium може да се показва на телевизора и другите ви устройства.</translation>
@@ -3853,6 +3937,7 @@
 <translation id="6353618411602605519">Хърватска клавиатура</translation>
 <translation id="6356936121715252359">Настройки за хранилището на Adobe Flash Player...</translation>
 <translation id="6357619544108132570">Добре дошли в семейството на <ph name="SHORT_PRODUCT_NAME" />. Това не е обикновен компютър.</translation>
+<translation id="63617602971594377">Активиране на приложния програмен интерфейс (API) за плащания в мрежата</translation>
 <translation id="6361850914223837199">Подробности за грешката:</translation>
 <translation id="6362853299801475928">&amp;Подаване на сигнал за проблем...</translation>
 <translation id="636343209757971102">IPv6 адрес:</translation>
@@ -3888,6 +3973,7 @@
 <translation id="6410063390789552572">Няма достъп до мрежовата библиотека</translation>
 <translation id="6410257289063177456">Графични файлове</translation>
 <translation id="6410328738210026208">Промяна на канала и Powerwash</translation>
+<translation id="6410668567036790476">Добавяне на търсеща машина</translation>
 <translation id="641105183165925463">$1 МБ</translation>
 <translation id="6412931879992742813">Нов прозорец в режим „инкогнито“</translation>
 <translation id="6418160186546245112">Предишната инсталирана версия на <ph name="IDS_SHORT_PRODUCT_NAME" /> се възстановява</translation>
@@ -3920,14 +4006,15 @@
 <translation id="6443783728907198276">При активиране съобщенията през STUN, генерирани от WebRTC, ще съдържат заглавка Origin.</translation>
 <translation id="6444070574980481588">Задаване на датата и часа</translation>
 <translation id="6445450263907939268">Ако не сте искали тези промени, можете да възстановите предишните си настройки.</translation>
+<translation id="6447388538018752757">Активира превключването на канала за динамично изобразяване на графика в двуизмерното платно, за да се оптимизира ефективността въз основа на използваните типове операции за визуализация.</translation>
 <translation id="6447842834002726250">„Бисквитки“</translation>
 <translation id="6449285849137521213">Приложението <ph name="EXTENSION_NAME" /> е добавено.</translation>
 <translation id="6450876761651513209">Промяна на свързаните с поверителността ви настройки</translation>
+<translation id="6451180435462401570">Управление на устройствата в Отпечатване в облак</translation>
 <translation id="6451650035642342749">Изчистване на настройките за автоматично отваряне</translation>
 <translation id="6452181791372256707">Отхвърляне</translation>
 <translation id="6454421252317455908">Метод за въвеждане на китайски (бърз)</translation>
 <translation id="6455348477571378046">Тип сертификат:</translation>
-<translation id="6456234919706689841">Администраторът ви може да избере, до Google да се изпращат данни за диагностиката и употребата на това устройство. Можете да видите настройката <ph name="BEGIN_LINK1" />тук<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Научете повече<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Блокирането на JavaScript да продължи</translation>
 <translation id="6458308652667395253">Управление на блокирането на JavaScript...</translation>
 <translation id="6459488832681039634">Използване на избраното за търсене</translation>
@@ -3981,10 +4068,12 @@
 <translation id="6526654154229718724">Експериментален режим на цял екран със заключване на клавиатурата, при който потребителите трябва да натиснат и задържат „Esc“, за да излязат.</translation>
 <translation id="6527303717912515753">Споделяне</translation>
 <translation id="6528546217685656218">Частният ключ за този клиентски сертификат липсва или е невалиден.</translation>
+<translation id="652948702951888897">История в Chrome</translation>
 <translation id="653019979737152879">„<ph name="FILE_NAME" />“ се синхронизира...</translation>
 <translation id="6534583978616527129">Подготвяне на връзката</translation>
 <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Забележка<ph name="END_BOLD" />: Активирайте само ако знаете какви ще са последствията или сте помолени да го направите, тъй като събирането на данни може да намали ефективността.</translation>
 <translation id="654233263479157500">Използване на уеб услуга за помощ при отстраняването на грешки при навигация</translation>
+<translation id="6545665334409411530">Честота на повтаряне</translation>
 <translation id="6545834809683560467">Използване на услуга за предвиждания за помощ при завършването на заявките за търсене и URL адресите, въвеждани в адресната лента или в полето за търсене в стартовия панел за приложения</translation>
 <translation id="6546686722964485737">Присъединяване към WiMAX мрежа</translation>
 <translation id="6547316139431024316">Без повторно предупреждение за това разширение</translation>
@@ -4055,9 +4144,11 @@
 <translation id="6643016212128521049">Изчистване</translation>
 <translation id="6644756108386233011">Да се зададат ли отново променените настройки на <ph name="IDS_SHORT_PRODUCT_NAME" />?</translation>
 <translation id="6647228709620733774">URL адрес за анулиране от сертифициращ орган на Netscape</translation>
+<translation id="6647838571840953560">Текущ канал: <ph name="CHANNEL_NAME" /></translation>
 <translation id="6649018507441623493">Една секунда...</translation>
 <translation id="6649068951642910388">Потребителският интерфейс за възстановяване на сесия ще се показва в балонче вместо в информационна лента.</translation>
 <translation id="665061930738760572">Отваряне в &amp;нов прозорец</translation>
+<translation id="6651237644330755633">Да се има доверие на този сертификат за идентифициране на уебсайтове</translation>
 <translation id="6652975592920847366">Създаване на носител за възстановяване на операционната система</translation>
 <translation id="6653525630739667879">Запазването в/ъв „$1“ не е възможно. Всички редакции ще се съхранят в/ъв „$2“ в папката „Изтегляния“.</translation>
 <translation id="6655190889273724601">Режим за програмисти</translation>
@@ -4112,6 +4203,7 @@
 <translation id="6725970970008349185">Брой на предложенията, които да се показват на страница</translation>
 <translation id="672609503628871915">Вижте новите неща</translation>
 <translation id="6727005317916125192">Предишният панел</translation>
+<translation id="6727842159866499206">Максимален брой прозорци за визуализация в режима за общ преглед, в които могат да се използват фигури за скриване на заглавията им.</translation>
 <translation id="6731320427842222405">Това може да отнеме няколко минути</translation>
 <translation id="6731638353631257659">Режим на кеширане за V8.</translation>
 <translation id="6732586201820838268">Не можа да се установи връзка с телефона ви. Уверете се, че използвате съвместим телефон с Android, който е включен и е наблизо. &lt;a&gt;Научете повече&lt;/a&gt;</translation>
@@ -4137,6 +4229,7 @@
 <translation id="6769712124046837540">Добавяне на принтер...</translation>
 <translation id="6771503742377376720">Е сертифициращ орган</translation>
 <translation id="6773575010135450071">Още действия...</translation>
+<translation id="677965093459947883">Много малък</translation>
 <translation id="6780439250949340171">да управлявате други настройки.</translation>
 <translation id="6786747875388722282">Разширения</translation>
 <translation id="6787839852456839824">Клавишни комбинации</translation>
@@ -4160,6 +4253,7 @@
 <translation id="6815353853907306610"><ph name="IDS_SHORT_PRODUCT_NAME" /> установи, че настройките на браузъра ви може да са променени без ваше знание. Искате ли да им зададете отново първоначалните им стойности по подразбиране?</translation>
 <translation id="6815551780062710681">редактиране</translation>
 <translation id="6817358880000653228">Запазени пароли за този сайт:</translation>
+<translation id="6820008762872335722">Нулиране, за да се извежда запитване</translation>
 <translation id="6820687829547641339">Tar архив, компресиран във формат Gzip</translation>
 <translation id="682123305478866682">Предаване на работния плот</translation>
 <translation id="6823506025919456619">За да видите устройствата си, трябва да влезете в Chrome</translation>
@@ -4179,7 +4273,9 @@
 <translation id="6833901631330113163">Южна Европа</translation>
 <translation id="683526731807555621">Нова търсеща машина</translation>
 <translation id="6835762382653651563">Моля, свържете се с интернет, за да актуализирате устройството си <ph name="DEVICE_TYPE" />.</translation>
+<translation id="6839158130869314728">Дублиране на дисплеите</translation>
 <translation id="6839225236531462745">Грешка при изтриване на сертификат</translation>
+<translation id="6840155290835956714">Извеждане на запитване преди изпращане</translation>
 <translation id="6840184929775541289">Не е сертифициращ орган</translation>
 <translation id="6840313690797192085">$1 ПБ</translation>
 <translation id="6841186874966388268">Грешки</translation>
@@ -4189,6 +4285,7 @@
 <translation id="6847758263950452722">Запазване на страницата като MHTML</translation>
 <translation id="6853388645642883916">Актуализиращата програма е в спящ режим</translation>
 <translation id="68541483639528434">Затваряне на другите раздели</translation>
+<translation id="6855099371444560844">Добавяне на устройство</translation>
 <translation id="6856701878604560493">Активиране на офлайн отметките</translation>
 <translation id="6860097299815761905">Настройки за прокси сървър...</translation>
 <translation id="6860427144121307915">Отваряне в раздел</translation>
@@ -4269,11 +4366,13 @@
 <translation id="6980462514016882061">Възможно е да използваме историята ви на сърфиране, за да персонализираме търсенето, рекламите и други услуги на Google</translation>
 <translation id="6980956047710795611">Прехвърляне на всички данни в Chrome OS към новата парола (изисква се предишната)</translation>
 <translation id="6981982820502123353">Достъпност</translation>
+<translation id="6981992744085917617">Изберете как да влезете отново в профила си:</translation>
 <translation id="6982896539684144327">Открит е принтер от <ph name="VENDOR_NAME" /></translation>
 <translation id="6983783921975806247">Регистриран ИДО</translation>
 <translation id="6983991971286645866">Всички редакции ще се запазят в/ъв „$1“.</translation>
 <translation id="6985235333261347343">Агент за възстановяване на ключ от Microsoft</translation>
 <translation id="6985276906761169321">Идент. №:</translation>
+<translation id="6985607387932385770">Принтери</translation>
 <translation id="6986605181115043220">Ами сега! Синхронизирането спря да работи. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation>
 <translation id="6989294135336900804">Няма синхронизирани раздели</translation>
 <translation id="6990081529015358884">Нямате свободно място</translation>
@@ -4296,6 +4395,7 @@
 <translation id="7006844981395428048">Аудиофайл от тип $1</translation>
 <translation id="7008270479623533562">За да се изпълни разширението, трябва да опресните страницата. Можете да го стартирате автоматично на този сайт, като кликнете с десен бутон върху съответната икона.</translation>
 <translation id="7009045250432250765">Автоматично попълване с едно кликване</translation>
+<translation id="7009420427128923703">Максимален брой прозорци в режима за общ преглед, в които могат да се използват маски.</translation>
 <translation id="7010160495478792664">Хардуерно ускорено декодиране на видеото, когато е възможно.</translation>
 <translation id="7010400591230614821">Агресивна стратегия за освобождаване на раздели</translation>
 <translation id="701080569351381435">Преглед на изходния код</translation>
@@ -4339,6 +4439,7 @@
 <translation id="7061692898138851896">Автоматично запазване на паролите</translation>
 <translation id="7062222374113411376">Разрешаване на наскоро затворените сайтове да завършват изпращането и получаването на данни (препоръчително)</translation>
 <translation id="7063129466199351735">Преките пътища се обработват...</translation>
+<translation id="7063957500469387217">Настройване или управление на принтери в Google Отпечатване в облак.</translation>
 <translation id="7065223852455347715">Това устройство е заключено в режим, който не позволява корпоративно записване. Ако искате да го запишете, трябва първо да преминете през процеса на възстановяване.</translation>
 <translation id="7065534935986314333">Всичко за системата</translation>
 <translation id="7066944511817949584">Свързването с „<ph name="DEVICE_NAME" />“ не бе успешно.</translation>
@@ -4401,6 +4502,7 @@
 <translation id="715118844758971915">Традиционни принтери</translation>
 <translation id="7154130902455071009">Промяна на началната ви страница на <ph name="START_PAGE" /></translation>
 <translation id="715487527529576698">Първоначалният режим на китайски да бъде опростен китайски</translation>
+<translation id="7155171745945906037">Съществуваща снимка от камерата или от файл</translation>
 <translation id="715568033737470079">Посочете кои приставки с PPAPI да се изпълняват съобразно с правилото за тестова среда със заключване на Win32k (само за Windows 10 и по-нови версии).</translation>
 <translation id="7156235233373189579">Този файл е предназначен за компютри със софтуер Windows и не е съвместим с устройството ви с Chrome OS. Моля, потърсете в <ph name="BEGIN_LINK" />уеб магазина на Chrome<ph name="END_LINK" /> подходящо приложение със същата функционалност. <ph name="BEGIN_LINK_HELP" />Научете повече<ph name="END_LINK_HELP" /></translation>
 <translation id="7157063064925785854">С кликването си върху „Напред“ приемате <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> и <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation>
@@ -4417,6 +4519,7 @@
 <translation id="7175353351958621980">Заредено от:</translation>
 <translation id="7180611975245234373">Опресняване</translation>
 <translation id="7180865173735832675">Персонализиране</translation>
+<translation id="7185078796915954712">TLS 1.3</translation>
 <translation id="7185690883425432021">Скрива бутоните за затваряне на неактивните раздели, когато лентата с раздели е в режим на наслагване.</translation>
 <translation id="7186088072322679094">Запазване в лентата с инструменти</translation>
 <translation id="719009910964971313">Американска (Дворак) клавиатура за програмисти</translation>
@@ -4456,6 +4559,8 @@
 <translation id="7240120331469437312">Алтернативно име на субекта на сертификата</translation>
 <translation id="7241389281993241388">Моля, влезте в/ъв <ph name="TOKEN_NAME" />, за да импортирате сертификата за клиентската програма.</translation>
 <translation id="7243055093079293866">Произнесете „Ok Google“ в нов раздел и в google.com</translation>
+<translation id="7243632151880336635">Изчистване и изход</translation>
+<translation id="7245628041916450754"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (най-добро)</translation>
 <translation id="724691107663265825">На хоризонта се задава сайт със злонамерен софтуер</translation>
 <translation id="725109152065019550">За съжаление администраторът ви е деактивирал външното хранилище за профила ви.</translation>
 <translation id="7252661675567922360">Да не се зарежда</translation>
@@ -4469,7 +4574,9 @@
 <translation id="7262004276116528033">Тази услуга за вход се хоства от <ph name="SAML_DOMAIN" /></translation>
 <translation id="7262221505565121">Изключения за достъп до приставките извън тестова среда</translation>
 <translation id="7264275118036872269">Стартирането на откриването на устройства с Bluetooth не бе успешно.</translation>
+<translation id="7264454014834869122">Изберете от уеб магазина на Chrome</translation>
 <translation id="726502072182862130">Име и икона от потребителския профил в Google</translation>
+<translation id="7267186368513450821">5</translation>
 <translation id="7268365133021434339">Затваряне на разделите</translation>
 <translation id="7268659760406822741">Налични услуги</translation>
 <translation id="7273110280511444812">последно свързване на <ph name="DATE" /></translation>
@@ -4486,6 +4593,7 @@
 <translation id="7287143125007575591">Достъпът е отказан.</translation>
 <translation id="7288592446024861651">Вашите отметки, история, пароли и други настройки ще се синхронизират с профила ви в Google, за да можете да ги използвате на всичките си устройства. Контролирайте какво да се синхронизира от <ph name="BEGIN_LINK" /></translation>
 <translation id="7288676996127329262"><ph name="HORIZONTAL_DPI" /> x <ph name="VERTICAL_DPI" /> точки на инч</translation>
+<translation id="7289225569524511578">Отваряне на приложението за тапети</translation>
 <translation id="7290242001003353852">Тази услуга за вход, хоствана от <ph name="SAML_DOMAIN" />, осъществява достъп до камерата ви.</translation>
 <translation id="7290594223351252791">Потвърждаване на регистрацията</translation>
 <translation id="7295019613773647480">Активиране на контролирани потребители</translation>
@@ -4524,6 +4632,7 @@
 <translation id="7347751611463936647">За да използвате това разширение, въведете „<ph name="EXTENSION_KEYWORD" />“, след това натиснете „Tab“, след което въведете своята команда или търсене.</translation>
 <translation id="7348093485538360975">Екранна клавиатура</translation>
 <translation id="7348749398828259943">Американска (Уъркман) международна клавиатура</translation>
+<translation id="7352495173098919663">Редактиране</translation>
 <translation id="7352651011704765696">Нещо се обърка</translation>
 <translation id="7353651168734309780">„<ph name="EXTENSION_NAME" />“ изисква нови разрешения</translation>
 <translation id="7361039089383199231">$1 байта</translation>
@@ -4635,6 +4744,7 @@
 <translation id="749028671485790643">Човек <ph name="VALUE" /></translation>
 <translation id="7491962110804786152">раздел</translation>
 <translation id="7493386493263658176"><ph name="EXTENSION_NAME" /> може да събира целия въведен от вас текст, включително лични данни, като пароли и номера на кредитни карти. Искате ли да използвате това разширение?</translation>
+<translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="7495424355577885780">Ако настройката е активирана, при подаване на сигнал за проблем ще се зарежда основаният на material design потребителски интерфейс за отзиви.</translation>
 <translation id="7495778526395737099">Забравили сте старата си парола?</translation>
 <translation id="7503191893372251637">Тип на сертификата на Netscape</translation>
@@ -4706,7 +4816,6 @@
 <translation id="7587108133605326224">Балтийски</translation>
 <translation id="7589461650300748890">Не бързайте! Внимавайте.</translation>
 <translation id="7589661784326793847">Изчакайте само секунда</translation>
-<translation id="7593635197364225277">Автоматично създавайте в Диск резервно копие на данните на приложенията от Google Play и ги възстановявайте. Можете да промените това по всяко време от настройките на Android. <ph name="BEGIN_LINK1" />Научете повече<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (код на грешка: <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Добре, да се импортира</translation>
 <translation id="7600965453749440009">Никога да не се превежда от <ph name="LANGUAGE" /></translation>
@@ -4752,6 +4861,7 @@
 <translation id="7654941827281939388">Профилът вече се използва на този компютър.</translation>
 <translation id="7658239707568436148">Отказ</translation>
 <translation id="7659584679870740384">Не сте упълномощени да използвате това устройство. За разрешение за вход се свържете с администратора.</translation>
+<translation id="7661259717474717992">Разрешаване на сайтовете да запазват и четат данни в „бисквитки“</translation>
 <translation id="7663719505383602579">Приемник: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7664620655576155379">Неподдържано устройство с Bluetooth: <ph name="DEVICE_NAME" />.</translation>
 <translation id="7665369617277396874">Добавяне на профил</translation>
@@ -4781,6 +4891,7 @@
 <translation id="7709152031285164251">Не бе успешно – <ph name="INTERRUPT_REASON" /></translation>
 <translation id="7709980197120276510">С кликването си върху „Напред“ приемате <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" />, <ph name="LEGAL_DOC_LINK_TEXT_4" /> и <ph name="LEGAL_DOC_LINK_TEXT_5" />.</translation>
 <translation id="7712140766624186755">Питане, от правило</translation>
+<translation id="7712196439824268605">Този ПИН код е лесен за отгатване:</translation>
 <translation id="7713320380037170544">Да се разреши на всички сайтове да използват специални системни съобщения за достъп до MIDI устройствата</translation>
 <translation id="7714464543167945231">Сертификат</translation>
 <translation id="7716020873543636594">Автоматично кликване при спиране на курсора на мишката</translation>
@@ -4788,6 +4899,8 @@
 <translation id="7716781361494605745">URL адрес с правилата на сертифициращия орган на Netscape</translation>
 <translation id="7716970641886237992">Променено от</translation>
 <translation id="7717014941119698257">Изтегля се: <ph name="STATUS" /></translation>
+<translation id="7717845620320228976">Проверка за актуализации</translation>
+<translation id="7719367874908701697">Промяна на мащаба на страницата</translation>
 <translation id="7719421816612904796">Времето за изчакване на обучението изтече</translation>
 <translation id="771953673318695590">КК</translation>
 <translation id="7720375555307821262"><ph name="BEGIN_LINK" />Влезте в Chrome<ph name="END_LINK" />, за да контролирате сърфирането на този човек.</translation>
@@ -4800,6 +4913,7 @@
 <translation id="7742762435724633909">Име на доставчика:</translation>
 <translation id="774465434535803574">Грешка при пакетиране на разширението</translation>
 <translation id="7748528009589593815">Предишният раздел</translation>
+<translation id="7748734060566306235">Използвайте клавишите със стрелки, за да коригирате размера и подравняването на картината.</translation>
 <translation id="7751260505918304024">Показване на всички</translation>
 <translation id="7754704193130578113">Задаване на въпрос къде да бъде запазен всеки файл преди изтеглянето му</translation>
 <translation id="775622227562445982">Бързо затваряне на раздели/прозорци</translation>
@@ -4836,6 +4950,7 @@
 <translation id="7791543448312431591">Добавяне</translation>
 <translation id="7792012425874949788">Нещо се обърка при влизането</translation>
 <translation id="7792388396321542707">Спиране на споделянето</translation>
+<translation id="7792744925237334808">Забраняване на уебсайтовете на трети страни да запазват и четат данни в „бисквитки“.</translation>
 <translation id="7794058097940213561">Форматиране на устройството</translation>
 <translation id="7799329977874311193">HTML документ</translation>
 <translation id="7800518121066352902">Завъртане о&amp;братно на часовниковата стрелка</translation>
@@ -4917,6 +5032,7 @@
 <translation id="7902482560616980555">Мащабиране на FontCache</translation>
 <translation id="7903128267494448252">Изтриване на този човек</translation>
 <translation id="7903345046358933331">Страницата е блокирала. Можете да изчакате да се възстанови или да я затворите.</translation>
+<translation id="7903742244674067440">Разполагате със сертификати, които идентифицират тези сертифициращи органи</translation>
 <translation id="7903925330883316394">Помощен процес: <ph name="UTILITY_TYPE" /></translation>
 <translation id="7903984238293908205">катакана</translation>
 <translation id="7904094684485781019">Администраторът на този профил е забранил централизирания вход.</translation>
@@ -4964,6 +5080,7 @@
 <translation id="7973320858902175766">Коригиране на компоненти</translation>
 <translation id="7974067550340408553">Получавайте известие на телефона си всеки път, когато Smart Lock отключи вашия <ph name="DEVICE_TYPE" />.</translation>
 <translation id="7974566588408714340">Нов опит посредством <ph name="EXTENSIONNAME" /></translation>
+<translation id="7974936243149753750">Допълнителна област</translation>
 <translation id="7977551819349545646">Chromebox се актуализира...</translation>
 <translation id="7978412674231730200">Личен ключ</translation>
 <translation id="7979036127916589816">Грешка при синхронизирането</translation>
@@ -5030,9 +5147,11 @@
 <translation id="8054563304616131773">Моля, въведете валиден имейл адрес</translation>
 <translation id="8054921503121346576">Клавиатурата с USB е свързана</translation>
 <translation id="8056430285089645882">Разбрах, не показвайте това отново.</translation>
+<translation id="8058655154417507695">Година на валидност</translation>
 <translation id="8059178146866384858">Файлът с име „$1“ вече съществува. Моля, изберете друго.</translation>
 <translation id="8059417245945632445">&amp;Инспектиране на устройствата</translation>
 <translation id="8061298200659260393">Забраняване на сайтовете да изпращат насочени съобщения</translation>
+<translation id="8061820249063924643">Управление на контролираните потребители</translation>
 <translation id="8063235345342641131">Стандартен зелен аватар</translation>
 <translation id="8064671687106936412">Ключ:</translation>
 <translation id="806705617346045388">Установено е необичайно поведение</translation>
@@ -5040,7 +5159,9 @@
 <translation id="8069615408251337349">Google Отпечатване в облак</translation>
 <translation id="8071942001314758122">Трябва само да кажете три пъти „Ok Google“</translation>
 <translation id="8072988827236813198">Фиксиране на разделите</translation>
+<translation id="8074127646604999664">Разрешаване на наскоро затворените сайтове да завършват изпращането и получаването на данни</translation>
 <translation id="8079530767338315840">Повтаряне</translation>
+<translation id="8081705606384362428">Изберете ПИН кода си:</translation>
 <translation id="8083739373364455075">Получете безплатно 100 ГБ с Google Диск</translation>
 <translation id="8088137642766812908">Внимателно, тази функция може да е опасна</translation>
 <translation id="8089520772729574115">по-малко от 1 МБ</translation>
@@ -5192,6 +5313,7 @@
 <translation id="827097179112817503">Показване на бутона за начална страница</translation>
 <translation id="8272443605911821513">Управлявайте разширенията си, като кликнете върху „Разширения“ в менюто „Още инструменти“.</translation>
 <translation id="8275038454117074363">Импортиране</translation>
+<translation id="827606011343515871">Нямате сертификати</translation>
 <translation id="8276560076771292512">Изпразване на кеша и твърдо презареждане</translation>
 <translation id="8279388322240498158">Кюрдски (сорани), базирана на английски клавиатура</translation>
 <translation id="8280151743281770066">Арменска фонетична клавиатура</translation>
@@ -5212,7 +5334,6 @@
 <translation id="8300607741108698921">Настройване за 1 минута</translation>
 <translation id="8303650969500425356">Разрешава на JavaScript да заключва ориентацията на екрана.</translation>
 <translation id="8303655282093186569">Настройки за въвеждане на пинин</translation>
-<translation id="830424806940379275">Разрешава на разширенията да създават панелни прозорци, които се отварят извън рамката на браузъра. По подразбиране или ако опцията е деактивирана, при опитите за отваряне на панел вместо него ще се изведе изскачащ прозорец. В операционните системи за настолни компютри панелите са оттеглени и скоро ще бъдат премахнати.</translation>
 <translation id="8306534594034939679">Активирайте поддръжката за алтернативни услуги – експериментална HTTP функция.</translation>
 <translation id="8307376264102990850">Зареждане:
 Времето до пълно зареждане се изчислява</translation>
@@ -5237,9 +5358,11 @@
 <translation id="8337399713761067085">Понастоящем сте офлайн.</translation>
 <translation id="8338952601723052325">Уебсайт за програмисти</translation>
 <translation id="8339012082103782726">Забраняване на достъпа на сайтовете до микрофона ви</translation>
+<translation id="8339059274628563283">Локално съхранявани данни от <ph name="SITE" /></translation>
 <translation id="8342318071240498787">Вече съществува файл или директория със същото име.</translation>
 <translation id="834457929814110454">Ако разбирате рисковете за сигурността си, може <ph name="BEGIN_LINK" />да посетите този сайт<ph name="END_LINK" /> преди премахването на опасните програми.</translation>
 <translation id="8345553596530559351">Ако функцията е активирана, чрез URL адреса chrome://history/ се зарежда основаната на material design страница с история.</translation>
+<translation id="8347045947573765315">Разрешаване на всички сайтове да генерират ключове във формуляри</translation>
 <translation id="8351419472474436977">Настройките ви за прокси сървър се контролират от посоченото разширение. Това означава, че то може да променя, прекъсва или следи всичко, което правите онлайн. Ако не сте сигурни какво е причинило тази промяна, вероятно не искате тя да остава в сила.</translation>
 <translation id="8352772353338965963">Добавете профил към функцията за централизиран вход. Всички профили, в които влезете чрез нея, ще бъдат достъпни без парола, така че трябва да използвате тази функция само с надеждни профили.</translation>
 <translation id="8353683614194668312">То има възможност за:</translation>
@@ -5324,15 +5447,20 @@
 <translation id="845627346958584683">Час на изтичане</translation>
 <translation id="8456681095658380701">Невалидно име</translation>
 <translation id="8457625695411745683">добро</translation>
+<translation id="8460336040822756677">Ако изключите Smart Lock за <ph name="DEVICE_TYPE" />, няма да можете да отключвате устройствата си с Chrome чрез телефона си. Ще трябва да въвеждате паролата си.</translation>
+<translation id="84613761564611563">Заявен е ПИ за конфигуриране на мрежата. Моля, изчакайте...</translation>
 <translation id="8461914792118322307">Прокси сървър</translation>
 <translation id="8463215747450521436">Този контролиран потребител може да е изтрит или деактивиран. Ако искате да продължите да влизате с данните за него, моля, свържете се с мениджъра.</translation>
 <translation id="8464132254133862871">Този профил на потребител не отговаря на условията за услугата.</translation>
 <translation id="8464505512337106916">Откриване и изпълняване на важното съдържание за приставки (препоръчително)</translation>
+<translation id="8465252176946159372">Не е валидно</translation>
 <translation id="8466234950814670489">Tar архив</translation>
 <translation id="8467473010914675605">Метод за въвеждане на корейски</translation>
+<translation id="8468750959626135884">Отключвайте устройството си <ph name="DEVICE_TYPE" /> с телефона си с Android.</translation>
 <translation id="8472623782143987204">с хардуерна поддръжка</translation>
 <translation id="8475313423285172237">Друга програма на компютъра ви добави разширение, което може да промени начина на работа на Chrome.</translation>
 <translation id="8475647382427415476">Google Диск не можа да синхронизира „<ph name="FILENAME" />“. По-късно ще се извърши повторен опит.</translation>
+<translation id="8476195663057048998">Изчистване и нулиране</translation>
 <translation id="8477241577829954800">Заменен</translation>
 <translation id="8477384620836102176">&amp;Общи</translation>
 <translation id="8480417584335382321">Мащаб на страницата:</translation>
@@ -5364,6 +5492,7 @@
 <translation id="8524066305376229396">Постоянно хранилище:</translation>
 <translation id="8525306231823319788">На цял екран</translation>
 <translation id="8528962588711550376">Влиза се.</translation>
+<translation id="8532294913309524834">Подредете езиците според предпочитанието си.</translation>
 <translation id="8535005006684281994">URL адрес за подновяване на сертификат на Netscape</translation>
 <translation id="8539727552378197395">Не (HttpOnly)</translation>
 <translation id="8543181531796978784">Можете да <ph name="BEGIN_ERROR_LINK" />подадете сигнал за проблем при откриването<ph name="END_ERROR_LINK" /> или, ако разбирате рисковете за сигурността си, да <ph name="BEGIN_LINK" />посетите този небезопасен сайт<ph name="END_LINK" />.</translation>
@@ -5378,6 +5507,7 @@
 <translation id="855081842937141170">Фиксиране на раздела</translation>
 <translation id="8551388862522347954">Лицензи</translation>
 <translation id="8551494947769799688">латвийски</translation>
+<translation id="8553342806078037065">Управление на другите хора</translation>
 <translation id="855705891482654011">Зареждане на разпакетираните разширения</translation>
 <translation id="855773602626431402">На тази страница бе предотвратено изпълняването на приставка извън тестова среда.</translation>
 <translation id="8559694214572302298">Декодиране на изображения</translation>
@@ -5455,6 +5585,7 @@
 <translation id="8662978096466608964">Chrome не може да зададе тапета.</translation>
 <translation id="8663099077749055505">Автоматичното изтегляне на няколко файла да се блокира винаги за <ph name="HOST" /></translation>
 <translation id="8664389313780386848">&amp;Преглед на изходния код на страницата</translation>
+<translation id="866611985033792019">Да се има доверие на този сертификат за идентифициране на потребители на имейл</translation>
 <translation id="8666678546361132282">английски</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> сега е на цял екран и курсорът на мишката ви е деактивиран.</translation>
 <translation id="8667808506758191620">Устройството ви <ph name="DEVICE_TYPE" /> е актуално.</translation>
@@ -5578,6 +5709,7 @@
 <translation id="8813811964357448561">лист хартия</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="881799181680267069">Скриване на другите</translation>
+<translation id="8818152010000655963">Тапет</translation>
 <translation id="8818152613617627612">Данни за фактуриране</translation>
 <translation id="8820817407110198400">Отметки</translation>
 <translation id="8820961991571528294">Тестване</translation>
@@ -5588,8 +5720,10 @@
 <translation id="8828933418460119530">DNS име</translation>
 <translation id="8830796635868321089">Проверката за актуализации не бе успешна посредством текущите настройки на прокси сървъра. Моля, <ph name="PROXY_SETTINGS_LINK_START" />коригирайте ги<ph name="PROXY_SETTINGS_LINK_END" />.</translation>
 <translation id="8831623914872394308">Настройки на курсора</translation>
+<translation id="8833040047958643283">Контролирайте какво съдържание могат да ви показват уебсайтовете и каква информация е разрешено да използват, докато сърфирате</translation>
 <translation id="8837103518490433332">Искате ли <ph name="PASSWORD_MANAGER_BRAND" /> да запази паролата ви за <ph name="ORIGIN" />?</translation>
 <translation id="8838770651474809439">Хамбургер</translation>
+<translation id="8839157109304700852">Отваря Google Табло за управление</translation>
 <translation id="8841142799574815336">Инертна вътрешна част на прозоречния изглед.</translation>
 <translation id="884264119367021077">Адрес за доставка</translation>
 <translation id="8845001906332463065">Получете помощ</translation>
@@ -5600,11 +5734,13 @@
 <translation id="885381502874625531">Беларуска клавиатура</translation>
 <translation id="8856844195561710094">Спирането на откриването на устройства с Bluetooth не бе успешно.</translation>
 <translation id="885701979325669005">Хранилище</translation>
+<translation id="8858798938034909167">Паролите ви са достъпни на адрес <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> от всяко устройство</translation>
 <translation id="8859057652521303089">Изберете своя език:</translation>
 <translation id="8859116917079399781">Съдържанието е блокирано</translation>
 <translation id="8859174528519900719">Подрамка: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="8860454412039442620">Електронна таблица в Excel</translation>
 <translation id="8863489667196658337">Активира новата система за създаване на приложения за отметки.</translation>
+<translation id="8866013684546696613">Максимален брой прозорци в режима за общ преглед, в които могат да се използват фигури.</translation>
 <translation id="8866441758832353668">Фиксиране на превъртането</translation>
 <translation id="8868245144144497543">Създадено от</translation>
 <translation id="8868626022555786497">Използвано място</translation>
@@ -5662,6 +5798,7 @@
 <translation id="894360074127026135">Международно повишаване на сигурността от Netscape</translation>
 <translation id="8944779739948852228">Открит е принтер</translation>
 <translation id="8944964446326379280"><ph name="APP_NAME" /> споделя прозорец с/ъс „<ph name="TAB_NAME" />“.</translation>
+<translation id="8946284507644756416">Устройството ви <ph name="DEVICE_TYPE" /> може да се отключва с телефона ви с Android.</translation>
 <translation id="8946359700442089734">Функциите за отстраняване на грешки не бяха напълно активирани на това устройство с <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation>
 <translation id="8946784827990177241">Активиране на поддръжката за WebUSB.</translation>
 <translation id="89515141420106838">Активира приложението Галерия на уеб магазина на Chrome за драйвери за принтер. Приложението търси в уеб магазина на Chrome разширения, които поддържат отпечатване към USB принтер с конкретен USB идентификатор.</translation>
@@ -5739,6 +5876,7 @@
 <translation id="9040185888511745258">Извършителите на атаки срещу <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> може да опитат да ви подведат да инсталирате програми, които вредят на практическата ви работа при сърфиране (например като променят началната ви страница или показват допълнителни реклами в посещаваните от вас сайтове).</translation>
 <translation id="9040421302519041149">Достъпът до тази мрежа е защитен.</translation>
 <translation id="9041603713188951722">Показване на настройките в прозорец</translation>
+<translation id="9042893549633094279">Поверителност и сигурност</translation>
 <translation id="904451693890288097">Моля, въведете ключа за достъп за „<ph name="DEVICE_NAME" />“:</translation>
 <translation id="9049835026521739061">режим за хангъл</translation>
 <translation id="9050666287014529139">Парола</translation>
@@ -5749,6 +5887,7 @@
 <translation id="9056810968620647706">Няма намерени съответствия.</translation>
 <translation id="9059868303873565140">Меню за състоянието</translation>
 <translation id="9064142312330104323">Снимка на потребителския профил в Google (зарежда се)</translation>
+<translation id="9064275926664971810">Активиране на автоматичното попълване на формуляри с едно кликване</translation>
 <translation id="9064939804718829769">Прехвърля се...</translation>
 <translation id="9065203028668620118">Редактиране</translation>
 <translation id="9066075624350113914">Части от този PDF документ не можаха да се покажат.</translation>
@@ -5770,6 +5909,8 @@
 <translation id="9088917181875854783">Моля, потвърдете, че този ключ за достъп се показва на „<ph name="DEVICE_NAME" />“:</translation>
 <translation id="9092426026094675787">Означаване на незащитените източници като ненадеждни</translation>
 <translation id="9094033019050270033">Актуализиране на паролата</translation>
+<translation id="9094982973264386462">Премахване</translation>
+<translation id="9095253524804455615">Премахване</translation>
 <translation id="9100765901046053179">Разширени настройки</translation>
 <translation id="910077499156148110">Добавяне на изключение за сайт</translation>
 <translation id="9100825730060086615">Тип клавиатура</translation>
@@ -5861,8 +6002,11 @@
 <translation id="9218430445555521422">Задаване по подразбиране</translation>
 <translation id="9219103736887031265">Изображения</translation>
 <translation id="9220525904950070496">Премахване на профила</translation>
+<translation id="9221503095691269353">Конфигуриране на функцията за бързо отключване</translation>
 <translation id="923467487918828349">Показване на всички</translation>
+<translation id="927151012416335806">Устройството ви се актуализира до следния канал: <ph name="CHANNEL_NAME" /></translation>
 <translation id="930268624053534560">Подробни клейма за време</translation>
+<translation id="931068751149008062">Избиране на типове шрифтове и кодиране</translation>
 <translation id="932327136139879170">Начална страница</translation>
 <translation id="932508678520956232">Отпечатването не можа да стартира.</translation>
 <translation id="936801553271523408">Диагностични данни за системата</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index f35b042d..49361b40 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1927,6 +1927,7 @@
 <translation id="3590559774363307859">পাসওয়ার্ড সংরক্ষিত হয়েছে। আপনি যেকোনো ব্রাউজার থেকে এটি এবং আপনার সকল <ph name="SAVED_PASSWORDS_LINK" /> অ্যাক্সেস করতে পারেন।</translation>
 <translation id="3590587280253938212">দ্রুত</translation>
 <translation id="3592260987370335752">এবং আরো জানুন</translation>
+<translation id="3592313833691251126">এক্সটেনশানগুলি ব্রাউজার ফ্রেমের বাইরে খোলে এমন প্যানেল উইন্ডো তৈরি করার অনুমতি দেয়। সক্ষম করা হলে, একটি প্যানেল খোলার চেষ্টা করা হলে এর পরিবর্তে একটি পপআপ খুলবে। ডিফল্ট আচরণ হলো শুধুমাত্র পরিচ্ছন্ন তালিকাতে যুক্ত এক্সটেনশানগুলির জন্য অনুমতি দেওয়া। সক্ষম করা আচরণ হলো সকল এক্সটেনশানগুলির জন্য অনুমতি দেওয়া। অক্ষম করা আচরণ হলো যেকোনো এক্সটেনশানের জন্য প্যানেল অননুমোদন করা।</translation>
 <translation id="359283478042092570">Enter</translation>
 <translation id="3593152357631900254">Fuzzy-Pinyin মোড সক্ষম করুন</translation>
 <translation id="3593965109698325041">শংসাপত্র নাম সীমাবদ্ধতাসমূহ</translation>
@@ -2248,7 +2249,6 @@
 <translation id="4034042927394659004">কী উজ্জ্বলতা কমান</translation>
 <translation id="4035758313003622889">&amp;কার্য পরিচালক</translation>
 <translation id="4037084878352560732">ঘোড়া</translation>
-<translation id="4037102579141982963">এই ডিভাইসটি Google এ ডায়গনস্টিক ও ব্যবহারের ডেটা স্বয়ংক্রিয়ভাবে পাঠাবে। আপনি আপনার ডিভাইস <ph name="BEGIN_LINK1" />সেটিংস<ph name="END_LINK1" /> থেকে যেকোনো সময় এটি পরিবর্তন করতে পারেন। <ph name="BEGIN_LINK2" />আরো জানুন<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Android এর জন্য অ্যাক্সেসিবিলিটি ট্যাব পরিবর্তনকারী সক্ষম করুন৷</translation>
 <translation id="4044260751144303020">স্থির অবস্থানে রয়েছে এমন উপাদানগুলির জন্য মিশ্রিত হচ্ছে৷</translation>
 <translation id="404493185430269859">ডিফল্ট অনুসন্ধান ইঞ্জিন</translation>
@@ -3217,7 +3217,6 @@
 <translation id="5439568486246921931">এই ক্রিয়াটি এই ব্যবহারকারীর ডাউনলোডসমূহ, অফলাইন ফাইলগুলি, এবং ব্রাউজিং ডেটা স্থায়ীভাবে মুছে দিবে। এটা পূর্বাবস্থায় ফেরানো যাবে না।</translation>
 <translation id="544083962418256601">শর্টকাটগুলি তৈরি করুন...</translation>
 <translation id="5441100684135434593">তারযুক্ত নেটওয়ার্ক</translation>
-<translation id="5445088910157062298">আপনার অবস্থান দ্রুত এবং সঠিকভাবে খুঁজে বের করতে Google এর অবস্থান পরিষেবাকে অ্যাপ্লিকেশানগুলিকে সহায়তা করতে দিন, এর ফলে ব্যাটারির খরচ কমতে পারে। এমনকি যখন কোনো অ্যাপ্লিকেশান চলছে না তখনও বেনামী অবস্থান ডেটা Google এ পাঠানো হবে।</translation>
 <translation id="5448293924669608770">ওহো, প্রবেশ করুন করার সময় কিছু সমস্যা হয়েছে</translation>
 <translation id="5449588825071916739">সবকটি ট্যাব বুকমার্ক করুন...</translation>
 <translation id="5449716055534515760">Close Win&amp;dow</translation>
@@ -3684,7 +3683,6 @@
 <translation id="6110466548232134880"><ph name="LOCALITY" /> তে <ph name="ORGANIZATION" /> এর পরিচয় <ph name="ISSUER" /> এর দ্বারা যাচাই করা হয়েছে। সার্ভার কোনো শংসাপত্রের স্বচ্ছতার তথ্য সরবরাহ করে নি।</translation>
 <translation id="6111770213269631447">লিপ্যন্তরকরণ (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">ডিফল্টভাবে মঞ্জুরিপ্রাপ্ত</translation>
-<translation id="6112929985131461002">এই ডিভাইসটি Google এ ডায়গনস্টিক ও ব্যবহারের ডেটা স্বয়ংক্রিয়ভাবে পাঠাবে। এই <ph name="BEGIN_LINK1" />সেটিংটি<ph name="END_LINK1" /> আপনার প্রশাসকের দ্বারা বলবৎ করা হয়। <ph name="BEGIN_LINK2" />আরো জানুন<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">ভাষা এবং ইনপুট সেটিংস পরিবর্তন করুন</translation>
 <translation id="6120205520491252677">সূচনা স্ক্রীনে এই পৃষ্ঠাটিকে পিন করুন...</translation>
 <translation id="6122081475643980456">আপনার ইন্টারনেট সংযোগ নিয়ন্ত্রিত হচ্ছে</translation>
@@ -3920,7 +3918,6 @@
 <translation id="6452181791372256707">প্রত্যাখ্যান</translation>
 <translation id="6454421252317455908">চিনা ইনপুট পদ্ধতি (দ্রুত)</translation>
 <translation id="6455348477571378046">শংসাপত্রের প্রকার:</translation>
-<translation id="6456234919706689841">এই ডিভাইসের জন্য আপনার প্রশাসক Google কে ডায়গনস্টিক এবং ব্যবহারের ডেটা পাঠানোর বিষয়টি চয়ন করতে পারেন। আপনি এই <ph name="BEGIN_LINK1" />সেটিংটি<ph name="END_LINK1" /> এখানে দেখতে পারেন। <ph name="BEGIN_LINK2" />আরো জানুন<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">JavaScript ব্লক করা চালিয়ে যান</translation>
 <translation id="6458308652667395253">JavaScript ব্লক করা পরিচালনা করুন...</translation>
 <translation id="6459488832681039634">খোঁজার জন্য নির্বাচন ব্যবহার করুন</translation>
@@ -4700,7 +4697,6 @@
 <translation id="7587108133605326224">বাল্টিক</translation>
 <translation id="7589461650300748890">দাঁড়ান। সাবধান।</translation>
 <translation id="7589661784326793847">এক সেকেন্ড অপেক্ষা করুন</translation>
-<translation id="7593635197364225277">Play অ্যাপ্লিকেশান ডেটাকে স্বয়ংক্রিয়ভাবে Google ড্রাইভে ব্যাক আপ এবং পুনরুদ্ধার করুন। আপনি যেকোনো সময় Android সেটিংস থেকে এটা পরিবর্তন করতে পারেন। <ph name="BEGIN_LINK1" />আরো জানুন<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (ভুল কোড <ph name="ERROR_CODE" />)।</translation>
 <translation id="7596831438341298034">ঠিক আছে, আমদানি করুন</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" /> কখনও অনুবাদ করবেন না</translation>
@@ -5207,7 +5203,6 @@
 <translation id="8300607741108698921">১-মিনিটের সেটআপ</translation>
 <translation id="8303650969500425356">javascript কে স্ক্রীন সজ্জা লক করার অনুমতি দেয়।</translation>
 <translation id="8303655282093186569">পিনইন ইনপুট সেটিংস</translation>
-<translation id="830424806940379275">ব্রাউজার ফ্রেমের বাইরে খোলে এমন প্যানেল উইন্ডো তৈরি করতে এক্সটেনশানগুলিকে অনুমতি দেয়। ডিফল্টরূপে বা অক্ষম করা হলে, একটি প্যানেল খোলার প্রচেষ্টা করার সময় তার বদলে একটি পপ আপ খুলে দেবে। প্যানেল বা OSগুলি থামিয়ে দেওয়া আছে এবং শীঘ্রই সরিয়ে ফেলা হবে।</translation>
 <translation id="8306534594034939679">বিকল্প পরিষেবাগুলির জন্য সহায়তা সক্ষম করে, এটি একটি পরীক্ষামূলক HTTP বৈশিষ্ট্য।</translation>
 <translation id="8307376264102990850">চার্জ হচ্ছে
 সম্পূর্ণ হওয়া পর্যন্ত সময় গণনা করা হচ্ছে</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 0cbc21e..020a9df 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -1931,6 +1931,7 @@
 <translation id="3590559774363307859">S'ha desat la contrasenya. Hi podeu accedir, així com a totes les <ph name="SAVED_PASSWORDS_LINK" />, des de qualsevol navegador.</translation>
 <translation id="3590587280253938212">ràpid</translation>
 <translation id="3592260987370335752">&amp;Més informació</translation>
+<translation id="3592313833691251126">Permet que les extensions creïn finestres del tauler que s'obren fora del marc del navegador. Si es prova d'obrir un tauler i aquesta funció no està activada, s'obrirà una finestra emergent. S'admeten només les extensions afegides a la llista blanca de manera predeterminada. Si activeu aquesta opció, es permeten en totes les extensions. Si l'opció està desactivada no s'admet en cap extensió.</translation>
 <translation id="359283478042092570">Entra</translation>
 <translation id="3593152357631900254">Activa el mode pinyin per aproximació</translation>
 <translation id="3593965109698325041">Restriccions del nom de certificat</translation>
@@ -2252,7 +2253,6 @@
 <translation id="4034042927394659004">Disminueix la brillantor de les tecles</translation>
 <translation id="4035758313003622889">Gestor de &amp;tasques</translation>
 <translation id="4037084878352560732">Cavall</translation>
-<translation id="4037102579141982963">Aquest dispositiu enviarà automàticament dades de diagnòstic i d'ús a Google. Podeu canviar-ho en qualsevol moment a la <ph name="BEGIN_LINK1" />configuració<ph name="END_LINK1" /> del dispositiu. <ph name="BEGIN_LINK2" />Més informació<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Activa el selector de pestanyes d'accessibilitat per a Android.</translation>
 <translation id="4044260751144303020">Composició per a elements de posició fixa.</translation>
 <translation id="404493185430269859">Motor de cerca predeterminat</translation>
@@ -3222,7 +3222,6 @@
 <translation id="5439568486246921931">Amb aquesta acció, se suprimiran definitivament les baixades, els fitxers sense connexió i les dades de navegació d'aquest usuari. Aquesta acció no es pot desfer.</translation>
 <translation id="544083962418256601">Crea dreceres...</translation>
 <translation id="5441100684135434593">Xarxa de cable</translation>
-<translation id="5445088910157062298">Permet que el servei d'ubicació de Google ajudi les aplicacions a trobar la teva ubicació de manera ràpida i precisa, la qual cosa pot reduir el consum de bateria. A més, s'enviaran dades d'ubicació anònimes a Google, fins i tot quan no s'estigui executant cap aplicació.</translation>
 <translation id="5448293924669608770">S'ha produït un problema en iniciar la sessió</translation>
 <translation id="5449588825071916739">Afegeix totes les pestanyes a les adreces d'interès</translation>
 <translation id="5449716055534515760">Tanca la &amp;finestra</translation>
@@ -3690,7 +3689,6 @@
 <translation id="6110466548232134880"><ph name="ISSUER" /> ha verificat la identitat de l'organització <ph name="ORGANIZATION" /> a <ph name="LOCALITY" />. El servidor no ha proporcionat informació de Transparència de certificats.</translation>
 <translation id="6111770213269631447">Transliteració (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Permès de manera predeterminada</translation>
-<translation id="6112929985131461002">Aquest dispositiu enviarà automàticament dades de diagnòstic i d'ús a Google. L'administrador ha definit aquesta <ph name="BEGIN_LINK1" />opció de configuració<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Més informació<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Canvia la configuració d'idioma i d'introducció de text</translation>
 <translation id="6120205520491252677">Fixa aquesta pàgina a la pantalla d'inici...</translation>
 <translation id="6122081475643980456">La vostra connexió a Internet s'està controlant</translation>
@@ -3925,7 +3923,6 @@
 <translation id="6452181791372256707">Rebutja</translation>
 <translation id="6454421252317455908">Mètode d'entrada de xinès (ràpid)</translation>
 <translation id="6455348477571378046">Tipus de certificat:</translation>
-<translation id="6456234919706689841">És possible que l'administrador decideixi enviar automàticament a Google dades de diagnòstic i d'ús sobre aquest dispositiu. Podeu <ph name="BEGIN_LINK1" />consultar aquesta opció de configuració<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Més informació<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Continua bloquejant JavaScript</translation>
 <translation id="6458308652667395253">Gestiona el bloqueig de JavaScript...</translation>
 <translation id="6459488832681039634">Utilitza la selecció per a la cerca</translation>
@@ -4697,7 +4694,6 @@
 <translation id="7587108133605326224">Bàltic</translation>
 <translation id="7589461650300748890">Aneu amb compte</translation>
 <translation id="7589661784326793847">Espereu un moment.</translation>
-<translation id="7593635197364225277">Crea còpies de seguretat automàtiques de les dades de l'aplicació Play a Google Drive i restaura-les. Pots canviar-ho en qualsevol moment a la configuració d'Android. <ph name="BEGIN_LINK1" />Més informació<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (codi d'error <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">D'acord, importa</translation>
 <translation id="7600965453749440009">No tradueixis mai de: <ph name="LANGUAGE" /></translation>
@@ -5203,7 +5199,6 @@
 <translation id="8300607741108698921">Configuració en 1 minut</translation>
 <translation id="8303650969500425356">Permet que JavaScript bloquegi l'orientació de la pantalla.</translation>
 <translation id="8303655282093186569">Configuració de la introducció en pinyin</translation>
-<translation id="830424806940379275">Permet que les extensions creïn finestres de tauler que s'obrin fora del marc del navegador. De manera predeterminada, o bé si es desactiva, s'obrirà una finestra emergent en provar d'obrir un tauler. Els taulers de sistemes operatius d'ordinador estan obsolets i se suprimiran aviat.</translation>
 <translation id="8306534594034939679">Activa la compatibilitat amb Serveis alternatius, una funció HTTP experimental.</translation>
 <translation id="8307376264102990850">S'està carregant el temps de càlcul fins que estigui ple</translation>
 <translation id="8308179586020895837">Pregunta si <ph name="HOST" /> vol accedir a la càmera</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 70ef1c6..9a6fb55 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -1931,6 +1931,7 @@
 <translation id="3590559774363307859">Heslo bylo uloženo. Toto heslo i ostatní <ph name="SAVED_PASSWORDS_LINK" /> můžete zobrazit v libovolném prohlížeči.</translation>
 <translation id="3590587280253938212">rychlý</translation>
 <translation id="3592260987370335752">&amp;Další informace</translation>
+<translation id="3592313833691251126">Povolí rozšířením vytvářet okna panelů vně prohlížeče. Pokud tuto možnost nepovolíte, otevře se při pokusu o otevření panelu vyskakovací okno. Ve výchozím nastavení je toto chování povoleno jen pro vybraná rozšíření. Pokud tento příznak povolíte, chování bude povoleno pro všechna rozšíření. Pokud jej zakážete, vytváření panelů bude pro všechna rozšíření zakázáno.</translation>
 <translation id="359283478042092570">Vstoupit</translation>
 <translation id="3593152357631900254">Aktivovat režim Fuzzy-Pinyin</translation>
 <translation id="3593965109698325041">Omezení názvu certifikátu</translation>
@@ -2252,7 +2253,6 @@
 <translation id="4034042927394659004">Snížit jas klávesnice</translation>
 <translation id="4035758313003622889">Správce úloh</translation>
 <translation id="4037084878352560732">Kůň</translation>
-<translation id="4037102579141982963">Toto zařízení bude do Googlu automaticky odesílat diagnostické údaje a údaje o využití. Toto chování můžete kdykoliv změnit v <ph name="BEGIN_LINK1" />nastavení<ph name="END_LINK1" /> zařízení. <ph name="BEGIN_LINK2" />Další informace<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Aktivuje přepínač karty přístupnosti pro platformu Android.</translation>
 <translation id="4044260751144303020">Skládání prvků s pevným umístěním.</translation>
 <translation id="404493185430269859">Výchozí vyhledávač</translation>
@@ -3221,7 +3221,6 @@
 <translation id="5439568486246921931">Touto akcí trvale smažete stažené soubory, offline soubory a údaje o prohlížení tohoto uživatele. Operaci nelze vrátit zpět.</translation>
 <translation id="544083962418256601">Vytvořit zástupce…</translation>
 <translation id="5441100684135434593">Kabelová síť</translation>
-<translation id="5445088910157062298">Nechat službu určování polohy Google, aby aplikacím pomohla rychle a přesně najít vaši polohu. Můžete tak snížit spotřebu energie. Do Googlu se budou odesílat anonymní údaje o poloze, a to i v případě, že nebudou spuštěné žádné aplikace.</translation>
 <translation id="5448293924669608770">Jejda, při přihlašování se něco pokazilo</translation>
 <translation id="5449588825071916739">Přidat do záložek všechny karty</translation>
 <translation id="5449716055534515760">Zavřít okno</translation>
@@ -3689,7 +3688,6 @@
 <translation id="6110466548232134880">Identita organizace <ph name="ORGANIZATION" /> se sídlem na adrese <ph name="LOCALITY" /> byla ověřena organizací <ph name="ISSUER" />. Server neposkytl žádné údaje o transparentnosti certifikátu.</translation>
 <translation id="6111770213269631447">Přepis (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Povoleno ve výchozím nastavení</translation>
-<translation id="6112929985131461002">Toto zařízení bude do Googlu automaticky odesílat diagnostické údaje a údaje o využití. Toto <ph name="BEGIN_LINK1" />nastavení<ph name="END_LINK1" /> je vynuceno administrátorem. <ph name="BEGIN_LINK2" />Další informace<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Změnit nastavení jazyka a vstupu</translation>
 <translation id="6120205520491252677">Připnout tuto stránku na úvodní obrazovku...</translation>
 <translation id="6122081475643980456">Vaše připojení k internetu je ovládáno</translation>
@@ -3925,7 +3923,6 @@
 <translation id="6452181791372256707">Odmítnout</translation>
 <translation id="6454421252317455908">Metoda zadávání čínštiny (zrychlená)</translation>
 <translation id="6455348477571378046">Typ certifikátu:</translation>
-<translation id="6456234919706689841">Administrátor může zvolit, že se diagnostické údaje a údaje o využití z tohoto zařízení mají odesílat do Googlu. Zde toto <ph name="BEGIN_LINK1" />natavení<ph name="END_LINK1" /> můžete zobrazit. <ph name="BEGIN_LINK2" />Další informace<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Pokračovat v blokování JavaScriptu</translation>
 <translation id="6458308652667395253">Spravovat blokování JavaScriptu...</translation>
 <translation id="6459488832681039634">Pro hledání použít výběr</translation>
@@ -4702,7 +4699,6 @@
 <translation id="7587108133605326224">Baltské jazyky</translation>
 <translation id="7589461650300748890">Pozor, buďte opatrní!</translation>
 <translation id="7589661784326793847">Chvilku strpení</translation>
-<translation id="7593635197364225277">Automaticky zálohovat a obnovovat data aplikace Play na Disku Google. Toto nastavení můžete kdykoli změnit v nastavení systému Android. <ph name="BEGIN_LINK1" />Další informace<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (kód chyby <ph name="ERROR_CODE" />)</translation>
 <translation id="7596831438341298034">OK, importovat</translation>
 <translation id="7600965453749440009">Jazyk <ph name="LANGUAGE" /> nikdy nepřekládat</translation>
@@ -5209,7 +5205,6 @@
 <translation id="8300607741108698921">Nastavit během minuty</translation>
 <translation id="8303650969500425356">Povoluje JavaScriptu uzamknout orientaci obrazovky.</translation>
 <translation id="8303655282093186569">Nastavení zadávání Pinyinu</translation>
-<translation id="830424806940379275">Povolí rozšířením vytvářet okna panelů mimo rámec prohlížeče. Ve výchozím nastavení (nebo pokud je tento příznak deaktivován) se při pokusu o otevření panelu otevře namísto panelu vyskakovací okno. V operačních systémech pro počítače byla podpora panelů ukončena a budou z nich brzo odstraněny.</translation>
 <translation id="8306534594034939679">Umožňuje aktivovat podporu alternativních služeb (experimentální funkce protokolu HTTP).</translation>
 <translation id="8307376264102990850">Nabíjení
 Výpočet času zbývajícího do úplného nabití</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 61602f5..726e0ae 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1933,6 +1933,7 @@
 <translation id="3590559774363307859">Adgangskoden er gemt. Du kan se den og alle dine <ph name="SAVED_PASSWORDS_LINK" /> fra en hvilken som helst browser.</translation>
 <translation id="3590587280253938212">hurtig</translation>
 <translation id="3592260987370335752">&amp;Få flere oplysninger</translation>
+<translation id="3592313833691251126">Tillad, at udvidelser opretter panelvinduer, der åbner uden for browseren. Forsøg på at åbne et panel åbner et pop op-vindue i stedet, hvis dette ikke er aktiveret. Standardadfærden er kun at tillade dette for hvidlistede udvidelser. Aktiveret adfærd er at tillade dette for alle udvidelser. Deaktiveret adfærd er ikke at tillade paneler for nogen udvidelser.</translation>
 <translation id="359283478042092570">Indtast</translation>
 <translation id="3593152357631900254">Aktiver tilstanden Fuzzy-pinyin</translation>
 <translation id="3593965109698325041">Begrænsninger for certifikatnavn</translation>
@@ -2255,7 +2256,6 @@
 <translation id="4034042927394659004">Reducer lysstyrken på tastaturet</translation>
 <translation id="4035758313003622889">&amp;Jobliste</translation>
 <translation id="4037084878352560732">Hest</translation>
-<translation id="4037102579141982963">Denne enhed sender automatisk diagnostik og brugsdata til Google. Du kan til enhver tid ændre dette i <ph name="BEGIN_LINK1" />indstillingerne<ph name="END_LINK1" /> for din enhed. <ph name="BEGIN_LINK2" />Få flere oplysninger<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Aktivér hjælpefunktionen Faneskift i Android.</translation>
 <translation id="4044260751144303020">Sammensætning af faste positionselementer.</translation>
 <translation id="404493185430269859">Standardsøgemaskine</translation>
@@ -3226,7 +3226,6 @@
 <translation id="5439568486246921931">Denne handling sletter permanent denne brugers downloads, offlinefiler og browserdata. Handlingen kan ikke fortrydes.</translation>
 <translation id="544083962418256601">Opret genveje...</translation>
 <translation id="5441100684135434593">Kabelnetværk</translation>
-<translation id="5445088910157062298">Lad Googles placeringstjeneste hjælpe apps med at finde din placering hurtigt og nøjagtigt, så du sparer på batteriet. Anonyme placeringsdata sendes til Google, selv når der ikke kører nogen apps.</translation>
 <translation id="5448293924669608770">Ups! Der opstod en fejl under login</translation>
 <translation id="5449588825071916739">Tilføj alle faner som bogmærker</translation>
 <translation id="5449716055534515760">Luk vin&amp;due</translation>
@@ -3692,7 +3691,6 @@
 <translation id="6110466548232134880">Identiteten af <ph name="ORGANIZATION" /> i <ph name="LOCALITY" /> er blevet bekræftet af <ph name="ISSUER" />. Serveren leverede ingen Certificate Transparency-oplysninger.</translation>
 <translation id="6111770213269631447">Translitteration (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Tilladt som standard</translation>
-<translation id="6112929985131461002">Denne enhed sender automatisk diagnostik og brugsdata til Google. Denne <ph name="BEGIN_LINK1" />indstilling<ph name="END_LINK1" /> håndhæves af din administrator. <ph name="BEGIN_LINK2" />Få flere oplysninger<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Rediger indstillingerne for sprog og indtastning</translation>
 <translation id="6120205520491252677">Fastgør denne side til startskærmen...</translation>
 <translation id="6122081475643980456">Din internetforbindelse bliver kontrolleret</translation>
@@ -3929,7 +3927,6 @@
 <translation id="6452181791372256707">Afvis</translation>
 <translation id="6454421252317455908">Kinesisk indtastningsmetode (hurtig)</translation>
 <translation id="6455348477571378046">Certifikattype:</translation>
-<translation id="6456234919706689841">Din administrator kan vælge at sende diagnostik og brugsdata for denne enhed til Google. Du kan se <ph name="BEGIN_LINK1" />indstillingen<ph name="END_LINK1" /> her. <ph name="BEGIN_LINK2" />Få flere oplysninger<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Fortsæt blokering af JavaScript</translation>
 <translation id="6458308652667395253">Administrer blokering af JavaScript...</translation>
 <translation id="6459488832681039634">Brug valg til Find</translation>
@@ -4708,7 +4705,6 @@
 <translation id="7587108133605326224">Baltisk</translation>
 <translation id="7589461650300748890">Vær forsigtig.</translation>
 <translation id="7589661784326793847">Vent et øjeblik</translation>
-<translation id="7593635197364225277">Sikkerhedskopiér og gendan automatisk Play-appdata til Google Drev. Du kan til enhver tid ændre dette i Android Indstillinger. <ph name="BEGIN_LINK1" />Få flere oplysninger<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (fejlkode <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">OK, start import</translation>
 <translation id="7600965453749440009">Oversæt aldrig <ph name="LANGUAGE" /></translation>
@@ -5215,7 +5211,6 @@
 <translation id="8300607741108698921">Konfiguration på 1 minut</translation>
 <translation id="8303650969500425356">Tillader, at javascript kan låse skærmretningen.</translation>
 <translation id="8303655282093186569">Indstillinger for pinyin-indtastning</translation>
-<translation id="830424806940379275">Tillad, at udvidelser opretter panelvinduer, der åbner uden for browserens ramme. Et forsøg på at åbne et panel åbner som standard (eller hvis det ikke er aktiveret) et pop op-vindue i stedet. Paneler på operativsystemer er udfaset og fjernes snart.</translation>
 <translation id="8306534594034939679">Aktivér understøttelse af Alternative Services – en eksperimentel HTTP-funktion.</translation>
 <translation id="8307376264102990850">Oplader Beregner tid, indtil fuld</translation>
 <translation id="8308179586020895837">Spørg, om <ph name="HOST" /> vil have adgang til dit kamera</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 7f69509..e055acb 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1929,6 +1929,7 @@
 <translation id="3590559774363307859">Das Passwort wurde gespeichert. <ph name="SAVED_PASSWORDS_LINK" /> können Sie von jedem Browser aus aufrufen.</translation>
 <translation id="3590587280253938212">schnell</translation>
 <translation id="3592260987370335752">&amp;Weitere Informationen</translation>
+<translation id="3592313833691251126">Ermöglicht Erweiterungen das Erstellen von Fenstern mit Steuerfeldern, die außerhalb des Browser-Frames geöffnet werden. Ist diese Funktion deaktiviert, wird anstelle eines Steuerfelds ein Pop-up-Fenster geöffnet. Standardmäßig werden Steuerfelder nur für Erweiterungen zugelassen, die auf der weißen Liste stehen. Bei Aktivierung werden sie für alle Erweiterungen zugelassen. Bei Deaktivierung werden sie für keine Erweiterung zugelassen.</translation>
 <translation id="359283478042092570">Anmelden</translation>
 <translation id="3593152357631900254">Fuzzy-Pinyin-Modus aktivieren</translation>
 <translation id="3593965109698325041">Beschränkungen für Zertifikatsnamen</translation>
@@ -2251,7 +2252,6 @@
 <translation id="4034042927394659004">Tastenhelligkeit verringern</translation>
 <translation id="4035758313003622889">&amp;Taskmanager</translation>
 <translation id="4037084878352560732">Pferd</translation>
-<translation id="4037102579141982963">Dieses Gerät sendet automatisch Diagnose- und Nutzungsdaten an Google. Sie können dies jederzeit <ph name="BEGIN_LINK1" />in den Geräteeinstellungen ändern<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Weitere Informationen<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Aktiviert den Tab-Wechsler für Bedienungshilfen in Android</translation>
 <translation id="4044260751144303020">Aufbau für Elemente mit fester Position</translation>
 <translation id="404493185430269859">Standardsuchmaschine</translation>
@@ -3220,7 +3220,6 @@
 <translation id="5439568486246921931">Durch diese Aktion werden die Downloads, Offlinedateien und Browserdaten des Nutzers dauerhaft gelöscht. Der Vorgang kann nicht rückgängig gemacht werden.</translation>
 <translation id="544083962418256601">Verknüpfungen erstellen...</translation>
 <translation id="5441100684135434593">Verkabeltes Netzwerk</translation>
-<translation id="5445088910157062298">Durch den Standortdienst von Google können Apps Ihren Standort schnell und genau erfassen. Dadurch kann der Akkuverbrauch gesenkt werden. Anonyme Standortdaten werden an Google gesendet, auch wenn keine Apps ausgeführt werden.</translation>
 <translation id="5448293924669608770">Hoppla, bei der Anmeldung ist ein Fehler aufgetreten.</translation>
 <translation id="5449588825071916739">Alle Tabs als Lesezeichen speichern</translation>
 <translation id="5449716055534515760">Fen&amp;ster schließen</translation>
@@ -3686,7 +3685,6 @@
 <translation id="6110466548232134880">Die Identität von <ph name="ORGANIZATION" /> in <ph name="LOCALITY" /> wurde von <ph name="ISSUER" /> bestätigt. Informationen zur Zertifikatstransparenz wurden vom Server nicht bereitgestellt.</translation>
 <translation id="6111770213269631447">Transliteration (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Standardmäßig zugelassen</translation>
-<translation id="6112929985131461002">Dieses Gerät sendet automatisch Diagnose- und Nutzungsdaten an Google. <ph name="BEGIN_LINK1" />Diese Einstellung<ph name="END_LINK1" /> wird durch Ihren Administrator erzwungen. <ph name="BEGIN_LINK2" />Weitere Informationen<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Sprach- und Eingabeeinstellungen ändern</translation>
 <translation id="6120205520491252677">Diese Seite an Startbildschirm anheften...</translation>
 <translation id="6122081475643980456">Internetverbindung wird kontrolliert</translation>
@@ -3922,7 +3920,6 @@
 <translation id="6452181791372256707">Ablehnen</translation>
 <translation id="6454421252317455908">Chinesische Eingabemethode (schnell)</translation>
 <translation id="6455348477571378046">Zertifikatstyp:</translation>
-<translation id="6456234919706689841">Ihr Administrator kann festlegen, dass Diagnose- und Nutzungsdaten von diesem Gerät an Google gesendet werden. Sie können <ph name="BEGIN_LINK1" />diese Einstellung hier aufrufen<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Weitere Informationen<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">JavaScript weiterhin blockieren</translation>
 <translation id="6458308652667395253">JavaScript-Blockierung verwalten...</translation>
 <translation id="6459488832681039634">Auswahl suchen</translation>
@@ -4703,7 +4700,6 @@
 <translation id="7587108133605326224">Baltisch</translation>
 <translation id="7589461650300748890">Vorsicht!</translation>
 <translation id="7589661784326793847">Einen Moment bitte</translation>
-<translation id="7593635197364225277">Daten der Google Play App automatisch in Google Drive sichern und wiederherstellen. Sie können diese Einstellung jederzeit in den Android-Einstellungen ändern. <ph name="BEGIN_LINK1" />Weitere Informationen<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (Fehlercode <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Ok, importieren</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" /> nie übersetzen</translation>
@@ -5209,7 +5205,6 @@
 <translation id="8300607741108698921">Schnelle Einrichtung</translation>
 <translation id="8303650969500425356">Ermöglicht JavaScript, die Bildschirmausrichtung zu sperren.</translation>
 <translation id="8303655282093186569">Pinyin-Eingabeeinstellungen</translation>
-<translation id="830424806940379275">Ermöglicht Erweiterungen das Erstellen von Fenstern mit Steuerfeldern, die außerhalb des Browser-Frames geöffnet werden. Standardmäßig oder bei Deaktivieren dieser Funktion wird statt eines Steuerfelds ein Pop-up-Fenster geöffnet. Steuerfelder in Desktop-Betriebssystemen sind veraltet und werden bald entfernt.</translation>
 <translation id="8306534594034939679">Unterstützung für "Alternative Dienste", eine experimentelle HTTP-Funktion, aktivieren</translation>
 <translation id="8307376264102990850">Zeit bis zur vollständigen Aufladung wird berechnet</translation>
 <translation id="8308179586020895837">Nachfragen, wenn <ph name="HOST" /> auf Ihre Kamera zugreifen möchte</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 5cf34c18..7c47d0c 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1942,6 +1942,7 @@
 <translation id="3590559774363307859">Ο κωδικός πρόσβασης αποθηκεύτηκε. Μπορείτε να αποκτήσετε πρόσβαση σε αυτόν και σε όλους τους <ph name="SAVED_PASSWORDS_LINK" /> από οποιοδήποτε πρόγραμμα περιήγησης.</translation>
 <translation id="3590587280253938212">γρήγορο</translation>
 <translation id="3592260987370335752">&amp;Μάθετε περισσότερα</translation>
+<translation id="3592313833691251126">Να επιτρέπεται στις επεκτάσεις η δημιουργία παραθύρων πίνακα που ανοίγουν εκτός του πλαισίου του προγράμματος περιήγησης. Αν γίνουν προσπάθειες για να ανοίξει ένας πίνακας, τότε θα ανοίξει ένα αναδυόμενο παράθυρο στην περίπτωση που ο πίνακας δεν είναι ενεργοποιημένος. Η προεπιλεγμένη συμπεριφορά επιτρέπει μόνο τις επεκτάσεις που περιλαμβάνονται στη λίστα επιτρεπόμενων. Σε περίπτωση ενεργοποίησης, θα επιτρέπονται όλες οι επεκτάσεις. Αν απενεργοποιηθεί, θα απαγορεύεται η χρήση πινάκων για όλες τις επεκτάσεις.</translation>
 <translation id="359283478042092570">Είσοδος</translation>
 <translation id="3593152357631900254">Ενεργοποίηση κατάστασης Fuzzy-Pinyin</translation>
 <translation id="3593965109698325041">Περιορισμοί ονόματος πιστοποιητικού</translation>
@@ -2265,7 +2266,6 @@
 <translation id="4034042927394659004">Μείωση φωτεινότητας πλήκτρων</translation>
 <translation id="4035758313003622889">Δια&amp;χείριση εργασιών</translation>
 <translation id="4037084878352560732">Άλογο</translation>
-<translation id="4037102579141982963">Αυτή η συσκευή θα στέλνει αυτόματα διαγνωστικά και δεδομένα χρήσης στην Google. Μπορείτε να αλλάξετε αυτήν την επιλογή ανά πάσα στιγμή στις <ph name="BEGIN_LINK1" />Ρυθμίσεις<ph name="END_LINK1" /> της συσκευής σας. <ph name="BEGIN_LINK2" />Μάθετε περισσότερα<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Ενεργοποίηση της λειτουργίας εναλλαγής για την καρτέλα προσβασιμότητας στο Android.</translation>
 <translation id="4044260751144303020">Σύνθεση για στοιχεία καθορισμένης θέσης.</translation>
 <translation id="404493185430269859">Προεπιλεγμένη μηχανή αναζήτησης</translation>
@@ -3244,7 +3244,6 @@
 <translation id="5439568486246921931">Με αυτήν την ενέργεια θα διαγραφούν οριστικά οι λήψεις, τα αρχεία εκτός σύνδεσης και τα δεδομένα περιήγησης αυτού του χρήστη. Δεν είναι δυνατή η αναίρεσή της.</translation>
 <translation id="544083962418256601">Δημιουργία συντομεύσεων…</translation>
 <translation id="5441100684135434593">Ενσύρματο δίκτυο</translation>
-<translation id="5445088910157062298">Επιτρέψτε στην υπηρεσία τοποθεσίας της Google να βοηθά τις εφαρμογές να βρίσκουν γρήγορα και με ακρίβεια την τοποθεσία σας, περιορίζοντας έτσι την κατανάλωση μπαταρίας. Τα ανώνυμα δεδομένα τοποθεσίας θα αποστέλλονται στην Google, ακόμη κι όταν δεν εκτελούνται εφαρμογές.</translation>
 <translation id="5448293924669608770">Ωχ, παρουσιάστηκε κάποιο πρόβλημα κατά τη σύνδεση</translation>
 <translation id="5449588825071916739">Δημιουργία σελιδοδείκτη για όλες τις καρτέλες</translation>
 <translation id="5449716055534515760">Κλείσιμο παραθύρου</translation>
@@ -3711,7 +3710,6 @@
 <translation id="6110466548232134880">Η ταυτότητα του <ph name="ORGANIZATION" /> σε <ph name="LOCALITY" /> επαληθεύτηκε από <ph name="ISSUER" />. Δεν παρασχέθηκαν πληροφορίες πιστοποιητικού διαφάνειας από το διακομιστή.</translation>
 <translation id="6111770213269631447">Μεταγραφή (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Επιτρέπεται από προεπιλογή</translation>
-<translation id="6112929985131461002">Αυτή η συσκευή θα στέλνει αυτόματα διαγνωστικά και δεδομένα χρήσης στην Google. Αυτή η <ph name="BEGIN_LINK1" />ρύθμιση<ph name="END_LINK1" /> επιβάλλεται από το διαχειριστή σας. <ph name="BEGIN_LINK2" />Μάθετε περισσότερα<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Αλλαγή γλώσσας και ρυθμίσεις εισόδου</translation>
 <translation id="6120205520491252677">Καρφίτσωμα αυτής της σελίδας στην Οθόνη έναρξης…</translation>
 <translation id="6122081475643980456">Η σύνδεσή σας στο διαδίκτυο παρακολουθείται</translation>
@@ -3947,7 +3945,6 @@
 <translation id="6452181791372256707">Απόρριψη</translation>
 <translation id="6454421252317455908">Μέθοδος εισαγωγής Κινεζικών (quick)</translation>
 <translation id="6455348477571378046">Τύπος πιστοποιητικού:</translation>
-<translation id="6456234919706689841">Ο διαχειριστής σας μπορεί να επιλέξει να αποστείλει διαγνωστικά και δεδομένα χρήσης γι' αυτήν τη συσκευή στην Google. Μπορείτε να δείτε αυτήν τη <ph name="BEGIN_LINK1" />ρύθμιση<ph name="END_LINK1" /> εδώ. <ph name="BEGIN_LINK2" />Μάθετε περισσότερα<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Συνέχιση αποκλεισμού JavaScript</translation>
 <translation id="6458308652667395253">Διαχείριση αποκλεισμού JavaScript...</translation>
 <translation id="6459488832681039634">Χρήση Επιλογής για Εύρεση</translation>
@@ -4733,7 +4730,6 @@
 <translation id="7587108133605326224">Βαλτική</translation>
 <translation id="7589461650300748890">Να είστε προσεκτικοί.</translation>
 <translation id="7589661784326793847">Περιμένετε λίγο</translation>
-<translation id="7593635197364225277">Αυτόματη δημιουργία αντιγράφων ασφαλείας και επαναφορά των δεδομένων εφαρμογής Play στο Google Drive. Μπορείτε να αλλάξετε αυτήν την επιλογή ανά πάσα στιγμή στις Ρυθμίσεις Android. <ph name="BEGIN_LINK1" />Μάθετε περισσότερα<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (κωδικός σφάλματος <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Ok, εισαγωγή</translation>
 <translation id="7600965453749440009">Να μην γίνεται ποτέ μετάφραση από <ph name="LANGUAGE" /></translation>
@@ -5242,7 +5238,6 @@
 <translation id="8300607741108698921">Ρύθμιση 1 λεπτού</translation>
 <translation id="8303650969500425356">Επιτρέπει στην javascript να κλειδώνει τον προσανατολισμό της οθόνης.</translation>
 <translation id="8303655282093186569">Ρυθμίσεις εισόδου Pinyin</translation>
-<translation id="830424806940379275">Επιτρέπεται στις επεκτάσεις η δημιουργία παραθύρων πίνακα που ανοίγουν εκτός του πλαισίου του προγράμματος περιήγησης. Εάν είναι προεπιλογή ή εάν έχει απενεργοποιηθεί, η προσπάθεια ανοίγματος ενός πίνακα θα ανοίξει ένα αναδυόμενο παράθυρο. Οι πίνακες σε λειτουργικά συστήματα υπολογιστών θα καταργηθούν και σύντομα θα αφαιρεθούν.</translation>
 <translation id="8306534594034939679">Ενεργοποίηση υποστήριξης για Εναλλακτικές υπηρεσίες, μια πειραματική δυνατότητα του HTTP.</translation>
 <translation id="8307376264102990850">Φόρτιση:
 Υπολογισμός χρόνου μέχρι την ολοκλήρωση</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index c415579..5f6cbfd 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -34,6 +34,7 @@
 <translation id="1047431265488717055">Copy Link Te&amp;xt</translation>
 <translation id="1047726139967079566">Bookmark This Page...</translation>
 <translation id="1047956942837015229">Deleting <ph name="COUNT" /> items...</translation>
+<translation id="1048286738600630630">Displays</translation>
 <translation id="1048597748939794622">Force-enabled for all layers</translation>
 <translation id="1049795001945932310">&amp;Language settings</translation>
 <translation id="1049926623896334335">Word document</translation>
@@ -98,6 +99,7 @@
 <translation id="1125520545229165057">Dvorak (Hsu)</translation>
 <translation id="1128109161498068552">Do not allow any sites to use system exclusive messages to access MIDI devices</translation>
 <translation id="1128128132059598906">EAP-TTLS</translation>
+<translation id="1128591060186966949">Edit search engine</translation>
 <translation id="1128987120443782698">The storage device has a capacity of <ph name="DEVICE_CAPACITY" />. Please insert an SD card or USB memory stick with at least 4 GB of capacity.</translation>
 <translation id="1132956125173653312">Enable Android apps on your Chromebook.</translation>
 <translation id="1137135726305341424">domContentLoaded and all resources loads started before domContentLoaded (main frame and same origin iframes).</translation>
@@ -107,6 +109,7 @@
 <translation id="1145292499998999162">Plug-in blocked</translation>
 <translation id="1146204723345436916">Import bookmarks from HTML file...</translation>
 <translation id="1148624853678088576">You’re all set!</translation>
+<translation id="1149401351239820326">Expiry month</translation>
 <translation id="1151972924205500581">Password required</translation>
 <translation id="1154228249304313899">Open this page:</translation>
 <translation id="115443833402798225">Hangul Ahnmatae</translation>
@@ -118,6 +121,7 @@
 <translation id="1162223735669141505"><ph name="BEGIN_LINK" />Native Client plugin<ph name="END_LINK" /> needs to be enabled to use this feature.</translation>
 <translation id="1163361280229063150">{NUM_DOWNLOAD,plural, =1{A download is currently in progress. Do you want to cancel the download and exit incognito mode?}other{# downloads are currently in progress. Do you want to cancel the downloads and exit incognito mode?}}</translation>
 <translation id="1163931534039071049">&amp;View frame source</translation>
+<translation id="1164674268730883318">Turn off Smart Lock for <ph name="DEVICE_TYPE" />?</translation>
 <translation id="1165039591588034296">Error</translation>
 <translation id="1166212789817575481">Close Tabs to the Right</translation>
 <translation id="1166359541137214543">ABC</translation>
@@ -135,6 +139,7 @@
 <translation id="1181037720776840403">Remove</translation>
 <translation id="1183083053288481515">Using an administrator-provided certificate</translation>
 <translation id="1183237619868651138">Can't install <ph name="EXTERNAL_CRX_FILE" /> in local cache.</translation>
+<translation id="1183917921992319637">Configure PIN</translation>
 <translation id="1185924365081634987">You may also try to <ph name="GUEST_SIGNIN_LINK_START" />browse as guest<ph name="GUEST_SIGNIN_LINK_END" /> to fix this network error.</translation>
 <translation id="1187722533808055681">Idle wake ups</translation>
 <translation id="1188807932851744811">Log not uploaded.</translation>
@@ -200,6 +205,7 @@
 <translation id="1277908057200820621">View device list</translation>
 <translation id="1278049586634282054">Inspect views:</translation>
 <translation id="1278813325885878377">Hungarian QWERTY keyboard</translation>
+<translation id="1284355409890639046">Pair Bluetooth Device</translation>
 <translation id="1285320974508926690">Never translate this site</translation>
 <translation id="1285484354230578868">Store data in your Google Drive account</translation>
 <translation id="1290223615328246825">Automatic sign-in failed</translation>
@@ -305,6 +311,7 @@
 <translation id="143027896309062157">Read and change all your data on your computer and the websites that you visit</translation>
 <translation id="1430915738399379752">Print</translation>
 <translation id="1432581352905426595">Manage search engines</translation>
+<translation id="1433811987160647649">Ask before accessing</translation>
 <translation id="1434696352799406980">This will reset your startup page, new tab page, search engine and pinned tabs. It will also disable all extensions and clear temporary data like cookies. Your bookmarks, history and saved passwords will not be cleared.</translation>
 <translation id="1434886155212424586">Homepage is the New Tab page</translation>
 <translation id="1435550882135542937">Extension toolbar redesign</translation>
@@ -340,6 +347,7 @@
 <translation id="14720830734893704">Enable virtual keyboard support.</translation>
 <translation id="1474079335130556426">Enable background mode for the Push API. This allows Chrome to continue running after the last window is closed and to launch at OS startup, if the Push API needs it.</translation>
 <translation id="1474339897586437869">"<ph name="FILENAME" />" was not uploaded. There is not enough free space in your Google Drive.</translation>
+<translation id="1475502736924165259">You have certificates on file that do not fit into any of the other categories</translation>
 <translation id="1476607407192946488">&amp;Language Settings</translation>
 <translation id="1476949146811612304">Set which search engine is used when searching from the
         <ph name="BEGIN_LINK" />omnibox<ph name="END_LINK" />.</translation>
@@ -377,6 +385,7 @@
     proxy server, adjust your <ph name="LINK_START" />proxy settings<ph name="LINK_END" />.</translation>
 <translation id="1510907582379248592">Saved passwords for <ph name="ORIGIN" />:</translation>
 <translation id="1511004689539562549">Do not allow sites to access your camera</translation>
+<translation id="1511388193702657997">Offer to save your web passwords</translation>
 <translation id="1511623662787566703">Signed in as <ph name="USER_EMAIL_ADDRESS" />. Sync has been stopped via the Google Dashboard.</translation>
 <translation id="1514215615641002767">Add to desktop</translation>
 <translation id="1514298457297359873">Allows applications to use NaCl Socket API. Use only to test NaCl plug-ins.</translation>
@@ -398,6 +407,7 @@
 <translation id="1529968269513889022">the past week</translation>
 <translation id="1531004739673299060">Application Window</translation>
 <translation id="1531865825384516080">SafeSearch URLs reporting.</translation>
+<translation id="1532687502998799885">PIN must be at least 4 digits:</translation>
 <translation id="1532697124104874386">Enable/Disable smart deployment of the virtual keyboard.</translation>
 <translation id="1533897085022183721">Less than <ph name="MINUTES" />.</translation>
 <translation id="1533920822694388968">TV alignment</translation>
@@ -426,6 +436,7 @@
 <translation id="1558988940633416251">Enable cross-platform HarfBuzz layout engine for UI text. Doesn't affect web content.</translation>
 <translation id="1559235587769913376">Input Unicode characters</translation>
 <translation id="1561092721008294962">HarfBuzz for UI text</translation>
+<translation id="1566049601598938765">Website</translation>
 <translation id="1566958206723629112">Flash and PDF</translation>
 <translation id="1567723158593978621">When enabled, signing in to the browser will use a new GAIA password-separated sign-in flow.</translation>
 <translation id="1567993339577891801">JavaScript Console</translation>
@@ -483,6 +494,7 @@
 <translation id="1645228020260124617"><ph name="PRECENTAGE" />%</translation>
 <translation id="1645870377513700713">Enable native notifications.</translation>
 <translation id="1646136617204068573">Hungarian keyboard</translation>
+<translation id="1646982517418478057">Please enter a password to encrypt this certificate</translation>
 <translation id="164729547906544836">Tamil keyboard (itrans)</translation>
 <translation id="164814987133974965">A supervised user can explore the web with your guidance. As the manager of a supervised user, you can
     <ph name="BEGIN_BOLD" />allow or prohibit<ph name="END_BOLD" /> certain websites,
@@ -510,6 +522,7 @@
 <translation id="1673103856845176271">The file could not be accessed for security reasons.</translation>
 <translation id="1675023460278456180">Material Hybrid</translation>
 <translation id="167832068858235403">vol. down</translation>
+<translation id="1678331212993975953">Site Details</translation>
 <translation id="1679068421605151609">Developer Tools</translation>
 <translation id="1681120471812444678">Set up to add printers…</translation>
 <translation id="1682324559341535203">Enrol <ph name="DEVICE_TYPE" /></translation>
@@ -531,11 +544,13 @@
 <translation id="1699395855685456105">Hardware revision:</translation>
 <translation id="1700199471143028312">Your administrator doesn’t allow you to create supervised users.</translation>
 <translation id="1701062906490865540">Remove this person</translation>
+<translation id="1702294042233267824">Search engine used when searching from the omnibox</translation>
 <translation id="1702534956030472451">Western</translation>
 <translation id="1707463636381878959">Share this network with other users</translation>
 <translation id="1708199901407471282">When opening a suggested webpage from the New Tab Page, if a tab is already open for the suggestion, switch to that one instead of loading the suggestion in the new tab.</translation>
 <translation id="1708338024780164500">(Inactive)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Native)</translation>
 <translation id="1711973684025117106">Zipping failed, unexpected error: $1</translation>
 <translation id="1715941336038158809">Invalid user name or password.</translation>
 <translation id="1717733954209022288">Google Payments card saving tick box</translation>
@@ -630,6 +645,7 @@
 <translation id="1852799913675865625">There was an error while trying to read the file: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1856715684130786728">Add location...</translation>
 <translation id="1857166538520940818">Attach file:</translation>
+<translation id="1858585891038687145">Trust this certificate for identifying software makers</translation>
 <translation id="1859234291848436338">Writing Direction</translation>
 <translation id="1864111464094315414">Login</translation>
 <translation id="1864676585353837027">Change how these files are shared</translation>
@@ -661,6 +677,7 @@
 <translation id="1909880997794698664">Are you sure you want to permanently keep this device in kiosk mode?</translation>
 <translation id="1910572251697014317">Google sent a notification to this phone. Note that with Bluetooth, your phone may keep your <ph name="DEVICE_TYPE" /> unlocked from over 100 feet away. In cases where this could be a problem, you can &lt;a&gt;temporarily disable this feature&lt;/a&gt;.</translation>
 <translation id="1910721550319506122">Welcome!</translation>
+<translation id="1911073860190924580">Only password</translation>
 <translation id="1916502483199172559">Default red avatar</translation>
 <translation id="191688485499383649">An unknown error occurred trying to connect to "<ph name="DEVICE_NAME" />".</translation>
 <translation id="1918141783557917887">&amp;Smaller</translation>
@@ -722,6 +739,8 @@
 <translation id="2007404777272201486">Report an Issue...</translation>
 <translation id="2011110593081822050">Web Worker: <ph name="WORKER_NAME" /></translation>
 <translation id="2012766523151663935">Firmware revision:</translation>
+<translation id="2013984794184160106">15</translation>
+<translation id="2016430552235416146">Traditional</translation>
 <translation id="2017052954220678795">Threaded GPU rasterisation</translation>
 <translation id="2017334798163366053">Disable performance data collection</translation>
 <translation id="2018352199541442911">Sorry, your external storage device is not supported at present.</translation>
@@ -738,6 +757,7 @@
 <translation id="204497730941176055">Microsoft Certificate Template Name</translation>
 <translation id="2045969484888636535">Continue blocking cookies</translation>
 <translation id="204622017488417136">Your device will be returned to the previously installed version of Chrome. All user accounts and local data will be removed. This cannot be undone.</translation>
+<translation id="2047962517134476164">Confirm your login to continue</translation>
 <translation id="2048182445208425546">Access your network traffic</translation>
 <translation id="2049137146490122801">Access to local files on your machine is disabled by your administrator.</translation>
 <translation id="204914487372604757">Create shortcut</translation>
@@ -823,10 +843,12 @@
 <translation id="2155931291251286316">Always allow pop-ups from <ph name="HOST" /></translation>
 <translation id="215753907730220065">Exit Full Screen</translation>
 <translation id="2157875535253991059">This page is now full screen.</translation>
+<translation id="2161553589239083578">Confirm your PIN:</translation>
 <translation id="216169395504480358">Add Wi-Fi ...</translation>
 <translation id="2163470535490402084">Please connect to the Internet to sign in to your <ph name="DEVICE_TYPE" />.</translation>
 <translation id="2164862903024139959">Vietnamese keyboard (TCVN)</translation>
 <translation id="2165453356262207111">Smart Lock (beta)</translation>
+<translation id="2166369534954157698">The quick brown fox jumps over the lazy dog</translation>
 <translation id="2167276631610992935">JavaScript</translation>
 <translation id="2168214441502403371">Persian keyboard</translation>
 <translation id="2168725742002792683">File extensions</translation>
@@ -843,6 +865,7 @@
 <translation id="2190355936436201913">(empty)</translation>
 <translation id="2190469909648452501">Decrease</translation>
 <translation id="2192505247865591433">From:</translation>
+<translation id="2193365732679659387">Trust settings</translation>
 <translation id="2195729137168608510">Email Protection</translation>
 <translation id="2198315389084035571">Simplified Chinese</translation>
 <translation id="2199829153606285995">Voice input on virtual keyboard</translation>
@@ -860,9 +883,11 @@
 <translation id="2213819743710253654">Page Action</translation>
 <translation id="2215277870964745766">Welcome! Set your language and network</translation>
 <translation id="2217501013957346740">Create a name -</translation>
+<translation id="2218019600945559112">Mouse and touchpad</translation>
 <translation id="2218515861914035131">Paste as plain text</translation>
 <translation id="2218947405056773815">Rats! <ph name="API_NAME" /> hit a snag.</translation>
 <translation id="2220529011494928058">Report an issue</translation>
+<translation id="2220572644011485463">PIN or password</translation>
 <translation id="2221240591176106785">Enable non-validating reload</translation>
 <translation id="2222641695352322289">The only way to undo this is to re-install <ph name="IDS_SHORT_PRODUCT_OS_NAME" />.</translation>
 <translation id="2224444042887712269">This setting belongs to <ph name="OWNER_EMAIL" />.</translation>
@@ -906,6 +931,7 @@
 <translation id="2258195278080713720">Latest stable JavaScript features</translation>
 <translation id="2260567344816042527">Google Chrome will use mobile data if you're not connected to another network.</translation>
 <translation id="2260654768907572711">BROWSER PLUGIN</translation>
+<translation id="2262477216570151239">Delay before repeat</translation>
 <translation id="226269835214688456">If you turn off Smart Lock for Chromebook, you won’t be able to unlock your Chrome devices using your phone. You'll need to type your password.</translation>
 <translation id="2262903407161221567">Certain UI components will display visual feedback upon touch interactions.</translation>
 <translation id="2263497240924215535">(Disabled)</translation>
@@ -919,6 +945,7 @@
 <translation id="2273562597641264981">Operator:</translation>
 <translation id="2275694568175246751">Right-to-left</translation>
 <translation id="2276503375879033601">Add More Apps</translation>
+<translation id="2277255602909579701">All cookies and site data</translation>
 <translation id="2278098630001018905">Use different delivery address</translation>
 <translation id="2278562042389100163">Open browser window</translation>
 <translation id="2278988676849463018">Kannada keyboard (Phonetic)</translation>
@@ -959,6 +986,7 @@
 <translation id="2339120501444485379">Enter new name</translation>
 <translation id="2339641773402824483">Checking for updates...</translation>
 <translation id="2342060820861917889">long (2000 ms)</translation>
+<translation id="2342282706041269970">Try signing out and back in again.</translation>
 <translation id="23434688402327542">Kazakh keyboard</translation>
 <translation id="2344028582131185878">Automatic downloads</translation>
 <translation id="2344262275956902282">Use - and = keys to page a candidate list</translation>
@@ -1073,6 +1101,7 @@
 <translation id="2494837236724268445">Gujarati keyboard (Phonetic)</translation>
 <translation id="2496180316473517155">Browsing history</translation>
 <translation id="2496540304887968742">The device must have capacity of 4 GB or greater.</translation>
+<translation id="2497229222757901769">Mouse speed</translation>
 <translation id="249819058197909513">Don't warn again for this app</translation>
 <translation id="2498436043474441766">Add Printers</translation>
 <translation id="2498539833203011245">Minimise</translation>
@@ -1146,6 +1175,7 @@
 <translation id="2587102772237859721">Passive Event Listener Override</translation>
 <translation id="2587203970400270934">Operator code:</translation>
 <translation id="2587922270115112871">Creating a supervised user does not create a Google account, and their settings and data will not follow them to other devices with Chrome Sync. A supervised user applies only to this device.</translation>
+<translation id="25912682830130293">View reported settings</translation>
 <translation id="2594049137847833442">Important sites options in clear browsing data dialogue</translation>
 <translation id="2594056015203442344">When enabled, the audio indicators in the tab strip double as tab audio mute controls.  This also adds commands in the tab context menu for quickly muting multiple selected tabs.</translation>
 <translation id="259421303766146093">Demagnify</translation>
@@ -1198,6 +1228,7 @@
 <translation id="2665394472441560184">Add a new word</translation>
 <translation id="2665717534925640469">This page is now full screen and has disabled your mouse cursor.</translation>
 <translation id="2665919335226618153">Oh no! There was an error during formatting.</translation>
+<translation id="2667463864537187133">Manage spell check</translation>
 <translation id="2668079306436607263">Overscroll history navigation</translation>
 <translation id="2670102641511624474"><ph name="APP_NAME" /> is sharing a Chrome tab.</translation>
 <translation id="2670965183549957348">Chewing input method</translation>
@@ -1220,7 +1251,9 @@
 <translation id="2694026874607847549">1 cookie</translation>
 <translation id="2696862700756109583">Full screen exceptions</translation>
 <translation id="2702540957532124911">Keyboard:</translation>
+<translation id="2704142793323512908">Also remove your existing data from this device.</translation>
 <translation id="2704184184447774363">Microsoft Document Signing</translation>
+<translation id="270516211545221798">Touchpad speed</translation>
 <translation id="2706892089432507937">USB Devices</translation>
 <translation id="2707024448553392710">Component downloading</translation>
 <translation id="270921614578699633">Average Over</translation>
@@ -1399,6 +1432,7 @@
 <translation id="2902734494705624966">US extended</translation>
 <translation id="2903493209154104877">Addresses</translation>
 <translation id="290444763029043472"><ph name="DOWNLOADED_AMOUNT_MB" /> MB / <ph name="TOTAL_AMOUNT_MB" /> MB downloaded</translation>
+<translation id="2904456025988372123">Ask when a site tries to download files automatically after the first file</translation>
 <translation id="2907619724991574506">Startup URLs</translation>
 <translation id="2908162660801918428">Add Media Gallery by Directory</translation>
 <translation id="2908789530129661844">Zoom screen out</translation>
@@ -1445,6 +1479,7 @@
 <translation id="2963151496262057773">The following plug-in is unresponsive: <ph name="PLUGIN_NAME" />Would you like to stop it?</translation>
 <translation id="2963783323012015985">Turkish keyboard</translation>
 <translation id="2964193600955408481">Disable Wi-Fi</translation>
+<translation id="2964313852984024865">Editing</translation>
 <translation id="2966459079597787514">Swedish keyboard</translation>
 <translation id="2966598748518102999">Improve voice search by sending the sound of "Ok Google", and a few seconds before, to Google.</translation>
 <translation id="2967544384642772068">Kill</translation>
@@ -1593,6 +1628,7 @@
 <translation id="3150927491400159470">Hard Reload</translation>
 <translation id="315116470104423982">Mobile data</translation>
 <translation id="315141861755603168">"<ph name="BUNDLE_NAME" />" adds these apps:</translation>
+<translation id="3151786313568798007">Orientation</translation>
 <translation id="3153177132960373163">Allow all sites to use a plug-in to access your computer</translation>
 <translation id="3154429428035006212">Offline for more than a month</translation>
 <translation id="3157931365184549694">Restore</translation>
@@ -1649,6 +1685,7 @@
 <translation id="3234666976984236645">Always detect important content on this site</translation>
 <translation id="3236997602556743698">3 Set (390)</translation>
 <translation id="3237784613213365159"><ph name="NEW_PROFILE_NAME" /> is now a supervised user</translation>
+<translation id="323803881985677942">Open extension options</translation>
 <translation id="324056286105023296">Not <ph name="PROFILE_NAME" />?</translation>
 <translation id="3241680850019875542">Select the root directory of the extension to pack. To update an extension, also select the private key file to reuse.</translation>
 <translation id="3241720467332021590">Irish Gaelic</translation>
@@ -1674,6 +1711,7 @@
 <translation id="3268451620468152448">Open Tabs</translation>
 <translation id="3269093882174072735">Load image</translation>
 <translation id="3269101346657272573">Please enter PIN.</translation>
+<translation id="3269737334347286816">Sign-in details are out of date.</translation>
 <translation id="326999365752735949">Downloading diff</translation>
 <translation id="3270965368676314374">Read, change and delete photos, music and other media from your computer</translation>
 <translation id="3273410961255278341">Send For:</translation>
@@ -1773,6 +1811,7 @@
 <translation id="3382073616108123819">Oops!  The system failed to determine device identifiers for this device.</translation>
 <translation id="3384773155383850738">Maximum number of suggestions</translation>
 <translation id="3385050660708634073">Encrypt all synced data with your own sync passphrase.</translation>
+<translation id="3385131213214862288">Clear the following items from</translation>
 <translation id="338583716107319301">Separator</translation>
 <translation id="3386219708421216619">Bookmark Added</translation>
 <translation id="3391392691301057522">Old PIN:</translation>
@@ -1808,6 +1847,7 @@
 <translation id="3439153939049640737">Always allow <ph name="HOST" /> to access your microphone</translation>
 <translation id="3439282137581679399">Enables the Permissions Blacklist, which blocks permissions for blacklisted sites for Safe Browsing users.</translation>
 <translation id="3439970425423980614">Opening PDF in Preview</translation>
+<translation id="3440761377721825626">Ask when a site wants to use a plug-in to access your computer</translation>
 <translation id="3441653493275994384">Screen</translation>
 <translation id="3441653695259810643">Re-use a cached font in the renderer to serve different sizes of font for faster layout.</translation>
 <translation id="3445092916808119474">Make primary</translation>
@@ -1822,6 +1862,7 @@
 <translation id="3456236151053308041">Enable IME extensions to supply customised views for user input such as virtual keyboards.</translation>
 <translation id="345693547134384690">Open &amp;image in new tab</translation>
 <translation id="3458620904104024826">Enable exporting of tracing events to ETW.</translation>
+<translation id="3459509316159669723">Printing</translation>
 <translation id="3459774175445953971">Last modified:</translation>
 <translation id="3460771772332290399">Offline Auto-Reload Mode</translation>
 <translation id="3462413494201477527">Cancel account setup?</translation>
@@ -1865,6 +1906,7 @@
 <translation id="3508920295779105875">Choose Another Folder...</translation>
 <translation id="3509527969829946096">This option enables support in Cast Streaming for encoding video streams using platform hardware.</translation>
 <translation id="3510797500218907545">WiMAX</translation>
+<translation id="3511200754045804813">Re-scan</translation>
 <translation id="3511307672085573050">Copy Link Addr&amp;ess</translation>
 <translation id="3511399794969432965">Trouble connecting?</translation>
 <translation id="351152300840026870">Fixed-width font</translation>
@@ -1934,6 +1976,7 @@
 <translation id="3590559774363307859">Password saved. You can access it and all your <ph name="SAVED_PASSWORDS_LINK" /> from any browser.</translation>
 <translation id="3590587280253938212">fast</translation>
 <translation id="3592260987370335752">&amp;Learn more</translation>
+<translation id="3592313833691251126">Allow extensions to create panel windows that open outside of the browser frame. Attempts to open a panel will open a pop-up instead if not enabled. Default behaviour is to allow only for white-listed extensions. Enabled behaviour is to allow for all extensions. Disabled behaviour is to disallow panels for any extension.</translation>
 <translation id="359283478042092570">Enter</translation>
 <translation id="3593152357631900254">Enable Fuzzy-Pinyin mode</translation>
 <translation id="3593965109698325041">Certificate Name Constraints</translation>
@@ -2011,6 +2054,7 @@
 <translation id="3695919544155087829">Please enter the password that was used to encrypt this certificate file.</translation>
 <translation id="3696411085566228381">none</translation>
 <translation id="3697100740575341996">Your IT administrator has disabled Chrome Goodies for your device. <ph name="MORE_INFO_LINK" /></translation>
+<translation id="3699080292907545058">Set maximum enabled TLS version.</translation>
 <translation id="3699624789011381381">Email address</translation>
 <translation id="3704162925118123524">The network that you are using may require you to visit its log-in page.</translation>
 <translation id="3704331259350077894">Cessation of Operation</translation>
@@ -2056,10 +2100,12 @@
 <translation id="3758201569871381925">Please make sure that your Hotrod device is turned on and connected to a TV.</translation>
 <translation id="375841316537350618">Downloading proxy script...</translation>
 <translation id="3759371141211657149">Manage handler settings...</translation>
+<translation id="3759553810934020361">Bluetooth turned off.</translation>
 <translation id="3759933321830434300">Block parts of web pages</translation>
 <translation id="3760460896538743390">Inspect &amp;Background Page</translation>
 <translation id="37613671848467444">Open in &amp;Incognito Window</translation>
 <translation id="3763401818161139108">Always run on <ph name="ORIGIN" /></translation>
+<translation id="3764314093345384080">Detailed build information</translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Communicate with a USB device}other{Communicate with # USB devices}}</translation>
 <translation id="3764800135428056022">Offer to save your web passwords.</translation>
 <translation id="3764986667044728669">Unable to enroll</translation>
@@ -2089,6 +2135,7 @@
 <translation id="3798449238516105146">Version</translation>
 <translation id="3798935682015223249">MTP support in File Manager</translation>
 <translation id="3800764353337460026">Symbol style</translation>
+<translation id="3800806661949714323">Show all (recommended)</translation>
 <translation id="3801082500826908679">Faroese</translation>
 <translation id="3803991353670408298">Please add another input method before removing this one.</translation>
 <translation id="380408572480438692">Enabling collection of performance data will help Google improve the system over time. No data is sent until you file a feedback report (Alt-Shift-I) and include performance data. You can return to this screen to disable collection at any time.</translation>
@@ -2106,6 +2153,7 @@
 <translation id="3819007103695653773">Allow all sites to send background push messages</translation>
 <translation id="3819752733757735746">Switch access (control the computer with just one or two switches)</translation>
 <translation id="3819800052061700452">&amp;Full screen</translation>
+<translation id="3821453754632750466">Enable Web Payments</translation>
 <translation id="3822265067668554284">Do not allow any site to track your physical location</translation>
 <translation id="3825863595139017598">Mongolian keyboard</translation>
 <translation id="3827306204503227641">Continue allowing unsandboxed plug-ins</translation>
@@ -2167,9 +2215,11 @@
 <translation id="3899968422636198696"><ph name="ORGNAME" /> <ph name="HOSTNAME" /></translation>
 <translation id="3901991538546252627">Connecting to <ph name="NAME" /></translation>
 <translation id="3902799646152133632">Skips no-store main frame.</translation>
+<translation id="3904196543277238487">Maximum TLS version enabled.</translation>
 <translation id="3905761538810670789">Repair app</translation>
 <translation id="390718707505136526">Enables origin trials for controlling access to feature/API experiments.</translation>
 <translation id="3908501907586732282">Enable extension</translation>
+<translation id="3909690856344416952"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" />, and 1 other</translation>
 <translation id="3909791450649380159">Cu&amp;t</translation>
 <translation id="3910699493603749297">Khmer keyboard</translation>
 <translation id="3911073280391218446"><ph name="USER_DISPLAY_NAME" /> (name used on this device)</translation>
@@ -2189,6 +2239,7 @@
 <translation id="3930521966936686665">Play on</translation>
 <translation id="3936390757709632190">&amp;Open audio in new tab</translation>
 <translation id="3936768791051458634">Change channel...</translation>
+<translation id="3936925983113350642">The password you choose will be required to restore this certificate later. Please record it in a safe location.</translation>
 <translation id="3937640725563832867">Certificate Issuer Alternative Name</translation>
 <translation id="3938113500786732264">Switch people faster</translation>
 <translation id="3940233957883229251">Enable auto-repeat</translation>
@@ -2256,9 +2307,10 @@
 <translation id="4034042927394659004">Decrease key brightness</translation>
 <translation id="4035758313003622889">&amp;Task manager</translation>
 <translation id="4037084878352560732">Horse</translation>
-<translation id="4037102579141982963">This device will automatically send diagnostic and usage data to Google. You can change this at any time in your device <ph name="BEGIN_LINK1" />settings<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Find Out More<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Enable the accessibility tab switcher for Android.</translation>
+<translation id="4037889604535939429">Edit person</translation>
 <translation id="4044260751144303020">Compositing for fixed position elements.</translation>
+<translation id="4044612648082411741">Enter your certificate password</translation>
 <translation id="404493185430269859">Default search engine</translation>
 <translation id="4047112090469382184">How this is secure</translation>
 <translation id="4047345532928475040">N/A</translation>
@@ -2351,6 +2403,7 @@
 <translation id="417475959318757854">Centre the App Launcher.</translation>
 <translation id="4176463684765177261">Disabled</translation>
 <translation id="4179512409951755566">Enable OSK Overscroll</translation>
+<translation id="418062721134714140">Manage your SSL certificates and settings</translation>
 <translation id="4180788401304023883">Delete CA certificate "<ph name="CERTIFICATE_NAME" />"?</translation>
 <translation id="418179967336296930">Russian Phonetic (YaZHert) keyboard</translation>
 <translation id="4181841719683918333">Languages</translation>
@@ -2365,6 +2418,7 @@
 <translation id="4195643157523330669">Open in new tab</translation>
 <translation id="4195814663415092787">Continue where you left off</translation>
 <translation id="4197674956721858839">Zip selection</translation>
+<translation id="4200689466366162458">Customised words</translation>
 <translation id="4200983522494130825">New &amp;tab</translation>
 <translation id="4206144641569145248">Alien</translation>
 <translation id="420665587194630159">(This extension is managed and cannot be removed or disabled.)</translation>
@@ -2461,10 +2515,12 @@
 <translation id="4350019051035968019">This device cannot be enrolled to the domain that your account belongs to because the device is marked for management by a different domain.</translation>
 <translation id="4354806558096370704">Enables the use of the native CUPS printing backend.</translation>
 <translation id="4355925451975609675">Press |<ph name="ACCELERATOR1" />|+|<ph name="ACCELERATOR2" />| to go forward</translation>
+<translation id="4358353773267946514"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /></translation>
 <translation id="4358697938732213860">Add an address</translation>
 <translation id="4359408040881008151">Installed because of dependent extension(s).</translation>
 <translation id="4361190688154226069">Rect-based targeting in views</translation>
 <translation id="4361765875689149937"><ph name="ORIGIN" /> wants to pair with:</translation>
+<translation id="4363771538994847871">No Cast destinations found. Need help?</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> downloaded</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> is sharing a window.</translation>
 <translation id="4364830672918311045">Display notifications</translation>
@@ -2556,6 +2612,7 @@
 <translation id="4509345063551561634">Location:</translation>
 <translation id="4514542542275172126">Set up new supervised user</translation>
 <translation id="4514914692061505365">Force the use of PNaCl's fast Subzero translator for all pexe files.</translation>
+<translation id="451515744433878153">Remove</translation>
 <translation id="4516641987425683031">Synced tabs</translation>
 <translation id="4518677423782794009">Is Chrome crashing, showing unusual start-up pages, toolbars or unexpected ads you can't get rid of, or otherwise changing your browsing experience? You may be able to fix the problem by running the Chrome Clean-Up Tool.</translation>
 <translation id="452039078290142656">unknown devices from <ph name="VENDOR_NAME" /></translation>
@@ -2592,6 +2649,7 @@
 <translation id="4562991793854515912">extremely short (600 ms)</translation>
 <translation id="4563210852471260509">Initial input language is Chinese</translation>
 <translation id="456664934433279154">Controls whether to use Toolkit-Views based Chrome App windows.</translation>
+<translation id="4567772783389002344">Add word</translation>
 <translation id="4569998400745857585">Menu containing hidden extensions</translation>
 <translation id="4570444215489785449">You can now lock this device remotely anytime on Chrome Manager.</translation>
 <translation id="4572659312570518089">Authentication cancelled while connecting to "<ph name="DEVICE_NAME" />".</translation>
@@ -2603,11 +2661,13 @@
 <translation id="4582447636905308869">New Korean IME, which is based on Google Input Tools' HMM engine.</translation>
 <translation id="4582563038311694664">Reset all settings</translation>
 <translation id="4583537898417244378">Invalid or corrupt file.</translation>
+<translation id="4585793705637313973">Edit page</translation>
 <translation id="4589268276914962177">New terminal</translation>
 <translation id="4590324241397107707">Database Storage</translation>
 <translation id="4593021220803146968">&amp;Go to <ph name="URL" /></translation>
 <translation id="4594109696316595112">One-time activation: Type your password to activate Smart Lock on this <ph name="DEVICE_TYPE" />. With Smart Lock, your phone will unlock this device – without a password. To change or turn off this feature, visit your <ph name="DEVICE_TYPE" />'s settings.</translation>
 <translation id="4595560905247879544">Apps and extensions can only be modified by the manager (<ph name="CUSTODIAN_NAME" />).</translation>
+<translation id="4596295440756783523">You have certificates on file that identify these servers</translation>
 <translation id="4598556348158889687">Storage management</translation>
 <translation id="4601242977939794209">EMF Convertor</translation>
 <translation id="4602466770786743961">Always allow <ph name="HOST" /> to access your camera and microphone</translation>
@@ -2673,6 +2733,7 @@
 <translation id="4697551882387947560">When the browsing session ends</translation>
 <translation id="4699172675775169585">Cached images and files</translation>
 <translation id="4699357559218762027">(auto-launched)</translation>
+<translation id="4704677965327178154">Do not allow any site to use a plug-in to access your computer.</translation>
 <translation id="4707302005824653064">Usage and history can be reviewed by the manager (<ph name="CUSTODIAN_EMAIL" />) on chrome.com.</translation>
 <translation id="4707579418881001319">L2TP/IPsec + user certificate</translation>
 <translation id="4707934200082538898">Please check your email at <ph name="BEGIN_BOLD" /><ph name="MANAGER_EMAIL" /><ph name="END_BOLD" /> for further instructions.</translation>
@@ -2710,6 +2771,7 @@
 <translation id="4744574733485822359">Your download has completed</translation>
 <translation id="4746971725921104503">Looks like you're already managing a user by that name. Did you want to <ph name="LINK_START" />import <ph name="USER_DISPLAY_NAME" /> to this device<ph name="LINK_END" />?</translation>
 <translation id="4747271164117300400">Macedonian</translation>
+<translation id="4748762018725435655">Requires extension from the Chrome Web Store</translation>
 <translation id="4749157430980974800">Georgian keyboard</translation>
 <translation id="4750394297954878236">Suggestions</translation>
 <translation id="475088594373173692">First user</translation>
@@ -2723,6 +2785,7 @@
 <translation id="4763830802490665879">Cookies from multiple sites will be cleared on exit.</translation>
 <translation id="4764029864566166446">Update plug-in...</translation>
 <translation id="4764865176798926079">Main frame's domContentLoaded and all resources loads started before domContentLoaded (iframes ignored).</translation>
+<translation id="4768332406694066911">You have certificates from these organisations that identify you</translation>
 <translation id="4768698601728450387">Crop image</translation>
 <translation id="4773696473262035477">You can access it and all your <ph name="SAVED_PASSWORDS_LINK" /> from any browser.</translation>
 <translation id="4776917500594043016">Password for <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -2740,10 +2803,12 @@
 <translation id="4793866834012505469">Retrain voice model</translation>
 <translation id="479536056609751218">Web Page, HTML Only</translation>
 <translation id="479989351350248267">search</translation>
+<translation id="480036413855787547">Access your passwords from any device at <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />. On Mac, passwords may be saved to your Keychain and accessed or synced by other Chrome users sharing this OS X account.</translation>
 <translation id="4801257000660565496">Create Application Shortcuts</translation>
 <translation id="4801448226354548035">Hide accounts</translation>
 <translation id="4801512016965057443">Allow mobile data roaming</translation>
 <translation id="4801956050125744859">Keep both</translation>
+<translation id="4803121606678474433">Enable 2D canvas dynamic rendering mode switching.</translation>
 <translation id="4803909571878637176">Uninstalling</translation>
 <translation id="4804331037112292643">File Open/Save Dialogue</translation>
 <translation id="4804818685124855865">Disconnect</translation>
@@ -2762,6 +2827,7 @@
 <translation id="4824518112777153488">Support for hover capable touchscreens</translation>
 <translation id="4827948050554950725">Add credit card</translation>
 <translation id="4828493911650550108">Improve location accuracy by allowing apps and services to scan for Wi-Fi networks and Bluetooth devices.</translation>
+<translation id="4828937774870308359">Australian</translation>
 <translation id="4830573902900904548">Your <ph name="DEVICE_TYPE" /> is unable to connect to the Internet using <ph name="NETWORK_NAME" />. Please choose another network. <ph name="LEARN_MORE_LINK_START" />Find out more<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">The identity of <ph name="ORGANIZATION" /> at <ph name="LOCALITY" /> has been verified by <ph name="ISSUER" />. Valid Certificate Transparency information was supplied by the server.</translation>
 <translation id="4834912470034578916">Enable customised layouts for Web Notifications.</translation>
@@ -2780,6 +2846,7 @@
 <translation id="4849517651082200438">Don't Install</translation>
 <translation id="4850258771229959924">View in Developer Tools</translation>
 <translation id="4850458635498951714">Add a device</translation>
+<translation id="4850669014075537160">Scrolling</translation>
 <translation id="4850886885716139402">View</translation>
 <translation id="4853020600495124913">Open in &amp;new window</translation>
 <translation id="485316830061041779">German</translation>
@@ -2827,6 +2894,7 @@
 <translation id="4903369323166982260">Run Chrome Clean-Up Tool</translation>
 <translation id="4906679076183257864">Reset to Default</translation>
 <translation id="4907125798206348918">Weak MemoryCache.</translation>
+<translation id="4907306957610201395">Permission Category</translation>
 <translation id="49088176676474409">Hide VPD values.</translation>
 <translation id="4910021444507283344">WebGL</translation>
 <translation id="4910673011243110136">Private networks</translation>
@@ -2853,6 +2921,7 @@
 <translation id="4938972461544498524">Touchpad settings</translation>
 <translation id="4940047036413029306">Quote</translation>
 <translation id="4941246025622441835">Use this device requisition when enrolling the device for enterprise management:</translation>
+<translation id="4941627891654116707">Font size</translation>
 <translation id="4942394808693235155">Check for and apply updates</translation>
 <translation id="494286511941020793">Proxy Configuration Help</translation>
 <translation id="4950138595962845479">Options...</translation>
@@ -2863,6 +2932,7 @@
 <translation id="4956847150856741762">1</translation>
 <translation id="495931528404527476">In Chrome</translation>
 <translation id="496226124210045887">The folder that you selected contains sensitive files. Are you sure that you want to grant "$1" permanent read access to this folder?</translation>
+<translation id="4964455510556214366">Arrangement</translation>
 <translation id="4964673849688379040">Checking...</translation>
 <translation id="4966802378343010715">Create a new user</translation>
 <translation id="4967749818080339523">Select an account</translation>
@@ -2987,6 +3057,7 @@
 <translation id="5144820558584035333">Hangul 3 Set (390)</translation>
 <translation id="5145331109270917438">Date modified</translation>
 <translation id="5146631943508592569">Disable Device End of Life notification.</translation>
+<translation id="5147113189823897615">Because this account is managed by <ph name="DOMAIN" />, your bookmarks, history, passwords and other settings will be cleared from this device. However, your data will remain stored in your Google Account.</translation>
 <translation id="5147237161038757796">Physical keyboard auto-correct</translation>
 <translation id="5148320352496581610">Rect-based targeting uses a heuristic to determine the most probable target of a gesture, where the touch region is represented by a rectangle.</translation>
 <translation id="5150254825601720210">Netscape Certificate SSL Server Name</translation>
@@ -3023,6 +3094,7 @@
 <translation id="5181140330217080051">Downloading</translation>
 <translation id="5182671122927417841">Disable extension</translation>
 <translation id="5184063094292164363">&amp;JavaScript Console</translation>
+<translation id="5184662919967270437">Updating your device</translation>
 <translation id="5185386675596372454">The newest version of "<ph name="EXTENSION_NAME" />" has been disabled because it requires more permissions.</translation>
 <translation id="5185403602014064051">This feature allows you to access quickly any signed-in user without requiring a password.</translation>
 <translation id="5186650237607254032">Update your phone's screen lock so that it turns off when you're nearby. You'll unlock the phone faster and enjoy a better Smart Lock experience on your <ph name="DEVICE_TYPE" />.</translation>
@@ -3034,6 +3106,7 @@
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5197680270886368025">Sync complete.</translation>
 <translation id="5204967432542742771">Enter password</translation>
+<translation id="5206215183583316675">Delete "<ph name="CERTIFICATE_NAME" />"?</translation>
 <translation id="520621735928254154">Certificate import error</translation>
 <translation id="5208988882104884956">Halfwidth</translation>
 <translation id="5209320130288484488">No devices found</translation>
@@ -3051,6 +3124,7 @@
 <translation id="5227808808023563348">Find previous text</translation>
 <translation id="5228076606934445476">Something is wrong with the device. To recover from this error you will need to reboot the device and try again.</translation>
 <translation id="5228962187251412618">Online check only</translation>
+<translation id="5229189185761556138">Manage input methods</translation>
 <translation id="5229622432348746578">Disable Audio For Desktop Sharing</translation>
 <translation id="5230516054153933099">Window</translation>
 <translation id="5232178406098309195">When you use audio activation commands, such as "OK Google" or touching a microphone icon, your private Voice &amp; Audio Activity stores some voice and other audio to your account. A recording of the following speech/audio, plus a few seconds before, will be stored.</translation>
@@ -3230,7 +3304,6 @@
 <translation id="5439568486246921931">This action will permanently delete this user’s downloads, offline files and browsing data. This cannot be undone.</translation>
 <translation id="544083962418256601">Create shortcuts...</translation>
 <translation id="5441100684135434593">Wired network</translation>
-<translation id="5445088910157062298">Let Google’s location service help apps find your location quickly and accurately, which can reduce battery consumption. Anonymous location data will be sent to Google, even when no apps are running.</translation>
 <translation id="5448293924669608770">Oops, something went wrong with signing in</translation>
 <translation id="5449588825071916739">Bookmark All Tabs</translation>
 <translation id="5449716055534515760">Close Win&amp;dow</translation>
@@ -3393,6 +3466,7 @@
 <translation id="5675224880872496917">Animate smoothly when scrolling page content.</translation>
 <translation id="5676267133227121599">Access your passwords from any device at <ph name="MANAGEMENT_LINK" />.</translation>
 <translation id="5677503058916217575">Page language:</translation>
+<translation id="5677850799565527075">Block third-party cookies.</translation>
 <translation id="5677928146339483299">Blocked</translation>
 <translation id="5678550637669481956">Read and write access to <ph name="VOLUME_NAME" /> has been granted.</translation>
 <translation id="567881659373499783">Version <ph name="PRODUCT_VERSION" /></translation>
@@ -3422,6 +3496,7 @@
 <translation id="5711983031544731014">Unable to unlock. Enter your password.</translation>
 <translation id="5712966208980506909">If enabled, the chrome://md-policy URL loads the Material Design policy page.</translation>
 <translation id="5715711091495208045">Plug-in Broker: <ph name="PLUGIN_NAME" /></translation>
+<translation id="5719603411793408026">Default search engines</translation>
 <translation id="572328651809341494">Recent tabs</translation>
 <translation id="5723508132121499792">No background apps running</translation>
 <translation id="5725124651280963564">Please sign in to <ph name="TOKEN_NAME" /> to generate a key for <ph name="HOST_NAME" />.</translation>
@@ -3429,14 +3504,18 @@
 <translation id="572525680133754531">Renders a border around composited Render Layers to help debug and study layer compositing.</translation>
 <translation id="5726521882516480114">Enables the use of the GPU to perform 2d canvas rendering instead of using software rendering.</translation>
 <translation id="5727728807527375859">Extensions, apps and themes can harm your computer. Are you sure that you want to continue?</translation>
+<translation id="5727970983344022445">Do not allow any site to use key generation in forms</translation>
 <translation id="5729712731028706266">&amp;View</translation>
 <translation id="5729996640881880439">Sorry, we can't show the code for this error.</translation>
 <translation id="5731247495086897348">Pa&amp;ste and Go</translation>
 <translation id="5731751937436428514">Vietnamese input method (VIQR)</translation>
 <translation id="5732790216998904518">Office Editing for Docs, Sheets &amp; Slides for testing purposes.</translation>
 <translation id="5734362860645681824">Communications</translation>
+<translation id="5739458112391494395">Very large</translation>
+<translation id="5740331643563157105"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" />, and <ph name="NUM_ADDITIONAL_LANGUAGES" /> others</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: select to edit</translation>
 <translation id="5741454054957165976">Enable new version of User Agent Intervention for WebFonts loading.</translation>
+<translation id="5742598604154146709">Do not allow any site to download multiple files automatically.</translation>
 <translation id="574392208103952083">Medium</translation>
 <translation id="5744368829843057748">Translate 2016Q2 UI</translation>
 <translation id="5745056705311424885">USB memory stick detected</translation>
@@ -3620,6 +3699,7 @@
 <translation id="5996258716334177896">Your profile could not be opened correctly.
 
 Some features may be unavailable.  Please check that the profile exists and you have permission to read and write its contents.</translation>
+<translation id="6001799583597751002">PIN's don't match:</translation>
 <translation id="6003177993629630467"><ph name="PRODUCT_NAME" /> may not be able to keep itself updated.</translation>
 <translation id="6003294706906016758">Enables the web app style frame for hosted apps</translation>
 <translation id="600424552813877586">Invalid application.</translation>
@@ -3645,6 +3725,7 @@
 <translation id="604001903249547235">Cloud backup</translation>
 <translation id="6040143037577758943">Close</translation>
 <translation id="604124094241169006">Automatic</translation>
+<translation id="6041935588605837913">10</translation>
 <translation id="6042308850641462728">More</translation>
 <translation id="604257181445267932">Smart Lock helps you quickly sign in to apps and sites using passwords you have saved with Google.</translation>
 <translation id="6043317578411397101"><ph name="APP_NAME" /> is sharing a Chrome tab with <ph name="TAB_NAME" />.</translation>
@@ -3664,6 +3745,7 @@
 <translation id="6062697480277116433">You are using mobile data</translation>
 <translation id="6065289257230303064">Certificate Subject Directory Attributes</translation>
 <translation id="6071181508177083058">confirm password</translation>
+<translation id="6073903501322152803">Add accessibility features</translation>
 <translation id="6074825444536523002">Google form</translation>
 <translation id="6075731018162044558">Oops! The system failed to attain a long-term API access token for this device.</translation>
 <translation id="6075880972317537864">Attackers on <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> might try to trick you to steal your information (for example, passwords, messages or credit cards).</translation>
@@ -3698,7 +3780,6 @@
 <translation id="6110466548232134880">The identity of <ph name="ORGANIZATION" /> at <ph name="LOCALITY" /> has been verified by <ph name="ISSUER" />. No Certificate Transparency information was supplied by the server.</translation>
 <translation id="6111770213269631447">Transliteration (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Allowed by default</translation>
-<translation id="6112929985131461002">This device will automatically send diagnostic and usage data to Google. This <ph name="BEGIN_LINK1" />setting<ph name="END_LINK1" /> is enforced by your administrator. <ph name="BEGIN_LINK2" />Find Out More<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Change language and input settings</translation>
 <translation id="6120205520491252677">Pin this page to Start screen...</translation>
 <translation id="6122081475643980456">Your Internet connection is being controlled</translation>
@@ -3720,8 +3801,10 @@
 <translation id="6143186082490678276">Get Help</translation>
 <translation id="6144697279259829572">{NUM_ITEMS,plural, =1{This will permanently delete at least $1 item from this device.}other{This will permanently delete at least $1 items from this device.}}</translation>
 <translation id="6144890426075165477"><ph name="PRODUCT_NAME" /> is not currently your default browser.</translation>
+<translation id="6145860855437952742">Maximum number of preview windows in overview mode that can use masks to hide window headers and use rounded corners.</translation>
 <translation id="6147020289383635445">Print preview failed.</translation>
 <translation id="614998064310228828">Device model:</translation>
+<translation id="6150555451039504280">Shrink/expand</translation>
 <translation id="6150853954427645995">To save this file for offline use, get back online, right-click the file and select the <ph name="OFFLINE_CHECKBOX_NAME" /> option.</translation>
 <translation id="6151323131516309312">Press <ph name="SEARCH_KEY" /> to search <ph name="SITE_NAME" /></translation>
 <translation id="6154697846084421647">Currently signed in</translation>
@@ -3819,6 +3902,7 @@
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{New printer on your network}other{New printers on your network}}</translation>
 <translation id="6285395082104474418">The status tray shows you the current state of your network, battery and more.</translation>
 <translation id="6286684120317096255">Data use is being measured</translation>
+<translation id="6286708577777130801">Saved password details</translation>
 <translation id="6287852322318138013">Select an app to open this file</translation>
 <translation id="6288919040208869552">If proxy is configured, it usually prevents from authorisation on different captive portals. This enables opening captive portal authorisation dialogue in a separate window, which ignores proxy settings.</translation>
 <translation id="6290556621549272952">You can use this feature to display content from Chromium on your TV or other devices.</translation>
@@ -3860,6 +3944,7 @@
 <translation id="6353618411602605519">Croatian keyboard</translation>
 <translation id="6356936121715252359">Adobe Flash Player storage settings...</translation>
 <translation id="6357619544108132570">Welcome to the <ph name="SHORT_PRODUCT_NAME" /> family. This is no ordinary computer.</translation>
+<translation id="63617602971594377">Enable the API for payments on the web</translation>
 <translation id="6361850914223837199">Error details:</translation>
 <translation id="6362853299801475928">&amp;Report an issue...</translation>
 <translation id="636343209757971102">IPv6 address:</translation>
@@ -3895,6 +3980,7 @@
 <translation id="6410063390789552572">Can't access network library</translation>
 <translation id="6410257289063177456">Image Files</translation>
 <translation id="6410328738210026208">Change channel and Powerwash</translation>
+<translation id="6410668567036790476">Add search engine</translation>
 <translation id="641105183165925463">$1 MB</translation>
 <translation id="6412931879992742813">New incognito window</translation>
 <translation id="6418160186546245112">Reverting to the previously installed version of <ph name="IDS_SHORT_PRODUCT_NAME" /></translation>
@@ -3927,14 +4013,15 @@
 <translation id="6443783728907198276">When enabled, Stun messages generated by WebRTC will contain the Origin header.</translation>
 <translation id="6444070574980481588">Set date and time</translation>
 <translation id="6445450263907939268">If you didn't want these changes, you can restore your previous settings.</translation>
+<translation id="6447388538018752757">Enables dynamic graphics rendering pipeline switching in the 2D canvas to optimise performance based on the types of draw operations being invoked.</translation>
 <translation id="6447842834002726250">Cookies</translation>
 <translation id="6449285849137521213">The app "<ph name="EXTENSION_NAME" />" has been added.</translation>
 <translation id="6450876761651513209">Change your privacy-related settings</translation>
+<translation id="6451180435462401570">Manage Cloud Print devices</translation>
 <translation id="6451650035642342749">Clear auto-opening settings</translation>
 <translation id="6452181791372256707">Reject</translation>
 <translation id="6454421252317455908">Chinese input method (quick)</translation>
 <translation id="6455348477571378046">Certificate Type</translation>
-<translation id="6456234919706689841">Your administrator may choose to send diagnostic and usage data for this device to Google. You may view this <ph name="BEGIN_LINK1" />setting<ph name="END_LINK1" /> here. <ph name="BEGIN_LINK2" />Find Out More<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Continue blocking JavaScript</translation>
 <translation id="6458308652667395253">Manage JavaScript blocking...</translation>
 <translation id="6459488832681039634">Use Selection for Find</translation>
@@ -3988,10 +4075,12 @@
 <translation id="6526654154229718724">An experimental full screen with keyboard lock mode requiring users to hold Esc to exit.</translation>
 <translation id="6527303717912515753">Share</translation>
 <translation id="6528546217685656218">The private key for this client certificate is missing or invalid.</translation>
+<translation id="652948702951888897">Chrome history</translation>
 <translation id="653019979737152879">Syncing <ph name="FILE_NAME" />...</translation>
 <translation id="6534583978616527129">Initialise the connection</translation>
 <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Note:<ph name="END_BOLD" /> Only enable if you know what you are doing or if you have been asked to do so, as collection of data may reduce performance.</translation>
 <translation id="654233263479157500">Use a web service to help resolve navigation errors</translation>
+<translation id="6545665334409411530">Repeat rate</translation>
 <translation id="6545834809683560467">Use a prediction service to help complete searches and URLs typed in the address bar or the app launcher search box</translation>
 <translation id="6546686722964485737">Join WiMAX network</translation>
 <translation id="6547316139431024316">Don't warn again for this extension</translation>
@@ -4062,9 +4151,11 @@
 <translation id="6643016212128521049">Clear</translation>
 <translation id="6644756108386233011">Reset altered <ph name="IDS_SHORT_PRODUCT_NAME" /> settings?</translation>
 <translation id="6647228709620733774">Netscape Certification Authority Revocation URL</translation>
+<translation id="6647838571840953560">Currently on <ph name="CHANNEL_NAME" /></translation>
 <translation id="6649018507441623493">Just a sec...</translation>
 <translation id="6649068951642910388">The session restore UI will be shown in a bubble instead of an info bar.</translation>
 <translation id="665061930738760572">Open in &amp;New Window</translation>
+<translation id="6651237644330755633">Trust this certificate for identifying websites</translation>
 <translation id="6652975592920847366">Create OS Recovery Media</translation>
 <translation id="6653525630739667879">Cannot save to £1. All edits will be saved to £2 in the Downloads folder.</translation>
 <translation id="6655190889273724601">Developer mode</translation>
@@ -4119,6 +4210,7 @@
 <translation id="6725970970008349185">Number of candidates to be displayed per page</translation>
 <translation id="672609503628871915">See what's new</translation>
 <translation id="6727005317916125192">Previous pane</translation>
+<translation id="6727842159866499206">Maximum number of preview windows in overview mode that can use shapes to hide window headers.</translation>
 <translation id="6731320427842222405">This may take a few minutes</translation>
 <translation id="6731638353631257659">V8 caching mode.</translation>
 <translation id="6732586201820838268">Couldn’t establish a connection with your phone. Make sure that you’re using a compatible Android phone that is turned on and within arm’s reach. &lt;a&gt;Learn more&lt;/a&gt;</translation>
@@ -4144,6 +4236,7 @@
 <translation id="6769712124046837540">Adding printer...</translation>
 <translation id="6771503742377376720">Is a Certification Authority</translation>
 <translation id="6773575010135450071">More actions...</translation>
+<translation id="677965093459947883">Very small</translation>
 <translation id="6780439250949340171">manage other settings</translation>
 <translation id="6786747875388722282">Extensions</translation>
 <translation id="6787839852456839824">Keyboard shortcuts</translation>
@@ -4167,6 +4260,7 @@
 <translation id="6815353853907306610"><ph name="IDS_SHORT_PRODUCT_NAME" /> detected that your browser settings may have been changed without your knowledge. Would you like to reset them to their original defaults?</translation>
 <translation id="6815551780062710681">edit</translation>
 <translation id="6817358880000653228">Saved passwords for this site:</translation>
+<translation id="6820008762872335722">Reset to ask</translation>
 <translation id="6820687829547641339">Gzip compressed tar archive</translation>
 <translation id="682123305478866682">Cast desktop</translation>
 <translation id="6823506025919456619">You need to sign in to Chrome to see your devices</translation>
@@ -4186,7 +4280,9 @@
 <translation id="6833901631330113163">South European</translation>
 <translation id="683526731807555621">Add a new search engine</translation>
 <translation id="6835762382653651563">Please connect to the Internet to update your <ph name="DEVICE_TYPE" />.</translation>
+<translation id="6839158130869314728">Mirror displays</translation>
 <translation id="6839225236531462745">Certificate Deletion Error</translation>
+<translation id="6840155290835956714">Ask before sending</translation>
 <translation id="6840184929775541289">Is not a Certification Authority</translation>
 <translation id="6840313690797192085">$1 PB</translation>
 <translation id="6841186874966388268">Errors</translation>
@@ -4196,6 +4292,7 @@
 <translation id="6847758263950452722">Save Page as MHTML</translation>
 <translation id="6853388645642883916">Updater sleeping</translation>
 <translation id="68541483639528434">Close other tabs</translation>
+<translation id="6855099371444560844">Add a Device</translation>
 <translation id="6856701878604560493">Enable offline bookmarks</translation>
 <translation id="6860097299815761905">Proxy settings...</translation>
 <translation id="6860427144121307915">Open in a Tab</translation>
@@ -4277,11 +4374,13 @@
 <translation id="6980956047710795611">Migrate all Chrome OS data to the new password
 (requires previous password)</translation>
 <translation id="6981982820502123353">Accessibility</translation>
+<translation id="6981992744085917617">Choose the method you would like to use to log back in to your account:</translation>
 <translation id="6982896539684144327">Printer from <ph name="VENDOR_NAME" /> detected</translation>
 <translation id="6983783921975806247">Registered OID</translation>
 <translation id="6983991971286645866">All edits will be saved to $1.</translation>
 <translation id="6985235333261347343">Microsoft Key Recovery Agent</translation>
 <translation id="6985276906761169321">ID:</translation>
+<translation id="6985607387932385770">Printers</translation>
 <translation id="6986605181115043220">Oops, Sync has stopped working. <ph name="BEGIN_LINK" />Learn More<ph name="END_LINK" /></translation>
 <translation id="6989294135336900804">No synced tabs</translation>
 <translation id="6990081529015358884">You have run out of space</translation>
@@ -4304,6 +4403,7 @@
 <translation id="7006844981395428048">$1 audio</translation>
 <translation id="7008270479623533562">In order to run this extension, you need to refresh the page. You can run this extension automatically on this site by right-clicking on the extension icon.</translation>
 <translation id="7009045250432250765">Single-click auto-fill</translation>
+<translation id="7009420427128923703">Maximum number of windows in overview that can use masks.</translation>
 <translation id="7010160495478792664">Hardware-accelerated video decode where available.</translation>
 <translation id="7010400591230614821">Aggressive tab release strategy</translation>
 <translation id="701080569351381435">View Source</translation>
@@ -4349,6 +4449,7 @@
 <translation id="7061692898138851896">Save passwords automatically</translation>
 <translation id="7062222374113411376">Allow recently closed sites to finish sending and receiving data (recommended)</translation>
 <translation id="7063129466199351735">Processing shortcuts...</translation>
+<translation id="7063957500469387217">Set up or manage printers in Google Cloud Print.</translation>
 <translation id="7065223852455347715">This device is locked in a mode that prevents enterprise enrolment.  If you want to enrol the device you need to go through device recovery first.</translation>
 <translation id="7065534935986314333">About System</translation>
 <translation id="7066944511817949584">Failed to connect to "<ph name="DEVICE_NAME" />".</translation>
@@ -4411,6 +4512,7 @@
 <translation id="715118844758971915">Classic printers</translation>
 <translation id="7154130902455071009">Change your start page to: <ph name="START_PAGE" /></translation>
 <translation id="715487527529576698">Initial Chinese mode is Simplified Chinese</translation>
+<translation id="7155171745945906037">Existing photo from camera or file</translation>
 <translation id="715568033737470079">Specify the PPAPI plug-ins which will be run within the Win32k lockdown sandbox policy (Windows 10 and above only).</translation>
 <translation id="7156235233373189579">This file is designed for a PC using Windows software. This is not compatible with your device which runs Chrome OS. Please search the <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> for a suitable replacement app.<ph name="BEGIN_LINK_HELP" />Learn More<ph name="END_LINK_HELP" /></translation>
 <translation id="7157063064925785854">By clicking Continue you agree to the <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> and <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation>
@@ -4427,6 +4529,7 @@
 <translation id="7175353351958621980">Loaded from:</translation>
 <translation id="7180611975245234373">Refresh</translation>
 <translation id="7180865173735832675">Customise</translation>
+<translation id="7185078796915954712">TLS 1.3</translation>
 <translation id="7185690883425432021">Hides the close buttons of inactive tabs when the tabstrip is in stacked mode.</translation>
 <translation id="7186088072322679094">Keep in Toolbar</translation>
 <translation id="719009910964971313">US Programmer Dvorak keyboard</translation>
@@ -4466,6 +4569,8 @@
 <translation id="7240120331469437312">Certificate Subject Alternative Name</translation>
 <translation id="7241389281993241388">Please sign in to <ph name="TOKEN_NAME" /> to import the client certificate.</translation>
 <translation id="7243055093079293866">Say "OK Google" in a new tab and google.com</translation>
+<translation id="7243632151880336635">Clear and Sign Out</translation>
+<translation id="7245628041916450754"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Best)</translation>
 <translation id="724691107663265825">The site ahead contains malware</translation>
 <translation id="725109152065019550">Sorry, your administrator has disabled external storage on your account.</translation>
 <translation id="7252661675567922360">Don't load</translation>
@@ -4479,7 +4584,9 @@
 <translation id="7262004276116528033">This sign-in service is hosted by <ph name="SAML_DOMAIN" /></translation>
 <translation id="7262221505565121">Unsandboxed plug-in access exceptions</translation>
 <translation id="7264275118036872269">Failed to start Bluetooth device discovery.</translation>
+<translation id="7264454014834869122">Choose from the Chrome Web Store</translation>
 <translation id="726502072182862130">Google profile name and icon</translation>
+<translation id="7267186368513450821">5</translation>
 <translation id="7268365133021434339">Close Tabs</translation>
 <translation id="7268659760406822741">Available services</translation>
 <translation id="7273110280511444812">last attached on <ph name="DATE" /></translation>
@@ -4496,6 +4603,7 @@
 <translation id="7287143125007575591">Access denied</translation>
 <translation id="7288592446024861651">Your bookmarks, history, passwords and other settings will be synced to your Google Account so that you can use them on all your devices. Control what to sync in <ph name="BEGIN_LINK" /></translation>
 <translation id="7288676996127329262"><ph name="HORIZONTAL_DPI" />x<ph name="VERTICAL_DPI" /> dpi</translation>
+<translation id="7289225569524511578">Open the wallpaper app</translation>
 <translation id="7290242001003353852">This sign-in service, hosted by <ph name="SAML_DOMAIN" />, is accessing your camera.</translation>
 <translation id="7290594223351252791">Confirm registration</translation>
 <translation id="7295019613773647480">Enable supervised users</translation>
@@ -4534,6 +4642,7 @@
 <translation id="7347751611463936647">To use this extension, type "<ph name="EXTENSION_KEYWORD" />", then TAB, then your command or search.</translation>
 <translation id="7348093485538360975">On-Screen Keyboard</translation>
 <translation id="7348749398828259943">US Workman international keyboard</translation>
+<translation id="7352495173098919663">Edit</translation>
 <translation id="7352651011704765696">Something went wrong</translation>
 <translation id="7353651168734309780"><ph name="EXTENSION_NAME" /> requires new permissions</translation>
 <translation id="7361039089383199231">$1 bytes</translation>
@@ -4645,6 +4754,7 @@
 <translation id="749028671485790643">Person <ph name="VALUE" /></translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7493386493263658176"><ph name="EXTENSION_NAME" /> extension may collect all the text you type, including personal data like passwords and credit card numbers. Do you want to use this extension?</translation>
+<translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="7495424355577885780">If enabled, reporting an issue will load the Material Design feedback UI.</translation>
 <translation id="7495778526395737099">Forgot your old password?</translation>
 <translation id="7503191893372251637">Netscape Certificate Type</translation>
@@ -4716,7 +4826,6 @@
 <translation id="7587108133605326224">Baltic</translation>
 <translation id="7589461650300748890">Whoa, there. Be careful.</translation>
 <translation id="7589661784326793847">Wait just a sec</translation>
-<translation id="7593635197364225277">Automatically back up and restore Play app data to Google Drive. You can change this in Android Settings at any time. <ph name="BEGIN_LINK1" />Find out More<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (error code <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Ok, import</translation>
 <translation id="7600965453749440009">Never translate <ph name="LANGUAGE" /></translation>
@@ -4762,6 +4871,7 @@
 <translation id="7654941827281939388">This account is already being used on this computer.</translation>
 <translation id="7658239707568436148">Cancel</translation>
 <translation id="7659584679870740384">You are not authorised to use this device. Please contact the administrator for sign-in permission.</translation>
+<translation id="7661259717474717992">Allow sites to save and read cookie data</translation>
 <translation id="7663719505383602579">Receiver: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7664620655576155379">Unsupported Bluetooth device: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="7665369617277396874">Add account</translation>
@@ -4791,6 +4901,7 @@
 <translation id="7709152031285164251">Failed - <ph name="INTERRUPT_REASON" /></translation>
 <translation id="7709980197120276510">By clicking Continue you agree to the <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" />, <ph name="LEGAL_DOC_LINK_TEXT_4" /> and <ph name="LEGAL_DOC_LINK_TEXT_5" />.</translation>
 <translation id="7712140766624186755">Ask by policy</translation>
+<translation id="7712196439824268605">This PIN is easy to guess:</translation>
 <translation id="7713320380037170544">Allow all sites to use system exclusive messages to access MIDI devices</translation>
 <translation id="7714464543167945231">Certificate</translation>
 <translation id="7716020873543636594">Automatically click when the mouse pointer stops</translation>
@@ -4798,6 +4909,8 @@
 <translation id="7716781361494605745">Netscape Certification Authority Policy URL</translation>
 <translation id="7716970641886237992">Modified By</translation>
 <translation id="7717014941119698257">Downloading: <ph name="STATUS" /></translation>
+<translation id="7717845620320228976">Check for updates</translation>
+<translation id="7719367874908701697">Page zoom</translation>
 <translation id="7719421816612904796">Training timed out</translation>
 <translation id="771953673318695590">QA</translation>
 <translation id="7720375555307821262">To supervise this person, <ph name="BEGIN_LINK" />sign in to Chrome<ph name="END_LINK" />.</translation>
@@ -4810,6 +4923,7 @@
 <translation id="7742762435724633909">Provider name:</translation>
 <translation id="774465434535803574">Pack Extension Error</translation>
 <translation id="7748528009589593815">Previous tab</translation>
+<translation id="7748734060566306235">Use arrow keys to adjust picture size and alignment.</translation>
 <translation id="7751260505918304024">Show all</translation>
 <translation id="7754704193130578113">Ask where to save each file before downloading</translation>
 <translation id="775622227562445982">Fast tab/window close</translation>
@@ -4846,6 +4960,7 @@
 <translation id="7791543448312431591">Add</translation>
 <translation id="7792012425874949788">Something went wrong with signing in</translation>
 <translation id="7792388396321542707">Stop sharing</translation>
+<translation id="7792744925237334808">Prevent third-party websites from saving and reading cookie data.</translation>
 <translation id="7794058097940213561">Format device</translation>
 <translation id="7799329977874311193">HTML document</translation>
 <translation id="7800518121066352902">Rotate A&amp;nti-clockwise</translation>
@@ -4927,6 +5042,7 @@
 <translation id="7902482560616980555">FontCache scaling</translation>
 <translation id="7903128267494448252">Delete this person</translation>
 <translation id="7903345046358933331">The page has become unresponsive. You can wait for it to become responsive or close it.</translation>
+<translation id="7903742244674067440">You have certificates on file that identify these certificate authorities</translation>
 <translation id="7903925330883316394">Utility: <ph name="UTILITY_TYPE" /></translation>
 <translation id="7903984238293908205">Katakana</translation>
 <translation id="7904094684485781019">The administrator for this account has disallowed multiple sign-in.</translation>
@@ -4974,6 +5090,7 @@
 <translation id="7973320858902175766">Component Patcher</translation>
 <translation id="7974067550340408553">Get notified on your phone every time that Smart Lock unlocks your <ph name="DEVICE_TYPE" />.</translation>
 <translation id="7974566588408714340">Retry using <ph name="EXTENSIONNAME" /></translation>
+<translation id="7974936243149753750">Overscan</translation>
 <translation id="7977551819349545646">Updating Chromebox...</translation>
 <translation id="7978412674231730200">Private key</translation>
 <translation id="7979036127916589816">Sync Error</translation>
@@ -5040,9 +5157,11 @@
 <translation id="8054563304616131773">Please enter a valid email address</translation>
 <translation id="8054921503121346576">USB keyboard connected</translation>
 <translation id="8056430285089645882">Got it, don't show me this again.</translation>
+<translation id="8058655154417507695">Expiry year</translation>
 <translation id="8059178146866384858">The file named "$1" already exists. Please choose a different name.</translation>
 <translation id="8059417245945632445">&amp;Inspect devices</translation>
 <translation id="8061298200659260393">Do not allow any sites to send push messages</translation>
+<translation id="8061820249063924643">Manage supervised users</translation>
 <translation id="8063235345342641131">Default green avatar</translation>
 <translation id="8064671687106936412">Key:</translation>
 <translation id="806705617346045388">Unusual Behaviour Detected</translation>
@@ -5050,7 +5169,9 @@
 <translation id="8069615408251337349">Google Cloud Print</translation>
 <translation id="8071942001314758122">Just say "OK Google" three times</translation>
 <translation id="8072988827236813198">Pin Tabs</translation>
+<translation id="8074127646604999664">Allow recently closed sites to finish sending and receiving data</translation>
 <translation id="8079530767338315840">Repeat</translation>
+<translation id="8081705606384362428">Choose your PIN:</translation>
 <translation id="8083739373364455075">Get 100 GB free with Google Drive</translation>
 <translation id="8088137642766812908">Careful, this feature may bite</translation>
 <translation id="8089520772729574115">less than 1 MB</translation>
@@ -5203,6 +5324,7 @@
 <translation id="827097179112817503">Show Home button</translation>
 <translation id="8272443605911821513">Manage your extensions by clicking Extensions in the "More tools" menu.</translation>
 <translation id="8275038454117074363">Import</translation>
+<translation id="827606011343515871">You have no certificates</translation>
 <translation id="8276560076771292512">Empty Cache and Hard Reload</translation>
 <translation id="8279388322240498158">Sorani Kurdish English-based keyboard</translation>
 <translation id="8280151743281770066">Armenian Phonetic</translation>
@@ -5223,7 +5345,6 @@
 <translation id="8300607741108698921">1-minute set-up</translation>
 <translation id="8303650969500425356">Allows javascript to lock the screen orientation.</translation>
 <translation id="8303655282093186569">Pinyin Input Settings</translation>
-<translation id="830424806940379275">Allow extensions to create panel windows that open outside of the browser frame. By default or if disabled, an attempt to open a panel will open a pop-up instead. Panels on desktop OSes are deprecated and will be removed soon.</translation>
 <translation id="8306534594034939679">Enable support for Alternative Services, an experimental HTTP feature.</translation>
 <translation id="8307376264102990850">Charging
 Calculating time until full</translation>
@@ -5248,9 +5369,11 @@
 <translation id="8337399713761067085">You are currently offline.</translation>
 <translation id="8338952601723052325">Developer website</translation>
 <translation id="8339012082103782726">Do not allow sites to access your microphone</translation>
+<translation id="8339059274628563283"><ph name="SITE" /> locally stored data</translation>
 <translation id="8342318071240498787">A file or a directory with the same name already exists.</translation>
 <translation id="834457929814110454">If you understand the risks to your security, you may <ph name="BEGIN_LINK" />visit this site<ph name="END_LINK" /> before the harmful programs have been removed.</translation>
 <translation id="8345553596530559351">If enabled, the chrome://history/ URL loads the Material Design history page.</translation>
+<translation id="8347045947573765315">Allow all sites to use key generation in forms</translation>
 <translation id="8351419472474436977">This extension has taken control of your proxy settings, which means it can change, break or eavesdrop on anything that you do online. If you aren't sure why this change happened, you probably don't want it.</translation>
 <translation id="8352772353338965963">Add an account to multiple sign-in. All signed-in accounts can be accessed without a password, so this feature should only be used with trusted accounts.</translation>
 <translation id="8353683614194668312">It can:</translation>
@@ -5335,15 +5458,20 @@
 <translation id="845627346958584683">Expiry Time</translation>
 <translation id="8456681095658380701">Invalid name</translation>
 <translation id="8457625695411745683">good</translation>
+<translation id="8460336040822756677">If you turn off Smart Lock for <ph name="DEVICE_TYPE" />, you won’t be able to unlock your Chrome devices using your phone. You'll need to type your password.</translation>
+<translation id="84613761564611563">Network configure UI requested, please wait...</translation>
 <translation id="8461914792118322307">Proxy</translation>
 <translation id="8463215747450521436">This supervised user may have been deleted or disabled by the manager. Please contact the manager if you would like to continue signing in as this user.</translation>
 <translation id="8464132254133862871">This user account is not eligible for the service.</translation>
 <translation id="8464505512337106916">Detect and run important plug-in content (recommended)</translation>
+<translation id="8465252176946159372">Not valid</translation>
 <translation id="8466234950814670489">Tar archive</translation>
 <translation id="8467473010914675605">Korean input method</translation>
+<translation id="8468750959626135884">Unlock your <ph name="DEVICE_TYPE" /> with your Android phone.</translation>
 <translation id="8472623782143987204">hardware-backed</translation>
 <translation id="8475313423285172237">Another programme on your computer added an extension that may change the way Chrome works.</translation>
 <translation id="8475647382427415476">Google Drive was unable to sync "<ph name="FILENAME" />" right now. Google Drive will try again later.</translation>
+<translation id="8476195663057048998">Clear &amp; Reset</translation>
 <translation id="8477241577829954800">Superseded</translation>
 <translation id="8477384620836102176">&amp;General</translation>
 <translation id="8480417584335382321">Page zoom:</translation>
@@ -5375,6 +5503,7 @@
 <translation id="8524066305376229396">Persistent Storage:</translation>
 <translation id="8525306231823319788">Full screen</translation>
 <translation id="8528962588711550376">Signing in.</translation>
+<translation id="8532294913309524834">Order languages based on your preference.</translation>
 <translation id="8535005006684281994">Netscape Certificate Renewal URL</translation>
 <translation id="8539727552378197395">No (HttpOnly)</translation>
 <translation id="8543181531796978784">You can <ph name="BEGIN_ERROR_LINK" />report a detection problem<ph name="END_ERROR_LINK" /> or, if you understand the risks to your security, <ph name="BEGIN_LINK" />visit this unsafe site<ph name="END_LINK" />.</translation>
@@ -5389,6 +5518,7 @@
 <translation id="855081842937141170">Pin tab</translation>
 <translation id="8551388862522347954">Licences</translation>
 <translation id="8551494947769799688">Latvian</translation>
+<translation id="8553342806078037065">Manage other people</translation>
 <translation id="855705891482654011">Load unpacked extensions</translation>
 <translation id="855773602626431402">An unsandboxed plug-in was prevented from running on this page.</translation>
 <translation id="8559694214572302298">Image Decoder</translation>
@@ -5466,6 +5596,7 @@
 <translation id="8662978096466608964">Chrome cannot set wallpaper.</translation>
 <translation id="8663099077749055505">Always block multiple automatic downloads on <ph name="HOST" /></translation>
 <translation id="8664389313780386848">&amp;View page source</translation>
+<translation id="866611985033792019">Trust this certificate for identifying email users</translation>
 <translation id="8666678546361132282">English</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> is now full screen and has disabled your mouse cursor.</translation>
 <translation id="8667808506758191620">Your <ph name="DEVICE_TYPE" /> is up to date.</translation>
@@ -5589,6 +5720,7 @@
 <translation id="8813811964357448561">sheet of paper</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="881799181680267069">Hide Others</translation>
+<translation id="8818152010000655963">Wallpaper</translation>
 <translation id="8818152613617627612">Billing details</translation>
 <translation id="8820817407110198400">Bookmarks</translation>
 <translation id="8820961991571528294">Testing</translation>
@@ -5599,8 +5731,10 @@
 <translation id="8828933418460119530">DNS Name</translation>
 <translation id="8830796635868321089">The update check failed using the current proxy settings. Please adjust your <ph name="PROXY_SETTINGS_LINK_START" />proxy settings<ph name="PROXY_SETTINGS_LINK_END" />.</translation>
 <translation id="8831623914872394308">Pointer settings</translation>
+<translation id="8833040047958643283">Control what content websites can show you and what information they can use as you browse</translation>
 <translation id="8837103518490433332">Do you want <ph name="PASSWORD_MANAGER_BRAND" /> to save your password for <ph name="ORIGIN" />?</translation>
 <translation id="8838770651474809439">Hamburger</translation>
+<translation id="8839157109304700852">Opens Google Dashboard</translation>
 <translation id="8841142799574815336">Inert visual viewport.</translation>
 <translation id="884264119367021077">Delivery address</translation>
 <translation id="8845001906332463065">Get help</translation>
@@ -5611,11 +5745,13 @@
 <translation id="885381502874625531">Belarusian keyboard</translation>
 <translation id="8856844195561710094">Failed to stop Bluetooth device discovery.</translation>
 <translation id="885701979325669005">Storage</translation>
+<translation id="8858798938034909167">Access your passwords from any device at <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="8859057652521303089">Select your language:</translation>
 <translation id="8859116917079399781">Content blocked</translation>
 <translation id="8859174528519900719">Subframe: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="8860454412039442620">Excel spreadsheet</translation>
 <translation id="8863489667196658337">Enables the new system for creating bookmark apps.</translation>
+<translation id="8866013684546696613">Maximum number of windows in overview that can use shapes.</translation>
 <translation id="8866441758832353668">Scroll Anchoring</translation>
 <translation id="8868245144144497543">Created By</translation>
 <translation id="8868626022555786497">In use</translation>
@@ -5673,6 +5809,7 @@
 <translation id="894360074127026135">Netscape International Step-Up</translation>
 <translation id="8944779739948852228">Printer detected</translation>
 <translation id="8944964446326379280"><ph name="APP_NAME" /> is sharing a window with <ph name="TAB_NAME" />.</translation>
+<translation id="8946284507644756416">Your <ph name="DEVICE_TYPE" /> can be unlocked with your Android phone.</translation>
 <translation id="8946359700442089734">Debugging features were not completely enabled on this <ph name="IDS_SHORT_PRODUCT_NAME" /> device.</translation>
 <translation id="8946784827990177241">Enable WebUSB support.</translation>
 <translation id="89515141420106838">Enables Chrome Web Store Gallery app for printer drivers. The app searches Chrome Web Store for extensions that support printing to a USB printer with specific USB ID.</translation>
@@ -5750,6 +5887,7 @@
 <translation id="9040185888511745258">Attackers on <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> might attempt to trick you into installing programs that harm your browsing experience (for example, by changing your homepage or showing extra ads on sites that you visit).</translation>
 <translation id="9040421302519041149">Access to this network is protected.</translation>
 <translation id="9041603713188951722">Show settings in a window</translation>
+<translation id="9042893549633094279">Privacy and security</translation>
 <translation id="904451693890288097">Please enter the passkey for "<ph name="DEVICE_NAME" />":</translation>
 <translation id="9049835026521739061">Hangul mode</translation>
 <translation id="9050666287014529139">Passphrase</translation>
@@ -5760,6 +5898,7 @@
 <translation id="9056810968620647706">No matches were found.</translation>
 <translation id="9059868303873565140">Status menu</translation>
 <translation id="9064142312330104323">Google Profile photo (loading)</translation>
+<translation id="9064275926664971810">Enable Autofill to fill out forms in a single click</translation>
 <translation id="9064939804718829769">Transferring...</translation>
 <translation id="9065203028668620118">Edit</translation>
 <translation id="9066075624350113914">Parts of this PDF document could not be displayed.</translation>
@@ -5781,6 +5920,8 @@
 <translation id="9088917181875854783">Please confirm that  this passkey is shown on "<ph name="DEVICE_NAME" />":</translation>
 <translation id="9092426026094675787">Mark non-secure origins as non-secure</translation>
 <translation id="9094033019050270033">Update password</translation>
+<translation id="9094982973264386462">Remove</translation>
+<translation id="9095253524804455615">Remove</translation>
 <translation id="9100765901046053179">Advanced settings</translation>
 <translation id="910077499156148110">Add an exception for a site</translation>
 <translation id="9100825730060086615">Keyboard Type</translation>
@@ -5872,8 +6013,11 @@
 <translation id="9218430445555521422">Set as default</translation>
 <translation id="9219103736887031265">Images</translation>
 <translation id="9220525904950070496">Remove account</translation>
+<translation id="9221503095691269353">Configure quick unlock</translation>
 <translation id="923467487918828349">Show All</translation>
+<translation id="927151012416335806">Updating your device to <ph name="CHANNEL_NAME" /> channel</translation>
 <translation id="930268624053534560">Detailed Timestamps</translation>
+<translation id="931068751149008062">Choose font types and encoding</translation>
 <translation id="932327136139879170">Home</translation>
 <translation id="932508678520956232">Could not initiate printing.</translation>
 <translation id="936801553271523408">System diagnostic data</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 1336e4e..565514d 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1930,6 +1930,7 @@
 <translation id="3590559774363307859">Se guardó la contraseña. Puedes acceder a ella, al igual que a todas tus <ph name="SAVED_PASSWORDS_LINK" />, desde cualquier navegador.</translation>
 <translation id="3590587280253938212">rápido</translation>
 <translation id="3592260987370335752">&amp;Más información</translation>
+<translation id="3592313833691251126">Permite que las extensiones creen ventanas de panel que se abran fuera del marco del navegador. Si esta opción no se habilita, cada vez que se intente abrir un panel, se abrirá una ventana emergente. De forma predeterminada, se permite solo para las extensiones que se incluyen en la lista blanca. Si se habilita la opción, se permitirá para todas las extensiones. Si se inhabilita la opción, no se permitirán paneles para ninguna extensión.</translation>
 <translation id="359283478042092570">Ingresar</translation>
 <translation id="3593152357631900254">Habilitar modo Pinyin aproximado</translation>
 <translation id="3593965109698325041">Restricciones para el nombre del certificado</translation>
@@ -2252,7 +2253,6 @@
 <translation id="4034042927394659004">Disminuir el brillo del teclado</translation>
 <translation id="4035758313003622889">Adminis&amp;trador de &amp;tareas</translation>
 <translation id="4037084878352560732">Caballo</translation>
-<translation id="4037102579141982963">Este dispositivo enviará a Google datos de uso y diagnóstico automáticamente. Puedes cambiar esta opción en cualquier momento en la <ph name="BEGIN_LINK1" />configuración<ph name="END_LINK1" /> de tu dispositivo. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Habilita el alternador de pestañas de accesibilidad para Android.</translation>
 <translation id="4044260751144303020">Composición para elementos de posición fija</translation>
 <translation id="404493185430269859">Motor de búsqueda predeterminado</translation>
@@ -3225,7 +3225,6 @@
 <translation id="5439568486246921931">Esta acción borrará las descargas, los archivos sin conexión y los datos de navegación de este usuario de forma permanente. Esta acción no puede deshacerse.</translation>
 <translation id="544083962418256601">Crear accesos directos...</translation>
 <translation id="5441100684135434593">Red conectada</translation>
-<translation id="5445088910157062298">Permite que el servicio de ubicación de Google ayude a las apps a encontrar tu ubicación de forma rápida y precisa, lo que permite reducir el consumo de la batería. Se enviarán datos de ubicación anónimos a Google, incluso cuando no se ejecuta ninguna app.</translation>
 <translation id="5448293924669608770">Se produjo un error al acceder</translation>
 <translation id="5449588825071916739">Agregar a marcadores todas las pestañas</translation>
 <translation id="5449716055534515760">Cerrar ven&amp;tana</translation>
@@ -3691,7 +3690,6 @@
 <translation id="6110466548232134880"><ph name="ISSUER" /> verificó la identidad de <ph name="ORGANIZATION" /> en <ph name="LOCALITY" />. El servidor no proporcionó ninguna información de transparencia de certificados.</translation>
 <translation id="6111770213269631447">Transliteración (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Permitido de forma predeterminada</translation>
-<translation id="6112929985131461002">Este dispositivo enviará a Google datos de uso y diagnóstico automáticamente. Tu administrador controla esta <ph name="BEGIN_LINK1" />configuración<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Cambiar la configuración de idioma y de entrada de texto</translation>
 <translation id="6120205520491252677">Fijar esta página a la Pantalla de inicio...</translation>
 <translation id="6122081475643980456">Se está controlando tu conexión a Internet</translation>
@@ -3927,7 +3925,6 @@
 <translation id="6452181791372256707">Rechazar</translation>
 <translation id="6454421252317455908">Método de entrada chino (rápido)</translation>
 <translation id="6455348477571378046">Tipo de certificado</translation>
-<translation id="6456234919706689841">Tu administrador puede decidir enviar a Google datos de uso y diagnóstico para este dispositivo. Puedes ver esta <ph name="BEGIN_LINK1" />configuración<ph name="END_LINK1" /> aquí. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Continuar con el bloqueo de JavaScript</translation>
 <translation id="6458308652667395253">Administrar el bloqueo de JavaScript...</translation>
 <translation id="6459488832681039634">Usar la selección para buscar</translation>
@@ -4706,7 +4703,6 @@
 <translation id="7587108133605326224">Báltico</translation>
 <translation id="7589461650300748890">¡Espera! Ten cuidado.</translation>
 <translation id="7589661784326793847">Espera un momento.</translation>
-<translation id="7593635197364225277">Crea una copia de seguridad y restablece los datos de las apps de Play en Google Drive de forma automática. Puedes cambiar esta opción en la configuración de Android en cualquier momento. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (código de error <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">De acuerdo, importar</translation>
 <translation id="7600965453749440009">Nunca traducir <ph name="LANGUAGE" /></translation>
@@ -5212,7 +5208,6 @@
 <translation id="8300607741108698921">Configuración en 1 minuto</translation>
 <translation id="8303650969500425356">Permite que JavaScript bloquee la orientación de la pantalla.</translation>
 <translation id="8303655282093186569">Configuración de entradas en pinyin</translation>
-<translation id="830424806940379275">Permite que las extensiones creen ventanas de panel y las abran fuera del marco del navegador. De manera predeterminada, o si esta política se inhabilita, un intento de abrir un panel abrirá una ventana emergente. Los paneles en sistemas operativos de computadoras de escritorio dejarán de estar disponibles y se quitarán pronto.</translation>
 <translation id="8306534594034939679">Habilita la compatibilidad con Servicios alternativos, una función HTTP experimental.</translation>
 <translation id="8307376264102990850">Calculando el tiempo de carga hasta completarse</translation>
 <translation id="8308179586020895837">Preguntar si <ph name="HOST" /> quiere acceder a la cámara</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 79e4e6bc..795bc0d 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1933,6 +1933,7 @@
 <translation id="3590559774363307859">Contraseña guardada. Puedes acceder a esta y a todas tus <ph name="SAVED_PASSWORDS_LINK" /> desde cualquier navegador.</translation>
 <translation id="3590587280253938212">rápido</translation>
 <translation id="3592260987370335752">&amp;Más información</translation>
+<translation id="3592313833691251126">Permite a las extensiones crear ventanas del panel que se abrirán fuera del marco del navegador. Si esta opción no está habilitada, cada vez que se intente abrir un panel, se abrirá una ventana emergente. Se admitirán solo las extensiones incluidas en la lista blanca de forma predeterminada. Si habilitas esta opción, se permitirán los paneles en todas las extensiones. No obstante, si la inhabilitas, no se admitirán en ninguna extensión.</translation>
 <translation id="359283478042092570">Acceder</translation>
 <translation id="3593152357631900254">Habilitar modo de pinyin difuso</translation>
 <translation id="3593965109698325041">Restricciones de nombres de certificado</translation>
@@ -2254,7 +2255,6 @@
 <translation id="4034042927394659004">Disminuir brillo de teclado</translation>
 <translation id="4035758313003622889">Adminis&amp;trador de tareas</translation>
 <translation id="4037084878352560732">Caballo</translation>
-<translation id="4037102579141982963">Este dispositivo enviará a Google datos de uso y diagnósticos automáticamente. Puedes cambiar esta opción en los <ph name="BEGIN_LINK1" />ajustes<ph name="END_LINK1" /> del dispositivo en cualquier momento. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Habilitar la función de cambio de pestaña de accesibilidad para Android.</translation>
 <translation id="4044260751144303020">Composición para elementos de posición fija</translation>
 <translation id="404493185430269859">Motor de búsqueda predeterminado</translation>
@@ -3224,7 +3224,6 @@
 <translation id="5439568486246921931">Al realizar esta acción, se eliminarán de forma permanente los datos de navegación, los archivos sin conexión y las descargas de este usuario. Esta acción no se puede deshacer.</translation>
 <translation id="544083962418256601">Crear accesos directos...</translation>
 <translation id="5441100684135434593">Red cableada</translation>
-<translation id="5445088910157062298">Permite que el servicio de ubicación de Google ayude a las aplicaciones a encontrar tu ubicación de forma rápida y precisa. De este modo, se puede reducir el consumo de la batería. Los datos de ubicación anónimos se enviarán a Google aunque no se estén ejecutando aplicaciones.</translation>
 <translation id="5448293924669608770">¡Vaya! Se ha producido un error al iniciar sesión</translation>
 <translation id="5449588825071916739">Añadir todas las pestañas a marcadores...</translation>
 <translation id="5449716055534515760">Cerrar &amp;ventana</translation>
@@ -3692,7 +3691,6 @@
 <translation id="6110466548232134880"><ph name="ISSUER" /> ha verificado la identidad de <ph name="ORGANIZATION" /> en <ph name="LOCALITY" />. El servidor no ha proporcionado información de Transparencia de certificados.</translation>
 <translation id="6111770213269631447">Transliteración (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Permitido de forma predeterminada</translation>
-<translation id="6112929985131461002">Este dispositivo enviará a Google datos de uso y diagnósticos automáticamente. Tu administrador aplica esta <ph name="BEGIN_LINK1" />configuración<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Cambiar configuración de idioma y de introducción de texto</translation>
 <translation id="6120205520491252677">Fijar esta página en la pantalla de inicio...</translation>
 <translation id="6122081475643980456">Tu conexión a Internet está siendo controlada</translation>
@@ -3927,7 +3925,6 @@
 <translation id="6452181791372256707">Rechazar</translation>
 <translation id="6454421252317455908">Método de entrada de chino (abreviado)</translation>
 <translation id="6455348477571378046">Tipo de certificado:</translation>
-<translation id="6456234919706689841">Tu administrador puede elegir enviar datos de uso y diagnósticos de este dispositivo a Google. Puedes acceder a la siguiente página para ver esta <ph name="BEGIN_LINK1" />configuración<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Seguir bloqueando JavaScript</translation>
 <translation id="6458308652667395253">Administrar bloqueo de JavaScript...</translation>
 <translation id="6459488832681039634">Usar selección para buscar</translation>
@@ -4706,7 +4703,6 @@
 <translation id="7587108133605326224">Báltico</translation>
 <translation id="7589461650300748890">¡Atención! Ten cuidado.</translation>
 <translation id="7589661784326793847">Espera un segundo</translation>
-<translation id="7593635197364225277">Haz copias de seguridad de los datos de aplicaciones de Google Play en Google Drive y restáuralos automáticamente. Puedes cambiar esta opción en los ajustes de Android en cualquier momento. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (código de error <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">De acuerdo, importar</translation>
 <translation id="7600965453749440009">No traducir nunca del <ph name="LANGUAGE" /></translation>
@@ -5213,7 +5209,6 @@
 <translation id="8300607741108698921">Configuración en 1 minuto</translation>
 <translation id="8303650969500425356">Permite que JavaScript bloquee la orientación de la pantalla.</translation>
 <translation id="8303655282093186569">Configuración de entrada de pinyin</translation>
-<translation id="830424806940379275">Permite que las extensiones creen ventanas del panel que se abren fuera del marco del navegador. Si se inhabilita o se establece de forma predeterminada, cada vez que se intente abrir un panel, se abrirá una ventana emergente en su lugar. Los paneles de los sistemas operativos para ordenadores están obsoletos y se retirarán próximamente.</translation>
 <translation id="8306534594034939679">Habilita la compatibilidad con Servicios alternativos, una función HTTP experimenta.</translation>
 <translation id="8307376264102990850">Cargando
 Calculando el tiempo de carga completa</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 87c66689..5ec62e3 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -1934,6 +1934,7 @@
 <translation id="3590559774363307859">Parool salvestati. Saate selle ja kõik oma <ph name="SAVED_PASSWORDS_LINK" /> avada igas brauseris.</translation>
 <translation id="3590587280253938212">kiire</translation>
 <translation id="3592260987370335752">&amp;Lisateave</translation>
+<translation id="3592313833691251126">Laiendustel lubatakse luua paneelaknad, mis avanevad brauserist väljaspool. Kui seade on keelatud, ilmub paneeli avamisel selle asemel hüpik. Vaikekäitumisel lubatakse see ainult lubatute loendisse lisatud laienduste puhul. Lubatud käitumisel lubatakse see kõigi laienduste puhul. Keelatud käitumise puhul keelatakse kõikide laienduste paneelid.</translation>
 <translation id="359283478042092570">Sisestusklahv</translation>
 <translation id="3593152357631900254">Luba hägus pinyini režiim</translation>
 <translation id="3593965109698325041">Sertifikaadi nimepiirangud</translation>
@@ -2256,7 +2257,6 @@
 <translation id="4034042927394659004">Klaviatuuri heleduse vähendamine</translation>
 <translation id="4035758313003622889">&amp;Tegumihaldur</translation>
 <translation id="4037084878352560732">Hobune</translation>
-<translation id="4037102579141982963">See seade saadab Google'ile automaatselt diagnostika- ja kasutusandmeid. Seda saate seadme <ph name="BEGIN_LINK1" />seadetes<ph name="END_LINK1" /> alati muuta. <ph name="BEGIN_LINK2" />Lisateave<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Androidi vahelehe vahetajale juurdepääsu lubamine.</translation>
 <translation id="4044260751144303020">Fikseeritud positsiooni elementide jaoks küljendamine.</translation>
 <translation id="404493185430269859">Vaikeotsingumootor</translation>
@@ -3229,7 +3229,6 @@
 <translation id="5439568486246921931">See toiming kustutab jäädavalt selle kasutaja allalaadimised, võrguühenduseta failid ja sirvimisandmed. Seda ei saa tagasi võtta.</translation>
 <translation id="544083962418256601">Loo otseteid ...</translation>
 <translation id="5441100684135434593">Kaabelvõrk</translation>
-<translation id="5445088910157062298">Lubage Google'i asukohateenuste abirakendustel kiirelt ja täpselt teie asukoht leida. See aitab vähendada akukasutust. Google'ile saadetakse anonüümsed asukohaandmed, isegi kui ükski rakendus ei tööta.</translation>
 <translation id="5448293924669608770">Vabandust! Sisselogimisel läks midagi valesti</translation>
 <translation id="5449588825071916739">Kõikide vahelehtede järjehoidjatesse lisamine</translation>
 <translation id="5449716055534515760">Sule &amp;aken</translation>
@@ -3697,7 +3696,6 @@
 <translation id="6110466548232134880">Organisatsiooni <ph name="ORGANIZATION" /> identiteedi asukohas <ph name="LOCALITY" /> kinnitas väljaandja <ph name="ISSUER" />. Server ei esitanud sertifikaadi läbipaistvuse teavet.</translation>
 <translation id="6111770213269631447">Transliteratsioon (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Vaikimisi lubatud</translation>
-<translation id="6112929985131461002">See seade saadab Google'ile automaatselt diagnostika- ja kasutusandmeid. Selle <ph name="BEGIN_LINK1" />seade<ph name="END_LINK1" /> on jõustanud administraator. <ph name="BEGIN_LINK2" />Lisateave<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Keele ja sisestusseadete muutmine</translation>
 <translation id="6120205520491252677">Kinnita see leht avakuvale ...</translation>
 <translation id="6122081475643980456">Teie Interneti-ühendust juhitakse</translation>
@@ -3933,7 +3931,6 @@
 <translation id="6452181791372256707">Lükka tagasi</translation>
 <translation id="6454421252317455908">Hiina sisestusviis (kiire)</translation>
 <translation id="6455348477571378046">Sertifikaadi tüüp:</translation>
-<translation id="6456234919706689841">Administraator võib otsustada saata Google'ile diagnostika- ja kasutusandmeid. Seda <ph name="BEGIN_LINK1" />seadet<ph name="END_LINK1" /> saate vaadata siin. <ph name="BEGIN_LINK2" />Lisateave<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Jätka JavaScripti blokeerimist</translation>
 <translation id="6458308652667395253">JavaScripti blokeerimise haldamine...</translation>
 <translation id="6459488832681039634">Kasuta otsimiseks valikut</translation>
@@ -4714,7 +4711,6 @@
 <translation id="7587108133605326224">Balti</translation>
 <translation id="7589461650300748890">Hei! Olge ettevaatlik.</translation>
 <translation id="7589661784326793847">Oodake sekund</translation>
-<translation id="7593635197364225277">Play rakenduse andmed varundatakse automaatselt Google Drive'i ja taastatakse. Seda seadet saate Androidi seadetes alati muuta. <ph name="BEGIN_LINK1" />Lisateave<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (veakood <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Jah, impordi</translation>
 <translation id="7600965453749440009">Ära kunagi tõlgi: <ph name="LANGUAGE" /></translation>
@@ -5220,7 +5216,6 @@
 <translation id="8300607741108698921">1-minutiline seadistus</translation>
 <translation id="8303650969500425356">Lubab JavaScriptil ekraanisuuna lukustada.</translation>
 <translation id="8303655282093186569">Pinyini sisestusseaded</translation>
-<translation id="830424806940379275">Lubage laiendustel luua brauseriraamist väljaspool avanevaid paneelaknaid. Kui reegel on keelatud või määratud vaikeseadele, avaneb paneeli asemel hüpik. Lauaarvutitele mõeldud operatsioonisüsteemides on paneelide tugi katkestatud ja eemaldatakse peagi.</translation>
 <translation id="8306534594034939679">Alternatiivsete teenuste, eksperimentaalse HTTP-funktsiooni toe lubamine.</translation>
 <translation id="8307376264102990850">Laadimine
 Täislaadimiseks kuluva aja arvutamine</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 9f44eaa..b6c995a8 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1929,6 +1929,7 @@
 <translation id="3590559774363307859">گذرواژه ذخیره شد. می‌توانید از هر مرورگری به آن و همه <ph name="SAVED_PASSWORDS_LINK" /> خودتان دسترسی داشته باشید.</translation>
 <translation id="3590587280253938212">سریع</translation>
 <translation id="3592260987370335752">&amp;بیشتر بیاموزید</translation>
+<translation id="3592313833691251126">به افزونه‌ها امکان داده می‌شود پنجره‌های پانلی ایجاد کنند که خارج از قاب مرورگر باز می‌شود. اگر انتخاب نشود، تلاش برای باز کردن یک پانل، پنجره بازشویی را به‌جای آن باز می‌کند. رفتار پیش‌فرض امکان دادن فقط به افزونه‌های حاضر در فهرست مجاز است. رفتار حالت فعال امکان دادن به همه افزونه‌هاست. رفتار غیرفعال اجازه ندادن به پانل برای هر افزونه‌ای است.</translation>
 <translation id="359283478042092570">ورود</translation>
 <translation id="3593152357631900254">‏فعال کردن حالت Fuzzy-Pinyin</translation>
 <translation id="3593965109698325041">محدودیتهای نام گواهی</translation>
@@ -2251,7 +2252,6 @@
 <translation id="4034042927394659004">کاهش روشنایی کلید</translation>
 <translation id="4035758313003622889">مدیر &amp;فعالیت ها</translation>
 <translation id="4037084878352560732">اسب</translation>
-<translation id="4037102579141982963">‏این دستگاه به‌طور خودکار داده‌های تشخیصی و استفاده به Google ارسال خواهد کرد. هرزمان خواستید می‌توانید این تنظیم را در <ph name="BEGIN_LINK1" />تنظیمات<ph name="END_LINK1" /> دستگاه تغییر دهید. <ph name="BEGIN_LINK2" />بیشتر بدانید<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">‏فعال کردن تعویض‌گر برگه قابلیت دسترسی برای Android.</translation>
 <translation id="4044260751144303020">ترکیب عناصر دارای موقعیت ثابت.</translation>
 <translation id="404493185430269859">موتور جستجوی پیش‌‌فرض</translation>
@@ -3224,7 +3224,6 @@
 <translation id="5439568486246921931">‏این اقدام، بارگیری‌های کاربر، فایل‌های آفلاین، داده‌های محصول مرور و حافظه Android را برای همیشه حذف خواهد کرد. این کار قابل برگشت نیست.</translation>
 <translation id="544083962418256601">ایجاد میان‌برها...</translation>
 <translation id="5441100684135434593">شبکه کابلی</translation>
-<translation id="5445088910157062298">‏به سرویس مکان Google اجازه دهید مکانتان را به‌سرعت و با دقت پیدا کند؛ این کار می‌تواند مصرف باتری را کاهش دهد. حتی وقتی هیچ برنامه‌ای در حال اجرا نباشد، داده‌های مکان ناشناس به Google ارسال خواهند شد.</translation>
 <translation id="5448293924669608770">اوه، هنگام ورود به سیستم خطایی رخ داد</translation>
 <translation id="5449588825071916739">نشانک‌گذاری همه برگه‌ها...</translation>
 <translation id="5449716055534515760">بستن &amp;پنجره</translation>
@@ -3690,7 +3689,6 @@
 <translation id="6110466548232134880">هویت <ph name="ORGANIZATION" /> در <ph name="LOCALITY" /> توسط <ph name="ISSUER" /> تأیید شده است. هیچ اطلاعات شفافیت گواهینامه توسط سرور ارائه نشد.</translation>
 <translation id="6111770213269631447">‏نویسه‌گردانی (namaskar ← ‏নমস্কার)</translation>
 <translation id="6111974609785983504">مجاز شده به صورت ‌پیش‌فرض</translation>
-<translation id="6112929985131461002">‏این دستگاه به‌طور خودکار داده‌های تشخیصی و استفاده به Google ارسال می‌کند. این <ph name="BEGIN_LINK1" />تنظیم<ph name="END_LINK1" /> توسط سرپرست سیستم شما تنظیم شده و اجباری است. <ph name="BEGIN_LINK2" />بیشتر بدانید<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">تغییر تنظیمات زبان و ورودی</translation>
 <translation id="6120205520491252677">پین کردن این صفحه به صفحه شروع…</translation>
 <translation id="6122081475643980456">اتصال اینترنت شما کنترل می‌شود</translation>
@@ -3926,7 +3924,6 @@
 <translation id="6452181791372256707">عدم پذیرش</translation>
 <translation id="6454421252317455908">روش ورودی چینی (سریع)</translation>
 <translation id="6455348477571378046">نوع گواهی‌نامه:</translation>
-<translation id="6456234919706689841">‏ممکن است سرپرست سیستم شما انتخاب کند داده‌های تشخیصی و استفاده برای این دستگاه به Google ارسال شود. می‌توانید این <ph name="BEGIN_LINK1" />تنظیم<ph name="END_LINK1" /> را در اینجا ببینید. <ph name="BEGIN_LINK2" />بیشتر بدانید<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">ادامه مسدودکردن جاوا اسکریپت</translation>
 <translation id="6458308652667395253">مدیریت انسداد جاوا اسکریپت...</translation>
 <translation id="6459488832681039634">استفاده از انتخاب برای یافتن</translation>
@@ -4707,7 +4704,6 @@
 <translation id="7587108133605326224">بالتیک</translation>
 <translation id="7589461650300748890">اینجا ایست. مراقب باشید.</translation>
 <translation id="7589661784326793847">چند ثانیه صبر کنید</translation>
-<translation id="7593635197364225277">‏داده‌های برنامه Play را به‌طور خودکار در Google Drive پشتیبان‌گیری و بازیابی کنید. در هر زمانی می‌توانید این مورد را در تنظیمات Android تغییر دهید. <ph name="BEGIN_LINK1" />بیشتر بدانید<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (کد خطا <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">بسیار خوب، وارد شود</translation>
 <translation id="7600965453749440009">هرگز <ph name="LANGUAGE" /> ترجمه نشود</translation>
@@ -5212,7 +5208,6 @@
 <translation id="8300607741108698921">تنظیم ۱ دقیقه‌ای</translation>
 <translation id="8303650969500425356">به جاوا اسکریپت امکان می‌دهد جهت صفحه را قفل کند.</translation>
 <translation id="8303655282093186569">تنظیمات ورودی پین یین</translation>
-<translation id="830424806940379275">اجازه به افزونه‌ها برای ایجاد پنجره‌های پانل که خارج از قاب مروررگر باز می‌شوند. به‌صورت پیش‌فرض یا اگر این گزینه غیرفعال شده باشد، تلاش برای باز کردن پانل باعث باز شدن یک پنجره بازشو می‌شود. پانل‌های روی سیستم عامل‌های دسک‌تاپ منسوخ شده‌اند و به‌زودی حذف می‌شوند.</translation>
 <translation id="8306534594034939679">‏فعال کردن پشتیبانی برای سرویس‌های جایگزین، یک قابلیت آزمایشی HTTP.</translation>
 <translation id="8307376264102990850">در حال شارژ محاسبه زمان تا شارژ کامل</translation>
 <translation id="8308179586020895837">اگر <ph name="HOST" /> می‌خواهد به دوربین شما دسترسی داشته باشد از من سوال شود</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 6659842..bb5ec09a 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1933,6 +1933,7 @@
 <translation id="3590559774363307859">Salasana tallennettiin. Voit käyttää sitä ja muita <ph name="SAVED_PASSWORDS_LINK" /> millä tahansa selaimella.</translation>
 <translation id="3590587280253938212">nopea</translation>
 <translation id="3592260987370335752">&amp;Lisätietoja</translation>
+<translation id="3592313833691251126">Sallii selainkehyksen ulkopuolella avautuvat paneeli-ikkunat. Jos tämä on pois käytöstä, paneeli-ikkunan sijaan avataan ponnahdusikkuna. Oletuksena paneeli-ikkunat on sallittu vain sallittujen luettelossa oleville laajennuksille. Jos asetus on käytössä, paneelit sallitaan kaikille laajennuksille. Jos se on pois käytöstä, minkään laajennuksen paneeleja ei sallita.</translation>
 <translation id="359283478042092570">Sisään</translation>
 <translation id="3593152357631900254">Ota Fuzzy-Pinyin-tila käyttöön</translation>
 <translation id="3593965109698325041">Varmenteen nimirajoitukset</translation>
@@ -2252,7 +2253,6 @@
 <translation id="4034042927394659004">Vähennä näppäimistön kirkkautta</translation>
 <translation id="4035758313003622889">&amp;Tehtävänhallinta</translation>
 <translation id="4037084878352560732">Hevonen</translation>
-<translation id="4037102579141982963">Tämä laite lähettää diagnostiikka- ja käyttötietoja automaattisesti Googlelle. Voit muokata tätä asetusta milloin tahansa laitteesi <ph name="BEGIN_LINK1" />asetuksissa<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Lisätietoja<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Ota käytettävyystoiminnon välilehden vaihtaja käyttöön Androidissa.</translation>
 <translation id="4044260751144303020">Kiinteiden sijaintielementtien yhdistäminen.</translation>
 <translation id="404493185430269859">Oletushakukone</translation>
@@ -3218,7 +3218,6 @@
 <translation id="5439568486246921931">Tämä toimenpide poistaa pysyvästi tämän käyttäjän ladatut tiedostot, offline-tiedostot ja selaustiedot. Toimenpidettä ei voi kumota.</translation>
 <translation id="544083962418256601">Luo pikakuvakkeita...</translation>
 <translation id="5441100684135434593">Langallinen verkko</translation>
-<translation id="5445088910157062298">Kun annat Googlen sijaintipalveluiden auttaa sovelluksia paikantamaan sijaintisi nopeasti ja tarkasti, voit vähentää akun kulutusta. Palvelut lähettävät Googlelle anonyymejä sijaintitietoja myös silloin, kun sovelluksia ei ole käynnissä.</translation>
 <translation id="5448293924669608770">Hups, jokin meni vikaan kirjautumisessa</translation>
 <translation id="5449588825071916739">Lisää kaikki välilehdet kirjanmerkkeihin</translation>
 <translation id="5449716055534515760">&amp;Sulje ikkuna</translation>
@@ -3684,7 +3683,6 @@
 <translation id="6110466548232134880"><ph name="ISSUER" /> on vahvistanut identiteetin <ph name="ORGANIZATION" /> sijainnissa <ph name="LOCALITY" />. Palvelin ei antanut Certificate Transparency -tietoja.</translation>
 <translation id="6111770213269631447">Translitterointi (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Sallittu oletuksena</translation>
-<translation id="6112929985131461002">Tämä laite lähettää diagnostiikka- ja käyttötietoja automaattisesti Googlelle. Järjestelmänvalvojasi on ottanut tämän <ph name="BEGIN_LINK1" />asetuksen<ph name="END_LINK1" /> käyttöön. <ph name="BEGIN_LINK2" />Lisätietoja<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Vaihda kielen ja syöttötavan asetuksia</translation>
 <translation id="6120205520491252677">Kiinnitä tämä sivu aloitusruutuun...</translation>
 <translation id="6122081475643980456">Internetyhteyttäsi hallinnoidaan</translation>
@@ -3922,7 +3920,6 @@
 <translation id="6452181791372256707">Hylkää</translation>
 <translation id="6454421252317455908">Kiinalainen syöttötapa (nopea)</translation>
 <translation id="6455348477571378046">Varmenteen tyyppi:</translation>
-<translation id="6456234919706689841">Järjestelmänvalvojasi voi lähettää tätä laitetta koskevia diagnostiikka- ja käyttötietoja Googlelle. Voit tarkastella tätä <ph name="BEGIN_LINK1" />asetusta<ph name="END_LINK1" /> täällä. <ph name="BEGIN_LINK2" />Lisätietoja<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Estä JavaScript edelleen</translation>
 <translation id="6458308652667395253">Hallinnoi JavaScriptin estoa...</translation>
 <translation id="6459488832681039634">Hae valinnan avulla</translation>
@@ -4699,7 +4696,6 @@
 <translation id="7587108133605326224">baltialainen</translation>
 <translation id="7589461650300748890">Hei, varo vähän.</translation>
 <translation id="7589661784326793847">Odota hetki</translation>
-<translation id="7593635197364225277">Varmuuskopioi ja palauta Play-sovellustiedot automaattisesti Google Driven avulla. Voit muuttaa valintaa koska tahansa Android-asetuksissa. <ph name="BEGIN_LINK1" />Lisätietoja<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (virhekoodi <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">OK, tuo</translation>
 <translation id="7600965453749440009">Älä koskaan käännä kieltä <ph name="LANGUAGE" /></translation>
@@ -5205,7 +5201,6 @@
 <translation id="8300607741108698921">1 minuutin asennus</translation>
 <translation id="8303650969500425356">Sallii JavaScriptin lukita näytön suunnan.</translation>
 <translation id="8303655282093186569">Pinyin-syöttöasetukset</translation>
-<translation id="830424806940379275">Sallii laajennusten luoda selainikkunan ulkopuolella avautuvia paneeli-ikkunoita. Jos tämä ei ole käytössä tai oletusarvo on käytössä, paneelin avaamisyritys avaa ponnahdusikkunan. Tietokonekäyttöjärjestelmien paneelit on poistettu käytöstä ja ne poistetaan pian kokonaan.</translation>
 <translation id="8306534594034939679">Ota käyttöön kokeellinen HTTP-ominaisuus Vaihtoehtoiset palvelut.</translation>
 <translation id="8307376264102990850">Ladataan – Aika, kunnes akku on täynnä</translation>
 <translation id="8308179586020895837">Kysy, jos <ph name="HOST" /> haluaa käyttää kameraasi</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 269ad8f9..e9821415 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1936,6 +1936,7 @@
 <translation id="3590559774363307859">Na-save ang password. Maaari mo itong i-access at ang lahat ng iyong <ph name="SAVED_PASSWORDS_LINK" /> mula sa iyong browser.</translation>
 <translation id="3590587280253938212">mabilis</translation>
 <translation id="3592260987370335752">&amp;Matuto nang higit pa</translation>
+<translation id="3592313833691251126">Payagan ang mga extension na gumawa ng mga window ng panel na magbubukas sa labas ng frame ng browser. Ang mga pagsubok na magbukas ng panel ay magbubukas ng popup sa halip kung hindi naka-enable. Ang default na pagkilos ay payagan lang para sa mga naka-whiteliste na extension. Ang naka-enable na apgkilos ay payagan para sa lahat ng extension. Ang naka-disable na pagkilos ay huwag payagan angm ga panel para sa anumang extension.</translation>
 <translation id="359283478042092570">Ilagay</translation>
 <translation id="3593152357631900254">Paganahin ang Fuzzy-Pinyin mode</translation>
 <translation id="3593965109698325041">Mga Limitasyon sa Pangalan ng Certificate</translation>
@@ -2259,7 +2260,6 @@
 <translation id="4034042927394659004">Bawasan ang brightness ng key</translation>
 <translation id="4035758313003622889">&amp;Task manager</translation>
 <translation id="4037084878352560732">Kabayo</translation>
-<translation id="4037102579141982963">Awtomatikong magpapadala sa Google ang device na ito ng data ng diagnostic at paggamit. Maaari mo itong baguhin anumang oras sa <ph name="BEGIN_LINK1" />mga setting<ph name="END_LINK1" /> ng iyong device. <ph name="BEGIN_LINK2" />Matuto nang Higit Pa<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">I-enable ang accessibility na tagalipat ng tab para sa Android.</translation>
 <translation id="4044260751144303020">Paghahati-hati para sa mga elementong hindi nababago ang posisyon.</translation>
 <translation id="404493185430269859">Default na search engine</translation>
@@ -3233,7 +3233,6 @@
 <translation id="5439568486246921931">Permanenteng made-delete ng pagkilos na ito ang mga na-download, offline na file at data ng pagba-browse ng user na ito. Hindi na ito maa-undo.</translation>
 <translation id="544083962418256601">Lumikha ng mga shortcut...</translation>
 <translation id="5441100684135434593">Wired na network</translation>
-<translation id="5445088910157062298">Payagan ang serbisyo ng lokasyon ng Google na tumulong sa mga app na mabilis at tumpak na mahanap ang iyong lokasyon, na maaaring makabawas sa pagkonsumo ng baterya. Ang anonymous na data ng lokasyon ay ipapadala sa Google, kahit walang mga gumaganang app.</translation>
 <translation id="5448293924669608770">Oops, nagkaproblema sa pag-sign in</translation>
 <translation id="5449588825071916739">I-bookmark ang Lahat ng Tab</translation>
 <translation id="5449716055534515760">Isara ang Win&amp;dow</translation>
@@ -3701,7 +3700,6 @@
 <translation id="6110466548232134880">Na-verify na ng <ph name="ISSUER" /> ang pagkakakilanlan ng <ph name="ORGANIZATION" /> sa <ph name="LOCALITY" />. Walang ibinigay na impormasyon sa Certificate Transparency ang server.</translation>
 <translation id="6111770213269631447">Transliteration (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Pinapayagan bilang default</translation>
-<translation id="6112929985131461002">Awtomatikong magpapadala sa Google ang device na ito ng data ng diagnostic at paggamit. Ang <ph name="BEGIN_LINK1" />setting<ph name="END_LINK1" /> na ito ay ipinapatupad ng iyong administrator. <ph name="BEGIN_LINK2" />Matuto nang Higit Pa<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Baguhin ang mga setting ng wika at input</translation>
 <translation id="6120205520491252677">I-pin ang pahinang ito screen ng Simula...</translation>
 <translation id="6122081475643980456">Kinokontrol ang iyong koneksyon sa Internet</translation>
@@ -3937,7 +3935,6 @@
 <translation id="6452181791372256707">Tanggihan</translation>
 <translation id="6454421252317455908">Paraan ng pag-input na Chinese (mabilis)</translation>
 <translation id="6455348477571378046">Uri ng Certificate</translation>
-<translation id="6456234919706689841">Maaaring piliin ng iyong administrator na magpadala sa Google ng data ng diagnostic at paggamit para sa device na ito. Maaari mong tingnan dito ang <ph name="BEGIN_LINK1" />setting<ph name="END_LINK1" /> na ito. <ph name="BEGIN_LINK2" />Matuto nang Higit Pa<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Magpatuloy sa pagharang ng JavaScript</translation>
 <translation id="6458308652667395253">Pamahalaan ang pagharang ng JavaScript...</translation>
 <translation id="6459488832681039634">Use Selection for Find</translation>
@@ -4720,7 +4717,6 @@
 <translation id="7587108133605326224">Baltic</translation>
 <translation id="7589461650300748890">Naku. Mag-ingat.</translation>
 <translation id="7589661784326793847">Maghintay lamang ng isang segundo</translation>
-<translation id="7593635197364225277">Awtomatikong i-back up at i-restore ang data ng app ng Play sa Google Drive. Maaari mo itong baguhin sa Mga Setting ng Android anumang oras. <ph name="BEGIN_LINK1" />Matuto nang Higit pa<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (error code na <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Ok, i-import</translation>
 <translation id="7600965453749440009">Huwag isalin kailanman ang <ph name="LANGUAGE" /></translation>
@@ -5227,7 +5223,6 @@
 <translation id="8300607741108698921">1-minutong pag-setup</translation>
 <translation id="8303650969500425356">Nagbibigay-daan sa javascript na i-lock ang oryentasyon ng screen.</translation>
 <translation id="8303655282093186569">Mga setting ng pag-input na Pinyin</translation>
-<translation id="830424806940379275">Payagan ang mga extension na gumawa ng mga panel window na bumubukas sa labas ng browser frame. Bilang default o kung naka-disable, kapag sinubukang magbukas ng panel, magbubukas ang isang popup. Ang mga panel sa mga OS ng desktop ay hindi na ginagamit at malapit nang alisin.</translation>
 <translation id="8306534594034939679">I-enable ang suporta para sa Mga Alternatibong Serbisyo, na isang pang-eksperimentong feature ng HTTP.</translation>
 <translation id="8307376264102990850">Nagcha-charge
 Kinakalkula ang oras hanggang sa mapuno</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 870ef295..5ce8ab6 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -1933,6 +1933,7 @@
 <translation id="3590559774363307859">Le mot de passe a bien été enregistré. Vous pouvez y accéder, ainsi qu'à tous vos <ph name="SAVED_PASSWORDS_LINK" />, dans n'importe quel navigateur.</translation>
 <translation id="3590587280253938212">rapide</translation>
 <translation id="3592260987370335752">&amp;En savoir plus</translation>
+<translation id="3592313833691251126">Autorise les extensions à créer des fenêtres de type panneau qui s'ouvrent en dehors du cadre du navigateur. Si cette fonctionnalité n'est pas activée, les tentatives d'ouverture d'un panneau entraînent l'ouverture d'une fenêtre pop-up. Le comportement par défaut consiste à n'autoriser les panneaux que pour les extensions ajoutées à la liste blanche. Si l'option est activée, toutes les extensions sont autorisées à créer des panneaux. Si elle est désactivée, les panneaux sont interdits pour toutes les extensions.</translation>
 <translation id="359283478042092570">Se connecter</translation>
 <translation id="3593152357631900254">Activer le mode Pinyin fuzzy</translation>
 <translation id="3593965109698325041">Contraintes de nom du certificat</translation>
@@ -2255,7 +2256,6 @@
 <translation id="4034042927394659004">Réduire la luminosité du clavier</translation>
 <translation id="4035758313003622889">Gestionnaire de &amp;tâches</translation>
 <translation id="4037084878352560732">Cheval</translation>
-<translation id="4037102579141982963">Cet appareil enverra automatiquement des diagnostics et des données d'utilisation à Google. Vous pouvez modifier cette option à tout moment dans les <ph name="BEGIN_LINK1" />paramètres<ph name="END_LINK1" /> de l'appareil. <ph name="BEGIN_LINK2" />En savoir plus<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Activer la fonctionnalité d'accessibilité pour le changement d'onglets sur Android</translation>
 <translation id="4044260751144303020">Composition des éléments fixes</translation>
 <translation id="404493185430269859">Moteur de recherche par défaut</translation>
@@ -3228,7 +3228,6 @@
 <translation id="5439568486246921931">Les téléchargements, les fichiers hors connexion et les données de navigation de cet utilisateur seront supprimés définitivement. Cette action est irréversible.</translation>
 <translation id="544083962418256601">Créer des raccourcis…</translation>
 <translation id="5441100684135434593">Réseau câblé</translation>
-<translation id="5445088910157062298">L'activation du service de localisation de Google permet aux applications de rechercher rapidement et précisément votre position, ce qui peut économiser la batterie. Des données de localisation anonymes sont envoyées à Google, même si aucune application ne fonctionne.</translation>
 <translation id="5448293924669608770">Un problème est survenu lors de la connexion</translation>
 <translation id="5449588825071916739">Ajouter tous les onglets aux favoris…</translation>
 <translation id="5449716055534515760">Fe&amp;rmer la fenêtre</translation>
@@ -3697,7 +3696,6 @@
 <translation id="6110466548232134880">L'identité de l'organisation <ph name="ORGANIZATION" />, située à <ph name="LOCALITY" />, a été validée par <ph name="ISSUER" />. Aucune information relative à la transparence des certificats n'a été fournie par le serveur.</translation>
 <translation id="6111770213269631447">Translittération (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Autorisée par défaut</translation>
-<translation id="6112929985131461002">Cet appareil enverra automatiquement des diagnostics et des données d'utilisation à Google. Ce <ph name="BEGIN_LINK1" />paramètre<ph name="END_LINK1" /> est contrôlé par votre administrateur. <ph name="BEGIN_LINK2" />En savoir plus<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Modifier les paramètres de langue et de saisie</translation>
 <translation id="6120205520491252677">Épingler cette page à l'écran de démarrage…</translation>
 <translation id="6122081475643980456">Une extension a pris le contrôle de votre connexion Internet</translation>
@@ -3933,7 +3931,6 @@
 <translation id="6452181791372256707">Refuser</translation>
 <translation id="6454421252317455908">Mode de saisie du chinois (quick)</translation>
 <translation id="6455348477571378046">Type de certificat :</translation>
-<translation id="6456234919706689841">Votre administrateur peut choisir d'envoyer à Google des diagnostics et des données d'utilisation relatifs à cet appareil. Vous pouvez consulter ce <ph name="BEGIN_LINK1" />paramètre<ph name="END_LINK1" /> ici. <ph name="BEGIN_LINK2" />En savoir plus<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Continuer à bloquer JavaScript</translation>
 <translation id="6458308652667395253">Configurer le blocage de JavaScript...</translation>
 <translation id="6459488832681039634">Rechercher la sélection</translation>
@@ -4712,7 +4709,6 @@
 <translation id="7587108133605326224">Langues baltes</translation>
 <translation id="7589461650300748890">Attention !</translation>
 <translation id="7589661784326793847">Veuillez patienter un court instant.</translation>
-<translation id="7593635197364225277">Sauvegardez et restaurez automatiquement les données de l'application Play dans Google Drive. Vous pouvez modifier cette fonctionnalité à tout moment dans les paramètres Android. <ph name="BEGIN_LINK1" />En savoir plus<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (code d'erreur : <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">OK, importer</translation>
 <translation id="7600965453749440009">Ne jamais traduire les pages rédigées en <ph name="LANGUAGE" /> </translation>
@@ -5219,7 +5215,6 @@
 <translation id="8300607741108698921">Configurer en une minute</translation>
 <translation id="8303650969500425356">Cette option permet de verrouiller l'orientation de l'écran avec JavaScript.</translation>
 <translation id="8303655282093186569">Paramètres de saisie pinyin</translation>
-<translation id="830424806940379275">Autorise les extensions à créer des fenêtres de type panneau qui s'ouvrent en dehors du cadre du navigateur. Par défaut ou si cette option est désactivée, une tentative d'ouverture d'un panneau entraîne l'ouverture d'une fenêtre pop-up. Les panneaux sur les OS de bureau sont abandonnés et seront prochainement supprimés.</translation>
 <translation id="8306534594034939679">Activer la compatibilité avec les autres services, une fonctionnalité HTTP expérimentale</translation>
 <translation id="8307376264102990850">Calcul du temps de chargement</translation>
 <translation id="8308179586020895837">Demander si l'accès à votre caméra est requis sur <ph name="HOST" /></translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 11689e2e..6710bcd 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -1929,6 +1929,7 @@
 <translation id="3590559774363307859">પાસવર્ડ સાચવ્યો. તમે તેને અને તમારા બધા <ph name="SAVED_PASSWORDS_LINK" /> ને કોઈપણ બ્રાઉઝરથી ઍક્સેસ કરી શકો છો.</translation>
 <translation id="3590587280253938212">ઝડપી</translation>
 <translation id="3592260987370335752">&amp;વધુ જાણો</translation>
+<translation id="3592313833691251126">એક્સ્ટેન્શન્સને બ્રાઉઝર ફ્રેમની બહાર ખુલતી પેનલ વિંડોઝ બનાવવાની મંજૂરી આપો. જો સક્ષમ નહીં હોય, તો કોઈ પેનલને ખોલવાના પ્રયાસો તેના બદલે એક પૉપઅપ ખોલશે. ડિફોલ્ટ વર્તણૂક વ્હાઇટલિસ્ટ કરેલ એક્સ્ટેન્શન્સને માત્ર તમારા માટે મંજૂરી આપવું છે. સક્ષમ કરેલ વર્તણૂક તમામ એક્સ્ટેન્શન્સ માટે મંજૂરી આપવું છે. અક્ષમ કરેલ વર્તણૂક કોઈપણ વર્તણૂક માટે પેનલ્સને નામંજૂર કરવું છે.</translation>
 <translation id="359283478042092570">Enter</translation>
 <translation id="3593152357631900254">Fuzzy-Pinyin મોડને સક્ષમ કરો </translation>
 <translation id="3593965109698325041">પ્રમાણપત્રના નામની મર્યાદાઓ</translation>
@@ -2251,7 +2252,6 @@
 <translation id="4034042927394659004">કીના તેજને ઘટાડો</translation>
 <translation id="4035758313003622889">&amp;કાર્ય વ્યવસ્થાપક</translation>
 <translation id="4037084878352560732">ઘોડો</translation>
-<translation id="4037102579141982963">આ ઉપકરણ, Google ને આપમેળે નિદાન અને વપરાશ ડેટા મોકલશે. તમે તમારી ઉપકરણ <ph name="BEGIN_LINK1" />સેટિંગ્સ<ph name="END_LINK1" />માં આને કોઈપણ સમયે બદલી શકો છો. <ph name="BEGIN_LINK2" />વધુ જાણો<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Android માટે ઍક્સેસિબિલિટી ટેબ સ્વિચર સક્ષમ કરો.</translation>
 <translation id="4044260751144303020">નિશ્ચિત સ્થિતિ તત્વો માટે સંમિશ્રણ.</translation>
 <translation id="404493185430269859">ડિફોલ્ટ શોધ એન્જિન</translation>
@@ -3222,7 +3222,6 @@
 <translation id="5439568486246921931">આ ક્રિયા વપરાશકર્તાના ડાઉનલોડ્સ, ઑફલાઇન ફાઇલો અને બ્રાઉઝિંગ ડેટાને કાયમી રૂપે કાઢી નાખશે. આ પૂર્વવત્‌ કરી શકાતું નથી.</translation>
 <translation id="544083962418256601">શૉર્ટકટ્સ બનાવો ...</translation>
 <translation id="5441100684135434593">વાયર્ડ નેટવર્ક</translation>
-<translation id="5445088910157062298">Google ની સ્થાન સેવાને તમારું સ્થાન ઝડપથી અને સચોટ રીતે શોધવા તમારી ઍપ્લિકેશનોને સહાય કરવા દો, જે બૅટરીનો વપરાશ ઘટાડી શકે છે. કોઇ ઍપ્લિકેશનો ચાલુ ન હોય ત્યારે પણ, Google ને અનામિક સ્થાન ડેટા મોકલવામાં આવશે.</translation>
 <translation id="5448293924669608770">અરેરે, સાઇન ઇનમાં કંઈક ખોટું થયું છે</translation>
 <translation id="5449588825071916739">તમામ ટૅબ્સ બુકમાર્ક કરો</translation>
 <translation id="5449716055534515760">Close Win&amp;dow</translation>
@@ -3689,7 +3688,6 @@
 <translation id="6110466548232134880"><ph name="LOCALITY" /> ખાતે <ph name="ORGANIZATION" /> ની ઓળખ <ph name="ISSUER" /> દ્વારા ચકાસવામાં આવી હતી. સર્વર દ્વારા કોઈ પ્રમાણપત્ર પારદર્શિતા માહિતી પૂરી પાડવામાં આવી ન હતી.</translation>
 <translation id="6111770213269631447">લિવ્યંતરણ (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">ડિફોલ્ટ દ્વારા મંજૂર</translation>
-<translation id="6112929985131461002">આ ઉપકરણ Google ને આપમેળે નિદાન અને વપરાશ ડેટા મોકલશે. તમારા વ્યવસ્થાપક દ્વારા આ <ph name="BEGIN_LINK1" />સેટિંગ<ph name="END_LINK1" /> લાગુ કરેલ છે. <ph name="BEGIN_LINK2" />વધુ જાણો<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">ભાષા અને ઇનપુટ સેટિંગ્સ બદલો</translation>
 <translation id="6120205520491252677">પ્રારંભ સ્ક્રીન પર આ પૃષ્ઠ પિન કરો...</translation>
 <translation id="6122081475643980456">તમારું ઇન્ટરનેટ કનેક્શન નિયંત્રિત કરવામાં આવી રહ્યું છે</translation>
@@ -3925,7 +3923,6 @@
 <translation id="6452181791372256707">નકારો</translation>
 <translation id="6454421252317455908">ચાઇનીઝ ઇનપુટ મેથડ (ક્વિક)</translation>
 <translation id="6455348477571378046">પ્રમાણપત્રનો પ્રકાર:</translation>
-<translation id="6456234919706689841">તમારા વ્યવસ્થાપક Google ને આ ઉપકરણ માટે નિદાન અને વપરાશ ડેટા મોકલવાનું પસંદ કરી શકે છે. તમે આ <ph name="BEGIN_LINK1" />સેટિંગ<ph name="END_LINK1" /> અહીં જોઈ શકો છો. <ph name="BEGIN_LINK2" />વધુ જાણો<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">JavaScript ને અવરોધિત કરવાનું ચાલુ રાખો</translation>
 <translation id="6458308652667395253">JavaScript અવરોધિત કરવાનું મેનેજ કરો...</translation>
 <translation id="6459488832681039634">શોધવા માટે પસંદગીનો ઉપયોગ કરો</translation>
@@ -4706,7 +4703,6 @@
 <translation id="7587108133605326224">બાલ્ટિક</translation>
 <translation id="7589461650300748890">અરે, ત્યાં છો. સાવધ રહો.</translation>
 <translation id="7589661784326793847">ક્ષણભર રોકાવ</translation>
-<translation id="7593635197364225277">Play ઍપ્લિકેશન ડેટાનું Google ડ્રાઇવ પર આપમેળે બેક અપ લો અને પુનઃસ્થાપિત કરો. તમે કોઇપણ સમયે આને Android સેટિંગ્સમાં બદલી શકો છો. <ph name="BEGIN_LINK1" />વધુ જાણો<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (ભૂલ કોડ <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">ઓકે, આયાત કરો</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" /> નું ક્યારેય અનુવાદ કરશો નહીં</translation>
@@ -5208,7 +5204,6 @@
 <translation id="8300607741108698921">1-મિનિટ સેટઅપ</translation>
 <translation id="8303650969500425356">સ્ક્રીન ઓરિએન્ટેશનને લૉક કરવા માટેની javascript ને મંજૂરી આપે છે.</translation>
 <translation id="8303655282093186569">Pinyin ઇનપુટ સેટિંગ્સ</translation>
-<translation id="830424806940379275">એક્સ્ટેન્શન્સને બ્રાઉઝર ફ્રેમની બહાર ખુલે છે તે પૅનલ વિંડોઝ બનાવવાની મંજૂરી આપો. ડિફૉલ્ટ તરીકે અથવા જો અક્ષમ કરેલ હોય, તો પૅનલને ખોલવાનો પ્રયત્ન તેના બદલે પૉપઅપ ખોલશે. ડેસ્કટૉપ OS પરની પૅનલ્સ ટાળવામાં આવે છે અને તે ટૂંક સમયમાં દૂર કરી દેવામાં આવશે.</translation>
 <translation id="8306534594034939679">પ્રયોગાત્મક HTTP સુવિધા એવી વૈકલ્પિક સેવાઓ માટે સમર્થન સક્ષમ કરો.</translation>
 <translation id="8307376264102990850">ચાર્જ કરી રહ્યું છે
 સંપૂર્ણ સમય એકમની ગણતરી કરી રહ્યું છે</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index 5ace8fb..9902448 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -1933,6 +1933,7 @@
 <translation id="3590559774363307859">पासवर्ड सहेजा गया. आप उसे तथा अपने सभी <ph name="SAVED_PASSWORDS_LINK" /> को किसी भी ब्राउज़र से ऐक्‍सेस कर सकते हैं.</translation>
 <translation id="3590587280253938212">तेज़</translation>
 <translation id="3592260987370335752">&amp;अधिक जानें</translation>
+<translation id="3592313833691251126">एक्सटेंशन को ब्राउज़र फ़्रेम से बाहर खुलने वाली फलक विंडो बनाने की अनुमति दें. यदि सक्षम ना किया गया हो, तो फलक खोलने का प्रयास करने पर फलक के बजाय पॉपअप खुल जाएगा. डिफ़ॉल्ट व्यवहार केवल श्वेत सूची में डाले गए एक्सटेंशन को अनुमति देने के लिए है. सक्षम व्यवहार सभी एक्सटेंशन को अनुमति देने के लिए है. अक्षम व्यवहार किसी भी एक्सटेंशन के लिए फलक की अनुमति नहीं देने के लिए है.</translation>
 <translation id="359283478042092570">प्रवेश</translation>
 <translation id="3593152357631900254">अस्पष्ट-पिनयिन मोड सक्षम करें</translation>
 <translation id="3593965109698325041">प्रमाणपत्र नाम बाध्यताएं</translation>
@@ -2254,7 +2255,6 @@
 <translation id="4034042927394659004">कुंजी की स्क्रीन की रोशनी घटाएं</translation>
 <translation id="4035758313003622889">&amp;कार्य प्रबंधक</translation>
 <translation id="4037084878352560732">घोड़ा</translation>
-<translation id="4037102579141982963">यह डिवाइस Google को निदान और उपयोग का डेटा अपने आप भेजेगा. आप इसे अपनी डिवाइस <ph name="BEGIN_LINK1" />सेटिंग<ph name="END_LINK1" /> में किसी भी समय बदल सकते हैं. <ph name="BEGIN_LINK2" />अधिक जानें<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Android के लिए पहुंच-योग्यता टैब स्विचर सक्षम करें.</translation>
 <translation id="4044260751144303020">निश्चित स्थिति तत्वों के लिए समग्रीकरण</translation>
 <translation id="404493185430269859">डिफ़ॉल्ट खोज इंजन</translation>
@@ -3228,7 +3228,6 @@
 <translation id="5439568486246921931">इस कार्रवाई से इस उपयोगकर्ता के डाउनलोड, ऑफ़लाइन फ़ाइलें और ब्राउज़िंग डेटा स्थायी रूप से हट जाएगा. इसे पूर्ववत नहीं किया जा सकता.</translation>
 <translation id="544083962418256601">शॉर्टकट बनाएं...</translation>
 <translation id="5441100684135434593">वायर्ड नेटवर्क</translation>
-<translation id="5445088910157062298">Google की स्थान सेवा को आपका स्थान, तेज़ी से और सटीकता से ढूंढने में ऐप्लिकेशन की सहायता करने दें जिससे बैटरी की खपत कम हो सकती है. अनाम स्थान डेटा Google को भेजा जाएगा, भले ही कोई भी ऐप्लिकेशन नहीं चल रहा हो.</translation>
 <translation id="5448293924669608770">ओह, प्रवेश में कुछ गलत हो गया था</translation>
 <translation id="5449588825071916739">सभी टैब बुकमार्क करें</translation>
 <translation id="5449716055534515760">विं&amp;डो बंद करें</translation>
@@ -3696,7 +3695,6 @@
 <translation id="6110466548232134880"><ph name="LOCALITY" /> में <ph name="ORGANIZATION" /> की पहचान <ph name="ISSUER" /> द्वारा सत्यापित की गई है. सर्वर द्वारा किसी प्रमाणपत्र पारदर्शिता जानकारी की आपूर्ति नहीं की गई थी.</translation>
 <translation id="6111770213269631447">लिप्यंतरण (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">डिफ़ॉल्ट रूप से अनुमत</translation>
-<translation id="6112929985131461002">यह डिवाइस Google को निदान और उपयोग का डेटा अपने आप भेजेगा. यह <ph name="BEGIN_LINK1" />सेटिंग<ph name="END_LINK1" /> आपके व्यवस्थापक द्वारा लागू की गई है. <ph name="BEGIN_LINK2" />अधिक जानें<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">भाषा और अक्षर सेटिंग बदलें</translation>
 <translation id="6120205520491252677">इस पृष्ठ को प्रारंभ स्क्रीन में पिन करें...</translation>
 <translation id="6122081475643980456">आपका इंटरनेट कनेक्शन नियंत्रित किया जा रहा है</translation>
@@ -3932,7 +3930,6 @@
 <translation id="6452181791372256707">अस्‍वीकार करें</translation>
 <translation id="6454421252317455908">चीनी इनपुट पद्धति (त्वरित)</translation>
 <translation id="6455348477571378046">प्रमाणपत्र प्रकार:</translation>
-<translation id="6456234919706689841">आपका व्यवस्थापक Google को इस डिवाइस के लिए निदान और उपयोग का डेटा भेजना चुन सकता है. आप इस <ph name="BEGIN_LINK1" />सेटिंग<ph name="END_LINK1" /> को यहां देख सकते हैं. <ph name="BEGIN_LINK2" />अधिक जानें<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">JavaScript को अवरोधित करना जारी रखें</translation>
 <translation id="6458308652667395253">JavaScript अवरोधन प्रबंधित करें...</translation>
 <translation id="6459488832681039634">ढूंढने के लिए चयन का उपयोग करें</translation>
@@ -4714,7 +4711,6 @@
 <translation id="7587108133605326224">Baltic</translation>
 <translation id="7589461650300748890">अरे, सुनिए. सतर्क रहें.</translation>
 <translation id="7589661784326793847">बस एक सेकंड प्रतीक्षा करें</translation>
-<translation id="7593635197364225277">Play ऐप्लिकेशन डेटा का Google डिस्क में अपने आप बैक अप लें और पुन: स्थापित करें. आप इसे Android सेटिंग में किसी भी समय बदल सकते हैं. <ph name="BEGIN_LINK1" />अधिक जानें<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (त्रुटि कोड <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">ठीक है, आयात करें</translation>
 <translation id="7600965453749440009">कभी भी <ph name="LANGUAGE" /> का अनुवाद न करें</translation>
@@ -5220,7 +5216,6 @@
 <translation id="8300607741108698921">1 मिनट का सेटअप</translation>
 <translation id="8303650969500425356">javascript के लिए स्‍क्रीन अभिविन्‍यास को लॉक करने की अनुमति देता है.</translation>
 <translation id="8303655282093186569">पिनयिन इनपुट सेटिंग</translation>
-<translation id="830424806940379275">एक्सटेंशन को ब्राउज़र फ्रेम के बाहर खुलने वाली पैनल विंडो बनाने की अनुमति दें. डिफ़ॉल्ट रूप से या अगर अक्षम हो, तो किसी पैनल को खोलने का प्रयास में एक पॉपअप खुल जाएगा. डेस्कटॉप OS के पैनल बहिष्कृत कर दिए गए हैं और जल्द ही उन्हें निकाल दिया जाएगा.</translation>
 <translation id="8306534594034939679">वैकल्पिक सेवाओं के लिए सहयता सक्षम करें जो प्रयोगात्मक HTTP सुविधा है.</translation>
 <translation id="8307376264102990850">चार्जिंग पूर्ण होने तक का समय</translation>
 <translation id="8308179586020895837">यदि <ph name="HOST" /> आपका कैमरा और माइक्रोफ़ोन एक्सेस करना चाहे, तो पूछें</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 78f0b93..d61b245 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -1932,6 +1932,7 @@
 <translation id="3590559774363307859">Zaporka je spremljena. Toj i svim drugim zaporkama možete pristupiti tako da otvorite <ph name="SAVED_PASSWORDS_LINK" /> u bilo kojem pregledniku.</translation>
 <translation id="3590587280253938212">brzo</translation>
 <translation id="3592260987370335752">&amp;Saznajte više</translation>
+<translation id="3592313833691251126">Omogućuje proširenjima da izrade prozore ploča koji se otvaraju izvan okvira preglednika. Ako ploče nisu omogućene, otvorit će se skočni prozor. Prema zadanim postavkama prihvaćaju se samo proširenja s popisa dopuštenih. Ako je to pravilo omogućeno, prihvaćaju se sva proširenja. Ako je onemogućeno, ploče nisu dopuštene ni za jedno proširenje.</translation>
 <translation id="359283478042092570">Pridružite se</translation>
 <translation id="3593152357631900254">Omogući način Fuzzy-Pinyin</translation>
 <translation id="3593965109698325041">Ograničenja naziva certifikata</translation>
@@ -2254,7 +2255,6 @@
 <translation id="4034042927394659004">Smanjenje svjetline tipke</translation>
 <translation id="4035758313003622889">&amp;Upravitelj zadacima</translation>
 <translation id="4037084878352560732">Konj</translation>
-<translation id="4037102579141982963">Uređaj će Googleu automatski slati dijagnostiku i podatke o upotrebi. To možete promijeniti u bilo kojem trenutku u <ph name="BEGIN_LINK1" />postavkama<ph name="END_LINK1" /> uređaja. <ph name="BEGIN_LINK2" />Saznajte više<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Omogući izmjenjivač kartica pristupačnosti za Android.</translation>
 <translation id="4044260751144303020">Slaganje za elemente s fiksnim položajem.</translation>
 <translation id="404493185430269859">Zadana tražilica</translation>
@@ -3228,7 +3228,6 @@
 <translation id="5439568486246921931">Ovim će se postupkom trajno izbrisati korisnikova preuzimanja, offline datoteke i podaci o pregledavanju. Postupak se ne može poništiti.</translation>
 <translation id="544083962418256601">Stvaranje prečaca...</translation>
 <translation id="5441100684135434593">Žična mreža</translation>
-<translation id="5445088910157062298">Dopustite da Googleova usluga lokacije pomogne aplikacijama da brzo i točno pronađu vašu lokaciju, čime se smanjuje potrošnja baterije. Anonimni podaci o lokaciji slat će se Googleu čak i kad nema pokrenutih aplikacija.</translation>
 <translation id="5448293924669608770">Ups, nešto je pošlo po krivu s prijavom</translation>
 <translation id="5449588825071916739">Označi sve kartice</translation>
 <translation id="5449716055534515760">Close Win&amp;dow (Zatvori prozor)</translation>
@@ -3694,7 +3693,6 @@
 <translation id="6110466548232134880">Izdavatelj certifikata <ph name="ISSUER" /> potvrdio je identitet organizacije <ph name="ORGANIZATION" /> na lokaciji <ph name="LOCALITY" />. Poslužitelj nije pružio informacije o transparentnosti certifikata.</translation>
 <translation id="6111770213269631447">transliteracija (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Dopušteno prema zadanim postavkama</translation>
-<translation id="6112929985131461002">Uređaj će Googleu automatski slati dijagnostiku i podatke o upotrebi. Tu <ph name="BEGIN_LINK1" />postavku<ph name="END_LINK1" /> nametnuo je administrator. <ph name="BEGIN_LINK2" />Saznajte više<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Promijenite postavke jezika i unosa</translation>
 <translation id="6120205520491252677">Prikvači ovu stranicu na zaslon Start...</translation>
 <translation id="6122081475643980456">Internetskom vezom upravlja proširenje</translation>
@@ -3930,7 +3928,6 @@
 <translation id="6452181791372256707">Odbaci</translation>
 <translation id="6454421252317455908">Kineski način unosa (brzi)</translation>
 <translation id="6455348477571378046">Vrsta certifikata:</translation>
-<translation id="6456234919706689841">Administrator može Googleu slati dijagnostiku i podatke o upotrebi za ovaj uređaj. Tu <ph name="BEGIN_LINK1" />postavku<ph name="END_LINK1" /> možete vidjeti ovdje. <ph name="BEGIN_LINK2" />Saznajte više<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Nastavi blokirati JavaScript</translation>
 <translation id="6458308652667395253">Upravljanje blokiranjem za JavaScript...</translation>
 <translation id="6459488832681039634">Koristi odabir za traženje</translation>
@@ -4707,7 +4704,6 @@
 <translation id="7587108133605326224">baltički</translation>
 <translation id="7589461650300748890">Polako. Pazite.</translation>
 <translation id="7589661784326793847">Pričekajte trenutak</translation>
-<translation id="7593635197364225277">Automatski sigurnosno kopirajte i vratite podatke aplikacije Play na Google disk. Tu postavku možete promijeniti u postavkama Androida u bilo kojem trenutku. <ph name="BEGIN_LINK1" />Saznajte više<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (kôd pogreške <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">U redu, uvezi</translation>
 <translation id="7600965453749440009">Nikad ne prevodi <ph name="LANGUAGE" /></translation>
@@ -5213,7 +5209,6 @@
 <translation id="8300607741108698921">1-minutno postavljanje</translation>
 <translation id="8303650969500425356">JavaScriptu omogućuje zaključavanje usmjerenja zaslona.</translation>
 <translation id="8303655282093186569">Postavke unosa za Pinyin</translation>
-<translation id="830424806940379275">Omogućuje proširenjima izradu prozora ploča koji se otvaraju izvan okvira preglednika. Prema zadanim postavkama ili ako je onemogućeno, pokušaj otvaranja ploče otvorit će skočni prozor. Ploče su u operativnim sustavima računala zastarjele i uskoro će se ukloniti.</translation>
 <translation id="8306534594034939679">Omogući podršku za Zamjenske usluge, eksperimentalnu HTTP značajku.</translation>
 <translation id="8307376264102990850">Izračunavamo vrijeme punjenja do potpune napunjenosti</translation>
 <translation id="8308179586020895837">Pitaj ako <ph name="HOST" /> želi pristupiti kameri</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 2345b69..c1647214 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -1934,6 +1934,7 @@
 <translation id="3590559774363307859">Jelszó mentve. Bármelyik böngészőből elérheti ezt és a(z) <ph name="SAVED_PASSWORDS_LINK" /> közül az összes többit.</translation>
 <translation id="3590587280253938212">gyors</translation>
 <translation id="3592260987370335752">&amp;További információ</translation>
+<translation id="3592313833691251126">Engedély a bővítmények számára olyan panelablakok létrehozására, amelyek a böngésző keretén kívül jelennek meg. Ha nincs engedélyezve, akkor a panel megnyitására irányuló kísérletek egy előugró ablakot nyitnak meg. Az alapértelmezett viselkedés szerint az engedély csak az engedélyezőlistán szereplő bővítményekre vonatkozik. Az engedélyezett viselkedés az összes bővítményre érvényes. A letiltott viselkedés minden bővítmény esetében letiltja a panelek létrehozását.</translation>
 <translation id="359283478042092570">Bejelentkezés</translation>
 <translation id="3593152357631900254">Részleges pinjin mód engedélyezése</translation>
 <translation id="3593965109698325041">Tanúsítvány nevének megkötései</translation>
@@ -2255,7 +2256,6 @@
 <translation id="4034042927394659004">Billentyűfényerő csökkentése</translation>
 <translation id="4035758313003622889">&amp;Feladatkezelő</translation>
 <translation id="4037084878352560732">Ló</translation>
-<translation id="4037102579141982963">Az eszköz automatikusan diagnosztikai és használati adatokat küld a Google-nak. Eszköze <ph name="BEGIN_LINK1" />beállításai<ph name="END_LINK1" /> között ezt bármikor módosíthatja. <ph name="BEGIN_LINK2" />További információ<ph name="END_LINK2" />.</translation>
 <translation id="4037463823853863991">A hozzáférhetőségi lap kapcsoló engedélyezése Androidon.</translation>
 <translation id="4044260751144303020">Feldolgozás fix pozíciójú elemekhez.</translation>
 <translation id="404493185430269859">Alapértelmezett keresőmotor</translation>
@@ -3228,7 +3228,6 @@
 <translation id="5439568486246921931">Ez a művelet véglegesen törli a felhasználó letöltéseit, offline fájljait és böngészési adatait. A műveletet nem lehet visszavonni.</translation>
 <translation id="544083962418256601">Parancsikonok létrehozása...</translation>
 <translation id="5441100684135434593">Vezetékes hálózat</translation>
-<translation id="5445088910157062298">Engedélyezze, hogy a Google helyszolgáltatása segítsen az alkalmazásoknak a tartózkodási hely gyors és pontos meghatározásában – így később merül le az akkumulátor. A rendszer a névtelen tartózkodásihely-adatokat olyankor is elküldi a Google-nak, amikor az alkalmazások nem futnak.</translation>
 <translation id="5448293924669608770">Hoppá, hiba történt a bejelentkezés során</translation>
 <translation id="5449588825071916739">Összes lap hozzáadása a könyvjelzőkhöz</translation>
 <translation id="5449716055534515760">A&amp;blak bezárása</translation>
@@ -3695,7 +3694,6 @@
 <translation id="6110466548232134880">A(z) <ph name="ORGANIZATION" /> identitását a(z) <ph name="LOCALITY" /> régióban <ph name="ISSUER" /> ellenőrizte. A szerver nem tette elérhetővé a tanúsítvány átláthatósági adatait.</translation>
 <translation id="6111770213269631447">Átírás (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Alapértelmezés szerint engedélyezett</translation>
-<translation id="6112929985131461002">Az eszköz automatikusan diagnosztikai és használati adatokat küld a Google-nak. Ezt a <ph name="BEGIN_LINK1" />beállítást<ph name="END_LINK1" /> rendszergazdája kényszeríti. <ph name="BEGIN_LINK2" />További információ<ph name="END_LINK2" />.</translation>
 <translation id="6116921718742659598">Nyelvi és beviteli beállítások módosítása</translation>
 <translation id="6120205520491252677">Az oldal rögzítése a kezdőképernyőn...</translation>
 <translation id="6122081475643980456">Internetkapcsolata felett más vette át az irányítást</translation>
@@ -3931,7 +3929,6 @@
 <translation id="6452181791372256707">Elutasítás</translation>
 <translation id="6454421252317455908">Kínai beviteli mód (gyors)</translation>
 <translation id="6455348477571378046">Tanúsítvány típusa:</translation>
-<translation id="6456234919706689841">Rendszergazdája dönthet úgy, hogy a rendszer küldjön diagnosztikai és használati adatokat a Google-nak az eszközzel kapcsolatban. A <ph name="BEGIN_LINK1" />beállítást<ph name="END_LINK1" /> itt tekintheti meg. <ph name="BEGIN_LINK2" />További információ<ph name="END_LINK2" />.</translation>
 <translation id="645705751491738698">A JavaScript letiltásának fenntartása</translation>
 <translation id="6458308652667395253">JavaScript letiltásának kezelése...</translation>
 <translation id="6459488832681039634">Keresés a kijelölésben</translation>
@@ -4710,7 +4707,6 @@
 <translation id="7587108133605326224">Balti</translation>
 <translation id="7589461650300748890">Hoppá! Legyen óvatosabb.</translation>
 <translation id="7589661784326793847">Egy pillanat…</translation>
-<translation id="7593635197364225277">Készítsen automatikusan biztonsági másolatot a Play-alkalmazásadatokról a Google Drive-re, és állítsa vissza onnan őket. Az Android-beállítások között bármikor módosíthatja ezt. <ph name="BEGIN_LINK1" />További információ<ph name="END_LINK1" />.</translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (hibakód: <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Rendben, importálás</translation>
 <translation id="7600965453749440009">Soha ne fordítsa le a(z) <ph name="LANGUAGE" /> nyelvű szöveget</translation>
@@ -5216,7 +5212,6 @@
 <translation id="8300607741108698921">1 perces beállítás</translation>
 <translation id="8303650969500425356">Lehetővé teszi a képernyő tájolásának zárolását a JavaScript számára.</translation>
 <translation id="8303655282093186569">Pinjin beviteli beállítások</translation>
-<translation id="830424806940379275">Engedély a bővítmények számára olyan panelablakok létrehozására, amelyek a böngésző keretén kívül jelennek meg. Alapértelmezés szerint vagy ha ki van kapcsolva, a panel megnyitására irányuló kísérletek egy előugró ablakot nyitnak meg helyette. Az asztali operációs rendszereken futó panelek elavultak, és hamarosan törlődnek.</translation>
 <translation id="8306534594034939679">Az „Alternatív szolgáltatások” kísérleti HTTP-funkció engedélyezése.</translation>
 <translation id="8307376264102990850">A teljes töltöttségig hátralévő idő kiszámítása</translation>
 <translation id="8308179586020895837">Kérdezzen rá, ha a(z) <ph name="HOST" /> hozzá szeretne férni a kamerához</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index efea736..28d5ecdd 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1933,6 +1933,7 @@
 <translation id="3590559774363307859">Sandi tersimpan. Anda dapat mengaksesnya dan semua <ph name="SAVED_PASSWORDS_LINK" /> dari browser mana pun.</translation>
 <translation id="3590587280253938212">cepat</translation>
 <translation id="3592260987370335752">&amp;Pelajari lebih lanjut</translation>
+<translation id="3592313833691251126">Mengizinkan ekstensi untuk membuat jendela panel yang dibuka di luar bingkai browser. Upaya membuka panel akan membuka munculan jika tidak diaktifkan. Perilaku default hanya mengizinkan ekstensi yang dimasukkan ke daftar putih. Perilaku yang diaktifkan adalah mengizinkan semua ekstensi. Sementara perilaku yang melarang panel untuk ekstensi apa pun dinonaktifkan.</translation>
 <translation id="359283478042092570">Masuk</translation>
 <translation id="3593152357631900254">Aktifkan mode Pinyin Fuzi</translation>
 <translation id="3593965109698325041">Kendala Nama Sertifikat</translation>
@@ -2255,7 +2256,6 @@
 <translation id="4034042927394659004">Kurangi kecerahan tombol</translation>
 <translation id="4035758313003622889">&amp;Pengelola tugas</translation>
 <translation id="4037084878352560732">Kuda</translation>
-<translation id="4037102579141982963">Perangkat ini akan otomatis mengirim data diagnosis dan penggunaan ke Google. Anda dapat mengubah setelan ini kapan saja di <ph name="BEGIN_LINK1" />setelan<ph name="END_LINK1" /> pada perangkat. <ph name="BEGIN_LINK2" />Pelajari Lebih Lanjut<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Aktifkan pengalih tab aksesibilitas untuk Android.</translation>
 <translation id="4044260751144303020">Pengomposisian untuk elemen posisi tetap.</translation>
 <translation id="404493185430269859">Mesin telusur default</translation>
@@ -3229,7 +3229,6 @@
 <translation id="5439568486246921931">Tindakan ini akan menghapus unduhan, file offline, dan data penjelajahan pengguna ini secara permanen. Tindakan tidak dapat diurungkan.</translation>
 <translation id="544083962418256601">Buat pintasan...</translation>
 <translation id="5441100684135434593">Jaringan kabel</translation>
-<translation id="5445088910157062298">Biarkan layanan lokasi Google membantu aplikasi menemukan lokasi Anda dengan cepat dan akurat, sehingga dapat menghemat penggunaan baterai. Data lokasi anonim akan dikirim ke Google, meski tidak ada aplikasi yang berjalan.</translation>
 <translation id="5448293924669608770">Ups, ada yang tidak beres dengan proses masuk</translation>
 <translation id="5449588825071916739">Bookmark Semua Tab</translation>
 <translation id="5449716055534515760">Tutup Jen&amp;dela</translation>
@@ -3695,7 +3694,6 @@
 <translation id="6110466548232134880">Identitas <ph name="ORGANIZATION" /> di <ph name="LOCALITY" /> telah diverifikasi oleh <ph name="ISSUER" />. Tidak ada informasi Transparansi Sertifikat yang diberikan oleh server.</translation>
 <translation id="6111770213269631447">Transliterasi (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Diizinkan secara default</translation>
-<translation id="6112929985131461002">Perangkat ini akan otomatis mengirim data diagnosis dan penggunaan ke Google. <ph name="BEGIN_LINK1" />Setelan<ph name="END_LINK1" /> ini diberlakukan oleh administrator. <ph name="BEGIN_LINK2" />Pelajari Lebih Lanjut<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Ubah setelan masukan dan bahasa</translation>
 <translation id="6120205520491252677">Pasang pin laman ini ke layar Awal...</translation>
 <translation id="6122081475643980456">Koneksi internet Anda sedang dikendalikan</translation>
@@ -3931,7 +3929,6 @@
 <translation id="6452181791372256707">Tolak</translation>
 <translation id="6454421252317455908">Metode masukan China (cepat)</translation>
 <translation id="6455348477571378046">Jenis Sertifikat:</translation>
-<translation id="6456234919706689841">Administrator Anda dapat memilih untuk mengirim data diagnosis dan penggunaan perangkat ini ke Google. Anda dapat melihat <ph name="BEGIN_LINK1" />setelan<ph name="END_LINK1" /> tersebut di sini. <ph name="BEGIN_LINK2" />Pelajari Lebih Lanjut<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Lanjutkan mencekal JavaScript</translation>
 <translation id="6458308652667395253">Kelola pencekalan JavaScript...</translation>
 <translation id="6459488832681039634">Gunakan Pilihan untuk Temukan</translation>
@@ -4710,7 +4707,6 @@
 <translation id="7587108133605326224">Baltik</translation>
 <translation id="7589461650300748890">Aduh, hati-hati dong.</translation>
 <translation id="7589661784326793847">Tunggu sebentar</translation>
-<translation id="7593635197364225277">Cadangkan dan pulihkan data aplikasi Play ke Google Drive secara otomatis. Anda dapat mengubahnya di Setelan Android kapan saja. <ph name="BEGIN_LINK1" />Pelajari Lebih Lanjut<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (kode kesalahan <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Oke, impor</translation>
 <translation id="7600965453749440009">Jangan pernah terjemahkan bahasa <ph name="LANGUAGE" /></translation>
@@ -5216,7 +5212,6 @@
 <translation id="8300607741108698921">penyiapan 1 menit</translation>
 <translation id="8303650969500425356">Memungkinkan javascript mengunci orientasi layar.</translation>
 <translation id="8303655282093186569">Setelan masukan Pinyin</translation>
-<translation id="830424806940379275">Memungkinkan ekstensi membuat jendela panel yang terbuka di luar bingkai browser. Secara default atau jika dinonaktifkan, upaya untuk membuka panel akan membuka munculan. Panel di OS desktop sudah tidak digunakan lagi dan akan segera dihapus.</translation>
 <translation id="8306534594034939679">Mengaktifkan dukungan untuk Layanan Alternatif, fitur HTTP eksperimental.</translation>
 <translation id="8307376264102990850">Mengisi - Menghitung waktu sampai penuh</translation>
 <translation id="8308179586020895837">Tanyakan jika <ph name="HOST" /> ingin mengakses kamera Anda</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index ba98186..bee3f01 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -1930,6 +1930,7 @@
 <translation id="3590559774363307859">Password salvata. Puoi accedere a questa password e a tutte le tue <ph name="SAVED_PASSWORDS_LINK" /> da qualsiasi browser.</translation>
 <translation id="3590587280253938212">veloce</translation>
 <translation id="3592260987370335752">&amp;Ulteriori informazioni</translation>
+<translation id="3592313833691251126">Consente alle estensioni di creare riquadri che si aprono al di fuori del frame del browser. Se tenti di aprire un riquadro senza attivare questa opzione, viene visualizzato un popup. Se lasci l'opzione predefinita, soltanto le estensioni autorizzate possono svolgere questa operazione; se attivi l'opzione, l'operazione è consentita a tutte le estensioni; se disattivi l'opzione, nessuna estensione può creare riquadri.</translation>
 <translation id="359283478042092570">Entra</translation>
 <translation id="3593152357631900254">Abilita modalità Fuzzy pinyin</translation>
 <translation id="3593965109698325041">Vincoli nomi certificati</translation>
@@ -2252,7 +2253,6 @@
 <translation id="4034042927394659004">Consente di diminuire la luminosità dei tasti</translation>
 <translation id="4035758313003622889">&amp;Task Manager</translation>
 <translation id="4037084878352560732">Cavallo</translation>
-<translation id="4037102579141982963">Questo dispositivo invierà automaticamente a Google dati di diagnostica e utilizzo. Potrai modificare questa opzione in qualsiasi momento nelle <ph name="BEGIN_LINK1" />impostazioni<ph name="END_LINK1" /> del dispositivo. <ph name="BEGIN_LINK2" />Ulteriori informazioni<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Consente di attivare il selettore di schede accessibilità per Android.</translation>
 <translation id="4044260751144303020">Composizione per elementi con posizione fissa.</translation>
 <translation id="404493185430269859">Motore di ricerca predefinito</translation>
@@ -3222,7 +3222,6 @@
 <translation id="5439568486246921931">Questa azione eliminerà definitivamente download, file offline e dati di navigazione dell'utente. L'azione non può essere annullata.</translation>
 <translation id="544083962418256601">Crea scorciatoie...</translation>
 <translation id="5441100684135434593">Rete cablata</translation>
-<translation id="5445088910157062298">Consenti al servizio di geolocalizzazione di Google di aiutare le app a rilevare la tua posizione in modo veloce e preciso, riducendo allo stesso tempo il consumo di batteria. A Google verranno inviati dati anonimi sulla posizione, anche quando non ci sono app in esecuzione.</translation>
 <translation id="5448293924669608770">Spiacenti, qualcosa è andato storto in fase di accesso</translation>
 <translation id="5449588825071916739">Aggiungi tutte le schede ai Preferiti</translation>
 <translation id="5449716055534515760">Chiu&amp;di finestra</translation>
@@ -3688,7 +3687,6 @@
 <translation id="6110466548232134880">L'identità di <ph name="ORGANIZATION" /> a <ph name="LOCALITY" /> è stata verificata da <ph name="ISSUER" />. Non sono state fornite informazioni su Certificate Transparency dal server.</translation>
 <translation id="6111770213269631447">Traslitterazione (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Consentito per impostazione predefinita</translation>
-<translation id="6112929985131461002">Questo dispositivo invierà automaticamente a Google dati di diagnostica e utilizzo. Questa <ph name="BEGIN_LINK1" />impostazione<ph name="END_LINK1" /> viene applicata dall'amministratore. <ph name="BEGIN_LINK2" />Ulteriori informazioni<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Modifica impostazioni della lingua e di immissione</translation>
 <translation id="6120205520491252677">Blocca questa pagina in schermata iniziale...</translation>
 <translation id="6122081475643980456">La tua connessione Internet è controllata</translation>
@@ -3924,7 +3922,6 @@
 <translation id="6452181791372256707">Rifiuto</translation>
 <translation id="6454421252317455908">Metodo di immissione cinese (rapido)</translation>
 <translation id="6455348477571378046">Tipo di certificato:</translation>
-<translation id="6456234919706689841">Il tuo amministratore potrebbe decidere di inviare a Google dati di diagnostica e utilizzo relativi a questo dispositivo. Puoi visualizzare questa <ph name="BEGIN_LINK1" />impostazione<ph name="END_LINK1" /> qui. <ph name="BEGIN_LINK2" />Ulteriori informazioni<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Continua a bloccare JavaScript</translation>
 <translation id="6458308652667395253">Gestisci il blocco di JavaScript...</translation>
 <translation id="6459488832681039634">Utilizza selezione per Trova</translation>
@@ -4695,7 +4692,6 @@
 <translation id="7587108133605326224">Baltico</translation>
 <translation id="7589461650300748890">Attenzione.</translation>
 <translation id="7589661784326793847">Aspetta solo un secondo</translation>
-<translation id="7593635197364225277">Effettua automaticamente il backup e il ripristino dei dati delle app Play su Google Drive. Potrai modificare questa impostazione in qualsiasi momento nelle Impostazioni Android. <ph name="BEGIN_LINK1" />Ulteriori informazioni<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (codice di errore: <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">OK, importa</translation>
 <translation id="7600965453749440009">Non tradurre mai <ph name="LANGUAGE" /></translation>
@@ -5201,7 +5197,6 @@
 <translation id="8300607741108698921">Configurazione in un minuto</translation>
 <translation id="8303650969500425356">Consente di attivare la funzione di blocco dell'orientamento dello schermo per JavaScript.</translation>
 <translation id="8303655282093186569">Impostazioni di immissione pinyin</translation>
-<translation id="830424806940379275">Consente alle estensioni di creare riquadri che si aprono al di fuori del frame del browser. Per impostazione predefinita o se provi ad aprire un riquadro senza attivare questa opzione, verrà invece aperto un popup. I riquadri nei sistemi operativi desktop sono obsoleti e saranno presto rimossi.</translation>
 <translation id="8306534594034939679">Consente di attivare il supporto di Servizi alternativi, una funzione HTTP sperimentale.</translation>
 <translation id="8307376264102990850">Calcolo del tempo per completare la ricarica</translation>
 <translation id="8308179586020895837">Chiedi conferma se <ph name="HOST" /> vuole accedere alla webcam</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 557dc64..22552761 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1928,6 +1928,7 @@
 <translation id="3590559774363307859">הסיסמה נשמרה. תוכל לגשת אליה ולכל <ph name="SAVED_PASSWORDS_LINK" /> שלך מכל דפדפן.</translation>
 <translation id="3590587280253938212">מהר</translation>
 <translation id="3592260987370335752">למידע נוסף</translation>
+<translation id="3592313833691251126">אפשר לתוספים ליצור חלונות מסוג 'חלונית', שנפתחים מחוץ למסגרת הדפדפן. אם לא אפשרת והיה ניסיון לפתוח חלונית, ייפתח חלון קופץ. ההתנהגות המוגדרת כברירת מחדל היא לאפשר רק תוספים שנכללים ברשימת ההיתרים. לאחר ההפעלה, מותרים כל התוספים. לאחר ההשבתה, החלוניות אסורות לכל התוספים.</translation>
 <translation id="359283478042092570">הזן</translation>
 <translation id="3593152357631900254">‏הפוך מצב Fuzzy-Pinyin לפעיל</translation>
 <translation id="3593965109698325041">מגבלות שם אישור </translation>
@@ -2250,7 +2251,6 @@
 <translation id="4034042927394659004">הפחת את בהירות המקשים</translation>
 <translation id="4035758313003622889">&amp;מנהל המשימות</translation>
 <translation id="4037084878352560732">סוס</translation>
-<translation id="4037102579141982963">‏המכשיר הזה ישלח באופן אוטומטי נתוני ניתוח ושימוש אל Google. ניתן לשנות זאת תמיד ב<ph name="BEGIN_LINK1" />הגדרות<ph name="END_LINK1" /> המכשיר. <ph name="BEGIN_LINK2" />למידע נוסף<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">‏הפעל את מתגי כרטיסיית הנגישות עבור Android.</translation>
 <translation id="4044260751144303020">הרכבה לרכיבי מיקום קבוע.</translation>
 <translation id="404493185430269859">מנוע החיפוש המוגדר כברירת מחדל</translation>
@@ -3225,7 +3225,6 @@
 <translation id="5439568486246921931">הפעולה הזו תמחק לצמיתות את ההורדות, את הקבצים הלא מקוונים ואת נתוני הגלישה של המשתמש הזה. לא ניתן לבטל את הפעולה הזו.</translation>
 <translation id="544083962418256601">יצירת קיצורי דרך...</translation>
 <translation id="5441100684135434593">רשת קווית</translation>
-<translation id="5445088910157062298">‏אפשר לשירות המיקום של Google לעזור ליישומים למצוא את המיקום שלך במהירות ובאופן מדויק. מצב זה יכול לצמצם את צריכת הסוללה. נתוני מיקום אנונימיים יישלחו אל Google, גם כשיישומים אינם פועלים.</translation>
 <translation id="5448293924669608770">אופס. משהו השתבש בכניסה לחשבון</translation>
 <translation id="5449588825071916739">צור סימניה לכל הכרטיסיות</translation>
 <translation id="5449716055534515760">סגור ח&amp;לון</translation>
@@ -3691,7 +3690,6 @@
 <translation id="6110466548232134880">הזהות של <ph name="ORGANIZATION" /> במיקום <ph name="LOCALITY" /> אומתה על ידי <ph name="ISSUER" />. השרת לא סיפק מידע שקיפות על האישור.</translation>
 <translation id="6111770213269631447">‏תעתוק (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">מופעל כברירת מחדל</translation>
-<translation id="6112929985131461002">‏המכשיר הזה ישלח באופן אוטומטי נתוני ניתוח ושימוש אל Google. ה<ph name="BEGIN_LINK1" />הגדרה<ph name="END_LINK1" /> הזו נאכפת על-ידי מנהל המערכת שלך. <ph name="BEGIN_LINK2" />למידע נוסף<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">שנה את הגדרות הקלט והשפה</translation>
 <translation id="6120205520491252677">הצמד דף זה למסך הפתיחה...</translation>
 <translation id="6122081475643980456">החיבור שלך לאינטרנט נשלט על ידי גורם כלשהו</translation>
@@ -3927,7 +3925,6 @@
 <translation id="6452181791372256707">דחה</translation>
 <translation id="6454421252317455908">‏שיטת קלט סינית (quick)</translation>
 <translation id="6455348477571378046">סוג אישור:</translation>
-<translation id="6456234919706689841">‏מנהל המערכת שלך עשוי לבחור לשלוח נתוני ניתוח ושימוש אל Google. באפשרותך להציג את ה<ph name="BEGIN_LINK1" />הגדרה<ph name="END_LINK1" /> הזו כאן. <ph name="BEGIN_LINK2" />למידע נוסף<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">‏המשך לחסום JavaScript</translation>
 <translation id="6458308652667395253">‏ניהול חסימת JavaScript...</translation>
 <translation id="6459488832681039634">השתמש בבחירה כדי לחפש</translation>
@@ -4697,7 +4694,6 @@
 <translation id="7587108133605326224">בלטית</translation>
 <translation id="7589461650300748890">היי! תיזהר.</translation>
 <translation id="7589661784326793847">המתן מספר רגעים</translation>
-<translation id="7593635197364225277">‏גבה ושחזר אוטומטית נתונים מ-Play ב-Google Drive. תוכל תמיד לשנות זאת בהגדרות Android. <ph name="BEGIN_LINK1" />למידע נוסף<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (קוד שגיאה <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">בסדר, יבא</translation>
 <translation id="7600965453749440009">אל תתרגם לעולם <ph name="LANGUAGE" /></translation>
@@ -5203,7 +5199,6 @@
 <translation id="8300607741108698921">הגדרה בדקה אחת</translation>
 <translation id="8303650969500425356">‏מאפשר ל-JavaScript לנעול את כיוון המסך.</translation>
 <translation id="8303655282093186569">הגדרות קלט פין-יין</translation>
-<translation id="830424806940379275">התר לתוספים ליצור חלוניות שנפתחות מחוץ למסגרת הדפדפן. כברירת מחדל, או אם תכונה זו מושבתת, ניסיון לפתוח חלונית יפתח במקום זאת חלון קופץ. חלוניות במערכות הפעלה של מחשבים שולחניים יצאו משימוש והן יוסרו בקרוב.</translation>
 <translation id="8306534594034939679">‏הפעל תמיכה לשירותים חלופיים, תכונה ניסיונית של HTTP.</translation>
 <translation id="8307376264102990850">חישוב זמן טעינה עד שמתמלא</translation>
 <translation id="8308179586020895837">שאל אם <ph name="HOST" /> רוצה לגשת למצלמה שלך</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 184a4484..19aa7395 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -1934,6 +1934,7 @@
 <translation id="3590559774363307859">パスワードを保存しました。どのブラウザからでも、このパスワードと <ph name="SAVED_PASSWORDS_LINK" />すべてにアクセスできます。</translation>
 <translation id="3590587280253938212">高速</translation>
 <translation id="3592260987370335752">詳細(&amp;L)</translation>
+<translation id="3592313833691251126">拡張機能を使用すると、ブラウザ フレームの外側に開くパネル ウィンドウが作成されます。無効の場合は、パネルを開こうとするとポップアップが表示されます。デフォルトでは、ホワイトリストに登録された拡張機能のみに対応します。有効の場合は、すべての拡張機能に対応します。無効の場合は、どの拡張機能でもパネルは作成されません。</translation>
 <translation id="359283478042092570">ログイン</translation>
 <translation id="3593152357631900254">ファジーピンイン モードを有効にする</translation>
 <translation id="3593965109698325041">証明書名の制約</translation>
@@ -2256,7 +2257,6 @@
 <translation id="4034042927394659004">キーの明るさを下げる</translation>
 <translation id="4035758313003622889">タスク マネージャ(&amp;T)</translation>
 <translation id="4037084878352560732">馬</translation>
-<translation id="4037102579141982963">この端末では診断と使用状況のデータが Google に自動送信されます。この設定は、端末の<ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />でいつでも変更できます。<ph name="BEGIN_LINK2" />詳細<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Android のユーザー補助タブ切り替えスイッチを有効にします。</translation>
 <translation id="4044260751144303020">固定位置要素に合成レイヤを作成する。</translation>
 <translation id="404493185430269859">デフォルトの検索エンジン</translation>
@@ -3230,7 +3230,6 @@
 <translation id="5439568486246921931">この操作を行うと、このユーザーのダウンロード、オフライン ファイル、閲覧履歴データが完全に削除されます。この操作は元に戻せません。</translation>
 <translation id="544083962418256601">ショートカットを作成...</translation>
 <translation id="5441100684135434593">有線ネットワーク</translation>
-<translation id="5445088910157062298">Google の位置情報サービスを有効にすると、アプリで現在地をすばやく正確に特定できるようになるため、バッテリーの消費を抑えることができます。アプリが起動していない場合でも、匿名の位置情報が Google に送信されます。</translation>
 <translation id="5448293924669608770">ログイン エラーが発生しました</translation>
 <translation id="5449588825071916739">すべてのタブをブックマークに追加する</translation>
 <translation id="5449716055534515760">ウィンドウを閉じる(&amp;D)</translation>
@@ -3696,7 +3695,6 @@
 <translation id="6110466548232134880"><ph name="ORGANIZATION" />(<ph name="LOCALITY" />)の識別情報が <ph name="ISSUER" /> によって確認されました。証明書の透明性に関する情報がサーバーから提供されませんでした。</translation>
 <translation id="6111770213269631447">文字変換(namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">デフォルトで許可</translation>
-<translation id="6112929985131461002">この端末では診断と使用状況のデータが Google に自動送信されます。この<ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />は管理者によって制御されています。<ph name="BEGIN_LINK2" />詳細<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">言語と入力の設定を変更</translation>
 <translation id="6120205520491252677">このページを起動画面に固定...</translation>
 <translation id="6122081475643980456">インターネット接続が制限されています</translation>
@@ -3932,7 +3930,6 @@
 <translation id="6452181791372256707">拒否</translation>
 <translation id="6454421252317455908">中国語の入力方法(quick)</translation>
 <translation id="6455348477571378046">証明書の種類:</translation>
-<translation id="6456234919706689841">この端末から診断と使用状況のデータを Google に送信するよう管理者が設定している可能性があります。この<ph name="BEGIN_LINK1" />設定はこちら<ph name="END_LINK1" />で確認できます。<ph name="BEGIN_LINK2" />詳細<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Javascript を引き続きブロックする</translation>
 <translation id="6458308652667395253">Javascript のブロックを管理...</translation>
 <translation id="6459488832681039634">選択部分を検索に使用</translation>
@@ -4714,7 +4711,6 @@
 <translation id="7587108133605326224">バルト語</translation>
 <translation id="7589461650300748890">データが失われる危険があります。</translation>
 <translation id="7589661784326793847">少々お待ちください</translation>
-<translation id="7593635197364225277">Google ドライブを使って Play アプリのデータのバックアップと復元を自動的に行います。この設定は Android の設定でいつでも変更できます。<ph name="BEGIN_LINK1" />詳細<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" />(エラーコード <ph name="ERROR_CODE" />)。</translation>
 <translation id="7596831438341298034">インポート</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" />を翻訳しない</translation>
@@ -5220,7 +5216,6 @@
 <translation id="8300607741108698921">1 分で設定</translation>
 <translation id="8303650969500425356">JavaScript で画面の向きをロックできるようにします。</translation>
 <translation id="8303655282093186569">Pinyin 入力設定</translation>
-<translation id="830424806940379275">ブラウザ フレームの外側で開くパネル ウィンドウの作成を拡張機能に許可します。デフォルトの場合、または無効にした場合、パネルを開こうとすると代わりにポップアップが表示されます。デスクトップ OS ではパネルはサポート終了となっており、まもなく削除されます。</translation>
 <translation id="8306534594034939679">代替サービス(試験運用版の HTTP 機能)のサポートを有効にします。</translation>
 <translation id="8307376264102990850">フル充電までの時間を計算しています</translation>
 <translation id="8308179586020895837"><ph name="HOST" /> がカメラへのアクセスを必要としているときは確認画面を表示する</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 193f034d..54bc8c8 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -1931,6 +1931,7 @@
 <translation id="3590559774363307859">ಪಾಸ್‌ವರ್ಡ್ ಉಳಿಸಲಾಗಿದೆ. ನೀವು ಯಾವುದೇ ಬ್ರೌಸರ್‌ನಿಂದ ಇದನ್ನು  ಮತ್ತು ನಿಮ್ಮ ಎಲ್ಲಾ <ph name="SAVED_PASSWORDS_LINK" /> ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಬಹುದು.</translation>
 <translation id="3590587280253938212">ವೇಗ</translation>
 <translation id="3592260987370335752">&amp;ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</translation>
+<translation id="3592313833691251126">ಬ್ರೌಸರ್ ಫ್ರೇಮ್ ಹೊರಗೆ ತೆರೆಯುವ ಫಲಕ ವಿಂಡೋಗಳನ್ನು ರಚಿಸಲು ವಿಸ್ತರಣೆಗಳಿಗೆ ಅನುಮತಿಸಿ. ಸಕ್ರಿಯಗೊಳಿಸದೇ ಇದ್ದರೆ, ಫಲಕವನ್ನು ತೆರೆಯುವ ಪ್ರಯತ್ನಗಳನ್ನು ಮಾಡಿದಾಗ ಬದಲಿಗೆ ಪಾಪ್ ಅಪ್ ತೆರೆಯುತ್ತದೆ. ಡಿಫಾಲ್ಟ್ ನಡವಳಿಕೆಯು ಅನುಮತಿ ಪಟ್ಟಿಗೊಳಿಸಿದ ವಿಸ್ತರಣೆಗಳನ್ನು ಮಾತ್ರ ಅನುಮತಿಸಲು ಆಗಿದೆ. ಸಕ್ರಿಯಗೊಳಿಸಿದ ನಡವಳಿಕೆಯು ಎಲ್ಲಾ ವಿಸ್ತರಣೆಗಳನ್ನು ಅನುಮತಿಸಲು ಆಗಿದೆ. ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ ನಡವಳಿಕೆಯು ಯಾವುದೇ ವಿಸ್ತರಣೆಗೆ ಫಲಕಗಳನ್ನು ಅನುಮತಿಸದಿರಲು ಆಗಿದೆ.</translation>
 <translation id="359283478042092570">Enter</translation>
 <translation id="3593152357631900254">ಅಸ್ಪಷ್ಟ -ಪಿನ್‌ಯಿನ್‌ ಮೋಡ್‌ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="3593965109698325041">ಪ್ರಮಾಣಪತ್ರ ಹೆಸರು ನಿರ್ಬಂಧಗಳು</translation>
@@ -2253,7 +2254,6 @@
 <translation id="4034042927394659004">ಕೀಲಿ ಪ್ರಖರತೆ ಕಡಿಮೆ ಮಾಡಿ</translation>
 <translation id="4035758313003622889">&amp;ಕಾರ್ಯ ನಿರ್ವಾಹಕ</translation>
 <translation id="4037084878352560732">ಕುದುರೆ</translation>
-<translation id="4037102579141982963">ಈ ಸಾಧನವು ಡಯಗ್ನೊಸ್ಟಿಕ್ ಮತ್ತು ಬಳಕೆಯ ಡೇಟಾವನ್ನು Google ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸುತ್ತದೆ. ನಿಮ್ಮ ಸಾಧನದ <ph name="BEGIN_LINK1" />ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು<ph name="END_LINK1" /> ನೀವು ಯಾವುದೇ ಸಮಯದಲ್ಲಾದರೂ ಬದಲಾಯಿಸಬಹುದು. <ph name="BEGIN_LINK2" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Android ಗಾಗಿ ಪ್ರವೇಶಿಸುವಿಕೆ ಟ್ಯಾಬ್ ಸ್ವಿಚರ್ ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="4044260751144303020">ಹೊಂದಿಸಲಾದ ಸ್ಥಾನ ಅಂಶಗಳಿಗಾಗಿ ಸಂಯೋಜಿಸಲಾಗುತ್ತಿದೆ.</translation>
 <translation id="404493185430269859">ಡೀಫಾಲ್ಟ್ ಹುಡುಕಾಟ ಎಂಜಿನ್</translation>
@@ -3232,7 +3232,6 @@
 <translation id="5439568486246921931">ಈ ಕ್ರಿಯೆಯು ಈ ಬಳಕೆದಾರರ ಡೌನ್‌ಲೋಡ್‌ಗಳು, ಆಫ್‌ಲೈನ್ ಫೈಲ್‌ಗಳು ಮತ್ತು ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ಖಾಯಂ ಆಗಿ ಅಳಿಸುತ್ತದೆ. ಇದನ್ನು ರದ್ದು ಮಾಡಲಾಗುವುದಿಲ್ಲ.</translation>
 <translation id="544083962418256601">ಶಾರ್ಟ್‌ಕಟ್‌ಗಳನ್ನು ರಚಿಸಿ...</translation>
 <translation id="5441100684135434593">ತಂತಿಯ ನೆಟ್‌ವರ್ಕ್</translation>
-<translation id="5445088910157062298">ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ತ್ವರಿತವಾಗಿ ಮತ್ತು ನಿಖರವಾಗಿ ಹುಡುಕುವುದಕ್ಕಾಗಿ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಸಹಾಯ ಮಾಡಲು Google ನ ಸ್ಥಳ ಸೇವೆಗೆ ಅನುಮತಿಸಿ, ಇದು ಬ್ಯಾಟರಿ ಬಳಕೆಯನ್ನು ಕಡಿಮೆ ಮಾಡಬಹುದು. ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ರನ್ ಆಗದೇ ಇರುವಾಗಲೂ ಅನಾಮಧೇಯ ಸ್ಥಳ ಡೇಟಾವನ್ನು Google ಗೆ ಕಳುಹಿಸಲಾಗುತ್ತದೆ.</translation>
 <translation id="5448293924669608770">ಓಹ್, ಸೈನ್ ಇನ್ ಮಾಡುವಲ್ಲಿ ಏನೋ ತಪ್ಪು ಸಂಭವಿಸಿದೆ</translation>
 <translation id="5449588825071916739">ಎಲ್ಲಾ ಟ್ಯಾಬ್‌ಗಳನ್ನು ಬುಕ್‌ಮಾರ್ಕ್ ಮಾಡಿ</translation>
 <translation id="5449716055534515760">&amp;ವಿಂಡೋ ಮುಚ್ಚಿರಿ</translation>
@@ -3699,7 +3698,6 @@
 <translation id="6110466548232134880"><ph name="LOCALITY" /> ಯಲ್ಲಿರುವ <ph name="ORGANIZATION" /> ಗುರುತನ್ನು <ph name="ISSUER" /> ಮೂಲಕ ಪರಿಶೀಲಿಸಲಾಗಿದೆ. ಸರ್ವರ್ ಮೂಲಕ ಯಾವುದೇ ಪ್ರಮಾಣಪತ್ರ ಪಾರದರ್ಶಕತೆ ಮಾಹಿತಿಯನ್ನು ಪೂರೈಸಲಾಗಿಲ್ಲ.</translation>
 <translation id="6111770213269631447">ಲಿಪ್ಯಂತರಣ (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">ಡಿಫಾಲ್ಟ್ ಮೂಲಕ ಅನುಮತಿಸಲಾಗಿದೆ</translation>
-<translation id="6112929985131461002">ಈ ಸಾಧನವು Google ಗೆ ಡಯಗ್ನೊಸ್ಟಿಕ್ ಮತ್ತು ಬಳಕೆಯ ಡೇಟಾವನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸುತ್ತದೆ. ಈ <ph name="BEGIN_LINK1" />ಸೆಟ್ಟಿಂಗ್<ph name="END_LINK1" /> ಅನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಜಾರಿಗೊಳಿಸಿದ್ದಾರೆ. <ph name="BEGIN_LINK2" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">ಭಾಷೆ ಹಾಗೂ ಇನ್‌ಪುಟ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಿ</translation>
 <translation id="6120205520491252677">ಆರಂಭಿಕ ಪರದೆಗೆ ಈ ಪುಟವನ್ನು ಪಿನ್ ಮಾಡಿ...</translation>
 <translation id="6122081475643980456">ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ನಿಯಂತ್ರಿಸಲಾಗುತ್ತಿದೆ</translation>
@@ -3934,7 +3932,6 @@
 <translation id="6452181791372256707">ತಿರಸ್ಕರಿಸಿ</translation>
 <translation id="6454421252317455908">ಚೈನೀಸ್ ಇನ್‌ಪುಟ್ ವಿಧಾನ (ಶೀಘ್ರ)</translation>
 <translation id="6455348477571378046">ಪ್ರಮಾಣಪತ್ರದ ಪ್ರಕಾರ:</translation>
-<translation id="6456234919706689841">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು Google ಗೆ ಈ ಸಾಧನಗಳಿಂದ ಡಯಗ್ನೊಸ್ಟಿಕ್ ಮತ್ತು ಬಳಕೆಯ ಡೇಟಾವನ್ನು ಕಳುಹಿಸಲು ಆಯ್ಕೆಮಾಡಬಹುದು. ನೀವು ಇಲ್ಲಿ ಈ <ph name="BEGIN_LINK1" />ಸೆಟ್ಟಿಂಗ್‌<ph name="END_LINK1" /> ಅನ್ನು ವೀಕ್ಷಿಸಬಹುದು. <ph name="BEGIN_LINK2" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">JavaScript ನಿರ್ಬಂಧಿಸುವಿಕೆಯನ್ನು ಮುಂದುವರಿಸಿ</translation>
 <translation id="6458308652667395253">JavaScript ನಿರ್ಬಂಧಿಸುವಿಕೆಯನ್ನು ನಿರ್ವಹಿಸಿ...</translation>
 <translation id="6459488832681039634">ಹುಡುಕಲು ಆಯ್ಕೆಯನ್ನು ಬಳಸಿ</translation>
@@ -4715,7 +4712,6 @@
 <translation id="7587108133605326224">ಬಾಲ್ಟಿಕ್</translation>
 <translation id="7589461650300748890">ವಾಹ್, ಇಲ್ಲ. ಜಾಗರೂಕರಾಗಿರಿ.</translation>
 <translation id="7589661784326793847">ಸ್ವಲ್ಪ ಕಾಯಿರಿ</translation>
-<translation id="7593635197364225277">Play ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವನ್ನು Google ಡ್ರೈವ್‌ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಬ್ಯಾಕ್ ಅಪ್ ಮಾಡಿ ಮತ್ತು ಮರುಸ್ಥಾಪಿಸಿ. ಇದನ್ನು ನೀವು ಯಾವ ಸಮಯದಲ್ಲಾದರೂ Android ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು. <ph name="BEGIN_LINK1" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (ದೋಷ ಕೋಡ್ <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">ಸರಿ, ಆಮದು ಮಾಡು</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" /> ಅನ್ನು ಎಂದಿಗೂ ಅನುವಾದಿಸಬೇಡ</translation>
@@ -5218,7 +5214,6 @@
 <translation id="8300607741108698921">1-ನಿಮಿಷದ ಸೆಟಪ್‌</translation>
 <translation id="8303650969500425356">ಪರದೆ ಓರಿಯಂಟೇಶನ್ ಲಾಕ್ ಮಾಡಲು javascript ಗೆ ಅನುಮತಿಸುತ್ತದೆ.</translation>
 <translation id="8303655282093186569">ಪಿನ್‌ಇನ್ ಇನ್‌ಪುಟ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
-<translation id="830424806940379275">ಬ್ರೌಸರ್ ಫ್ರೇಮ್ ಹೊರಗೆ ತೆರೆಯುವ ಫಲಕ ವಿಂಡೋಗಳನ್ನು ರಚಿಸಲು ವಿಸ್ತರಣೆಗಳಿಗೆ ಅನುಮತಿಸಿ. ಡಿಫಾಲ್ಟ್ ಆಗಿ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ, ಪ್ಯಾನಲ್ ತೆರೆಯುವ ಪ್ರಯತ್ನ ಮಾಡಿದಾಗ, ಬದಲಿಗೆ ಪಾಪ್ ಅಪ್ ತೆರೆಯುತ್ತದೆ.  ಡೆಸ್ಕ್‌ಟಾಪ್ OS ಗಳಲ್ಲಿನ ಪ್ಯಾನಲ್‌ಗಳನ್ನು ತಡೆಹಿಡಿಯಲಾಗಿದೆ ಮತ್ತು ಅವುಗಳನ್ನು ಶೀಘ್ರವೇ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ.</translation>
 <translation id="8306534594034939679">ಪ್ರಾಯೋಗಿಕ HTTP ವೈಶಿಷ್ಟ್ಯವಾದ ಪರ್ಯಾಯ ಸೇವೆಗಳಿಗೆ ಬೆಂಬಲವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="8307376264102990850">ಭರ್ತಿ ಮಾಡುವ ತನಕದ ಸಮಯದ ಎಣಿಕೆಗೆ ಚಾರ್ಜ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
 <translation id="8308179586020895837">ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಪ್ರವೇಶಿಸಲು <ph name="HOST" /> ಬಯಸುತ್ತದೆಯೇ ಎಂಬುದನ್ನು ಕೇಳಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index edcb017..1ae77700 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -34,6 +34,7 @@
 <translation id="1047431265488717055">링크 텍스트 복사(&amp;X)</translation>
 <translation id="1047726139967079566">페이지 북마크...</translation>
 <translation id="1047956942837015229"><ph name="COUNT" />개 항목 삭제 중...</translation>
+<translation id="1048286738600630630">디스플레이</translation>
 <translation id="1048597748939794622">모든 레이어에 사용하도록 강제 설정합니다.</translation>
 <translation id="1049795001945932310">언어 설정(&amp;L)</translation>
 <translation id="1049926623896334335">Word 문서</translation>
@@ -98,6 +99,7 @@
 <translation id="1125520545229165057">드보락(슈)</translation>
 <translation id="1128109161498068552">사이트에서 시스템 전용 메시지를 사용하여 MIDI 기기에 액세스하도록 허용하지 않음</translation>
 <translation id="1128128132059598906">EAP-TTLS</translation>
+<translation id="1128591060186966949">검색 엔진 수정</translation>
 <translation id="1128987120443782698">저장장치 용량이 <ph name="DEVICE_CAPACITY" />입니다. 용량이 4GB 이상인 SD 카드나 USB 메모리를 삽입하세요.</translation>
 <translation id="1132956125173653312">Chromebook에서 Android 앱 사용 설정</translation>
 <translation id="1137135726305341424">domContentLoaded 및 모든 리소스 로드는 domContentLoaded(메인 프레임 및 동일한 원래의 iframe) 전에 시작됩니다.</translation>
@@ -107,6 +109,7 @@
 <translation id="1145292499998999162">플러그인 차단됨</translation>
 <translation id="1146204723345436916">HTML 파일에서 북마크 가져오기...</translation>
 <translation id="1148624853678088576">모든 설정이 완료되었습니다.</translation>
+<translation id="1149401351239820326">만료 월</translation>
 <translation id="1151972924205500581">비밀번호를 입력해야 합니다.</translation>
 <translation id="1154228249304313899">다음 페이지:</translation>
 <translation id="115443833402798225">한글 안마태 키보드</translation>
@@ -118,6 +121,7 @@
 <translation id="1162223735669141505">이 기능을 사용하려면 <ph name="BEGIN_LINK" />Native Client 플러그인<ph name="END_LINK" />을 사용 설정해야 합니다.</translation>
 <translation id="1163361280229063150">{NUM_DOWNLOAD,plural, =1{현재 다운로드가 진행 중입니다. 다운로드를 취소하고 시크릿 모드를 종료하시겠습니까?}other{현재 #개의 다운로드가 진행 중입니다. 다운로드를 취소하고 시크릿 모드를 종료하시겠습니까?}}</translation>
 <translation id="1163931534039071049">프레임 소스 보기(&amp;V)</translation>
+<translation id="1164674268730883318"><ph name="DEVICE_TYPE" />에서 Smart Lock을 사용 중지하시겠습니까?</translation>
 <translation id="1165039591588034296">오류</translation>
 <translation id="1166212789817575481">오른쪽 탭 닫기</translation>
 <translation id="1166359541137214543">ABC</translation>
@@ -135,6 +139,7 @@
 <translation id="1181037720776840403">삭제</translation>
 <translation id="1183083053288481515">관리자 제공 인증서 사용</translation>
 <translation id="1183237619868651138">로컬 캐시에 <ph name="EXTERNAL_CRX_FILE" />을(를) 설치할 수 없습니다.</translation>
+<translation id="1183917921992319637">PIN 구성</translation>
 <translation id="1185924365081634987"><ph name="GUEST_SIGNIN_LINK_START" />손님으로 로그인<ph name="GUEST_SIGNIN_LINK_END" />하여 네트워크 오류를 수정할 수도 있습니다.</translation>
 <translation id="1187722533808055681">유휴 상태 해제</translation>
 <translation id="1188807932851744811">로그가 업로드되지 않았습니다.</translation>
@@ -200,6 +205,7 @@
 <translation id="1277908057200820621">기기 목록 보기</translation>
 <translation id="1278049586634282054">조회 내용 검사:</translation>
 <translation id="1278813325885878377">헝가리어 QWERTY 키보드</translation>
+<translation id="1284355409890639046">블루투스 기기 페어링</translation>
 <translation id="1285320974508926690">이 사이트 번역 안함</translation>
 <translation id="1285484354230578868">Google 드라이브 계정에 데이터 저장</translation>
 <translation id="1290223615328246825">자동 로그인 실패</translation>
@@ -305,6 +311,7 @@
 <translation id="143027896309062157">컴퓨터 및 방문하는 웹사이트의 전체 데이터 조회 및 변경</translation>
 <translation id="1430915738399379752">인쇄</translation>
 <translation id="1432581352905426595">검색엔진 관리</translation>
+<translation id="1433811987160647649">액세스하기 전에 확인</translation>
 <translation id="1434696352799406980">시작 페이지, 새 탭 페이지, 검색 엔진, 고정 탭이 재설정됩니다. 또한 모든 확장 프로그램이 사용 중지되고 쿠키와 같은 임시 데이터가 삭제됩니다. 북마크, 기록, 저장된 비밀번호는 삭제되지 않습니다.</translation>
 <translation id="1434886155212424586">홈페이지가 새 탭 페이지입니다.</translation>
 <translation id="1435550882135542937">확장 프로그램 툴바 재설계</translation>
@@ -340,6 +347,7 @@
 <translation id="14720830734893704">가상 키보드 지원을 사용합니다.</translation>
 <translation id="1474079335130556426">Push API에 백그라운드 모드를 사용 설정합니다. 이렇게 하면 Push API에서 Chrome이 필요할 때 마지막 창이 닫힌 후에도 Chrome이 계속 실행되고 OS 시작 시 Chrome을 실행합니다.</translation>
 <translation id="1474339897586437869">'<ph name="FILENAME" />'이(가) 업로드되지 않았습니다. Google 드라이브에 충분한 여유 공간이 없습니다.</translation>
+<translation id="1475502736924165259">모든 기타 카테고리에 맞지 않는 인증서가 등록되어 있습니다.</translation>
 <translation id="1476607407192946488">언어 설정(&amp;L)</translation>
 <translation id="1476949146811612304"><ph name="BEGIN_LINK" />검색주소창<ph name="END_LINK" />에서 검색할 때 사용할 검색엔진을
         설정합니다.</translation>
@@ -377,6 +385,7 @@
     <ph name="LINK_START" />프록시 설정<ph name="LINK_END" />을 조정하세요.</translation>
 <translation id="1510907582379248592"><ph name="ORIGIN" />에 저장된 비밀번호:</translation>
 <translation id="1511004689539562549">내 카메라에 대한 모든 사이트의 액세스를 허용 안 함</translation>
+<translation id="1511388193702657997">웹 비밀번호를 저장하도록 제안</translation>
 <translation id="1511623662787566703"><ph name="USER_EMAIL_ADDRESS" />(으)로 로그인되어 있습니다. Google 대시보드를 통해 동기화가 중지되었습니다.</translation>
 <translation id="1514215615641002767">바탕화면에 추가</translation>
 <translation id="1514298457297359873">애플리케이션이 NaCl 소켓 API를 사용할 수 있도록 합니다. NaCl 플러그인을 테스트하는 목적으로만 사용합니다.</translation>
@@ -398,6 +407,7 @@
 <translation id="1529968269513889022">지난 1주</translation>
 <translation id="1531004739673299060">애플리케이션 창</translation>
 <translation id="1531865825384516080">세이프서치 URL 신고</translation>
+<translation id="1532687502998799885">PIN은 최소한 4자리여야 합니다.</translation>
 <translation id="1532697124104874386">가상 키보드의 스마트 배포를 사용 또는 사용 중지합니다.</translation>
 <translation id="1533897085022183721"><ph name="MINUTES" /> 미만 남았습니다.</translation>
 <translation id="1533920822694388968">TV 정렬</translation>
@@ -426,6 +436,7 @@
 <translation id="1558988940633416251">UI 텍스트에 교차 플랫폼 HarfBuzz 레이아웃 엔진을 사용 설정합니다. 웹 콘텐츠에는 영향을 주지 않습니다.</translation>
 <translation id="1559235587769913376">유니코드 문자 입력</translation>
 <translation id="1561092721008294962">UI 텍스트용 HarfBuzz</translation>
+<translation id="1566049601598938765">웹사이트</translation>
 <translation id="1566958206723629112">Flash 및 PDF</translation>
 <translation id="1567723158593978621">사용 설정하면 브라우저에 로그인할 때 새로운 비밀번호 분리형 GAIA 로그인 절차를 사용합니다.</translation>
 <translation id="1567993339577891801">자바스크립트 콘솔</translation>
@@ -483,6 +494,7 @@
 <translation id="1645228020260124617"><ph name="PRECENTAGE" />%</translation>
 <translation id="1645870377513700713">기본 알림을 사용합니다.</translation>
 <translation id="1646136617204068573">헝가리어 키보드</translation>
+<translation id="1646982517418478057">이 인증서를 암호화하려면 비밀번호를 입력하세요.</translation>
 <translation id="164729547906544836">타밀어 키보드(itrans)</translation>
 <translation id="164814987133974965">관리 대상 사용자는 관리자가 정한 범위 내에서 웹을 탐색할 수 있습니다. 관리 대상 사용자의 관리자는 Chrome에서 다음을 수행할 수 있습니다.
     특정 웹사이트 <ph name="BEGIN_BOLD" />허용 또는 금지<ph name="END_BOLD" />
@@ -510,6 +522,7 @@
 <translation id="1673103856845176271">보안 상의 이유로 파일에 액세스하지 못했습니다.</translation>
 <translation id="1675023460278456180">머티리얼 하이브리드</translation>
 <translation id="167832068858235403">볼륨 작게</translation>
+<translation id="1678331212993975953">사이트 세부정보</translation>
 <translation id="1679068421605151609">개발자 도구</translation>
 <translation id="1681120471812444678">프린터 추가 설정…</translation>
 <translation id="1682324559341535203"><ph name="DEVICE_TYPE" /> 등록</translation>
@@ -531,11 +544,13 @@
 <translation id="1699395855685456105">하드웨어 개정:</translation>
 <translation id="1700199471143028312">관리자가 관리 대상 사용자를 생성하는 것을 허용하지 않습니다.</translation>
 <translation id="1701062906490865540">이 사용자 삭제</translation>
+<translation id="1702294042233267824">검색주소창에서 검색할 때 사용된 검색 엔진</translation>
 <translation id="1702534956030472451">서유럽어</translation>
 <translation id="1707463636381878959">다른 사용자와 네트워크 공유</translation>
 <translation id="1708199901407471282">새 탭 페이지에서 추천 웹페이지를 여는 경우 이미 추천 항목 탭이 열려 있다면 새 탭에서 추천 항목을 여는 대신 해당 탭으로 전환합니다.</translation>
 <translation id="1708338024780164500">(비활성)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" />(ID: <ph name="ID_PH" />)</translation>
+<translation id="1709106626015023981"><ph name="WIDTH" />x<ph name="HEIGHT" />(기본)</translation>
 <translation id="1711973684025117106">압축에 실패했습니다. 예기치 않은 오류: $1</translation>
 <translation id="1715941336038158809">사용자 이름 또는 비밀번호가 잘못되었습니다.</translation>
 <translation id="1717733954209022288">Google Payments 카드 저장 체크박스</translation>
@@ -630,6 +645,7 @@
 <translation id="1852799913675865625">파일을 읽는 중에 오류가 발생했습니다. <ph name="ERROR_TEXT" /></translation>
 <translation id="1856715684130786728">위치 추가...</translation>
 <translation id="1857166538520940818">파일 첨부:</translation>
+<translation id="1858585891038687145">소프트웨어 제작자를 식별하기 위해 이 인증서를 신뢰합니다.</translation>
 <translation id="1859234291848436338">쓰기 방향</translation>
 <translation id="1864111464094315414">로그인</translation>
 <translation id="1864676585353837027">파일 공유 방법을 변경하세요.</translation>
@@ -661,6 +677,7 @@
 <translation id="1909880997794698664">이 기기를 영구적으로 키오스크 모드로 유지하시겠습니까?</translation>
 <translation id="1910572251697014317">Google에서 이 휴대전화로 알림을 보냈습니다. 블루투스를 사용하면 휴대전화가 30미터 이상 떨어진 곳에서도 <ph name="DEVICE_TYPE" />을(를) 잠금 해제 상태로 계속 유지할 수 있습니다. 이것이 문제가 될 수 있는 경우 &lt;a&gt;임시로 이 기능을 사용 중지&lt;/a&gt;할 수 있습니다.</translation>
 <translation id="1910721550319506122">반갑습니다!</translation>
+<translation id="1911073860190924580">비밀번호만 사용</translation>
 <translation id="1916502483199172559">기본 빨간색 아바타</translation>
 <translation id="191688485499383649">'<ph name="DEVICE_NAME" />'에 연결하는 중에 알 수 없는 오류가 발생했습니다.</translation>
 <translation id="1918141783557917887">작게(&amp;S)</translation>
@@ -722,6 +739,8 @@
 <translation id="2007404777272201486">문제 신고...</translation>
 <translation id="2011110593081822050">웹 작업자: <ph name="WORKER_NAME" /></translation>
 <translation id="2012766523151663935">펌웨어 버전</translation>
+<translation id="2013984794184160106">15</translation>
+<translation id="2016430552235416146">기본</translation>
 <translation id="2017052954220678795">스레드된 GPU 래스터화</translation>
 <translation id="2017334798163366053">성능 데이터 수집 사용 중지</translation>
 <translation id="2018352199541442911">죄송합니다. 연결하신 외부 저장장치는 현재 지원되지 않습니다.</translation>
@@ -738,6 +757,7 @@
 <translation id="204497730941176055">Microsoft Certificate Template Name</translation>
 <translation id="2045969484888636535">쿠키 계속 차단</translation>
 <translation id="204622017488417136">기기가 이전에 설치된 버전의 Chrome으로 돌아갑니다. 사용자 계정과 로컬 데이터가 모두 삭제됩니다. 이 작업은 취소할 수 없습니다.</translation>
+<translation id="2047962517134476164">계속하려면 로그인을 확인하세요.</translation>
 <translation id="2048182445208425546">네트워크 트래픽에 액세스</translation>
 <translation id="2049137146490122801">관리자가 시스템의 로컬 파일에 대한 액세스를 차단했습니다.</translation>
 <translation id="204914487372604757">바로가기 만들기</translation>
@@ -823,10 +843,12 @@
 <translation id="2155931291251286316"><ph name="HOST" />의 팝업을 항상 허용</translation>
 <translation id="215753907730220065">전체화면 종료</translation>
 <translation id="2157875535253991059">페이지가 현재 전체화면으로 전환되었습니다.</translation>
+<translation id="2161553589239083578">PIN을 확인하세요.</translation>
 <translation id="216169395504480358">Wi-Fi 추가</translation>
 <translation id="2163470535490402084"><ph name="DEVICE_TYPE" /> 기기에 로그인하려면 인터넷에 연결하세요.</translation>
 <translation id="2164862903024139959">베트남어 키보드(TCVN)</translation>
 <translation id="2165453356262207111">Smart Lock(베타)</translation>
+<translation id="2166369534954157698">재빠른 갈색 여우가 게으른 개를 뛰어넘습니다.</translation>
 <translation id="2167276631610992935">자바스크립트</translation>
 <translation id="2168214441502403371">페르시아어 키보드</translation>
 <translation id="2168725742002792683">파일 확장명</translation>
@@ -843,6 +865,7 @@
 <translation id="2190355936436201913">(비어있음)</translation>
 <translation id="2190469909648452501">감소</translation>
 <translation id="2192505247865591433">웹 브라우저</translation>
+<translation id="2193365732679659387">신뢰 설정</translation>
 <translation id="2195729137168608510">이메일 보호</translation>
 <translation id="2198315389084035571">중국어(간체)</translation>
 <translation id="2199829153606285995">가상 키보드에서 음성 입력</translation>
@@ -860,9 +883,11 @@
 <translation id="2213819743710253654">페이지 작업</translation>
 <translation id="2215277870964745766">환영합니다. 언어와 네트워크를 설정하세요.</translation>
 <translation id="2217501013957346740">이름 만들기 -</translation>
+<translation id="2218019600945559112">마우스 및 터치패드</translation>
 <translation id="2218515861914035131">일반 텍스트로 붙여넣기</translation>
 <translation id="2218947405056773815">죄송합니다. <ph name="API_NAME" />에 예기치 못한 문제가 발생했습니다.</translation>
 <translation id="2220529011494928058">문제 신고</translation>
+<translation id="2220572644011485463">PIN 또는 비밀번호</translation>
 <translation id="2221240591176106785">비인증 새로고침 사용</translation>
 <translation id="2222641695352322289">실행취소하려면 <ph name="IDS_SHORT_PRODUCT_OS_NAME" />을(를) 다시 설치해야 합니다.</translation>
 <translation id="2224444042887712269"><ph name="OWNER_EMAIL" />의 설정입니다.</translation>
@@ -906,6 +931,7 @@
 <translation id="2258195278080713720">안정적인 최신 자바스크립트 기능</translation>
 <translation id="2260567344816042527">다른 네트워크에 연결되지 않은 경우 Chrome에서 모바일 데이터를 사용합니다.</translation>
 <translation id="2260654768907572711">브라우저 플러그인</translation>
+<translation id="2262477216570151239">반복 전 지연</translation>
 <translation id="226269835214688456">Chromebook용 Smart Lock을 사용 중지하면 휴대전화를 사용하여 Chrome 기기를 잠금 해제할 수 없으며 비밀번호를 입력해야 합니다.</translation>
 <translation id="2262903407161221567">특정 UI 구성요소는 터치 환경에서 시각적인 의견으로 표시됩니다.</translation>
 <translation id="2263497240924215535">(사용 중지됨)</translation>
@@ -919,6 +945,7 @@
 <translation id="2273562597641264981">운영자:</translation>
 <translation id="2275694568175246751">오른쪽에서 왼쪽으로</translation>
 <translation id="2276503375879033601">앱 추가</translation>
+<translation id="2277255602909579701">모든 쿠키 및 사이트 데이터</translation>
 <translation id="2278098630001018905">다른 배송지 주소 사용</translation>
 <translation id="2278562042389100163">브라우저 창 열기</translation>
 <translation id="2278988676849463018">칸나다어 키보드(음역)</translation>
@@ -959,6 +986,7 @@
 <translation id="2339120501444485379">새 이름 입력</translation>
 <translation id="2339641773402824483">업데이트 확인 중...</translation>
 <translation id="2342060820861917889">길게(2000ms)</translation>
+<translation id="2342282706041269970">로그아웃한 뒤 다시 로그인해 보세요.</translation>
 <translation id="23434688402327542">카자흐어 키보드</translation>
 <translation id="2344028582131185878">자동 다운로드</translation>
 <translation id="2344262275956902282">- 및 = 키를 사용하여 후보 목록을 페이지에 표시</translation>
@@ -1073,6 +1101,7 @@
 <translation id="2494837236724268445">구자라트어 키보드(음역)</translation>
 <translation id="2496180316473517155">인터넷 사용 기록</translation>
 <translation id="2496540304887968742">기기 용량이 4GB 이상이어야 합니다.</translation>
+<translation id="2497229222757901769">마우스 속도</translation>
 <translation id="249819058197909513">이 앱에 대해 다시 경고하지 않음</translation>
 <translation id="2498436043474441766">프린터 추가</translation>
 <translation id="2498539833203011245">최소화</translation>
@@ -1147,6 +1176,7 @@
 <translation id="2587203970400270934">운영자 코드:</translation>
 <translation id="2587922270115112871">관리 대상 사용자를 생성해도 Google 계정이 생성되지 않으며, 해당 사용자의 설정
     및 데이터는 Chrome 동기화를 통해 다른 기기에 동기화되지 않습니다. 관리 대상 사용자는 이 기기에만 적용됩니다.</translation>
+<translation id="25912682830130293">보고된 설정 보기</translation>
 <translation id="2594049137847833442">인터넷 사용 기록 삭제 대화상자의 중요한 사이트 옵션</translation>
 <translation id="2594056015203442344">사용하도록 설정하면 탭 표시줄의 오디오 표시기가 탭 오디오 음소거 컨트롤의 기능도 겸하게 됩니다. 또한 선택한 여러 탭을 빠르게 음소거할 수 있도록 탭 컨텍스트 메뉴에 명령어도 추가합니다.</translation>
 <translation id="259421303766146093">축소</translation>
@@ -1199,6 +1229,7 @@
 <translation id="2665394472441560184">새 단어 추가</translation>
 <translation id="2665717534925640469">페이지가 현재 전체화면으로 전환되었으며 마우스 커서를 사용 중지했습니다.</translation>
 <translation id="2665919335226618153">포맷 중에 오류가 발생했습니다.</translation>
+<translation id="2667463864537187133">맞춤법 검사 관리</translation>
 <translation id="2668079306436607263">오버스크롤 기록 탐색</translation>
 <translation id="2670102641511624474"><ph name="APP_NAME" />이(가) Chrome 탭을 공유합니다.</translation>
 <translation id="2670965183549957348">츄잉(Chewing) 입력 방법</translation>
@@ -1221,7 +1252,9 @@
 <translation id="2694026874607847549">쿠키 1개</translation>
 <translation id="2696862700756109583">전체 화면 예외</translation>
 <translation id="2702540957532124911">키보드:</translation>
+<translation id="2704142793323512908">기기의 기존 데이터도 삭제합니다.</translation>
 <translation id="2704184184447774363">Microsoft Document Signing</translation>
+<translation id="270516211545221798">터치패드 속도</translation>
 <translation id="2706892089432507937">USB 기기</translation>
 <translation id="2707024448553392710">구성요소 다운로드 중</translation>
 <translation id="270921614578699633">평균 이동</translation>
@@ -1400,6 +1433,7 @@
 <translation id="2902734494705624966">영어(미국) 확장</translation>
 <translation id="2903493209154104877">주소</translation>
 <translation id="290444763029043472"><ph name="DOWNLOADED_AMOUNT_MB" />MB/<ph name="TOTAL_AMOUNT_MB" />MB 다운로드됨</translation>
+<translation id="2904456025988372123">사이트에서 첫 파일 다운로드 후 자동으로 파일을 다운로드하려고 할 때 확인</translation>
 <translation id="2907619724991574506">시작 URL</translation>
 <translation id="2908162660801918428">디렉토리별 미디어 갤러리 추가</translation>
 <translation id="2908789530129661844">화면 축소</translation>
@@ -1446,6 +1480,7 @@
 <translation id="2963151496262057773">다음 플러그인에서 응답이 없습니다. <ph name="PLUGIN_NAME" />을(를) 중단하시겠습니까?</translation>
 <translation id="2963783323012015985">터키어 키보드</translation>
 <translation id="2964193600955408481">Wi-Fi 사용 안 함</translation>
+<translation id="2964313852984024865">수정</translation>
 <translation id="2966459079597787514">스웨덴어 키보드</translation>
 <translation id="2966598748518102999">Google에 'Ok Google'과 몇 초 전의 음성 정보를 전송하여 음성 검색 기능 향상</translation>
 <translation id="2967544384642772068">종료</translation>
@@ -1594,6 +1629,7 @@
 <translation id="3150927491400159470">강력 새로고침</translation>
 <translation id="315116470104423982">모바일 데이터</translation>
 <translation id="315141861755603168">'<ph name="BUNDLE_NAME" />'을(를) 설치하면 다음 앱이 추가됩니다.</translation>
+<translation id="3151786313568798007">방향</translation>
 <translation id="3153177132960373163">모든 사이트에서 플러그인을 사용하여 내 컴퓨터에 액세스하도록 허용</translation>
 <translation id="3154429428035006212">1달 이상 오프라인 상태</translation>
 <translation id="3157931365184549694">복구</translation>
@@ -1650,6 +1686,7 @@
 <translation id="3234666976984236645">이 사이트에서 중요한 콘텐츠 항상 감지</translation>
 <translation id="3236997602556743698">세벌식(390)</translation>
 <translation id="3237784613213365159"><ph name="NEW_PROFILE_NAME" />님이 관리 대상 사용자가 되었습니다.</translation>
+<translation id="323803881985677942">확장 프로그램 옵션 열기</translation>
 <translation id="324056286105023296"><ph name="PROFILE_NAME" />님이 아닙니까?</translation>
 <translation id="3241680850019875542">압축할 확장 프로그램의 루트 디렉토리를 선택합니다. 확장 프로그램을 업데이트하려면 다시 사용할 비공개 키 파일도 선택합니다.</translation>
 <translation id="3241720467332021590">아일랜드어</translation>
@@ -1675,6 +1712,7 @@
 <translation id="3268451620468152448">열린 탭</translation>
 <translation id="3269093882174072735">이미지 로드</translation>
 <translation id="3269101346657272573">PIN을 입력하세요.</translation>
+<translation id="3269737334347286816">로그인 세부정보의 유효기간이 만료되었습니다.</translation>
 <translation id="326999365752735949">diff 다운로드 중</translation>
 <translation id="3270965368676314374">컴퓨터에서 사진, 음악, 기타 미디어 조회, 변경, 삭제</translation>
 <translation id="3273410961255278341">다음에 대해 보내기:</translation>
@@ -1774,6 +1812,7 @@
 <translation id="3382073616108123819">시스템에서 이 기기의 기기 식별자를 확인하지 못했습니다.</translation>
 <translation id="3384773155383850738">최대 제안사항 수</translation>
 <translation id="3385050660708634073">나만의 동기화 암호로 모든 동기화 데이터 암호화</translation>
+<translation id="3385131213214862288">다음 항목 삭제</translation>
 <translation id="338583716107319301">구분자</translation>
 <translation id="3386219708421216619">북마크 추가됨</translation>
 <translation id="3391392691301057522">이전 PIN:</translation>
@@ -1809,6 +1848,7 @@
 <translation id="3439153939049640737"><ph name="HOST" />에서 마이크에 액세스하도록 항상 허용</translation>
 <translation id="3439282137581679399">권한 블랙리스트를 사용하도록 설정하여 세이프 브라우징 사용자가 블랙리스트에 표시된 사이트에 접속하지 못하도록 차단합니다.</translation>
 <translation id="3439970425423980614">미리보기에서 PDF 여는 중</translation>
+<translation id="3440761377721825626">사이트에서 플러그인을 사용하여 내 컴퓨터에 액세스하려 할 때 확인</translation>
 <translation id="3441653493275994384">차단</translation>
 <translation id="3441653695259810643">더 빠른 레이아웃을 위해 렌더기에서 캐시된 글꼴을 다시 사용하여 다양한 글꼴 크기를 제공합니다.</translation>
 <translation id="3445092916808119474">기본 디스플레이로 설정</translation>
@@ -1823,6 +1863,7 @@
 <translation id="3456236151053308041">IME 확장 프로그램에서 사용자 입력에 대해 가상 키보드와 같은 맞춤 보기를 제공하도록 설정합니다.</translation>
 <translation id="345693547134384690">새 탭에서 이미지 열기(&amp;I)</translation>
 <translation id="3458620904104024826">추적 이벤트를 ETW로 내보내도록 설정</translation>
+<translation id="3459509316159669723">인쇄</translation>
 <translation id="3459774175445953971">최종 수정 날짜:</translation>
 <translation id="3460771772332290399">오프라인 자동 새로고침 모드</translation>
 <translation id="3462413494201477527">계정 설정을 취소하시겠습니까?</translation>
@@ -1866,6 +1907,7 @@
 <translation id="3508920295779105875">다른 폴더 선택...</translation>
 <translation id="3509527969829946096">이 옵션은 Cast Streaming에서 플랫폼 하드웨어를 사용한 동영상 스트림 인코딩 작업을 지원하도록 설정합니다.</translation>
 <translation id="3510797500218907545">WiMAX</translation>
+<translation id="3511200754045804813">다시 스캔</translation>
 <translation id="3511307672085573050">링크 주소 복사(&amp;E)</translation>
 <translation id="3511399794969432965">연결하는 데 문제가 있으신가요?</translation>
 <translation id="351152300840026870">고정폭 글꼴</translation>
@@ -1935,6 +1977,7 @@
 <translation id="3590559774363307859">비밀번호가 저장되었습니다. 어느 브라우저에서나 비밀번호와 모든 <ph name="SAVED_PASSWORDS_LINK" />에 액세스할 수 있습니다.</translation>
 <translation id="3590587280253938212">빠르게</translation>
 <translation id="3592260987370335752">자세히 알아보기(&amp;L)</translation>
+<translation id="3592313833691251126">확장 프로그램에서 브라우저 프레임 외부에서 열리는 패널 창을 만들도록 허용합니다. 이 기능을 사용하지 않도록 설정한 경우, 패널을 열려고 하면 팝업이 대신 열립니다. 기본적으로 허용 목록에 추가된 확장 프로그램에서만 허용됩니다. 사용하도록 설정하면 모든 확장 프로그램에 허용되며, 사용 중지하면 모든 확장 프로그램에서 창을 허용하지 않게 됩니다.</translation>
 <translation id="359283478042092570">로그인</translation>
 <translation id="3593152357631900254">퍼지 병음 모드 사용</translation>
 <translation id="3593965109698325041">인증서 이름 제약조건</translation>
@@ -2012,6 +2055,7 @@
 <translation id="3695919544155087829">인증서 파일을 암호화할 때 사용한 비밀번호를 입력하세요.</translation>
 <translation id="3696411085566228381">없음</translation>
 <translation id="3697100740575341996">IT 관리자가 내 기기에 Chrome Goodies를 이용할 수 없도록 설정했습니다. <ph name="MORE_INFO_LINK" /></translation>
+<translation id="3699080292907545058">최대 사용 가능 TLS 버전을 설정합니다.</translation>
 <translation id="3699624789011381381">이메일 주소</translation>
 <translation id="3704162925118123524">사용 중인 네트워크에서 로그인 페이지 방문을 요청할 수 있습니다.</translation>
 <translation id="3704331259350077894">작업 중단</translation>
@@ -2057,10 +2101,12 @@
 <translation id="3758201569871381925">Hotrod 기기를 사용하도록 설정하고 TV에 연결해야 합니다.</translation>
 <translation id="375841316537350618">프록시 스크립트 다운로드 중...</translation>
 <translation id="3759371141211657149">핸들러 설정 관리...</translation>
+<translation id="3759553810934020361">블루투스가 꺼져 있습니다.</translation>
 <translation id="3759933321830434300">웹페이지의 일부 차단</translation>
 <translation id="3760460896538743390">백그라운드 페이지 검사(&amp;B)</translation>
 <translation id="37613671848467444">시크릿 창에서 열기(&amp;I)</translation>
 <translation id="3763401818161139108">항상 <ph name="ORIGIN" />에서 실행</translation>
+<translation id="3764314093345384080">자세한 빌드 정보</translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{USB 기기 1개와 통신}other{USB 기기 #개와 통신}}</translation>
 <translation id="3764800135428056022">웹 비밀번호를 저장하도록 제안</translation>
 <translation id="3764986667044728669">등록할 수 없음</translation>
@@ -2090,6 +2136,7 @@
 <translation id="3798449238516105146">버전</translation>
 <translation id="3798935682015223249">파일 관리자에서 MTP 지원</translation>
 <translation id="3800764353337460026">기호 스타일</translation>
+<translation id="3800806661949714323">모두 표시(권장)</translation>
 <translation id="3801082500826908679">페로스어</translation>
 <translation id="3803991353670408298">이 입력 방법을 제거하기 전에 다른 입력 방법을 추가하세요.</translation>
 <translation id="380408572480438692">성능 데이터를 수집하도록 설정하면 시간이 지남에 따라 Google에서 시스템을 개선하는 데 도움이 됩니다. 데이터는 사용자가 피드백 보고서를 제출하고(Alt-Shift-I) 성능 데이터를 포함할 때까지 전송되지 않습니다. 언제든지 이 화면으로 돌아와 데이터 수집을 중지할 수 있습니다.</translation>
@@ -2107,6 +2154,7 @@
 <translation id="3819007103695653773">모든 사이트에서 푸시 메시지를 보낼 수 있도록 허용</translation>
 <translation id="3819752733757735746">스위치 제어(스위치 1~2회 사용으로 컴퓨터 제어)</translation>
 <translation id="3819800052061700452">전체화면(&amp;F)</translation>
+<translation id="3821453754632750466">웹 결제 사용</translation>
 <translation id="3822265067668554284">사이트에서 내 실제 위치를 추적하도록 허용 안 함</translation>
 <translation id="3825863595139017598">몽골어 키보드</translation>
 <translation id="3827306204503227641">샌드박스 처리되지 않은 플러그인 계속 허용</translation>
@@ -2168,9 +2216,11 @@
 <translation id="3899968422636198696"><ph name="ORGNAME" /> <ph name="HOSTNAME" /></translation>
 <translation id="3901991538546252627"><ph name="NAME" />에 연결 중</translation>
 <translation id="3902799646152133632">no-store 메인 프레임을 건너뜁니다.</translation>
+<translation id="3904196543277238487">최대 TLS 버전 사용 설정됨</translation>
 <translation id="3905761538810670789">앱 복구</translation>
 <translation id="390718707505136526">기능/API 실험 액세스를 통제하기 위한 오리진 트라이얼을 사용합니다.</translation>
 <translation id="3908501907586732282">확장 프로그램 사용</translation>
+<translation id="3909690856344416952"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /> 외 1개</translation>
 <translation id="3909791450649380159">잘라내기(&amp;T)</translation>
 <translation id="3910699493603749297">크메르어 키보드</translation>
 <translation id="3911073280391218446"><ph name="USER_DISPLAY_NAME" />(이 기기에서 사용된 이름)</translation>
@@ -2190,6 +2240,7 @@
 <translation id="3930521966936686665">다음 기기에서 재생</translation>
 <translation id="3936390757709632190">새 탭에서 오디오 열기(&amp;O)</translation>
 <translation id="3936768791051458634">채널 변경...</translation>
+<translation id="3936925983113350642">선택한 비밀번호는 나중에 이 인증서를 복원할 때 필요하므로 안전한 위치에 기록해 두세요.</translation>
 <translation id="3937640725563832867">인증서 발행기관 대체 이름</translation>
 <translation id="3938113500786732264">빠른 사용자 전환</translation>
 <translation id="3940233957883229251">자동 반복 사용</translation>
@@ -2258,9 +2309,10 @@
 <translation id="4034042927394659004">키 밝기 낮춤</translation>
 <translation id="4035758313003622889">작업 관리자(&amp;T)</translation>
 <translation id="4037084878352560732">말</translation>
-<translation id="4037102579141982963">이 기기는 진단 및 사용 데이터를 Google에 자동 전송합니다. 언제든지 기기 <ph name="BEGIN_LINK1" />설정<ph name="END_LINK1" />에서 변경할 수 있습니다. <ph name="BEGIN_LINK2" />자세히 알아보기<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Android용 접근성 탭 전환을 사용합니다.</translation>
+<translation id="4037889604535939429">사용자 수정</translation>
 <translation id="4044260751144303020">고정 위치 요소 합성</translation>
+<translation id="4044612648082411741">인증서 비밀번호를 입력하세요.</translation>
 <translation id="404493185430269859">기본 검색엔진</translation>
 <translation id="4047112090469382184">이 기능이 안전한 이유</translation>
 <translation id="4047345532928475040">해당 없음</translation>
@@ -2351,6 +2403,7 @@
 <translation id="417475959318757854">앱 런처 중앙 배치</translation>
 <translation id="4176463684765177261">사용 중지</translation>
 <translation id="4179512409951755566">OSK 오버스크롤 사용</translation>
+<translation id="418062721134714140">SSL 인증서 및 설정 관리</translation>
 <translation id="4180788401304023883">CA 인증서 '<ph name="CERTIFICATE_NAME" />'을(를) 삭제하겠습니까?</translation>
 <translation id="418179967336296930">러시아 표음식(YaZHert) 키보드</translation>
 <translation id="4181841719683918333">언어</translation>
@@ -2365,6 +2418,7 @@
 <translation id="4195643157523330669">새 탭에서 열기</translation>
 <translation id="4195814663415092787">중단한 위치에서 계속하기</translation>
 <translation id="4197674956721858839">압축 선택</translation>
+<translation id="4200689466366162458">단어 맞춤설정</translation>
 <translation id="4200983522494130825">새 탭(&amp;T)</translation>
 <translation id="4206144641569145248">외계인</translation>
 <translation id="420665587194630159">(관리되는 확장 프로그램으로, 삭제 또는 사용 중지할 수 없습니다.)</translation>
@@ -2461,10 +2515,12 @@
 <translation id="4350019051035968019">이 기기는 다른 도메인에서 관리하는 것으로 표시되어 있기 때문에 사용자의 계정이 속한 도메인에 등록할 수 없습니다.</translation>
 <translation id="4354806558096370704">기본 CUPS 인쇄 백엔드를 사용하도록 설정합니다.</translation>
 <translation id="4355925451975609675">앞으로 이동하려면 |<ph name="ACCELERATOR1" />|+|<ph name="ACCELERATOR2" />|을(를) 누르세요.</translation>
+<translation id="4358353773267946514"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /></translation>
 <translation id="4358697938732213860">주소 추가</translation>
 <translation id="4359408040881008151">함께 설치된 확장 프로그램입니다.</translation>
 <translation id="4361190688154226069">보기에 사각형 기반 타겟팅 사용</translation>
 <translation id="4361765875689149937"><ph name="ORIGIN" />에서 다음과 페어링하려고 합니다.</translation>
+<translation id="4363771538994847871">전송 대상을 찾을 수 없습니다. 도움이 필요하세요?</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" />(이)가 다운로드됨</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" />이(가) 창을 공유합니다.</translation>
 <translation id="4364830672918311045">알림 표시</translation>
@@ -2556,6 +2612,7 @@
 <translation id="4509345063551561634">위치:</translation>
 <translation id="4514542542275172126">새로운 관리 대상 사용자 설정</translation>
 <translation id="4514914692061505365">모든 pexe 파일에서 PNaCl의 빠른 Subzero 변환기를 강제 사용합니다.</translation>
+<translation id="451515744433878153">제거</translation>
 <translation id="4516641987425683031">동기화된 탭</translation>
 <translation id="4518677423782794009">Chrome 작동이 중단되거나 낯선 시작 페이지나 툴바가 표시되거나 예기치 않은 광고가 삭제되지 않거나 기타 인터넷 사용 환경이 변경되는 경우, Chrome 정리도구를 실행하여 문제를 해결할 수 있습니다.</translation>
 <translation id="452039078290142656"><ph name="VENDOR_NAME" />의 알 수 없는 기기</translation>
@@ -2592,6 +2649,7 @@
 <translation id="4562991793854515912">매우 짧게(600ms)</translation>
 <translation id="4563210852471260509">중국어를 초기 입력 언어로 설정</translation>
 <translation id="456664934433279154">Toolkit-Views 기반 Chrome 앱 창을 사용할 것인지 여부를 조정합니다.</translation>
+<translation id="4567772783389002344">단어 추가</translation>
 <translation id="4569998400745857585">숨은 확장 프로그램을 포함하는 메뉴</translation>
 <translation id="4570444215489785449">이제 언제든지 Chrome 관리자에서 이 기기를 원격으로 잠글 수 있습니다.</translation>
 <translation id="4572659312570518089">'<ph name="DEVICE_NAME" />'에 연결하는 동안 인증이 취소되었습니다.</translation>
@@ -2603,11 +2661,13 @@
 <translation id="4582447636905308869">Google 입력기의 HMM 엔진을 기반으로 하는 새로운 한국어 IME입니다.</translation>
 <translation id="4582563038311694664">모든 설정 초기화</translation>
 <translation id="4583537898417244378">잘못되었거나 손상된 파일입니다.</translation>
+<translation id="4585793705637313973">페이지 수정</translation>
 <translation id="4589268276914962177">새 터미널</translation>
 <translation id="4590324241397107707">데이터베이스 저장소</translation>
 <translation id="4593021220803146968"><ph name="URL" />(으)로 이동(&amp;G)</translation>
 <translation id="4594109696316595112">한번에 활성화: 비밀번호를 입력하여 이 <ph name="DEVICE_TYPE" />에서 Smart Lock을 활성화하세요. Smart Lock을 이용하면 비밀번호를 입력할 필요 없이 휴대전화로 이 기기를 잠금 해제할 수 있습니다. 이 기능을 변경하거나 사용 중지하려면 <ph name="DEVICE_TYPE" />의 설정으로 이동하세요.</translation>
 <translation id="4595560905247879544">앱 및 확장 프로그램은 관리자(<ph name="CUSTODIAN_NAME" />)만 수정할 수 있습니다.</translation>
+<translation id="4596295440756783523">다음 서버를 식별하는 인증서가 등록되어 있습니다.</translation>
 <translation id="4598556348158889687">저장용량 관리</translation>
 <translation id="4601242977939794209">EMF 변환기</translation>
 <translation id="4602466770786743961"><ph name="HOST" />에서 카메라와 마이크에 액세스하도록 항상 허용</translation>
@@ -2673,6 +2733,7 @@
 <translation id="4697551882387947560">탐색 세션이 종료될 때</translation>
 <translation id="4699172675775169585">캐시된 이미지 또는 파일</translation>
 <translation id="4699357559218762027">(자동 실행)</translation>
+<translation id="4704677965327178154">사이트에서 플러그인을 사용하여 내 컴퓨터에 액세스하도록 허용하지 않습니다.</translation>
 <translation id="4707302005824653064">chrome.com 페이지에서 관리자(<ph name="CUSTODIAN_EMAIL" />)가 이용 및 방문 기록을 조회할 수 있습니다.</translation>
 <translation id="4707579418881001319">L2TP/IPSec + 사용자 인증서</translation>
 <translation id="4707934200082538898">자세한 안내를 보려면 <ph name="BEGIN_BOLD" /><ph name="MANAGER_EMAIL" /><ph name="END_BOLD" />에서 이메일을 확인하세요.</translation>
@@ -2710,6 +2771,7 @@
 <translation id="4744574733485822359">다운로드가 완료되었습니다.</translation>
 <translation id="4746971725921104503">해당 이름으로 이미 사용자를 관리 중입니다. <ph name="LINK_START" /><ph name="USER_DISPLAY_NAME" />을(를) 이 기기로 가져오시겠습니까<ph name="LINK_END" />?</translation>
 <translation id="4747271164117300400">마케도니아어</translation>
+<translation id="4748762018725435655">Chrome 웹 스토어의 확장 프로그램 필요</translation>
 <translation id="4749157430980974800">조지아어 키보드</translation>
 <translation id="4750394297954878236">추천</translation>
 <translation id="475088594373173692">첫 번째 사용자</translation>
@@ -2723,6 +2785,7 @@
 <translation id="4763830802490665879">여러 사이트의 쿠키가 종료 시 삭제됩니다.</translation>
 <translation id="4764029864566166446">플러그인 업데이트...</translation>
 <translation id="4764865176798926079">메인 프레임의 domContentLoaded 및 모든 리소스 로드가 domContentLoaded(iframe 무시됨) 전에 시작됩니다.</translation>
+<translation id="4768332406694066911">다음 기관에 사용자의 신원을 확인하는 인증서가 있습니다.</translation>
 <translation id="4768698601728450387">이미지 자르기</translation>
 <translation id="4773696473262035477">어느 브라우저에서나 비밀번호와 모든 <ph name="SAVED_PASSWORDS_LINK" />에 액세스할 수 있습니다.</translation>
 <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" />의 비밀번호</translation>
@@ -2740,10 +2803,12 @@
 <translation id="4793866834012505469">음성 모델 재교육</translation>
 <translation id="479536056609751218">웹페이지, HTML만</translation>
 <translation id="479989351350248267">검색</translation>
+<translation id="480036413855787547">어떤 기기에서든 <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />에서 비밀번호에 액세스하세요. Mac을 사용하는 경우 비밀번호가 키체인에 저장될 수 있으며 이 OS X 계정을 공유하는 다른 Chrome 사용자가 비밀번호에 액세스하거나 다른 사용자에게 비밀번호가 동기화될 수 있습니다.</translation>
 <translation id="4801257000660565496">애플리케이션 바로가기 만들기</translation>
 <translation id="4801448226354548035">계정 숨기기</translation>
 <translation id="4801512016965057443">모바일 데이터 로밍 허용</translation>
 <translation id="4801956050125744859">모두 보관</translation>
+<translation id="4803121606678474433">2D 캔버스 동적 렌더링 모드 전환 사용</translation>
 <translation id="4803909571878637176">제거</translation>
 <translation id="4804331037112292643">파일 열기/저장 대화상자</translation>
 <translation id="4804818685124855865">연결 해제</translation>
@@ -2762,6 +2827,7 @@
 <translation id="4824518112777153488">마우스 오버가 가능한 터치스크린 지원</translation>
 <translation id="4827948050554950725">신용카드 추가</translation>
 <translation id="4828493911650550108">앱과 서비스에서 Wi-Fi 네트워크와 블루투스 기기를 스캔할 수 있도록 허용하여 위치 정확도를 개선합니다.</translation>
+<translation id="4828937774870308359">오스트레일리아</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" />에서 <ph name="NETWORK_NAME" /> 네트워크를 사용하여 인터넷에 연결할 수 없습니다. 다른 네트워크를 선택하세요. <ph name="LEARN_MORE_LINK_START" />자세히 알아보기<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="ISSUER" />에서 <ph name="LOCALITY" /> 내 <ph name="ORGANIZATION" />의 ID를 인증했습니다. 서버가 유효한 인증서 확인 정보를 제공했습니다.</translation>
 <translation id="4834912470034578916">웹 알림에 맞춤 레이아웃을 사용합니다.</translation>
@@ -2780,6 +2846,7 @@
 <translation id="4849517651082200438">설치 안함</translation>
 <translation id="4850258771229959924">개발자 도구에서 보기</translation>
 <translation id="4850458635498951714">기기 추가</translation>
+<translation id="4850669014075537160">스크롤</translation>
 <translation id="4850886885716139402">보기</translation>
 <translation id="4853020600495124913">새 창에서 열기(&amp;N)</translation>
 <translation id="485316830061041779">독일어</translation>
@@ -2827,6 +2894,7 @@
 <translation id="4903369323166982260">Chrome 정리도구 실행하기</translation>
 <translation id="4906679076183257864">기본 설정으로 돌아가기</translation>
 <translation id="4907125798206348918">약한 MemoryCache</translation>
+<translation id="4907306957610201395">권한 카테고리</translation>
 <translation id="49088176676474409">VPD 값을 숨깁니다.</translation>
 <translation id="4910021444507283344">WebGL</translation>
 <translation id="4910673011243110136">사설 네트워크</translation>
@@ -2853,6 +2921,7 @@
 <translation id="4938972461544498524">터치패드 설정</translation>
 <translation id="4940047036413029306">인용</translation>
 <translation id="4941246025622441835">다음과 같이 기기를 엔터프라이즈 관리용으로 등록할 때 이 기기 요청을 사용합니다.</translation>
+<translation id="4941627891654116707">글꼴 크기</translation>
 <translation id="4942394808693235155">업데이트 확인 및 적용</translation>
 <translation id="494286511941020793">프록시 설정 도움말</translation>
 <translation id="4950138595962845479">옵션...</translation>
@@ -2863,6 +2932,7 @@
 <translation id="4956847150856741762">1</translation>
 <translation id="495931528404527476">Chrome</translation>
 <translation id="496226124210045887">선택한 폴더에 민감한 파일이 포함되어 있습니다. 이 폴더에 '$1' 영구 읽기 액세스를 승인하시겠습니까?</translation>
+<translation id="4964455510556214366">배열</translation>
 <translation id="4964673849688379040">확인 중...</translation>
 <translation id="4966802378343010715">새 사용자 프로필 만들기</translation>
 <translation id="4967749818080339523">계정 선택</translation>
@@ -2987,6 +3057,7 @@
 <translation id="5144820558584035333">한글 세벌식(390)</translation>
 <translation id="5145331109270917438">수정된 날짜</translation>
 <translation id="5146631943508592569">기기 수명 종료(EOL) 알림 사용 중지</translation>
+<translation id="5147113189823897615">이 계정은 <ph name="DOMAIN" />에서 관리하므로 북마크, 방문 기록, 비밀번호, 기타 설정이 이 기기에서 삭제됩니다. 하지만 데이터는 Google 계정에 계속 저장됩니다.</translation>
 <translation id="5147237161038757796">물리적 키보드 자동수정</translation>
 <translation id="5148320352496581610">직사각형 기반 타겟팅은 터치 영역을 직사각형으로 표시하고 휴리스틱(heuristic)을 사용하여 동작에 대해 가장 가능성이 높은 타겟을 판단합니다.</translation>
 <translation id="5150254825601720210">Netscape Certificate SSL Server Name</translation>
@@ -3023,6 +3094,7 @@
 <translation id="5181140330217080051">다운로드 중</translation>
 <translation id="5182671122927417841">확장 프로그램 사용 중지</translation>
 <translation id="5184063094292164363">자바스크립트 콘솔(&amp;J)</translation>
+<translation id="5184662919967270437">기기 업데이트 중</translation>
 <translation id="5185386675596372454">'<ph name="EXTENSION_NAME" />'의 최신 버전에 더 많은 권한이 필요하여 사용이 중지되었습니다.</translation>
 <translation id="5185403602014064051">이 기능을 사용하면 비밀번호를 입력하지 않고 로그인한 모든 사용자에게 액세스할 수 있습니다.</translation>
 <translation id="5186650237607254032">내가 근처에 있으면 휴대전화 화면 잠금이 해제되도록 휴대전화 화면 잠금을 업데이트하세요. 휴대전화를 더 빠르게 잠금 해제하고, <ph name="DEVICE_TYPE" />에서 개선된 Smart Lock 환경을 이용할 수 있습니다.</translation>
@@ -3034,6 +3106,7 @@
 <translation id="5197255632782567636">인터넷</translation>
 <translation id="5197680270886368025">동기화가 완료되었습니다.</translation>
 <translation id="5204967432542742771">비밀번호 입력</translation>
+<translation id="5206215183583316675">'<ph name="CERTIFICATE_NAME" />'을(를) 삭제하시겠습니까?</translation>
 <translation id="520621735928254154">인증서 가져오기 오류</translation>
 <translation id="5208988882104884956">반각</translation>
 <translation id="5209320130288484488">기기를 찾을 수 없음</translation>
@@ -3051,6 +3124,7 @@
 <translation id="5227808808023563348">이전 텍스트 찾기</translation>
 <translation id="5228076606934445476">기기에 문제가 발생했습니다.  이 오류를 해결하려면 기기를 재부팅하고 다시 시도하세요.</translation>
 <translation id="5228962187251412618">온라인 확인 전용</translation>
+<translation id="5229189185761556138">입력 방법 관리</translation>
 <translation id="5229622432348746578">데스크톱 공유에 오디오 사용 중지</translation>
 <translation id="5230516054153933099">창</translation>
 <translation id="5232178406098309195">'Ok Google'과 같은 오디오 활성화 명령을 사용하거나 마이크 아이콘을 터치하면 비공개 음성 및 오디오 활동에서 일부 음성 및 기타 오디오를 내 계정에 저장합니다. 뒤에 이어지는 음성 및 오디오 내용과 몇 초 전의 음성 및 오디오 내용 녹음본이 함께 저장됩니다.</translation>
@@ -3230,7 +3304,6 @@
 <translation id="5439568486246921931">이 작업으로 인해 사용자의 다운로드 파일, 오프라인 파일, 인터넷 사용 기록이 완전히 삭제됩니다. 이 작업은 실행 취소할 수 없습니다.</translation>
 <translation id="544083962418256601">바로가기 만들기...</translation>
 <translation id="5441100684135434593">유선 네트워크</translation>
-<translation id="5445088910157062298">Google의 위치 서비스를 활용해 앱이 사용자의 위치를 빠르고 정확하게 파악할 수 있도록 하세요. 이렇게 하면 배터리 사용량도 줄일 수 있습니다. 실행되는 앱이 없을 때도 익명의 위치 데이터가 Google로 전송됩니다.</translation>
 <translation id="5448293924669608770">로그인 중에 문제가 발생했습니다.</translation>
 <translation id="5449588825071916739">모든 탭 북마크</translation>
 <translation id="5449716055534515760">창 닫기(&amp;D)</translation>
@@ -3393,6 +3466,7 @@
 <translation id="5675224880872496917">페이지 콘텐츠를 스크롤할 때 부드럽게 애니메이션 처리</translation>
 <translation id="5676267133227121599"><ph name="MANAGEMENT_LINK" />을(를) 통해 어느 기기에서나 비밀번호에 액세스할 수 있습니다.</translation>
 <translation id="5677503058916217575">페이지 언어:</translation>
+<translation id="5677850799565527075">타사 쿠키 차단</translation>
 <translation id="5677928146339483299">차단됨</translation>
 <translation id="5678550637669481956"><ph name="VOLUME_NAME" />에 대한 읽기/쓰기 액세스 권한이 부여되었습니다.</translation>
 <translation id="567881659373499783">버전 <ph name="PRODUCT_VERSION" /></translation>
@@ -3422,6 +3496,7 @@
 <translation id="5711983031544731014">잠금 해제할 수 없습니다. 비밀번호를 입력하세요.</translation>
 <translation id="5712966208980506909">사용 설정하면 chrome://md-policy URL에서 머티리얼 디자인 정책 페이지를 로드합니다.</translation>
 <translation id="5715711091495208045">플러그인 중개인: <ph name="PLUGIN_NAME" /></translation>
+<translation id="5719603411793408026">기본 검색 엔진</translation>
 <translation id="572328651809341494">최근 탭</translation>
 <translation id="5723508132121499792">실행 중인 백그라운드 앱 없음</translation>
 <translation id="5725124651280963564"><ph name="TOKEN_NAME" />에 로그인하여 <ph name="HOST_NAME" />의 키를 생성하세요.</translation>
@@ -3429,14 +3504,18 @@
 <translation id="572525680133754531">합성된 렌더링 레이어 주위에 테두리를 렌더링하여 레이어 합성의 디버깅 및 연구를 도와 줍니다.</translation>
 <translation id="5726521882516480114">소프트웨어 렌더링을 사용하는 대신 GPU를 사용하여 2D 캔버스 렌더링을 수행하도록 합니다.</translation>
 <translation id="5727728807527375859">확장 프로그램, 애플리케이션, 테마로 인해 컴퓨터가 손상될 수 있습니다. 계속하시겠습니까?</translation>
+<translation id="5727970983344022445">모든 사이트에서 양식 내에 키 생성 사용 허용 안함</translation>
 <translation id="5729712731028706266">보기(&amp;V)</translation>
 <translation id="5729996640881880439">오류에 해당하는 코드를 표시할 수 없습니다.</translation>
 <translation id="5731247495086897348">붙여넣어 바로가기(&amp;S)</translation>
 <translation id="5731751937436428514">베트남어 입력 방법(VIQR)</translation>
 <translation id="5732790216998904518">테스트 목적으로 문서, 스프레드시트, 프레젠테이션에 대한 Office 수정 사용 여부입니다.</translation>
 <translation id="5734362860645681824">커뮤니케이션</translation>
+<translation id="5739458112391494395">아주 크게</translation>
+<translation id="5740331643563157105"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /> 외 <ph name="NUM_ADDITIONAL_LANGUAGES" />개</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: 수정하려면 선택</translation>
 <translation id="5741454054957165976">WebFonts 로딩을 위해 사용자 에이전트 개입의 새 버전을 사용합니다.</translation>
+<translation id="5742598604154146709">사이트에서 여러 파일을 자동으로 다운로드하도록 허용하지 않음</translation>
 <translation id="574392208103952083">보통</translation>
 <translation id="5744368829843057748">2016Q2 UI 번역</translation>
 <translation id="5745056705311424885">USB 메모리가 감지되었습니다.</translation>
@@ -3620,6 +3699,7 @@
 <translation id="5996258716334177896">프로필을 제대로 열지 못했습니다.
 
 일부 기능을 사용하지 못할 수 있습니다. 프로필의 존재 여부와 해당 콘텐츠를 읽고 쓸 권한이 있는지 확인하시기 바랍니다.</translation>
+<translation id="6001799583597751002">PIN이 일치하지 않습니다.</translation>
 <translation id="6003177993629630467"><ph name="PRODUCT_NAME" />에서 자동 업데이트를 수행하지 못할 수 있습니다.</translation>
 <translation id="6003294706906016758">호스팅된 앱에 웹 앱 스타일 프레임 사용</translation>
 <translation id="600424552813877586">잘못된 애플리케이션</translation>
@@ -3645,6 +3725,7 @@
 <translation id="604001903249547235">클라우드 백업</translation>
 <translation id="6040143037577758943">닫기</translation>
 <translation id="604124094241169006">자동</translation>
+<translation id="6041935588605837913">10</translation>
 <translation id="6042308850641462728">더보기</translation>
 <translation id="604257181445267932">Smart Lock을 사용하면 Google에 저장한 비밀번호로 앱과 사이트에 빠르게 로그인할 수 있습니다.</translation>
 <translation id="6043317578411397101"><ph name="APP_NAME" />에서 <ph name="TAB_NAME" />와(과) Chrome 탭을 공유 중입니다.</translation>
@@ -3664,6 +3745,7 @@
 <translation id="6062697480277116433">모바일 데이터 사용 중</translation>
 <translation id="6065289257230303064">인증서 대상 디렉토리 속성</translation>
 <translation id="6071181508177083058">비밀번호 확인</translation>
+<translation id="6073903501322152803">접근성 기능 추가</translation>
 <translation id="6074825444536523002">Google 양식</translation>
 <translation id="6075731018162044558">시스템이 이 기기에 대한 장기 API 액세스 토큰을 획득하지 못했습니다.</translation>
 <translation id="6075880972317537864"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> 공격자는 정보(예: 비밀번호, 메시지, 신용카드)를 도용하기 위해 사용자를 속일 수 있습니다.</translation>
@@ -3698,7 +3780,6 @@
 <translation id="6110466548232134880"><ph name="ISSUER" />에서 <ph name="LOCALITY" /> 내 <ph name="ORGANIZATION" />의 ID를 인증했습니다. 서버에서 유효한 인증서 확인 정보를 제공하지 않았습니다.</translation>
 <translation id="6111770213269631447">음역(namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">기본적으로 허용</translation>
-<translation id="6112929985131461002">이 기기는 진단 및 사용 데이터를 Google에 자동 전송합니다. 이 <ph name="BEGIN_LINK1" />설정<ph name="END_LINK1" />은 관리자가 실행합니다. <ph name="BEGIN_LINK2" />자세히 알아보기<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">언어 및 입력 설정 변경</translation>
 <translation id="6120205520491252677">이 페이지를 시작 화면에 고정...</translation>
 <translation id="6122081475643980456">인터넷 연결이 제어되고 있습니다.</translation>
@@ -3720,8 +3801,10 @@
 <translation id="6143186082490678276">도움말 보기</translation>
 <translation id="6144697279259829572">{NUM_ITEMS,plural, =1{기기에서 $1개 이상의 항목이 영구적으로 삭제됩니다.}other{기기에서 $1개 이상의 항목이 영구적으로 삭제됩니다.}}</translation>
 <translation id="6144890426075165477">현재 <ph name="PRODUCT_NAME" />이(가) 기본 브라우저로 설정되어 있지 않습니다.</translation>
+<translation id="6145860855437952742">마스크를 사용하여 창 헤더를 숨기고 둥근 모서리를 사용할 수 있는 개요 모드 미리보기 창의 최대 개수입니다.</translation>
 <translation id="6147020289383635445">인쇄 미리보기에 실패했습니다.</translation>
 <translation id="614998064310228828">기기 모델:</translation>
+<translation id="6150555451039504280">확대/축소</translation>
 <translation id="6150853954427645995">오프라인에서 사용하기 위해 이 파일을 저장하려면 온라인으로 돌아가서 마우스 오른쪽 버튼으로 파일을 클릭한 다음 <ph name="OFFLINE_CHECKBOX_NAME" /> 옵션을 선택하세요.</translation>
 <translation id="6151323131516309312"><ph name="SEARCH_KEY" />을(를) 눌러 <ph name="SITE_NAME" /> 검색</translation>
 <translation id="6154697846084421647">현재 로그인되어 있음</translation>
@@ -3819,6 +3902,7 @@
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{네트워크에 새로운 프린터 있음}other{네트워크에 새로운 프린터 있음}}</translation>
 <translation id="6285395082104474418">상태 표시줄에 네트워크, 배터리 등의 현재 상태가 표시됩니다.</translation>
 <translation id="6286684120317096255">데이터 사용 측정 중</translation>
+<translation id="6286708577777130801">저장된 암호 세부정보</translation>
 <translation id="6287852322318138013">이 파일을 열 때 사용할 앱 선택</translation>
 <translation id="6288919040208869552">일반적으로 프록시가 설정되면 다른 캡티브 포털의 승인을 차단합니다. 이 설정을 사용하면 별도의 창에서 캡티브 포털 승인 대화상자를 열 수 있으며, 이때 프록시 설정은 무시합니다.</translation>
 <translation id="6290556621549272952">이 기능을 사용하면 TV 또는 다른 기기에 Chromium의 콘텐츠를 표시할 수 있습니다.</translation>
@@ -3860,6 +3944,7 @@
 <translation id="6353618411602605519">크로아티아어 키보드</translation>
 <translation id="6356936121715252359">Adobe Flash Player 저장공간 설정...</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> 가족이 되신 것을 환영합니다. 뛰어난 기능을 경험해 보세요.</translation>
+<translation id="63617602971594377">웹 결제가 가능하도록 API 사용</translation>
 <translation id="6361850914223837199">오류 세부정보:</translation>
 <translation id="6362853299801475928">문제 신고하기(&amp;R)...</translation>
 <translation id="636343209757971102">IPv6 주소:</translation>
@@ -3895,6 +3980,7 @@
 <translation id="6410063390789552572">네트워크 라이브러리에 액세스할 수 없음</translation>
 <translation id="6410257289063177456">이미지 파일</translation>
 <translation id="6410328738210026208">채널 변경 및 Powerwash</translation>
+<translation id="6410668567036790476">검색 엔진 추가</translation>
 <translation id="641105183165925463">$1MB</translation>
 <translation id="6412931879992742813">새 시크릿 창</translation>
 <translation id="6418160186546245112"><ph name="IDS_SHORT_PRODUCT_NAME" />의 이전 설치 버전으로 되돌리는 중</translation>
@@ -3927,14 +4013,15 @@
 <translation id="6443783728907198276">사용하도록 설정하는 경우 WebRTC에 의해 생성되는 Stun 메시지에 Origin 헤더가 포함됩니다.</translation>
 <translation id="6444070574980481588">날짜 및 시간 설정</translation>
 <translation id="6445450263907939268">변경하지 않으려는 경우 이전 설정을 복원할 수 있습니다.</translation>
+<translation id="6447388538018752757">2D 캔버스에서 동적 그래픽 렌더링 파이프라인 전환을 사용하도록 설정하여 호출되는 그리기 작업 유형에 따라 성능을 최적화합니다.</translation>
 <translation id="6447842834002726250">쿠키</translation>
 <translation id="6449285849137521213">'<ph name="EXTENSION_NAME" />' 앱이 추가되었습니다.</translation>
 <translation id="6450876761651513209">개인정보 보호 관련 설정 변경</translation>
+<translation id="6451180435462401570">클라우드 프린트 기기 관리</translation>
 <translation id="6451650035642342749">자동열기 설정 지우기</translation>
 <translation id="6452181791372256707">거부</translation>
 <translation id="6454421252317455908">중국어 입력 방법(빠름)</translation>
 <translation id="6455348477571378046">인증서 유형:</translation>
-<translation id="6456234919706689841">관리자는 이 기기의 진단 및 사용 데이터를 Google에 전송하도록 선택할 수 있습니다. 여기에서 이 <ph name="BEGIN_LINK1" />설정<ph name="END_LINK1" />을 확인할 수 있습니다. <ph name="BEGIN_LINK2" />자세히 알아보기<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">자바스크립트 계속 차단</translation>
 <translation id="6458308652667395253">자바스크립트 차단 관리...</translation>
 <translation id="6459488832681039634">선택 부분으로 찾기</translation>
@@ -3988,10 +4075,12 @@
 <translation id="6526654154229718724">실험적 키보드 잠금 모드를 사용하는 전체화면을 종료하려면 ESC 키를 길게 누르세요.</translation>
 <translation id="6527303717912515753">공유</translation>
 <translation id="6528546217685656218">이 클라이언트 인증서의 비공개 키가 없거나 잘못되었습니다.</translation>
+<translation id="652948702951888897">Chrome 방문 기록</translation>
 <translation id="653019979737152879"><ph name="FILE_NAME" />을(를) 동기화하는 중...</translation>
 <translation id="6534583978616527129">연결 초기화</translation>
 <translation id="654039047105555694"><ph name="BEGIN_BOLD" />참고:<ph name="END_BOLD" /> 데이터 수집으로 인해 성능이 감소할 수 있으므로 확신이 있는 경우 또는 요청을 받은 경우에만 사용하도록 설정합니다.</translation>
 <translation id="654233263479157500">웹 서비스를 이용하여 탐색 오류 문제 해결</translation>
+<translation id="6545665334409411530">반복 속도</translation>
 <translation id="6545834809683560467">예상 검색어 서비스를 사용하여 검색주소창 또는 앱 런처 검색창에 입력되는 검색어 및 URL을 더 빠르게 완성</translation>
 <translation id="6546686722964485737">Wimax 네트워크에 참여</translation>
 <translation id="6547316139431024316">이 확장 프로그램에 대해 다시 경고하지 않음</translation>
@@ -4062,9 +4151,11 @@
 <translation id="6643016212128521049">삭제</translation>
 <translation id="6644756108386233011">수정된 <ph name="IDS_SHORT_PRODUCT_NAME" /> 설정을 재설정하시겠습니까?</translation>
 <translation id="6647228709620733774">Netscape 인증 기관 취소 URL</translation>
+<translation id="6647838571840953560">현재 <ph name="CHANNEL_NAME" /> 사용 중</translation>
 <translation id="6649018507441623493">잠시 기다려 주세요.</translation>
 <translation id="6649068951642910388">세션 복원 UI가 정보 표시줄 대신 풍선에 표시됩니다.</translation>
 <translation id="665061930738760572">새 창에서 열기(&amp;N)</translation>
+<translation id="6651237644330755633">웹사이트를 식별하기 위해 이 인증서 신뢰</translation>
 <translation id="6652975592920847366">OS 복구 미디어 만들기</translation>
 <translation id="6653525630739667879">$1(으)로 저장할 수 없습니다. 모든 수정사항은 다운로드 폴더에 $2(으)로 저장됩니다.</translation>
 <translation id="6655190889273724601">개발자 모드</translation>
@@ -4119,6 +4210,7 @@
 <translation id="6725970970008349185">페이지당 표시할 후보자 수</translation>
 <translation id="672609503628871915">새로운 기능 알아보기</translation>
 <translation id="6727005317916125192">이전 창</translation>
+<translation id="6727842159866499206">도형을 사용하여 창 헤더를 숨길 수 있는 개요 모드 미리보기 창의 최대 개수입니다.</translation>
 <translation id="6731320427842222405">몇 분이 걸릴 수 있습니다.</translation>
 <translation id="6731638353631257659">V8 캐싱 모드</translation>
 <translation id="6732586201820838268">휴대전화와의 연결을 설정할 수 없습니다. 호환되는 Android 휴대전화를 사용 중인지, 휴대전화의 전원이 켜져 있는지, 손에 닿는 거리에 있는지 확인하세요. &lt;a&gt;자세히 알아보기&lt;/a&gt;</translation>
@@ -4144,6 +4236,7 @@
 <translation id="6769712124046837540">프린터 추가 중...</translation>
 <translation id="6771503742377376720">인증 기관임</translation>
 <translation id="6773575010135450071">추가 작업...</translation>
+<translation id="677965093459947883">아주 작게</translation>
 <translation id="6780439250949340171">기타 설정 관리</translation>
 <translation id="6786747875388722282">확장 프로그램</translation>
 <translation id="6787839852456839824">단축키</translation>
@@ -4167,6 +4260,7 @@
 <translation id="6815353853907306610"><ph name="IDS_SHORT_PRODUCT_NAME" />에서 사용자가 알지 못하는 사이에 브라우저 설정이 변경되었을 수 있음을 감지했습니다. 기본값으로 재설정하시겠습니까?</translation>
 <translation id="6815551780062710681">수정</translation>
 <translation id="6817358880000653228">이 사이트의 저장된 비밀번호:</translation>
+<translation id="6820008762872335722">재설정하여 요청하기</translation>
 <translation id="6820687829547641339">Gzip으로 압축된 tar 압축 파일</translation>
 <translation id="682123305478866682">데스크톱 전송</translation>
 <translation id="6823506025919456619">기기를 보려면 Chrome에 로그인하세요.</translation>
@@ -4186,7 +4280,9 @@
 <translation id="6833901631330113163">남유럽어</translation>
 <translation id="683526731807555621">새 검색엔진 추가</translation>
 <translation id="6835762382653651563"><ph name="DEVICE_TYPE" />을(를) 업데이트하려면 인터넷에 연결하세요.</translation>
+<translation id="6839158130869314728">디스플레이 미러링</translation>
 <translation id="6839225236531462745">인증서 삭제 오류</translation>
+<translation id="6840155290835956714">보내기 전에 확인</translation>
 <translation id="6840184929775541289">인증 기관 아님</translation>
 <translation id="6840313690797192085">$1PB</translation>
 <translation id="6841186874966388268">오류</translation>
@@ -4196,6 +4292,7 @@
 <translation id="6847758263950452722">페이지를 MHTML로 저장</translation>
 <translation id="6853388645642883916">업데이터 절전 모드</translation>
 <translation id="68541483639528434">다른 탭 닫기</translation>
+<translation id="6855099371444560844">기기 추가</translation>
 <translation id="6856701878604560493">오프라인 북마크 사용</translation>
 <translation id="6860097299815761905">프록시 설정...</translation>
 <translation id="6860427144121307915">탭에서 열기</translation>
@@ -4276,11 +4373,13 @@
 <translation id="6980462514016882061">Google에서 검색, 광고 및 다른 Google 서비스를 맞춤설정하기 위하여 내 인터넷 사용 기록을 사용할 수 있습니다.</translation>
 <translation id="6980956047710795611">모든 Chrome OS 데이터를 새 비밀번호로 이전(이전 비밀번호 필요)</translation>
 <translation id="6981982820502123353">접근성</translation>
+<translation id="6981992744085917617">계정으로 다시 로그인할 때 사용할 방법을 선택하세요.</translation>
 <translation id="6982896539684144327"><ph name="VENDOR_NAME" /> 프린터 검색됨</translation>
 <translation id="6983783921975806247">등록된 OID</translation>
 <translation id="6983991971286645866">모든 수정사항이 $1에 저장됩니다.</translation>
 <translation id="6985235333261347343">Microsoft Key Recovery Agent</translation>
 <translation id="6985276906761169321">ID:</translation>
+<translation id="6985607387932385770">프린터</translation>
 <translation id="6986605181115043220">죄송합니다. 동기화 작동이 중지되었습니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation>
 <translation id="6989294135336900804">동기화된 탭 없음</translation>
 <translation id="6990081529015358884">저장 공간이 부족합니다.</translation>
@@ -4303,6 +4402,7 @@
 <translation id="7006844981395428048">$1 오디오</translation>
 <translation id="7008270479623533562">이 확장 프로그램을 실행하려면 페이지를 새로고침해야 합니다. 확장 프로그램 아이콘을 오른쪽 버튼으로 클릭하여 이 사이트에서 자동으로 확장 프로그램을 실행할 수 있습니다.</translation>
 <translation id="7009045250432250765">한 번 클릭하여 자동완성</translation>
+<translation id="7009420427128923703">마스크를 사용할 수 있는 개요 창의 최대 개수입니다.</translation>
 <translation id="7010160495478792664">가능한 경우 하드웨어 가속을 통해 동영상을 디코딩합니다.</translation>
 <translation id="7010400591230614821">적극적인 탭 개방 전략</translation>
 <translation id="701080569351381435">소스 보기</translation>
@@ -4348,6 +4448,7 @@
 <translation id="7061692898138851896">비밀번호 자동 저장</translation>
 <translation id="7062222374113411376">최근에 닫은 사이트에서 데이터 전송 및 수신을 완료하도록 허용(권장)</translation>
 <translation id="7063129466199351735">바로가기 처리 중...</translation>
+<translation id="7063957500469387217">Google 클라우드 프린트에서 프린터 설정 또는 관리</translation>
 <translation id="7065223852455347715">이 기기는 엔터프라이즈 등록을 방지하는 모드로 잠긴 상태입니다. 기기를 등록하려면 먼저 기기를 복구해야 합니다.</translation>
 <translation id="7065534935986314333">시스템 정보</translation>
 <translation id="7066944511817949584">'<ph name="DEVICE_NAME" />'에 연결하지 못했습니다.</translation>
@@ -4410,6 +4511,7 @@
 <translation id="715118844758971915">일반 프린터</translation>
 <translation id="7154130902455071009">다음으로 시작 페이지 변경: <ph name="START_PAGE" /></translation>
 <translation id="715487527529576698">중국어 간체를 초기 중국어 모드로 설정</translation>
+<translation id="7155171745945906037">카메라 또는 파일의 기존 사진</translation>
 <translation id="715568033737470079">Win32k 잠금 샌드박스 정책 내에서 실행될 PPAPI 플러그인을 지정합니다(Windows 10 이상만 해당).</translation>
 <translation id="7156235233373189579">이 파일은 Windows 소프트웨어를 사용하는 PC용으로 설계되었으며 Chrome OS를 실행하는 기기와 호환되지 않습니다. 적합한 대체 앱을 찾으려면 <ph name="BEGIN_LINK" />Chrome 웹 스토어<ph name="END_LINK" />를 검색하세요. <ph name="BEGIN_LINK_HELP" />자세히 알아보기<ph name="END_LINK_HELP" /></translation>
 <translation id="7157063064925785854">계속을 클릭하면 <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> 및 <ph name="LEGAL_DOC_LINK_TEXT_4" />에 동의하는 것으로 간주됩니다.</translation>
@@ -4426,6 +4528,7 @@
 <translation id="7175353351958621980">로드 위치:</translation>
 <translation id="7180611975245234373">새로고침</translation>
 <translation id="7180865173735832675">맞춤설정</translation>
+<translation id="7185078796915954712">TLS 1.3</translation>
 <translation id="7185690883425432021">탭 스트림이 겹침 모드일 때 비활성 탭의 닫기 버튼을 숨깁니다.</translation>
 <translation id="7186088072322679094">툴바에 보관</translation>
 <translation id="719009910964971313">US 프로그래머 드보락 키보드</translation>
@@ -4465,6 +4568,8 @@
 <translation id="7240120331469437312">인증서 대상 대체 이름</translation>
 <translation id="7241389281993241388"><ph name="TOKEN_NAME" />에 로그인하여 클라이언트 인증서를 가져오세요.</translation>
 <translation id="7243055093079293866">새 탭과 google.com에서 "Ok Google"이라고 말하기</translation>
+<translation id="7243632151880336635">지우기 및 로그아웃</translation>
+<translation id="7245628041916450754"><ph name="WIDTH" />x<ph name="HEIGHT" />(최고)</translation>
 <translation id="724691107663265825">다음 사이트에 멀웨어가 있습니다.</translation>
 <translation id="725109152065019550">관리자가 계정에서 외부 저장소를 사용 중지했습니다.</translation>
 <translation id="7252661675567922360">로드하지 마세요.</translation>
@@ -4478,7 +4583,9 @@
 <translation id="7262004276116528033">이 로그인 서비스는 <ph name="SAML_DOMAIN" />에서 호스팅됩니다.</translation>
 <translation id="7262221505565121">샌드박스 처리되지 않은 플러그인 액세스 예외</translation>
 <translation id="7264275118036872269">블루투스 기기 검색을 시작하지 못했습니다.</translation>
+<translation id="7264454014834869122">Chrome 웹 스토어에서 선택하기</translation>
 <translation id="726502072182862130">Google 프로필 이름 및 아이콘</translation>
+<translation id="7267186368513450821">5</translation>
 <translation id="7268365133021434339">탭 닫기</translation>
 <translation id="7268659760406822741">사용 가능한 서비스</translation>
 <translation id="7273110280511444812">최근 첨부 날짜: <ph name="DATE" /></translation>
@@ -4495,6 +4602,7 @@
 <translation id="7287143125007575591">액세스가 거부되었습니다.</translation>
 <translation id="7288592446024861651">북마크, 방문 기록, 비밀번호, 기타 설정이 Google 계정에 동기화되므로 모든 기기에서 사용할 수 있습니다. <ph name="BEGIN_LINK" />에서 무엇을 동기화할지 관리하세요.</translation>
 <translation id="7288676996127329262"><ph name="HORIZONTAL_DPI" />x<ph name="VERTICAL_DPI" />dpi</translation>
+<translation id="7289225569524511578">배경화면 앱 열기</translation>
 <translation id="7290242001003353852"><ph name="SAML_DOMAIN" />에서 호스팅하는 이 로그인 서비스는 카메라에 액세스합니다.</translation>
 <translation id="7290594223351252791">등록 확인</translation>
 <translation id="7295019613773647480">관리 대상 사용자를 사용하도록 설정</translation>
@@ -4533,6 +4641,7 @@
 <translation id="7347751611463936647">이 확장 프로그램을 사용하려면 '<ph name="EXTENSION_KEYWORD" />'(을)를 입력하고 TAB을 누른 다음 명령어 또는 검색어를 입력하세요.</translation>
 <translation id="7348093485538360975">터치 키보드</translation>
 <translation id="7348749398828259943">미국 워크맨(국제) 키보드</translation>
+<translation id="7352495173098919663">수정</translation>
 <translation id="7352651011704765696">문제가 발생한 경우</translation>
 <translation id="7353651168734309780"><ph name="EXTENSION_NAME" />은(는) 새로운 권한이 필요합니다.</translation>
 <translation id="7361039089383199231">$1바이트</translation>
@@ -4644,6 +4753,7 @@
 <translation id="749028671485790643">사용자 이름 <ph name="VALUE" /></translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7493386493263658176"><ph name="EXTENSION_NAME" /> 확장 프로그램에서 비밀번호와 신용카드 번호 등의 개인정보를 포함해 입력하는 모든 텍스트를 수집할 수 있습니다. 이 확장 프로그램을 사용하시겠어요?</translation>
+<translation id="7494694779888133066"><ph name="WIDTH" />x<ph name="HEIGHT" /></translation>
 <translation id="7495424355577885780">사용 설정하면 문제 신고 시 머티리얼 디자인 의견 UI가 로드됩니다.</translation>
 <translation id="7495778526395737099">이전 암호를 잊으셨나요?</translation>
 <translation id="7503191893372251637">Netscape Certificate Type</translation>
@@ -4715,7 +4825,6 @@
 <translation id="7587108133605326224">발트어</translation>
 <translation id="7589461650300748890">주의하세요.</translation>
 <translation id="7589661784326793847">잠시만 기다려 주세요.</translation>
-<translation id="7593635197364225277">Play 앱 데이터를 Google 드라이브에 자동으로 백업하고 복구합니다. 언제든지 Android 설정에서 변경할 수 있습니다. <ph name="BEGIN_LINK1" />자세히 알아보기<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" />(오류 코드: <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">가져오기</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" /> 번역 안함</translation>
@@ -4761,6 +4870,7 @@
 <translation id="7654941827281939388">이 계정은 이미 이 컴퓨터에서 사용되고 있습니다.</translation>
 <translation id="7658239707568436148">취소</translation>
 <translation id="7659584679870740384">더 이상 이 기기를 사용할 권한이 없습니다. 관리자에게 로그인 권한에 대해 문의하세요.</translation>
+<translation id="7661259717474717992">사이트에서 쿠키 데이터 저장 및 읽기 허용</translation>
 <translation id="7663719505383602579">수신기: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7664620655576155379">지원되지 않는 블루투스 기기(<ph name="DEVICE_NAME" />)입니다.</translation>
 <translation id="7665369617277396874">계정 추가</translation>
@@ -4790,6 +4900,7 @@
 <translation id="7709152031285164251">실패 - <ph name="INTERRUPT_REASON" /></translation>
 <translation id="7709980197120276510">계속을 클릭하면 <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" />, <ph name="LEGAL_DOC_LINK_TEXT_4" /> 및 <ph name="LEGAL_DOC_LINK_TEXT_5" />에 동의하는 것으로 간주됩니다.</translation>
 <translation id="7712140766624186755">정책에 의해 요청하도록 설정</translation>
+<translation id="7712196439824268605">추측하기 쉬운 PIN입니다.</translation>
 <translation id="7713320380037170544">모든 사이트에서 시스템 전용 메시지를 사용하여 MIDI 기기에 액세스하도록 허용</translation>
 <translation id="7714464543167945231">인증서</translation>
 <translation id="7716020873543636594">마우스 포인터를 정지하면 자동으로 클릭</translation>
@@ -4797,6 +4908,8 @@
 <translation id="7716781361494605745">Netscape 인증 기관 정책 URL</translation>
 <translation id="7716970641886237992">수정한 사용자:</translation>
 <translation id="7717014941119698257">다운로드: <ph name="STATUS" /></translation>
+<translation id="7717845620320228976">업데이트 확인</translation>
+<translation id="7719367874908701697">페이지 확대/축소</translation>
 <translation id="7719421816612904796">교육 시간 초과</translation>
 <translation id="771953673318695590">QA</translation>
 <translation id="7720375555307821262">이 사용자를 관리하려면 <ph name="BEGIN_LINK" />Chrome에 로그인<ph name="END_LINK" />하세요.</translation>
@@ -4809,6 +4922,7 @@
 <translation id="7742762435724633909">공급자 이름:</translation>
 <translation id="774465434535803574">확장 프로그램 패키지 오류</translation>
 <translation id="7748528009589593815">이전 탭</translation>
+<translation id="7748734060566306235">화살표 키를 사용하여 사진 크기와 정렬을 조정하세요.</translation>
 <translation id="7751260505918304024">전체 보기</translation>
 <translation id="7754704193130578113">다운로드 전에 각 파일의 저장 위치 확인</translation>
 <translation id="775622227562445982">빠른 탭/창 닫기</translation>
@@ -4845,6 +4959,7 @@
 <translation id="7791543448312431591">추가</translation>
 <translation id="7792012425874949788">로그인 중에 문제가 발생했습니다.</translation>
 <translation id="7792388396321542707">공유 중지</translation>
+<translation id="7792744925237334808">타사 웹사이트에서 쿠키 데이터를 저장하고 읽을 수 없도록 방지</translation>
 <translation id="7794058097940213561">기기 포맷</translation>
 <translation id="7799329977874311193">HTML 문서</translation>
 <translation id="7800518121066352902">반시계 방향으로 회전(&amp;O)</translation>
@@ -4926,6 +5041,7 @@
 <translation id="7902482560616980555">FontCache 크기 조정</translation>
 <translation id="7903128267494448252">이 사용자 삭제</translation>
 <translation id="7903345046358933331">페이지에서 응답이 없습니다. 페이지가 응답할 때까지 기다리거나 페이지를 닫으세요.</translation>
+<translation id="7903742244674067440">다음 인증기관을 식별하는 인증서가 등록되어 있습니다.</translation>
 <translation id="7903925330883316394">유틸리티: <ph name="UTILITY_TYPE" /></translation>
 <translation id="7903984238293908205">가타카나</translation>
 <translation id="7904094684485781019">이 계정의 관리자가 멀티 로그인을 허용하지 않습니다.</translation>
@@ -4973,6 +5089,7 @@
 <translation id="7973320858902175766">구성요소 패처</translation>
 <translation id="7974067550340408553">Smart Lock으로 <ph name="DEVICE_TYPE" />이(가) 잠금 해제될 때마다 휴대전화로 알림 받기</translation>
 <translation id="7974566588408714340"><ph name="EXTENSIONNAME" />을(를) 사용하여 다시 시도</translation>
+<translation id="7974936243149753750">오버스캔</translation>
 <translation id="7977551819349545646">Chromebox를 업데이트하는 중...</translation>
 <translation id="7978412674231730200">비공개 키</translation>
 <translation id="7979036127916589816">동기화 오류</translation>
@@ -5039,9 +5156,11 @@
 <translation id="8054563304616131773">올바른 이메일 주소를 입력하세요.</translation>
 <translation id="8054921503121346576">USB 키보드 연결됨</translation>
 <translation id="8056430285089645882">확인했습니다. 다시 표시하지 않습니다.</translation>
+<translation id="8058655154417507695">만료 연도</translation>
 <translation id="8059178146866384858">'$1'(이)라는 파일이 이미 존재합니다. 다른 이름을 선택하세요.</translation>
 <translation id="8059417245945632445">기기 검사(&amp;I)</translation>
 <translation id="8061298200659260393">모든 사이트에서 푸시 메시지를 보내지 못하게 합니다.</translation>
+<translation id="8061820249063924643">관리 대상 사용자 관리</translation>
 <translation id="8063235345342641131">기본 녹색 아바타</translation>
 <translation id="8064671687106936412">키:</translation>
 <translation id="806705617346045388">비정상적 동작 감지됨</translation>
@@ -5049,7 +5168,9 @@
 <translation id="8069615408251337349">Google 클라우드 프린트</translation>
 <translation id="8071942001314758122">"Ok Google"이라고 세 번 말하세요.</translation>
 <translation id="8072988827236813198">탭 고정</translation>
+<translation id="8074127646604999664">최근에 닫은 사이트에서 데이터 전송 및 수신을 완료하도록 허용</translation>
 <translation id="8079530767338315840">반복</translation>
+<translation id="8081705606384362428">PIN을 선택하세요.</translation>
 <translation id="8083739373364455075">Google 드라이브에서 100GB의 공간을 무료로 사용하세요.</translation>
 <translation id="8088137642766812908">주의하세요. 이 기능은 문제를 일으킬 수 있습니다.</translation>
 <translation id="8089520772729574115">1MB 미만</translation>
@@ -5202,6 +5323,7 @@
 <translation id="827097179112817503">홈 버튼 표시</translation>
 <translation id="8272443605911821513">'추가 도구' 메뉴에서 확장 프로그램을 클릭하여 확장 프로그램을 관리할 수 있습니다.</translation>
 <translation id="8275038454117074363">가져오기</translation>
+<translation id="827606011343515871">인증서가 없습니다.</translation>
 <translation id="8276560076771292512">캐시 비우기 및 강력 새로고침</translation>
 <translation id="8279388322240498158">소라니 쿠르드어 영어 기반 키보드</translation>
 <translation id="8280151743281770066">알마니아어 표음</translation>
@@ -5222,7 +5344,6 @@
 <translation id="8300607741108698921">1분이면 설정</translation>
 <translation id="8303650969500425356">자바스크립트가 화면 방향을 잠그도록 허용합니다.</translation>
 <translation id="8303655282093186569">병음 입력 설정</translation>
-<translation id="830424806940379275">확장 프로그램에서 브라우저 프레임 외부에서 열리는 패널 창을 생성하도록 허용합니다. 기본적으로 또는 사용하지 않도록 설정한 경우 패널을 열려고 하면 팝업이 대신 열립니다. 데스크톱 OS의 패널은 지원 중단되었으며 곧 삭제됩니다.</translation>
 <translation id="8306534594034939679">실험용 HTTP 기능인 대안 서비스 지원 사용</translation>
 <translation id="8307376264102990850">충전 완료까지
 남은 시간 계산 중</translation>
@@ -5247,9 +5368,11 @@
 <translation id="8337399713761067085">현재 오프라인 상태</translation>
 <translation id="8338952601723052325">개발자 웹사이트</translation>
 <translation id="8339012082103782726">내 마이크에 대한 모든 사이트의 액세스를 허용 안 함</translation>
+<translation id="8339059274628563283"><ph name="SITE" />에 로컬 저장된 데이터</translation>
 <translation id="8342318071240498787">같은 이름을 가진 파일 또는 디렉토리가 이미 존재합니다.</translation>
 <translation id="834457929814110454">보안 관련 위험을 이해한다면 악성 프로그램이 삭제되기 전에 <ph name="BEGIN_LINK" />이 사이트를 방문<ph name="END_LINK" />해도 됩니다.</translation>
 <translation id="8345553596530559351">사용 설정하면 chrome://history/ URL에서 머티리얼 디자인 기록 페이지를 로드합니다.</translation>
+<translation id="8347045947573765315">모든 사이트에서 양식 내에 키 생성 사용 허용</translation>
 <translation id="8351419472474436977">이 확장 프로그램이 프록시 설정을 제어할 수 있게 되었으며, 따라서 사용자가 온라인에서 수행하는 모든 작업을 변경 및 중단하고 엿볼 수 있게 되었음을 의미합니다. 이와 같이 변경된 이유가 확실하지 않다면 이 설정을 사용하지 않는 것이 좋습니다.</translation>
 <translation id="8352772353338965963">멀티 로그인에 계정을 추가하세요. 비밀번호를 입력하지 않고 모든 로그인 계정에 액세스할 수 있으므로 이 기능은 신뢰할 수 있는 계정에만 사용해야 합니다.</translation>
 <translation id="8353683614194668312">앱의 권한:</translation>
@@ -5334,15 +5457,20 @@
 <translation id="845627346958584683">만료 시간</translation>
 <translation id="8456681095658380701">잘못된 이름입니다.</translation>
 <translation id="8457625695411745683">좋음</translation>
+<translation id="8460336040822756677"><ph name="DEVICE_TYPE" />용 Smart Lock을 사용 중지하면 휴대전화를 사용하여 Chrome 기기를 잠금 해제할 수 없으며 비밀번호를 입력해야 합니다.</translation>
+<translation id="84613761564611563">네트워크 구성 UI를 요청했습니다. 잠시만 기다려 주세요.</translation>
 <translation id="8461914792118322307">프록시</translation>
 <translation id="8463215747450521436">이 관리 대상 사용자가 삭제되었거나 사용 중지되었습니다. 이 사용자로 계속 로그인하려면 관리자에게 문의하세요.</translation>
 <translation id="8464132254133862871">서비스를 받을 수 없는 사용자 계정입니다.</translation>
 <translation id="8464505512337106916">중요한 플러그인 콘텐츠 감지 및 실행(권장)</translation>
+<translation id="8465252176946159372">잘못된 값입니다.</translation>
 <translation id="8466234950814670489">Tar 압축 파일</translation>
 <translation id="8467473010914675605">한국어 입력 방법</translation>
+<translation id="8468750959626135884">Android 휴대전화로 <ph name="DEVICE_TYPE" />을(를) 잠금 해제하세요.</translation>
 <translation id="8472623782143987204">하드웨어 지원</translation>
 <translation id="8475313423285172237">컴퓨터의 다른 프로그램에서 Chrome 작동에 영향을 줄 수 있는 확장 프로그램을 추가했습니다.</translation>
 <translation id="8475647382427415476">Google 드라이브에서 '<ph name="FILENAME" />'을(를) 동기화하지 못했습니다. Google 드라이브에서 나중에 다시 시도합니다.</translation>
+<translation id="8476195663057048998">삭제 및 재설정</translation>
 <translation id="8477241577829954800">대체됨</translation>
 <translation id="8477384620836102176">일반(&amp;G)</translation>
 <translation id="8480417584335382321">페이지 확대/축소:</translation>
@@ -5374,6 +5502,7 @@
 <translation id="8524066305376229396">영구 저장소:</translation>
 <translation id="8525306231823319788">전체화면</translation>
 <translation id="8528962588711550376">로그인 중입니다.</translation>
+<translation id="8532294913309524834">원하는 대로 언어를 정렬하세요.</translation>
 <translation id="8535005006684281994">Netscape Certificate Renewal URL</translation>
 <translation id="8539727552378197395">허용 안함(Http만)</translation>
 <translation id="8543181531796978784"><ph name="BEGIN_ERROR_LINK" />감지 문제를 신고<ph name="END_ERROR_LINK" />할 수 있으며, 보안에 미치는 위험을 감수한다면 <ph name="BEGIN_LINK" />이 안전하지 않은 사이트를 방문<ph name="END_LINK" />할 수 있습니다.</translation>
@@ -5388,6 +5517,7 @@
 <translation id="855081842937141170">탭 고정</translation>
 <translation id="8551388862522347954">라이선스</translation>
 <translation id="8551494947769799688">라트비아어</translation>
+<translation id="8553342806078037065">다른 사용자 관리</translation>
 <translation id="855705891482654011">압축해제된 확장 프로그램 로드</translation>
 <translation id="855773602626431402">이 페이지에서 샌드박스 처리되지 않은 플러그인 실행을 차단하였습니다.</translation>
 <translation id="8559694214572302298">이미지 디코더</translation>
@@ -5465,6 +5595,7 @@
 <translation id="8662978096466608964">Chrome에서 배경화면을 설정할 수 없습니다.</translation>
 <translation id="8663099077749055505"><ph name="HOST" />에서 여러 항목을 자동으로 다운로드하지 않도록 항상 차단</translation>
 <translation id="8664389313780386848">페이지 소스 보기(&amp;V)</translation>
+<translation id="866611985033792019">이메일 사용자를 식별하기 위해 이 인증서 신뢰</translation>
 <translation id="8666678546361132282">영어</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" />이(가) 현재 전체화면으로 전환되었으며 마우스 커서가 사용 중지되었습니다.</translation>
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" />이(가) 최신 버전입니다.</translation>
@@ -5588,6 +5719,7 @@
 <translation id="8813811964357448561">장</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="881799181680267069">기타 숨기기</translation>
+<translation id="8818152010000655963">배경화면</translation>
 <translation id="8818152613617627612">결제 세부정보</translation>
 <translation id="8820817407110198400">북마크</translation>
 <translation id="8820961991571528294">테스트 중</translation>
@@ -5598,8 +5730,10 @@
 <translation id="8828933418460119530">DNS 이름</translation>
 <translation id="8830796635868321089">현재 프록시 설정을 사용하여 업데이트를 확인하지 못했습니다. <ph name="PROXY_SETTINGS_LINK_START" />프록시 설정<ph name="PROXY_SETTINGS_LINK_END" />을 조정하세요.</translation>
 <translation id="8831623914872394308">포인터 설정</translation>
+<translation id="8833040047958643283">웹사이트에서 표시할 콘텐츠, 인터넷 검색 중 웹사이트에서 사용할 정보를 제어할 수 있습니다.</translation>
 <translation id="8837103518490433332"><ph name="PASSWORD_MANAGER_BRAND" />이(가) <ph name="ORIGIN" />의 비밀번호를 저장하도록 하시겠습니까?</translation>
 <translation id="8838770651474809439">햄버거</translation>
+<translation id="8839157109304700852">Google 대시보드 열기</translation>
 <translation id="8841142799574815336">시각 표시 영역 비활성</translation>
 <translation id="884264119367021077">배송지 주소</translation>
 <translation id="8845001906332463065">도움말 보기</translation>
@@ -5610,11 +5744,13 @@
 <translation id="885381502874625531">벨라루스어 키보드</translation>
 <translation id="8856844195561710094">블루투스 기기 검색을 중단하지 못했습니다.</translation>
 <translation id="885701979325669005">저장소</translation>
+<translation id="8858798938034909167">어떤 기기에서든 <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />에서 비밀번호에 액세스하세요.</translation>
 <translation id="8859057652521303089">언어 선택:</translation>
 <translation id="8859116917079399781">콘텐츠 차단됨</translation>
 <translation id="8859174528519900719">서브프레임: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="8860454412039442620">Excel 스프레드시트</translation>
 <translation id="8863489667196658337">새 시스템을 북마크 앱 생성에 사용</translation>
+<translation id="8866013684546696613">도형을 사용할 수 있는 개요 창의 최대 개수입니다.</translation>
 <translation id="8866441758832353668">스크롤 고정</translation>
 <translation id="8868245144144497543">생성한 사용자:</translation>
 <translation id="8868626022555786497">사용 중</translation>
@@ -5672,6 +5808,7 @@
 <translation id="894360074127026135">Netscape International Step-Up</translation>
 <translation id="8944779739948852228">프린터 검색됨</translation>
 <translation id="8944964446326379280"><ph name="APP_NAME" />에서 <ph name="TAB_NAME" />와(과) 창을 공유 중입니다.</translation>
+<translation id="8946284507644756416">Android 휴대전화를 사용하여 <ph name="DEVICE_TYPE" />을(를) 잠금 해제할 수 있습니다.</translation>
 <translation id="8946359700442089734">이 <ph name="IDS_SHORT_PRODUCT_NAME" /> 기기에서 디버깅 기능의 사용 설정을 완료하지 못했습니다.</translation>
 <translation id="8946784827990177241">WebUSB 지원을 사용합니다.</translation>
 <translation id="89515141420106838">프린터 드라이버에 대해 Chrome 웹 스토어 갤러리 앱을 사용 설정합니다. 그러면 앱이 Chrome 웹 스토어에서 특정 USB ID를 사용하는 USB 프린터로의 인쇄를 지원하는 확장 프로그램을 검색합니다.</translation>
@@ -5749,6 +5886,7 @@
 <translation id="9040185888511745258"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />에 있는 해커가 브라우저 환경에 악영향을 미치는 프로그램을 설치하도록 속임수(예를 들어, 방문하는 사이트의 홈페이지를 변경하거나 추가로 광고를 표시)를 시도할 수 있습니다.</translation>
 <translation id="9040421302519041149">이 네트워크에 대한 액세스는 보호되어 있습니다.</translation>
 <translation id="9041603713188951722">창에 설정 표시</translation>
+<translation id="9042893549633094279">개인정보 및 보안</translation>
 <translation id="904451693890288097">'<ph name="DEVICE_NAME" />'의 암호를 입력하세요:</translation>
 <translation id="9049835026521739061">한글 모드</translation>
 <translation id="9050666287014529139">암호</translation>
@@ -5759,6 +5897,7 @@
 <translation id="9056810968620647706">일치하는 항목이 없습니다.</translation>
 <translation id="9059868303873565140">상태 메뉴</translation>
 <translation id="9064142312330104323">Google 프로필 사진(로드 중)</translation>
+<translation id="9064275926664971810">클릭 한 번으로 양식을 작성하는 자동완성 사용</translation>
 <translation id="9064939804718829769">이전 중...</translation>
 <translation id="9065203028668620118">수정</translation>
 <translation id="9066075624350113914">이 PDF 문서의 일부분을 표시하지 못했습니다.</translation>
@@ -5780,6 +5919,8 @@
 <translation id="9088917181875854783">다음 패스키가 '<ph name="DEVICE_NAME" />'에 표시되는지 확인하세요.</translation>
 <translation id="9092426026094675787">보안이 약한 출처를 비보안으로 표시</translation>
 <translation id="9094033019050270033">비밀번호 업데이트</translation>
+<translation id="9094982973264386462">제거</translation>
+<translation id="9095253524804455615">제거</translation>
 <translation id="9100765901046053179">고급 설정</translation>
 <translation id="910077499156148110">사이트를 예외로 추가</translation>
 <translation id="9100825730060086615">키보드 유형</translation>
@@ -5871,8 +6012,11 @@
 <translation id="9218430445555521422">기본 브라우저로 설정</translation>
 <translation id="9219103736887031265">이미지</translation>
 <translation id="9220525904950070496">계정 삭제</translation>
+<translation id="9221503095691269353">빠른 잠금 해제 구성</translation>
 <translation id="923467487918828349">모두 표시</translation>
+<translation id="927151012416335806">기기를 <ph name="CHANNEL_NAME" /> 채널로 업데이트 중</translation>
 <translation id="930268624053534560">상세 타임스탬프</translation>
+<translation id="931068751149008062">글꼴 유형 및 인코딩 선택</translation>
 <translation id="932327136139879170">홈</translation>
 <translation id="932508678520956232">인쇄를 시작할 수 없습니다.</translation>
 <translation id="936801553271523408">시스템 진단 데이터</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 0d1553a..51a74bef 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -1933,6 +1933,7 @@
 <translation id="3590559774363307859">Slaptažodis išsaugotas. Jį ir visus <ph name="SAVED_PASSWORDS_LINK" /> galite pasiekti naudodami bet kurią naršyklę.</translation>
 <translation id="3590587280253938212">greita</translation>
 <translation id="3592260987370335752">&amp;Sužinokite daugiau</translation>
+<translation id="3592313833691251126">Leiskite plėtiniams kurti skydelio langus, kurie atsidaro už naršyklės rėmelio. Jei neįgalinta, bandant atidaryti skydelį bus atidarytas iššokantysis langas. Numatytoji elgsena – leisti tik į baltąjį sąrašą įtrauktus plėtinius. Jei įgalinta, bus leidžiami visi plėtiniai, jei ne – nebus leidžiami jokio plėtinio skydeliai.</translation>
 <translation id="359283478042092570">Įvesti</translation>
 <translation id="3593152357631900254">Įgalinti netikslų Pinjino režimą</translation>
 <translation id="3593965109698325041">Sertifikato pavadinimo apribojimai</translation>
@@ -2255,7 +2256,6 @@
 <translation id="4034042927394659004">Sumažinti klaviatūros šviesumą</translation>
 <translation id="4035758313003622889">&amp;Užduočių tvarkytuvė</translation>
 <translation id="4037084878352560732">Arklys</translation>
-<translation id="4037102579141982963">Įrenginys automatiškai siųs diagnostikos ir naudojimo duomenis „Google“. Šį nustatymą galite bet kada pakeisti įrenginio <ph name="BEGIN_LINK1" />nustatymuose<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Sužinokite daugiau<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Įgalinti „Android“ skirtą pasiekiamumo skirtukų perjungiklį.</translation>
 <translation id="4044260751144303020">Fiksuotos pozicijos elementų komponavimas.</translation>
 <translation id="404493185430269859">Numatytasis paieškos variklis</translation>
@@ -3228,7 +3228,6 @@
 <translation id="5439568486246921931">Atlikus šį veiksmą, visam laikui bus ištrinti naudotojo atsisiųsti duomenys, neprisijungus pasiekiami failai ir naršymo duomenys. Šio veiksmo negalima anuliuoti.</translation>
 <translation id="544083962418256601">Kurti sparčiuosius klavišus...</translation>
 <translation id="5441100684135434593">Laidinis tinklas</translation>
-<translation id="5445088910157062298">„Google“ vietovės paslauga gali padėti programoms greitai ir tiksliai nustatyti jūsų buvimo vietą. Tai gali padėti sumažinti akumuliatoriaus energijos sąnaudas. Anoniminiai vietovės duomenys bus siunčiami sistemai „Google“, net jei nepaleista jokia programa.</translation>
 <translation id="5448293924669608770">Oi, prisijungiant įvyko klaida</translation>
 <translation id="5449588825071916739">Žymėti visus skirtukus</translation>
 <translation id="5449716055534515760">Uždaryti lan&amp;gą</translation>
@@ -3697,7 +3696,6 @@
 <translation id="6110466548232134880">„<ph name="ORGANIZATION" />“ (<ph name="LOCALITY" />) tapatybę patvirtino „<ph name="ISSUER" />“. Serveris nepateikė sertifikato skaidrumo informacijos.</translation>
 <translation id="6111770213269631447">Transliteracija (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Leidžiama pagal numatytuosius nustatymus</translation>
-<translation id="6112929985131461002">Įrenginys automatiškai siųs diagnostikos ir naudojimo duomenis „Google“. Šį <ph name="BEGIN_LINK1" />nustatymą<ph name="END_LINK1" /> priverstinai pritaikė administratorius. <ph name="BEGIN_LINK2" />Sužinokite daugiau<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Keisti kalbos ir įvesties nustatymus</translation>
 <translation id="6120205520491252677">Prisegti šį puslapį prie pradžios ekrano...</translation>
 <translation id="6122081475643980456">Jūsų interneto ryšys yra kontroliuojamas</translation>
@@ -3933,7 +3931,6 @@
 <translation id="6452181791372256707">Atmesti</translation>
 <translation id="6454421252317455908">Įvesties kinų k. metodas (spartusis)</translation>
 <translation id="6455348477571378046">Sertifikato tipas:</translation>
-<translation id="6456234919706689841">Administratorius gali pasirinkti siųsti šio įrenginio diagnostikos ir naudojimo duomenis „Google“. Šį <ph name="BEGIN_LINK1" />nustatymą<ph name="END_LINK1" /> galite peržiūrėti čia. <ph name="BEGIN_LINK2" />Sužinokite daugiau<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Tęsti „JavaScript“ blokavimą</translation>
 <translation id="6458308652667395253">Valdyti „JavaScript“ blokavimą...</translation>
 <translation id="6459488832681039634">Paieškai naudoti pasirinkimą</translation>
@@ -4716,7 +4713,6 @@
 <translation id="7587108133605326224">Baltijos šalių</translation>
 <translation id="7589461650300748890">Oi, būkite atsargūs.</translation>
 <translation id="7589661784326793847">Luktelėkite sekundėlę</translation>
-<translation id="7593635197364225277">Atsarginės „Google Play“ programos duomenų kopijos kuriamos automatiškai ir atkuriamos „Google“ diske. Šį nustatymą bet kada galite pakeisti „Android“ nustatymuose. <ph name="BEGIN_LINK1" />Sužinokite daugiau<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (klaidos kodas: <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Gerai, importuoti</translation>
 <translation id="7600965453749440009">Niekada neversti <ph name="LANGUAGE" /></translation>
@@ -5223,7 +5219,6 @@
 <translation id="8300607741108698921">Greitas nustatymas</translation>
 <translation id="8303650969500425356">Leidžiama „JavaScript“ užrakinti ekrano orientaciją.</translation>
 <translation id="8303655282093186569">Pinjino k. įvesties nustatymai</translation>
-<translation id="830424806940379275">Leisti plėtiniams kurti skydelio langus, kurie atidaromi ne naršyklės rėmelyje. Pagal numatytuosius nustatymus arba išjungus, bandant atidaryti skydelį, vietoje jo bus atidarytas iššokantysis langas. Skydeliai stalinių kompiuterių operacinėse sistemose nebenaudojami ir netrukus bus pašalinti.</translation>
 <translation id="8306534594034939679">Įgalinti alternatyviųjų paslaugų palaikymą kaip eksperimentinę HTTP funkciją.</translation>
 <translation id="8307376264102990850">Kraunama
 Skaičiuojamas laikas, kol bus įkrauta</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 0ca9b94d..6fe8d3a 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1935,6 +1935,7 @@
 <translation id="3590559774363307859">Parole ir saglabāta. Šai parolei un sarakstam “<ph name="SAVED_PASSWORDS_LINK" />” varat piekļūt jebkurā pārlūkā.</translation>
 <translation id="3590587280253938212">ātra</translation>
 <translation id="3592260987370335752">&amp;Uzziniet vairāk</translation>
+<translation id="3592313833691251126">Paplašinājumiem tiek atļauts izveidot paneļa logus, kuri tiek atvērti ārpus pārlūka ietvara. Ja opcija nav iespējota, mēģinot atvērt paneli, tiks atvērts uznirstošais logs. Pēc noklusējuma tiek atļauti tikai baltajā sarakstā esošie paplašinājumi. Ja opcija ir iespējota, paneļi ir atļauti visiem paplašinājumiem. Ja opcija ir atspējota, paneļu atvēršana netiek atļauta nevienam paplašinājumam.</translation>
 <translation id="359283478042092570">Ievadīt</translation>
 <translation id="3593152357631900254">Iespējot Fuzzy-Pinyin režīmu</translation>
 <translation id="3593965109698325041">Sertifikāta nosaukuma ierobežojumi</translation>
@@ -2257,7 +2258,6 @@
 <translation id="4034042927394659004">Samazināt taustiņu spilgtumu</translation>
 <translation id="4035758313003622889">Uzdevumu pārvaldnieks</translation>
 <translation id="4037084878352560732">Zirgs</translation>
-<translation id="4037102579141982963">No šīs ierīces tiks automātiski sūtīti diagnostikas un lietojuma dati Google serveriem. Jebkurā brīdī varat to mainīt ierīces <ph name="BEGIN_LINK1" />iestatījumos<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Uzziniet vairāk<ph name="END_LINK2" />.</translation>
 <translation id="4037463823853863991">Iespējot pieejamības ciļņu pārslēdzēju Android ierīcēm.</translation>
 <translation id="4044260751144303020">Saliktu slāņu veidošana fiksētas pozīcijas elementiem</translation>
 <translation id="404493185430269859">Noklusējuma meklētājprogramma</translation>
@@ -3231,7 +3231,6 @@
 <translation id="5439568486246921931">Veicot šo darbību, tiks neatgriezeniski dzēsti šī lietotāja lejupielādētie dati, bezsaistes faili un pārlūkošanas dati. Šo darbību nevar atsaukt.</translation>
 <translation id="544083962418256601">Izveidot saīsnes...</translation>
 <translation id="5441100684135434593">Vadu tīkls</translation>
-<translation id="5445088910157062298">Atļaujiet Google atrašanās vietu pakalpojumam palīdzēt lietotnēm ātri un precīzi atrast jūsu atrašanās vietu. Tādējādi varat samazināt akumulatora enerģijas patēriņu. Google serveriem tiks sūtīti anonīmi atrašanās vietas dati pat tad, ja nedarbosies neviena lietotne.</translation>
 <translation id="5448293924669608770">Diemžēl pierakstīšanās neizdevās</translation>
 <translation id="5449588825071916739">Saglabāt visas cilnes kā grāmatzīmes</translation>
 <translation id="5449716055534515760">Aizvērt Win&amp;dow</translation>
@@ -3699,7 +3698,6 @@
 <translation id="6110466548232134880">Organizācijas <ph name="ORGANIZATION" /> (atrašanās vieta: <ph name="LOCALITY" />) identitāti ir apstiprinājis <ph name="ISSUER" />. No servera netika iegūta sertifikātu pārskatāmības informācija.</translation>
 <translation id="6111770213269631447">Transliterācija (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Atļauts pēc noklusējuma</translation>
-<translation id="6112929985131461002">No šīs ierīces tiks automātiski sūtīti diagnostikas un lietojuma dati Google serveriem. Šo <ph name="BEGIN_LINK1" />iestatījumu<ph name="END_LINK1" /> ir noteicis administrators. <ph name="BEGIN_LINK2" />Uzziniet vairāk<ph name="END_LINK2" />.</translation>
 <translation id="6116921718742659598">Mainīt valodas un ievades iestatījumus</translation>
 <translation id="6120205520491252677">Piespraust šo lapu sākuma ekrānam...</translation>
 <translation id="6122081475643980456">Jūsu interneta savienojums tiek pārvaldīts</translation>
@@ -3935,7 +3933,6 @@
 <translation id="6452181791372256707">Noraidīt</translation>
 <translation id="6454421252317455908">Ķīniešu valodas ievades metode (ātra)</translation>
 <translation id="6455348477571378046">Sertifikāta veids:</translation>
-<translation id="6456234919706689841">Administrators var izvēlēties nosūtīt šīs ierīces diagnostikas un lietojuma datus Google serveriem. Varat skatīt šo <ph name="BEGIN_LINK1" />iestatījumu<ph name="END_LINK1" /> šeit. <ph name="BEGIN_LINK2" />Uzziniet vairāk<ph name="END_LINK2" />.</translation>
 <translation id="645705751491738698">Turpināt bloķēt JavaScript</translation>
 <translation id="6458308652667395253">Pārvaldīt JavaScript bloķēšanas iestatījumus...</translation>
 <translation id="6459488832681039634">Izmantot atlasīto meklēšanai</translation>
@@ -4717,7 +4714,6 @@
 <translation id="7587108133605326224">Baltu</translation>
 <translation id="7589461650300748890">Uzmanieties!</translation>
 <translation id="7589661784326793847">Mirkli uzgaidiet!</translation>
-<translation id="7593635197364225277">Automātiski dublēt un atjaunot Play lietotņu datus Google diskā. Šo iestatījumu jebkurā laikā varat mainīt Android iestatījumos. <ph name="BEGIN_LINK1" />Uzziniet vairāk<ph name="END_LINK1" />.</translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (kļūdas kods: <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Labi, importēt</translation>
 <translation id="7600965453749440009">Nekad netulkot saturu, kas rakstīts <ph name="LANGUAGE" /> valodā</translation>
@@ -5224,7 +5220,6 @@
 <translation id="8300607741108698921">1 minūtes iestatīšana</translation>
 <translation id="8303650969500425356">Valodai Javascript tiek atļauta ekrāna orientācijas bloķēšana.</translation>
 <translation id="8303655282093186569">Pinyin ievades iestatījumi</translation>
-<translation id="830424806940379275">Atļaut paplašinājumiem izveidot paneļu logus, kas tiek atvērti ārpus pārlūkprogrammas ietvara. Pēc noklusējuma vai, ja šī politika ir atspējota, mēģinot atvērt paneli, tiks atvērts uznirstošais logs. Paneļi datoru operētājsistēmās ir novecojuši un drīzumā tiks noņemti.</translation>
 <translation id="8306534594034939679">Iespējojiet alternatīvo pakalpojumu (eksperimentālas HTTP funkcijas) atbalstu.</translation>
 <translation id="8307376264102990850">Notiek uzlāde
 Tiek rēķināts atlikušais uzlādes laiks</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index afd9237..198665cc 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -1932,6 +1932,7 @@
 <translation id="3590559774363307859">പാസ്‌വേഡ് സംരക്ഷിച്ചു. ഏത് ബ്രൗസറിൽനിന്നും പാസ്‌വേഡും എല്ലാ <ph name="SAVED_PASSWORDS_LINK" /> എന്നതും ആക്‌സ്‌സ്സുചെയ്യാം.</translation>
 <translation id="3590587280253938212">വേഗത</translation>
 <translation id="3592260987370335752">&amp;കൂടുതലറിയുക</translation>
+<translation id="3592313833691251126">ബ്രൗസർ ഫ്രെയിമിന് പുറത്ത് തുറക്കുന്ന പാനൽ വിൻഡോകൾ സൃഷ്‌ടിക്കാൻ വിപുലീകരണങ്ങളെ അനുവദിക്കുക. പ്രവർത്തനക്ഷമമാക്കിയിട്ടില്ലെങ്കിൽ, ഒരു പാനൽ തുറക്കാൻ ശ്രമിക്കുമ്പോൾ പകരം ഒരു പോപ്പ്അപ്പ് തുറക്കുന്നതാണ്. വൈറ്റ്‌ലിസ്റ്റുചെയ്‌തിരിക്കുന്ന വിപുലീകരണങ്ങൾക്കായി മാത്രമേ ഡിഫോൾട്ട് പ്രവർത്തനരീതി അനുവദിച്ചിട്ടുള്ളൂ. പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്ന പ്രവർത്തനരീതി എല്ലാ വിപുലീകരണങ്ങൾക്കായും അനുവദിച്ചിരിക്കുന്നു. പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്ന പ്രവർത്തനരീതി, ഒരു വിപുലീകരണത്തിനായും പാനലുകളെ അനുവദിക്കുന്നതല്ല.</translation>
 <translation id="359283478042092570">നൽകുക</translation>
 <translation id="3593152357631900254">ഫസ്സി-പിന്‍‌യിന്‍‌ മോഡ് പ്രാപ്‌തമാക്കുക</translation>
 <translation id="3593965109698325041">സര്‍‌ട്ടിഫിക്കറ്റ് നാമ നിയന്ത്രണങ്ങള്‍‌</translation>
@@ -2253,7 +2254,6 @@
 <translation id="4034042927394659004">കീ തെളിച്ചം കുറയ്‌ക്കുക</translation>
 <translation id="4035758313003622889">&amp;ടാസ്ക് മാനേജര്‍</translation>
 <translation id="4037084878352560732">കുതിര</translation>
-<translation id="4037102579141982963">ഈ ഉപകരണം Google-ന് ഡയഗ്‌ണോസ്‌റ്റിക്, ഉപയോഗ വിവരം സ്വയം അയയ്‌ക്കും. നിങ്ങളുടെ ഉപകരണത്തിന്റെ  <ph name="BEGIN_LINK1" />ക്രമീകരണത്തിൽ<ph name="END_LINK1" /> എപ്പോൾ വേണമെങ്കിലും ഇത് മാറ്റാനാകും. <ph name="BEGIN_LINK2" />കൂടുതലറിയുക<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Android-നായി പ്രവേശനക്ഷമതാ ടാബ് സ്വിച്ചർ പ്രവർത്തനക്ഷമമാക്കുക.</translation>
 <translation id="4044260751144303020">നിശ്ചിത സ്ഥാനത്തെ ഘടകങ്ങൾക്കായുള്ള സംയോജനം.</translation>
 <translation id="404493185430269859">സ്ഥിര തിരയൽ എൻജിൻ</translation>
@@ -3227,7 +3227,6 @@
 <translation id="5439568486246921931">ഈ പ്രവർത്തനം ഉപയോക്താവിന്റെ ഡൗൺലോഡുകൾ, ഓഫ്‌ലൈൻ ഫയലുകൾ, ബ്രൗസിംഗ് വിവരങ്ങൾ എന്നിവയെ ശാശ്വതമായി ഇല്ലാതാക്കുന്നതിനിടയാക്കും. ഇത് പഴയപടിയാക്കാനാവില്ല.</translation>
 <translation id="544083962418256601">കുറുക്കുവഴികൾ സൃഷ്‌ടിക്കുക...</translation>
 <translation id="5441100684135434593">വയേഡ് നെറ്റ്വര്‍ക്ക്</translation>
-<translation id="5445088910157062298">നിങ്ങളുടെ ലൊക്കേഷൻ വേഗത്തിലും കൃത്യതയോടെയും കണ്ടെത്താൻ ആപ്‌സിനെ സഹായിക്കുന്നതിന് Google-ന്റെ ലൊക്കേഷൻ സേവനത്തെ അനുവദിക്കുക, ഇതിന് ബാറ്ററി ഉപഭോഗം കുറയ്‌ക്കാനാകും. ഒരു ആപ്‌സും പ്രവർത്തിക്കാത്തപ്പോൾ പോലും അജ്ഞാതമായ ലൊക്കേഷൻ വിവരങ്ങൾ Google-ന് അയയ്‌ക്കും.</translation>
 <translation id="5448293924669608770">ക്ഷമിക്കണം, സൈൻ ഇൻ ചെയ്യുമ്പോൾ എന്തോ തെറ്റായി സംഭവിച്ചു</translation>
 <translation id="5449588825071916739">എല്ലാ ടാബുകളും ബുക്ക്‌മാര്‍‌ക്ക് ചെയ്യുക</translation>
 <translation id="5449716055534515760">വി&amp;ന്‍ഡോ അടയ്ക്കുക</translation>
@@ -3695,7 +3694,6 @@
 <translation id="6110466548232134880"><ph name="LOCALITY" /> എന്നയിടത്തെ <ph name="ORGANIZATION" /> എന്നതിന്റെ ഐഡന്റിറ്റി <ph name="ISSUER" /> പരിശോധിച്ചുറപ്പിച്ചു. സാധുവായ സർട്ടിഫിക്കറ്റ് സുതാര്യത വിവരങ്ങൾ നൽകിയത് സെർവർ ആണ്.</translation>
 <translation id="6111770213269631447">ലിപ്യന്തരണം (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">സ്ഥിരസ്ഥിതിയായി അനുവദിച്ചത്</translation>
-<translation id="6112929985131461002">ഈ ഉപകരണം Google-ന് ഡയഗ്‌ണോസ്‌റ്റിക്, ഉപയോഗ വിവരം സ്വയം അയയ്‌ക്കും. ഈ <ph name="BEGIN_LINK1" />ക്രമീകരണം<ph name="END_LINK1" /> നിയന്ത്രിക്കുന്നത് നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്ററാണ്. <ph name="BEGIN_LINK2" />കൂടുതലറിയുക<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">ഭാഷയും ഇൻപുട്ട് ക്രമീകരണങ്ങളും മാറ്റുക</translation>
 <translation id="6120205520491252677">ഈ പേജ് ആരംഭ സ്‌ക്രീനിലേക്ക് പിൻ ചെയ്യുക...</translation>
 <translation id="6122081475643980456">നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ നിയന്ത്രിക്കുന്നു</translation>
@@ -3931,7 +3929,6 @@
 <translation id="6452181791372256707">നിരസിക്കുക</translation>
 <translation id="6454421252317455908">ചൈനീസ് ഇന്‍‌പുട്ട് രീതി (ദ്രുതഗതിയിലുള്ളത്)</translation>
 <translation id="6455348477571378046">സർട്ടിഫിക്കറ്റ് തരം:</translation>
-<translation id="6456234919706689841">ഈ ഉപകരണത്തിന്റെ ഡയഗ്‌ണോസ്‌റ്റിക്, ഉപയോഗ വിവരം Google-ന് അയയ്‌ക്കാൻ നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്റർ തിരഞ്ഞെടുത്തേക്കാം. നിങ്ങൾക്ക് ഈ <ph name="BEGIN_LINK1" />ക്രമീകരണം<ph name="END_LINK1" /> ഇവിടെ കാണാനായേക്കും. <ph name="BEGIN_LINK2" />കൂടുതലറിയുക<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">JavaScript തടയുന്നത് തുടരുക</translation>
 <translation id="6458308652667395253">JavaScript തടയുന്നത് മാനേജുചെയ്യുക...</translation>
 <translation id="6459488832681039634">കണ്ടെത്തുന്നതിനായി തിരഞ്ഞെടുപ്പ് ഉപയോഗിക്കുക</translation>
@@ -4713,7 +4710,6 @@
 <translation id="7587108133605326224">ബാള്‍ട്ടിക്</translation>
 <translation id="7589461650300748890">ശ്രദ്ധിക്കൂ.</translation>
 <translation id="7589661784326793847">ഒരു നിമിഷം കാത്തിരിക്കുക</translation>
-<translation id="7593635197364225277">Google ഡ്രൈവിൽ Play ആപ്പ് ഡാറ്റ സ്വയം ബായ്‌ക്കപ്പെടുത്ത്, പുനഃസ്ഥാപിക്കുക. നിങ്ങൾക്ക് എപ്പോൾ വേണമെങ്കിലും ഇത് Android ക്രമീകരണത്തിൽ മാറ്റാനാവും. <ph name="BEGIN_LINK1" />കൂടുതലറിയുക<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (പിശക് കോഡ് <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">ശരി, ഇമ്പോർട്ടുചെയ്യുക</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" /> ഒരിക്കലും വിവര്‍‌ത്തനം ചെയ്യരുത്</translation>
@@ -5220,7 +5216,6 @@
 <translation id="8300607741108698921">ഒരു മിനിറ്റ് സജ്ജീകരണം</translation>
 <translation id="8303650969500425356">സ്‌ക്രീൻ ഓറിയന്റേഷൻ ലോക്കുചെയ്യാൻ javascript-നെ അനുവദിക്കുന്നു.</translation>
 <translation id="8303655282093186569">പിന്‍‌യിന്‍‌ ഇന്‍‌പുട്ട് ക്രമീകരണങ്ങള്‍‌</translation>
-<translation id="830424806940379275">ബ്രൗസർ ഫ്രെയിമിന്റെ പുറത്ത് തുറക്കുന്ന പാനൽ വിൻഡോകൾ സൃഷ്‌ടിക്കാൻ വിപുലീകരണങ്ങളെ അനുവദിക്കുക. ഡിഫോൾട്ടായോ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നെങ്കിലോ, പാനൽ തുറക്കാൻ ശ്രമിക്കുന്നത്, പകരം ഒരു പോപ്പ്അപ്പ് തുറക്കുന്നതിനിടയാക്കും. ഡെസ്‌ക്‌ടോപ്പ് OS-കളിലെ പാനലുകൾ കാലഹരണപ്പെടുന്നതിനാൽ അവയെ ഉടൻ നീക്കംചെയ്യുന്നതാണ്.</translation>
 <translation id="8306534594034939679">ഒരു പരീക്ഷണാത്മക HTTP ഫീച്ചറായ ഇതര സേവനങ്ങൾക്കുള്ള പിന്തുണ പ്രവർത്തനക്ഷമമാക്കുക.</translation>
 <translation id="8307376264102990850">ചാർജ്ജുചെയ്യുന്നു
 നിറയുന്നതുവരെ കണക്കാക്കുന്നു</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 75af920b..8005a63 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -1927,6 +1927,7 @@
 <translation id="3590559774363307859">संकेतशब्द जतन केला. आपण कोणत्याही ब्राउझरवरून त्यावर आणि आपल्या सर्व <ph name="SAVED_PASSWORDS_LINK" /> वर प्रवेश करू शकता.</translation>
 <translation id="3590587280253938212">जलद</translation>
 <translation id="3592260987370335752">&amp;अधिक जाणून घ्या</translation>
+<translation id="3592313833691251126">विस्तारांना ब्राउझर फ्रेमच्या बाहेर उघडणार्‍या पॅनेल विंडो तयार करण्याची परवानगी द्या. सक्षम न केल्यास पॅनेल उघडण्याच्या प्रयत्नांमुळे पॅनेल ऐवजी पॉपअप उघडले जाईल. डीफॉल्ट वर्तन फक्त श्वेतसूची केलेल्या विस्तारांसाठी अनुमती देण्‍याकरिता आहे. सक्षम केलेले वर्तन सर्व विस्तारांसाठी अनुमती देण्‍याकरिता आहे. अक्षम केलेले वर्तन कोणत्याही विस्तारासाठी पॅनेलना अनुमती देणे रद्द करण्‍याकरिता आहे.</translation>
 <translation id="359283478042092570">प्रविष्ट करा</translation>
 <translation id="3593152357631900254"> Fuzzy-Pinyin मोड सक्षम करा</translation>
 <translation id="3593965109698325041">प्रमाणपत्र नाव प्रतिबंध</translation>
@@ -2249,7 +2250,6 @@
 <translation id="4034042927394659004">की चकाकी कमी करा</translation>
 <translation id="4035758313003622889">&amp;कार्य व्यवस्थापक</translation>
 <translation id="4037084878352560732">घोडा</translation>
-<translation id="4037102579141982963">हे डिव्हाइस Google कडे स्वयंचलितपणे निदान आणि वापर डेटा पाठवेल. आपल्या डिव्हाइस <ph name="BEGIN_LINK1" />सेटिंग्ज<ph name="END_LINK1" /> मध्ये आपण हे कधीही बदलू शकता. <ph name="BEGIN_LINK2" />अधिक जाणून घ्या<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Android साठी प्रवेशयोग्यता टॅब स्विचर सक्षम करा.</translation>
 <translation id="4044260751144303020">निश्चित स्थिती घटकांसाठी विभाजित करणे.</translation>
 <translation id="404493185430269859">डीफॉल्ट शोध इंजिन</translation>
@@ -3222,7 +3222,6 @@
 <translation id="5439568486246921931">ही क्रिया या वापरकर्त्याचे डाउनलोड, ऑफलाइन फायली आणि ब्राउझिंग डेटा कायमचा हटवेल. हे पूर्ववत केले जाऊ शकत नाही.</translation>
 <translation id="544083962418256601">शॉर्टकट तयार करा...</translation>
 <translation id="5441100684135434593">वायर्ड नेटवर्क</translation>
-<translation id="5445088910157062298">Google च्या स्थान सेवेस, अॅप्सना आपले स्थान द्रुत आणि अचूकपणे शोधण्यात मदत करू द्या, ज्यामुळे बॅटरी वापर कमी होऊ शकतो. कोणतेही अॅप्स चालत नसताना देखील अनामित स्थान डेटा Google कडे पाठविला जाईल.</translation>
 <translation id="5448293924669608770">अरेरे, साइन इन करण्यात काहीतरी चूक झाली</translation>
 <translation id="5449588825071916739">सर्व टॅब बुकमार्क करा</translation>
 <translation id="5449716055534515760">विं&amp;डो बंद करा</translation>
@@ -3688,7 +3687,6 @@
 <translation id="6110466548232134880"><ph name="LOCALITY" /> वरील <ph name="ORGANIZATION" /> आपले कनेक्शन <ph name="ISSUER" /> द्वारे सत्यापित केले गेले आहे. कोणतीही प्रमाणपत्र पारदर्शकता माहिती सर्व्हरद्वारे पुरविण्यात आली नाही.</translation>
 <translation id="6111770213269631447">लिप्यंतरण (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">डीफॉल्‍टद्वारे अनुमती दिली</translation>
-<translation id="6112929985131461002">हे डिव्हाइस Google कडे स्वयंचलितपणे निदान आणि वापर डेटा पाठवेल. आपल्या प्रशासकाने हे <ph name="BEGIN_LINK1" />सेटिंग<ph name="END_LINK1" /> लागू केले. <ph name="BEGIN_LINK2" />अधिक जाणून घ्या<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">भाषा आणि इनपुट सेटिंग्ज बदला</translation>
 <translation id="6120205520491252677">या पृष्‍ठास प्रारंभ स्‍क्रीनवर पिन करा...</translation>
 <translation id="6122081475643980456">आपले इंटरनेट कनेक्शन नियंत्रित केले जात आहे</translation>
@@ -3925,7 +3923,6 @@
 <translation id="6452181791372256707">नाकारा</translation>
 <translation id="6454421252317455908">चीनी इनपुट पद्धत (द्रुत)</translation>
 <translation id="6455348477571378046">प्रमाणपत्र प्रकार:</translation>
-<translation id="6456234919706689841">आपला प्रशासक या डिव्हाइससाठी निदान आणि वापर डेटा Google कडे पाठविणे निवडू शकतो. आपण येथे हे <ph name="BEGIN_LINK1" />सेटिंग<ph name="END_LINK1" /> पाहू शकता. <ph name="BEGIN_LINK2" />अधिक जाणून घ्या<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">JavaScript अवरोधित करणे सुरू ठेवा</translation>
 <translation id="6458308652667395253">JavaScript अवरोधित करणे व्यवस्थापित करा...</translation>
 <translation id="6459488832681039634">शोधण्यासाठी निवड वापरा</translation>
@@ -4704,7 +4701,6 @@
 <translation id="7587108133605326224">बाल्टिक</translation>
 <translation id="7589461650300748890">ओहो, तेथेच. काळजी घ्या.</translation>
 <translation id="7589661784326793847">फक्त एक सेकंद प्रतीक्षा करा</translation>
-<translation id="7593635197364225277">Google ड्राइव्हवर Play अॅप डेटाचा स्वयंचलितपणे बॅक अप घ्या आणि तो पुनर्संचयित करा. आपण कधीही Android सेटिंग्जमध्ये हे बदलू शकता. <ph name="BEGIN_LINK1" />अधिक जाणून घ्या<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (त्रुटी कोड <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">ठीक, आयात करा</translation>
 <translation id="7600965453749440009">कधीही <ph name="LANGUAGE" /> चा अनुवाद करु नका</translation>
@@ -5209,7 +5205,6 @@
 <translation id="8300607741108698921">1-मिनिटात सेटअप</translation>
 <translation id="8303650969500425356">javascript ला स्क्रीन अभिमुखता लॉक करण्याची अनुमती देते.</translation>
 <translation id="8303655282093186569">पिनयिन इनपुट सेटिंग्ज</translation>
-<translation id="830424806940379275">ब्राउझर फ्रेमच्या बाहेर उघडणार्‍या पॅनेल विंडो तयार करण्‍यासाठी विस्तारांना अनुमती द्या. डीफॉल्टनुसार किंवा अक्षम केले असल्यास, पॅनेल उघडण्याच्या प्रयत्नामुळे त्याऐवजी पॉपअप उघडले जाईल. डेस्कटॉप OS वरील पॅनेल बहिष्कृत केले जातात आणि लवकरच काढले जातील.</translation>
 <translation id="8306534594034939679">पर्यायी सेवांसाठी समर्थन सक्षम करा, एक प्रायोगिक HTTP वैशिष्ट्य.</translation>
 <translation id="8307376264102990850">चार्ज‍िंग पूर्ण होईपर्यंत वेळ मोजत आहे</translation>
 <translation id="8308179586020895837"><ph name="HOST" /> आपल्या कॅमेर्‍यावर प्रवेश करू इच्छित असल्यास विचारा</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index 9bb75d5..16e6b7c 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -34,6 +34,7 @@
 <translation id="1047431265488717055">Salin Te&amp;ks Pautan</translation>
 <translation id="1047726139967079566">Tanda Halaman Ini...</translation>
 <translation id="1047956942837015229">Memadamkan <ph name="COUNT" /> item...</translation>
+<translation id="1048286738600630630">Paparan</translation>
 <translation id="1048597748939794622">Paksa didayakan untuk semua lapisan</translation>
 <translation id="1049795001945932310">&amp;Tetapan bahasa</translation>
 <translation id="1049926623896334335">Dokumen Word</translation>
@@ -98,6 +99,7 @@
 <translation id="1125520545229165057">Dvorak (Hsu)</translation>
 <translation id="1128109161498068552">Jangan benarkan mana-mana tapak menggunakan mesej eksklusif sistem untuk mengakses peranti MIDI</translation>
 <translation id="1128128132059598906">EAP-TTLS</translation>
+<translation id="1128591060186966949">Edit enjin carian</translation>
 <translation id="1128987120443782698">Peranti storan mempunyai keupayaan <ph name="DEVICE_CAPACITY" />. Sila masukkan kad SD atau batang memori USB dengan sekurang-kurangnya keupayaan 4GB.</translation>
 <translation id="1132956125173653312">Dayakan apl Android pada Chromebook anda.</translation>
 <translation id="1137135726305341424">domContentLoaded dan pemuatan semua sumber bermula sebelum domContentLoaded (bingkai utama dan iframes daripada asal yang sama).</translation>
@@ -107,6 +109,7 @@
 <translation id="1145292499998999162">Pemalam disekat</translation>
 <translation id="1146204723345436916">Import penanda halaman daripada fail HTML...</translation>
 <translation id="1148624853678088576">Anda telah bersedia!</translation>
+<translation id="1149401351239820326">Bulan tamat tempoh</translation>
 <translation id="1151972924205500581">Kata laluan diperlukan</translation>
 <translation id="1154228249304313899">Buka halaman ini:</translation>
 <translation id="115443833402798225">Hangul Ahnmatae</translation>
@@ -118,6 +121,7 @@
 <translation id="1162223735669141505"><ph name="BEGIN_LINK" />Pemalam Klien Asli<ph name="END_LINK" /> perlu didayakan untuk menggunakan ciri ini.</translation>
 <translation id="1163361280229063150">{NUM_DOWNLOAD,plural, =1{Muat turun sedang berlangsung. Adakah anda ingin membatalkan muat turun dan keluar daripada mod inkognito?}other{# muat turun sedang berlangsung pada masa ini. Adakah anda ingin membatalkan muat turun dan keluar daripada mod inkognito?}}</translation>
 <translation id="1163931534039071049">&amp;Lihat sumber bingkai</translation>
+<translation id="1164674268730883318">Matikan Smart Lock untuk <ph name="DEVICE_TYPE" />?</translation>
 <translation id="1165039591588034296">Ralat</translation>
 <translation id="1166212789817575481">Tutup Tab di sebelah Kanan</translation>
 <translation id="1166359541137214543">ABC</translation>
@@ -135,6 +139,7 @@
 <translation id="1181037720776840403">Buang</translation>
 <translation id="1183083053288481515">Menggunakan perakuan yang disediakan pentadbir</translation>
 <translation id="1183237619868651138">Tidak boleh memasang <ph name="EXTERNAL_CRX_FILE" /> dalam cache tempatan.</translation>
+<translation id="1183917921992319637">Konfigurasikan PIN</translation>
 <translation id="1185924365081634987">Anda boleh cuba <ph name="GUEST_SIGNIN_LINK_START" />semak imbas sebagai tetamu<ph name="GUEST_SIGNIN_LINK_END" /> untuk membetulkan ralat rangkaian ini juga.</translation>
 <translation id="1187722533808055681">Bangkit daripada melahu</translation>
 <translation id="1188807932851744811">Log belum dimuat naik.</translation>
@@ -200,6 +205,7 @@
 <translation id="1277908057200820621">Lihat senarai peranti</translation>
 <translation id="1278049586634282054">Periksa paparan:</translation>
 <translation id="1278813325885878377">Papan kekunci QWERTY Hungary</translation>
+<translation id="1284355409890639046">Gandingkan Peranti Bluetooth</translation>
 <translation id="1285320974508926690">Jangan sekali-kali menterjemahkan tapak ini</translation>
 <translation id="1285484354230578868">Simpan data dalam akaun Google Drive anda</translation>
 <translation id="1290223615328246825">Log masuk automatik gagal</translation>
@@ -304,6 +310,8 @@
 <translation id="1429740407920618615">Kekuatan Isyarat:</translation>
 <translation id="143027896309062157">Baca dan ubah semua data anda pada komputer anda dan tapak web yang anda lawati</translation>
 <translation id="1430915738399379752">Cetak</translation>
+<translation id="1432581352905426595">Urus enjin carian</translation>
+<translation id="1433811987160647649">Tanya sebelum mengakses</translation>
 <translation id="1434696352799406980">Ini akan menetapkan semula halaman permulaan, halaman tab baharu, enjin carian dan tab tersemat anda. Selain itu, semua sambungan akan dilumpuhkan dan data sementara seperti kuki akan dikosongkan. Sejarah penanda halaman anda dan kata laluan yang disimpan tidak akan dikosongkan.</translation>
 <translation id="1434886155212424586">Halaman utama ialah halaman Tab Baharu</translation>
 <translation id="1435550882135542937">Reka semula bar alat sambungan</translation>
@@ -339,6 +347,7 @@
 <translation id="14720830734893704">Dayakan sokongan papan kekunci maya.</translation>
 <translation id="1474079335130556426">Dayakan mod latar untuk API Tolak. Ini membolehkan Chrome terus berjalan selepas tetingkap terakhir ditutup, dan untuk dilancarkan pada permulaan OS, jika API Tolak memerlukannya.</translation>
 <translation id="1474339897586437869">"<ph name="FILENAME" />" tidak dimuat naik. Ruang kosong tidak mencukupi dalam Google Drive anda.</translation>
+<translation id="1475502736924165259">Anda mempunyai sijil pada fail yang tidak sepadan dengan mana-mana kategori lain</translation>
 <translation id="1476607407192946488">&amp;Tetapan Bahasa</translation>
 <translation id="1476949146811612304">Tetapkan enjin carian mana digunakan ketika mencari dari <ph name="BEGIN_LINK" />kotak omni<ph name="END_LINK" /> .</translation>
 <translation id="1477301030751268706">Cache Token API Identiti</translation>
@@ -375,6 +384,7 @@
         pelayan proksi, laraskan <ph name="LINK_START" />tetapan proksi<ph name="LINK_END" /> anda.</translation>
 <translation id="1510907582379248592">Kata laluan yang disimpan untuk <ph name="ORIGIN" />:</translation>
 <translation id="1511004689539562549">Jangan benarkan tapak mengakses kamera anda</translation>
+<translation id="1511388193702657997">Tawaran untuk menyimpan kata laluan web anda</translation>
 <translation id="1511623662787566703">Log masuk sebagai <ph name="USER_EMAIL_ADDRESS" />. Penyegerakan telah dihentikan melalui Google Dashboard.</translation>
 <translation id="1514215615641002767">Tambahkan pada desktop</translation>
 <translation id="1514298457297359873">Membenarkan aplikasi menggunakan API NaCl Socket. Gunakan hanya untuk menguji pemalam NaCl.</translation>
@@ -396,6 +406,7 @@
 <translation id="1529968269513889022">minggu yang lalu</translation>
 <translation id="1531004739673299060">Tetingkap Aplikasi</translation>
 <translation id="1531865825384516080">Pelaporan URL SafeSearch.</translation>
+<translation id="1532687502998799885">PIN mestilah sekurang-kurangnya 4 digit:</translation>
 <translation id="1532697124104874386">Dayakan/Lumpuhkan penggunaan pintar papan kekunci maya.</translation>
 <translation id="1533897085022183721">Kurang daripada <ph name="MINUTES" />.</translation>
 <translation id="1533920822694388968">Penjajaran TV</translation>
@@ -424,6 +435,7 @@
 <translation id="1558988940633416251">Dayakan enjin reka letak HarfBuzz merentas platform untuk teks UI. Tidak menjejaskan kandungan web.</translation>
 <translation id="1559235587769913376">Input aksara Unikod</translation>
 <translation id="1561092721008294962">HarfBuzz untuk teks UI</translation>
+<translation id="1566049601598938765">Tapak web</translation>
 <translation id="1566958206723629112">Flash dan PDF</translation>
 <translation id="1567723158593978621">Apabila didayakan, tindakan log masuk ke penyemak imbas akan menggunakan aliran log masuk dipisahkan kata laluan gaia baharu.</translation>
 <translation id="1567993339577891801">JavaScript Console</translation>
@@ -481,6 +493,7 @@
 <translation id="1645228020260124617"><ph name="PRECENTAGE" />%</translation>
 <translation id="1645870377513700713">Dayakan pemberitahuan asli.</translation>
 <translation id="1646136617204068573">Papan kekunci Hungary</translation>
+<translation id="1646982517418478057">Sila masukkan kata laluan untuk menyulitkan sijil ini</translation>
 <translation id="164729547906544836">Papan kekunci bahasa Tamil (itrans)</translation>
 <translation id="164814987133974965">Pengguna diselia boleh meneroka web dengan bimbingan anda. Sebagai pengurus pengguna diselia, anda boleh
     <ph name="BEGIN_BOLD" />benarkan atau larang<ph name="END_BOLD" /> tapak web tertentu,
@@ -508,6 +521,7 @@
 <translation id="1673103856845176271">Fail tidak boleh diakses atas sebab keselamatan.</translation>
 <translation id="1675023460278456180">Hibrid Bahan</translation>
 <translation id="167832068858235403">kurangkan kelantangan</translation>
+<translation id="1678331212993975953">Butiran Tapak</translation>
 <translation id="1679068421605151609">Alat Pembangun</translation>
 <translation id="1681120471812444678">Sediakan untuk menambah pencetak...</translation>
 <translation id="1682324559341535203">Mendaftarkan <ph name="DEVICE_TYPE" /></translation>
@@ -529,11 +543,13 @@
 <translation id="1699395855685456105">Semakan perkakasan:</translation>
 <translation id="1700199471143028312">Pentadbir anda tidak membenarkan anda membuat pengguna di bawah seliaan.</translation>
 <translation id="1701062906490865540">Alih keluar orang ini</translation>
+<translation id="1702294042233267824">Enjin carian yang digunakan semasa mencari daripada kotak omni</translation>
 <translation id="1702534956030472451">Barat</translation>
 <translation id="1707463636381878959">Kongsi rangkaian ini dengan pengguna lain</translation>
 <translation id="1708199901407471282">Ketika membuka halaman web yang dicadangkan daripada Halaman Tab Baharu, jika tab sudah dibuka untuk cadangan tersebut, tukar kepada tab itu dan bukannya memuatkan cadangan tersebut dalam tab yang baharu.</translation>
 <translation id="1708338024780164500">(Tidak Aktif)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Natif)</translation>
 <translation id="1711973684025117106">Gagal mengezip, ralat tidak dijangka: $1</translation>
 <translation id="1715941336038158809">Nama pengguna atau kata laluan tidak sah.</translation>
 <translation id="1717733954209022288">Kotak pilihan penyimpanan kad Google Payments</translation>
@@ -628,6 +644,7 @@
 <translation id="1852799913675865625">Terdapat ralat ketika cuba membaca fail: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1856715684130786728">Tambah lokasi...</translation>
 <translation id="1857166538520940818">Lampirkan fail:</translation>
+<translation id="1858585891038687145">Percayakan sijil ini untuk mengenal pasti pembuat perisian</translation>
 <translation id="1859234291848436338">Arah Penulisan</translation>
 <translation id="1864111464094315414">Log masuk</translation>
 <translation id="1864676585353837027">Tukar cara fail ini dikongsi.</translation>
@@ -659,6 +676,7 @@
 <translation id="1909880997794698664">Adakah anda pasti mahu peranti ini menggunakan mod kios secara kekal?</translation>
 <translation id="1910572251697014317">Google telah menghantar pemberitahuan ke telefon ini. Harap maklum bahawa dengan Bluetooth, telefon anda boleh terus membuka kunci <ph name="DEVICE_TYPE" /> dari jarak lebih 100 kaki. Sekiranya perkara ini boleh mendatangkan masalah, anda boleh &lt;a&gt;melumpuhkan ciri ini buat sementara waktu&lt;/a&gt;.</translation>
 <translation id="1910721550319506122">Selamat datang!</translation>
+<translation id="1911073860190924580">Hanya kata laluan</translation>
 <translation id="1916502483199172559">Avatar merah lalai</translation>
 <translation id="191688485499383649">Ralat tidak diketahui berlaku semasa cuba menyambung ke "<ph name="DEVICE_NAME" />".</translation>
 <translation id="1918141783557917887">&amp;Lebih kecil</translation>
@@ -720,6 +738,8 @@
 <translation id="2007404777272201486">Laporkan Isu...</translation>
 <translation id="2011110593081822050">Pekerja Web: <ph name="WORKER_NAME" /></translation>
 <translation id="2012766523151663935">Semakan perisian tegar:</translation>
+<translation id="2013984794184160106">15</translation>
+<translation id="2016430552235416146">Tradisional</translation>
 <translation id="2017052954220678795">Proses raster GPU berurutan</translation>
 <translation id="2017334798163366053">Lumpuhkan pengumpulan data prestasi</translation>
 <translation id="2018352199541442911">Maaf, peranti storan luaran anda tidak disokong pada masa ini.</translation>
@@ -736,6 +756,7 @@
 <translation id="204497730941176055">Nama Templat Sijil Microsoft</translation>
 <translation id="2045969484888636535">Terus menyekat kuki</translation>
 <translation id="204622017488417136">Peranti anda akan kembali ke versi Chrome yang dipasang sebelum ini. Semua akaun pengguna dan data setempat akan dialih keluar. Proses ini tidak boleh dibuat asal.</translation>
+<translation id="2047962517134476164">Sahkan log masuk anda untuk meneruskan</translation>
 <translation id="2048182445208425546">Akses trafik rangkaian anda</translation>
 <translation id="2049137146490122801">Akses kepada fail setempat pada mesin anda dilumpuhkan oleh pentadbir anda.</translation>
 <translation id="204914487372604757">Cipta pintasan</translation>
@@ -820,10 +841,12 @@
 <translation id="2155931291251286316">Sentiasa benarkan pop muncul daripada <ph name="HOST" /></translation>
 <translation id="215753907730220065">Keluar Daripada Skrin Penuh</translation>
 <translation id="2157875535253991059">Halaman ini kini dalam skrin penuh.</translation>
+<translation id="2161553589239083578">Sahkan PIN anda:</translation>
 <translation id="216169395504480358">Tambah Wi-Fi...</translation>
 <translation id="2163470535490402084">Sila sambung ke Internet untuk melog masuk ke <ph name="DEVICE_TYPE" /> anda.</translation>
 <translation id="2164862903024139959">Papan kekunci bahasa Vietnam (TCVN)</translation>
 <translation id="2165453356262207111">Kunci Pintar (beta)</translation>
+<translation id="2166369534954157698">The quick brown fox jumps over the lazy dog</translation>
 <translation id="2167276631610992935">Javascript</translation>
 <translation id="2168214441502403371">Papan kekunci bahasa Parsi</translation>
 <translation id="2168725742002792683">Sambungan fail</translation>
@@ -840,6 +863,7 @@
 <translation id="2190355936436201913">(kosong)</translation>
 <translation id="2190469909648452501">Kurangkan</translation>
 <translation id="2192505247865591433">Daripada:</translation>
+<translation id="2193365732679659387">Tetapan percaya</translation>
 <translation id="2195729137168608510">Perlindungan E-mel</translation>
 <translation id="2198315389084035571">Bahasa Cina Mudah</translation>
 <translation id="2199829153606285995">Input suara pada papan kekunci maya</translation>
@@ -857,9 +881,11 @@
 <translation id="2213819743710253654">Tindakan Halaman</translation>
 <translation id="2215277870964745766">Selamat datang! Tetapkan bahasa dan rangkaian anda</translation>
 <translation id="2217501013957346740">Cipta nama -</translation>
+<translation id="2218019600945559112">Tetikus dan pad sentuh</translation>
 <translation id="2218515861914035131">Tampalkan sebagai teks kosong</translation>
 <translation id="2218947405056773815">Aduh! <ph name="API_NAME" /> dilanda masalah.</translation>
 <translation id="2220529011494928058">Laporkan isu</translation>
+<translation id="2220572644011485463">PIN atau kata laluan</translation>
 <translation id="2221240591176106785">Dayakan muat semula bukan pengesahan</translation>
 <translation id="2222641695352322289">Satu-satunya cara hendak membuat asal ialah dengan memasang semula <ph name="IDS_SHORT_PRODUCT_OS_NAME" />.</translation>
 <translation id="2224444042887712269">Tetapan ini milik <ph name="OWNER_EMAIL" />.</translation>
@@ -903,6 +929,7 @@
 <translation id="2258195278080713720">Ciri JavaScript terkini yang stabil</translation>
 <translation id="2260567344816042527">Google Chrome akan menggunakan data selular jika anda tidak bersambung ke rangkaian lain.</translation>
 <translation id="2260654768907572711">PEMALAM PENYEMAK IMBAS</translation>
+<translation id="2262477216570151239">Lengah sebelum mengulang</translation>
 <translation id="226269835214688456">Jika anda matikan Smart Lock untuk Chromebook, anda tidak dapat membuka kunci peranti Chrome menggunakan telefon lagi. Anda perlu menaip kata laluan anda.</translation>
 <translation id="2262903407161221567">Komponen UI tertentu akan memaparkan maklum balas visual kepada interaksi sentuhan.</translation>
 <translation id="2263497240924215535">(Dilumpuhkan)</translation>
@@ -916,6 +943,7 @@
 <translation id="2273562597641264981">Operator:</translation>
 <translation id="2275694568175246751">Kanan ke kiri</translation>
 <translation id="2276503375879033601">Tambah lagi apl</translation>
+<translation id="2277255602909579701">Semua kuki dan data tapak</translation>
 <translation id="2278098630001018905">Gunakan alamat penghantaran yang berbeza</translation>
 <translation id="2278562042389100163">Buka tetingkap penyemak imbas</translation>
 <translation id="2278988676849463018">Papan kekunci bahasa Kannada (Fonetik)</translation>
@@ -956,6 +984,7 @@
 <translation id="2339120501444485379">Masukkan nama baharu</translation>
 <translation id="2339641773402824483">Menyemak kemas kini...</translation>
 <translation id="2342060820861917889">panjang (2000 ms)</translation>
+<translation id="2342282706041269970">Cuba log keluar dan log masuk semula.</translation>
 <translation id="23434688402327542">Papan kekunci Kazakhstan</translation>
 <translation id="2344028582131185878">Muat Turun Automatik</translation>
 <translation id="2344262275956902282">Gunakan kekunci - dan = pada halaman senarai calon</translation>
@@ -1070,6 +1099,7 @@
 <translation id="2494837236724268445">Papan kekunci bahasa Gujarati (Fonetik)</translation>
 <translation id="2496180316473517155">Sejarah penyemakan imbas</translation>
 <translation id="2496540304887968742">Peranti hendaklah mempunyai kapasiti 4GB atau lebih besar.</translation>
+<translation id="2497229222757901769">Kelajuan tetikus</translation>
 <translation id="249819058197909513">Jangan berikan amaran untuk apl ini lagi</translation>
 <translation id="2498436043474441766">Tambah Pencetak</translation>
 <translation id="2498539833203011245">Minimize</translation>
@@ -1145,6 +1175,7 @@
 <translation id="2587922270115112871">Penghasilan pengguna diselia tidak akan mewujudkan Akaun Google dan tetapan
     serta datanya tidak akan mengikutnya ke peranti lain dengan Penyegerakan Chrome.
     Pengguna diselia hanya dilaksanakan pada peranti ini.</translation>
+<translation id="25912682830130293">Lihat tetapan yang dilaporkan</translation>
 <translation id="2594049137847833442">Pilihan tapak penting dalam dialog kosongkan data semakan imbas</translation>
 <translation id="2594056015203442344">Apabila didayakan, penunjuk audio dalam jalur tab turut berfungsi sebagai kawalan redam audio tab. Ini turut menambahkan perintah dalam menu konteks tab untuk meredam berbilang tab yang dipilih dengan cepat.</translation>
 <translation id="259421303766146093">Nyahbesarkan</translation>
@@ -1197,6 +1228,7 @@
 <translation id="2665394472441560184">Tambah perkataan baharu</translation>
 <translation id="2665717534925640469">Halaman ini kini dalam skrin penuh dan telah melumpuhkan kursor tetikus anda.</translation>
 <translation id="2665919335226618153">Oh, Tidak! Terdapat ralat semasa memformat.</translation>
+<translation id="2667463864537187133">Urus semakan ejaan</translation>
 <translation id="2668079306436607263">Navigasi sejarah tatal lampau</translation>
 <translation id="2670102641511624474"><ph name="APP_NAME" /> berkongsi tab Chrome.</translation>
 <translation id="2670965183549957348">Kaedah input Chewing</translation>
@@ -1219,7 +1251,9 @@
 <translation id="2694026874607847549">1 kuki</translation>
 <translation id="2696862700756109583">Pengecualian skrin penuh</translation>
 <translation id="2702540957532124911">Papan kekunci:</translation>
+<translation id="2704142793323512908">Turut mengalih keluar data sedia ada anda daripada peranti ini.</translation>
 <translation id="2704184184447774363">Menandatangani Dokumen Microsoft</translation>
+<translation id="270516211545221798">Kelajuan pad sentuh</translation>
 <translation id="2706892089432507937">Peranti USB</translation>
 <translation id="2707024448553392710">Memuat turun komponen</translation>
 <translation id="270921614578699633">Purata</translation>
@@ -1398,6 +1432,7 @@
 <translation id="2902734494705624966">AS lanjutan</translation>
 <translation id="2903493209154104877">Alamat</translation>
 <translation id="290444763029043472"><ph name="DOWNLOADED_AMOUNT_MB" /> MB / <ph name="TOTAL_AMOUNT_MB" /> MB dimuat turun</translation>
+<translation id="2904456025988372123">Tanya apabila tapak cuba memuat turun fail secara automatik selepas fail pertama</translation>
 <translation id="2907619724991574506">URL Pemula</translation>
 <translation id="2908162660801918428">Tambah Galeri Media mengikut Direktori</translation>
 <translation id="2908789530129661844">Zum keluar skrin</translation>
@@ -1444,6 +1479,7 @@
 <translation id="2963151496262057773">Pemalam berikut tidak responsif: <ph name="PLUGIN_NAME" />Adakah anda ingin menghentikannya?</translation>
 <translation id="2963783323012015985">Papan kekunci Turki</translation>
 <translation id="2964193600955408481">Lumpuhkan Wi-Fi</translation>
+<translation id="2964313852984024865">Edit</translation>
 <translation id="2966459079597787514">Papan kekunci Sweden</translation>
 <translation id="2966598748518102999">Tingkatkan carian suara dengan menghantar bunyi "Ok Google" dan beberapa saat sebelum itu, kepada Google.</translation>
 <translation id="2967544384642772068">Matikan</translation>
@@ -1592,6 +1628,7 @@
 <translation id="3150927491400159470">Muat Semula Keras</translation>
 <translation id="315116470104423982">Data mudah alih</translation>
 <translation id="315141861755603168">"<ph name="BUNDLE_NAME" />" menambahkan apl ini:</translation>
+<translation id="3151786313568798007">Orientasi</translation>
 <translation id="3153177132960373163">Benarkan semua tapak menggunakan pemalam untuk mengakses komputer anda</translation>
 <translation id="3154429428035006212">Di luar talian selama lebih sebulan</translation>
 <translation id="3157931365184549694">Pulihkan</translation>
@@ -1648,6 +1685,7 @@
 <translation id="3234666976984236645">Sentiasa kesan kandungan penting di tapak web ini</translation>
 <translation id="3236997602556743698">3 Set (390)</translation>
 <translation id="3237784613213365159"><ph name="NEW_PROFILE_NAME" /> kini menjadi pengguna di bawah seliaan</translation>
+<translation id="323803881985677942">Buka pilihan sambungan</translation>
 <translation id="324056286105023296">Bukan <ph name="PROFILE_NAME" /> ?</translation>
 <translation id="3241680850019875542">Pilih direktori akar bagi sambungan untuk pek. Untuk mengemas kini sambungan, pilih kunci persendirian untuk gunakan semula juga.</translation>
 <translation id="3241720467332021590">Bahasa Ireland</translation>
@@ -1673,6 +1711,7 @@
 <translation id="3268451620468152448">Tab Terbuka</translation>
 <translation id="3269093882174072735">Muatkan imej</translation>
 <translation id="3269101346657272573">Sila masukkan PIN.</translation>
+<translation id="3269737334347286816">Butiran log masuk sudah usang.</translation>
 <translation id="326999365752735949">Memuat turun beza</translation>
 <translation id="3270965368676314374">Baca, ubah dan padam foto, muzik dan media lain daripada komputer anda</translation>
 <translation id="3273410961255278341">Hantar untuk:</translation>
@@ -1772,6 +1811,7 @@
 <translation id="3382073616108123819">Op! Sistem gagal menentukan pengecam peranti untuk peranti ini.</translation>
 <translation id="3384773155383850738">Bilangan maksimum cadangan</translation>
 <translation id="3385050660708634073">Sulitkan semua data yang disegerakkan dengan ungkapan laluan segerak anda sendiri</translation>
+<translation id="3385131213214862288">Kosongkan item berikut daripada</translation>
 <translation id="338583716107319301">Pemisah</translation>
 <translation id="3386219708421216619">Penanda Halaman Ditambahkan</translation>
 <translation id="3391392691301057522">PIN lama:</translation>
@@ -1785,6 +1825,7 @@
 <translation id="3401130144947259741">Jika didayakan, peristiwa surih akan dieksport ke Penyurih Peristiwa untuk Windows (ETW) dan kemudian dapat ditangkap oleh alatan seperti UIForETW atau Xperf.</translation>
 <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED" />, <ph name="TIME_LEFT" /></translation>
 <translation id="340485819826776184">Gunakan perkhidmatan ramalan untuk membantu melengkapkan carian dan URL ditaip dalam bar alamat</translation>
+<translation id="3405664148539009465">Sesuaikan fon</translation>
 <translation id="3405763860805964263">...</translation>
 <translation id="3406605057700382950">&amp;Tunjukkan bar penanda halaman</translation>
 <translation id="3412265149091626468">Lompat ke Pemilihan</translation>
@@ -1806,6 +1847,7 @@
 <translation id="3439153939049640737">Sentiasa benarkan <ph name="HOST" /> mengakses mikrofon anda</translation>
 <translation id="3439282137581679399">Mendayakan Senarai Hitam Kebenaran yang menghalang kebenaran untuk tapak yang disenaraihitamkan untuk pengguna Penyemakan Imbas Selamat.</translation>
 <translation id="3439970425423980614">Membuka PDF dalam Pratonton</translation>
+<translation id="3440761377721825626">Tanya apabila tapak ingin menggunakan pemalam untuk mengakses komputer anda</translation>
 <translation id="3441653493275994384">Skrin</translation>
 <translation id="3441653695259810643">Gunakan semula fon yang dicache dalam pemapar untuk memaparkan saiz fon yang berbeza untuk mendapatkan reka letak yang lebih cepat.</translation>
 <translation id="3445092916808119474">Jadikan utama</translation>
@@ -1820,6 +1862,7 @@
 <translation id="3456236151053308041">Dayakan sambungan IME untuk memberikan paparan tersuai untuk input pengguna seperti papan kekunci maya.</translation>
 <translation id="345693547134384690">Buka &amp;imej dalam tab baharu</translation>
 <translation id="3458620904104024826">Dayakan pengeksportan acara surihan ke ETW.</translation>
+<translation id="3459509316159669723">Mencetak</translation>
 <translation id="3459774175445953971">Terakhir diubah suai:</translation>
 <translation id="3460771772332290399">Mod Automuat Semula Luar Talian</translation>
 <translation id="3462413494201477527">Batalkan penetapan akaun?</translation>
@@ -1863,6 +1906,7 @@
 <translation id="3508920295779105875">Pilih Folder yang lain...</translation>
 <translation id="3509527969829946096">Pilihan ini mendayakan sokongan di Cast Streaming untuk mengekod strim video yang menggunakan perkakasan platform.</translation>
 <translation id="3510797500218907545">WiMAX</translation>
+<translation id="3511200754045804813">Imbas semula</translation>
 <translation id="3511307672085573050">Salin Alamat Paut&amp;an</translation>
 <translation id="3511399794969432965">Masalah menyambung?</translation>
 <translation id="351152300840026870">Fon lebar tetap</translation>
@@ -1932,6 +1976,7 @@
 <translation id="3590559774363307859">Kata laluan disimpan. Anda boleh mengaksesnya dan semua <ph name="SAVED_PASSWORDS_LINK" /> anda daripada mana-mana penyemak imbas.</translation>
 <translation id="3590587280253938212">cepat</translation>
 <translation id="3592260987370335752">&amp;Ketahui lebih lanjut</translation>
+<translation id="3592313833691251126">Benarkan sambungan membuat tetingkap panel yang boleh dibuka di luar bingkai penyemak imbas. Sebaliknya, percubaan untuk membuka panel akan membuka tetingkap timbul jika tidak didayakan. Gelagat lalai ialah untuk membenarkan sambungan senarai putih sahaja. Gelagat yang didayakan ialah untuk membenarkan semua sambungan. Gelagat yang dilumpuhkan ialah untuk tidak membenarkan panel untuk sebarang sambungan.</translation>
 <translation id="359283478042092570">Masuk</translation>
 <translation id="3593152357631900254">Dayakan mod Pinyin Kabur</translation>
 <translation id="3593965109698325041">Kekangan Nama Sijil</translation>
@@ -2009,6 +2054,7 @@
 <translation id="3695919544155087829">Sila masukkan kata laluan yang digunakan untuk menyulitkan fail sijil ini.</translation>
 <translation id="3696411085566228381">tiada</translation>
 <translation id="3697100740575341996">Pentadbir IT anda telah melumpuhkan Chrome Goodies untuk peranti anda. <ph name="MORE_INFO_LINK" /></translation>
+<translation id="3699080292907545058">Tetapkan versi TLS maksimum yang didayakan.</translation>
 <translation id="3699624789011381381">Alamat e-mel</translation>
 <translation id="3704162925118123524">Rangkaian yang anda gunakan mungkin memerlukan anda untuk melawat halaman log masuknya.</translation>
 <translation id="3704331259350077894">Penghentian Pengendalian</translation>
@@ -2054,10 +2100,12 @@
 <translation id="3758201569871381925">Sila pastikan bahawa peranti Hotrod anda dihidupkan dan disambungkan ke TV.</translation>
 <translation id="375841316537350618">Memuat turun skrip proksi...</translation>
 <translation id="3759371141211657149">Uruskan tetapan pengendali...</translation>
+<translation id="3759553810934020361">Bluetooth dimatikan.</translation>
 <translation id="3759933321830434300">Sekat sebahagian halaman web</translation>
 <translation id="3760460896538743390">Halaman Periksa &amp;Latar Belakang</translation>
 <translation id="37613671848467444">Buka dalam Tetingkap &amp;Inkognito</translation>
 <translation id="3763401818161139108">Sentiasa jalankan pada <ph name="ORIGIN" /></translation>
+<translation id="3764314093345384080">Maklumat binaan terperinci</translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Berkomunikasi dengan peranti USB}other{Berkomunikasi dengan # peranti USB}}</translation>
 <translation id="3764800135428056022">Tawaran untuk menyimpan kata laluan web anda.</translation>
 <translation id="3764986667044728669">Tidak dapat mendaftar</translation>
@@ -2087,6 +2135,7 @@
 <translation id="3798449238516105146">Versi</translation>
 <translation id="3798935682015223249">Sokongan MTP dalam Pengurus Fail</translation>
 <translation id="3800764353337460026">Gaya simbol</translation>
+<translation id="3800806661949714323">Tunjukkan semua (disyorkan)</translation>
 <translation id="3801082500826908679">Bahasa Faroese</translation>
 <translation id="3803991353670408298">Sila tambah kaedah input lain sebelum mengeluarkan ini.</translation>
 <translation id="380408572480438692">Tindakan mendayakan pengumpulan data prestasi akan membantu Google menambah baik sistem dengan berlalunya masa. Tiada data dihantar sehingga anda memfailkan laporan maklum balas (Alt-Shift-I) dan menyertakan data prestasi. Anda boleh kembali ke skrin ini untuk melumpuhkan pengumpulan pada bila-bila masa.</translation>
@@ -2104,6 +2153,7 @@
 <translation id="3819007103695653773">Benarkan semua tapak untuk menghantar mesej tolak di latar belakang</translation>
 <translation id="3819752733757735746">Akses suis (kawal komputer dengan satu atau dua suis sahaja)</translation>
 <translation id="3819800052061700452">&amp;Skrin penuh</translation>
+<translation id="3821453754632750466">Dayakan Pembayaran Web</translation>
 <translation id="3822265067668554284">Jangan benarkan mana-mana tapak menjejaki lokasi fizikal anda</translation>
 <translation id="3825863595139017598">Papan kekunci bahasa Mongolia</translation>
 <translation id="3827306204503227641">Teruskan membenarkan pemalam tanpa kotak pasir</translation>
@@ -2165,9 +2215,11 @@
 <translation id="3899968422636198696"><ph name="HOSTNAME" /> <ph name="ORGNAME" /></translation>
 <translation id="3901991538546252627">Menyambung ke <ph name="NAME" /></translation>
 <translation id="3902799646152133632">Melangkau kerangka utama no-store.</translation>
+<translation id="3904196543277238487">Versi TLS maksimum didayakan.</translation>
 <translation id="3905761538810670789">Baiki apl</translation>
 <translation id="390718707505136526">Mendayakan percubaan asal untuk mengawal akses kepada percubaan ciri/API.</translation>
 <translation id="3908501907586732282">Dayakan sambungan</translation>
+<translation id="3909690856344416952"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /> dan 1 yang lain</translation>
 <translation id="3909791450649380159">Po&amp;tong</translation>
 <translation id="3910699493603749297">Papan kekunci bahasa Khmer</translation>
 <translation id="3911073280391218446"><ph name="USER_DISPLAY_NAME" /> (nama yang digunakan pada peranti ini)</translation>
@@ -2187,6 +2239,7 @@
 <translation id="3930521966936686665">Main di</translation>
 <translation id="3936390757709632190">&amp;Buka audio di tab baharu</translation>
 <translation id="3936768791051458634">Tukar saluran...</translation>
+<translation id="3936925983113350642">Kata laluan yang anda pilih akan diperlukan untuk memulihkan sijil ini kemudian. Sila catatnya di lokasi selamat.</translation>
 <translation id="3937640725563832867">Nama Alternatif Pengeluar Sijil</translation>
 <translation id="3938113500786732264">Tukar orang dengan lebih cepat</translation>
 <translation id="3940233957883229251">Dayakan autoulang</translation>
@@ -2254,9 +2307,10 @@
 <translation id="4034042927394659004">Kurangkan kecerahan kekunci</translation>
 <translation id="4035758313003622889">&amp;Pengurus tugas</translation>
 <translation id="4037084878352560732">Kuda</translation>
-<translation id="4037102579141982963">Peranti ini akan menghantar data diagnostik dan penggunaan secara automatik ke Google. Anda boleh menukar tetapan ini pada bila-bila masa dalam <ph name="BEGIN_LINK1" />tetapan<ph name="END_LINK1" /> peranti anda. <ph name="BEGIN_LINK2" />Ketahui Lebih Lanjut<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Dayakan penukar tab kebolehcapaian untuk Android.</translation>
+<translation id="4037889604535939429">Edit orang</translation>
 <translation id="4044260751144303020">Kerencaman unsur kedudukan tetap.</translation>
+<translation id="4044612648082411741">Masukkan kata laluan sijil anda</translation>
 <translation id="404493185430269859">Enjin carian lalai</translation>
 <translation id="4047112090469382184">Bagaimana ini selamat</translation>
 <translation id="4047345532928475040">T/B</translation>
@@ -2345,9 +2399,11 @@
 <translation id="4166210099837486476">Pantau apabila anda mengambil tindakan dalam Chrome</translation>
 <translation id="4168015872538332605">Beberapa tetapan milik <ph name="PRIMARY_EMAIL" /> sedang dikongsikan dengan anda. Tetapan ini hanya mempengaruhi akaun anda semasa menggunakan berbilang log masuk.</translation>
 <translation id="4172051516777682613">Sentiasa paparkan</translation>
+<translation id="4172706149171596436">Tukar tetapan proksi</translation>
 <translation id="417475959318757854">Letakkan Pelancar Apl di tengah.</translation>
 <translation id="4176463684765177261">Dilumpuhkan</translation>
 <translation id="4179512409951755566">Dayakan Tatal Lampau OSK</translation>
+<translation id="418062721134714140">Urus sijil dan tetapan SSL anda</translation>
 <translation id="4180788401304023883">Padamkan sijil CA "<ph name="CERTIFICATE_NAME" />"?</translation>
 <translation id="418179967336296930">Papan kekunci Fonetik Rusia (YaZHert)</translation>
 <translation id="4181841719683918333">Bahasa</translation>
@@ -2362,6 +2418,7 @@
 <translation id="4195643157523330669">Buka dalam tab baharu</translation>
 <translation id="4195814663415092787">Sambung semula dari tempat anda berhenti</translation>
 <translation id="4197674956721858839">Pemilihan zip</translation>
+<translation id="4200689466366162458">Perkataan tersuai</translation>
 <translation id="4200983522494130825">Tab &amp;baharu</translation>
 <translation id="4206144641569145248">Makhluk asing</translation>
 <translation id="420665587194630159">(Sambungan ini diuruskan dan tidak boleh dinyahpasang atau dilumpuhkan)</translation>
@@ -2458,10 +2515,12 @@
 <translation id="4350019051035968019">Peranti ini tidak boleh didaftarkan pada domain bagi akaun anda kerana peranti telah ditandai untuk pengurusan oleh domain lain.</translation>
 <translation id="4354806558096370704">Mendayakan penggunaan bahagian belakang cetakan CUPS natif.</translation>
 <translation id="4355925451975609675">Tekan |<ph name="ACCELERATOR1" />|+|<ph name="ACCELERATOR2" />| untuk ke hadapan</translation>
+<translation id="4358353773267946514"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /></translation>
 <translation id="4358697938732213860">Tambah alamat</translation>
 <translation id="4359408040881008151">Dipasang kerana sambungan yang bergantung.</translation>
 <translation id="4361190688154226069">Sasaran berasaskan segi empat tepat dalam paparan</translation>
 <translation id="4361765875689149937"><ph name="ORIGIN" /> mahu digandingkan dengan:</translation>
+<translation id="4363771538994847871">Tiada destinasi Cast ditemui. Perlukan bantuan?</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> dimuat turun</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> berkongsi tetingkap.</translation>
 <translation id="4364830672918311045">Paparkan pemberitahuan</translation>
@@ -2553,6 +2612,7 @@
 <translation id="4509345063551561634">Lokasi:</translation>
 <translation id="4514542542275172126">Sediakan pengguna diselia yang baharu</translation>
 <translation id="4514914692061505365">Memaksa penggunaan penterjemah Subzero pantas PNaCl untuk semua fail pexe.</translation>
+<translation id="451515744433878153">Alih keluar</translation>
 <translation id="4516641987425683031">Tab disegerakkan</translation>
 <translation id="4518677423782794009">Adakah Chrome mengalami ranap, memaparkan halaman permulaan dan bar alat yang asing serta iklan tidak diduga yang tidak dapat disingkirkan atau mengubah pengalaman penyemakan imbas anda? Anda mungkin dapat membetulkan masalah itu dengan menjalankan Pembersih Chrome.</translation>
 <translation id="452039078290142656">peranti yang tidak diketahui daripada <ph name="VENDOR_NAME" /></translation>
@@ -2589,6 +2649,7 @@
 <translation id="4562991793854515912">terlalu pendek (600 ms)</translation>
 <translation id="4563210852471260509">Bahasa input permulaan adalah bahasa Cina</translation>
 <translation id="456664934433279154">Mengawal sama ada hendak menggunakan tetingkap Apl Chrome berasaskan Paparan Kit Alat.</translation>
+<translation id="4567772783389002344">Tambah perkataan</translation>
 <translation id="4569998400745857585">Menu mengandungi sambungan tersembunyi</translation>
 <translation id="4570444215489785449">Anda kini boleh mengunci peranti ini dari jauh bila-bila masa pada Pengurus Chrome.</translation>
 <translation id="4572659312570518089">Pengesahan dibatalkan semasa menyambung ke "<ph name="DEVICE_NAME" />".</translation>
@@ -2600,11 +2661,13 @@
 <translation id="4582447636905308869">IME Korea baharu yang berasaskan enjin HMM Alatan Input Google.</translation>
 <translation id="4582563038311694664">Tetapkan semula semua tetapan</translation>
 <translation id="4583537898417244378">Fail tidak sah atau rosak.</translation>
+<translation id="4585793705637313973">Edit halaman</translation>
 <translation id="4589268276914962177">Terminal baharu</translation>
 <translation id="4590324241397107707">Storan pangkalan data</translation>
 <translation id="4593021220803146968">&amp;Pergi ke <ph name="URL" /></translation>
 <translation id="4594109696316595112">Pengaktifan sekali: Taip kata laluan anda untuk mengaktifkan Smart Lock pada <ph name="DEVICE_TYPE" /> ini. Dengan Smart Lock, telefon anda akan membuka kunci peranti ini —tanpa kata laluan. Untuk mengubah atau melumpuhkan ciri ini, lawati tetapan <ph name="DEVICE_TYPE" /> anda.</translation>
 <translation id="4595560905247879544">Apl dan sambungan hanya boleh diubah suai oleh pengurus (<ph name="CUSTODIAN_NAME" />).</translation>
+<translation id="4596295440756783523">Anda mempunyai sijil pada fail yang mengenal pasti pelayan ini</translation>
 <translation id="4598556348158889687">Pengurusan storan</translation>
 <translation id="4601242977939794209">Penukar EMF</translation>
 <translation id="4602466770786743961">Sentiasa benarkan <ph name="HOST" /> mengakses kamera dan mikrofon anda</translation>
@@ -2670,6 +2733,7 @@
 <translation id="4697551882387947560">Apabila sesi penyemakan imbas berakhir</translation>
 <translation id="4699172675775169585">Imej dan fail dicache</translation>
 <translation id="4699357559218762027">(dilancarkan secara automatik)</translation>
+<translation id="4704677965327178154">Jangan benarkan mana-mana tapak menggunakan pemalam untuk mengakses komputer anda.</translation>
 <translation id="4707302005824653064">Penggunaan dan sejarah boleh dikaji semula oleh (<ph name="CUSTODIAN_EMAIL" />) pengurus pada chrome.com.</translation>
 <translation id="4707579418881001319">L2TP/IPsec + sijil pengguna</translation>
 <translation id="4707934200082538898">Sila semak e-mel anda di <ph name="BEGIN_BOLD" /><ph name="MANAGER_EMAIL" /><ph name="END_BOLD" /> untuk mendapatkan arahan selanjutnya.</translation>
@@ -2707,6 +2771,7 @@
 <translation id="4744574733485822359">Muat turun anda telah selesai</translation>
 <translation id="4746971725921104503">Nampaknya anda sudah mengurus pengguna dengan nama tersebut. Adakah anda ingin <ph name="LINK_START" />mengimport<ph name="USER_DISPLAY_NAME" /> ke peranti ini<ph name="LINK_END" />?</translation>
 <translation id="4747271164117300400">Macedonia</translation>
+<translation id="4748762018725435655">Memerlukan sambungan daripada Gedung Web Chrome</translation>
 <translation id="4749157430980974800">Papan kekunci bahasa Georgia</translation>
 <translation id="4750394297954878236">Cadangan</translation>
 <translation id="475088594373173692">Pengguna pertama</translation>
@@ -2720,6 +2785,7 @@
 <translation id="4763830802490665879">Kuki dari beberapa tapak akan dikosongkan semasa keluar.</translation>
 <translation id="4764029864566166446">Kemas kini pemalam...</translation>
 <translation id="4764865176798926079">domContentLoaded bingkai utama dan pemuatan semua sumber bermula sebelum domContentLoaded (iframe diabaikan).</translation>
+<translation id="4768332406694066911">Anda mempunyai sijil daripada organisasi ini yang mengenal pasti anda</translation>
 <translation id="4768698601728450387">Pangkas imej</translation>
 <translation id="4773696473262035477">Anda boleh mengaksesnya dan semua <ph name="SAVED_PASSWORDS_LINK" /> anda dari mana-mana penyemak imbas.</translation>
 <translation id="4776917500594043016">Kata laluan untuk <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -2737,10 +2803,12 @@
 <translation id="4793866834012505469">Latih semula model suara</translation>
 <translation id="479536056609751218">Laman Web, HTML Sahaja</translation>
 <translation id="479989351350248267">search</translation>
+<translation id="480036413855787547">Akses kata laluan anda daripada mana-mana peranti di <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />. Pada Mac, kata laluan boleh disimpan pada Keychain anda dan boleh diakses atau disegerakkan oleh pengguna Chrome lain yang berkongsi akaun OS X ini.</translation>
 <translation id="4801257000660565496">Cipta Pintasan Aplikasi</translation>
 <translation id="4801448226354548035">Sembunyikan akaun</translation>
 <translation id="4801512016965057443">Membenarkan perayauan data mudah alih</translation>
 <translation id="4801956050125744859">Simpan kedua-duanya</translation>
+<translation id="4803121606678474433">Dayakan peralihan mod pemaparan dinamik kanvas 2D.</translation>
 <translation id="4803909571878637176">Menyahpasang</translation>
 <translation id="4804331037112292643">Dialog Buka/Simpan Fail</translation>
 <translation id="4804818685124855865">Putuskan sambungan</translation>
@@ -2759,6 +2827,7 @@
 <translation id="4824518112777153488">Sokongan untuk skrin sentuh boleh tuding</translation>
 <translation id="4827948050554950725">Tambah kad kredit</translation>
 <translation id="4828493911650550108">Tingkatkan ketepatan lokasi dengan membenarkan apl dan perkhidmatan mengimbas rangkaian Wi-Fi serta peranti Bluetooth.</translation>
+<translation id="4828937774870308359">Australia</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> anda tidak dapat menyambung ke Internet menggunakan <ph name="NETWORK_NAME" />. Sila pilih rangkaian lain. <ph name="LEARN_MORE_LINK_START" />Ketahui lebih lanjut<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Identiti <ph name="ORGANIZATION" /> di <ph name="LOCALITY" /> telah disahkan oleh <ph name="ISSUER" />. Maklumat Ketelusan Sijil yang sah telah diberikan oleh pelayan.</translation>
 <translation id="4834912470034578916">Dayakan reka letak tersuai untuk Pemberitahuan Web.</translation>
@@ -2777,6 +2846,7 @@
 <translation id="4849517651082200438">Jangan Pasang</translation>
 <translation id="4850258771229959924">Lihat dalam Alatan Pembangun</translation>
 <translation id="4850458635498951714">Tambah peranti</translation>
+<translation id="4850669014075537160">Menatal</translation>
 <translation id="4850886885716139402">Lihat</translation>
 <translation id="4853020600495124913">Buka dalam tetingkap &amp;baharu</translation>
 <translation id="485316830061041779">Bahasa Jerman</translation>
@@ -2824,6 +2894,7 @@
 <translation id="4903369323166982260">Jalankan Pembersih Chrome</translation>
 <translation id="4906679076183257864">Tetapkan semula kepada Lalai</translation>
 <translation id="4907125798206348918">MemoryCache lemah.</translation>
+<translation id="4907306957610201395">Kategori Kebenaran</translation>
 <translation id="49088176676474409">Sembunyikan nilai VPD.</translation>
 <translation id="4910021444507283344">WebGL</translation>
 <translation id="4910673011243110136">Rangkaian persendirian</translation>
@@ -2850,6 +2921,7 @@
 <translation id="4938972461544498524">Tetapan pad sentuh</translation>
 <translation id="4940047036413029306">Petikan</translation>
 <translation id="4941246025622441835">Gunakan permintaan peranti ini apabila mendaftarkan peranti untuk pengurusan perusahaan:</translation>
+<translation id="4941627891654116707">Saiz fon</translation>
 <translation id="4942394808693235155">Semak dan kenakan kemas kini</translation>
 <translation id="494286511941020793">Bantuan Konfigurasi Proksi</translation>
 <translation id="4950138595962845479">Pilihan...</translation>
@@ -2860,6 +2932,7 @@
 <translation id="4956847150856741762">1</translation>
 <translation id="495931528404527476">Dalam Chrome</translation>
 <translation id="496226124210045887">Folder yang anda pilih mengandungi fail sensitif. Adakah anda pasti mahu memberikan "$1" akses membaca tetap kepada folder ini?</translation>
+<translation id="4964455510556214366">Susunan</translation>
 <translation id="4964673849688379040">Menyemak...</translation>
 <translation id="4966802378343010715">Buat pengguna baharu</translation>
 <translation id="4967749818080339523">Pilih akaun</translation>
@@ -2984,6 +3057,7 @@
 <translation id="5144820558584035333">Hangul 3 Set (390)</translation>
 <translation id="5145331109270917438">Tarikh diubah suai</translation>
 <translation id="5146631943508592569">Lumpuhkan pemberitahuan Tamat Hayat Peranti.</translation>
+<translation id="5147113189823897615">Memandangkan akaun ini diurus oleh <ph name="DOMAIN" />, penanda halaman, sejarah, kata laluan dan tetapan anda yang lain akan dikosongkan daripada peranti ini. Namun begitu, data anda akan terus disimpan dalam Akaun Google.</translation>
 <translation id="5147237161038757796">Ciri autobetul papan kekunci fizikal</translation>
 <translation id="5148320352496581610">Penyasaran berdasarkan segi empat tepat menggunakan heuristik untuk menentukan sasaran gerak isyarat yang paling berkemungkinan dengan kawasan sentuhan diwakili oleh segi empat tepat.</translation>
 <translation id="5150254825601720210">Nama Pelayan SSL Sijil Netscape</translation>
@@ -3020,6 +3094,7 @@
 <translation id="5181140330217080051">Memuat turun</translation>
 <translation id="5182671122927417841">Lumpuhkan sambungan</translation>
 <translation id="5184063094292164363">&amp;Konsol JavaScript</translation>
+<translation id="5184662919967270437">Mengemas kini peranti anda</translation>
 <translation id="5185386675596372454">Versi terbaharu "<ph name="EXTENSION_NAME" />" telah dilumpuhkan kerana ia memerlukan lebih banyak kebenaran.</translation>
 <translation id="5185403602014064051">Ciri ini membenarkan anda mengakses mana-mana pengguna yang dimuat masuk dengan cepat tanpa memerlukan kata laluan.</translation>
 <translation id="5186650237607254032">Kemas kini kunci skrin telefon anda supaya dimatikan apabila anda berada berdekatan. Anda akan membuka kunci telefon dengan lebih cepat dan menikmati pengalaman Smart Lock yang lebih baik pada <ph name="DEVICE_TYPE" /> anda.</translation>
@@ -3031,6 +3106,7 @@
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5197680270886368025">Penyegerakan selesai.</translation>
 <translation id="5204967432542742771">Masukkan kata laluan</translation>
+<translation id="5206215183583316675">Padam "<ph name="CERTIFICATE_NAME" />"?</translation>
 <translation id="520621735928254154">Ralat Pengimportan Sijil</translation>
 <translation id="5208988882104884956">Kelebaran separa</translation>
 <translation id="5209320130288484488">Tiada peranti ditemui</translation>
@@ -3048,6 +3124,7 @@
 <translation id="5227808808023563348">Cari teks sebelumnya</translation>
 <translation id="5228076606934445476">Ada sesuatu yang tidak kena dengan peranti.  Untuk pulih daripada ralat ini, anda perlu but semula peranti dan cuba lagi.</translation>
 <translation id="5228962187251412618">Pemeriksaan dalam talian sahaja</translation>
+<translation id="5229189185761556138">Urus kaedah input</translation>
 <translation id="5229622432348746578">Lumpuhkan Audio Untuk Perkongsian Desktop</translation>
 <translation id="5230516054153933099">Tetingkap</translation>
 <translation id="5232178406098309195">Apabila anda menggunakan perintah pengaktifan audio, seperti "Ok Google" atau menyentuh ikon mikrofon, Aktiviti Suara &amp; Audio peribadi anda menyimpan suara dan audio lain ke akaun anda. Rakaman pertuturan/audio berikut, ditambah beberapa saat sebelumnya, akan disimpan.</translation>
@@ -3227,7 +3304,6 @@
 <translation id="5439568486246921931">Tindakan ini akan memadamkan muat turun, fail luar talian dan data semakan imbas pengguna ini. Tindakan ini tidak boleh dibuat asal.</translation>
 <translation id="544083962418256601">Buat pintasan...</translation>
 <translation id="5441100684135434593">Rangkaian berwayar</translation>
-<translation id="5445088910157062298">Biarkan perkhidmatan lokasi Google membantu apl mencari lokasi anda dengan cepat dan tepat, yang dapat mengurangkan penggunaan kuasa bateri. Data lokasi awanama akan dihantar ke Google, walaupun tiada apl sedang berjalan.</translation>
 <translation id="5448293924669608770">Op, sesuatu telah berlaku dengan log masuk</translation>
 <translation id="5449588825071916739">Tanda Halaman Semua Tab</translation>
 <translation id="5449716055534515760">Tutup Te&amp;tingkap</translation>
@@ -3390,6 +3466,7 @@
 <translation id="5675224880872496917">Dianimasikan dengan lancar apabila menatal kandungan halaman.</translation>
 <translation id="5676267133227121599">Akses kata laluan anda daripada mana-mana peranti di <ph name="MANAGEMENT_LINK" />.</translation>
 <translation id="5677503058916217575">Bahasa halaman:</translation>
+<translation id="5677850799565527075">Sekat kuki pihak ketiga.</translation>
 <translation id="5677928146339483299">Disekat</translation>
 <translation id="5678550637669481956">Akses baca dan tulis kepada <ph name="VOLUME_NAME" /> telah diberikan.</translation>
 <translation id="567881659373499783">Versi <ph name="PRODUCT_VERSION" /></translation>
@@ -3419,6 +3496,7 @@
 <translation id="5711983031544731014">Tidak dapat membuka kunci. Masukkan kata laluan anda.</translation>
 <translation id="5712966208980506909">Jika didayakan, URL chrome://md-policy memuatkan halaman dasar Reka Bentuk Bahan.</translation>
 <translation id="5715711091495208045">Broker Pemalam: <ph name="PLUGIN_NAME" /></translation>
+<translation id="5719603411793408026">Enjin carian lalai</translation>
 <translation id="572328651809341494">Tab terbaharu</translation>
 <translation id="5723508132121499792">Tiada apl latar belakang dijalankan</translation>
 <translation id="5725124651280963564">Sila log masuk ke <ph name="TOKEN_NAME" /> untuk menjanakan kekunci untuk <ph name="HOST_NAME" />.</translation>
@@ -3426,14 +3504,18 @@
 <translation id="572525680133754531">Paparkan sempadan di sekeliling Lapisan Paparan yang digubah untuk membantu menyahpepijat dan mengkaji penggubahan lapisan.</translation>
 <translation id="5726521882516480114">Mendayakan penggunaan GPU untuk melaksanakan pemaparan kanvas 2d berbanding penggunaan pemaparan perisian.</translation>
 <translation id="5727728807527375859">Sambungan, apl dan tema boleh membahayakan komputer anda. Adakah anda pasti anda mahu meneruskan?</translation>
+<translation id="5727970983344022445">Jangan benarkan mana-mana tapak menggunakan penghasilan kunci dalam borang</translation>
 <translation id="5729712731028706266">&amp;Lihat</translation>
 <translation id="5729996640881880439">Maaf, kami tidak dapat menunjukkan kod bagi ralat ini.</translation>
 <translation id="5731247495086897348">Ta&amp;mpal dan Pergi</translation>
 <translation id="5731751937436428514">Kaedah input Vietnam (VIQR)</translation>
 <translation id="5732790216998904518">Pengeditan Fail Office untuk Dokumen, Helaian &amp; Slaid bagi tujuan ujian.</translation>
 <translation id="5734362860645681824">Komunikasi</translation>
+<translation id="5739458112391494395">Sangat besar</translation>
+<translation id="5740331643563157105"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /> dan <ph name="NUM_ADDITIONAL_LANGUAGES" /> yang lain</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: pilih untuk mengedit</translation>
 <translation id="5741454054957165976">Dayakan versi Baharu Campur Tangan Ejen Pengguna untuk pemuatan WebFonts.</translation>
+<translation id="5742598604154146709">Jangan benarkan mana-mana tapak memuat turun berbilang fail secara automatik.</translation>
 <translation id="574392208103952083">Sederhana</translation>
 <translation id="5744368829843057748">Terjemahkan 2016Q2 UI</translation>
 <translation id="5745056705311424885">Batang memori USB dikesan</translation>
@@ -3615,6 +3697,7 @@
 <translation id="5991774521050363748">Dayakan reka letak tersuai untuk Pemberitahuan Web. Pemberitahuan ini akan mengalami peningkatan reka letak tidak ketara yang tidak mungkin berlaku tanpa pendayaan ini.</translation>
 <translation id="5993332328670040093">Penggunaan data anda tidak lagi akan diukur.</translation>
 <translation id="5996258716334177896">Profil anda tidak dapat dibuka dengan betul. Beberapa ciri mungkin tidak tersedia. Sila semak bahawa profil tersebut wujud dan anda mempunyai kebenaran untuk membaca dan menulis kandungannya.</translation>
+<translation id="6001799583597751002">PIN tidak sepadan:</translation>
 <translation id="6003177993629630467"><ph name="PRODUCT_NAME" /> mungkin tidak dapat memastikannya terkini.</translation>
 <translation id="6003294706906016758">Mendayakan bingkai gaya apl web untuk apl dihoskan</translation>
 <translation id="600424552813877586">Aplikasi yang tidak sah.</translation>
@@ -3640,6 +3723,7 @@
 <translation id="604001903249547235">Sandaran awan</translation>
 <translation id="6040143037577758943">Tutup</translation>
 <translation id="604124094241169006">Automatik</translation>
+<translation id="6041935588605837913">10</translation>
 <translation id="6042308850641462728">Lagi</translation>
 <translation id="604257181445267932">Smart Lock membantu anda log masuk ke apl dan tapak web dengan cepat menggunakan kata laluan yang telah anda simpan di Google.</translation>
 <translation id="6043317578411397101"><ph name="APP_NAME" /> berkongsi tab Chrome dengan <ph name="TAB_NAME" />.</translation>
@@ -3659,6 +3743,7 @@
 <translation id="6062697480277116433">Anda menggunakan data selular</translation>
 <translation id="6065289257230303064">Atribut Direktori Subjek Sijil</translation>
 <translation id="6071181508177083058">sahkan kata laluan</translation>
+<translation id="6073903501322152803">Tambahkan ciri kebolehaksesan</translation>
 <translation id="6074825444536523002">Borang Google</translation>
 <translation id="6075731018162044558">Op!  Sistem gagal mencapai token akses API jangka panjang untuk peranti ini.</translation>
 <translation id="6075880972317537864">Penyerang di <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> mungkin cuba menipu anda untuk mencuri maklumat anda (contohnya kata laluan, mesej atau kad kredit).</translation>
@@ -3693,7 +3778,6 @@
 <translation id="6110466548232134880">Identiti <ph name="ORGANIZATION" /> di <ph name="LOCALITY" /> telah disahkan oleh <ph name="ISSUER" />. Tiada maklumat Ketelusan Sijil telah diberikan oleh pelayan.</translation>
 <translation id="6111770213269631447">Pengalihan huruf (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Dibenarkan secara lalai</translation>
-<translation id="6112929985131461002">Peranti ini akan menghantar data diagnostik dan penggunaan secara automatik ke Google. <ph name="BEGIN_LINK1" />Tetapan<ph name="END_LINK1" /> ini dikuatkuasakan oleh pentadbir anda. <ph name="BEGIN_LINK2" />Ketahui Lebih Lanjut<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Tukar tetapan bahasa dan input</translation>
 <translation id="6120205520491252677">Pin halaman ini pada skrin Mula...</translation>
 <translation id="6122081475643980456">Sambungan Internet anda sedang dikawal</translation>
@@ -3715,8 +3799,10 @@
 <translation id="6143186082490678276">Dapatkan Bantuan</translation>
 <translation id="6144697279259829572">{NUM_ITEMS,plural, =1{Tindakan ini akan memadamkan sekurang-kurangnya $1 item daripada peranti ini selama-lamanya.}other{Tindakan ini akan memadamkan sekurang-kurangnya $1 item daripada peranti ini selama-lamanya.}}</translation>
 <translation id="6144890426075165477"><ph name="PRODUCT_NAME" /> kini bukan penyemak imbas lalai anda.</translation>
+<translation id="6145860855437952742">Bilangan maksimum tetingkap pratonton dalam mod ikhtisar yang boleh menggunakan topeng untuk menyembunyikan tajuk tetingkap dan menggunakan sudut bulat.</translation>
 <translation id="6147020289383635445">Gagal pratonton cetakan.</translation>
 <translation id="614998064310228828">Model peranti:</translation>
+<translation id="6150555451039504280">Kecilkan/kembangkan</translation>
 <translation id="6150853954427645995">Bagi menyimpan fail ini untuk kegunaan luar talian, sila kembali ke dalam talian, klik kanan fail, dan pilih pilihan <ph name="OFFLINE_CHECKBOX_NAME" />.</translation>
 <translation id="6151323131516309312">Tekan <ph name="SEARCH_KEY" /> untuk mencari <ph name="SITE_NAME" /></translation>
 <translation id="6154697846084421647">Dilog masuk pada masa ini</translation>
@@ -3814,6 +3900,7 @@
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Pencetak baharu pada rangkaian anda}other{Pencetak baharu pada rangkaian anda}}</translation>
 <translation id="6285395082104474418">Dulang status menunjukkan kepada anda keadaan semasa rangkaian, bateri anda dan lagi.</translation>
 <translation id="6286684120317096255">Penggunaan data sedang diukur</translation>
+<translation id="6286708577777130801">Butiran kata laluan yang disimpan</translation>
 <translation id="6287852322318138013">Pilih apl untuk membuka fail ini</translation>
 <translation id="6288919040208869552">Jika dikonfigurasikan, proksi biasanya menghalang keizinan pada portal tawanan yang berbeza. Bendera ini mendayakan pembukaan dialog keizinan portal tawanan dalam tetingkap berasingan yang mengabaikan tetapan proksi.</translation>
 <translation id="6290556621549272952">Anda boleh menggunakan ciri ini untuk memaparkan kandungan daripada Chromium pada TV atau peranti anda yang lain.</translation>
@@ -3855,6 +3942,7 @@
 <translation id="6353618411602605519">Papan kekunci Croatia</translation>
 <translation id="6356936121715252359">Tetapan storan Adobe Flash Player...</translation>
 <translation id="6357619544108132570">Selamat datang ke keluarga <ph name="SHORT_PRODUCT_NAME" />. Ini bukan komputer biasa.</translation>
+<translation id="63617602971594377">Dayakan API untuk pembayaran di web</translation>
 <translation id="6361850914223837199">Butiran ralat:</translation>
 <translation id="6362853299801475928">&amp;Laporkan isu...</translation>
 <translation id="636343209757971102">Alamat IPv6:</translation>
@@ -3890,6 +3978,7 @@
 <translation id="6410063390789552572">Tidak dapat mengakses perpustakaan rangkaian</translation>
 <translation id="6410257289063177456">Fail Imej</translation>
 <translation id="6410328738210026208">Tukar saluran dan Powerwash</translation>
+<translation id="6410668567036790476">Tambah enjin carian</translation>
 <translation id="641105183165925463">$1 MB</translation>
 <translation id="6412931879992742813">Tetingkap incognito baharu</translation>
 <translation id="6418160186546245112">Berbalik kepada versi <ph name="IDS_SHORT_PRODUCT_NAME" /> yang dipasang sebelum ini</translation>
@@ -3922,14 +4011,15 @@
 <translation id="6443783728907198276">Apabila didayakan, mesej Stun yang dihasilkan oleh WebRTC akan mengandungi Pengepala asal.</translation>
 <translation id="6444070574980481588">Tetapkan tarikh dan masa</translation>
 <translation id="6445450263907939268">Jika anda tidak mahu perubahan ini, anda boleh mengembalikan tetapan anda yang terdahulu.</translation>
+<translation id="6447388538018752757">Mendayakan peralihan saluran pemaparan grafik dinamik dalam kanvas 2D untuk mengoptimumkan prestasi berdasarkan jenis operasi lukis yang digunakan.</translation>
 <translation id="6447842834002726250">Kuki</translation>
 <translation id="6449285849137521213">Apl "<ph name="EXTENSION_NAME" />" telah ditambahkan.</translation>
 <translation id="6450876761651513209">Ubah tetapan berkaitan privasi anda</translation>
+<translation id="6451180435462401570">Urus peranti Cetakan Awan</translation>
 <translation id="6451650035642342749">Bersihkan tetapan membuka auto</translation>
 <translation id="6452181791372256707">Tolak</translation>
 <translation id="6454421252317455908">Kaedah input bahasa Cina (pantas)</translation>
 <translation id="6455348477571378046">Jenis Sijil:</translation>
-<translation id="6456234919706689841">Pentadbir anda boleh memilih untuk menghantar data diagnostik dan penggunaan untuk peranti ini ke Google. Anda boleh melihat <ph name="BEGIN_LINK1" />tetapan<ph name="END_LINK1" /> ini di sini. <ph name="BEGIN_LINK2" />Ketahui Lebih Lanjut<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Terus menyekat JavaScript</translation>
 <translation id="6458308652667395253">Uruskan sekatan JavaScript...</translation>
 <translation id="6459488832681039634">Use Selection for Find</translation>
@@ -3983,10 +4073,12 @@
 <translation id="6526654154229718724">Mod skrin penuh dengan kunci papan kekunci percubaan memerlukan pengguna untuk menekan kekunci Esc untuk keluar.</translation>
 <translation id="6527303717912515753">Kongsi</translation>
 <translation id="6528546217685656218">Kunci Peribadi untuk Sijil Pelanggan tiada atau tidak sah.</translation>
+<translation id="652948702951888897">Sejarah Chrome</translation>
 <translation id="653019979737152879">Menyegerakkan <ph name="FILE_NAME" />...</translation>
 <translation id="6534583978616527129">Mulakan sambungan</translation>
 <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Perhatian:<ph name="END_BOLD" /> Dayakan hanya jika anda pasti akan perkara yang anda lakukan atau jika anda telah diminta melakukan sedemikian, kerana pengumpulan data boleh mengurangkan prestasi.</translation>
 <translation id="654233263479157500">Gunakan perkhidmatan web untuk membantu menyelesaikan ralat navigasi</translation>
+<translation id="6545665334409411530">Kadar pengulangan</translation>
 <translation id="6545834809683560467">Gunakan perkhidmatan ramalan untuk membantu menyelesaikan carian dan URL yang ditaip dalam bar alamat atau kotak carian pelancar apl</translation>
 <translation id="6546686722964485737">Sertai rangkaian WIMAX</translation>
 <translation id="6547316139431024316">Jangan berikan amaran untuk sambungan ini lagi</translation>
@@ -4057,9 +4149,11 @@
 <translation id="6643016212128521049">Kosongkan</translation>
 <translation id="6644756108386233011">Tetapkan semula tetapan <ph name="IDS_SHORT_PRODUCT_NAME" /> yang diubah?</translation>
 <translation id="6647228709620733774">URL Pembatalan Pihak Berkuasa Pensijilan Netscape</translation>
+<translation id="6647838571840953560">Pada masa ini di <ph name="CHANNEL_NAME" /></translation>
 <translation id="6649018507441623493">Tunggu sebentar...</translation>
 <translation id="6649068951642910388">UI pemulihan sesi akan ditunjukkan dalam gelembung dan bukannya bar maklumat.</translation>
 <translation id="665061930738760572">Buka dalam &amp;Tetingkap Baharu</translation>
+<translation id="6651237644330755633">Percayakan sijil ini untuk mengenal pasti tapak web</translation>
 <translation id="6652975592920847366">Cipta Media Pemulihan OS</translation>
 <translation id="6653525630739667879">Tidak boleh disimpan ke $1. Semua imej yang diedit akan disimpan ke $2 dalam folder Muat Turun.</translation>
 <translation id="6655190889273724601">Mod pembangun</translation>
@@ -4114,6 +4208,7 @@
 <translation id="6725970970008349185">Bilangan calon untuk dipaparkan bagi setiap halaman</translation>
 <translation id="672609503628871915">Lihat apa yang baharu</translation>
 <translation id="6727005317916125192">Anak tetingkap sebelumnya</translation>
+<translation id="6727842159866499206">Bilangan maksimum tetingkap pratonton dalam mod ikhtisar yang boleh menggunakan bentuk untuk menyembunyikan tajuk tetingkap.</translation>
 <translation id="6731320427842222405">Ini mungkin mengambil masa beberapa minit.</translation>
 <translation id="6731638353631257659">Mod cache V8.</translation>
 <translation id="6732586201820838268">Tidak dapat mewujudkan sambungan dengan telefon anda. Pastikan anda menggunakan telefon Android serasi yang dihidupkan dan dalam jangkauan lengan. &lt;a&gt;Ketahui lebih lanjut&lt;/a&gt;</translation>
@@ -4125,6 +4220,7 @@
 <translation id="6740369132746915122">Jika anda memahami risikonya kepada keselamatan anda, anda boleh <ph name="BEGIN_LINK" />melawati tapak yang tidak selamat ini<ph name="END_LINK" />.</translation>
 <translation id="6745592621698551453">Kemas kini sekarang</translation>
 <translation id="6745994589677103306">Jangan Buat Apa-Apa</translation>
+<translation id="6746124502594467657">Alihkan ke bawah</translation>
 <translation id="674632704103926902">Dayakan penyeretan ketik</translation>
 <translation id="6746392203843147041">tambahkan kelantangan</translation>
 <translation id="6748140994595080445">Tukar cara <ph name="APP_NAME" /> mengendalikan dan memaparkan bahasa.</translation>
@@ -4138,6 +4234,7 @@
 <translation id="6769712124046837540">Menambah pencetak...</translation>
 <translation id="6771503742377376720">Adalah Pihak Berkuasa Pensijilan</translation>
 <translation id="6773575010135450071">Lebih banyak tindakan...</translation>
+<translation id="677965093459947883">Sangat kecil</translation>
 <translation id="6780439250949340171">uruskan tetapan lain</translation>
 <translation id="6786747875388722282">Pelanjutan</translation>
 <translation id="6787839852456839824">Pintasan papan kekunci</translation>
@@ -4161,6 +4258,7 @@
 <translation id="6815353853907306610"><ph name="IDS_SHORT_PRODUCT_NAME" /> mengesan bahawa tetapan penyemak imbas anda mungkin telah diubah tanpa pengetahuan anda. Adakah anda ingin menetapkannya semula kepada lalai asal?</translation>
 <translation id="6815551780062710681">edit</translation>
 <translation id="6817358880000653228">Kata laluan yang disimpan untuk tapak ini.</translation>
+<translation id="6820008762872335722">Tetapkan semula untuk bertanya</translation>
 <translation id="6820687829547641339">Arkib tar Gzip dimampatkan</translation>
 <translation id="682123305478866682">Hantar desktop</translation>
 <translation id="6823506025919456619">Anda perlu log masuk ke Chrome untuk melihat peranti anda</translation>
@@ -4181,7 +4279,9 @@
 <translation id="683526731807555621">Tmbh enjin carian baru
 </translation>
 <translation id="6835762382653651563">Sila sambung ke Internet untuk mengemaskinikan <ph name="DEVICE_TYPE" /> anda.</translation>
+<translation id="6839158130869314728">Paparan cermin</translation>
 <translation id="6839225236531462745">Ralat Pemadaman Sijil</translation>
+<translation id="6840155290835956714">Tanya sebelum menghantar</translation>
 <translation id="6840184929775541289">Adalah bukan Pihak Berkuasa Pensijilan</translation>
 <translation id="6840313690797192085">$1 PB</translation>
 <translation id="6841186874966388268">Ralat</translation>
@@ -4191,6 +4291,7 @@
 <translation id="6847758263950452722">Simpan Halaman MHTML</translation>
 <translation id="6853388645642883916">Pengemaskinian tidur</translation>
 <translation id="68541483639528434">Tutup tab lain</translation>
+<translation id="6855099371444560844">Tambah Peranti</translation>
 <translation id="6856701878604560493">Dayakan penanda halaman luar talian</translation>
 <translation id="6860097299815761905">Tetapan proksi...</translation>
 <translation id="6860427144121307915">Buka dalam Tab</translation>
@@ -4271,11 +4372,13 @@
 <translation id="6980462514016882061">Google boleh menggunakan sejarah penyemakan imbas anda untuk memperibadikan Carian, iklan dan perkhidmatan Google yang lain.</translation>
 <translation id="6980956047710795611">Pindahkan semua data Chrome OS kepada kata laluan baharu (memerlukan kata laluan sebelumnya)</translation>
 <translation id="6981982820502123353">Kebolehcapaian</translation>
+<translation id="6981992744085917617">Pilih kaedah yang anda ingin gunakan untuk log masuk semula ke akaun anda:</translation>
 <translation id="6982896539684144327">Pencetak daripada <ph name="VENDOR_NAME" /> dikesan</translation>
 <translation id="6983783921975806247">OID berdaftar</translation>
 <translation id="6983991971286645866">Semua suntingan akan disimpan ke $1.</translation>
 <translation id="6985235333261347343">Ejen Pemulihan Penting Microsoft</translation>
 <translation id="6985276906761169321">ID:</translation>
+<translation id="6985607387932385770">Pencetak</translation>
 <translation id="6986605181115043220">Oops, Penyegerakan telah berhenti berfungsi. <ph name="BEGIN_LINK" />Ketahui Lebih Lanjut<ph name="END_LINK" /></translation>
 <translation id="6989294135336900804">Tiada tab yang disegerakkan</translation>
 <translation id="6990081529015358884">Anda telah kehabisan ruang</translation>
@@ -4298,6 +4401,7 @@
 <translation id="7006844981395428048">Audio $1</translation>
 <translation id="7008270479623533562">Untuk menjalankan sambungan ini, anda perlu memuatkan semula halaman. Anda boleh menjalankan sambungan ini secara automatik pada tapak ini dengan mengklik kanan pada ikon sambungan.</translation>
 <translation id="7009045250432250765">Autoisi satu klik</translation>
+<translation id="7009420427128923703">Bilangan tetingkap maksimum dalam ikhtisar yang boleh menggunakan topeng.</translation>
 <translation id="7010160495478792664">Nyahkod video yang dipecut perkakasan jika tersedia.</translation>
 <translation id="7010400591230614821">Strategi pelepasan tab agresif</translation>
 <translation id="701080569351381435">Lihat Sumber</translation>
@@ -4341,6 +4445,7 @@
 <translation id="7061692898138851896">Simpan kata laluan secara automatik</translation>
 <translation id="7062222374113411376">Benarkan tapak yang baru sahaja ditutup untuk menyelesaikan penghantaran dan penerimaan data (disyorkan)</translation>
 <translation id="7063129466199351735">Memproses pintasan...</translation>
+<translation id="7063957500469387217">Sediakan atau urus pencetak dalam Cetakan Awan Google.</translation>
 <translation id="7065223852455347715">Peranti ini dikunci dalam mod yang menghalang pendaftaran perusahaan. Jika anda ingin mendaftarkan peranti anda perlu melalui pemulihan peranti terlebih dahulu.</translation>
 <translation id="7065534935986314333">Mengenai Sistem</translation>
 <translation id="7066944511817949584">Gagal untuk bersambung ke "<ph name="DEVICE_NAME" />".</translation>
@@ -4403,6 +4508,7 @@
 <translation id="715118844758971915">Pencetak klasik</translation>
 <translation id="7154130902455071009">Tukar halaman permulaan anda kepada: <ph name="START_PAGE" /></translation>
 <translation id="715487527529576698">Mod Bahasa China Permulaan adalah Bahasa Cina Ringkas</translation>
+<translation id="7155171745945906037">Foto sedia ada daripada kamera atau fail</translation>
 <translation id="715568033737470079">Tentukan pemalam PPAPI yang akan dijalankan dalam dasar kotak pasir kunci semua Win32k (Windows 10 dan yang lebih baharu sahaja).</translation>
 <translation id="7156235233373189579">Fail ini direka bentuk untuk komputer dengan menggunakan perisian Windows. Ini tidak serasi dengan peranti anda yang menjalankan OS Chrome. Sila cari <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> bagi apl ganti yang sesuai. <ph name="BEGIN_LINK_HELP" />Ketahui Lebih Lanjut<ph name="END_LINK_HELP" /></translation>
 <translation id="7157063064925785854">Apabila Teruskan diklik, bermakna anda bersetuju menerima <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> dan <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation>
@@ -4419,6 +4525,7 @@
 <translation id="7175353351958621980">Dimuatkan daripada:</translation>
 <translation id="7180611975245234373">Muat semula</translation>
 <translation id="7180865173735832675">Peribadikan</translation>
+<translation id="7185078796915954712">TLS 1.3</translation>
 <translation id="7185690883425432021">Menyembunyikan butang tutup pada tab tidak aktif apabila jalur tab berada dalam mod tindanan.</translation>
 <translation id="7186088072322679094">Simpan dalam Bar Alat</translation>
 <translation id="719009910964971313">Papan kekunci Dvorak Pengatur Cara AS</translation>
@@ -4458,6 +4565,8 @@
 <translation id="7240120331469437312">Nama Alternatif Subjek Sijil</translation>
 <translation id="7241389281993241388">Sila log masuk ke <ph name="TOKEN_NAME" /> untuk mengimport sijil klien.</translation>
 <translation id="7243055093079293866">Sebut "Ok Google" dalam tab baharu dan google.com</translation>
+<translation id="7243632151880336635">Kosongkan dan Log Keluar</translation>
+<translation id="7245628041916450754"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Terbaik)</translation>
 <translation id="724691107663265825">Tapak di hadapan mengandungi perisian hasad</translation>
 <translation id="725109152065019550">Maaf, pentadbir anda telah melumpuhkan storan luar pada akaun anda.</translation>
 <translation id="7252661675567922360">Jangan muatkan</translation>
@@ -4471,7 +4580,9 @@
 <translation id="7262004276116528033">Perkhidmatan log masuk ini dihoskan oleh <ph name="SAML_DOMAIN" /></translation>
 <translation id="7262221505565121">Pengecualian akses pemalam tanpa kotak pasir</translation>
 <translation id="7264275118036872269">Gagal untuk memulakan penemuan peranti Bluetooth.</translation>
+<translation id="7264454014834869122">Pilih daripada Gedung Web Chrome</translation>
 <translation id="726502072182862130">Nama dan ikon profil Google</translation>
+<translation id="7267186368513450821">5</translation>
 <translation id="7268365133021434339">Tutup Tab</translation>
 <translation id="7268659760406822741">Perkhidmatan yang tersedia</translation>
 <translation id="7273110280511444812">kali terakhir dilampirkan pada <ph name="DATE" /></translation>
@@ -4488,6 +4599,7 @@
 <translation id="7287143125007575591">Akses ditolak.</translation>
 <translation id="7288592446024861651">Penanda halaman, sejarah, kata laluan dan tetapan anda yang lain akan disegerakkan ke Akaun Google supaya anda dapat menggunakannya pada semua peranti. Kawal perkara yang akan disegerakkan di <ph name="BEGIN_LINK" /></translation>
 <translation id="7288676996127329262"><ph name="HORIZONTAL_DPI" />x<ph name="VERTICAL_DPI" /> dpi</translation>
+<translation id="7289225569524511578">Buka apl kertas dinding</translation>
 <translation id="7290242001003353852">Perkhidmatan log masuk yang dihoskan oleh <ph name="SAML_DOMAIN" /> ini sedang mengakses kamera anda.</translation>
 <translation id="7290594223351252791">Sahkan pendaftaran</translation>
 <translation id="7295019613773647480">Dayakan pengguna diselia</translation>
@@ -4526,6 +4638,7 @@
 <translation id="7347751611463936647">Untuk menggunakan sambungan ini, taip "<ph name="EXTENSION_KEYWORD" />", kemudian TAB, kemudian perintah atau carian anda.</translation>
 <translation id="7348093485538360975">Papan kekunci pada skrin</translation>
 <translation id="7348749398828259943">Papan kekunci US Workman international</translation>
+<translation id="7352495173098919663">Edit</translation>
 <translation id="7352651011704765696">Sesuatu yang tidak kena telah berlaku</translation>
 <translation id="7353651168734309780"><ph name="EXTENSION_NAME" /> memerlukan kebenaran baharu</translation>
 <translation id="7361039089383199231">$1 bait</translation>
@@ -4636,6 +4749,7 @@
 <translation id="749028671485790643"><ph name="VALUE" /> orang</translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7493386493263658176">Sambungan <ph name="EXTENSION_NAME" /> boleh mengumpul semua teks yang anda taip, termasuk data peribadi seperti kata laluan dan nombor kad kredit. Adakah anda ingin menggunakan sambungan ini?</translation>
+<translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="7495424355577885780">Jika didayakan, langkah melaporkan isu akan memuatkan UI maklum balas Reka Bentuk Bahan.</translation>
 <translation id="7495778526395737099">Terlupa kata laluan lama anda?</translation>
 <translation id="7503191893372251637">Jenis Sijil Netscape</translation>
@@ -4707,7 +4821,6 @@
 <translation id="7587108133605326224">Baltik</translation>
 <translation id="7589461650300748890">Wah, di sana. Berhati-hati.</translation>
 <translation id="7589661784326793847">Sila tunggu sebentar</translation>
-<translation id="7593635197364225277">Sandarkan dan pulihkan data apl Play secara automatik ke Google Drive. Anda boleh menukarnya dalam Tetapan Android pada bila-bila masa. <ph name="BEGIN_LINK1" />Ketahui Lebih Lanjut<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (kod ralat <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Ok, import</translation>
 <translation id="7600965453749440009">Jangan sekali-kali terjemahkan <ph name="LANGUAGE" /></translation>
@@ -4753,6 +4866,7 @@
 <translation id="7654941827281939388">Akaun ini telah digunakan pada komputer ini.</translation>
 <translation id="7658239707568436148">Batal</translation>
 <translation id="7659584679870740384">Anda tiada kebenaran untuk menggunakan peranti ini. Sila hubungi pentadbir untuk mendapatkan kebenaran log masuk.</translation>
+<translation id="7661259717474717992">Benarkan tapak menyimpan dan membaca data kuki</translation>
 <translation id="7663719505383602579">Penerima: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7664620655576155379">Peranti Bluetooth tidak disokong: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="7665369617277396874">Tambah akaun</translation>
@@ -4782,6 +4896,7 @@
 <translation id="7709152031285164251">Gagal - <ph name="INTERRUPT_REASON" /></translation>
 <translation id="7709980197120276510">Apabila Teruskan diklik, bermakna anda bersetuju menerima <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" />, <ph name="LEGAL_DOC_LINK_TEXT_4" /> dan <ph name="LEGAL_DOC_LINK_TEXT_5" />.</translation>
 <translation id="7712140766624186755">Tanya oleh dasar</translation>
+<translation id="7712196439824268605">PIN ini mudah untuk diteka:</translation>
 <translation id="7713320380037170544">Benarkan semua tapak menggunakan mesej eksklusif sistem untuk mengakses peranti MIDI</translation>
 <translation id="7714464543167945231">Sijil</translation>
 <translation id="7716020873543636594">Klik secara automatik apabila penuding tetikus berhenti</translation>
@@ -4789,6 +4904,8 @@
 <translation id="7716781361494605745">URL Dasar Pihak Berkuasa Pensijilan Netscape</translation>
 <translation id="7716970641886237992">Diubah Suai Oleh</translation>
 <translation id="7717014941119698257">Memuat turun: <ph name="STATUS" /></translation>
+<translation id="7717845620320228976">Semak kemas kini</translation>
+<translation id="7719367874908701697">Zum halaman</translation>
 <translation id="7719421816612904796">Latihan tamat masa</translation>
 <translation id="771953673318695590">S&amp;J</translation>
 <translation id="7720375555307821262">Untuk menyelia orang ini, <ph name="BEGIN_LINK" />log masuk ke Chrome<ph name="END_LINK" />.</translation>
@@ -4801,6 +4918,7 @@
 <translation id="7742762435724633909">Nama penyedia:</translation>
 <translation id="774465434535803574">Ralat Sambungan Pek</translation>
 <translation id="7748528009589593815">Tab sebelumnya</translation>
+<translation id="7748734060566306235">Gunakan kekunci anak panah untuk melaraskan saiz dan penjajaran gambar.</translation>
 <translation id="7751260505918304024">Paparkan semua</translation>
 <translation id="7754704193130578113">Tanyakan tempat untuk menyimpan setiap fail sebelum memuat turun</translation>
 <translation id="775622227562445982">Penutupan pantas tab/tetingkap</translation>
@@ -4837,6 +4955,7 @@
 <translation id="7791543448312431591">Tambah</translation>
 <translation id="7792012425874949788">Sesuatu telah berlaku dengan log masuk</translation>
 <translation id="7792388396321542707">Berhenti berkongsi</translation>
+<translation id="7792744925237334808">Halang tapak web pihak ketiga daripada menyimpan dan membaca data kuki.</translation>
 <translation id="7794058097940213561">Formatkan peranti</translation>
 <translation id="7799329977874311193">Dokumen HTML</translation>
 <translation id="7800518121066352902">Putar M&amp;elawan Arah Jam</translation>
@@ -4918,6 +5037,7 @@
 <translation id="7902482560616980555">Penskalaan FontCache</translation>
 <translation id="7903128267494448252">Padamkan orang ini</translation>
 <translation id="7903345046358933331">Halaman tersebut menjadi tidak responsif. Anda boleh menunggu halaman menjadi responsif atau tutup halaman.</translation>
+<translation id="7903742244674067440">Anda mempunyai sijil pada fail yang mengenal pasti pihak berkuasa sijil ini</translation>
 <translation id="7903925330883316394">Utiliti: <ph name="UTILITY_TYPE" /></translation>
 <translation id="7903984238293908205">Katakana</translation>
 <translation id="7904094684485781019">Pentadbir akaun ini tidak membenarkan berbilang log masuk.</translation>
@@ -4965,6 +5085,7 @@
 <translation id="7973320858902175766">Penampal Komponen</translation>
 <translation id="7974067550340408553">Dapatkan pemberitahuan di telefon anda setiap kali Smart Lock membuka <ph name="DEVICE_TYPE" /> anda.</translation>
 <translation id="7974566588408714340">Cuba semula menggunakan <ph name="EXTENSIONNAME" /></translation>
+<translation id="7974936243149753750">Terlebih imbas</translation>
 <translation id="7977551819349545646">Mengemas kini Chromebox...</translation>
 <translation id="7978412674231730200">Kunci persendirian</translation>
 <translation id="7979036127916589816">Ralat Segerak</translation>
@@ -5031,9 +5152,11 @@
 <translation id="8054563304616131773">Sila masukkan alamat e-mel yang sah</translation>
 <translation id="8054921503121346576">Papan kekunci USB disambungkan</translation>
 <translation id="8056430285089645882">Saya faham, jangan tunjukkan ini kepada saya lagi.</translation>
+<translation id="8058655154417507695">Tahun tamat tempoh</translation>
 <translation id="8059178146866384858">Fail bernama "$1" sudah wujud. Sila pilih nama berbeza.</translation>
 <translation id="8059417245945632445">&amp;Periksa peranti</translation>
 <translation id="8061298200659260393">Jangan benarkan mana-mana tapak untuk menghantar mesej tolak</translation>
+<translation id="8061820249063924643">Urus pengguna di bawah seliaan</translation>
 <translation id="8063235345342641131">Avatar hijau lalai</translation>
 <translation id="8064671687106936412">Kekunci:</translation>
 <translation id="806705617346045388">Gelagat yang Luar Biasa Dikesan</translation>
@@ -5041,7 +5164,9 @@
 <translation id="8069615408251337349">Cetakan Awan Google</translation>
 <translation id="8071942001314758122">Cuma sebut "Ok Google" sebanyak tiga kali</translation>
 <translation id="8072988827236813198">Pin Tab</translation>
+<translation id="8074127646604999664">Benarkan tapak yang baru sahaja ditutup untuk menyelesaikan penghantaran dan penerimaan data</translation>
 <translation id="8079530767338315840">Ulang</translation>
+<translation id="8081705606384362428">Pilih PIN anda:</translation>
 <translation id="8083739373364455075">Dapatkan 100 GB percuma dengan Google Drive</translation>
 <translation id="8088137642766812908">Hati-hati, ciri ini mungkin bermasalah</translation>
 <translation id="8089520772729574115">kurang daripada 1 MB</translation>
@@ -5193,6 +5318,7 @@
 <translation id="827097179112817503">Paparkan butang laman utama</translation>
 <translation id="8272443605911821513">Urus sambungan anda dengan mengklik Sambungan dalam menu "Lagi alat".</translation>
 <translation id="8275038454117074363">Import</translation>
+<translation id="827606011343515871">Anda tiada sijil</translation>
 <translation id="8276560076771292512">Cache kosong dan Muat Semula Keras</translation>
 <translation id="8279388322240498158">Papan kekunci berdasarkan bahasa Inggeris Kurdish Sorani</translation>
 <translation id="8280151743281770066">Fonetik bahasa Armenia</translation>
@@ -5213,7 +5339,6 @@
 <translation id="8300607741108698921">Persediaan 1 minit</translation>
 <translation id="8303650969500425356">Membolehkan javascript mengunci orientasi skrin.</translation>
 <translation id="8303655282093186569">Tetapan input Pinyin</translation>
-<translation id="830424806940379275">Benarkan sambungan membuat tetingkap panel yang boleh dibuka di luar bingkai penyemak imbas. Secara lalai atau jika dilumpuhkan, cubaan untuk membuka panel sebaliknya akan membuka tetingkap timbul. Panel pada OSes desktop ditamatkan dan akan dialih keluar tidak lama lagi.</translation>
 <translation id="8306534594034939679">Dayakan sokongan untuk Perkhidmatan Alternatif, satu ciri HTTP percubaan.</translation>
 <translation id="8307376264102990850">Mengecas
 Mengira masa sehingga penuh</translation>
@@ -5238,9 +5363,11 @@
 <translation id="8337399713761067085">Anda kini di luar talian</translation>
 <translation id="8338952601723052325">Laman web pemaju</translation>
 <translation id="8339012082103782726">Jangan benarkan tapak mengakses mikrofon anda</translation>
+<translation id="8339059274628563283"><ph name="SITE" /> menyimpan data secara setempat</translation>
 <translation id="8342318071240498787">Fail atau direktori dengan nama yang sama telah wujud.</translation>
 <translation id="834457929814110454">Jika anda memahami risiko terhadap keselamatan anda, anda boleh <ph name="BEGIN_LINK" />lawati tapak ini<ph name="END_LINK" /> sebelum atur cara berbahaya dialih keluar.</translation>
 <translation id="8345553596530559351">Jika didayakan, URL chrome://history/ memuatkan halaman sejarah Reka Bentuk Bahan.</translation>
+<translation id="8347045947573765315">Benarkan semua tapak menggunakan penghasilan kunci dalam borang</translation>
 <translation id="8351419472474436977">Pelanjutan telah mengambil alih kawalan tetapan proksi anda, yang bermakna pelanjutan ini boleh mengubah, menghentikan atau mendengar secara senyap terhadap apa sahaja yang anda lakukan dalam talian. Jika anda tidak pasti mengapa 
 perubahan ini berlaku, anda mungkin tidak mahukannya.</translation>
 <translation id="8352772353338965963">Tambahkan akaun untuk berbilang log masuk. Semua akaun dilog masuk boleh diakses tanpa kata laluan, jadi ciri ini mesti digunakan dengan akaun yang dipercayai sahaja.</translation>
@@ -5326,15 +5453,20 @@
 <translation id="845627346958584683">Masa Tamat Tempoh</translation>
 <translation id="8456681095658380701">Nama tidak sah</translation>
 <translation id="8457625695411745683">baik</translation>
+<translation id="8460336040822756677">Jika anda mematikan Smart Lock untuk <ph name="DEVICE_TYPE" />, anda tidak akan dapat membuka kunci peranti Chrome anda menggunakan telefon. Anda perlu menaip kata laluan.</translation>
+<translation id="84613761564611563">UI yang dikonfigurasi rangkaian diminta, sila tunggu...</translation>
 <translation id="8461914792118322307">Proksi</translation>
 <translation id="8463215747450521436">Pengguna diselia ini mungkin telah dipadamkan atau dilumpuhkan oleh pengurus. Sila hubungi pengurus jika anda ingin meneruskan log masuk sebagai pengguna ini.</translation>
 <translation id="8464132254133862871">Akaun pengguna ini tidak layak untuk mendapatkan perkhidmatan.</translation>
 <translation id="8464505512337106916">Kesan dan jalankan kandungan pemalam yang penting (disyorkan)</translation>
+<translation id="8465252176946159372">Tidak sah</translation>
 <translation id="8466234950814670489">Arkib Tar</translation>
 <translation id="8467473010914675605">Kaedah input Korea</translation>
+<translation id="8468750959626135884">Buka kunci <ph name="DEVICE_TYPE" /> anda dengan telefon Android anda.</translation>
 <translation id="8472623782143987204">disokong perkakasan</translation>
 <translation id="8475313423285172237">Program lain pada komputer anda menambah sambungan yang boleh mengubah cara Chrome berfungsi.</translation>
 <translation id="8475647382427415476">Google Drive tidak dapat menyegerakkan "<ph name="FILENAME" />" pada masa ini. Google Drive akan mencuba lagi nanti.</translation>
+<translation id="8476195663057048998">Kosongkan &amp; Tetapkan Semula</translation>
 <translation id="8477241577829954800">Menggantikan</translation>
 <translation id="8477384620836102176">&amp;Umum</translation>
 <translation id="8480417584335382321">Zum halaman:</translation>
@@ -5366,6 +5498,7 @@
 <translation id="8524066305376229396">Storan berterusan:</translation>
 <translation id="8525306231823319788">Skrin penuh</translation>
 <translation id="8528962588711550376">Melog masuk.</translation>
+<translation id="8532294913309524834">Susun bahasa berdasarkan pilihan anda.</translation>
 <translation id="8535005006684281994">URL Pembaharuan Sijil Netscape</translation>
 <translation id="8539727552378197395">Tidak (HttpOnly)</translation>
 <translation id="8543181531796978784">Anda boleh <ph name="BEGIN_ERROR_LINK" />laporkan masalah pengesanan<ph name="END_ERROR_LINK" /> atau jika anda memahami risikonya kepada keselamatan anda, <ph name="BEGIN_LINK" />lawati tapak yang tidak selamat ini<ph name="END_LINK" />.</translation>
@@ -5380,6 +5513,7 @@
 <translation id="855081842937141170">Pin tab</translation>
 <translation id="8551388862522347954">Lesen</translation>
 <translation id="8551494947769799688">Bahasa Latvia</translation>
+<translation id="8553342806078037065">Urus orang lain</translation>
 <translation id="855705891482654011">Muatkan sambungan yang dinyakpekkan</translation>
 <translation id="855773602626431402">Pemalam tanpa kotak pasir telah dihalang daripada dijalankan di halaman ini.</translation>
 <translation id="8559694214572302298">Penyahkod Imej</translation>
@@ -5418,6 +5552,7 @@
 <translation id="8605428685123651449">Memori SQLite</translation>
 <translation id="8605503133013456784">Gagal untuk memutuskan sambungan dan nyahpasangan dari "<ph name="DEVICE_NAME" />".</translation>
 <translation id="8606726445206553943">Gunakan peranti MIDI anda</translation>
+<translation id="8609465669617005112">Alihkan ke atas</translation>
 <translation id="8610892630019863050">Tanya apabila tapak mahu menunjukkan pemberitahuan (disyorkan)</translation>
 <translation id="8615618338313291042">Apl Inkognito: <ph name="APP_NAME" /></translation>
 <translation id="8619892228487928601"><ph name="CERTIFICATE_NAME" />: <ph name="ERROR" /></translation>
@@ -5456,6 +5591,7 @@
 <translation id="8662978096466608964">Chrome tidak boleh menetapkan kertas dinding.</translation>
 <translation id="8663099077749055505">Sentiasa halang muat turun automatik berbilang pada <ph name="HOST" /></translation>
 <translation id="8664389313780386848">&amp;Lihat sumber halaman</translation>
+<translation id="866611985033792019">Percayakan sijil ini untuk mengenal pasti pengguna e-mel</translation>
 <translation id="8666678546361132282">Bahasa Inggeris</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> kini dipaparkan dalam skrin penuh dan telah melumpuhkan kursor tetikus.</translation>
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" /> anda sudah dikemas kini.</translation>
@@ -5579,6 +5715,7 @@
 <translation id="8813811964357448561">helai kertas</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="881799181680267069">Sembunyikan Yang Lain</translation>
+<translation id="8818152010000655963">Kertas dinding</translation>
 <translation id="8818152613617627612">Butiran pengebilan</translation>
 <translation id="8820817407110198400">Penanda buku</translation>
 <translation id="8820961991571528294">Menguji</translation>
@@ -5589,8 +5726,10 @@
 <translation id="8828933418460119530">Nama DNS</translation>
 <translation id="8830796635868321089">Semakan kemas kini yang menggunakan tetapan proksi semasa gagal. Sila laraskan <ph name="PROXY_SETTINGS_LINK_START" />tetapan proksi<ph name="PROXY_SETTINGS_LINK_END" /> anda.</translation>
 <translation id="8831623914872394308">Tetapan penunjuk</translation>
+<translation id="8833040047958643283">Kawal kandungan yang boleh tapak web tunjukkan kepada anda dan maklumat yang boleh tapak web gunakan semasa anda menyemak imbas</translation>
 <translation id="8837103518490433332">Adakah anda ingin <ph name="PASSWORD_MANAGER_BRAND" /> menyimpan kata laluan anda untuk tapak <ph name="ORIGIN" /> ini?</translation>
 <translation id="8838770651474809439">Hamburger</translation>
+<translation id="8839157109304700852">Buka Papan Pemuka Google</translation>
 <translation id="8841142799574815336">Port pandang visual lengai.</translation>
 <translation id="884264119367021077">Alamat penghantaran</translation>
 <translation id="8845001906332463065">Dapatkan bantuan</translation>
@@ -5601,11 +5740,13 @@
 <translation id="885381502874625531">Papan kekunci bahasa Belarus</translation>
 <translation id="8856844195561710094">Gagal untuk menghentikan penemuan peranti Bluetooth.</translation>
 <translation id="885701979325669005">Storan</translation>
+<translation id="8858798938034909167">Akses kata laluan anda daripada mana-mana peranti di <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="8859057652521303089">Pilih bahasa anda:</translation>
 <translation id="8859116917079399781">Kandungan disekat</translation>
 <translation id="8859174528519900719">Subbingkai: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="8860454412039442620">Hamparan Excel</translation>
 <translation id="8863489667196658337">Mendayakan sistem baharu untuk membuat apl penanda halaman.</translation>
+<translation id="8866013684546696613">Bilangan maksimum tetingkap dalam ikhtisar yang boleh menggunakan bentuk.</translation>
 <translation id="8866441758832353668">Penambatan Tatal</translation>
 <translation id="8868245144144497543">Dibuat Oleh</translation>
 <translation id="8868626022555786497">Sedang digunakan</translation>
@@ -5663,6 +5804,7 @@
 <translation id="894360074127026135">Peningkatan Antarabangsa Netscape</translation>
 <translation id="8944779739948852228">Pencetak dikesan</translation>
 <translation id="8944964446326379280"><ph name="APP_NAME" /> berkongsi tetingkap dengan <ph name="TAB_NAME" />.</translation>
+<translation id="8946284507644756416"><ph name="DEVICE_TYPE" /> anda boleh dibuka kunci dengan telefon Android anda.</translation>
 <translation id="8946359700442089734">Ciri penyahpepijatan tidak didayakan sepenuhnya pada peranti ini <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation>
 <translation id="8946784827990177241">Dayakan sokongan WebUSB.</translation>
 <translation id="89515141420106838">Mendayakan apl Galeri Gedung Web Chrome untuk pemacu pencetak. Apl ini menggelintar Gedung Web Chrome untuk mencari sambungan yang menyokong pencetakan ke pencetak USB dengan ID USB khas.</translation>
@@ -5740,6 +5882,7 @@
 <translation id="9040185888511745258">Penyerang pada <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> mungkin mencuba untuk menipu anda untuk memasang atur cara yang membahayakan pengalaman penyemak imbas anda (contohnya, dengan menukar halaman utama anda atau menunjukkan iklan tambahan pada laman yang anda lawati).</translation>
 <translation id="9040421302519041149">Akses ke rangkaian ini dilindungi.</translation>
 <translation id="9041603713188951722">Tunjukkan tetapan dalam tetingkap</translation>
+<translation id="9042893549633094279">Privasi dan keselamatan</translation>
 <translation id="904451693890288097">Sila masukkan kekunci laluan untuk "<ph name="DEVICE_NAME" />":</translation>
 <translation id="9049835026521739061">Mod Hangul</translation>
 <translation id="9050666287014529139">Frasa laluan</translation>
@@ -5750,6 +5893,7 @@
 <translation id="9056810968620647706">Tiada padanan dijumpai.</translation>
 <translation id="9059868303873565140">Menu status</translation>
 <translation id="9064142312330104323">Foto Profil Google (sedang dimuatkan)</translation>
+<translation id="9064275926664971810">Dayakan Autolengkap untuk mengisi borang dengan satu klik</translation>
 <translation id="9064939804718829769">Memindahkan...</translation>
 <translation id="9065203028668620118">Edit</translation>
 <translation id="9066075624350113914">Sebahagian daripada dokumen PDF ini tidak dapat dipaparkan.</translation>
@@ -5771,6 +5915,8 @@
 <translation id="9088917181875854783">Sila sahkan bahawa kekunci laluan ini dipaparkan pada "<ph name="DEVICE_NAME" />":</translation>
 <translation id="9092426026094675787">Tandai asal tidak selamat sebagai tidak selamat.</translation>
 <translation id="9094033019050270033">Kemaskinikan kata laluan</translation>
+<translation id="9094982973264386462">Alih keluar</translation>
+<translation id="9095253524804455615">Alih keluar</translation>
 <translation id="9100765901046053179">Tetapan terperinci</translation>
 <translation id="910077499156148110">Tambah pengecualian untuk tapak web</translation>
 <translation id="9100825730060086615">Jenis papan kekunci</translation>
@@ -5861,8 +6007,11 @@
 <translation id="9218430445555521422">Tetapkan sebagai lalai</translation>
 <translation id="9219103736887031265">Imej</translation>
 <translation id="9220525904950070496">Alih keluar akaun</translation>
+<translation id="9221503095691269353">Konfigurasi buka kunci cepat</translation>
 <translation id="923467487918828349">Paparkan Semua</translation>
+<translation id="927151012416335806">Mengemas kini peranti anda kepada saluran <ph name="CHANNEL_NAME" /></translation>
 <translation id="930268624053534560">Cap Masa Terperinci</translation>
+<translation id="931068751149008062">Pilih jenis fon dan pengekodan</translation>
 <translation id="932327136139879170">Laman Utama</translation>
 <translation id="932508678520956232">Tidak dapat memulakan percetakan.</translation>
 <translation id="936801553271523408">Data diagnostik sistem</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 85335e5..f3396cf4 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -1934,6 +1934,7 @@
 <translation id="3590559774363307859">Wachtwoord opgeslagen. Je hebt nu toegang tot dit wachtwoord en al je andere <ph name="SAVED_PASSWORDS_LINK" /> via je browser.</translation>
 <translation id="3590587280253938212">snel</translation>
 <translation id="3592260987370335752">&amp;Meer informatie</translation>
+<translation id="3592313833691251126">Extensies toestaan vensters te maken die buiten het browserframe worden geopend. Als dit niet is ingeschakeld, wordt bij het openen van een venster een pop-up geopend. Het standaardgedrag is dit alleen toe te staan voor extensies op de witte lijst. Als deze instelling is ingeschakeld, worden alle extensies toegestaan. Als deze instelling is uitgeschakeld, worden geen afzonderlijke vensters toegestaan voor extensies.</translation>
 <translation id="359283478042092570">Invoeren</translation>
 <translation id="3593152357631900254">Fuzzy-pinyinmethode inschakelen</translation>
 <translation id="3593965109698325041">Naambeperkingen voor certificaten</translation>
@@ -2256,7 +2257,6 @@
 <translation id="4034042927394659004">Helderheid van het toetsenbord verlagen</translation>
 <translation id="4035758313003622889">&amp;Taakbeheer</translation>
 <translation id="4037084878352560732">Paard</translation>
-<translation id="4037102579141982963">Dit apparaat verzendt automatisch diagnostische en gebruiksgegevens naar Google. Je kunt dit op elk gewenst moment wijzigen in de <ph name="BEGIN_LINK1" />instellingen<ph name="END_LINK1" /> van je apparaat. <ph name="BEGIN_LINK2" />Meer informatie<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">De tabbladschakelaar voor toegankelijkheidsservices inschakelen voor Android.</translation>
 <translation id="4044260751144303020">Samenstellen voor elementen met een vaste positie.</translation>
 <translation id="404493185430269859">Standaardzoekmachine</translation>
@@ -3228,7 +3228,6 @@
 <translation id="5439568486246921931">Met deze actie worden de downloads, offline bestanden en browsergegevens van deze gebruiker definitief verwijderd. Deze actie kan niet ongedaan worden gemaakt.</translation>
 <translation id="544083962418256601">Snelle links maken...</translation>
 <translation id="5441100684135434593">Bedraad netwerk</translation>
-<translation id="5445088910157062298">Laat de locatieservice van Google apps helpen je locatie snel en nauwkeurig te bepalen. Hierdoor kan het accuverbruik afnemen. Er worden anonieme locatiegegevens verzonden naar Google, ook als er geen apps actief zijn.</translation>
 <translation id="5448293924669608770">Er is een fout opgetreden tijdens het inloggen</translation>
 <translation id="5449588825071916739">Bladwijzer toevoegen aan alle tabbladen</translation>
 <translation id="5449716055534515760">Ve&amp;nster sluiten</translation>
@@ -3696,7 +3695,6 @@
 <translation id="6110466548232134880">De identiteit van <ph name="ORGANIZATION" /> op <ph name="LOCALITY" /> is geverifieerd door <ph name="ISSUER" />. Er zijn geen certificaattransparantiegegevens geleverd door de server.</translation>
 <translation id="6111770213269631447">Transliteratie (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Standaard toegestaan</translation>
-<translation id="6112929985131461002">Dit apparaat verzendt automatisch diagnostische en gebruiksgegevens naar Google. Deze <ph name="BEGIN_LINK1" />instelling<ph name="END_LINK1" /> wordt afgedwongen door je beheerder. <ph name="BEGIN_LINK2" />Meer informatie<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Taal- en invoerinstellingen wijzigen</translation>
 <translation id="6120205520491252677">Deze pagina vastzetten op het startscherm...</translation>
 <translation id="6122081475643980456">Je internetverbinding wordt beheerd</translation>
@@ -3932,7 +3930,6 @@
 <translation id="6452181791372256707">Weigeren</translation>
 <translation id="6454421252317455908">Chinese invoermethode (eenvoudig)</translation>
 <translation id="6455348477571378046">Type certificaat:</translation>
-<translation id="6456234919706689841">Je beheerder kan ervoor kiezen diagnostische en gebruiksgegevens van dit apparaat naar Google te verzenden. Je kunt hier deze <ph name="BEGIN_LINK1" />instelling<ph name="END_LINK1" /> weergeven. <ph name="BEGIN_LINK2" />Meer informatie<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">JavaScript blijven blokkeren</translation>
 <translation id="6458308652667395253">Blokkeren van JavaScript beheren...</translation>
 <translation id="6459488832681039634">Gebruik selectie voor zoekactie</translation>
@@ -4714,7 +4711,6 @@
 <translation id="7587108133605326224">Baltisch</translation>
 <translation id="7589461650300748890">Oei, wees voorzichtig!</translation>
 <translation id="7589661784326793847">Een ogenblik geduld</translation>
-<translation id="7593635197364225277">Automatisch een back-up van app-gegevens van Google Play maken en terugzetten op Google Drive. Je kunt dit op elk gewenst moment wijzigen in de instellingen van Android. <ph name="BEGIN_LINK1" />Meer informatie<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (foutcode <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">OK, importeren</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" /> nooit vertalen</translation>
@@ -5221,7 +5217,6 @@
 <translation id="8300607741108698921">Installatie van één minuut</translation>
 <translation id="8303650969500425356">Hiermee geef je JavaScript de toestemming om de schermstand te vergrendelen.</translation>
 <translation id="8303655282093186569">Invoerinstellingen voor Pinyin</translation>
-<translation id="830424806940379275">Extensies toestaan vensters te maken die buiten het browserframe worden geopend. Standaard, of als de optie is uitgeschakeld, wordt er bij het openen van een venster een pop-up geopend. Vensters op desktopbesturingssystemen zijn verouderd en worden binnenkort verwijderd.</translation>
 <translation id="8306534594034939679">Ondersteuning inschakelen voor 'Alternatieve services', een experimentele HTTP-functie.</translation>
 <translation id="8307376264102990850">Wordt opgeladen
 Tijd berekenen tot vol</translation>
@@ -5666,7 +5661,7 @@
 <translation id="8940081510938872932">Je computer voert op dit moment te veel acties tegelijk uit. Probeer het later opnieuw.</translation>
 <translation id="8941173171815156065">Het recht '<ph name="PERMISSION" />' intrekken</translation>
 <translation id="8941248009481596111">Je verbinding met deze site is privé.</translation>
-<translation id="8941729603749328384">www.example.com</translation>
+<translation id="8941729603749328384">www.voorbeeld.com</translation>
 <translation id="8941882480823041320">Vorig woord</translation>
 <translation id="8942416694471994740">De toegang tot je microfoon wordt bepaald door je beheerder.</translation>
 <translation id="894360074127026135">Internationale Netscape-step-up</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index 7c12b8b..f7d82e08 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1927,6 +1927,7 @@
 <translation id="3590559774363307859">Passordet er lagret. Du finner det og alle dine <ph name="SAVED_PASSWORDS_LINK" /> fra en hvilken som helst nettleser.</translation>
 <translation id="3590587280253938212">rask</translation>
 <translation id="3592260987370335752">&amp;Les mer</translation>
+<translation id="3592313833691251126">Gi utvidelser tillatelse til å opprette panelvinduer som åpnes utenfor nettleserrammen. Hvis du ikke har slått på dette alternativet, fører forsøk på å åpne paneler til at det åpnes forgrunnsvinduer i stedet. Som standard tillates bare godkjente utvidelser. Hvis alternativet er slått på, tillates alle utvidelser, og hvis det er slått av, tillates ikke paneler for noen utvidelser.</translation>
 <translation id="359283478042092570">Angi</translation>
 <translation id="3593152357631900254">Aktiver modusen Fuzzy pinyin</translation>
 <translation id="3593965109698325041">Begrensninger for sertifikatnavn</translation>
@@ -2247,7 +2248,6 @@
 <translation id="4034042927394659004">Reduser lysstyrke for taster</translation>
 <translation id="4035758313003622889">&amp;Oppgavebehandling</translation>
 <translation id="4037084878352560732">Hest</translation>
-<translation id="4037102579141982963">Denne enheten sender diagnostikk og bruksdata til Google automatisk. Du kan endre dette når som helst i <ph name="BEGIN_LINK1" />enhetsinnstillingene<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Finn ut mer<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Aktiver tilgjengeligheten av fanebytte for Android.</translation>
 <translation id="4044260751144303020">Sammensetting for elementer med faste posisjoner</translation>
 <translation id="404493185430269859">Standard søkemotor</translation>
@@ -3217,7 +3217,6 @@
 <translation id="5439568486246921931">Denne handlingen sletter denne brukerens nedlastinger, filer som er lagret lokalt, og nettlesingsdata. Dette kan ikke angres.</translation>
 <translation id="544083962418256601">Opprett snarveier</translation>
 <translation id="5441100684135434593">Kablet nettverk</translation>
-<translation id="5445088910157062298">La Googles posisjonstjenester hjelpe apper med å finne posisjonen din kjapt og nøyaktig, noe som kan redusere batteribruken. Anonyme posisjonsdata sendes til Google – selv når ingen apper kjører.</translation>
 <translation id="5448293924669608770">Noe gikk galt under påloggingen</translation>
 <translation id="5449588825071916739">Angi bokmerker for alle faner</translation>
 <translation id="5449716055534515760">Lukk vin&amp;du</translation>
@@ -3683,7 +3682,6 @@
 <translation id="6110466548232134880">Identiteten til <ph name="ORGANIZATION" /> på <ph name="LOCALITY" /> er verifisert av <ph name="ISSUER" />. Det er ikke mottatt informasjon om sertifikatåpenhet fra tjeneren.</translation>
 <translation id="6111770213269631447">Translitterasjon (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Tillatt som standard</translation>
-<translation id="6112929985131461002">Denne enheten sender diagnostikk og bruksdata til Google automatisk, og denne <ph name="BEGIN_LINK1" />innstillingen<ph name="END_LINK1" /> håndheves av administratoren din. <ph name="BEGIN_LINK2" />Finn ut mer<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Endre språk- og inndatainnstillinger</translation>
 <translation id="6120205520491252677">Fest denne siden til startsiden</translation>
 <translation id="6122081475643980456">Internett-tilkoblingen din kontrolleres</translation>
@@ -3918,7 +3916,6 @@
 <translation id="6452181791372256707">Avslå</translation>
 <translation id="6454421252317455908">Kinesisk inndatametode (rask)</translation>
 <translation id="6455348477571378046">Sertifikattype:</translation>
-<translation id="6456234919706689841">Administratoren din kan velge å sende diagnostiskk og bruksdata for denne enheten til Google. Du kan se denne <ph name="BEGIN_LINK1" />innstillingen<ph name="END_LINK1" /> her. <ph name="BEGIN_LINK2" />Finn ut mer<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Fortsett blokkering av JavaScript</translation>
 <translation id="6458308652667395253">Administrer blokkering av JavaScript</translation>
 <translation id="6459488832681039634">Bruk markering for Finn</translation>
@@ -4690,7 +4687,6 @@
 <translation id="7587108133605326224">Baltisk</translation>
 <translation id="7589461650300748890">Oops! Vær forsiktig.</translation>
 <translation id="7589661784326793847">Vent et øyeblikk</translation>
-<translation id="7593635197364225277">Sikkerhetskopiér og gjenopprett data automatisk for Play-apper på Google Disk. Du kan når som helst endre dette i Android-innstillingene. <ph name="BEGIN_LINK1" />Finn ut mer<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (feilkode <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">OK, importer</translation>
 <translation id="7600965453749440009">Oversett aldri <ph name="LANGUAGE" /></translation>
@@ -5196,7 +5192,6 @@
 <translation id="8300607741108698921">Konfigurering på ett minutt</translation>
 <translation id="8303650969500425356">Gjør at skjermretningen kan låses av JavaScript.</translation>
 <translation id="8303655282093186569">Inndatainnstillinger for pinyin</translation>
-<translation id="830424806940379275">Tillat utvidelser for å opprette panelvinduer som åpnes utenfor nettleserrammen. Som standard – eller hvis dette alternativet er slått av – fører forsøk på å åpne panelvinduer til at det åpnes forgrunnsvinduer i stedet. Paneler på operativsystemer for datamaskiner er avviklet og blir snart fjernet.</translation>
 <translation id="8306534594034939679">Slå på støtte for Alternative tjenester. Dette er en eksperimentell HTTP-funksjon.</translation>
 <translation id="8307376264102990850">Beregnet ladetid før fulladet</translation>
 <translation id="8308179586020895837">Spør om <ph name="HOST" /> vil bruke kameraet ditt</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 0bc8ff9..5b443407 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1933,6 +1933,7 @@
 <translation id="3590559774363307859">Hasło zostało zapisane. To hasło oraz wszystkie Twoje <ph name="SAVED_PASSWORDS_LINK" /> będą dostępne w każdej przeglądarce.</translation>
 <translation id="3590587280253938212">szybko</translation>
 <translation id="3592260987370335752">&amp;Więcej informacji</translation>
+<translation id="3592313833691251126">Zezwalaj rozszerzeniom na otwieranie okien paneli poza ramką przeglądarki. W przypadku braku tego zezwolenia przy próbie otwarcia panelu pojawia się wyskakujące okienko. Domyślnie uprawnienie to mają tylko rozszerzenia z białej listy. Gdy zasada jest ustawiona jako włączona lub wyłączona, zezwolenie lub zakaz dotyczy wszystkich rozszerzeń.</translation>
 <translation id="359283478042092570">Wpisz</translation>
 <translation id="3593152357631900254">Włącz tryb „ujednolicony pinyin”</translation>
 <translation id="3593965109698325041">Ograniczenia nazwy certyfikatu</translation>
@@ -2255,7 +2256,6 @@
 <translation id="4034042927394659004">Zmniejsz jasność klawiszy</translation>
 <translation id="4035758313003622889">&amp;Menedżer zadań</translation>
 <translation id="4037084878352560732">Koń</translation>
-<translation id="4037102579141982963">To urządzenie będzie automatycznie wysyłać do Google dane diagnostyczne i informacje dotyczące użytkowania. Tę opcję możesz zmienić w dowolnym momencie w <ph name="BEGIN_LINK1" />ustawieniach<ph name="END_LINK1" /> urządzenia. <ph name="BEGIN_LINK2" />Więcej informacji<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Włącz przełącznik karty ułatwień dostępu w Androidzie.</translation>
 <translation id="4044260751144303020">Komponowanie w celu uzyskania elementów o stałych pozycjach.</translation>
 <translation id="404493185430269859">Domyślna wyszukiwarka</translation>
@@ -3227,7 +3227,6 @@
 <translation id="5439568486246921931">Ta czynność spowoduje trwałe usunięcie plików pobranych przez użytkownika, plików offline i danych przeglądania. Nie będzie można tego cofnąć.</translation>
 <translation id="544083962418256601">Utwórz skróty...</translation>
 <translation id="5441100684135434593">Sieć przewodowa</translation>
-<translation id="5445088910157062298">Pozwól usłudze lokalizacyjnej Google na szybkie i dokładne określanie Twojej lokalizacji. Dzięki temu możesz zmniejszyć zużycie baterii. Do Google będą wysyłane anonimowe dane o lokalizacji – nawet wtedy, gdy nie są uruchomione żadne aplikacje.</translation>
 <translation id="5448293924669608770">Ups, podczas logowania coś poszło nie tak</translation>
 <translation id="5449588825071916739">Dodaj wszystkie karty do zakładek</translation>
 <translation id="5449716055534515760">Zamknij o&amp;kno</translation>
@@ -3693,7 +3692,6 @@
 <translation id="6110466548232134880">Tożsamość organizacji <ph name="ORGANIZATION" /> w lokalizacji <ph name="LOCALITY" /> została zweryfikowana przez <ph name="ISSUER" />. Serwer nie przekazał informacji o przejrzystości certyfikatu.</translation>
 <translation id="6111770213269631447">Transliteracja (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Dozwolone domyślnie</translation>
-<translation id="6112929985131461002">To urządzenie będzie automatycznie wysyłać do Google dane diagnostyczne i informacje dotyczące użytkowania. To <ph name="BEGIN_LINK1" />ustawienie<ph name="END_LINK1" /> jest narzucone przez administratora. <ph name="BEGIN_LINK2" />Więcej informacji<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Zmień język i ustawienia wprowadzania</translation>
 <translation id="6120205520491252677">Przypnij tę stronę do ekranu startowego...</translation>
 <translation id="6122081475643980456">Twoje połączenie internetowe jest kontrolowane</translation>
@@ -3929,7 +3927,6 @@
 <translation id="6452181791372256707">Odrzuć</translation>
 <translation id="6454421252317455908">chiński (szybka)</translation>
 <translation id="6455348477571378046">Typ certyfikatu:</translation>
-<translation id="6456234919706689841">Administrator może ustawić wysyłanie do Google danych diagnostycznych i informacji dotyczących użytkowania tego urządzenia. Tę opcję możesz wyświetlić w <ph name="BEGIN_LINK1" />ustawieniach<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Więcej informacji<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Nadal blokuj wykonywanie kodu JavaScript</translation>
 <translation id="6458308652667395253">Zarządzaj blokowaniem kodu JavaScript...</translation>
 <translation id="6459488832681039634">Użyj zaznaczenia do funkcji Znajdź</translation>
@@ -4700,7 +4697,6 @@
 <translation id="7587108133605326224">Bałtycki</translation>
 <translation id="7589461650300748890">Nie tak szybko. Zachowaj ostrożność.</translation>
 <translation id="7589661784326793847">Chwileczkę</translation>
-<translation id="7593635197364225277">Automatycznie twórz na Dysku Google kopie zapasowe i dane do odzyskiwania aplikacji ze Sklepu Play. Tę opcję możesz zmienić w dowolnym momencie w ustawieniach Androida. <ph name="BEGIN_LINK1" />Więcej informacji<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (kod błędu: <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">OK, zaimportuj</translation>
 <translation id="7600965453749440009">Nigdy nie tłumacz z języka: <ph name="LANGUAGE" /></translation>
@@ -5206,7 +5202,6 @@
 <translation id="8300607741108698921">Skonfiguruj w minutę</translation>
 <translation id="8303650969500425356">Umożliwia blokowanie orientacji ekranu przez JavaScript.</translation>
 <translation id="8303655282093186569">Ustawienia wprowadzania znaków pinyin</translation>
-<translation id="830424806940379275">Zezwalaj rozszerzeniom na tworzenie okien paneli otwieranych poza ramką przeglądarki. Domyślnie lub jeśli ta opcja jest wyłączona, próba otwarcia panelu spowoduje wyświetlenie wyskakującego okienka. W przypadku komputerowych systemów operacyjnych panele są wycofywane i wkrótce zostaną usunięte.</translation>
 <translation id="8306534594034939679">Włącz obsługę eksperymentalnej funkcji HTTP: Usługi alternatywne.</translation>
 <translation id="8307376264102990850">Ładowanie: obliczanie czasu do pełnego naładowania</translation>
 <translation id="8308179586020895837">Pytaj, gdy witryna <ph name="HOST" /> chce mieć dostęp do kamery</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index c8bc224..7547a5e8 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -1933,6 +1933,7 @@
 <translation id="3590559774363307859">Senha salva. É possível acessar essa e todas as suas <ph name="SAVED_PASSWORDS_LINK" /> em qualquer navegador.</translation>
 <translation id="3590587280253938212">rápido</translation>
 <translation id="3592260987370335752">&amp;Saiba mais</translation>
+<translation id="3592313833691251126">Permitir que extensões criem janelas em painel que se abrem fora da moldura do navegador. As tentativas de abrir um painel abrirão um pop-up, caso esta opção não esteja ativada. O comportamento padrão permite somente extensões de lista de permissões. O comportamento ativado permite todas as extensões. O comportamento desativado não permite painéis para nenhuma extensão.</translation>
 <translation id="359283478042092570">Entrar</translation>
 <translation id="3593152357631900254">Ativar o modo Fuzzy-Pinyn</translation>
 <translation id="3593965109698325041">Restrições de nome do certificado</translation>
@@ -2255,7 +2256,6 @@
 <translation id="4034042927394659004">Diminuir brilho das teclas</translation>
 <translation id="4035758313003622889">&amp;Gerenciador de tarefas</translation>
 <translation id="4037084878352560732">Cavalo</translation>
-<translation id="4037102579141982963">Este dispositivo enviará dados de uso e diagnóstico automaticamente para o Google. É possível alterar essa opção a qualquer momento nas <ph name="BEGIN_LINK1" />configurações<ph name="END_LINK1" /> do seu dispositivo. <ph name="BEGIN_LINK2" />Saiba mais<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Ativar alternador da guia de acessibilidade para Android.</translation>
 <translation id="4044260751144303020">Composição para elementos de posição fixa.</translation>
 <translation id="404493185430269859">Mecanismo de pesquisa padrão</translation>
@@ -3226,7 +3226,6 @@
 <translation id="5439568486246921931">Esta ação excluirá permanentemente downloads, arquivos off-line e dados de navegação deste usuário. Não é possível desfazer esta ação.</translation>
 <translation id="544083962418256601">Criar atalhos...</translation>
 <translation id="5441100684135434593">Rede com fio</translation>
-<translation id="5445088910157062298">Permita que o serviço de localização do Google ajude os apps a encontrar sua localização de forma rápida e precisa, o que pode reduzir o consumo de bateria. Dados de local anônimos serão enviados ao Google, mesmo quando nenhum app estiver em execução.</translation>
 <translation id="5448293924669608770">Ops, ocorreu algo errado no login</translation>
 <translation id="5449588825071916739">Adicionar todas as guias aos favoritos</translation>
 <translation id="5449716055534515760">Fechar jan&amp;ela</translation>
@@ -3693,7 +3692,6 @@
 <translation id="6110466548232134880">A identidade de <ph name="ORGANIZATION" /> em <ph name="LOCALITY" /> foi confirmada por <ph name="ISSUER" />. Nenhuma informação de Transparência de certificado foi fornecida pelo servidor.</translation>
 <translation id="6111770213269631447">Transliteração (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Permitida por padrão</translation>
-<translation id="6112929985131461002">Este dispositivo enviará dados de uso e diagnóstico automaticamente para o Google. Essa <ph name="BEGIN_LINK1" />configuração<ph name="END_LINK1" /> é aplicada pelo administrador. <ph name="BEGIN_LINK2" />Saiba mais<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Alterar configurações de idioma e de entrada</translation>
 <translation id="6120205520491252677">Fixar esta página na tela inicial...</translation>
 <translation id="6122081475643980456">Sua conexão com a Internet está sendo controlada</translation>
@@ -3930,7 +3928,6 @@
 <translation id="6452181791372256707">Rejeitar</translation>
 <translation id="6454421252317455908">Método de entrada chinês (rápido)</translation>
 <translation id="6455348477571378046">Tipo de certificado:</translation>
-<translation id="6456234919706689841">O administrador pode optar por enviar dados de uso e diagnóstico deste dispositivo para o Google. Essa <ph name="BEGIN_LINK1" />configuração<ph name="END_LINK1" /> pode ser vista aqui. <ph name="BEGIN_LINK2" />Saiba mais<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Continuar bloqueando JavaScript</translation>
 <translation id="6458308652667395253">Gerenciar o bloqueio de JavaScript...</translation>
 <translation id="6459488832681039634">Usar seleção para buscar</translation>
@@ -4711,7 +4708,6 @@
 <translation id="7587108133605326224">Báltico</translation>
 <translation id="7589461650300748890">Ei, tenha cuidado.</translation>
 <translation id="7589661784326793847">Aguarde um segundo</translation>
-<translation id="7593635197364225277">Faça backup automaticamente e restaure dados de apps do Google Play no Google Drive. É possível alterar essa definição nas configurações do Android a qualquer momento. <ph name="BEGIN_LINK1" />Saiba mais<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (código de erro <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Ok, importar</translation>
 <translation id="7600965453749440009">Nunca traduzir do <ph name="LANGUAGE" /></translation>
@@ -5217,7 +5213,6 @@
 <translation id="8300607741108698921">Configuração em um minuto</translation>
 <translation id="8303650969500425356">Permite que o javascript bloqueie a orientação da tela.</translation>
 <translation id="8303655282093186569">Configurações de entrada Pinyin</translation>
-<translation id="830424806940379275">Permitir que extensões criem janelas em painel que se abrem fora do frame do navegador. Por padrão, ou se desativada, uma tentativa de abrir um painel abrirá um pop-up. O uso de painéis em sistemas operacionais de computadores está suspenso e será removido em breve.</translation>
 <translation id="8306534594034939679">Ativa o suporte para os Serviços alternativos, um recurso HTTP experimental.</translation>
 <translation id="8307376264102990850">Calculando o tempo até completar a carga</translation>
 <translation id="8308179586020895837">Perguntar se <ph name="HOST" /> deseja acessar sua câmera</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index a79a4dc3..27f3ef2 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1934,6 +1934,7 @@
 <translation id="3590559774363307859">Palavra-passe guardada. Pode aceder à mesma e a todas as suas <ph name="SAVED_PASSWORDS_LINK" /> em qualquer navegador.</translation>
 <translation id="3590587280253938212">rápido</translation>
 <translation id="3592260987370335752">&amp;Saiba mais</translation>
+<translation id="3592313833691251126">Permite que as extensões criem janelas de painel que abrem fora do frame do navegador. As tentativas de abrir um painel abrem uma janela de pop-up se este não estiver ativado. O comportamento predefinido consiste em apenas permitir para extensões que estejam na lista de autorizações. O comportamento ativado consiste em permitir para todas as extensões. O comportamento desativado consiste em não permitir painéis para qualquer extensão.</translation>
 <translation id="359283478042092570">Aceder</translation>
 <translation id="3593152357631900254">Activar modo Pinyin semelhante</translation>
 <translation id="3593965109698325041">Restrições de nome do certificado</translation>
@@ -2256,7 +2257,6 @@
 <translation id="4034042927394659004">Diminuir o brilho das teclas</translation>
 <translation id="4035758313003622889">Gestor de &amp;tarefas</translation>
 <translation id="4037084878352560732">Cavalo</translation>
-<translation id="4037102579141982963">Este dispositivo envia automaticamente dados de diagnóstico e de utilização para a Google. Pode alterar esta definição a qualquer momento nas <ph name="BEGIN_LINK1" />definições<ph name="END_LINK1" /> do seu dispositivo. <ph name="BEGIN_LINK2" />Saber mais<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Ativa o comutador de separadores de acessibilidade para Android.</translation>
 <translation id="4044260751144303020">Composição para elementos de posição fixa.</translation>
 <translation id="404493185430269859">Motor de pesquisa predefinido</translation>
@@ -3229,7 +3229,6 @@
 <translation id="5439568486246921931">Esta ação, que não pode ser anulada, elimina permanentemente as transferências, os ficheiros offline e os dados de navegação deste utilizador.</translation>
 <translation id="544083962418256601">Criar atalhos...</translation>
 <translation id="5441100684135434593">Rede com fios</translation>
-<translation id="5445088910157062298">Permita que o serviço de localização da Google ajude as aplicações a encontrarem a sua localização com precisão e rapidamente, o que pode reduzir o consumo de bateria. São enviados para a Google dados de localização anónimos, mesmo quando não estão a ser executadas quaisquer aplicações.</translation>
 <translation id="5448293924669608770">Ups, ocorreu um erro ao iniciar sessão</translation>
 <translation id="5449588825071916739">Adicionar Todos os Separadores aos Marcadores</translation>
 <translation id="5449716055534515760">Fechar &amp;Janela</translation>
@@ -3696,7 +3695,6 @@
 <translation id="6110466548232134880">A identidade de <ph name="ORGANIZATION" /> em <ph name="LOCALITY" /> foi validada por <ph name="ISSUER" />. O servidor não forneceu quaisquer informações de Transparência do certificado.</translation>
 <translation id="6111770213269631447">Transliteração (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Permitido por predefinição</translation>
-<translation id="6112929985131461002">Este dispositivo envia automaticamente dados de diagnóstico e de utilização à Google. A aplicação desta <ph name="BEGIN_LINK1" />definição<ph name="END_LINK1" /> é da responsabilidade do administrador. <ph name="BEGIN_LINK2" />Saber mais<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Alterar idioma e definições de introdução</translation>
 <translation id="6120205520491252677">Fixar esta página ao ecrã Inicial...</translation>
 <translation id="6122081475643980456">A sua ligação à Internet está a ser controlada</translation>
@@ -3932,7 +3930,6 @@
 <translation id="6452181791372256707">Rejeitar</translation>
 <translation id="6454421252317455908">Método de introdução chinês (rápido)</translation>
 <translation id="6455348477571378046">Tipo de Certificado:</translation>
-<translation id="6456234919706689841">O administrador pode optar por enviar dados de diagnóstico e de utilização deste dispositivo à Google. Pode ver esta <ph name="BEGIN_LINK1" />definição<ph name="END_LINK1" /> aqui. <ph name="BEGIN_LINK2" />Saber mais<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Continuar a bloquear JavaScript</translation>
 <translation id="6458308652667395253">Gerir bloqueio de JavaScript...</translation>
 <translation id="6459488832681039634">Utilizar selecção para localizar</translation>
@@ -4711,7 +4708,6 @@
 <translation id="7587108133605326224">Báltico</translation>
 <translation id="7589461650300748890">Pare. Tenha cuidado.</translation>
 <translation id="7589661784326793847">Aguarde um momento</translation>
-<translation id="7593635197364225277">Faça uma cópia de segurança e restaure automaticamente os dados de aplicações do Play para o Google Drive. Pode alterar esta opção nas Definições do Android em qualquer altura. <ph name="BEGIN_LINK1" />Saber mais<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (código de erro <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Ok, importar</translation>
 <translation id="7600965453749440009">Nunca traduzir do <ph name="LANGUAGE" /></translation>
@@ -5217,7 +5213,6 @@
 <translation id="8300607741108698921">Configuração de 1 minuto</translation>
 <translation id="8303650969500425356">Permite ao JavaScript bloquear a orientação do ecrã</translation>
 <translation id="8303655282093186569">Definições de introdução Pinyin</translation>
-<translation id="830424806940379275">Permitir que as extensões criem janelas de painel que abrem fora do frame do navegador. Por predefinição ou se estiver desativado, uma tentativa de abrir um painel abre antes um pop-up. Os painéis nos sistemas operativos de computador foram descontinuados e serão removidos em breve.</translation>
 <translation id="8306534594034939679">Ativar suporte para Serviços alternativos, uma funcionalidade HTTP experimental.</translation>
 <translation id="8307376264102990850">A calcular o tempo de carga até estar totalmente carregada</translation>
 <translation id="8308179586020895837">Perguntar se <ph name="HOST" /> pretende aceder à sua câmara</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 5eef098..e84d3da 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -1932,6 +1932,7 @@
 <translation id="3590559774363307859">Parola a fost salvată. O poți accesa împreună cu toate <ph name="SAVED_PASSWORDS_LINK" /> din orice browser.</translation>
 <translation id="3590587280253938212">rapid</translation>
 <translation id="3592260987370335752">&amp;Aflați mai multe</translation>
+<translation id="3592313833691251126">Permite extensiilor să creeze ferestre panou care se deschid în afara cadrului browserului. Dacă nu este activat, când încerci să deschizi un panou, se va deschide o fereastră pop-up. Comportamentul prestabilit implică să permită panouri doar pentru extensiile de pe lista albă. Comportamentul activat implică să permită panouri pentru toate extensiile. Comportamentul dezactivat implică să nu permită niciun panou pentru nicio extensie.</translation>
 <translation id="359283478042092570">Accesați</translation>
 <translation id="3593152357631900254">Activează modul Pinyin simplificat</translation>
 <translation id="3593965109698325041">Limitări privind numele certificatului</translation>
@@ -2254,7 +2255,6 @@
 <translation id="4034042927394659004">Reduceți luminozitatea tastelor</translation>
 <translation id="4035758313003622889">&amp;Manager de activități</translation>
 <translation id="4037084878352560732">Cal</translation>
-<translation id="4037102579141982963">Acest dispozitiv va trimite automat la Google date de diagnosticare și privind utilizarea. Poți modifica această setare oricând în <ph name="BEGIN_LINK1" />setările<ph name="END_LINK1" /> dispozitivului. <ph name="BEGIN_LINK2" />Află mai multe<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Activează comutatorul filelor de accesibilitate pentru Android.</translation>
 <translation id="4044260751144303020">Compunere pentru elementele cu poziție fixă.</translation>
 <translation id="404493185430269859">Motor de căutare prestabilit</translation>
@@ -3227,7 +3227,6 @@
 <translation id="5439568486246921931">Această acțiune va șterge definitiv descărcările, fișierele offline și datele de navigare ale utilizatorului. Acțiunea nu poate fi anulată.</translation>
 <translation id="544083962418256601">Creați comenzi rapide...</translation>
 <translation id="5441100684135434593">Rețea cu fir</translation>
-<translation id="5445088910157062298">Permite serviciului de localizare Google să ajute aplicațiile să îți găsească locația mai rapid și mai precis, ceea ce poate reduce consumul resurselor bateriei. La Google vor fi trimise date anonime privind locația, chiar și atunci când nu rulează nicio aplicație.</translation>
 <translation id="5448293924669608770">Hopa, a apărut o eroare la conectare</translation>
 <translation id="5449588825071916739">Marcați toate filele</translation>
 <translation id="5449716055534515760">Închide fe&amp;reastra</translation>
@@ -3693,7 +3692,6 @@
 <translation id="6110466548232134880">Identitatea organizației <ph name="ORGANIZATION" /> din <ph name="LOCALITY" /> a fost confirmată de <ph name="ISSUER" />. Serverul nu a oferit nicio informație privind Certificate Transparency.</translation>
 <translation id="6111770213269631447">Transliterație (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Permis în mod prestabilit</translation>
-<translation id="6112929985131461002">Acest dispozitiv va trimite automat la Google date de diagnosticare și privind utilizarea. Această <ph name="BEGIN_LINK1" />setare<ph name="END_LINK1" /> este impusă de administrator. <ph name="BEGIN_LINK2" />Află mai multe<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Schimbați setările pentru limbă și introducere de text</translation>
 <translation id="6120205520491252677">Fixați această pagină pe ecranul de pornire...</translation>
 <translation id="6122081475643980456">Conexiunea la internet este controlată</translation>
@@ -3929,7 +3927,6 @@
 <translation id="6452181791372256707">Respingeți</translation>
 <translation id="6454421252317455908">Metoda de introducere a textului în chineză (rapidă)</translation>
 <translation id="6455348477571378046">Tip de certificat:</translation>
-<translation id="6456234919706689841">Administratorul poate alege să trimită la Google date de diagnosticare și privind utilizarea pentru acest dispozitiv. Poți vedea această <ph name="BEGIN_LINK1" />setare<ph name="END_LINK1" /> aici. <ph name="BEGIN_LINK2" />Află mai multe<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Continuă blocarea JavaScript</translation>
 <translation id="6458308652667395253">Gestionează blocarea JavaScript...</translation>
 <translation id="6459488832681039634">Folosește selecția pentru a găsi</translation>
@@ -4708,7 +4705,6 @@
 <translation id="7587108133605326224">Baltic</translation>
 <translation id="7589461650300748890">Ușurel. Fiți atent(ă).</translation>
 <translation id="7589661784326793847">Așteptați puțin</translation>
-<translation id="7593635197364225277">Fă backup și restabilește automat datele aplicațiilor Play din Google Drive. Poți modifica oricând opțiunea în Setările Android. <ph name="BEGIN_LINK1" />Află mai multe<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (cod de eroare <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Ok, importați</translation>
 <translation id="7600965453749440009">Nu traduce niciodată din <ph name="LANGUAGE" /></translation>
@@ -5214,7 +5210,6 @@
 <translation id="8300607741108698921">Configurare într-un minut</translation>
 <translation id="8303650969500425356">Permite JavaScript să blocheze orientarea ecranului.</translation>
 <translation id="8303655282093186569">Setări de introducere Pinyin</translation>
-<translation id="830424806940379275">Permite extensiilor să creeze ferestre panou care se deschid în afara cadrului de browser. În mod prestabilit sau dacă este dezactivat, când se încearcă deschiderea unui panou, se va deschide o fereastră pop-up. S-a renunțat la dezvoltarea panourilor pe sistemele de operare pentru desktop, iar opțiunea va fi eliminată în curând.</translation>
 <translation id="8306534594034939679">Activează compatibilitatea pentru Servicii alternative, o funcție experimentală HTTP.</translation>
 <translation id="8307376264102990850">Se calculează timpul până la finalizarea încărcării</translation>
 <translation id="8308179586020895837">Întreabă dacă <ph name="HOST" /> solicită acces la cameră</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 2f42239..662a4d4 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -1934,6 +1934,7 @@
 <translation id="3590559774363307859">Пароль сохранен. Все сохраненные пароли доступны вам в любом браузере (<ph name="SAVED_PASSWORDS_LINK" />).</translation>
 <translation id="3590587280253938212">быстро</translation>
 <translation id="3592260987370335752">&amp;Подробнее</translation>
+<translation id="3592313833691251126">Разрешить расширениям открывать панели вне окна браузера. Если функция отключена, вместо панели появляется всплывающее окно. По умолчанию поддерживаются только расширения из белого списка. Функция включается и отключается для всех расширений.</translation>
 <translation id="359283478042092570">Войти</translation>
 <translation id="3593152357631900254">Включить режим Fuzzy-Pinyin</translation>
 <translation id="3593965109698325041">Ограничения имени сертификата</translation>
@@ -2256,7 +2257,6 @@
 <translation id="4034042927394659004">Уменьшить яркость клавиш</translation>
 <translation id="4035758313003622889">&amp;Диспетчер задач</translation>
 <translation id="4037084878352560732">Лошадь</translation>
-<translation id="4037102579141982963">В Google будут автоматически передаваться данные об использовании и диагностике устройства. Вы можете в любое время выключить или снова включить эту функцию в <ph name="BEGIN_LINK1" />настройках устройства<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Подробнее…<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Включает переключатель вкладок для быстрого доступа к сайтам на Android.</translation>
 <translation id="4044260751144303020">Наложение фиксированных элементов</translation>
 <translation id="404493185430269859">Поисковая система по умолчанию</translation>
@@ -3230,7 +3230,6 @@
 <translation id="5439568486246921931">Все скачанные файлы и данные о работе в браузере этого пользователя будут удалены. Это действие нельзя отменить.</translation>
 <translation id="544083962418256601">Создать ярлык…</translation>
 <translation id="5441100684135434593">Стационарная сеть</translation>
-<translation id="5445088910157062298">Google будет помогать приложениям быстро и точно определять ваше местоположение и при этом экономить заряд батареи. Анонимные геоданные будут отправляться в Google, даже когда приложения не запущены.</translation>
 <translation id="5448293924669608770">Произошла ошибка входа</translation>
 <translation id="5449588825071916739">Добавить все вкладки в закладки</translation>
 <translation id="5449716055534515760">Закрыть &amp;окно</translation>
@@ -3696,7 +3695,6 @@
 <translation id="6110466548232134880">Идентификационные данные компании <ph name="ORGANIZATION" /> (<ph name="LOCALITY" />) подтверждены <ph name="ISSUER" />. Сведения о временных метках сертификата не предоставлены сервером.</translation>
 <translation id="6111770213269631447">Транслитерация (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Разрешено по умолчанию</translation>
-<translation id="6112929985131461002">В Google будут автоматически передаваться данные об использовании и диагностике устройства. Эта <ph name="BEGIN_LINK1" />настройка<ph name="END_LINK1" /> включена администратором. <ph name="BEGIN_LINK2" />Подробнее…<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Изменение настроек языка и метода ввода</translation>
 <translation id="6120205520491252677">Прикрепить эту страницу к экрану запуска…</translation>
 <translation id="6122081475643980456">С вашим интернет-соединением все не так просто</translation>
@@ -3932,7 +3930,6 @@
 <translation id="6452181791372256707">Отклонить</translation>
 <translation id="6454421252317455908">китайская раскладка (быстрое письмо)</translation>
 <translation id="6455348477571378046">Тип сертификата:</translation>
-<translation id="6456234919706689841">Возможно, ваш администратор разрешил автоматическую отправку в Google данных об использовании и диагностике устройства. Просмотрите эту <ph name="BEGIN_LINK1" />настройку<ph name="END_LINK1" /> здесь. <ph name="BEGIN_LINK2" />Подробнее…<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Всегда блокировать JavaScript</translation>
 <translation id="6458308652667395253">Настройки блокирования JavaScript…</translation>
 <translation id="6459488832681039634">Найти выделенное</translation>
@@ -4712,7 +4709,6 @@
 <translation id="7587108133605326224">Балтийская</translation>
 <translation id="7589461650300748890">Осторожно!</translation>
 <translation id="7589661784326793847">Подождите…</translation>
-<translation id="7593635197364225277">Автоматически восстанавливать данные приложений из Google Play и сохранять резервную копию на Google Диске. Этот параметр можно в любое время изменить в настройках Android. <ph name="BEGIN_LINK1" />Подробнее…<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (код ошибки <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">ОК, импортировать</translation>
 <translation id="7600965453749440009">Никогда не переводить <ph name="LANGUAGE" /></translation>
@@ -5218,7 +5214,6 @@
 <translation id="8300607741108698921">Установка за минуту</translation>
 <translation id="8303650969500425356">Разрешить Javascript блокировать ориентацию экрана.</translation>
 <translation id="8303655282093186569">Настройки для способа ввода пиньин</translation>
-<translation id="830424806940379275">Разрешает расширениям открывать панели вне окна браузера. Когда функция включена или не настроена, панели открываются во всплывающем окне. Панели на компьютере скоро перестанут поддерживаться.</translation>
 <translation id="8306534594034939679">Включить альтернативные сервисы. Это экспериментальная функция HTTP.</translation>
 <translation id="8307376264102990850">Расчет времени до полной зарядки батареи</translation>
 <translation id="8308179586020895837">Запрашивать разрешение на доступ к камере для сайта <ph name="HOST" /></translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 335e566..23b8b99 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -1934,6 +1934,7 @@
 <translation id="3590559774363307859">Heslo bolo uložené. K tomuto heslu a všetkým ďalším <ph name="SAVED_PASSWORDS_LINK" /> môžete pristupovať z ľubovoľného prehliadača.</translation>
 <translation id="3590587280253938212">rýchla</translation>
 <translation id="3592260987370335752">&amp;Viac informácií</translation>
+<translation id="3592313833691251126">Povolí rozšíreniam, aby vytvárali panelové okná, ktoré sa otvárajú mimo rámca prehliadača. Ak toto nastavenie nezapnete, pokusy o otvorenie panela otvoria kontextové okno. V zapnutom režime sú povolené všetky rozšírenia. Vo  vypnutom režime sú zakázané panely pre všetky rozšírenia.</translation>
 <translation id="359283478042092570">Vstúpiť</translation>
 <translation id="3593152357631900254">Povoliť režim nepresného vstupu pinyin</translation>
 <translation id="3593965109698325041">Obmedzenia názvu certifikátu</translation>
@@ -2256,7 +2257,6 @@
 <translation id="4034042927394659004">Znížiť jas klávesov</translation>
 <translation id="4035758313003622889">&amp;Správca úloh</translation>
 <translation id="4037084878352560732">Kôň</translation>
-<translation id="4037102579141982963">Toto zariadenie bude automaticky odosielať diagnostické údaje a údaje o používaní Googlu. Toto nastavenie môžete kedykoľvek zmeniť v <ph name="BEGIN_LINK1" />nastaveniach<ph name="END_LINK1" /> zariadenia. <ph name="BEGIN_LINK2" />Ďalšie informácie<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Povoliť prepínač kariet zjednodušeného ovládania v systéme Android.</translation>
 <translation id="4044260751144303020">Skladanie prvkov s pevným umiestnením</translation>
 <translation id="404493185430269859">Predvolený vyhľadávač</translation>
@@ -3229,7 +3229,6 @@
 <translation id="5439568486246921931">Týmto natrvalo odstránite stiahnuté súbory, súbory offline a údaje prehliadania tohto používateľa. Akciu nie je možné vrátiť späť.</translation>
 <translation id="544083962418256601">Vytvoriť odkazy na pracovnej ploche...</translation>
 <translation id="5441100684135434593">Káblová sieť</translation>
-<translation id="5445088910157062298">Povoliť službe určovania polohy Google, aby aplikáciám pomohla rýchlo a presne nájsť vašu polohu. Môžete tak znížiť spotrebu energie. Googlu sa budú odosielať anonymné údaje o polohe, a to aj v prípade, že aplikácie nebudú spustené.</translation>
 <translation id="5448293924669608770">Hops, pri prihlásení sa niečo pokazilo</translation>
 <translation id="5449588825071916739">Všetky karty uložiť ako záložky</translation>
 <translation id="5449716055534515760">Zavrieť o&amp;kno</translation>
@@ -3697,7 +3696,6 @@
 <translation id="6110466548232134880">Identitu organizácie <ph name="ORGANIZATION" /> so sídlom na mieste <ph name="LOCALITY" /> overil vydavateľ <ph name="ISSUER" />. Server neposkytol žiadne informácie o transparentnosti certifikátu.</translation>
 <translation id="6111770213269631447">Prepis (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Povolené v predvolenom nastavení</translation>
-<translation id="6112929985131461002">Toto zariadenie bude automaticky odosielať diagnostické údaje a údaje o používaní Googlu. Toto <ph name="BEGIN_LINK1" />nastavenie<ph name="END_LINK1" /> je vynútené správcom. <ph name="BEGIN_LINK2" />Ďalšie informácie<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Zmeniť nastavenia jazyka a vstupu</translation>
 <translation id="6120205520491252677">Pripnúť túto stránku na Úvodnú obrazovku...</translation>
 <translation id="6122081475643980456">Vaše internetové pripojenie je ovládané</translation>
@@ -3933,7 +3931,6 @@
 <translation id="6452181791372256707">Odmietnuť</translation>
 <translation id="6454421252317455908">Čínska metóda vstupu (rýchla)</translation>
 <translation id="6455348477571378046">Typ certifikátu:</translation>
-<translation id="6456234919706689841">Váš správca môže nastaviť odosielanie diagnostických údajov a údajov o používaní tohto zariadenia Googlu. Toto nastavenie si môžete zobraziť <ph name="BEGIN_LINK1" />tu<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Ďalšie informácie<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Pokračovať v blokovaní jazyka JavaScript</translation>
 <translation id="6458308652667395253">Spravovať blokovanie pre JavaScript...</translation>
 <translation id="6459488832681039634">Použiť výber na hľadanie</translation>
@@ -4714,7 +4711,6 @@
 <translation id="7587108133605326224">Baltické</translation>
 <translation id="7589461650300748890">Pozor, buďte opatrný/-á.</translation>
 <translation id="7589661784326793847">Vydržte chvíľu</translation>
-<translation id="7593635197364225277">Automaticky zálohovať a obnovovať dáta aplikácie Play na Disku Google. Túto možnosť môžete kedykoľvek zmeniť v nastaveniach systému Android. <ph name="BEGIN_LINK1" />Ďalšie informácie<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (kód chyby <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Ok, importovať</translation>
 <translation id="7600965453749440009">Nikdy neprekladať jazyk <ph name="LANGUAGE" /></translation>
@@ -5220,7 +5216,6 @@
 <translation id="8300607741108698921">1-minútové nastavenie</translation>
 <translation id="8303650969500425356">Povolí JavaScriptu uzamknúť orientáciu obrazovky.</translation>
 <translation id="8303655282093186569">Nastavenia vstupu Pinyin</translation>
-<translation id="830424806940379275">Povolí rozšíreniam, aby vytvárali panelové okná, ktoré sa otvárajú mimo rámca prehliadača. V predvolenom nastavení (alebo v prípade jeho zakázania) sa pri pokuse o otvorenie panela otvorí kontextové okno. Panely v operačných systémoch pre počítače sú zastarané a čoskoro budú odstránené.</translation>
 <translation id="8306534594034939679">Povolenie podpory experimentálnej funkcie HTTP Alternative Services.</translation>
 <translation id="8307376264102990850">Nabíjanie
 Prebieha výpočet času do úplného nabitia</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index c185832..9b8184b 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -1935,6 +1935,7 @@
 <translation id="3590559774363307859">Geslo je shranjeno. S katerim koli brskalnikom lahko dostopate do tega gesla in teh: <ph name="SAVED_PASSWORDS_LINK" />.</translation>
 <translation id="3590587280253938212">hitro</translation>
 <translation id="3592260987370335752">Več o tem</translation>
+<translation id="3592313833691251126">Razširitvam omogoča ustvarjanje podoken, ki se odpirajo zunaj okvira brskalnika. Če to ni omogočeno, se pri poskusu odpiranja podokna odpre pojavno okno. V privzetem načinu delovanja so podokna dovoljena samo za razširitve s seznama dovoljenih. Omogočen način delovanja jih dovoljuje za vse razširitve. Onemogočen način delovanja podoken ne dovoljuje za nobeno razširitev.</translation>
 <translation id="359283478042092570">Vnesite</translation>
 <translation id="3593152357631900254">Omogoči način enakozvočnega pinjina</translation>
 <translation id="3593965109698325041">Omejitve imena potrdila</translation>
@@ -2257,7 +2258,6 @@
 <translation id="4034042927394659004">Zmanjšanje svetlosti tipk</translation>
 <translation id="4035758313003622889">&amp;Upravitelj opravil</translation>
 <translation id="4037084878352560732">Konj</translation>
-<translation id="4037102579141982963">Ta naprava bo samodejno pošiljala diagnostične podatke in podatke o uporabi Googlu. To nastavitev lahko kadar koli spremenite v <ph name="BEGIN_LINK1" />nastavitvahEND_<ph name="END_LINK1" /> naprave. <ph name="BEGIN_LINK2" />Več o tem<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Omogoči preklapljanje zavihka za dostopnost za Android.</translation>
 <translation id="4044260751144303020">Sestavljanje za elemente z nespremenljivim položajem.</translation>
 <translation id="404493185430269859">Privzeti iskalnik</translation>
@@ -3231,7 +3231,6 @@
 <translation id="5439568486246921931">S tem bodo trajno izbrisani vsi uporabnikovi prenosi, datoteke brez povezave in podatki brskanja. Tega dejanja ni mogoče razveljaviti.</translation>
 <translation id="544083962418256601">Ustvarjanje bližnjic ...</translation>
 <translation id="5441100684135434593">Žično omrežje</translation>
-<translation id="5445088910157062298">Dovolite, da Googlova lokacijska storitev aplikacijam pomaga hitreje in natančneje ugotoviti vašo lokacijo, s čimer se lahko zmanjša poraba akumulatorja. Anonimni podatki bodo poslani Googlu, tudi ko se ne bo izvajala nobena aplikacija.</translation>
 <translation id="5448293924669608770">Nekaj je šlo narobe pri prijavi</translation>
 <translation id="5449588825071916739">Dodaj vse zavihke med zaznamke</translation>
 <translation id="5449716055534515760">Zapri &amp;okno</translation>
@@ -3700,7 +3699,6 @@
 <translation id="6110466548232134880">Identiteto organizacije <ph name="ORGANIZATION" /> v kraju <ph name="LOCALITY" /> je potrdil izdajatelj <ph name="ISSUER" />. Strežnik ni poslal podatkov o preglednosti potrdila.</translation>
 <translation id="6111770213269631447">Prečrkovanje (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Privzeto dovoljeno</translation>
-<translation id="6112929985131461002">Ta naprava bo samodejno pošiljala diagnostične podatke in podatke o uporabi Googlu. To <ph name="BEGIN_LINK1" />nastavitev<ph name="END_LINK1" /> je uveljavil skrbnik. <ph name="BEGIN_LINK2" />Več o tem<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Spreminjanje nastavitev jezika in vnosa</translation>
 <translation id="6120205520491252677">Pripnite to stran na začetni zaslon ...</translation>
 <translation id="6122081475643980456">Vaša povezava z internetom je nadzorovana</translation>
@@ -3935,7 +3933,6 @@
 <translation id="6452181791372256707">Zavrni</translation>
 <translation id="6454421252317455908">Kitajski način vnosa (hitri)</translation>
 <translation id="6455348477571378046">Vrsta potrdila</translation>
-<translation id="6456234919706689841">Skrbnik bo morda izbral, da se za to napravo pošiljajo diagnostični podatki in podatki o uporabi Googlu. To <ph name="BEGIN_LINK1" />nastavitev<ph name="END_LINK1" /> si lahko ogledate tukaj. <ph name="BEGIN_LINK2" />Več o tem<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Še naprej blokiraj JavaScript</translation>
 <translation id="6458308652667395253">Upravljanje blokiranja za JavaScript ...</translation>
 <translation id="6459488832681039634">Uporabi izbor za iskanje</translation>
@@ -4714,7 +4711,6 @@
 <translation id="7587108133605326224">Baltsko</translation>
 <translation id="7589461650300748890">Počasi. Previdno.</translation>
 <translation id="7589661784326793847">Počakajte trenutek</translation>
-<translation id="7593635197364225277">Samodejno varnostno kopiranje podatkov aplikacij iz Googla Play v Google Drive in njihova obnovitev. To lahko kadar koli spremenite v nastavitvah Androida. <ph name="BEGIN_LINK1" />Več o tem<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (koda napake <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">V redu, uvozi</translation>
 <translation id="7600965453749440009">Nikoli ne prevedi iz jezika: <ph name="LANGUAGE" /></translation>
@@ -5220,7 +5216,6 @@
 <translation id="8300607741108698921">Nastavitev v 1 minuti</translation>
 <translation id="8303650969500425356">JavaScriptu omogoča zaklepanje usmerjenosti zaslona.</translation>
 <translation id="8303655282093186569">Nastavitve vnosa pinjin</translation>
-<translation id="830424806940379275">Razširitvam omogoča ustvarjanje podoken, ki se odpirajo zunaj okvira brskalnika. Če je zastavica nastavljena na privzeto možnost ali onemogočena, se pri poskusu odpiranja podokna odpre pojavno okno. V namiznih operacijskih sistemih so podokna zastarela in bodo kmalu odstranjena.</translation>
 <translation id="8306534594034939679">Omogočanje podpore za nadomestne storitve, poskusno funkcijo HTTP.</translation>
 <translation id="8307376264102990850">Polnjenje:
 izračun časa do napolnjenosti</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 397d103..de010308 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1930,6 +1930,7 @@
 <translation id="3590559774363307859">Лозинка је сачувана. За њу као и за све <ph name="SAVED_PASSWORDS_LINK" /> приступ је могућ у било ком прегледачу.</translation>
 <translation id="3590587280253938212">брзо</translation>
 <translation id="3592260987370335752">&amp;Сазнајте више</translation>
+<translation id="3592313833691251126">Дозвољава додацима да праве прозоре табли који се отварају изван оквира прегледача. Покушаји да се отвори табла ће уместо тога отворити искачући прозор ако ова опција није омогућена. Подразумевано подешавање ове опције је да се табле дозволе само за додатке са беле листе. Када је опција омогућена, табле су дозвољене за све додатке. Када је опција онемогућена, табле су забрањене за све додатке.</translation>
 <translation id="359283478042092570">Унеси</translation>
 <translation id="3593152357631900254">Омогући Fuzzy-Pinyin режим</translation>
 <translation id="3593965109698325041">Ограничења назива сертификата </translation>
@@ -2252,7 +2253,6 @@
 <translation id="4034042927394659004">Смањивање осветљености тастера</translation>
 <translation id="4035758313003622889">&amp;Менаџер задатака</translation>
 <translation id="4037084878352560732">Коњ</translation>
-<translation id="4037102579141982963">Овај уређај ће аутоматски слати дијагностику и податке о коришћењу Google-у. Ово можете да промените у било ком тренутку у <ph name="BEGIN_LINK1" />подешавањима<ph name="END_LINK1" /> уређаја. <ph name="BEGIN_LINK2" />Сазнајте више<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Омогућите пребацивач картица приступачности за Android.</translation>
 <translation id="4044260751144303020">Компоновање за елементе са фиксним положајем.</translation>
 <translation id="404493185430269859">Подразумевани претраживач</translation>
@@ -3226,7 +3226,6 @@
 <translation id="5439568486246921931">Овом радњом ће се трајно избрисати преузимања, офлајн датотеке и подаци прегледања овог корисника. Ова радња не може да се опозове.</translation>
 <translation id="544083962418256601">Направи пречице...</translation>
 <translation id="5441100684135434593">Жичана мрежа</translation>
-<translation id="5445088910157062298">Дозволите да Google-ова услуга локације помаже апликацијама да брзо и прецизно проналазе вашу локацију, што може да смањи потрошњу батерије. Анонимни подаци о локацији шаљу се Google-у чак и када ниједна апликација није покренута.</translation>
 <translation id="5448293924669608770">Упс, нешто није у реду са пријављивањем</translation>
 <translation id="5449588825071916739">Обележи све картице</translation>
 <translation id="5449716055534515760">Close Win&amp;dow (Затвори прозор)</translation>
@@ -3696,7 +3695,6 @@
 <translation id="6110466548232134880">Идентитет организације <ph name="ORGANIZATION" /> на локацији <ph name="LOCALITY" /> верификовао је <ph name="ISSUER" />. Сервер није послао никакве информације о транспарентности сертификата.</translation>
 <translation id="6111770213269631447">Транслитерација (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Подразумевано омогућено</translation>
-<translation id="6112929985131461002">Овај уређај ће аутоматски слати дијагностику и податке о коришћењу Google-у. Ово <ph name="BEGIN_LINK1" />подешавање<ph name="END_LINK1" /> је наметнуо администратор. <ph name="BEGIN_LINK2" />Сазнајте више<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Промени подешавања језика и уноса</translation>
 <translation id="6120205520491252677">Закачи ову страницу на Почетни екран...</translation>
 <translation id="6122081475643980456">Интернет веза се контролише</translation>
@@ -3931,7 +3929,6 @@
 <translation id="6452181791372256707">Одбиј</translation>
 <translation id="6454421252317455908">Кинески метод уноса (брзи)</translation>
 <translation id="6455348477571378046">Тип сертификата:</translation>
-<translation id="6456234919706689841">Администратор може да изабере да се дијагностика и подаци о коришћењу шаљу Google-у. Ово <ph name="BEGIN_LINK1" />подешавање<ph name="END_LINK1" /> можете да прегледате овде. <ph name="BEGIN_LINK2" />Сазнајте више<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Настави блокирање JavaScript-а</translation>
 <translation id="6458308652667395253">Управљај блокирањем JavaScript-а...</translation>
 <translation id="6459488832681039634">Користи избор за проналажење</translation>
@@ -4706,7 +4703,6 @@
 <translation id="7587108133605326224">балтички</translation>
 <translation id="7589461650300748890">Полако. Будите опрезни.</translation>
 <translation id="7589661784326793847">Сачекајте тренутак</translation>
-<translation id="7593635197364225277">Аутоматски правите резервне копије података Play апликација на Google диску и копирајте их назад. Ово можете да промените у Android подешавањима у било ком тренутку. <ph name="BEGIN_LINK1" />Сазнајте више<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (кôд грешке <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">У реду, увези</translation>
 <translation id="7600965453749440009">Никад не преводи <ph name="LANGUAGE" /></translation>
@@ -5213,7 +5209,6 @@
 <translation id="8300607741108698921">Једноминутно подешавање</translation>
 <translation id="8303650969500425356">Омогућава да JavaScript закључа положај екрана.</translation>
 <translation id="8303655282093186569">Подешавања Пинјин метода уноса</translation>
-<translation id="830424806940379275">Омогућава додацима да праве прозоре табли који се отварају изван оквира прегледача. По подразумеваном подешавању или ако онемогућите ову опцију, отворићете искачући прозор када покушате да отворите таблу. Табле у оперативним системима рачунара су застареле и ускоро ће бити уклоњене.</translation>
 <translation id="8306534594034939679">Омогућите подршку за Алтернативне услуге, експерименталну HTTP функцију.</translation>
 <translation id="8307376264102990850">Пуњење
 Израчунавање времена до краја пуњења</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 520ba63..52aa8f5 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -34,6 +34,7 @@
 <translation id="1047431265488717055">Kopiera länktext</translation>
 <translation id="1047726139967079566">Skapa bokmärke för den här sidan...</translation>
 <translation id="1047956942837015229"><ph name="COUNT" /> objekt tas bort ...</translation>
+<translation id="1048286738600630630">Skärmar</translation>
 <translation id="1048597748939794622">Tvingande aktivering för alla lager</translation>
 <translation id="1049795001945932310">&amp;Språkinställningar</translation>
 <translation id="1049926623896334335">Word-dokument</translation>
@@ -98,6 +99,7 @@
 <translation id="1125520545229165057">Dvorak (Hsu)</translation>
 <translation id="1128109161498068552">Tillåt inte att några webbplatser använder systemexklusiva meddelanden för att komma åt MIDI-enheter</translation>
 <translation id="1128128132059598906">EAP-TTLS</translation>
+<translation id="1128591060186966949">Redigera sökmotor</translation>
 <translation id="1128987120443782698">Lagringsenhetens kapacitet är <ph name="DEVICE_CAPACITY" />. Sätt i ett SD-kort eller anslut ett USB-minne med en kapacitet på minst 4 GB.</translation>
 <translation id="1132956125173653312">Aktivera Android-appar på Chromebook.</translation>
 <translation id="1137135726305341424">DOMContentLoaded och alla inlästa resurser som startades före DOMContentLoaded (huvudramen och iframes med samma ursprung).</translation>
@@ -107,6 +109,7 @@
 <translation id="1145292499998999162">Pluginprogrammet har blockerats</translation>
 <translation id="1146204723345436916">Importera bokmärken från HTML-filen...</translation>
 <translation id="1148624853678088576">Nu är det klart!</translation>
+<translation id="1149401351239820326">Utgångsmånad</translation>
 <translation id="1151972924205500581">Lösenord krävs</translation>
 <translation id="1154228249304313899">Öppna sidan:</translation>
 <translation id="115443833402798225">Hangul Ahnmatae</translation>
@@ -118,6 +121,7 @@
 <translation id="1162223735669141505">Du måste aktivera <ph name="BEGIN_LINK" />Native Client-pluginprogrammet<ph name="END_LINK" /> för att kunna använda den här funktionen.</translation>
 <translation id="1163361280229063150">{NUM_DOWNLOAD,plural, =1{En nedladdning pågår för närvarande. Vill du avbryta nedladdningen och avsluta inkognitoläget?}other{# nedladdningar pågår för närvarande. Vill du avbryta nedladdningarna och avsluta inkognitoläget?}}</translation>
 <translation id="1163931534039071049">&amp;Visa ramkälla</translation>
+<translation id="1164674268730883318">Vill du inaktivera Smart Lock för <ph name="DEVICE_TYPE" />?</translation>
 <translation id="1165039591588034296">Fel</translation>
 <translation id="1166212789817575481">Stäng flikar till höger</translation>
 <translation id="1166359541137214543">ABC</translation>
@@ -135,6 +139,7 @@
 <translation id="1181037720776840403">Ta bort</translation>
 <translation id="1183083053288481515">Använder ett certifikat från en administratör</translation>
 <translation id="1183237619868651138">Det går inte att installera <ph name="EXTERNAL_CRX_FILE" /> i det lokala cacheminnet.</translation>
+<translation id="1183917921992319637">Konfigurera pinkod</translation>
 <translation id="1185924365081634987">Du kan också försöka lösa nätverksproblemet genom att <ph name="GUEST_SIGNIN_LINK_START" />surfa som gäst<ph name="GUEST_SIGNIN_LINK_END" />.</translation>
 <translation id="1187722533808055681">Antal gånger som systemets vänteprocess har väckts</translation>
 <translation id="1188807932851744811">Loggen har inte laddats upp.</translation>
@@ -200,6 +205,7 @@
 <translation id="1277908057200820621">Visa enhetslista</translation>
 <translation id="1278049586634282054">Kontrollera vyer:</translation>
 <translation id="1278813325885878377">Ungerskt tangentbord (QWERTY)</translation>
+<translation id="1284355409890639046">Koppla Bluetooth-enhet</translation>
 <translation id="1285320974508926690">Översätt aldrig den här webbplatsen</translation>
 <translation id="1285484354230578868">Spara data i Google Drive-kontot</translation>
 <translation id="1290223615328246825">Det gick inte att logga in automatiskt</translation>
@@ -305,6 +311,7 @@
 <translation id="143027896309062157">Läsa och ändra all din data på datorn och de webbplatser du besöker</translation>
 <translation id="1430915738399379752">Skriv ut</translation>
 <translation id="1432581352905426595">Hantera sökmotorer</translation>
+<translation id="1433811987160647649">Fråga innan informationen används</translation>
 <translation id="1434696352799406980">Den här funktionen återställer startfliken, sidan Ny flik, sökmotorn och de fästa flikarna. Den inaktiverar också alla tillägg och rensar tillfälliga uppgifter som cookies. Bokmärken, historik och sparade lösenord rensas inte.</translation>
 <translation id="1434886155212424586">Startsidan är sidan Ny flik</translation>
 <translation id="1435550882135542937">Omstrukturering av tilläggsfältet</translation>
@@ -340,6 +347,7 @@
 <translation id="14720830734893704">Aktivera stöd för virtuellt tangentbord.</translation>
 <translation id="1474079335130556426">Aktivera bakgrundsläge för Push-API:et. Det gör att Chrome fortfarande kan köras när det sista fönstret har stängts, och att det kan startas tillsammans med operativsystemet, om Push-API:et behöver det.</translation>
 <translation id="1474339897586437869"><ph name="FILENAME" /> laddades inte upp. Det fanns inte tillräckligt mycket ledigt utrymme på Google Drive.</translation>
+<translation id="1475502736924165259">Du har certifikat i din dator som inte passar i några av de andra kategorierna</translation>
 <translation id="1476607407192946488">&amp;Språkinställningar</translation>
 <translation id="1476949146811612304">Ange vilken sökmotor som används när du söker från <ph name="BEGIN_LINK" />adressfältet<ph name="END_LINK" />.</translation>
 <translation id="1477301030751268706">Tokencacheminne för identitets-API</translation>
@@ -376,6 +384,7 @@
     proxyserver ändrar du <ph name="LINK_START" />proxyinställningarna<ph name="LINK_END" />.</translation>
 <translation id="1510907582379248592">Sparade lösenord för <ph name="ORIGIN" />:</translation>
 <translation id="1511004689539562549">Tillåt inte att webbplatser använder kameran</translation>
+<translation id="1511388193702657997">Erbjud att spara webblösenord</translation>
 <translation id="1511623662787566703">Inloggad som <ph name="USER_EMAIL_ADDRESS" />. Synkronisering har stoppats via Google Översikt.</translation>
 <translation id="1514215615641002767">Lägg till på skrivbordet</translation>
 <translation id="1514298457297359873">Tillåter att program använder NaCl Socket-API:t. Använd bara för att testa NaCl-plugin-program.</translation>
@@ -397,6 +406,7 @@
 <translation id="1529968269513889022">senaste veckan</translation>
 <translation id="1531004739673299060">Appfönster</translation>
 <translation id="1531865825384516080">Rapportera SafeSearch-webbadresser.</translation>
+<translation id="1532687502998799885">Pinkoden måste vara minst fyra siffror:</translation>
 <translation id="1532697124104874386">Aktivera/inaktivera smart användning av det virtuella tangentbordet.</translation>
 <translation id="1533897085022183721">Mindre än <ph name="MINUTES" /></translation>
 <translation id="1533920822694388968">TV-justering</translation>
@@ -425,6 +435,7 @@
 <translation id="1558988940633416251">Aktivera plattformsoberoende HarfBuzz-motor för text i användargränssnittet. Webbinnehåll påverkas inte.</translation>
 <translation id="1559235587769913376">Ange Unicode-tecken</translation>
 <translation id="1561092721008294962">HarfBuzz för text i användargränssnittet</translation>
+<translation id="1566049601598938765">Webbplats</translation>
 <translation id="1566958206723629112">Flash och PDF</translation>
 <translation id="1567723158593978621">När den här funktionen är aktiverad används det nya lösenordsseparerade inloggningsflödet för GAIA vid inloggning i webbläsaren.</translation>
 <translation id="1567993339577891801">JavaScript-konsol</translation>
@@ -482,6 +493,7 @@
 <translation id="1645228020260124617"><ph name="PRECENTAGE" /> %</translation>
 <translation id="1645870377513700713">Aktivera systeminterna aviseringar.</translation>
 <translation id="1646136617204068573">Ungerskt tangentbord</translation>
+<translation id="1646982517418478057">Ange ett lösenord om du vill kryptera det här certifikatet</translation>
 <translation id="164729547906544836">Tangentbord för tamil (itrans)</translation>
 <translation id="164814987133974965">En övervakad användare kan utforska webben med din hjälp. Som ansvarig hanterare för en övervakad användare kan du
     <ph name="BEGIN_BOLD" />tillåta eller förbjuda<ph name="END_BOLD" /> vissa webbplatser,
@@ -508,6 +520,7 @@
 <translation id="1673103856845176271">Det gick inte att öppna filen av säkerhetsskäl.</translation>
 <translation id="1675023460278456180">Material-hybrid</translation>
 <translation id="167832068858235403">volym ned</translation>
+<translation id="1678331212993975953">Webbplatsinformation</translation>
 <translation id="1679068421605151609">Verktyg för utvecklare</translation>
 <translation id="1681120471812444678">Konfigurera nya skrivare ...</translation>
 <translation id="1682324559341535203">Registrera <ph name="DEVICE_TYPE" /></translation>
@@ -529,11 +542,13 @@
 <translation id="1699395855685456105">Revision för maskinvara:</translation>
 <translation id="1700199471143028312">Administratören tillåter inte att du skapar kontrollerade användare.</translation>
 <translation id="1701062906490865540">Ta bort personen</translation>
+<translation id="1702294042233267824">Sökmotorn som används när du söker från adressfältet</translation>
 <translation id="1702534956030472451">Västeuropeiskt</translation>
 <translation id="1707463636381878959">Dela nätverket med andra användare</translation>
 <translation id="1708199901407471282">När du öppnar ett förslag för sidan Ny flik och förslaget redan är öppet på en flik visas den där i stället för att den nya fliken läses in.</translation>
 <translation id="1708338024780164500">(Inaktiv)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (id: <ph name="ID_PH" />)</translation>
+<translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (standard)</translation>
 <translation id="1711973684025117106">Komprimeringen misslyckades. Oväntat fel: $1</translation>
 <translation id="1715941336038158809">Ogiltigt användarnamn eller lösenord.</translation>
 <translation id="1717733954209022288">Kryssruta för att spara kort i Google Payments</translation>
@@ -628,6 +643,7 @@
 <translation id="1852799913675865625">Ett fel uppstod när följande fil skulle läsas: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1856715684130786728">Lägg till plats ...</translation>
 <translation id="1857166538520940818">Bifoga fil:</translation>
+<translation id="1858585891038687145">Lita på det här certifikatet för identifiering av programskapare</translation>
 <translation id="1859234291848436338">Skrivriktning</translation>
 <translation id="1864111464094315414">Inloggning</translation>
 <translation id="1864676585353837027">Ändra hur dessa filer delas</translation>
@@ -659,6 +675,7 @@
 <translation id="1909880997794698664">Är du säker på att du vill använda kioskläge på enheten permanent?</translation>
 <translation id="1910572251697014317">Google skickade ett meddelande till den här mobilen. Tänk på att med Bluetooth kan mobilen ha <ph name="DEVICE_TYPE" /> olåst på mer än 30 meters avstånd. I de fall detta kan orsaka ett problem kan du &lt;a&gt;tillfälligt inaktivera funktionen&lt;/a&gt;.</translation>
 <translation id="1910721550319506122">Välkommen!</translation>
+<translation id="1911073860190924580">Endast lösenord</translation>
 <translation id="1916502483199172559">Röd standardavatar</translation>
 <translation id="191688485499383649">Ett okänt fel uppstod vid försök att ansluta till <ph name="DEVICE_NAME" />.</translation>
 <translation id="1918141783557917887">&amp;Mindre</translation>
@@ -720,6 +737,8 @@
 <translation id="2007404777272201486">Rapportera ett problem...</translation>
 <translation id="2011110593081822050">Webbtråd: <ph name="WORKER_NAME" /></translation>
 <translation id="2012766523151663935">Revision för firmware:</translation>
+<translation id="2013984794184160106">15</translation>
+<translation id="2016430552235416146">Traditionell</translation>
 <translation id="2017052954220678795">GPU-rastrering med trådar</translation>
 <translation id="2017334798163366053">Inaktivera insamling av resultatdata</translation>
 <translation id="2018352199541442911">Den externa lagringsenheten stöds tyvärr inte just nu.</translation>
@@ -736,6 +755,7 @@
 <translation id="204497730941176055">Namn på Microsoft-certifikatmall</translation>
 <translation id="2045969484888636535">Fortsätt att blockera cookies</translation>
 <translation id="204622017488417136">Enheten kommer att återgå till den tidigare installerade versionen av Chrome. Alla användarkonton och lokala uppgifter kommer att tas bort. Det går inte att ångra åtgärden.</translation>
+<translation id="2047962517134476164">Bekräfta inloggningen för att fortsätta</translation>
 <translation id="2048182445208425546">Åtkomst till din nätverkstrafik</translation>
 <translation id="2049137146490122801">Administratören har avaktiverat tillgång till lokala filer på datorn.</translation>
 <translation id="204914487372604757">Skapa genväg</translation>
@@ -821,10 +841,12 @@
 <translation id="2155931291251286316">Tillåt alltid popup-fönster från <ph name="HOST" /></translation>
 <translation id="215753907730220065">Avsluta helskärmsläge</translation>
 <translation id="2157875535253991059">Denna sida visas nu i helskärm.</translation>
+<translation id="2161553589239083578">Bekräfta pinkoden:</translation>
 <translation id="216169395504480358">Lägg till Wi-Fi ...</translation>
 <translation id="2163470535490402084">Anslut till internet om du vill logga in på din <ph name="DEVICE_TYPE" />.</translation>
 <translation id="2164862903024139959">Tangentbord för vietnamesiska (TCVN)</translation>
 <translation id="2165453356262207111">Smart Lock (betaversion)</translation>
+<translation id="2166369534954157698">Den snabba röda räven hoppar över den lata hunden</translation>
 <translation id="2167276631610992935">JavaScript</translation>
 <translation id="2168214441502403371">Tangentbord för persiska</translation>
 <translation id="2168725742002792683">Filtillägg</translation>
@@ -841,6 +863,7 @@
 <translation id="2190355936436201913">(tom)</translation>
 <translation id="2190469909648452501">Minska</translation>
 <translation id="2192505247865591433">Från:</translation>
+<translation id="2193365732679659387">Inställningar för tillförlitlighet</translation>
 <translation id="2195729137168608510">E-postskydd</translation>
 <translation id="2198315389084035571">kinesiska (förenklad)</translation>
 <translation id="2199829153606285995">Röstinmatning med virtuellt tangentbord</translation>
@@ -858,9 +881,11 @@
 <translation id="2213819743710253654">Sidåtgärd</translation>
 <translation id="2215277870964745766">Välkommen! Ställ in språk och nätverk</translation>
 <translation id="2217501013957346740">Skapa ett namn –</translation>
+<translation id="2218019600945559112">Mus och styrplatta</translation>
 <translation id="2218515861914035131">Klistra in som oformaterad text</translation>
 <translation id="2218947405056773815">Attans! <ph name="API_NAME" /> stötte på problem.</translation>
 <translation id="2220529011494928058">Rapportera ett problem</translation>
+<translation id="2220572644011485463">Pinkod eller lösenord</translation>
 <translation id="2221240591176106785">Aktivera återinläsning utan validering</translation>
 <translation id="2222641695352322289">Du kan endast ångra det här genom att ominstallera <ph name="IDS_SHORT_PRODUCT_OS_NAME" />.</translation>
 <translation id="2224444042887712269">Den här inställningen tillhör <ph name="OWNER_EMAIL" />.</translation>
@@ -904,6 +929,7 @@
 <translation id="2258195278080713720">Senaste stabila JavaScript-funktionerna</translation>
 <translation id="2260567344816042527">Mobildata kommer att användas med Google Chrome om du inte är ansluten till något annat nätverk.</translation>
 <translation id="2260654768907572711">PLUGIN FÖR WEBBLÄSARE</translation>
+<translation id="2262477216570151239">Fördröjning före upprepning</translation>
 <translation id="226269835214688456">Om du inaktiverar Smart Lock för Chrome kan du inte låsa upp dina Chrome-enheter med mobilen. Du måste ange ditt lösenord.</translation>
 <translation id="2262903407161221567">Vissa gränssnittskomponenter visar visuell feedback för tryckinteraktioner.</translation>
 <translation id="2263497240924215535">(Inaktiverat)</translation>
@@ -917,6 +943,7 @@
 <translation id="2273562597641264981">Operatör:</translation>
 <translation id="2275694568175246751">Höger till vänster</translation>
 <translation id="2276503375879033601">Lägg till fler appar</translation>
+<translation id="2277255602909579701">Alla cookies och all webbplatsdata</translation>
 <translation id="2278098630001018905">Använd en annan leveransadress</translation>
 <translation id="2278562042389100163">Öppna webbläsarfönster</translation>
 <translation id="2278988676849463018">Tangentbord för kannada (fonetiskt)</translation>
@@ -957,6 +984,7 @@
 <translation id="2339120501444485379">Skriv ett nytt namn</translation>
 <translation id="2339641773402824483">Söker efter uppdateringar...</translation>
 <translation id="2342060820861917889">lång (2 000 ms)</translation>
+<translation id="2342282706041269970">Testa att logga ut och sedan logga in igen.</translation>
 <translation id="23434688402327542">Kazakiskt tangentbord</translation>
 <translation id="2344028582131185878">Automatiska nedladdningar</translation>
 <translation id="2344262275956902282">Använd tangenterna - och = om du vill söka i en kandidatlista</translation>
@@ -1071,6 +1099,7 @@
 <translation id="2494837236724268445">Tangentbord för gujarati (fonetiskt)</translation>
 <translation id="2496180316473517155">Webbhistorik</translation>
 <translation id="2496540304887968742">Enheten måste ha en kapacitet på 4 GB eller mer.</translation>
+<translation id="2497229222757901769">Mushastighet</translation>
 <translation id="249819058197909513">Varna inte för den här appen fler gånger</translation>
 <translation id="2498436043474441766">Lägg till skrivare</translation>
 <translation id="2498539833203011245">Minimera</translation>
@@ -1145,6 +1174,7 @@
 <translation id="2587203970400270934">Operatörskod:</translation>
 <translation id="2587922270115112871">Inget Google-konto skapas när en övervakad användare skapas och användarens inställningar
     och data är inte tillgängliga på andra enheter via Chrome Sync. För närvarande gäller den övervakade användaren endast på den här enheten.</translation>
+<translation id="25912682830130293">Visa inställningar som ska rapporteras</translation>
 <translation id="2594049137847833442">Alternativ för viktiga webbplatser i dialogrutan Rensa sökdata</translation>
 <translation id="2594056015203442344">När det här alternativet är aktiverat fungerar ljudindikatorerna i flikfältet även som ljudkontroller för flikarna. Dessutom läggs kommandon till i flikarnas snabbmenyer så att det går att stänga av ljudet från flera valda flikar snabbt.</translation>
 <translation id="259421303766146093">Förminska</translation>
@@ -1197,6 +1227,7 @@
 <translation id="2665394472441560184">Lägg till ett nytt ord</translation>
 <translation id="2665717534925640469">Sidan visas nu i helskärm och har inaktiverat muspekaren.</translation>
 <translation id="2665919335226618153">Ett fel uppstod vid formateringen.</translation>
+<translation id="2667463864537187133">Hantera stavningskontrollen</translation>
 <translation id="2668079306436607263">Överrullning för historiknavigering</translation>
 <translation id="2670102641511624474"><ph name="APP_NAME" /> delar en Chrome-flik.</translation>
 <translation id="2670965183549957348">Inmatningsmetoden Chewing</translation>
@@ -1219,7 +1250,9 @@
 <translation id="2694026874607847549">1 cookie</translation>
 <translation id="2696862700756109583">Undantag för helskärm</translation>
 <translation id="2702540957532124911">Tangentbord:</translation>
+<translation id="2704142793323512908">Ta även bort befintlig data från den här enheten.</translation>
 <translation id="2704184184447774363">Microsofts Signering av dokument</translation>
+<translation id="270516211545221798">Hastighet för styrplatta</translation>
 <translation id="2706892089432507937">USB-enheter</translation>
 <translation id="2707024448553392710">Komponenten laddas ned</translation>
 <translation id="270921614578699633">Medelvärde för</translation>
@@ -1398,6 +1431,7 @@
 <translation id="2902734494705624966">USA (utökat)</translation>
 <translation id="2903493209154104877">Adresser</translation>
 <translation id="290444763029043472"><ph name="DOWNLOADED_AMOUNT_MB" /> MB av <ph name="TOTAL_AMOUNT_MB" /> MB har laddats ned</translation>
+<translation id="2904456025988372123">Fråga när en webbplats försöker ladda ned filer automatiskt efter den första filen</translation>
 <translation id="2907619724991574506">Webbadresser för start</translation>
 <translation id="2908162660801918428">Lägg till mediegalleri efter katalog</translation>
 <translation id="2908789530129661844">Zooma ut skärmen</translation>
@@ -1444,6 +1478,7 @@
 <translation id="2963151496262057773">Följande pluginprogram svarar inte: <ph name="PLUGIN_NAME" />. Vill du stoppa det?</translation>
 <translation id="2963783323012015985">Turkiskt tangentbord</translation>
 <translation id="2964193600955408481">Inaktivera Wi-Fi</translation>
+<translation id="2964313852984024865">Redigera</translation>
 <translation id="2966459079597787514">Svenskt tangentbord</translation>
 <translation id="2966598748518102999">Förbättra röstsökningen genom att skicka ljudet Ok Google och några sekunder innan till Google.</translation>
 <translation id="2967544384642772068">Stäng</translation>
@@ -1592,6 +1627,7 @@
 <translation id="3150927491400159470">Hård inläsning</translation>
 <translation id="315116470104423982">Mobildata</translation>
 <translation id="315141861755603168"><ph name="BUNDLE_NAME" /> lägger till följande appar:</translation>
+<translation id="3151786313568798007">Orientering</translation>
 <translation id="3153177132960373163">Tillåt alla webbplatser att använda en plugin för att få åtkomst till datorn</translation>
 <translation id="3154429428035006212">Offline i mer än en månad</translation>
 <translation id="3157931365184549694">Återställ</translation>
@@ -1648,6 +1684,7 @@
 <translation id="3234666976984236645">Upptäck alltid viktigt innehåll på den här webbplatsen</translation>
 <translation id="3236997602556743698">3 Set (390)</translation>
 <translation id="3237784613213365159"><ph name="NEW_PROFILE_NAME" /> är nu en kontrollerad användare</translation>
+<translation id="323803881985677942">Öppna tilläggsalternativ</translation>
 <translation id="324056286105023296">Inte <ph name="PROFILE_NAME" />?</translation>
 <translation id="3241680850019875542">Välj rotkatalogen för tillägget som ska paketeras. Om du vill uppdatera ett tillägg väljer du också den privata nyckel som ska återanvändas.</translation>
 <translation id="3241720467332021590">iriska</translation>
@@ -1673,6 +1710,7 @@
 <translation id="3268451620468152448">Öppna flikar</translation>
 <translation id="3269093882174072735">Läs in bild</translation>
 <translation id="3269101346657272573">Ange PIN-kod.</translation>
+<translation id="3269737334347286816">Inloggningsuppgifterna är inaktuella.</translation>
 <translation id="326999365752735949">Laddar ned skillnaden</translation>
 <translation id="3270965368676314374">Läsa, ändra och ta bort foton, musik och andra media från datorn</translation>
 <translation id="3273410961255278341">Skicka för:</translation>
@@ -1772,6 +1810,7 @@
 <translation id="3382073616108123819">Hoppsan! Det gick inte att fastställa enhets-id för den här enheten.</translation>
 <translation id="3384773155383850738">Max antal förslag</translation>
 <translation id="3385050660708634073">Kryptera alla synkroniserade data med en egen lösenfras.</translation>
+<translation id="3385131213214862288">Rensa följande objekt från</translation>
 <translation id="338583716107319301">Avgränsare</translation>
 <translation id="3386219708421216619">Ett bokmärke har lagts till</translation>
 <translation id="3391392691301057522">Gammal PIN:</translation>
@@ -1807,6 +1846,7 @@
 <translation id="3439153939049640737">Låt alltid <ph name="HOST" /> använda din mikrofon</translation>
 <translation id="3439282137581679399">Aktiverar den svarta listan för behörigheter, så att svartlistade webbplatsers behörighet blockeras med Säker webbsökning.</translation>
 <translation id="3439970425423980614">Öppnar PDF i förhandsgranskning</translation>
+<translation id="3440761377721825626">Fråga om en webbplats försöker använda en plugin för att få åtkomst till datorn</translation>
 <translation id="3441653493275994384">Skärm</translation>
 <translation id="3441653695259810643">Återanvänd ett cachelagrat teckensnitt vid renderingen av olika teckenstorlekar så att layouten renderas snabbare.</translation>
 <translation id="3445092916808119474">Ange som primär</translation>
@@ -1821,6 +1861,7 @@
 <translation id="3456236151053308041">Tillåt att IME-tillägg anger anpassade vyer för inmatning, till exempel virtuella tangentbord.</translation>
 <translation id="345693547134384690">Öppna &amp;bild i ny flik</translation>
 <translation id="3458620904104024826">Aktivera export av händelsespårning till ETW.</translation>
+<translation id="3459509316159669723">Skriva ut</translation>
 <translation id="3459774175445953971">Senast ändrad:</translation>
 <translation id="3460771772332290399">Automatisk återinläsning efter offlineläge</translation>
 <translation id="3462413494201477527">Vill du avbryta konfigurationen av kontot?</translation>
@@ -1864,6 +1905,7 @@
 <translation id="3508920295779105875">Välj en annan mapp...</translation>
 <translation id="3509527969829946096">Med det här alternativet aktiveras stödet för att koda videoströmmar med plattformens maskinvara i Cast Streaming.</translation>
 <translation id="3510797500218907545">WiMAX</translation>
+<translation id="3511200754045804813">Sök igen</translation>
 <translation id="3511307672085573050">Kopiera länk&amp;adress</translation>
 <translation id="3511399794969432965">Anslutningsproblem?</translation>
 <translation id="351152300840026870">Teckensnitt med fast bredd</translation>
@@ -1933,6 +1975,7 @@
 <translation id="3590559774363307859">Lösenordet har sparats. Du kommer åt den och alla <ph name="SAVED_PASSWORDS_LINK" /> från vilken webbläsare som helst.</translation>
 <translation id="3590587280253938212">snabb</translation>
 <translation id="3592260987370335752">&amp;Läs mer</translation>
+<translation id="3592313833691251126">Tillåt att tillägg skapar panelfönster som öppnas utanför webbläsarens ram. Om detta inte är aktiverat öppnas ett popupfönster istället för en panel. Standardbeteendet är att endast godkända tillägg får öppna panelfönster. Om du aktiverar beteendet tillåter du att alla tillägg öppnar paneler. Om du inaktiverar beteendet tillåter du inte att några tillägg öppnar paneler.</translation>
 <translation id="359283478042092570">Ange</translation>
 <translation id="3593152357631900254">Aktivera Fuzzy-Pinyin-läge</translation>
 <translation id="3593965109698325041">Certifikatnamnsbegränsningar</translation>
@@ -2010,6 +2053,7 @@
 <translation id="3695919544155087829">Ange lösenordet som användes vid krypteringen av certifikatfilen.</translation>
 <translation id="3696411085566228381">ingen</translation>
 <translation id="3697100740575341996">IT-administratören har inaktiverat godbitar från Chrome för din enhet. <ph name="MORE_INFO_LINK" /></translation>
+<translation id="3699080292907545058">Ange den högsta TLS-versionen som tillåts.</translation>
 <translation id="3699624789011381381">E-postadress</translation>
 <translation id="3704162925118123524">Nätverket du använder kanske kräver att du besöker dess inloggningssida.</translation>
 <translation id="3704331259350077894">Upphörande av verksamhet</translation>
@@ -2055,10 +2099,12 @@
 <translation id="3758201569871381925">Kontrollera att din Hotrod-enhet är aktiverad och ansluten till en tv.</translation>
 <translation id="375841316537350618">Laddar ned proxyskript ...</translation>
 <translation id="3759371141211657149">Hantera inställningar för hanterare</translation>
+<translation id="3759553810934020361">Bluetooth har inaktiverats.</translation>
 <translation id="3759933321830434300">Blockera delar av webbsidor</translation>
 <translation id="3760460896538743390">Kontrollera &amp;bakgrundssida</translation>
 <translation id="37613671848467444">Öppna i &amp;inkognitofönster</translation>
 <translation id="3763401818161139108">Kör alltid på <ph name="ORIGIN" /></translation>
+<translation id="3764314093345384080">Detaljerad versionsinformation</translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Kommunicera med en USB-enhet}other{Kommunicera med # USB-enheter}}</translation>
 <translation id="3764800135428056022">Erbjud att spara webblösenord.</translation>
 <translation id="3764986667044728669">Det går inte att registrera</translation>
@@ -2088,6 +2134,7 @@
 <translation id="3798449238516105146">Version</translation>
 <translation id="3798935682015223249">Stöd för MTP i filhanteraren</translation>
 <translation id="3800764353337460026">Symbolstil</translation>
+<translation id="3800806661949714323">Visa alla (rekommenderas)</translation>
 <translation id="3801082500826908679">färöiska</translation>
 <translation id="3803991353670408298">Lägg till en annan inmatningsmetod innan du tar bort den här.</translation>
 <translation id="380408572480438692">Aktivering av insamling av resultatdata hjälper Google att förbättra systemet med tiden. Inga data skickas förrän du skickar en feedbackrapport (Alt-Skift-I) och inkluderar resultatdata. Du kan när som helst återgå till den här skärmen för att inaktivera insamlingen.</translation>
@@ -2105,6 +2152,7 @@
 <translation id="3819007103695653773">Tillåt alla webbplatser att skicka push-meddelanden i bakgrunden</translation>
 <translation id="3819752733757735746">Brytarstyrning (styr datorn med bara en eller två knappar)</translation>
 <translation id="3819800052061700452">&amp;Helskärm</translation>
+<translation id="3821453754632750466">Aktivera webbetalningar</translation>
 <translation id="3822265067668554284">Tillåt inte att någon webbplats spårar din fysiska plats</translation>
 <translation id="3825863595139017598">Mongoliskt tangentbord</translation>
 <translation id="3827306204503227641">Fortsätt att tillåta pluginprogram utanför sandlådan</translation>
@@ -2166,9 +2214,11 @@
 <translation id="3899968422636198696"><ph name="ORGNAME" /> <ph name="HOSTNAME" /></translation>
 <translation id="3901991538546252627">Ansluter till <ph name="NAME" /></translation>
 <translation id="3902799646152133632">Hoppar över huvudramen no-store.</translation>
+<translation id="3904196543277238487">Högsta TLS-version som kan användas</translation>
 <translation id="3905761538810670789">Reparera appen</translation>
 <translation id="390718707505136526">Aktiverar ursprungliga provversioner för kontroll av åtkomst till funktions-/API-experiment.</translation>
 <translation id="3908501907586732282">Aktivera tillägg</translation>
+<translation id="3909690856344416952"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /> och ett till</translation>
 <translation id="3909791450649380159">&amp;Klipp ut</translation>
 <translation id="3910699493603749297">Khmeriskt tangentbord</translation>
 <translation id="3911073280391218446"><ph name="USER_DISPLAY_NAME" /> (namn som används på enheten)</translation>
@@ -2188,6 +2238,7 @@
 <translation id="3930521966936686665">Spela upp på</translation>
 <translation id="3936390757709632190">&amp;Öppna ljud i ny flik</translation>
 <translation id="3936768791051458634">Byt kanal …</translation>
+<translation id="3936925983113350642">Lösenordet du väljer behövs om du vill återställa certifikatet vid ett senare tillfälle. Spara det på ett säkert ställe.</translation>
 <translation id="3937640725563832867">Certifikatutfärdarens alternativa namn</translation>
 <translation id="3938113500786732264">Byt mellan personer snabbare</translation>
 <translation id="3940233957883229251">Aktivera automatisk upprepning</translation>
@@ -2255,9 +2306,10 @@
 <translation id="4034042927394659004">Minska tangenternas ljusstyrka</translation>
 <translation id="4035758313003622889">&amp;Aktivitetshanteraren</translation>
 <translation id="4037084878352560732">Häst</translation>
-<translation id="4037102579141982963">Diagnostik- och användningsdata skickas automatiskt till Google från den här enheten. Du kan när som helst ändra detta i <ph name="BEGIN_LINK1" />enhetsinställningarna<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Läs mer<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Aktiverar tillgänglighetsfunktionen för flikbyte för Android.</translation>
+<translation id="4037889604535939429">Redigera person</translation>
 <translation id="4044260751144303020">Sammansättning för element med fast position.</translation>
+<translation id="4044612648082411741">Ange certifikatlösenordet</translation>
 <translation id="404493185430269859">Standardsökmotor</translation>
 <translation id="4047112090469382184">Därför är detta säkert</translation>
 <translation id="4047345532928475040">Ej tillämpligt</translation>
@@ -2350,6 +2402,7 @@
 <translation id="417475959318757854">Centrera startprogrammet för appar.</translation>
 <translation id="4176463684765177261">Inaktiverad</translation>
 <translation id="4179512409951755566">Aktivera överrullning för skärmtangentbord</translation>
+<translation id="418062721134714140">Hantera SSL-certifikat och -inställningar</translation>
 <translation id="4180788401304023883">Vill du ta bort certifikatet <ph name="CERTIFICATE_NAME" />?</translation>
 <translation id="418179967336296930">Ryskt fonetiskt tangentbord (YaZHert)</translation>
 <translation id="4181841719683918333">Språk</translation>
@@ -2364,6 +2417,7 @@
 <translation id="4195643157523330669">Öppna i ny flik</translation>
 <translation id="4195814663415092787">Fortsätt där du slutade</translation>
 <translation id="4197674956721858839">Zippa markerade filer</translation>
+<translation id="4200689466366162458">Anpassade ord</translation>
 <translation id="4200983522494130825">Ny &amp;flik</translation>
 <translation id="4206144641569145248">Utomjording</translation>
 <translation id="420665587194630159">(Tillägget administreras och kan inte avinstalleras eller inaktiveras.)</translation>
@@ -2460,10 +2514,12 @@
 <translation id="4350019051035968019">Det går inte att registrera enheten på samma domän som dina konton eftersom enheten har registrerats som hanterad av en annan domän.</translation>
 <translation id="4354806558096370704">Aktiverar användning av inbyggt CUPS för utskrifter i serverdelen.</translation>
 <translation id="4355925451975609675">Fortsätt med |<ph name="ACCELERATOR1" />|+|<ph name="ACCELERATOR2" />|</translation>
+<translation id="4358353773267946514"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /></translation>
 <translation id="4358697938732213860">Lägg till en adress</translation>
 <translation id="4359408040881008151">Installerades på grund av ett eller flera tillägg som är beroende av detta tillägg.</translation>
 <translation id="4361190688154226069">Rektangelbaserad inriktning i visningar</translation>
 <translation id="4361765875689149937"><ph name="ORIGIN" /> vill koppla till:</translation>
+<translation id="4363771538994847871">Ingen Cast-destination hittades. Behöver du hjälp?</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> har laddats ned</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> delar ett fönster.</translation>
 <translation id="4364830672918311045">Visa aviseringar</translation>
@@ -2555,6 +2611,7 @@
 <translation id="4509345063551561634">Plats:</translation>
 <translation id="4514542542275172126">Skapa ny kontrollerad användare</translation>
 <translation id="4514914692061505365">Tvinga fram användning av PNaCl:s snabba Subzero-översättare för alla pexe-filer.</translation>
+<translation id="451515744433878153">Ta bort</translation>
 <translation id="4516641987425683031">Synkade flikar</translation>
 <translation id="4518677423782794009">Händer det att Chrome kraschar, eller har du råkat ut för ovanliga startsidor, verktygsfält eller oväntade annonser som du inte kan ta bort eller som på annat sätt ändrar webbupplevelsen? Du kan eventuellt åtgärda problemet genom att köra Chrome Cleanup Tool.</translation>
 <translation id="452039078290142656">okända enheter från <ph name="VENDOR_NAME" /></translation>
@@ -2591,6 +2648,7 @@
 <translation id="4562991793854515912">extremt kort (600 ms)</translation>
 <translation id="4563210852471260509">Det ursprungliga inmatningsspråket är kinesiska</translation>
 <translation id="456664934433279154">Styr användning av fönster i Chrome-appar som baseras på verktygsfältsvisningar.</translation>
+<translation id="4567772783389002344">Lägg till ord</translation>
 <translation id="4569998400745857585">Menyn innehåller dolda tillägg</translation>
 <translation id="4570444215489785449">Nu kan du fjärrlåsa enheten när som helst i Chrome Manager.</translation>
 <translation id="4572659312570518089">Autentiseringen avbröts vid anslutning till <ph name="DEVICE_NAME" />.</translation>
@@ -2602,11 +2660,13 @@
 <translation id="4582447636905308869">Nytt IME för koreanska som är baserat på HMM-motorn för Google Inmatningsverktyg.</translation>
 <translation id="4582563038311694664">Återställ alla inställningar</translation>
 <translation id="4583537898417244378">Ogiltig eller skadad fil.</translation>
+<translation id="4585793705637313973">Redigera sida</translation>
 <translation id="4589268276914962177">Ny terminal</translation>
 <translation id="4590324241397107707">Databaslagring</translation>
 <translation id="4593021220803146968">&amp;Öppna <ph name="URL" /></translation>
 <translation id="4594109696316595112">Engångsaktivering: Skriv lösenordet för att aktivera Smart Lock på <ph name="DEVICE_TYPE" />. Med Smart Lock kan du låsa upp den här enheten med mobilen utan ett lösenord. Om du vill ändra eller inaktivera funktionen gör du det i inställningarna för <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4595560905247879544">Appar och tillägg kan bara ändras av den ansvariga (<ph name="CUSTODIAN_NAME" />).</translation>
+<translation id="4596295440756783523">Du har sparade certifikat som identifierar dessa servrar</translation>
 <translation id="4598556348158889687">Lagringshantering</translation>
 <translation id="4601242977939794209">EMF-konverterare</translation>
 <translation id="4602466770786743961">Tillåt alltid att <ph name="HOST" /> använder kameran och mikrofonen</translation>
@@ -2672,6 +2732,7 @@
 <translation id="4697551882387947560">När surfningen avslutas</translation>
 <translation id="4699172675775169585">Cachade bilder och filer</translation>
 <translation id="4699357559218762027">(startas automatiskt)</translation>
+<translation id="4704677965327178154">Tillåt inte några webbplatser att använda en plugin för få åtkomst till datorn.</translation>
 <translation id="4707302005824653064">Den ansvariga (<ph name="CUSTODIAN_EMAIL" />) kan se användning och historik på chrome.com.</translation>
 <translation id="4707579418881001319">L2TP/IPSec + användarcertifikat</translation>
 <translation id="4707934200082538898">Fler anvisningar finns bland dina e-postmeddelanden på <ph name="BEGIN_BOLD" /><ph name="MANAGER_EMAIL" /><ph name="END_BOLD" />.</translation>
@@ -2709,6 +2770,7 @@
 <translation id="4744574733485822359">Nedladdningen har slutförts</translation>
 <translation id="4746971725921104503">Det verkar som att du redan hanterar en användare med det namnet. Ville du <ph name="LINK_START" />importera <ph name="USER_DISPLAY_NAME" /> till den här enheten<ph name="LINK_END" />?</translation>
 <translation id="4747271164117300400">makedonska</translation>
+<translation id="4748762018725435655">Ett tillägg från Chrome Web Store krävs</translation>
 <translation id="4749157430980974800">Georgiskt tangentbord</translation>
 <translation id="4750394297954878236">Förslag</translation>
 <translation id="475088594373173692">Första användare</translation>
@@ -2722,6 +2784,7 @@
 <translation id="4763830802490665879">Cookies från flera webbplatser kommer att rensas vid avslut.</translation>
 <translation id="4764029864566166446">Uppdatera pluginprogrammet ...</translation>
 <translation id="4764865176798926079">Huvudramens DOMContentLoaded och alla inlästa resurser som startades innan domContentLoaded (iframes ignoreras).</translation>
+<translation id="4768332406694066911">Du har certifikat från dessa organisationer som identifierar dig</translation>
 <translation id="4768698601728450387">Beskär bild</translation>
 <translation id="4773696473262035477">Du kan komma åt det och alla dina <ph name="SAVED_PASSWORDS_LINK" /> från valfri webbläsare.</translation>
 <translation id="4776917500594043016">Lösenord för <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -2739,10 +2802,12 @@
 <translation id="4793866834012505469">Trimma om röstmodellen</translation>
 <translation id="479536056609751218">Webbsida, endast HTML</translation>
 <translation id="479989351350248267">sök</translation>
+<translation id="480036413855787547">Kom åt lösenorden från alla enheter via <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />. På Mac-datorer kan lösenord sparas i Nyckelhanterare, och andra Chrome-användare som delar det här OS X-kontot kan komma åt eller synkronisera det.</translation>
 <translation id="4801257000660565496">Skapa programgenvägar</translation>
 <translation id="4801448226354548035">Dölj konton</translation>
 <translation id="4801512016965057443">Tillåt mobil dataroaming</translation>
 <translation id="4801956050125744859">Behåll båda</translation>
+<translation id="4803121606678474433">Aktivera lägesbyte för dynamisk rendering av 2D-kanvas.</translation>
 <translation id="4803909571878637176">Avinstallera</translation>
 <translation id="4804331037112292643">Dialogruta för att öppna och spara filer</translation>
 <translation id="4804818685124855865">Koppla från</translation>
@@ -2761,6 +2826,7 @@
 <translation id="4824518112777153488">Stöd för pekskärmar som känner av om du håller fingret alldeles ovanför skärmen</translation>
 <translation id="4827948050554950725">Lägg till ett kreditkort</translation>
 <translation id="4828493911650550108">Förbättra platsens exakthet genom att tillåta att appar och tjänster söker efter Wi-Fi-nätverk och Bluetooth-enheter.</translation>
+<translation id="4828937774870308359">Australiensisk</translation>
 <translation id="4830573902900904548">Din <ph name="DEVICE_TYPE" /> kan inte ansluta till internet med <ph name="NETWORK_NAME" />. Välj ett annat nätverk. <ph name="LEARN_MORE_LINK_START" />Läs mer<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Identiteten för <ph name="ORGANIZATION" /> på <ph name="LOCALITY" /> har verifierats av<ph name="ISSUER" />. Giltiga certifikattransparensuppgifter skickades från servern.</translation>
 <translation id="4834912470034578916">Aktivera anpassade layouter för webbaviseringar.</translation>
@@ -2779,6 +2845,7 @@
 <translation id="4849517651082200438">Installera inte</translation>
 <translation id="4850258771229959924">Visa i utvecklarverktygen</translation>
 <translation id="4850458635498951714">Lägg till en enhet</translation>
+<translation id="4850669014075537160">Rullning</translation>
 <translation id="4850886885716139402">Visa</translation>
 <translation id="4853020600495124913">Öppna i &amp;nytt fönster</translation>
 <translation id="485316830061041779">tyska</translation>
@@ -2826,6 +2893,7 @@
 <translation id="4903369323166982260">Kör Chrome Cleanup Tool</translation>
 <translation id="4906679076183257864">Återställ standardvärden</translation>
 <translation id="4907125798206348918">Svagt MemoryCache.</translation>
+<translation id="4907306957610201395">Behörighetskategori</translation>
 <translation id="49088176676474409">Dölj VPD-värden.</translation>
 <translation id="4910021444507283344">WebGL</translation>
 <translation id="4910673011243110136">Privata nätverk</translation>
@@ -2852,6 +2920,7 @@
 <translation id="4938972461544498524">Inställningar för styrplatta</translation>
 <translation id="4940047036413029306">Citat</translation>
 <translation id="4941246025622441835">Använd den här enhetsanmälan när enheten upptas för företagshantering:</translation>
+<translation id="4941627891654116707">Teckenstorlek</translation>
 <translation id="4942394808693235155">Sök efter och installera uppdateringar</translation>
 <translation id="494286511941020793">Hjälp för proxykonfiguration</translation>
 <translation id="4950138595962845479">Alternativ...</translation>
@@ -2862,6 +2931,7 @@
 <translation id="4956847150856741762">1</translation>
 <translation id="495931528404527476">I Chrome</translation>
 <translation id="496226124210045887">Mappen som du valde innehåller känsliga filer. Är du säker på att du vill bevilja $1 permanent läsåtkomst till mappen?</translation>
+<translation id="4964455510556214366">Ordning</translation>
 <translation id="4964673849688379040">Kontrollerar …</translation>
 <translation id="4966802378343010715">Skapa en ny användare</translation>
 <translation id="4967749818080339523">Välj ett konto</translation>
@@ -2986,6 +3056,7 @@
 <translation id="5144820558584035333">Hangul 3 Set (390)</translation>
 <translation id="5145331109270917438">Ändrad den</translation>
 <translation id="5146631943508592569">Inaktivera avisering om enhetens nedläggning.</translation>
+<translation id="5147113189823897615">Eftersom det här kontot hanteras av <ph name="DOMAIN" /> rensas bokmärken, historik, lösenord och andra inställningar från enheten. Din data fortsätter dock att lagras i Google-kontot.</translation>
 <translation id="5147237161038757796">Autokorrigering för fysiskt tangentbord</translation>
 <translation id="5148320352496581610">Vid rektangelbaserad inriktning används en heuristisk metod för att identifiera det mest sannolika målet för en rörelse där tryckområdet motsvaras av en rektangel.</translation>
 <translation id="5150254825601720210">SSL-servernamn för Netscape-certifikat</translation>
@@ -3022,6 +3093,7 @@
 <translation id="5181140330217080051">Nedladdning</translation>
 <translation id="5182671122927417841">Inaktivera tillägg</translation>
 <translation id="5184063094292164363">&amp;JavaScript-konsol</translation>
+<translation id="5184662919967270437">Enheten uppdateras</translation>
 <translation id="5185386675596372454">Den senaste versionen av <ph name="EXTENSION_NAME" /> har inaktiverats eftersom ytterligare rättigheter krävs.</translation>
 <translation id="5185403602014064051">Med den här funktionen kan du snabbt öppna en inloggad användare utan att behöva ange lösenordet.</translation>
 <translation id="5186650237607254032">Uppdatera mobilens skärmlås så att det inaktiveras när du är i närheten. Du låser upp mobilen snabbare och får en bättre upplevelse av Smart Lock på <ph name="DEVICE_TYPE" />.</translation>
@@ -3033,6 +3105,7 @@
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5197680270886368025">Synkroniseringen har slutförts.</translation>
 <translation id="5204967432542742771">Ange lösenord</translation>
+<translation id="5206215183583316675">Vill du radera <ph name="CERTIFICATE_NAME" />?</translation>
 <translation id="520621735928254154">Fel vid import av certifikat</translation>
 <translation id="5208988882104884956">Halvbreda</translation>
 <translation id="5209320130288484488">Det gick inte att hitta några enheter</translation>
@@ -3050,6 +3123,7 @@
 <translation id="5227808808023563348">Hitta föregående text</translation>
 <translation id="5228076606934445476">Det är något fel på enheten. Du måste starta om den och försöka igen.</translation>
 <translation id="5228962187251412618">Endast onlinekontroll</translation>
+<translation id="5229189185761556138">Hantera inmatningsmetoder</translation>
 <translation id="5229622432348746578">Inaktivera ljud för delat skrivbord</translation>
 <translation id="5230516054153933099">Fönster</translation>
 <translation id="5232178406098309195">När du använder kommandon för ljudaktivering, till exempel ”Ok Google” eller trycker på en mikrofonikon, sparas vissa röstinspelningar och andra ljud i din privata röst- och ljudaktivitet i kontot. En inspelning av följande röster/ljud samt ett par sekunder före sparas.</translation>
@@ -3229,7 +3303,6 @@
 <translation id="5439568486246921931">Användarens nedladdade filer, offlinefiler och webbinformation raderas permanent. Det går inte att ångra åtgärden.</translation>
 <translation id="544083962418256601">Skapa genvägar ...</translation>
 <translation id="5441100684135434593">Kabelanslutet nätverk</translation>
-<translation id="5445088910157062298">Låt appar ta hjälp av Googles platstjänst för att hitta din plats snabbt och exakt, och minska därmed batteriförbrukningen. Anonyma platsuppgifter skickas till Google, även om inga appar körs.</translation>
 <translation id="5448293924669608770">Det uppstod problem vid inloggningen</translation>
 <translation id="5449588825071916739">Lägg till bokmärke på alla flikar ...</translation>
 <translation id="5449716055534515760">Stäng fön&amp;ster</translation>
@@ -3392,6 +3465,7 @@
 <translation id="5675224880872496917">Animera smidigt när du rullar sidans innehåll.</translation>
 <translation id="5676267133227121599">Få tillgång till dina lösenord från alla enheter på <ph name="MANAGEMENT_LINK" />.</translation>
 <translation id="5677503058916217575">Sidans språk:</translation>
+<translation id="5677850799565527075">Blockera cookies från tredje part.</translation>
 <translation id="5677928146339483299">Blockerad</translation>
 <translation id="5678550637669481956">Läs- och skrivåtkomst till <ph name="VOLUME_NAME" /> har beviljats.</translation>
 <translation id="567881659373499783">Version <ph name="PRODUCT_VERSION" /></translation>
@@ -3421,6 +3495,7 @@
 <translation id="5711983031544731014">Det går inte att låsa upp. Ange ditt lösenord.</translation>
 <translation id="5712966208980506909">När detta alternativ är aktiverat kan principsidan för Material Design öppnas på webbadressen chrome://md-policy.</translation>
 <translation id="5715711091495208045">Agent för pluginprogram: <ph name="PLUGIN_NAME" /></translation>
+<translation id="5719603411793408026">Standardsökmotorer</translation>
 <translation id="572328651809341494">Senaste flikarna</translation>
 <translation id="5723508132121499792">Inga bakgrundsprogram körs</translation>
 <translation id="5725124651280963564">Logga in på <ph name="TOKEN_NAME" /> om du vill skapa en nyckel för <ph name="HOST_NAME" />.</translation>
@@ -3428,14 +3503,18 @@
 <translation id="572525680133754531">En ram ritas runt sammansatta renderingslager i syfte att underlätta felsökning och undersökning av lagersammansättning.</translation>
 <translation id="5726521882516480114">Aktiverar rendering av 2D-canvas på grafikkortet i stället för rendering med programvara.</translation>
 <translation id="5727728807527375859">Tillägg, program och teman kan skada din dator. Vill du fortsätta?</translation>
+<translation id="5727970983344022445">Tillåt inga webbplatser att använda nyckelgenerering i formulär</translation>
 <translation id="5729712731028706266">&amp;Visa</translation>
 <translation id="5729996640881880439">Det går tyvärr inte att visa koden för felet.</translation>
 <translation id="5731247495086897348">Kl&amp;istra in och öppna</translation>
 <translation id="5731751937436428514">Vietnamesisk inmatningsmetod (VIQR)</translation>
 <translation id="5732790216998904518">Redigering av Office-filer i Dokument, Kalkylark och Presentationer i testsyfte.</translation>
 <translation id="5734362860645681824">Kommunikation</translation>
+<translation id="5739458112391494395">Mycket stor</translation>
+<translation id="5740331643563157105"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /> och <ph name="NUM_ADDITIONAL_LANGUAGES" /> till</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: välj för att redigera</translation>
 <translation id="5741454054957165976">Aktivera den nya versionen av Åtgärd från användaragent för inläsning av WebFonts.</translation>
+<translation id="5742598604154146709">Tillåt inte att någon webbplats laddar ned flera filer automatiskt.</translation>
 <translation id="574392208103952083">Medium</translation>
 <translation id="5744368829843057748">Användargränssnitt för Översätt 2016Q2</translation>
 <translation id="5745056705311424885">Ett USB-minne har upptäckts</translation>
@@ -3619,6 +3698,7 @@
 <translation id="5996258716334177896">Det gick inte att öppna din profil ordentligt.
 
       Vissa funktioner är eventuellt inte tillgängliga. Kontrollera att profilen finns och att du har behörighet att läsa och skriva till profilens innehåll.</translation>
+<translation id="6001799583597751002">Pinkoderna matchar inte varandra:</translation>
 <translation id="6003177993629630467"><ph name="PRODUCT_NAME" /> kanske inte kan uppdateras automatiskt.</translation>
 <translation id="6003294706906016758">Aktiverar ram av webbappstyp för webbserverappar</translation>
 <translation id="600424552813877586">Ogiltig app.</translation>
@@ -3644,6 +3724,7 @@
 <translation id="604001903249547235">Säkerhetskopiering i molnet</translation>
 <translation id="6040143037577758943">Stäng</translation>
 <translation id="604124094241169006">Automatisk</translation>
+<translation id="6041935588605837913">10</translation>
 <translation id="6042308850641462728">Mer</translation>
 <translation id="604257181445267932">Med Smart Lock kan du snabbt logga in i appar och på webbplatser med lösenord som du har sparat hos Google.</translation>
 <translation id="6043317578411397101"><ph name="APP_NAME" /> delar en Chrome-flik med <ph name="TAB_NAME" />.</translation>
@@ -3663,6 +3744,7 @@
 <translation id="6062697480277116433">Du använder mobildata</translation>
 <translation id="6065289257230303064">Attribut för certifikatämneskatalog</translation>
 <translation id="6071181508177083058">bekräfta lösenord</translation>
+<translation id="6073903501322152803">Lägg till tillgänglighetsfunktioner</translation>
 <translation id="6074825444536523002">Formulär från Google</translation>
 <translation id="6075731018162044558">Hoppsan! Det gick inte att komma åt någon långsiktig API-åtkomsttoken för den här enheten.</translation>
 <translation id="6075880972317537864">Det kan hända att angripare på <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> försöker lura dig för att stjäla dina uppgifter (t.ex. lösenord, meddelanden eller kreditkort).</translation>
@@ -3697,7 +3779,6 @@
 <translation id="6110466548232134880">Identiteten för <ph name="ORGANIZATION" /> på <ph name="LOCALITY" /> har verifierats av <ph name="ISSUER" />. Inga certifikattransparensuppgifter skickades från servern.</translation>
 <translation id="6111770213269631447">Translitterering (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Tillåts som standard</translation>
-<translation id="6112929985131461002">Diagnostik- och användningsdata skickas automatiskt till Google från den här enheten. Administratören har låst <ph name="BEGIN_LINK1" />inställningen<ph name="END_LINK1" />. <ph name="BEGIN_LINK2" />Läs mer<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Ändra språk- och inmatningsinställningar</translation>
 <translation id="6120205520491252677">Fäst den här sidan på startskärmen ...</translation>
 <translation id="6122081475643980456">Din internetanslutning kontrolleras</translation>
@@ -3719,8 +3800,10 @@
 <translation id="6143186082490678276">Få hjälp</translation>
 <translation id="6144697279259829572">{NUM_ITEMS,plural, =1{Det här innebär att minst $1 objekt raderas permanent från den här enheten.}other{Det här innebär att minst $1 objekt raderas permanent från den här enheten.}}</translation>
 <translation id="6144890426075165477"><ph name="PRODUCT_NAME" /> är för närvarande inte din standardwebbläsare.</translation>
+<translation id="6145860855437952742">Högsta antal förhandsgranskningsfönster i översiktsläget som kan dölja fönsterrubriker med hjälp av maskering och använda rundade hörn.</translation>
 <translation id="6147020289383635445">Förhandsgranskning misslyckades.</translation>
 <translation id="614998064310228828">Enhetsmodell:</translation>
+<translation id="6150555451039504280">Förminska/expandera</translation>
 <translation id="6150853954427645995">Om du vill spara filen för användning offline ansluter du till internet igen, högerklickar på filen och väljer sedan alternativet <ph name="OFFLINE_CHECKBOX_NAME" />.</translation>
 <translation id="6151323131516309312">Tryck på <ph name="SEARCH_KEY" /> för att söka i <ph name="SITE_NAME" /></translation>
 <translation id="6154697846084421647">Inloggad</translation>
@@ -3818,6 +3901,7 @@
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Ny skrivare i nätverket}other{Nya skrivare i nätverket}}</translation>
 <translation id="6285395082104474418">I statusfältet visas aktuell status för bland annat nätverk och batteri.</translation>
 <translation id="6286684120317096255">Dataanvändningen mäts</translation>
+<translation id="6286708577777130801">Sparad lösenordsinformation</translation>
 <translation id="6287852322318138013">Välj en app om du vill öppna filen</translation>
 <translation id="6288919040208869552">Om en proxyserver har konfigurerats förhindras ofta auktorisering på olika infångstportaler. Med det här alternativet öppnas dialogrutan för auktorisering på infångstportaler i ett separat fönster vilket förbigår proxyinställningarna.</translation>
 <translation id="6290556621549272952">Du kan använda funktionen för att visa innehåll från Chromium på TV:n eller andra enheter.</translation>
@@ -3859,6 +3943,7 @@
 <translation id="6353618411602605519">Kroatiskt tangentbord</translation>
 <translation id="6356936121715252359">Lagringsinställningar för Adobe Flash Player...</translation>
 <translation id="6357619544108132570">Välkommen till <ph name="SHORT_PRODUCT_NAME" />-familjen. Det här är inte vilken dator som helst.</translation>
+<translation id="63617602971594377">Aktivera API:et för betalningar på webben</translation>
 <translation id="6361850914223837199">Information om felet:</translation>
 <translation id="6362853299801475928">&amp;Rapportera ett problem...</translation>
 <translation id="636343209757971102">IPv6-adress:</translation>
@@ -3894,6 +3979,7 @@
 <translation id="6410063390789552572">Det går inte att öppna nätverksbiblioteket</translation>
 <translation id="6410257289063177456">Bildfiler</translation>
 <translation id="6410328738210026208">Byt kanal och Powerwash</translation>
+<translation id="6410668567036790476">Lägg till sökmotor</translation>
 <translation id="641105183165925463">$1 MB</translation>
 <translation id="6412931879992742813">Nytt inkognitofönster</translation>
 <translation id="6418160186546245112">Återgå till den tidigare installerade versionen av <ph name="IDS_SHORT_PRODUCT_NAME" /></translation>
@@ -3926,14 +4012,15 @@
 <translation id="6443783728907198276">När funktionen är aktiverad innehåller STUN-meddelanden som genereras av WebRTC Origin-huvudfältet.</translation>
 <translation id="6444070574980481588">Ange datum och tid</translation>
 <translation id="6445450263907939268">Om du inte vill ha dessa ändringar kan du återställa dina tidigare inställningar.</translation>
+<translation id="6447388538018752757">Aktiverar pipelinebyte för dynamisk bildrendering på 2D-kanvas för prestandaoptimering utifrån vilka teckningsåtgärder som anropas.</translation>
 <translation id="6447842834002726250">Cookies</translation>
 <translation id="6449285849137521213">Appen <ph name="EXTENSION_NAME" /> har lagts till.</translation>
 <translation id="6450876761651513209">Ändra sekretessrelaterade inställningar</translation>
+<translation id="6451180435462401570">Hantera enheter för molnutskrift</translation>
 <translation id="6451650035642342749">Rensa inställningar för automatisk öppning</translation>
 <translation id="6452181791372256707">Avvisa</translation>
 <translation id="6454421252317455908">Kinesisk inmatningsmetod (snabb)</translation>
 <translation id="6455348477571378046">Certifikattyp:</translation>
-<translation id="6456234919706689841">Administratören kan ange att diagnostik- och användningsdata om den här enheten ska skickas till Google. <ph name="BEGIN_LINK1" />Inställningen<ph name="END_LINK1" /> visas här. <ph name="BEGIN_LINK2" />Läs mer<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Fortsätt blockera JavaScript</translation>
 <translation id="6458308652667395253">Hantera blockering av JavaScript...</translation>
 <translation id="6459488832681039634">Använd markering för sökning</translation>
@@ -3987,10 +4074,12 @@
 <translation id="6526654154229718724">Ett experimentellt helskärmsläge med tangentbordslås som kräver att användare trycker länge på Esc om de vill avsluta läget.</translation>
 <translation id="6527303717912515753">Dela</translation>
 <translation id="6528546217685656218">Det här klientcertifikatets privata nyckel saknas eller är tom.</translation>
+<translation id="652948702951888897">Chrome-historik</translation>
 <translation id="653019979737152879">Synkroniserar <ph name="FILE_NAME" /> ...</translation>
 <translation id="6534583978616527129">Initiera anslutningen</translation>
 <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Obs!<ph name="END_BOLD" /> Aktivera endast om du vet vad du gör eller om du har blivit ombedd att göra det eftersom insamling av data kan försämra resultatet.</translation>
 <translation id="654233263479157500">Åtgärda navigeringsfel med hjälp av en webbtjänst</translation>
+<translation id="6545665334409411530">Upprepningsintervall</translation>
 <translation id="6545834809683560467">Använd en förslagstjänst om du vill ha hjälp att slutföra sökningar och fylla i webbadresser i adressfältet eller i sökrutan i startprogrammet för appar</translation>
 <translation id="6546686722964485737">Anslut till WiMAX-nätverk</translation>
 <translation id="6547316139431024316">Varna inte för det här tillägget fler gånger</translation>
@@ -4061,9 +4150,11 @@
 <translation id="6643016212128521049">Rensa</translation>
 <translation id="6644756108386233011">Har återställningen ändrat inställningarna för <ph name="IDS_SHORT_PRODUCT_NAME" />?</translation>
 <translation id="6647228709620733774">Webbadress till Netscapes spärrlista för certifikatutfärdare</translation>
+<translation id="6647838571840953560">För närvarande på <ph name="CHANNEL_NAME" /></translation>
 <translation id="6649018507441623493">Ett ögonblick …</translation>
 <translation id="6649068951642910388">Användargränssnittet för att återställa sessioner visas i en bubbla i stället för i ett informationsfält.</translation>
 <translation id="665061930738760572">Öppna i &amp;nytt fönster</translation>
+<translation id="6651237644330755633">Lita på detta certifikat för identifiering av webbplatser</translation>
 <translation id="6652975592920847366">Skapa återställningsmedia för operativsystemet</translation>
 <translation id="6653525630739667879">Det går inte att spara i $1. Ändringarna sparas i $2 i mappen Nedladdningar.</translation>
 <translation id="6655190889273724601">Programmerarläge</translation>
@@ -4118,6 +4209,7 @@
 <translation id="6725970970008349185">Antal kandidater som ska visas per sida</translation>
 <translation id="672609503628871915">Kolla nyheterna</translation>
 <translation id="6727005317916125192">Föregående ruta</translation>
+<translation id="6727842159866499206">Högsta antal förhandsgranskningsfönster i översiktsläget som kan dölja fönsterrubriker med hjälp av former.</translation>
 <translation id="6731320427842222405">Det kan ta några minuter</translation>
 <translation id="6731638353631257659">V8-cacheläge.</translation>
 <translation id="6732586201820838268">Det gick inte att upprätta någon anslutning till mobilen. Använd en kompatibel Android-mobil som är på och finns på armlängds avstånd. &lt;a&gt;Läs mer&lt;/a&gt;</translation>
@@ -4143,6 +4235,7 @@
 <translation id="6769712124046837540">Lägger till skrivare ...</translation>
 <translation id="6771503742377376720">Är en certifikatutfärdare</translation>
 <translation id="6773575010135450071">Fler åtgärder ...</translation>
+<translation id="677965093459947883">Mycket liten</translation>
 <translation id="6780439250949340171">hantera andra inställningar</translation>
 <translation id="6786747875388722282">Tillägg</translation>
 <translation id="6787839852456839824">Kortkommandon</translation>
@@ -4166,6 +4259,7 @@
 <translation id="6815353853907306610"><ph name="IDS_SHORT_PRODUCT_NAME" /> upptäckte att webbläsarinställningarna kan ha ändrats utan din vetskap. Vill du återställa de ursprungliga standardinställningarna?</translation>
 <translation id="6815551780062710681">redigera</translation>
 <translation id="6817358880000653228">Lösenord som har sparats för den här webbplatsen:</translation>
+<translation id="6820008762872335722">Återställ till fråga</translation>
 <translation id="6820687829547641339">Gzip-komprimerat tar-arkiv</translation>
 <translation id="682123305478866682">Casta skrivbordet</translation>
 <translation id="6823506025919456619">Du måste logga in i Chrome för att kunna visa dina enheter</translation>
@@ -4185,7 +4279,9 @@
 <translation id="6833901631330113163">Sydeuropeiskt</translation>
 <translation id="683526731807555621">Lägg till en ny sökmotor</translation>
 <translation id="6835762382653651563">Anslut till internet om du vill uppdatera din <ph name="DEVICE_TYPE" />.</translation>
+<translation id="6839158130869314728">Spegla skärmar</translation>
 <translation id="6839225236531462745">Fel vid borttagning av certifikat</translation>
+<translation id="6840155290835956714">Fråga innan något skickas</translation>
 <translation id="6840184929775541289">Är inte en certifikatutfärdare</translation>
 <translation id="6840313690797192085">$1 PB</translation>
 <translation id="6841186874966388268">Fel</translation>
@@ -4195,6 +4291,7 @@
 <translation id="6847758263950452722">Spara sidan som MHTML</translation>
 <translation id="6853388645642883916">Uppdateringstjänsten är i viloläge</translation>
 <translation id="68541483639528434">Stäng andra flikar</translation>
+<translation id="6855099371444560844">Lägg till en enhet</translation>
 <translation id="6856701878604560493">Aktivera offline-bokmärken</translation>
 <translation id="6860097299815761905">Proxyinställningar...</translation>
 <translation id="6860427144121307915">Öppna i en flik</translation>
@@ -4275,11 +4372,13 @@
 <translation id="6980462514016882061">Google kan anpassa Sök, annonser och andra Google-tjänster utifrån webbhistoriken.</translation>
 <translation id="6980956047710795611">Migrera alla Chrome OS-uppgifter till det nya lösenordet (tidigare lösenord krävs)</translation>
 <translation id="6981982820502123353">Tillgänglighet</translation>
+<translation id="6981992744085917617">Välj den metod du vill använda för att logga in i kontot igen:</translation>
 <translation id="6982896539684144327">Skrivare från <ph name="VENDOR_NAME" /> har identifierats</translation>
 <translation id="6983783921975806247">Registrerat OID</translation>
 <translation id="6983991971286645866">Alla ändringar sparas i $1.</translation>
 <translation id="6985235333261347343">Microsofts nyckelåterställningsagent</translation>
 <translation id="6985276906761169321">ID:</translation>
+<translation id="6985607387932385770">Skrivare</translation>
 <translation id="6986605181115043220">Hoppsan, synkroniseringen har slutat fungera. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation>
 <translation id="6989294135336900804">Inga synkroniserade flikar</translation>
 <translation id="6990081529015358884">Du har slut på utrymme</translation>
@@ -4302,6 +4401,7 @@
 <translation id="7006844981395428048">$1-ljud</translation>
 <translation id="7008270479623533562">Du måste uppdatera sidan om du vill köra tillägget. Du kan köra tillägget automatiskt på den här webbplatsen genom att högerklicka på tilläggsikonen.</translation>
 <translation id="7009045250432250765">Autofyll med ett enda klick</translation>
+<translation id="7009420427128923703">Högsta antal fönster i översikten som kan använda maskering.</translation>
 <translation id="7010160495478792664">Maskinvaruaccelererad videoavkodning där möjlighet finns.</translation>
 <translation id="7010400591230614821">Aggressiv avlastningsstrategi för flikar</translation>
 <translation id="701080569351381435">Visa källa</translation>
@@ -4345,6 +4445,7 @@
 <translation id="7061692898138851896">Spara lösenord automatiskt</translation>
 <translation id="7062222374113411376">Tillåt webbplatser som nyligen har stängts att slutföra överföringen av data (rekommenderas)</translation>
 <translation id="7063129466199351735">Genvägarna behandlas …</translation>
+<translation id="7063957500469387217">Konfigurera eller hantera skrivare i Google Cloud Print.</translation>
 <translation id="7065223852455347715">Enheten är låst i ett läge som förhindrar företagsregistrering. Om du vill registrera enheten måste du först återställa den.</translation>
 <translation id="7065534935986314333">Om systemet</translation>
 <translation id="7066944511817949584">Det gick inte att ansluta till <ph name="DEVICE_NAME" />.</translation>
@@ -4407,6 +4508,7 @@
 <translation id="715118844758971915">Vanliga skrivare</translation>
 <translation id="7154130902455071009">Ändra startsida till: <ph name="START_PAGE" /></translation>
 <translation id="715487527529576698">Det ursprungliga läget för kinesiska är förenklad kinesiska</translation>
+<translation id="7155171745945906037">Befintligt foto från kamera eller fil</translation>
 <translation id="715568033737470079">Ange vilka PPAPI-pluginprogram som ska köras med sandlådeprincipen för låsning under Win32k (endast Windows 10 och senare).</translation>
 <translation id="7156235233373189579">Den här filen är avsedd för en PC med Windows. Den är inte kompatibel med Chrome OS, det operativsystem som körs på din enhet. Sök på <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> efter en lämplig app att använda i stället.<ph name="BEGIN_LINK_HELP" />Läs mer<ph name="END_LINK_HELP" /></translation>
 <translation id="7157063064925785854">Genom att klicka på Fortsätt godkänner du <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> och <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation>
@@ -4423,6 +4525,7 @@
 <translation id="7175353351958621980">Överförd från:</translation>
 <translation id="7180611975245234373">Uppdatera</translation>
 <translation id="7180865173735832675">Anpassa</translation>
+<translation id="7185078796915954712">TLS 1.3</translation>
 <translation id="7185690883425432021">Döljer stängningsknappen på inaktiva flikar när de är staplade.</translation>
 <translation id="7186088072322679094">Spara i verktygsfältet</translation>
 <translation id="719009910964971313">Dvorak-tangentbord för programmerare i USA</translation>
@@ -4462,6 +4565,8 @@
 <translation id="7240120331469437312">Certifikatämnets andra namn</translation>
 <translation id="7241389281993241388">Logga in på <ph name="TOKEN_NAME" /> om du vill importera klientcertifikatet.</translation>
 <translation id="7243055093079293866">Säg ”Ok Google” på en ny flik och google.com</translation>
+<translation id="7243632151880336635">Rensa och logga ut</translation>
+<translation id="7245628041916450754"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (bäst)</translation>
 <translation id="724691107663265825">Det förekommer skadlig programvara på följande sida</translation>
 <translation id="725109152065019550">Administratören har inaktiverat extern lagring för ditt konto.</translation>
 <translation id="7252661675567922360">Läs inte in</translation>
@@ -4475,7 +4580,9 @@
 <translation id="7262004276116528033">Inloggningstjänsten tillhandahålls av <ph name="SAML_DOMAIN" />.</translation>
 <translation id="7262221505565121">Undantag från åtkomstbehörighet för plugin som inte körs i sandlåda</translation>
 <translation id="7264275118036872269">Det gick inte att starta identifiering av Bluetooth-enheter.</translation>
+<translation id="7264454014834869122">Välj från Chrome Web Store</translation>
 <translation id="726502072182862130">Profilnamn och ikon för Google</translation>
+<translation id="7267186368513450821">5</translation>
 <translation id="7268365133021434339">Stäng flikar</translation>
 <translation id="7268659760406822741">Tillgängliga tjänster</translation>
 <translation id="7273110280511444812">senast ansluten den <ph name="DATE" /></translation>
@@ -4492,6 +4599,7 @@
 <translation id="7287143125007575591">Åtkomst nekad.</translation>
 <translation id="7288592446024861651">Bokmärken, historik, lösenord och andra inställningar synkroniseras med ditt Google-konto så att du kan använda dem på alla enheter. Du kan styra vad som synkroniseras på <ph name="BEGIN_LINK" /></translation>
 <translation id="7288676996127329262"><ph name="HORIZONTAL_DPI" />x<ph name="VERTICAL_DPI" /> dpi</translation>
+<translation id="7289225569524511578">Öppna bakgrundsappen</translation>
 <translation id="7290242001003353852">Inloggningstjänsten som tillhandahålls av <ph name="SAML_DOMAIN" /> använder din kamera.</translation>
 <translation id="7290594223351252791">Bekräfta registrering</translation>
 <translation id="7295019613773647480">Aktivera övervakade användare</translation>
@@ -4530,6 +4638,7 @@
 <translation id="7347751611463936647">Om du vill använda det här tillägget skriver du ”<ph name="EXTENSION_KEYWORD" />”, trycker på tabbtangenten och anger kommandot eller sökningen.</translation>
 <translation id="7348093485538360975">Skärmtangentbord</translation>
 <translation id="7348749398828259943">Internationellt Workman-tangentbord för USA</translation>
+<translation id="7352495173098919663">Redigera</translation>
 <translation id="7352651011704765696">Något gick fel</translation>
 <translation id="7353651168734309780"><ph name="EXTENSION_NAME" /> kräver nya behörigheter</translation>
 <translation id="7361039089383199231">$1 byte</translation>
@@ -4640,6 +4749,7 @@
 <translation id="749028671485790643">Person <ph name="VALUE" /></translation>
 <translation id="7491962110804786152">tabb</translation>
 <translation id="7493386493263658176">Tillägget <ph name="EXTENSION_NAME" /> kan samla in all text du skriver, inklusive personlig information som lösenord och kreditkortsnummer. Vill du fortsätta att använda tillägget?</translation>
+<translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="7495424355577885780">När detta alternativ är aktiverat öppnas gränssnittet för Material Design-feedback.</translation>
 <translation id="7495778526395737099">Har du glömt ditt gamla lösenord?</translation>
 <translation id="7503191893372251637">Certifieringstyp för Netscape</translation>
@@ -4711,7 +4821,6 @@
 <translation id="7587108133605326224">Baltiskt</translation>
 <translation id="7589461650300748890">Ta det försiktigt.</translation>
 <translation id="7589661784326793847">Ett ögonblick</translation>
-<translation id="7593635197364225277">Säkerhetskopiera och återställ data i appar från Play på Google Drive. Du kan när som helst ändra detta i Android-inställningarna. <ph name="BEGIN_LINK1" />Läs mer<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (felkod <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Okej, importera</translation>
 <translation id="7600965453749440009">Översätt aldrig från <ph name="LANGUAGE" /></translation>
@@ -4757,6 +4866,7 @@
 <translation id="7654941827281939388">Kontot används redan på den här datorn.</translation>
 <translation id="7658239707568436148">Avbryt</translation>
 <translation id="7659584679870740384">Du har inte behörighet att använda den här enheten. Kontakta administratören om du vill ha behörighet att logga in.</translation>
+<translation id="7661259717474717992">Tillåt att webbplatser sparar och läser data i cookies</translation>
 <translation id="7663719505383602579">Mottagare: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7664620655576155379">Bluetooth-enhet som inte stöds: <ph name="DEVICE_NAME" />.</translation>
 <translation id="7665369617277396874">Lägg till konto</translation>
@@ -4786,6 +4896,7 @@
 <translation id="7709152031285164251">Misslyckades – <ph name="INTERRUPT_REASON" /></translation>
 <translation id="7709980197120276510">Genom att klicka på Fortsätt godkänner du <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" />, <ph name="LEGAL_DOC_LINK_TEXT_4" /> och <ph name="LEGAL_DOC_LINK_TEXT_5" />.</translation>
 <translation id="7712140766624186755">Frågar på grund av policy</translation>
+<translation id="7712196439824268605">Pinkoden är lätt att gissa:</translation>
 <translation id="7713320380037170544">Tillåt att alla webbplatser använder systemexklusiva meddelanden för att komma åt MIDI-enheter</translation>
 <translation id="7714464543167945231">Certifikat</translation>
 <translation id="7716020873543636594">Klicka automatiskt när muspekaren stannar</translation>
@@ -4793,6 +4904,8 @@
 <translation id="7716781361494605745">Webbadress till Netscapes princip för certifikatutfärdare</translation>
 <translation id="7716970641886237992">Ändrades av</translation>
 <translation id="7717014941119698257">Nedladdning: <ph name="STATUS" /></translation>
+<translation id="7717845620320228976">Sök efter uppdateringar</translation>
+<translation id="7719367874908701697">Sidzoom</translation>
 <translation id="7719421816612904796">Tidsgräns för utbildning uppnådd</translation>
 <translation id="771953673318695590">Kvalitetssäkring</translation>
 <translation id="7720375555307821262">Om du vill bevaka personen <ph name="BEGIN_LINK" />loggar du in i Chrome<ph name="END_LINK" />.</translation>
@@ -4805,6 +4918,7 @@
 <translation id="7742762435724633909">Leverantörens namn:</translation>
 <translation id="774465434535803574">Fel på paketerat tillägg</translation>
 <translation id="7748528009589593815">Föregående flik</translation>
+<translation id="7748734060566306235">Ändra bildstorlek och justera bilden med piltangenterna.</translation>
 <translation id="7751260505918304024">Visa alla</translation>
 <translation id="7754704193130578113">Fråga var filerna ska sparas före nedladdning</translation>
 <translation id="775622227562445982">Snabb stängning av flikar/fönster</translation>
@@ -4841,6 +4955,7 @@
 <translation id="7791543448312431591">Lägg till</translation>
 <translation id="7792012425874949788">Något gick fel med inloggningen</translation>
 <translation id="7792388396321542707">Sluta dela</translation>
+<translation id="7792744925237334808">Hindra att webbplatser från tredje part sparar och läser cookiedata.</translation>
 <translation id="7794058097940213561">Formatera enhet</translation>
 <translation id="7799329977874311193">HTML-dokument</translation>
 <translation id="7800518121066352902">Rotera m&amp;oturs</translation>
@@ -4922,6 +5037,7 @@
 <translation id="7902482560616980555">Skalning av teckensnitt med FontCache</translation>
 <translation id="7903128267494448252">Ta bort personen</translation>
 <translation id="7903345046358933331">Sidan har slutat svara. Du kan vänta tills den svarar eller stänga den.</translation>
+<translation id="7903742244674067440">Du har sparade certifikat som identifierar dessa certifikatutfärdare</translation>
 <translation id="7903925330883316394">Verktyg: <ph name="UTILITY_TYPE" /></translation>
 <translation id="7903984238293908205">Katakana</translation>
 <translation id="7904094684485781019">Administratören för kontot tillåter inte multiinloggning.</translation>
@@ -4969,6 +5085,7 @@
 <translation id="7973320858902175766">Patchfunktion för komponenter</translation>
 <translation id="7974067550340408553">Få aviseringar på mobilen varje gång Smart Lock låser upp <ph name="DEVICE_TYPE" />.</translation>
 <translation id="7974566588408714340">Försök igen med <ph name="EXTENSIONNAME" /></translation>
+<translation id="7974936243149753750">Överskanning</translation>
 <translation id="7977551819349545646">Uppdaterar Chromebox ...</translation>
 <translation id="7978412674231730200">Privat nyckel</translation>
 <translation id="7979036127916589816">Synkroniseringsfel</translation>
@@ -5035,9 +5152,11 @@
 <translation id="8054563304616131773">Ange en giltig e-postadress</translation>
 <translation id="8054921503121346576">USB-tangentbord har anslutits</translation>
 <translation id="8056430285089645882">Visa inte det här igen.</translation>
+<translation id="8058655154417507695">Utgångsår</translation>
 <translation id="8059178146866384858">Det finns redan en fil som heter $1. Välj ett annat namn.</translation>
 <translation id="8059417245945632445">&amp;Inspektera enheter</translation>
 <translation id="8061298200659260393">Tillåt inga webbplatser att skicka push-meddelanden</translation>
+<translation id="8061820249063924643">Hantera kontrollerade användare</translation>
 <translation id="8063235345342641131">Grön standardavatar</translation>
 <translation id="8064671687106936412">Nyckel:</translation>
 <translation id="806705617346045388">Ovanligt beteende har upptäckts</translation>
@@ -5045,7 +5164,9 @@
 <translation id="8069615408251337349">Google Cloud Print</translation>
 <translation id="8071942001314758122">Säg bara ”Ok Google” tre gånger</translation>
 <translation id="8072988827236813198">Fäst flikar</translation>
+<translation id="8074127646604999664">Tillåt webbplatser som nyligen har stängts att slutföra överföringen av data</translation>
 <translation id="8079530767338315840">Upprepa</translation>
+<translation id="8081705606384362428">Välj pinkod:</translation>
 <translation id="8083739373364455075">Få 100 GB gratis med Google Drive</translation>
 <translation id="8088137642766812908">Se upp, funktionen kanske bits</translation>
 <translation id="8089520772729574115">mindre än 1 MB</translation>
@@ -5197,6 +5318,7 @@
 <translation id="827097179112817503">Visa knappen Startsida</translation>
 <translation id="8272443605911821513">Hantera dina tillägg genom att klicka på Tillägg i menyn Fler verktyg.</translation>
 <translation id="8275038454117074363">Importera</translation>
+<translation id="827606011343515871">Du har inga certifikat</translation>
 <translation id="8276560076771292512">Töm cacheminne och gör hård inläsning</translation>
 <translation id="8279388322240498158">Tangentbord på sorani/kurdiska och engelska</translation>
 <translation id="8280151743281770066">Armeniska (fonetiskt)</translation>
@@ -5217,7 +5339,6 @@
 <translation id="8300607741108698921">Konfigureras på en minut</translation>
 <translation id="8303650969500425356">Gör det möjligt att låsa skärmens riktning med JavaScript.</translation>
 <translation id="8303655282093186569">Inmatningsinställningar för pinyin</translation>
-<translation id="830424806940379275">Tillåt att tillägg skapar panelfönster som öppnas utanför webbläsarens ram. Som standard (eller om detta inte är aktiverat) öppnas ett popupfönster istället för en panel. Paneler i operativsystem för stationära datorer är föråldrade och tas snart bort.</translation>
 <translation id="8306534594034939679">Aktivera stöd för Alternativa tjänster, en experimentell HTTP-funktion.</translation>
 <translation id="8307376264102990850">Laddar ... beräknar tiden tills batteriet är fulladdat</translation>
 <translation id="8308179586020895837">Fråga om <ph name="HOST" /> vill använda din kamera</translation>
@@ -5241,9 +5362,11 @@
 <translation id="8337399713761067085">Du är för närvarande offline.</translation>
 <translation id="8338952601723052325">Webbplats för utvecklare</translation>
 <translation id="8339012082103782726">Tillåt inte att webbplatser använder mikrofonen</translation>
+<translation id="8339059274628563283">Lokalt lagrad data för <ph name="SITE" /></translation>
 <translation id="8342318071240498787">Det finns redan en fil eller en katalog med samma namn.</translation>
 <translation id="834457929814110454">Om du är medveten om säkerhetsriskerna kan du <ph name="BEGIN_LINK" />besöka den här osäkra webbplatsen<ph name="END_LINK" /> innan de skadliga programmen har tagits bort.</translation>
 <translation id="8345553596530559351">När detta alternativ är aktiverat öppnas historiksidan för Material Design på webbadressen chrome://history/.</translation>
+<translation id="8347045947573765315">Tillåt alla webbplatser att använda nyckelgenerering i formulär</translation>
 <translation id="8351419472474436977">Detta tillägg har tagit kontroll över dina proxyinställningar, vilket innebär att det kan ändra, knäcka eller tjuvlyssna på allt du gör på webben. Om du inte vet varför den här ändringen inträffade är den troligen inte önskvärd.</translation>
 <translation id="8352772353338965963">Lägg till ett konto för multiinloggning. Alla inloggade konton kan öppnas utan lösenord, så använd bara den här funktionen med konton du litar på.</translation>
 <translation id="8353683614194668312">Appen eller tillägget kan:</translation>
@@ -5328,15 +5451,20 @@
 <translation id="845627346958584683">Giltig till</translation>
 <translation id="8456681095658380701">Ogiltigt namn</translation>
 <translation id="8457625695411745683">bra</translation>
+<translation id="8460336040822756677">Om du inaktiverar Smart Lock för <ph name="DEVICE_TYPE" /> kan du inte låsa upp dina Chrome-enheter med mobilen. Du måste ange ditt lösenord.</translation>
+<translation id="84613761564611563">Nätverkskonfigurering av användargränssnitt har begärts. Vänta en stund …</translation>
 <translation id="8461914792118322307">Proxy</translation>
 <translation id="8463215747450521436">Den här övervakade användaren kan ha tagits bort eller inaktiverats av ansvarig hanterare. Kontakta hanteraren om du vill fortsätta att logga in som den här användaren.</translation>
 <translation id="8464132254133862871">Det här användarkontot kan inte väljas för denna tjänst.</translation>
 <translation id="8464505512337106916">Upptäck och kör viktigt plugin-innehåll (rekommenderas)</translation>
+<translation id="8465252176946159372">Inte giltig</translation>
 <translation id="8466234950814670489">Tar-arkiv</translation>
 <translation id="8467473010914675605">Koreansk inmatningsmetod</translation>
+<translation id="8468750959626135884">Lås upp <ph name="DEVICE_TYPE" /> med Android-mobilen.</translation>
 <translation id="8472623782143987204">maskinvarustödd</translation>
 <translation id="8475313423285172237">Ett annat program i datorn har lagt till ett tillägg som kan ändra hur Chrome fungerar.</translation>
 <translation id="8475647382427415476">Det gick inte att synkronisera <ph name="FILENAME" /> med Google Drive just nu. Ett nytt försök görs senare.</translation>
+<translation id="8476195663057048998">Rensa och återställ</translation>
 <translation id="8477241577829954800">Ersatt</translation>
 <translation id="8477384620836102176">&amp;Allmänt</translation>
 <translation id="8480417584335382321">Sidzoom:</translation>
@@ -5368,6 +5496,7 @@
 <translation id="8524066305376229396">Beständig lagring:</translation>
 <translation id="8525306231823319788">Helskärm</translation>
 <translation id="8528962588711550376">Inloggning sker</translation>
+<translation id="8532294913309524834">Sortera språk i prioriteringsordning.</translation>
 <translation id="8535005006684281994">Förnyelseadress för Netscape-certifikat</translation>
 <translation id="8539727552378197395">Nej (HttpOnly)</translation>
 <translation id="8543181531796978784">Du kan <ph name="BEGIN_ERROR_LINK" />rapportera ett identifieringsproblem<ph name="END_ERROR_LINK" /> eller <ph name="BEGIN_LINK" />besöka den här osäkra webbplatsen<ph name="END_LINK" /> om du är medveten om säkerhetsriskerna.</translation>
@@ -5382,6 +5511,7 @@
 <translation id="855081842937141170">Fäst flik</translation>
 <translation id="8551388862522347954">Licenser</translation>
 <translation id="8551494947769799688">lettiska</translation>
+<translation id="8553342806078037065">Hantera andra personer</translation>
 <translation id="855705891482654011">Läs in uppackade tillägg</translation>
 <translation id="855773602626431402">Ett pluginprogram utanför sandlådan hindrades från att köras på den här sidan.</translation>
 <translation id="8559694214572302298">Bildavkodare</translation>
@@ -5459,6 +5589,7 @@
 <translation id="8662978096466608964">Bakgrundsbilden kan inte anges i Chrome.</translation>
 <translation id="8663099077749055505">Blockera alltid flera automatiska nedladdningar på <ph name="HOST" /></translation>
 <translation id="8664389313780386848">Visa &amp;sidkälla</translation>
+<translation id="866611985033792019">Lita på detta certifikat för identifiering av e-postanvändare</translation>
 <translation id="8666678546361132282">engelska</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> visas nu i helskärm och har inaktiverat din muspekare.</translation>
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" /> är uppdaterad.</translation>
@@ -5582,6 +5713,7 @@
 <translation id="8813811964357448561">pappersark</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="881799181680267069">Dölj andra</translation>
+<translation id="8818152010000655963">Bakgrund</translation>
 <translation id="8818152613617627612">Faktureringsuppgifter</translation>
 <translation id="8820817407110198400">Bokmärken</translation>
 <translation id="8820961991571528294">Testning</translation>
@@ -5592,8 +5724,10 @@
 <translation id="8828933418460119530">DNS-namn</translation>
 <translation id="8830796635868321089">Det gick inte att genomföra uppdateringskontrollen med de aktuella proxyinställningarna. Justera dina <ph name="PROXY_SETTINGS_LINK_START" />proxyinställningar<ph name="PROXY_SETTINGS_LINK_END" />.</translation>
 <translation id="8831623914872394308">Pekarinställningar</translation>
+<translation id="8833040047958643283">Styr vilket slags innehåll som får visas på en webbplats och vilken information webbplatsen får ta del av när du surfar</translation>
 <translation id="8837103518490433332">Vill du att <ph name="PASSWORD_MANAGER_BRAND" /> sparar lösenordet för <ph name="ORIGIN" />?</translation>
 <translation id="8838770651474809439">Hamburgare</translation>
+<translation id="8839157109304700852">Öppnar Google Översikt</translation>
 <translation id="8841142799574815336">Inaktivt synligt visningsområde.</translation>
 <translation id="884264119367021077">Leveransadress</translation>
 <translation id="8845001906332463065">Få hjälp</translation>
@@ -5604,11 +5738,13 @@
 <translation id="885381502874625531">Vitryskt tangentbord</translation>
 <translation id="8856844195561710094">Det gick inte att avbryta identifiering av Bluetooth-enheter.</translation>
 <translation id="885701979325669005">Lagring</translation>
+<translation id="8858798938034909167">Kom åt lösenorden från alla enheter via <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="8859057652521303089">Välj språk:</translation>
 <translation id="8859116917079399781">Blockerat innehåll</translation>
 <translation id="8859174528519900719">Underram: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="8860454412039442620">Excel-kalkylark</translation>
 <translation id="8863489667196658337">Aktiverar det nya systemet att skapa bokmärkesappar med.</translation>
+<translation id="8866013684546696613">Högsta antal fönster i översikten som kan använda former.</translation>
 <translation id="8866441758832353668">Fästpunkt för rullning</translation>
 <translation id="8868245144144497543">Skapades av</translation>
 <translation id="8868626022555786497">Används</translation>
@@ -5666,6 +5802,7 @@
 <translation id="894360074127026135">Netscapes internationella uppgradering</translation>
 <translation id="8944779739948852228">En skrivare har identifierats</translation>
 <translation id="8944964446326379280"><ph name="APP_NAME" /> delar ett fönster med <ph name="TAB_NAME" />.</translation>
+<translation id="8946284507644756416"><ph name="DEVICE_TYPE" /> kan låsas upp med Android-mobilen.</translation>
 <translation id="8946359700442089734">Felsökningsfunktionerna aktiverades inte helt på den här <ph name="IDS_SHORT_PRODUCT_NAME" />-enheten.</translation>
 <translation id="8946784827990177241">Aktivera stöd för WebUSB.</translation>
 <translation id="89515141420106838">Aktiverar appen Chrome Web Store Gallery för skrivardrivrutiner. Appen söker i Chrome Web Store efter tillägg som har stöd för utskrift till en USB-skrivare med ett specifikt USB-id.</translation>
@@ -5743,6 +5880,7 @@
 <translation id="9040185888511745258">Angripare på <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> kan försöka lura dig att installera program som skadar din webbupplevelse (till exempel genom att byta ut din startsida eller visa extra annonser på webbplatser som du besöker).</translation>
 <translation id="9040421302519041149">Åtkomsten till nätverket är begränsad</translation>
 <translation id="9041603713188951722">Visa inställningar i ett fönster</translation>
+<translation id="9042893549633094279">Sekretess och säkerhet</translation>
 <translation id="904451693890288097">Ange lösenordet för <ph name="DEVICE_NAME" />:</translation>
 <translation id="9049835026521739061">Läge för koreanska bokstäver</translation>
 <translation id="9050666287014529139">Lösenfras</translation>
@@ -5753,6 +5891,7 @@
 <translation id="9056810968620647706">Inga träffar hittades.</translation>
 <translation id="9059868303873565140">Statusmeny</translation>
 <translation id="9064142312330104323">Profilfoto i Google Profiler (läser in)</translation>
+<translation id="9064275926664971810">Aktivera Autofyll och fyll i formulär med ett enda klick</translation>
 <translation id="9064939804718829769">Överför ...</translation>
 <translation id="9065203028668620118">Redigera</translation>
 <translation id="9066075624350113914">Delar av detta PDF-dokument kan inte visas.</translation>
@@ -5774,6 +5913,8 @@
 <translation id="9088917181875854783">Bekräfta att denna nyckel visas på <ph name="DEVICE_NAME" />:</translation>
 <translation id="9092426026094675787">Markera osäkra källor som osäkra</translation>
 <translation id="9094033019050270033">Uppdatera lösenordet</translation>
+<translation id="9094982973264386462">Ta bort</translation>
+<translation id="9095253524804455615">Ta bort</translation>
 <translation id="9100765901046053179">Avancerade inställningar</translation>
 <translation id="910077499156148110">Lägg till ett undantag för en webbplats</translation>
 <translation id="9100825730060086615">Typ av tangentbord</translation>
@@ -5865,8 +6006,11 @@
 <translation id="9218430445555521422">Använd som standard</translation>
 <translation id="9219103736887031265">Bilder</translation>
 <translation id="9220525904950070496">Ta bort konto</translation>
+<translation id="9221503095691269353">Konfigurera snabb upplåsning</translation>
 <translation id="923467487918828349">Visa alla</translation>
+<translation id="927151012416335806">Enheten uppdateras till kanalen <ph name="CHANNEL_NAME" /></translation>
 <translation id="930268624053534560">Detaljerade tidsstämplar</translation>
+<translation id="931068751149008062">Välj teckensnitt och kodning</translation>
 <translation id="932327136139879170">Startsida</translation>
 <translation id="932508678520956232">Det gick inte att påbörja utskriften.</translation>
 <translation id="936801553271523408">Systemets diagnostikresultat</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 250d5d0..4e22c52 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -34,6 +34,7 @@
 <translation id="1047431265488717055">Nakili Maandishi ya Kiungo</translation>
 <translation id="1047726139967079566">Alamisha Ukurasa Huu...</translation>
 <translation id="1047956942837015229">Inafuta vipengee <ph name="COUNT" />...</translation>
+<translation id="1048286738600630630">Maonyesho</translation>
 <translation id="1048597748939794622">Nguvu imewashwa kwa safu zote</translation>
 <translation id="1049795001945932310">Mipangilio ya lugha</translation>
 <translation id="1049926623896334335">Hati ya Word</translation>
@@ -98,6 +99,7 @@
 <translation id="1125520545229165057">Dvorak (Hsu)</translation>
 <translation id="1128109161498068552">Usiruhusu tovuti zozote kutumia ujumbe wa kipekee kufikia vifaa vya MIDI</translation>
 <translation id="1128128132059598906">EAP-TTLS</translation>
+<translation id="1128591060186966949">Badilisha mtambo wa kutafuta</translation>
 <translation id="1128987120443782698">Kifaa cha hifadhi kina ukubwa wa <ph name="DEVICE_CAPACITY" />. Tafadhali ingiza kadi ya SD au hifadhi ya kumbukumbu ya USB cha ukubwa wa angalau 4GB.</translation>
 <translation id="1132956125173653312">Washa programu za Android kwenye Chromebook yako.</translation>
 <translation id="1137135726305341424">domContentLoaded na vipakiwa vya rasimali zote vilianza kabla ya mContentLoaded (fremu kuu na asili ya iframe sawa).</translation>
@@ -107,6 +109,7 @@
 <translation id="1145292499998999162">Programu-jalizi imezuiwa</translation>
 <translation id="1146204723345436916">Ingiza alamisho kutoka faili ya HTML...</translation>
 <translation id="1148624853678088576">Uko tayari kutumia!</translation>
+<translation id="1149401351239820326">Mwezi wa kuisha kwa muda wa matumizi</translation>
 <translation id="1151972924205500581">Nenosiri linahitajika</translation>
 <translation id="1154228249304313899">Fungua ukurasa huu:</translation>
 <translation id="115443833402798225">Hangul Ahnmatae</translation>
@@ -118,6 +121,7 @@
 <translation id="1162223735669141505"><ph name="BEGIN_LINK" />Programu-jalizi ya Seva teja Asili<ph name="END_LINK" /> inahitaji kuwashwa ili kutumia kipengele hiki.</translation>
 <translation id="1163361280229063150">{NUM_DOWNLOAD,plural, =1{Kipakuliwa kinaendelea kwa sasa. Unataka kughairi kipakuliwa na kuondoka katika hali fiche?}other{Vipakuliwa # vinaendelea kwa sasa. Unataka kughairi vipakuliwa na kuondoka katika hali fiche?}}</translation>
 <translation id="1163931534039071049">&amp;Tazama asili ya fremu</translation>
+<translation id="1164674268730883318">Ungependa kuzima kipengele cha Smart Lock cha <ph name="DEVICE_TYPE" />?</translation>
 <translation id="1165039591588034296">Hitilafu</translation>
 <translation id="1166212789817575481">Funga Vichupo vilivyo Upande wa Kulia</translation>
 <translation id="1166359541137214543">ABC</translation>
@@ -135,6 +139,7 @@
 <translation id="1181037720776840403">Ondoa</translation>
 <translation id="1183083053288481515">Kutumia cheti kilichotolewa cha msimamizi</translation>
 <translation id="1183237619868651138">Haiwezi kusakinisha <ph name="EXTERNAL_CRX_FILE" /> katika akiba ya ndani.</translation>
+<translation id="1183917921992319637">Weka PIN</translation>
 <translation id="1185924365081634987">Pia unaweza kujaribu <ph name="GUEST_SIGNIN_LINK_START" />kuvinjari kama aliyealikwa<ph name="GUEST_SIGNIN_LINK_END" /> ili kurekebisha hitilafu hii ya mtandao.</translation>
 <translation id="1187722533808055681">Miamsho isiyofanya kazi</translation>
 <translation id="1188807932851744811">Kumbukumbu haijapakiwa.</translation>
@@ -200,6 +205,7 @@
 <translation id="1277908057200820621">Angalia orodha ya vifaa</translation>
 <translation id="1278049586634282054">Kagua maoni:</translation>
 <translation id="1278813325885878377">Kibodi ya QWERTY ya Kihungaria</translation>
+<translation id="1284355409890639046">Oanisha Kifaa cha Bluetooth</translation>
 <translation id="1285320974508926690">Kamwe usitafsiri tovuti hii</translation>
 <translation id="1285484354230578868">Hifadhi data katika akaunti yako ya Hifadhi ya Google</translation>
 <translation id="1290223615328246825">Imeshindwa kuingia katika akaunti kiotomatiki</translation>
@@ -304,6 +310,8 @@
 <translation id="1429740407920618615">Nguvu za Ishara:</translation>
 <translation id="143027896309062157">Kusoma na kubadilisha data yako yote kwenye kompyuta yako na tovuti unazozitembelea</translation>
 <translation id="1430915738399379752">Chapisha</translation>
+<translation id="1432581352905426595">Dhibiti mitambo ya kutafuta</translation>
+<translation id="1433811987160647649">Uliza kabla ya kufikia</translation>
 <translation id="1434696352799406980">Hatua hii itaweka upya ukurasa wako unaoanza, ukurasa wa kichupo kipya, mtambo wa kutafuta na vichupo vilivyobandikwa. Pia itazima viendelezi na kufuta data ya muda kama vile vidakuzi. Alamisho, historia na manenosiri yako yaliyohifadhiwa hayatafutwa.</translation>
 <translation id="1434886155212424586">Ukurasa wa Mwanzo ndio ukurasa wa kichupo kipya</translation>
 <translation id="1435550882135542937">Uundaji upya wa upau wa vidhibiti wa viendelezi</translation>
@@ -339,6 +347,7 @@
 <translation id="14720830734893704">Washa utumiaji wa kibodi isiyo bayana.</translation>
 <translation id="1474079335130556426">Washa kipengele cha hali ya chini chini ya API ya Push. Hii huruhusu Chrome kuendelea kutekeleza baada ya dirisha la mwisho kufungwa, na kufungua Mfumo wa Uendeshaji unapoanzishwa, ikiwa API ya Push inaihitaji.</translation>
 <translation id="1474339897586437869">"<ph name="FILENAME" />" haikupakiwa. Hakuna nafasi ya kutosha katika Hifadhi yako ya Google.</translation>
+<translation id="1475502736924165259">Una vyeti kwenye faili ambavyo havilangani na aina nyingine yoyote</translation>
 <translation id="1476607407192946488">Mipangilio ya Lugha</translation>
 <translation id="1476949146811612304">Bainisha ni mtambo upi wa kutafuta unaotumika wakati wa kutafuta kutoka
         <ph name="BEGIN_LINK" />Sanduku Kuu<ph name="END_LINK" />.</translation>
@@ -373,6 +382,7 @@
 <translation id="1510785804673676069">Ukitumia seva ya proksi, angalia mipangilio yako ya proksi au wasiliana na msimamizi wako wa mtandao ili kuhakikisha kuwa seva ya proksi inafanya kazi. Ikiwa huamini kuwa unafaa kuwa ukitumia seva ya proksi, rekebisha <ph name="LINK_START" />mipangilio yako ya proksi<ph name="LINK_END" />.</translation>
 <translation id="1510907582379248592">Manenosiri yaliyohifadhiwa ya <ph name="ORIGIN" />:</translation>
 <translation id="1511004689539562549">Usiruhusu tovuti kufikia kamera yako</translation>
+<translation id="1511388193702657997">Jitolee kuhifadhi manenosiri yako ya wavuti</translation>
 <translation id="1511623662787566703">Umeingia kama <ph name="USER_EMAIL_ADDRESS" />. Usawazishaji umekomeshwa kupitia Dashibodi ya Google.</translation>
 <translation id="1514215615641002767">Ongeza kwenye eneo-kazi</translation>
 <translation id="1514298457297359873">Inaruhusu programu kutumia API ya Soketi ya NaCl. Tumia tu ili kujaribu programu jalizi za NaCl.</translation>
@@ -384,6 +394,7 @@
 <translation id="1520505881707245707">Ripoti hii inaweza kutumiwa kuwasha uthibitishaji ambao maudhui ya faili zilizo kwenye diski za viendelezi kutoka kwenye duka la wavuti yanalingana kama yanavyotarajiwa. Hii inaweza kutumiwa kukiwasha kipengele hiki iwapo hakitakuwa kimewashwa, lakini haiwezi kutumiwa kukizima (kwa sababau mpangilio huu unaweza kuharibiwa na programu hasidi).</translation>
 <translation id="1520635877184409083">Rekebisha...</translation>
 <translation id="1521442365706402292">Dhibiti vyeti</translation>
+<translation id="152234381334907219">Hayatahifadhiwa Kamwe</translation>
 <translation id="1523350272063152305">Chromebox ya vifaa vya Mikutano iko tayari kusanidiwa.</translation>
 <translation id="1524152555482653726">Filamu</translation>
 <translation id="1525835343380843286">Hitilafu ya mawasiliano ya seva</translation>
@@ -393,6 +404,7 @@
 <translation id="1529968269513889022">wiki iliyopita</translation>
 <translation id="1531004739673299060">Dirisha la Programu</translation>
 <translation id="1531865825384516080">Kuripoti URL kwenye SafeSearch.</translation>
+<translation id="1532687502998799885">Lazima PIN iwe angalau tarakimu 4:</translation>
 <translation id="1532697124104874386">Washa/Zima utumiaji mahiri wa kibodi pepe.</translation>
 <translation id="1533897085022183721">Chini ya <ph name="MINUTES" />.</translation>
 <translation id="1533920822694388968">Mpangilio wa Runinga</translation>
@@ -421,6 +433,7 @@
 <translation id="1558988940633416251">Washa mtambo wa mpangilio wenye mbinu mchanganyiko wa HarfBuzz kwa maandishi ya UI. Haiathiri maudhui ya wavutini.</translation>
 <translation id="1559235587769913376">Ingiza vibambo vya Msimbosare</translation>
 <translation id="1561092721008294962">HarfBuzz kwa maandishi ya Kiolesura</translation>
+<translation id="1566049601598938765">Tovuti</translation>
 <translation id="1566958206723629112">Flash na PDF</translation>
 <translation id="1567723158593978621">Ikiwashwa, kuingia katika kivinjari kutatumia mtiririko mpya wa gaia wa kuingia katika akaunti uliotenganishwa kwa nenosiri.</translation>
 <translation id="1567993339577891801">Kidhibiti JavaScript</translation>
@@ -478,6 +491,7 @@
 <translation id="1645228020260124617"><ph name="PRECENTAGE" />%</translation>
 <translation id="1645870377513700713">Washa arifa za asili.</translation>
 <translation id="1646136617204068573">Kibodi ya Kihangari</translation>
+<translation id="1646982517418478057">Tafadhali weka nenosiri ili usimbe cheti hii kwa njia fiche</translation>
 <translation id="164729547906544836">Kibodi ya Kitamil (itrans)</translation>
 <translation id="164814987133974965">Mtumiaji anayesimamiwa anaweza kugundua wavuti chini ya mwongozo wako. Kama msimamizi wa mtumiaji anayesimamiwa, unaweza
     <ph name="BEGIN_BOLD" />kuruhusu au kuzuia<ph name="END_BOLD" /> tofuti fulani,
@@ -505,6 +519,7 @@
 <translation id="1673103856845176271">Faili isingeweza kufikiwa kwa sababu za usalama.</translation>
 <translation id="1675023460278456180">Nyenzo Mahuluti</translation>
 <translation id="167832068858235403">punguza sauti</translation>
+<translation id="1678331212993975953">Maelezo ya Tovuti</translation>
 <translation id="1679068421605151609">Zana za Wasadini Programu</translation>
 <translation id="1681120471812444678">Sanidi ili uongeze printa...</translation>
 <translation id="1682324559341535203">Sajili <ph name="DEVICE_TYPE" /></translation>
@@ -526,11 +541,13 @@
 <translation id="1699395855685456105">Marekebisho ya maunzi:</translation>
 <translation id="1700199471143028312">Msimamizi wako haruhusu kuunda wasifu wa watumiaji wanaosimamiwa.</translation>
 <translation id="1701062906490865540">Ondoa mtumiaji huyu</translation>
+<translation id="1702294042233267824">Mtambo wa kutafuta unaotumika wakati wa kutafuta kutoka kwenye sanduku kuu</translation>
 <translation id="1702534956030472451">wa Magharibi</translation>
 <translation id="1707463636381878959">Shiriki mtandao huu na watumiaji wengine</translation>
 <translation id="1708199901407471282">Unapofungua ukurasa wa wavuti uliopendekezwa kutoka Ukurasa wa Kichupo Kipya, ikiwa tayari kichupo kiko wazi kwa pendekezo, tumia hicho badala ya kupakia pendekezo katika kichupo kipya.</translation>
 <translation id="1708338024780164500">(Sio amilifu)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (Kitambulisho: <ph name="ID_PH" />)</translation>
+<translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Asili)</translation>
 <translation id="1711973684025117106">Haikuweza kubana, hitilafu isiyotarajiwa imetokea: $1</translation>
 <translation id="1715941336038158809">Jina la mtumiaji au nenosiri ni batili.</translation>
 <translation id="1717733954209022288">Kisanduku cha kuteua cha kuhifadhi kadi ya Google Payments</translation>
@@ -625,6 +642,7 @@
 <translation id="1852799913675865625">Kulikuwa na hitilafu wakati wa kujaribu kusoma faili: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1856715684130786728">Ongeza eneo...</translation>
 <translation id="1857166538520940818">Ambatisha faili:</translation>
+<translation id="1858585891038687145">Amini cheti hiki kwa kutambua watengenezaji programu</translation>
 <translation id="1859234291848436338">Mwelekeo wa Maandishi</translation>
 <translation id="1864111464094315414">Ingia</translation>
 <translation id="1864676585353837027">Badilisha jinsi faili hizi zinavyoshirikiwa</translation>
@@ -656,6 +674,7 @@
 <translation id="1909880997794698664">Una uhakika unataka kuweka kifaa hiki kiwe cha kudumu katika modi ya kioski?</translation>
 <translation id="1910572251697014317">Google ilituma arifa kwenye simu hii. Fahamu kuwa ukiwa na Bluetooth, simu yako inaweza kufungua <ph name="DEVICE_TYPE" /> kutoka umbali wa zaidi ya futi 100. Katika hali ambazo hili linaweza kuwa tatizo, unaweza &lt;a&gt;kuzima kipengele hiki kwa muda&lt;/a&gt;.</translation>
 <translation id="1910721550319506122">Karibu!</translation>
+<translation id="1911073860190924580">Nenosiri pekee</translation>
 <translation id="1916502483199172559">Ishara chaguo-msingi nyekundu</translation>
 <translation id="191688485499383649">Hitilafu isiyojulikana imetokea wakati wa kujaribu kuunganisha kwa "<ph name="DEVICE_NAME" />".</translation>
 <translation id="1918141783557917887">&amp;Ndogo zaidi</translation>
@@ -717,6 +736,8 @@
 <translation id="2007404777272201486">Ripoti Tatizo...</translation>
 <translation id="2011110593081822050">Web Worker: <ph name="WORKER_NAME" /></translation>
 <translation id="2012766523151663935">Marekebisho ya programu dhibiti:</translation>
+<translation id="2013984794184160106">15</translation>
+<translation id="2016430552235416146">Vya Asili</translation>
 <translation id="2017052954220678795">Uwekaji wa safu za picha wa GPU ulio na maelezo</translation>
 <translation id="2017334798163366053">Zima ukusanyaji wa data ya utendaji</translation>
 <translation id="2018352199541442911">Samahani, kifaa chako cha hifadhi ya nje hakihimiliwi kwa wakati huu.</translation>
@@ -733,6 +754,7 @@
 <translation id="204497730941176055">Jina la Kiolezo cha Cheti kutoka Microsoft</translation>
 <translation id="2045969484888636535">Endelea kuzuia vidakuzi</translation>
 <translation id="204622017488417136">Kifaa chako kitarejeshwa kwenye toleo la awali lililosakinishwa la Chrome. Akaunti za watumiaji na data zote za karibu zitaondolewa. Hili haliwezi kutenduliwa.</translation>
+<translation id="2047962517134476164">Thibitisha kuingia kwako katika akaunti ili uendelee</translation>
 <translation id="2048182445208425546">Fikia trafiki ya mtandao wako</translation>
 <translation id="2049137146490122801">Ufikiaji wa faili za karibu kwenye mashine yako unalemazwa na msimamizi wako.</translation>
 <translation id="204914487372604757">Unda njia mkato</translation>
@@ -818,10 +840,12 @@
 <translation id="2155931291251286316">Ruhusu madirisha ibukizi kutoka <ph name="HOST" /> kila wakati</translation>
 <translation id="215753907730220065">Ondoka kwenye Skrini Kamili</translation>
 <translation id="2157875535253991059">Ukurasa huu sasa umejaa.</translation>
+<translation id="2161553589239083578">Thibitisha PIN yako:</translation>
 <translation id="216169395504480358">Ongeza Wi-Fi...</translation>
 <translation id="2163470535490402084">Tafadhali unganisha kwenye Intaneti ili uingie katika <ph name="DEVICE_TYPE" /> yako.</translation>
 <translation id="2164862903024139959">Kibodi ya Kivietnamu (TCVN)</translation>
 <translation id="2165453356262207111">Smart Lock (beta)</translation>
+<translation id="2166369534954157698">Juma ameanza kuvua papa baharini, naye Fatuma anamsaidia Lawi kuchimba mgodi</translation>
 <translation id="2167276631610992935">JavaScript</translation>
 <translation id="2168214441502403371">Kibodi ya Kiajemi</translation>
 <translation id="2168725742002792683">Viendelezi vya </translation>
@@ -838,6 +862,7 @@
 <translation id="2190355936436201913">(tupu)</translation>
 <translation id="2190469909648452501">Punguza</translation>
 <translation id="2192505247865591433">Kutoka:</translation>
+<translation id="2193365732679659387">Mipangilio ya kuamini</translation>
 <translation id="2195729137168608510">Ulinzi wa Barua Pepe</translation>
 <translation id="2198315389084035571">Kichina Kilichorahisishwa</translation>
 <translation id="2199829153606285995">Kuweka data kwa kutamka kwenye kibodi pepe</translation>
@@ -855,9 +880,11 @@
 <translation id="2213819743710253654">Kitendo cha Ukurasa</translation>
 <translation id="2215277870964745766">Karibu! Weka lugha yako na mtandao</translation>
 <translation id="2217501013957346740">Unda jina -</translation>
+<translation id="2218019600945559112">Kipanya na padi ya kugusa</translation>
 <translation id="2218515861914035131">Bandika kama matini makavu</translation>
 <translation id="2218947405056773815">Lahaula! <ph name="API_NAME" /> imegonga mwamba.</translation>
 <translation id="2220529011494928058">Ripoti tatizo</translation>
+<translation id="2220572644011485463">PIN au nenosiri</translation>
 <translation id="2221240591176106785">Washa upakiaji upya usio wa kuthibitisha</translation>
 <translation id="2222641695352322289">Njia pekee ya kutendua hili ni kusakinisha upya <ph name="IDS_SHORT_PRODUCT_OS_NAME" />.</translation>
 <translation id="2224444042887712269">Mipangilio hii ni ya <ph name="OWNER_EMAIL" />.</translation>
@@ -901,6 +928,7 @@
 <translation id="2258195278080713720">Vipengele vipya thabiti vya JavaScript</translation>
 <translation id="2260567344816042527">Google Chrome itatumia data ya simu za mkononi ikiwa huna muunganisho mwingine wa mtandao.</translation>
 <translation id="2260654768907572711">PROGRAMU-JALIZI NI CHA KIVINJARI</translation>
+<translation id="2262477216570151239">Chelewesha kabla ya kurudia</translation>
 <translation id="226269835214688456">Ukizima Smart Lock ya Chromebook, hutaweza kufungua vifaa vyako kwenye Chrome ukitumia simu yako. Utahitajika kucharaza nenosiri lako.</translation>
 <translation id="2262903407161221567">Baadhi ya vipengele vya Kiolesura vitaonyesha maoni yanayoonekana mara maingiliano yanapoguswa.</translation>
 <translation id="2263497240924215535">(Kimelemazwa)</translation>
@@ -914,6 +942,7 @@
 <translation id="2273562597641264981">Mtoa huduma:</translation>
 <translation id="2275694568175246751">Kulia kwenda kushoto</translation>
 <translation id="2276503375879033601">Ongeza programu zaidi</translation>
+<translation id="2277255602909579701">Data yote ya vidakuzi na tovuti</translation>
 <translation id="2278098630001018905">Tumia anwani tofauti ya kusafirisha</translation>
 <translation id="2278562042389100163">Fungua dirisha la kivinjari</translation>
 <translation id="2278988676849463018">Kibodi ya Kannada (Fonetiki)</translation>
@@ -954,6 +983,7 @@
 <translation id="2339120501444485379">Ingiza jina jipya</translation>
 <translation id="2339641773402824483">Inatafuta visasishi...</translation>
 <translation id="2342060820861917889">mrefu (milisekunde 2000)</translation>
+<translation id="2342282706041269970">Jaribu kuondoka na kuingia tena katika akaunti</translation>
 <translation id="23434688402327542">Kibodi ya Kikazakhi</translation>
 <translation id="2344028582131185878">Upakuaji wa Kiotomatiki</translation>
 <translation id="2344262275956902282">Tumia vitufe vya - na = ili kuandika ukurasa wa wanafunzi</translation>
@@ -1068,6 +1098,7 @@
 <translation id="2494837236724268445">Kibodi ya Gujarati (Fonetiki)</translation>
 <translation id="2496180316473517155">Historia ya kuvinjari</translation>
 <translation id="2496540304887968742">Lazima kifaa kiwe na nafasi ya 4GB au zaidi.</translation>
+<translation id="2497229222757901769">Kasi ya kipanya</translation>
 <translation id="249819058197909513">Usitume onyo kuhusu programu hii tena</translation>
 <translation id="2498436043474441766">Ongeza Printa</translation>
 <translation id="2498539833203011245">Punguza</translation>
@@ -1141,6 +1172,7 @@
 <translation id="2587102772237859721">Kubatilisha Visikiliza Matukio Tuli</translation>
 <translation id="2587203970400270934">Msimbo wa mtoa huduma:</translation>
 <translation id="2587922270115112871">Kuongeza mtumiaji anayesimamiwa hakufungui Akaunti ya Google, na mipangilio na data yake haitamfuata kwenye vifaa vingine vilivyo na Usawazishaji wa Chrome. Mtumiaji anayesimamiwa ameongezwa kwenye kifaa hiki tu.</translation>
+<translation id="25912682830130293">Angalia mipangilio iliyoripotiwa</translation>
 <translation id="2594049137847833442">Chaguo muhimu za tovuti katika kidirisha cha kufuta data ya kuvinjari</translation>
 <translation id="2594056015203442344">Vinapowashwa, viashiria sauti katika ukanda wa vichupo hutumika pia kama vidhibiti vya kunyamazisha. Hii pia huongeza amri katika menyu ya maudhui ya kichupo kwa ajili ya kuzima kwa haraka vichupo vingi vilivyochaguliwa.</translation>
 <translation id="259421303766146093">Punguza</translation>
@@ -1193,6 +1225,7 @@
 <translation id="2665394472441560184">Ongeza neno jipya</translation>
 <translation id="2665717534925640469">Ukurasa huu sasa uko kwenye skrini nzima na umelemaza kishale cha kipanya chako.</translation>
 <translation id="2665919335226618153">Lo! Kulikuwa na hitilafu wakati wa uumbizaji.</translation>
+<translation id="2667463864537187133">Dhibiti kikagua maendelezo</translation>
 <translation id="2668079306436607263">Tembeza zaidi uendeshaji wa historia</translation>
 <translation id="2670102641511624474"><ph name="APP_NAME" /> inashiriki kichupo cha Chrome.</translation>
 <translation id="2670965183549957348">Mbinu ya uingizaji wa Kichewi</translation>
@@ -1215,7 +1248,9 @@
 <translation id="2694026874607847549">Kidakuzi 1</translation>
 <translation id="2696862700756109583">Vighairi vya skrini nzima</translation>
 <translation id="2702540957532124911">Kibodi</translation>
+<translation id="2704142793323512908">Pia ondoa data yako iliyopo kwenye kifaa hiki.</translation>
 <translation id="2704184184447774363">Utiaji Sahihi wa Maandiko kutoka Microsoft </translation>
+<translation id="270516211545221798">Kasi ya padi ya kugusa</translation>
 <translation id="2706892089432507937">Vifaa vya USB</translation>
 <translation id="2707024448553392710">Kipengele kinapakuliwa</translation>
 <translation id="270921614578699633">Wastani Juu Ya</translation>
@@ -1394,6 +1429,7 @@
 <translation id="2902734494705624966">Kimarekani kilichopanuliwa</translation>
 <translation id="2903493209154104877">Anwani</translation>
 <translation id="290444763029043472">MB <ph name="DOWNLOADED_AMOUNT_MB" /> / MB <ph name="TOTAL_AMOUNT_MB" /> zimepakuliwa</translation>
+<translation id="2904456025988372123">Uliza tovuti inapojaribu kupakua faili kiotomatiki baada ya faili ya kwanza</translation>
 <translation id="2907619724991574506">URL za kuanzisha</translation>
 <translation id="2908162660801918428">Ongeza Ghala la Vyombo vya habari kwa Saraka</translation>
 <translation id="2908789530129661844">Kuza skrini nje</translation>
@@ -1440,6 +1476,7 @@
 <translation id="2963151496262057773">Programu-jalizi inayofuata imekwama: <ph name="PLUGIN_NAME" />Ungependa kuisimamisha?</translation>
 <translation id="2963783323012015985">Kibodi ya Kituruki</translation>
 <translation id="2964193600955408481">Lemaza Wi-Fi</translation>
+<translation id="2964313852984024865">Badilisha</translation>
 <translation id="2966459079597787514">Kibodi ya Kiswidi</translation>
 <translation id="2966598748518102999">Boresha kutafuta kwa kutamka kwa kutuma sauti ya "Ok Google," pamoja na sekunde chache kabla ya tamko hilo, kwa Google.</translation>
 <translation id="2967544384642772068">Angamiza</translation>
@@ -1588,6 +1625,7 @@
 <translation id="3150927491400159470">Upakiaji upya Thabiti</translation>
 <translation id="315116470104423982">Data ya simu</translation>
 <translation id="315141861755603168">"<ph name="BUNDLE_NAME" />" huongeza programu hizi:</translation>
+<translation id="3151786313568798007">Mkao</translation>
 <translation id="3153177132960373163">Ruhusu tovuti zote zitumie programu-jalizi kufikia kompyuta yako</translation>
 <translation id="3154429428035006212">Nje ya mtandao kwa zaidi ya mwezi</translation>
 <translation id="3157931365184549694">Rejesha</translation>
@@ -1644,6 +1682,7 @@
 <translation id="3234666976984236645">Gundua maudhui muhimu kwenye tovuti hii wakati wowote</translation>
 <translation id="3236997602556743698">Seti 3 (390)</translation>
 <translation id="3237784613213365159"><ph name="NEW_PROFILE_NAME" /> sasa ni mtumiaji anayesimamiwa</translation>
+<translation id="323803881985677942">Fungua chaguo za viendelezi</translation>
 <translation id="324056286105023296">Wewe si <ph name="PROFILE_NAME" />?</translation>
 <translation id="3241680850019875542">Chagua saraka msingi ya kiendelezi ya kuweka kwenye furushi. Kusasisha kiendelezi, chagua pia ufunguo wa kibinafsi wa kutumia tena.</translation>
 <translation id="3241720467332021590">Kiairish</translation>
@@ -1669,6 +1708,7 @@
 <translation id="3268451620468152448">Fungua Vichupo</translation>
 <translation id="3269093882174072735">Pakia picha</translation>
 <translation id="3269101346657272573">Tafadhali ingiza PIN.</translation>
+<translation id="3269737334347286816">Maelezo ya kuingia katika akaunti yameisha muda wa matumizi.</translation>
 <translation id="326999365752735949">Inapakua tofauti</translation>
 <translation id="3270965368676314374">Soma, badilisha na ufute picha, muziki, na maudhui mengine kwenye kompyuta yako.</translation>
 <translation id="3273410961255278341">Tumwa kwa:</translation>
@@ -1764,6 +1804,7 @@
 <translation id="3382073616108123819">Lo! Mfumo haukuweza kutambua vitambuaji vya kifaa kwa kifaa hiki.</translation>
 <translation id="3384773155383850738">Kiwango cha juu cha mapendekezo</translation>
 <translation id="3385050660708634073">Simba kwa njia fiche data yote iliyosawazishwa kwa kaulisiri yako binafsi ya usawazishaji.</translation>
+<translation id="3385131213214862288">Futa vipengee vifuatavyo kwenye</translation>
 <translation id="338583716107319301">Kitenganishi</translation>
 <translation id="3386219708421216619">Alamisho Imeongezwa</translation>
 <translation id="3391392691301057522">PIN ya Zamani:</translation>
@@ -1777,6 +1818,7 @@
 <translation id="3401130144947259741">Ikiwashwa, matukio ya kufuatilia yatahamishwa hadi kwenye Ufuatiliaji wa Matukio ya Windows (ETW) kisha yanaweza kupigwa picha kwa zana kama vile UIForETW au Xperf.</translation>
 <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED" />, <ph name="TIME_LEFT" /></translation>
 <translation id="340485819826776184">Tumia huduma ya kutabiri ili kusaidia kukamilisha utafutaji na URL zinazocharazwa katika upau anwani.</translation>
+<translation id="3405664148539009465">Badilisha fonti zikufae</translation>
 <translation id="3405763860805964263">...</translation>
 <translation id="3406605057700382950">&amp;Onyesha upau alamisho</translation>
 <translation id="3412265149091626468">Ruka hadi Iliyochaguliwa</translation>
@@ -1798,6 +1840,7 @@
 <translation id="3439153939049640737">Ruhusu <ph name="HOST" /> kufikia maikrofoni yako kila wakati</translation>
 <translation id="3439282137581679399">Huwezesha Ruhusa za Orodha ya Kuondoa Idhini, ambayo huzuia ruhusa za tovuti zisizoidhinishwa kwa ajili ya watumiaji wa Kuvinjari Salama.</translation>
 <translation id="3439970425423980614">Inafungua PDF katika Kihakiki</translation>
+<translation id="3440761377721825626">Uliza tovuti inapotaka kutumia programu-jalizi kufikia kompyuta yako</translation>
 <translation id="3441653493275994384">Skrini</translation>
 <translation id="3441653695259810643">Tumia tena fonti ya akiba katika kionyeshi ili kukidhi ukubwa tofauti wa fonti kwa ajili ya uwekaji muundo wa haraka.</translation>
 <translation id="3445092916808119474">Fanya iwe msingi</translation>
@@ -1812,6 +1855,7 @@
 <translation id="3456236151053308041">Washa viendelezi vya Programu Inayotambua Mbinu za Kuingiza Data ili vitoe mionekano maalum kwa vifaa vya kuingiza data vya mtumiaji kama vile kibodi pepe.</translation>
 <translation id="345693547134384690">Fungua p&amp;icha katika kichupo kipya</translation>
 <translation id="3458620904104024826">Washa kipengee cha kuhamisha matukio ya kufuatilia hadi ETW.</translation>
+<translation id="3459509316159669723">Inachapisha</translation>
 <translation id="3459774175445953971">Ilibadilishwa mwisho:</translation>
 <translation id="3460771772332290399">Hali ya Kupakia Kiotomatiki Nje ya Mtandao</translation>
 <translation id="3462413494201477527">Ungependa kughairi ufunguaji wa akaunti?</translation>
@@ -1855,6 +1899,7 @@
 <translation id="3508920295779105875">Chagua Folda Lingine...</translation>
 <translation id="3509527969829946096">Chaguo hili huwasha matumizi katika Utiririshaji wa Kutuma kwa ajili ya kusimba video za kutiririsha ukitumia mbinu ya maunzi.</translation>
 <translation id="3510797500218907545">WiMAX</translation>
+<translation id="3511200754045804813">Changanua upya</translation>
 <translation id="3511307672085573050">Nakili &amp;Anwani ya Kiungo</translation>
 <translation id="3511399794969432965">Je, unapata shida ya kuunganisha?</translation>
 <translation id="351152300840026870">Fonti ya upana usiobadilika</translation>
@@ -1924,6 +1969,7 @@
 <translation id="3590559774363307859">Nenosiri limehifadhiwa. Unaweza kulifikia na <ph name="SAVED_PASSWORDS_LINK" /> yako yote kutoka kwenye kivinjari chochote.</translation>
 <translation id="3590587280253938212">haraka</translation>
 <translation id="3592260987370335752">&amp;Pata maelezo zaidi</translation>
+<translation id="3592313833691251126">Ruhusu viendelezi kuunda vidirisha vinavyofungukia nje ya fremu ya kivinjari. Majaribio ya kufungua vidirisha vitafungua dirisha ibukizi kama halitawashwa. Tabia chaguo-msingi ni kuruhusu viendelezi vilivyoidhinishwa pekee. Tabia iliyowashwa ni kuruhusu viendelezi vyote. Tabia iliyozimwa ni kutoruhusu vidirisha vya kiendelezi chochote.</translation>
 <translation id="359283478042092570">Ingia</translation>
 <translation id="3593152357631900254">Wezesha modi ya Pinyin isiyio bayana</translation>
 <translation id="3593965109698325041">Vizuizi vya Jina la Cheti</translation>
@@ -2001,6 +2047,7 @@
 <translation id="3695919544155087829">Tafadhali weka nenosiri lililotumiwa kusimbua faili hii ya cheti kwa njia fiche.</translation>
 <translation id="3696411085566228381">hamna</translation>
 <translation id="3697100740575341996">Msimamizi wako wa IT amezima Chrome Goodies kwa ajili ya kifaa chako. <ph name="MORE_INFO_LINK" /></translation>
+<translation id="3699080292907545058">Weka toleo la juu zaidi la TLS lililowashwa.</translation>
 <translation id="3699624789011381381">Anwani ya barua pepe</translation>
 <translation id="3704162925118123524">Mtandao unaotumia unaweza kukuhitaji kuutembelea ukurasa wake wa kuingia katika akaunti.</translation>
 <translation id="3704331259350077894">Haifanyi Kazi Tena</translation>
@@ -2046,10 +2093,12 @@
 <translation id="3758201569871381925">Tafadhali hakikisha kwamba kifaa chako cha Hotrod kimewashwa na kimeunganishwa kwenye Televisheni.</translation>
 <translation id="375841316537350618">Inapakua hati ya proksi...</translation>
 <translation id="3759371141211657149">Dhibiti mipangilio ya kisimamizi...</translation>
+<translation id="3759553810934020361">Bluetooth imezimwa.</translation>
 <translation id="3759933321830434300">Zuia sehemu za kurasa za mtandao</translation>
 <translation id="3760460896538743390">Kagua Ukurasa wa Mandharinyuma</translation>
 <translation id="37613671848467444">Fungua katika &amp;Dirisha Chini kwa chini</translation>
 <translation id="3763401818161139108">Tekeleza kwenye <ph name="ORIGIN" /> kila wakati</translation>
+<translation id="3764314093345384080">Maelezo ya kina ya muundo</translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Wasiliana na kifaa cha USB}other{Wasiliana na vifaa # vya USB}}</translation>
 <translation id="3764800135428056022">Toleo la kuhifadhi manenosiri yako ya wavuti.</translation>
 <translation id="3764986667044728669">Imeshindwa kujiandikisha</translation>
@@ -2079,6 +2128,7 @@
 <translation id="3798449238516105146">Toleo</translation>
 <translation id="3798935682015223249">Matumizi ya MTP katika Kidhibiti cha Faili</translation>
 <translation id="3800764353337460026">Mtindo wa ishara</translation>
+<translation id="3800806661949714323">Onyeza zote (inapendekezwa)</translation>
 <translation id="3801082500826908679">Kifaroe</translation>
 <translation id="3803991353670408298">Tafadhali ongeza mbinu nyingine ya uingizaji kabla ya kuondoa hii.</translation>
 <translation id="380408572480438692">Kuwasha ukusanyaji wa data ya utendaji kutasaidia Google kuboresha mfumo kadri muda unavyoenda. Hakuna data inayotumwa hadi utume ripoti ya maoni ("Alt"-"Shift"-"I") na ujumuishe data ya utendaji. Unaweza kurudi katika skrini hii ili kuzima ukusanyaji wakati wowote.</translation>
@@ -2096,6 +2146,7 @@
 <translation id="3819007103695653773">Ruhusu tovuti zote kutuma ujumbe wa programu wa chini chini hata wakati huitumii</translation>
 <translation id="3819752733757735746">Fikia kupitia swichi (dhibiti kompyuta kwa kutumia swichi moja au mbili pekee)</translation>
 <translation id="3819800052061700452">&amp;Skrini kamili</translation>
+<translation id="3821453754632750466">Washa Kipengele cha Malipo kwenye Wavuti</translation>
 <translation id="3822265067668554284">Usiruhusu tovuti yoyote ifuatilie mahali halisi ulipo</translation>
 <translation id="3825863595139017598">Kibodi ya Kimongolia</translation>
 <translation id="3827306204503227641">Endelea kuruhusu programu-jalizi zisizo kwenye sandbox</translation>
@@ -2157,9 +2208,11 @@
 <translation id="3899968422636198696"><ph name="ORGNAME" /> <ph name="HOSTNAME" /></translation>
 <translation id="3901991538546252627">Inaunganisha kwenye <ph name="NAME" /></translation>
 <translation id="3902799646152133632">Huruka fremu kuu ya hakuna hifadhi.</translation>
+<translation id="3904196543277238487">Toleo la juu zaidi la TLS limewashwa.</translation>
 <translation id="3905761538810670789">Karabati programu</translation>
 <translation id="390718707505136526">Huwasha majaribio asili ya kudhibiti ufikiaji wa majaribio ya kipengele/API.</translation>
 <translation id="3908501907586732282">Washa kiendelezi</translation>
+<translation id="3909690856344416952"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" />, na nyingine 1</translation>
 <translation id="3909791450649380159">&amp;Kata</translation>
 <translation id="3910699493603749297">Kibodi ya Khmer</translation>
 <translation id="3911073280391218446"><ph name="USER_DISPLAY_NAME" /> (jina lilitumiwa kwenye kifaa hiki)</translation>
@@ -2179,6 +2232,7 @@
 <translation id="3930521966936686665">Cheza kwenye</translation>
 <translation id="3936390757709632190">&amp;Fungua katika kichupo kipya</translation>
 <translation id="3936768791051458634">Badili kituo...</translation>
+<translation id="3936925983113350642">Nenosiri ulilochagua litahitajika ili kurejesha cheti hiki baadaye. Tafadhali linakili katika sehemu salama.</translation>
 <translation id="3937640725563832867">Jina Mbadala la Mtoa Cheti</translation>
 <translation id="3938113500786732264">Badilisha watu haraka sana</translation>
 <translation id="3940233957883229251">Washa kurudia otomatiki</translation>
@@ -2246,9 +2300,10 @@
 <translation id="4034042927394659004">Punguza ung'aavu wa kitufe</translation>
 <translation id="4035758313003622889">&amp;Kidhibiti cha shughuli</translation>
 <translation id="4037084878352560732">Farasi</translation>
-<translation id="4037102579141982963">Kifaa hiki kitatuma kiotomatiki data ya utambuzi wa matatizo na matumizi kwa Google. Unaweza kubadilisha mipangilio hii wakati wowote katika <ph name="BEGIN_LINK1" />mipangilio<ph name="END_LINK1" /> ya kifaa chako. <ph name="BEGIN_LINK2" />Pata Maelezo zaidi<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Washa kibadilishaji cha kichupo cha ufikiaji cha Android.</translation>
+<translation id="4037889604535939429">Badilisha mtu</translation>
 <translation id="4044260751144303020">Kuunganisha kwa vipengele vya nafasi vilivyorekebishwa.</translation>
+<translation id="4044612648082411741">Weka nenosiri la cheti chako</translation>
 <translation id="404493185430269859">Injini tafuti chaguo-msingi</translation>
 <translation id="4047112090469382184">Namna hiki kilivyo salama</translation>
 <translation id="4047345532928475040">Haitumiki</translation>
@@ -2338,6 +2393,7 @@
 <translation id="417475959318757854">Weka Kifungua Programu cha Chrome katikati.</translation>
 <translation id="4176463684765177261">Kimelemazwa</translation>
 <translation id="4179512409951755566">Washa kipengele cha Kusogeza cha OSK</translation>
+<translation id="418062721134714140">Dhibiti vyeti na mipangilio yako ya SSL</translation>
 <translation id="4180788401304023883">Futa cheti cha CA "<ph name="CERTIFICATE_NAME" />"?</translation>
 <translation id="418179967336296930">Kibodi ya Fonetiki (YaZHert) ya Kirusi</translation>
 <translation id="4181841719683918333">Lugha</translation>
@@ -2352,6 +2408,7 @@
 <translation id="4195643157523330669">Fungua katika kichupo kipya</translation>
 <translation id="4195814663415092787">Endelea kutoka mahali ulipoachia</translation>
 <translation id="4197674956721858839">Punguza uchaguzi</translation>
+<translation id="4200689466366162458">Maneno maalum</translation>
 <translation id="4200983522494130825">&amp;Kichupo kipya</translation>
 <translation id="4206144641569145248">Kiumbe wa angani</translation>
 <translation id="420665587194630159">(Kiendelezi hiki kinadhibitiwa na hakiwezi kuondolewa au kulemazwa.)</translation>
@@ -2448,10 +2505,12 @@
 <translation id="4350019051035968019">Kifaa hiki hakiwezi kusajiliwa kwenye kikoa cha akaunti yako kwa sababu kifaa kimewekewa alama kwa usimamizi wa kikoa tofauti.</translation>
 <translation id="4354806558096370704">Huwasha utumiaji wa upande wa nyuma wa uchapishaji wa CUPS asili.</translation>
 <translation id="4355925451975609675">Bonyeza |<ph name="ACCELERATOR1" />|+|<ph name="ACCELERATOR2" />| ili uende mbele</translation>
+<translation id="4358353773267946514"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /></translation>
 <translation id="4358697938732213860">Ongeza anwani</translation>
 <translation id="4359408040881008151">Kilisakinishwa kwa sababu ya kiendelezi au viendelezi vinavyotegemea.</translation>
 <translation id="4361190688154226069">Kulenga katika mionekano kulingana na rect</translation>
 <translation id="4361765875689149937"><ph name="ORIGIN" />  inataka kuoanisha na:</translation>
+<translation id="4363771538994847871">Hakuna sehemu za Kutuma zilizopatikana. Unahitaji usaidizi?</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> imepakuliwa</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> inashiriki dirisha.</translation>
 <translation id="4364830672918311045">Onyesha arifa</translation>
@@ -2543,6 +2602,7 @@
 <translation id="4509345063551561634">Mahali:</translation>
 <translation id="4514542542275172126">Sanidi mtumiaji mpya anayesimamiwa</translation>
 <translation id="4514914692061505365">Lazimisha matumizi ya kitafsiri cha haraka cha Subzero cha PNaCl kwa faili zote za pexe.</translation>
+<translation id="451515744433878153">Ondoa</translation>
 <translation id="4516641987425683031">Vichupo vilivyosawazishwa</translation>
 <translation id="4518677423782794009">Je, Chrome inaacha kufanya kazi, inaonyesha kurasa za mwazo zisizo za kawaida, pau za vidhibiti, au matangazo yasiyotarajiwa usiyoweza kuyaondoa, au kubadilisha hali yako ya kuvinjari? Unaweza kutatua tatizo hilo kwa kuendesha Zana ya Kusafisha Chrome.</translation>
 <translation id="452039078290142656">vifaa visivyojulikana kutoka kwa <ph name="VENDOR_NAME" /></translation>
@@ -2579,6 +2639,7 @@
 <translation id="4562991793854515912">mfupi mno (milisekunde 600)</translation>
 <translation id="4563210852471260509">Lugha ingizo ya kwanza ni Kichina</translation>
 <translation id="456664934433279154">Hudhibiti kuwasha au kuzima Toolkit-Views kulingana na madirisha ya Programu za Chrome.</translation>
+<translation id="4567772783389002344">Ongeza neno</translation>
 <translation id="4569998400745857585">Menyu ina viendelezi vilivyofichwa</translation>
 <translation id="4570444215489785449">Sasa unaweza kufunga kifaa hiki kwa mbali wakati wowote kwenye Kidhibiti cha Chrome.</translation>
 <translation id="4572659312570518089">Uthibitishaji ulighairiwa wakati ikiunganishwa kwa "<ph name="DEVICE_NAME" />".</translation>
@@ -2590,11 +2651,13 @@
 <translation id="4582447636905308869">IME mpya ya Kikorea, ambayo inapatikana kwenye mtambo wa HMM wa Zana za Kuingiza Data kwenye Google.</translation>
 <translation id="4582563038311694664">Weka upya mipangilio yote</translation>
 <translation id="4583537898417244378">Faili batili au iliyoharibika.</translation>
+<translation id="4585793705637313973">Badilisha ukurasa</translation>
 <translation id="4589268276914962177">Mwisho mpya</translation>
 <translation id="4590324241397107707">Hifadhi ya hafadhidata</translation>
 <translation id="4593021220803146968">&amp;Nenda kwa <ph name="URL" /></translation>
 <translation id="4594109696316595112">Uwashaji wa mara moja: Charaza nenosiri lako ili uwashe Smart Lock kwenye <ph name="DEVICE_TYPE" /> hii. Ukiwa na Smart Lock, simu yako itafungua kifaa hiki—bila nenosiri. Ili kubadilisha au kuzima kipengele hiki, tembelea mipangilio yako ya <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4595560905247879544">Programu na viendelezi vinaweza kubadilishwa na msimamizi pekee (<ph name="CUSTODIAN_NAME" />).</translation>
+<translation id="4596295440756783523">Una vyeti kwenye faili vinavyotambua seva hizi</translation>
 <translation id="4598556348158889687">Udhibiti wa hifadhi</translation>
 <translation id="4601242977939794209">Kibadilishaji cha EMF</translation>
 <translation id="4602466770786743961">Ruhusu <ph name="HOST" /> ifikie kamera na maikrofoni yako kila wakati</translation>
@@ -2659,6 +2722,7 @@
 <translation id="4697551882387947560">Wakati kipindi cha kuvinjari kinakamilika</translation>
 <translation id="4699172675775169585">Picha na faili zilizoakibishwa</translation>
 <translation id="4699357559218762027">(imezinduliwa kiotomatiki)</translation>
+<translation id="4704677965327178154">Usiruhusu tovuti yoyote kutumia programu-jalizi kufikia kompyuta yako.</translation>
 <translation id="4707302005824653064">Matumizi na historia vinaweza kukaguliwa na kisimamia (<ph name="CUSTODIAN_EMAIL" />) kwenye chrome.com.</translation>
 <translation id="4707579418881001319">L2TP/IPsec + cheti cha mtumiaji</translation>
 <translation id="4707934200082538898">Tafadhali angalia barua pepe yako <ph name="BEGIN_BOLD" /> <ph name="MANAGER_EMAIL" /> <ph name="END_BOLD" /> kwa maagizo zaidi.</translation>
@@ -2696,6 +2760,7 @@
 <translation id="4744574733485822359">Upakuaji wako umekamilika</translation>
 <translation id="4746971725921104503">Inaonekana tayari unasimamia mtumiaji mwenye jina hilo. Je, ulitaka <ph name="LINK_START" /> kuingiza kwa kifaa hiki<ph name="USER_DISPLAY_NAME" /> <ph name="LINK_END" />?</translation>
 <translation id="4747271164117300400">Kimasedonia</translation>
+<translation id="4748762018725435655">Inahitaji kiendelezi kutoka Duka la Chrome kwenye Wavuti</translation>
 <translation id="4749157430980974800">Kibodi ya Kijojia</translation>
 <translation id="4750394297954878236">Mapendekezo</translation>
 <translation id="475088594373173692">Mtumiaji wa kwanza</translation>
@@ -2709,6 +2774,7 @@
 <translation id="4763830802490665879">Vidakuzi kutoka tovuti anuwai vitafutwa wakati wa kuondoka.</translation>
 <translation id="4764029864566166446">Sasisha programu-jalizi...</translation>
 <translation id="4764865176798926079">domContentLoaded ya fremu kuu na vipakiwa vya rasilimali zote vilianza kabla ya domContentLoaded (iframe zimepuuzwa).</translation>
+<translation id="4768332406694066911">Una vyeti kutoka kwenye mashirika haya vinavyokutambua</translation>
 <translation id="4768698601728450387">Pogoa picha</translation>
 <translation id="4773696473262035477">Unaweza kulifikia na <ph name="SAVED_PASSWORDS_LINK" /> yako yote kutoka kwenye kivinjari chochote.</translation>
 <translation id="4776917500594043016">Nenosiri la <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -2725,10 +2791,12 @@
 <translation id="4793866834012505469">Toa mafunzo mapya ya muundo wa sauti</translation>
 <translation id="479536056609751218">Ukurasa wavuti, HTML Pekee</translation>
 <translation id="479989351350248267">tafuta</translation>
+<translation id="480036413855787547">Fikia manenosiri yako kutoka kwenye kifaa chochote katika <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />. Kwenye Mac, manenosiri yanahifadhiwa kwenye msururu wako wa Ufunguo na kufikiwa au kusawazishwa na watumiaji wengine wa Chrome wanaoshiriki akaunti hii ya OS X.</translation>
 <translation id="4801257000660565496">Unda Mikato ya Programu</translation>
 <translation id="4801448226354548035">Ficha akaunti</translation>
 <translation id="4801512016965057443">Ruhusu matumizi ya data nje ya mtandao wa kawaida</translation>
 <translation id="4801956050125744859">Hifadhi yote mawili</translation>
+<translation id="4803121606678474433">Washa kipengele cha kubadilisha hali ya utoaji wa mkusanyiko wa 2D.</translation>
 <translation id="4803909571878637176">Inasanidua</translation>
 <translation id="4804331037112292643">Kidirisha cha Kufungua/Kuhifadhi Faili</translation>
 <translation id="4804818685124855865">Tenganisha</translation>
@@ -2747,6 +2815,7 @@
 <translation id="4824518112777153488">Matumizi ya skrini za kugusa zenye uwezo wa kuelea juu</translation>
 <translation id="4827948050554950725">Ongeza kadi ya malipo</translation>
 <translation id="4828493911650550108">Imarisha usahihi wa mahali kwa kuruhusu programu na huduma zitafute mitandao ya WiFi na vifaa vya Bluetooth.</translation>
+<translation id="4828937774870308359">Mwastralia</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> yako haiwezi kuunganisha kwenye Intaneti kwa kutumia <ph name="NETWORK_NAME" />. Tafadhali chagua mtandao mwingine. <ph name="LEARN_MORE_LINK_START" />Pata maelezo zaidi<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Utambulisho wa <ph name="ORGANIZATION" /> <ph name="LOCALITY" /> umethibitishwa na <ph name="ISSUER" />. Maelezo ya Uwazi wa Cheti Sahihi yalisambazwa na seva.</translation>
 <translation id="4834912470034578916">Washa kipengee cha miundo maalum kwa Arifa za Wavuti.</translation>
@@ -2765,6 +2834,7 @@
 <translation id="4849517651082200438">Usisakinishe</translation>
 <translation id="4850258771229959924">Angalia katika Zana za Msanidi Programu</translation>
 <translation id="4850458635498951714">Ongeza kifaa</translation>
+<translation id="4850669014075537160">Kusogeza</translation>
 <translation id="4850886885716139402">Mwonekano</translation>
 <translation id="4853020600495124913">Fungua katika &amp;dirisha jipya</translation>
 <translation id="485316830061041779">Kijerumani</translation>
@@ -2812,6 +2882,7 @@
 <translation id="4903369323166982260">Tumia Zana ya Kusafisha Chrome</translation>
 <translation id="4906679076183257864">Rejesha kwenye Chaguo-msingi</translation>
 <translation id="4907125798206348918">MemoryCache ni Dhaifu</translation>
+<translation id="4907306957610201395">Aina ya Ruhusa</translation>
 <translation id="49088176676474409">Ficha thamani za VPD.</translation>
 <translation id="4910021444507283344">WebGL</translation>
 <translation id="4910673011243110136">Mitandao ya faragha</translation>
@@ -2838,6 +2909,7 @@
 <translation id="4938972461544498524">Mipangilio ya padimguso</translation>
 <translation id="4940047036413029306">Nukuu</translation>
 <translation id="4941246025622441835">Tumia shurutisho la kifaa hiki unapoandikisha kifaa kwa usimamizi wa biashara:</translation>
+<translation id="4941627891654116707">Ukubwa wa fonti</translation>
 <translation id="4942394808693235155">Angalia na utumie sasisho</translation>
 <translation id="494286511941020793">Msaada wa Usanidi wa Proksi</translation>
 <translation id="4950138595962845479">Chaguo...</translation>
@@ -2848,6 +2920,7 @@
 <translation id="4956847150856741762">1</translation>
 <translation id="495931528404527476">Katika Chrome</translation>
 <translation id="496226124210045887">Folda uliyochagua ina faili nyeti. Je, una uhakika unataka kutoa uwezo wa kudumu wa kufikia kuandika folda hii kwa "$1"?</translation>
+<translation id="4964455510556214366">Mpangilio</translation>
 <translation id="4964673849688379040">Inakagua...</translation>
 <translation id="4966802378343010715">Weka mtumiaji mpya</translation>
 <translation id="4967749818080339523">Chagua akaunti</translation>
@@ -2875,6 +2948,7 @@
 <translation id="4992066212339426712">Rejesha sauti</translation>
 <translation id="4992458225095111526">Thibitisha Powerwash</translation>
 <translation id="4992576607980257687">Niulize tovuti inapotaka kutumia ujumbe wa kipekee kufikia vifaa vya MIDI (inapendekezwa)</translation>
+<translation id="4994474651455208930">Ruhusu tovuti kutuma ombi la kuwa vidhibiti chaguo-msingi vya itifaki</translation>
 <translation id="4998873842614926205">Thibitisha Mabadiliko</translation>
 <translation id="4999273653895592255">Kipengele hiki hudhibiti iwapo tutaonyesha Kiolesura cha zamani au kipya kwa ajili ya dirisha la kiteua cha kupeperusha skrini ya eneo-kazi.</translation>
 <translation id="499955951116857523">Kidhibiti faili</translation>
@@ -2971,6 +3045,7 @@
 <translation id="5144820558584035333">Seti ya Hangul 3 (390)</translation>
 <translation id="5145331109270917438">Tarehe ilipobadilishwa</translation>
 <translation id="5146631943508592569">Zima Arifa kuhusu Mwisho wa Matumizi ya Kifaa.</translation>
+<translation id="5147113189823897615">Kwa sababu akaunti hii inadhibitiwa na <ph name="DOMAIN" />, alamisho, historia, manenosiri, na mipangilio yako mingine itafutwa kwenye kifaa hiki. Hata hivyo, data yako itaendelea kuhifadhiwa katika Akaunti yako ya Google.</translation>
 <translation id="5147237161038757796">Kibodi inayoonekana ya kurekebisha kiotomatiki</translation>
 <translation id="5148320352496581610">Kulenga kwa misingi ya mstatili hutumia utatuaji wa haraka ili ubaini uwezekano wa lengo la ishara, ambapo eneo la mguso huwakilishwa na mstatili.</translation>
 <translation id="5150254825601720210">Jina la Seva ya SSL ya Cheti cha Netscape</translation>
@@ -3007,6 +3082,7 @@
 <translation id="5181140330217080051">Inapakua</translation>
 <translation id="5182671122927417841">Lemaza kiendelezi</translation>
 <translation id="5184063094292164363">Kidhibiti Kazi cha &amp;JavaScript</translation>
+<translation id="5184662919967270437">Inasasisha kifaa chako</translation>
 <translation id="5185386675596372454">Toleo jipya zaidi la "<ph name="EXTENSION_NAME" />" limezimwa kwa sababu linahitaji idhini zaidi.</translation>
 <translation id="5185403602014064051">Kipengele hiki hukuruhusu kufikia kwa haraka mtumiaji yeyote aliyeingia katika akaunti bila ya kuhitaji nenosiri.</translation>
 <translation id="5186650237607254032">Sasisha kipengele cha kufunga skrini ya simu yako ili ijizime ukiwa karibu. Utaifungua simu haraka zaidi na ufurahie hali bora ya matumizi ya Smart Lock kwenye <ph name="DEVICE_TYPE" /> yako.</translation>
@@ -3018,6 +3094,7 @@
 <translation id="5197255632782567636">Wavuti</translation>
 <translation id="5197680270886368025">Ulinganishaji umemalizika.</translation>
 <translation id="5204967432542742771">Weka nenosiri</translation>
+<translation id="5206215183583316675">Ungependa kufuta "<ph name="CERTIFICATE_NAME" />"?</translation>
 <translation id="520621735928254154">Hitilafu ya Kuleta Cheti</translation>
 <translation id="5208988882104884956">Nusu upana</translation>
 <translation id="5209320130288484488">Hakuna vifaa vilivyopatikana</translation>
@@ -3035,6 +3112,7 @@
 <translation id="5227808808023563348">Tafuta maandishi ya awali</translation>
 <translation id="5228076606934445476">Kuna tatizo fulani katika kifaa. Ili kurekebisha hitilafu hii itakubidi uzime na kuwasha tena kifaa chako na ujaribu tena.</translation>
 <translation id="5228962187251412618">Ukaguaji wa mtandaoni pekee</translation>
+<translation id="5229189185761556138">Dhibiti mbinu za kuingiza data</translation>
 <translation id="5229622432348746578">Zima kipengele cha Kushiriki Sauti Kwenye Kompyuta ya Mezani</translation>
 <translation id="5230516054153933099">Dirisha</translation>
 <translation id="5232178406098309195">Unapotumia amri za sauti, kama vile "Ok Google" au kugusa aikoni ya maikrofoni, Shughuli zako za faragha za Sauti na Kutamka huhifadhi baadhi ya sauti kwenye akaunti yako. Rekodi ya matamshi au sauti inayofuata, pamoja na sekunde chache kabla, itahifadhiwa.</translation>
@@ -3214,7 +3292,6 @@
 <translation id="5439568486246921931">Kitendo hiki kitafuta kabisa vipakuliwa, faili za nje ya mtandao na data ya kuvinjari ya mtumiaji huyu. Kitendo hiki hakiwezi kutenduliwa.</translation>
 <translation id="544083962418256601">Unda njia mikato...</translation>
 <translation id="5441100684135434593">Mtandao wa waya</translation>
-<translation id="5445088910157062298">Ruhusu huduma ya mahali ya Google isaidie programu kupata mahali ulipo haraka na kwa usahihi, kufanya hivyo kunaweza kupunguza matumizi ya betri. Data ya mahali isiyo na vipengee vinavyoweza kukutambulisha itatumwa kwa Google, hata wakati hakuna programu inayotumika.</translation>
 <translation id="5448293924669608770">Lo! hitilafu imetokea wakati wa kuingia kwenye akaunti</translation>
 <translation id="5449588825071916739">Alamisha Vichupo Vyote</translation>
 <translation id="5449716055534515760">Funga Dirisha</translation>
@@ -3377,6 +3454,7 @@
 <translation id="5675224880872496917">Huuisha kwa njia taratibu unaposogeza maudhui ya ukurasa.</translation>
 <translation id="5676267133227121599">Fikia manenosiri yako kutoka kwenye kifaa chochote kwenye <ph name="MANAGEMENT_LINK" />.</translation>
 <translation id="5677503058916217575">Lugha ya ukurasa:</translation>
+<translation id="5677850799565527075">Zuia vidakuzi vya tovuti nyingine.</translation>
 <translation id="5677928146339483299">Vilivyozuiwa</translation>
 <translation id="5678550637669481956">Idhini ya kufikia kusoma na kuandika kwenye <ph name="VOLUME_NAME" /> imeruhusiwa.</translation>
 <translation id="567881659373499783">Toleo <ph name="PRODUCT_VERSION" /></translation>
@@ -3406,6 +3484,7 @@
 <translation id="5711983031544731014">Haiwezi kufungua. Weka nenosiri lako.</translation>
 <translation id="5712966208980506909">Ikiwashwa, URL ya chrome://md-policy hupakia ukurasa wa sera ya Usanifu Bora.</translation>
 <translation id="5715711091495208045">Dalali wa Programu-jalizi: <ph name="PLUGIN_NAME" /></translation>
+<translation id="5719603411793408026">Mitambo ya kutafuta chaguo-msingi</translation>
 <translation id="572328651809341494">Vichupo vya hivi majuzi</translation>
 <translation id="5723508132121499792">Hakuna programu ya maandharinyuma inayoendesha</translation>
 <translation id="5725124651280963564">Tafadhali ingia kwenye <ph name="TOKEN_NAME" /> ili kuunda kitufe cha <ph name="HOST_NAME" />.</translation>
@@ -3413,14 +3492,18 @@
 <translation id="572525680133754531">Inaonyesha mpaka katika Safu zilizojumlishwa za Kuonyesha ili kusaidia kutatua na ujumuishaji wa safu ya mafunzo.</translation>
 <translation id="5726521882516480114">Huwasha matumizi ya GPU kutekeleza uonyeshaji wa mkusanyiko wa 2d badala ya kutumia uonyeshaji wa programu.</translation>
 <translation id="5727728807527375859">Viendelezi, programu, na mandhari vinaweza kudhuru kompyuta yako. Je, una hakika unataka kuendelea?</translation>
+<translation id="5727970983344022445">Usiruhusu tovuti yoyote kutumia uundaji funguo katika fomu</translation>
 <translation id="5729712731028706266">&amp;Ona</translation>
 <translation id="5729996640881880439">Samahani, hatuwezi kuonyesha msimbo wa hitilafu hii.</translation>
 <translation id="5731247495086897348">&amp;Bandika Uende</translation>
 <translation id="5731751937436428514">Mbinu ingizo ya Kivietnamu (VIQR)</translation>
 <translation id="5732790216998904518">Office Editing kwa ajili ya Hati, Majedwali na Slaidi za Google kwa madhumuni ya majaribio.</translation>
 <translation id="5734362860645681824">Mawasiliano</translation>
+<translation id="5739458112391494395">Kubwa sana</translation>
+<translation id="5740331643563157105"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" />, na nyingine <ph name="NUM_ADDITIONAL_LANGUAGES" /></translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: chagua ili kubadilisha</translation>
 <translation id="5741454054957165976">Washa kipengele cha Toleo jipya la Suluhu ya Ala ya Mtumiaji kwa ajili ya upakiaji wa WebFonts.</translation>
+<translation id="5742598604154146709">Usiruhusu tovuti yoyote kupakua faili nyingi kiotomatiki.</translation>
 <translation id="574392208103952083">Wastani</translation>
 <translation id="5744368829843057748">Kiolesura cha 2016Q2 ya Tafsiri</translation>
 <translation id="5745056705311424885">Hifadhi ya USB imegunduliwa</translation>
@@ -3604,6 +3687,7 @@
 <translation id="5996258716334177896">Wasifu wako haukuweza kufunguliwa ipasavyo. 
 
 Vipengee fulani huenda visipatikane, Tafadhali hakikisha kuwa wasifu upo na una idhini ya kusoma na kuandika maudhui yake.</translation>
+<translation id="6001799583597751002">PIN hazilingani:</translation>
 <translation id="6003177993629630467"><ph name="PRODUCT_NAME" /> huenda isiwezi kujisasisha.</translation>
 <translation id="6003294706906016758">Huwasha fremu ya mtindo wa programu ya wavuti kwa programu zilizopangishwa</translation>
 <translation id="600424552813877586">programu batili.</translation>
@@ -3629,6 +3713,7 @@
 <translation id="604001903249547235">Hifadhi rudufu ya wingu</translation>
 <translation id="6040143037577758943">Funga</translation>
 <translation id="604124094241169006">Otomatiki</translation>
+<translation id="6041935588605837913">10</translation>
 <translation id="6042308850641462728">Zaidi</translation>
 <translation id="604257181445267932">Smart Lock hukusaidia kuingia katika programu na tovuti kwa haraka kwa kutumia manenosiri ambayo umehifadhi kwenye Google.</translation>
 <translation id="6043317578411397101"><ph name="APP_NAME" /> inashiriki kichupo cha Chrome na <ph name="TAB_NAME" />.</translation>
@@ -3648,6 +3733,7 @@
 <translation id="6062697480277116433">Unatumia data ya simu za mkononi</translation>
 <translation id="6065289257230303064">Vipengele vya Saraka ya Vichwa cha Vyeti</translation>
 <translation id="6071181508177083058">thibitisha nenosiri</translation>
+<translation id="6073903501322152803">Ongeza vipengele vya zana za walio na matatizo ya kuona au kusikia</translation>
 <translation id="6074825444536523002">Fomu ya Google</translation>
 <translation id="6075731018162044558">Lo!  Mfumo umeshindwa kupata tokeni ya ufikiaji wa API ya muda mrefu kwa kifaa hiki.</translation>
 <translation id="6075880972317537864">Wavamizi kwenye <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> huenda wakajaribu kukulaghai ili waibe maelezo yako (kwa mfano, manenosiri, ujumbe, au kadi za mkopo).</translation>
@@ -3682,7 +3768,6 @@
 <translation id="6110466548232134880">Utambulisho wa <ph name="ORGANIZATION" /> <ph name="LOCALITY" /> umethibitishwa na <ph name="ISSUER" />. Hakuna maelezo ya Uwazi wa Cheti yaliyosambazwa na seva.</translation>
 <translation id="6111770213269631447">Unukuzi wa mfumo wa kuandika (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Kimeruhusiwa kama chaguo-msingi</translation>
-<translation id="6112929985131461002">Kifaa hiki kitatuma kiotomatiki data ya utambuzi wa matatizo na matumizi kwa Google. <ph name="BEGIN_LINK1" />Mipangilio<ph name="END_LINK1" /> hii inatekelezwa na msimamizi wako. <ph name="BEGIN_LINK2" />Pata Maelezo zaidi<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Badilisha mipangilio ya lugha na uingizaji</translation>
 <translation id="6120205520491252677">Bana ukurasa huu kwenye skirini ya Kuanza...</translation>
 <translation id="6122081475643980456">Muunganisho wako wa Intaneti unadhibitiwa</translation>
@@ -3704,8 +3789,10 @@
 <translation id="6143186082490678276">Pata Usaidizi</translation>
 <translation id="6144697279259829572">{NUM_ITEMS,plural, =1{Hii itafuta kabisa angalau kipengee $1 kwenye kifaa hiki.}other{ Hii itafuta kabisa angalau vipengee $1 kwenye kifaa hiki.}}</translation>
 <translation id="6144890426075165477"><ph name="PRODUCT_NAME" /> sio kivinjari chako chaguo-msingi kwa sasa.</translation>
+<translation id="6145860855437952742">Idadi ya juu ya madirisha ya maonyesho ya kuchungulia katika hali ya muhtasari yanayoweza kutumia mifano kuficha vichwa vya madirisha na kutumia kona duara.</translation>
 <translation id="6147020289383635445">Uhakiki wa chapa umeshindwa.</translation>
 <translation id="614998064310228828">Muundo wa kifaa:</translation>
+<translation id="6150555451039504280">Punguza/panua</translation>
 <translation id="6150853954427645995">Ili kuhifadhi faili hii kwa matumizi ya nje ya mtandao, rudi mtandaoni, bofya faili kulia, na uchague chaguo la <ph name="OFFLINE_CHECKBOX_NAME" />.</translation>
 <translation id="6151323131516309312">Bofya <ph name="SEARCH_KEY" /> ili kutafuta <ph name="SITE_NAME" /></translation>
 <translation id="6154697846084421647">Aliyeingia sasa</translation>
@@ -3803,6 +3890,7 @@
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Printa mpya kwenye mtandao wako}other{Printa mpya kwenye mtandao wako}}</translation>
 <translation id="6285395082104474418">Treya ya hali inakuonyesha hali ya sasa ya mtandao wako, betri, na mambo mengine.</translation>
 <translation id="6286684120317096255">Matumizi ya data yanapimwa</translation>
+<translation id="6286708577777130801">Maelezo ya nenosiri lililohifadhiwa</translation>
 <translation id="6287852322318138013">Chagua programu ili ufungue faili hii</translation>
 <translation id="6288919040208869552">Seva mbadala ikiwa imesanidiwa, kwa kawaida huzuia uidhinishaji kwenye kurasa tofauti za mwanzo. Hii huwezesha kufungua kidirisha cha uidhinishaji wa ukurasa wa mwanzo katika dirisha tofauti, linalopuuza mipangilio ya seva mbadala.</translation>
 <translation id="6290556621549272952">Unaweza kutumia kipengele hiki kuonyesha maudhui kutoka Chromium kwenye TV au vifaa vyako vingine.</translation>
@@ -3844,6 +3932,7 @@
 <translation id="6353618411602605519">Kibodi ya Kikorasia</translation>
 <translation id="6356936121715252359">Mipangilio ya uhifadhi wa Adobe Flash Player...</translation>
 <translation id="6357619544108132570">Karibu kwenye familia ya <ph name="SHORT_PRODUCT_NAME" />. Hii si kompyuta ya kawaida.</translation>
+<translation id="63617602971594377">Washa API ya malipo kwenye wavuti</translation>
 <translation id="6361850914223837199">Maelezo ya hitilafu:</translation>
 <translation id="6362853299801475928">&amp;Ripoti matumizi mabaya...</translation>
 <translation id="636343209757971102">Anwani ya IPv6:</translation>
@@ -3879,6 +3968,7 @@
 <translation id="6410063390789552572">Maabara ya mtandao haiwezi kufikiwa</translation>
 <translation id="6410257289063177456">Faili za Picha</translation>
 <translation id="6410328738210026208">Badilisha kituo na Powerwash</translation>
+<translation id="6410668567036790476">Ongeza mtambo wa kutafuta</translation>
 <translation id="641105183165925463">$1 MB</translation>
 <translation id="6412931879992742813">Dirisha fiche jipya</translation>
 <translation id="6418160186546245112">Kurejesha toleo lililosakinishwa la <ph name="IDS_SHORT_PRODUCT_NAME" /></translation>
@@ -3911,14 +4001,15 @@
 <translation id="6443783728907198276">Ikiwashwa, ujumbe wa Stun unaoundwa na WebRTC utakuwa na kijajuu Asili.</translation>
 <translation id="6444070574980481588">Weka tarehe na saa</translation>
 <translation id="6445450263907939268">Kama hutaki mabadiliko haya, unaweza kurejesha mipangilio yako ya awali.</translation>
+<translation id="6447388538018752757">Washa kipengele cha kubadilisha bomba la utoaji picha zinazobadilika katika mkusanyiko wa 2D ili kuimarisha utendaji kulingana na aina ya michoro inayotekelezwa.</translation>
 <translation id="6447842834002726250">Vidakuzi</translation>
 <translation id="6449285849137521213">Programu "<ph name="EXTENSION_NAME" />" imeongezwa.</translation>
 <translation id="6450876761651513209">Badilisha mipangilio yako inayohusiana na faragha</translation>
+<translation id="6451180435462401570">Dhibiti vifaa vya Google Cloud Print</translation>
 <translation id="6451650035642342749">Futa mipangilio ya ufunguaji kiotomatiki</translation>
 <translation id="6452181791372256707">Kataa</translation>
 <translation id="6454421252317455908">Mbinu ingizo ya Kichina (haraka)</translation>
 <translation id="6455348477571378046">Aina ya Cheti:</translation>
-<translation id="6456234919706689841">Msimamizi wako anaweza kuamua kutuma data ya utambuzi wa matatizo na matumizi ya kifaa hiki kwa Google. Unaweza kuangalia <ph name="BEGIN_LINK1" />mipangilio<ph name="END_LINK1" /> hii hapa. <ph name="BEGIN_LINK2" />Pata Maelezo zaidi<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Endelea kuzuia JavaScript</translation>
 <translation id="6458308652667395253">Dhibiti uzuiaji wa Javascript...</translation>
 <translation id="6459488832681039634">Tumia Iliyochaguliwa Kupata</translation>
@@ -3972,10 +4063,12 @@
 <translation id="6526654154229718724">Jaribio la skrini nzima yenye hali ya kufunga kibodi inayowahitaji watumiaji kushikilia Esc ili waondoke.</translation>
 <translation id="6527303717912515753">Shiriki</translation>
 <translation id="6528546217685656218">Ufunguo wa Faragha wa Cheti hiki cha Seva Teja haupo au si sahihi.</translation>
+<translation id="652948702951888897">Historia ya Chrome</translation>
 <translation id="653019979737152879">Inasawazisha <ph name="FILE_NAME" />...</translation>
 <translation id="6534583978616527129">Anzisha muunganisho</translation>
 <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Kumbuka:<ph name="END_BOLD" /> Washa tu kama unajua unachofanya au kama umeambiwa ufanye hivyo, kwani mkusanyiko wa data unaweza kupunguza utendaji.</translation>
 <translation id="654233263479157500">Tumia huduma ya mtandao kusaidia kutatua hitilafu za kutalii</translation>
+<translation id="6545665334409411530">Ukadiriaji wa kurudia</translation>
 <translation id="6545834809683560467">Tumia huduma ya kutabiri ili isaidie kukamilisha utafutaji na URL zilizoingizwa katika upau wa anwani au katika kisanduku cha kutafutia kizindua programu</translation>
 <translation id="6546686722964485737">Jiunge kwenye mtandao wa WiMAX</translation>
 <translation id="6547316139431024316">Usitume onyo kuhusu kiendelezi hiki tena</translation>
@@ -4046,9 +4139,11 @@
 <translation id="6643016212128521049">Futa</translation>
 <translation id="6644756108386233011">Je, ungependa kuweka upya mipangilio iliyobadilishwa ya <ph name="IDS_SHORT_PRODUCT_NAME" />?</translation>
 <translation id="6647228709620733774">URL ya Kupinga Mamlaka ya Uidhinishaji wa Netscape</translation>
+<translation id="6647838571840953560">Hivi sasa kwenye <ph name="CHANNEL_NAME" /></translation>
 <translation id="6649018507441623493">Subiri kidogo...</translation>
 <translation id="6649068951642910388">Kiolesura cha kurejesha kipindi kitaonyeshwa katika kiputo badala ya upau wa maelezo.</translation>
 <translation id="665061930738760572">Fungua katika &amp;Dirisha Jipya</translation>
+<translation id="6651237644330755633">Amini cheti hiki kwa ajili ya kutambua tovuti</translation>
 <translation id="6652975592920847366">Unda Media OS ya Ufufuzi</translation>
 <translation id="6653525630739667879">Haiwezi kuhifadhi kwenye $1. Mabadiliko yote yatahifadhiwa kwenye $2 katika folda ya Vipakuliwa.</translation>
 <translation id="6655190889273724601">Hali ya Wasanidi Programu</translation>
@@ -4103,6 +4198,7 @@
 <translation id="6725970970008349185">Idadi ya wagombea ya kuonyesha kwa kila ukurasa</translation>
 <translation id="672609503628871915">Angalia yaliyo mapya</translation>
 <translation id="6727005317916125192">Dirisha lililotangulia</translation>
+<translation id="6727842159866499206">Idadi ya juu ya zaidi ya madirisha ya maoenyesho ya kuchungulia katika hali ya muhtasari yanayoweza kutumia maumbo kuficha vichwa vya dirisha.</translation>
 <translation id="6731320427842222405">Huenda hii ikachukua dakika kadhaa</translation>
 <translation id="6731638353631257659">Hali ya kuakibisha ya V8.</translation>
 <translation id="6732586201820838268">Haikuweza kutambua muunganisho kwenye simu yako. Hakikisha kuwa unatumia simu ya Android inayooana ambayo imewashwa na unayoweza kufikia. &lt;a&gt;Pata maelezo zaidi&lt;/a&gt;</translation>
@@ -4128,6 +4224,7 @@
 <translation id="6769712124046837540">Inaongeza printa...</translation>
 <translation id="6771503742377376720">Ni Idhini ya Cheti</translation>
 <translation id="6773575010135450071">Vitendo zaidi...</translation>
+<translation id="677965093459947883">Ndogo sana</translation>
 <translation id="6780439250949340171">dhibiti mipangilio mingine</translation>
 <translation id="6786747875388722282">Viendelezi</translation>
 <translation id="6787839852456839824">Mikato ya kibodi</translation>
@@ -4151,6 +4248,7 @@
 <translation id="6815353853907306610"><ph name="IDS_SHORT_PRODUCT_NAME" /> iligundua kwamba mipangilio ya kivinjari chako huenda imebadilishwa bila ufahamu wako. Ungependa kuirejesha katika chaguo-msingi lake la awali?</translation>
 <translation id="6815551780062710681">badilisha</translation>
 <translation id="6817358880000653228">Nenosiri la tovuti hii limehifadhiwa:</translation>
+<translation id="6820008762872335722">Weka upya iwe uulize</translation>
 <translation id="6820687829547641339">Gzip imebana kumbukumbu ya tar</translation>
 <translation id="682123305478866682">Tuma eneo-kazi</translation>
 <translation id="6823506025919456619">Unahitaji kuingia katika Chrome ili uone vifaa vyako</translation>
@@ -4170,7 +4268,9 @@
 <translation id="6833901631330113163">wa Ulaya ya Kusini</translation>
 <translation id="683526731807555621">Ongeza mtambo mpya</translation>
 <translation id="6835762382653651563">Tafadhali unganisha kwenye Intaneti ili usasishe <ph name="DEVICE_TYPE" /> yako.</translation>
+<translation id="6839158130869314728">Maonyesho ya kioo</translation>
 <translation id="6839225236531462745">Hitilafu ya Ufutaji wa Cheti</translation>
+<translation id="6840155290835956714">Uliza kabla ya kutuma</translation>
 <translation id="6840184929775541289">Siyo Idhini ya Cheti</translation>
 <translation id="6840313690797192085">$1 PB</translation>
 <translation id="6841186874966388268">Hitilafu</translation>
@@ -4180,6 +4280,7 @@
 <translation id="6847758263950452722">Hifadhi Ukurasa kama MHTML</translation>
 <translation id="6853388645642883916">Kisasishaji kimetulia</translation>
 <translation id="68541483639528434">Funga vichupo vingine</translation>
+<translation id="6855099371444560844">Ongeza Kifaa</translation>
 <translation id="6856701878604560493">Washa kipengele cha alamisho za nje ya mtandao</translation>
 <translation id="6860097299815761905">Mipangilio ya proksi...</translation>
 <translation id="6860427144121307915">Fungua katika Kichupo</translation>
@@ -4260,11 +4361,13 @@
 <translation id="6980956047710795611">Hamia kwenye data yote ya OS ya Chrome katika nenosiri jipya
 (inahitaji nenosiri la awali)</translation>
 <translation id="6981982820502123353">Upatikanaji</translation>
+<translation id="6981992744085917617">Chagua mbinu ambayo ungependa kutumia kuingia tena katika akaunti yako:</translation>
 <translation id="6982896539684144327">Printa kutoka <ph name="VENDOR_NAME" /> imetambuliwa</translation>
 <translation id="6983783921975806247">OID Iliyosajiliwa</translation>
 <translation id="6983991971286645866">Mabadiliko yote yatahifadhiwa kwenye $1.</translation>
 <translation id="6985235333261347343">Kifaa cha Kuopoa Funguo cha Microsoft</translation>
 <translation id="6985276906761169321">Kitambulisho:</translation>
+<translation id="6985607387932385770">Printa</translation>
 <translation id="6986605181115043220">Lo, Ulinganishaji umekoma kufanya kazi. <ph name="BEGIN_LINK" />Pata Maelezo Zaidi<ph name="END_LINK" /></translation>
 <translation id="6989294135336900804">Hakuna vichupo vilivyosawazishwa</translation>
 <translation id="6990081529015358884">Nafasi yako imeisha</translation>
@@ -4287,6 +4390,7 @@
 <translation id="7006844981395428048">Sauti $1</translation>
 <translation id="7008270479623533562">Ili utumie kiendelezi hiki, unahitaji kuonyesha ukurasa upya. Unaweza kutumia kiendelezi hiki kiotomatiki kwenye tovuti hii kwa kubofya kulia kwenye aikoni ya kiendelezi.</translation>
 <translation id="7009045250432250765">Kujaza otomatiki kwa mbofyo mmoja</translation>
+<translation id="7009420427128923703">Idadi ya juu ya zaidi ya madirisha katika muhtasari yanayoweza kutumia mifano.</translation>
 <translation id="7010160495478792664">Usimbuaji wa video ya kuongeza kasi kwa kutumia maunzi inapopatikana.</translation>
 <translation id="7010400591230614821">Mkakati thabiti wa kichupo kilichotolewa</translation>
 <translation id="701080569351381435">Angalia chanzo</translation>
@@ -4332,6 +4436,7 @@
 <translation id="7061692898138851896">Hifadhi manenosiri kiotomatiki</translation>
 <translation id="7062222374113411376">Ruhusu tovuti zilizofungwa hivi punde zimalize kutuma na kupokea data (inapendekezwa)</translation>
 <translation id="7063129466199351735">Inachakata mikato...</translation>
+<translation id="7063957500469387217">Weka mipangilio au udhibiti printa katika Google Cloud Print.</translation>
 <translation id="7065223852455347715">Kifaa hiki kimefungwa katika hali ambayo inazuia usajili wa biashara. Ikiwa unataka kusajili kifaa unahitaji kupitia urejeshaji wa kifaa kwanza.</translation>
 <translation id="7065534935986314333">Kuhusu Mfumo</translation>
 <translation id="7066944511817949584">Imeshindwa kuunganisha kwenye "<ph name="DEVICE_NAME" />".</translation>
@@ -4394,6 +4499,7 @@
 <translation id="715118844758971915">Printa za zamani</translation>
 <translation id="7154130902455071009">Badilisha ukurasa wako uwe: <ph name="START_PAGE" /></translation>
 <translation id="715487527529576698">Modi ya Kwanza ya Kichina ni Kichina Kilichorahisishwa</translation>
+<translation id="7155171745945906037">Picha iliyopo kutoka kwenye kamera au faili</translation>
 <translation id="715568033737470079">Bainisha programu-jalizi za PPAPI ambazo zitatumiwa ndani ya sera ya sehemu ya majarabio ya Win32k (Windows 10 na matoleo ya baadaye).</translation>
 <translation id="7156235233373189579">Faili hii imeundwa kwa PC inayotumia programu ya Windows. Hii haioani na kifaa chako kinachotumia Chrome OS. Tafadhali tafuta <ph name="BEGIN_LINK" />Duka la Chrome Wavutini<ph name="END_LINK" /> kwa programu nyingine inayofaa.<ph name="BEGIN_LINK_HELP" />Pata Maelezo zaidi<ph name="END_LINK_HELP" /></translation>
 <translation id="7157063064925785854">Kwa kubofya Endelea unakubaliana na <ph name="LEGAL_DOC_LINK_TEXT_1" /> , <ph name="LEGAL_DOC_LINK_TEXT_2" /> , <ph name="LEGAL_DOC_LINK_TEXT_3" /> , na <ph name="LEGAL_DOC_LINK_TEXT_4" /> .</translation>
@@ -4410,6 +4516,7 @@
 <translation id="7175353351958621980">Imepakiwa kutoka:</translation>
 <translation id="7180611975245234373">Onyesha upya</translation>
 <translation id="7180865173735832675">Binafsisha</translation>
+<translation id="7185078796915954712">TLS 1.3</translation>
 <translation id="7185690883425432021">Huficha vitufe vya kufunga vya vichupo visivyotumika kidhibiti kikiwa katika hali ya kupangwa kwa rafu.</translation>
 <translation id="7186088072322679094">Weka katika Upau wa Vidhibiti</translation>
 <translation id="719009910964971313">Kibodi ya Programmer Dvorak, Marekani</translation>
@@ -4449,6 +4556,8 @@
 <translation id="7240120331469437312">Jina Mbadala la Kichwa cha Cheti</translation>
 <translation id="7241389281993241388">Tafadhali ingia kwenye <ph name="TOKEN_NAME" /> ili kuleta cheti cha mteja.</translation>
 <translation id="7243055093079293866">Sema "Ok Google" katika kichupo kipya na google.com</translation>
+<translation id="7243632151880336635">Futa na Uondoke kwenye Akaunti</translation>
+<translation id="7245628041916450754"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Bora)</translation>
 <translation id="724691107663265825">Tovuti iliyo mbele ina programu hasidi</translation>
 <translation id="725109152065019550">Samahani, msimamizi wako amelemaza hifadhi ya nje kwenye akaunti yako.</translation>
 <translation id="7252661675567922360">Usipakie</translation>
@@ -4462,7 +4571,9 @@
 <translation id="7262004276116528033">Huduma hii ya kuingia katika akaunti inatolewa na <ph name="SAML_DOMAIN" /></translation>
 <translation id="7262221505565121">Vighairi vya idhini ya kufikia programu-jalizi isiyo kwenye sandbox</translation>
 <translation id="7264275118036872269">Imeshindwa kuanzisha ugunduzi wa kifaa cha Bluetooth.</translation>
+<translation id="7264454014834869122">Chagua kutoka kwenye Duka la Chrome kwenye Wavuti</translation>
 <translation id="726502072182862130">Jina na aikoni ya wasifu kwenye Google</translation>
+<translation id="7267186368513450821">5</translation>
 <translation id="7268365133021434339">Funga Vichupo</translation>
 <translation id="7268659760406822741">Huduma zinazopatikana</translation>
 <translation id="7273110280511444812">mwisho iliambatishwa tarehe <ph name="DATE" /></translation>
@@ -4479,6 +4590,7 @@
 <translation id="7287143125007575591">Umenyimwa idhini ya kufikia.</translation>
 <translation id="7288592446024861651">Alamisho, historia, manenosiri na mipangilio yako mingine itasawazishwa kwenye Akaunti yako ya Google ili uweze kuitumia kwenye vifaa vyako vyote. Dhibiti kipengee cha kusawazisha katika <ph name="BEGIN_LINK" />.</translation>
 <translation id="7288676996127329262">Dpi <ph name="HORIZONTAL_DPI" /> x <ph name="VERTICAL_DPI" /></translation>
+<translation id="7289225569524511578">Fungua programu ya mandhari</translation>
 <translation id="7290242001003353852">Huduma hii ya kuingia katika akaunti, inayopangishwa na <ph name="SAML_DOMAIN" />, ina idhini ya kufikia kamera yako.</translation>
 <translation id="7290594223351252791">Thibitisha usajili</translation>
 <translation id="7295019613773647480">Washa watumiaji wanaosimamiwa</translation>
@@ -4517,6 +4629,7 @@
 <translation id="7347751611463936647">Ili kutumia kiendelezi hiki, charaza " <ph name="EXTENSION_KEYWORD" /> ", kisha KICHUPO, halafu amri au utafutaji wako.</translation>
 <translation id="7348093485538360975">Kibodi ya skrini</translation>
 <translation id="7348749398828259943">Kibodi ya US Workman ya kimataifa</translation>
+<translation id="7352495173098919663">Badilisha</translation>
 <translation id="7352651011704765696">Hitilafu fulani imetokea</translation>
 <translation id="7353651168734309780"><ph name="EXTENSION_NAME" /> inahitaji vibali vipya</translation>
 <translation id="7361039089383199231">Baiti $1</translation>
@@ -4628,6 +4741,7 @@
 <translation id="749028671485790643">Mtu <ph name="VALUE" /></translation>
 <translation id="7491962110804786152">kichupo</translation>
 <translation id="7493386493263658176">Huenda kiendelezi cha <ph name="EXTENSION_NAME" /> kikahifadhi maandishi yote unayocharaza, ikiwemo data ya kibinafsi kama vile manenosiri na nambari za kadi za mikopo. Je, ungependa kutumia kiendelezi hiki?</translation>
+<translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="7495424355577885780">Ikiwashwa, kuripoti suala kutapakia Kiolesura cha majibu ya Usanifu Bora.</translation>
 <translation id="7495778526395737099">Umesahau nenosiri lako la zamani?</translation>
 <translation id="7503191893372251637">Aina ya Cheti cha Netscape</translation>
@@ -4699,7 +4813,6 @@
 <translation id="7587108133605326224">Kibaltiki</translation>
 <translation id="7589461650300748890">Lo! Kuwa mwangalifu!</translation>
 <translation id="7589661784326793847">Subiri kidogo</translation>
-<translation id="7593635197364225277">Hifadhi nakala na urejeshe data ya programu ya Google Play kwenye Hifadhi ya Google kiotomatiki. Unaweza kubadilisha hali hii katika Mipangilio ya Android wakati wowote. <ph name="BEGIN_LINK1" />Pata maelezo zaidi<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (hitilafu ya nambari ya kuthibitisha <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Sawa, ingiza</translation>
 <translation id="7600965453749440009">Kamwe usitafsiri <ph name="LANGUAGE" /></translation>
@@ -4745,6 +4858,7 @@
 <translation id="7654941827281939388">Akaunti hii tayari inatumika kwenye kompyuta hii.</translation>
 <translation id="7658239707568436148">Ghairi</translation>
 <translation id="7659584679870740384">Huruhusiwi kukitimia kifaa hiki. Tafadhali wasiliana na msimamizi kwa ruhusa ya kuingia katika akaunti.</translation>
+<translation id="7661259717474717992">Ruhusu tovuti kuhifadhi na kusoma data za kidakuzi</translation>
 <translation id="7663719505383602579">Kipokezi: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7664620655576155379">Kifaa cha Bluetooth kisichoweza kutumiwa: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="7665369617277396874">Ongeza akaunti</translation>
@@ -4774,6 +4888,7 @@
 <translation id="7709152031285164251">Imeshindwa - <ph name="INTERRUPT_REASON" /></translation>
 <translation id="7709980197120276510">Kwa kubofya Endelea unakubaliana na <ph name="LEGAL_DOC_LINK_TEXT_1" /> , <ph name="LEGAL_DOC_LINK_TEXT_2" /> , <ph name="LEGAL_DOC_LINK_TEXT_3" /> , <ph name="LEGAL_DOC_LINK_TEXT_4" /> , na <ph name="LEGAL_DOC_LINK_TEXT_5" /> .</translation>
 <translation id="7712140766624186755">Uliza kulingana na sera</translation>
+<translation id="7712196439824268605">PIN hii ni rahisi kukisia:</translation>
 <translation id="7713320380037170544">Ruhusu tovuti zozote kutumia ujumbe wa kipekee kufikia vifaa vya MIDI</translation>
 <translation id="7714464543167945231">Cheti</translation>
 <translation id="7716020873543636594">Bofya kiotomatiki kielekezi cha kipanya kinaposimama</translation>
@@ -4781,6 +4896,8 @@
 <translation id="7716781361494605745">URL ya Sera ya Idhini ya Cheti cha Netscape</translation>
 <translation id="7716970641886237992">Ilibadilishwa Na</translation>
 <translation id="7717014941119698257">Inapakua: <ph name="STATUS" /></translation>
+<translation id="7717845620320228976">Angalia masasisho</translation>
+<translation id="7719367874908701697">Kuza ukurasa</translation>
 <translation id="7719421816612904796">Mafunzo yamekwisha muda</translation>
 <translation id="771953673318695590">Maswali na Majibu</translation>
 <translation id="7720375555307821262">Ili kumsimamia mtu huyu, <ph name="BEGIN_LINK" />ingia katika Chrome<ph name="END_LINK" />.</translation>
@@ -4793,6 +4910,7 @@
 <translation id="7742762435724633909">Jina la mtoa huduma:</translation>
 <translation id="774465434535803574">Fungasha Hitilafu ya Kiendelezi</translation>
 <translation id="7748528009589593815">Kichupo kilichotangulia</translation>
+<translation id="7748734060566306235">Tumia vitufe vya mishale kurekebisha ukubwa wa picha na mpangilio.</translation>
 <translation id="7751260505918304024">Onyesha zote</translation>
 <translation id="7754704193130578113">Uliza mahali pa kuhifadhi kila faili kabla ya kuipakua.</translation>
 <translation id="775622227562445982">Ufungaji haraka wa kichupo/dirisha</translation>
@@ -4829,6 +4947,7 @@
 <translation id="7791543448312431591">Ongeza</translation>
 <translation id="7792012425874949788">Hitilafu imetokea wakati wa kuingia kwenye akaunti</translation>
 <translation id="7792388396321542707">Acha kushiriki</translation>
+<translation id="7792744925237334808">Zuia tovuti nyingine kuhifadhi na kusoma data ya kidakuzi.</translation>
 <translation id="7794058097940213561">Tayarisha kifaa ili kuweze kutumika</translation>
 <translation id="7799329977874311193">Hati ya HTML</translation>
 <translation id="7800518121066352902">Zungusha Kinyume saa</translation>
@@ -4863,6 +4982,7 @@
 <translation id="7845849068167576533">Hata ikiwa ulitembelea tovuti hii hapo awali, si salama sasa hivi. Mfumo wa Kuvinjari Salama kwenye Google <ph name="BEGIN_LINK" />uligundua programu hasidi<ph name="END_LINK" /> kwenye <ph name="SITE" /> hivi karibuni. Tovuti ambazo kwa kawaida huwa salama wakati mwingine huathiriwa na programu hasidi. Maudhui hasidi hutoka <ph name="SUBRESOURCE_HOST" />, msambazaji wa programu hasidi anayejulikana.</translation>
 <translation id="7845920762538502375"><ph name="PRODUCT_NAME" /> haikuweza kulanganisha data yako kwa sababu haikuweza kuunganisha kwenye seva ya ulinganishaji. Inajaribu upya...</translation>
 <translation id="7846076177841592234">Ghairi uchaguzi</translation>
+<translation id="7846634333498149051">Kibodi</translation>
 <translation id="7847212883280406910">Bonyeza "Ctrl" na "Alt" na "S" kwa pamoja ili kubadilisha kwenda <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="7848981435749029886">Ufikiaji wa kamera yako unadhibitiwa na msimamizi wako.</translation>
 <translation id="7849264908733290972">Fungua P&amp;icha katika Kichupo Kipya</translation>
@@ -4909,6 +5029,7 @@
 <translation id="7902482560616980555">Upimaji wa FontCache</translation>
 <translation id="7903128267494448252">Futa wasifu huu</translation>
 <translation id="7903345046358933331">Ukurasa haufanyi kazi. Unaweza kusubiri uanze kufanya kazi au uufunge.</translation>
+<translation id="7903742244674067440">Una vyeti kwenye faili vinavyotambua mamlaka ya vyeti hivi</translation>
 <translation id="7903925330883316394">Kitumizi: <ph name="UTILITY_TYPE" /></translation>
 <translation id="7903984238293908205">Kikatakana</translation>
 <translation id="7904094684485781019">Msimamizi wa akaunti hii ameondoa uwezo wa kuingia katika akaunti nyingi kwa wakati mmoja</translation>
@@ -4957,6 +5078,7 @@
 <translation id="7973320858902175766">Kisasishaji cha Vipengele</translation>
 <translation id="7974067550340408553">Pokea arifa kwenye simu yako kila wakati Smart Lock inapofungua <ph name="DEVICE_TYPE" /> yako.</translation>
 <translation id="7974566588408714340">Jaribu tena kutumia <ph name="EXTENSIONNAME" /></translation>
+<translation id="7974936243149753750">Angalia kwa ujumla</translation>
 <translation id="7977551819349545646">Inasasisha Chromebox...</translation>
 <translation id="7978412674231730200">Ufunguo binafsi</translation>
 <translation id="7979036127916589816">Hitilafu ya Usawazishaji</translation>
@@ -5023,9 +5145,11 @@
 <translation id="8054563304616131773">Tafadhali andika anwani sahihi ya barua pepe</translation>
 <translation id="8054921503121346576">Kibodi ya USB imeunganishwa</translation>
 <translation id="8056430285089645882">Nimeelewa, usioneshe hili tena</translation>
+<translation id="8058655154417507695">Mwaka wa kuisha kwa muda wa matumizi</translation>
 <translation id="8059178146866384858">Faili iitwayo "$1" tayari ipo. Tafadhali chagua jina tofauti.</translation>
 <translation id="8059417245945632445">Kagua vifaa</translation>
 <translation id="8061298200659260393">Usiruhusu tovuti zozote kutuma ujumbe wa programu hata wakati huitumii</translation>
+<translation id="8061820249063924643">Dhibiti watumiaji wanaosimamiwa</translation>
 <translation id="8063235345342641131">Ishara chaguo-msingi ya kijani</translation>
 <translation id="8064671687106936412">Ufunguo:</translation>
 <translation id="806705617346045388">Tabia Isiyo ya Kawaida Iligunduliwa</translation>
@@ -5033,7 +5157,9 @@
 <translation id="8069615408251337349">Google Cloud Print</translation>
 <translation id="8071942001314758122">Sema "Ok Google" mara tatu</translation>
 <translation id="8072988827236813198">Bana Vichupo</translation>
+<translation id="8074127646604999664">Ruhusu tovuti zilizofungwa hivi majuzi zikamlishe kutuma na kupokea data</translation>
 <translation id="8079530767338315840">Rudia</translation>
+<translation id="8081705606384362428">Chagua PIN yako:</translation>
 <translation id="8083739373364455075">Pata GB 100 bila malipo kwa Hifadhi ya Google</translation>
 <translation id="8088137642766812908">Kuwa makini, kipengee hiki kinaweza kuumiza</translation>
 <translation id="8089520772729574115">chini ya MB 1</translation>
@@ -5186,6 +5312,7 @@
 <translation id="827097179112817503">Onyesha kitufe cha mwanzo</translation>
 <translation id="8272443605911821513">Dhibiti viendelezi vyako kwa kubofya Viendelezi katika menyu ya "Zana zaidi".</translation>
 <translation id="8275038454117074363">Ingiza</translation>
+<translation id="827606011343515871">Huna vyeti</translation>
 <translation id="8276560076771292512">Akiba Tupu na Upakiaji Mpya Mkuu</translation>
 <translation id="8279388322240498158">Kibodi inayolingana na Kiingereza cha Kurdu ya Sorani</translation>
 <translation id="8280151743281770066">Fonetiki ya Kiarmenia</translation>
@@ -5206,7 +5333,6 @@
 <translation id="8300607741108698921">Usanidi wa dakika 1</translation>
 <translation id="8303650969500425356">Huruhusu kipengee cha javascript kufunga mzunguko wa skrini.</translation>
 <translation id="8303655282093186569">Mipangilio ingizo ya Pinyin</translation>
-<translation id="830424806940379275">Ruhusu viendelezi viunde vidirisha vinavyofungukia nje ya fremu ya kivinjari. Kwa chaguo-msingi au vikifungwa, jaribio la kufungua kidirisha litafungua dirisha ibukizi badala yake. Vidirisha kwenye Mifumo ya Uendeshaji ya eneo-kazi huacha kuendesha huduma na vitaondolewa hivi karibuni.</translation>
 <translation id="8306534594034939679">Washa kipengee cha matumizi ya Huduma Mbadala, kipengele cha majaribio cha HTTP.</translation>
 <translation id="8307376264102990850">Inachaji
 Inakokotoa muda wa kujaa</translation>
@@ -5231,9 +5357,11 @@
 <translation id="8337399713761067085">Kwa sasa uko nje ya mtandao.</translation>
 <translation id="8338952601723052325">Tovuti ya msanidi programu</translation>
 <translation id="8339012082103782726">Usiruhusu tovuti kufikia kipaza sauti chako</translation>
+<translation id="8339059274628563283">Data ya <ph name="SITE" /> iliyohifadhiwa ndani</translation>
 <translation id="8342318071240498787">Faili au saraka iliyo na jina sawa tayari ipo.</translation>
 <translation id="834457929814110454">Ikiwa unaelewa hatari kwa usalama wako, unaweza <ph name="BEGIN_LINK" />kutembelea tovuti hii<ph name="END_LINK" /> kabla programu hatari hazijaondolewa.</translation>
 <translation id="8345553596530559351">Ikiwashwa, URL ya chrome://history/ URL hupakia ukurasa wa historia ya Usanifu Bora.</translation>
+<translation id="8347045947573765315">Ruhusu tovuti zote zitumie uundaji funguo katika fomu</translation>
 <translation id="8351419472474436977">Kiendelezi hiki kinadhibiti mipangilio yako ya proksi, kumaanisha kuwa kinaweza kubadilisha, kuvunja, au kufuatilia chochote unachokifanya mtandaoni. Ikiwa huna uhakika kwa nini mabadiliko haya yamefanyika, huenda huyahitaji.</translation>
 <translation id="8352772353338965963">Ongeza akaunti ya uwezo wa kuingia katika akaunti nyingi kwa wakati mmoja. Akaunti zote zilizoingiwa zinaweza kufikiwa bila nenosiri, hivyo kipengee hiki lazima kitumike kwenye akaunti zinazoaminika pekee.</translation>
 <translation id="8353683614194668312">Inaweza:</translation>
@@ -5318,15 +5446,20 @@
 <translation id="845627346958584683">Wakati wa Muda Kuisha</translation>
 <translation id="8456681095658380701">Jina batili</translation>
 <translation id="8457625695411745683">nzuri</translation>
+<translation id="8460336040822756677">Ukizima kipengele cha Smart Lock cha <ph name="DEVICE_TYPE" />, hutaweza kufungua vifaa vya Chrome ukitumia simu yako. Utahitajika kuandika nenosiri lako.</translation>
+<translation id="84613761564611563">Mtandao unaweka Kiolesura ulichoomba, tafadhali subiri...</translation>
 <translation id="8461914792118322307">Proksi</translation>
 <translation id="8463215747450521436">Mtumiaji huyu anayesimamiwa huenda amefutwa au amezimwa na msimamizi. Tafadhali wasiliana na msimamizi iwapo ungependa kuendelea kuingia katika akaunti kama mtumiaji huyu.</translation>
 <translation id="8464132254133862871">Akaunti hii ya mtumiaji haikubaliwi kutumia huduma hii.</translation>
 <translation id="8464505512337106916">Gundua na utekeleze maudhui muhimu ya programu-jalizi (inapendekezwa)</translation>
+<translation id="8465252176946159372">Si sahihi</translation>
 <translation id="8466234950814670489">Kumbukumbu ya Tar</translation>
 <translation id="8467473010914675605">Mbinu ingizo ya Kikorea</translation>
+<translation id="8468750959626135884">Fungua kifaa chako cha <ph name="DEVICE_TYPE" /> kwa kutumia simu yako ya Android.</translation>
 <translation id="8472623782143987204">maunzi-imechelezwa</translation>
 <translation id="8475313423285172237">Programu nyingine kwenye kompyuta yako iliongeza kiendelezi ambacho kinaweza kubadilisha jinsi Chrome inavyofanya kazi.</translation>
 <translation id="8475647382427415476">Hifadhi ya Google haikuweza kusawazisha "<ph name="FILENAME" />" hivi sasa. Hifadhi ya Google itajaribu tena baadaye.</translation>
+<translation id="8476195663057048998">Futa na Uweke upya</translation>
 <translation id="8477241577829954800">Mahali pake pamechukuliwa</translation>
 <translation id="8477384620836102176">&amp;Kawaida</translation>
 <translation id="8480417584335382321">Kuza ukurasa:</translation>
@@ -5358,6 +5491,7 @@
 <translation id="8524066305376229396">Hifadhi inayoendelea:</translation>
 <translation id="8525306231823319788">Skrini nzima</translation>
 <translation id="8528962588711550376">Inaingia.</translation>
+<translation id="8532294913309524834">Panga lugha kulingana na mapendeleo yako.</translation>
 <translation id="8535005006684281994">URL ya </translation>
 <translation id="8539727552378197395">La (HttpOnly)</translation>
 <translation id="8543181531796978784">Unaweza <ph name="BEGIN_ERROR_LINK" />kuripoti tatizo la ugunduzi<ph name="END_ERROR_LINK" /> au, ikiwa unaelewa kiwango cha hatari kinachoweza kutokea, <ph name="BEGIN_LINK" />tembelea tovuti hii isiyo salama<ph name="END_LINK" />.</translation>
@@ -5372,6 +5506,7 @@
 <translation id="855081842937141170">Bandikiza kichupo</translation>
 <translation id="8551388862522347954">Leseni</translation>
 <translation id="8551494947769799688">Kilatvia</translation>
+<translation id="8553342806078037065">Dhibiti watu wengine</translation>
 <translation id="855705891482654011">Pakia viendelezi vilivyofungashwa</translation>
 <translation id="855773602626431402">Programu-jalizi isiyo ya majaribio ilizuiwa kutekeleza kwenye ukurasa huu.</translation>
 <translation id="8559694214572302298">Kisimbuaji cha Picha</translation>
@@ -5449,6 +5584,7 @@
 <translation id="8662978096466608964">Chrome haiwezi kuweka mandhari.</translation>
 <translation id="8663099077749055505">Zuia upakuaji otomatiki kwa wingi kwenye <ph name="HOST" /> wakati wote</translation>
 <translation id="8664389313780386848">&amp;Tazama asili ya ukurasa</translation>
+<translation id="866611985033792019">Amini cheti hiki kwa kutambua watumiaji wa barua pepe</translation>
 <translation id="8666678546361132282">Kiingereza</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> sasa ni skrini nzima na imelemaza kishale chako cha kipanya.</translation>
 <translation id="8667808506758191620">Kifaa chako cha <ph name="DEVICE_TYPE" /> kimesasishwa.</translation>
@@ -5572,6 +5708,7 @@
 <translation id="8813811964357448561">karatasi</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="881799181680267069">Ficha Zinginezo</translation>
+<translation id="8818152010000655963">Mandhari</translation>
 <translation id="8818152613617627612">Maelezo ya utojazi</translation>
 <translation id="8820817407110198400">Alamisho</translation>
 <translation id="8820961991571528294">Inajaribu</translation>
@@ -5582,8 +5719,10 @@
 <translation id="8828933418460119530">Jina la DNS</translation>
 <translation id="8830796635868321089">Kuangalia sasisho kumeshindwa kutumia mipangilio ya sasa ya proksi. Tafadhali rekebisha <ph name="PROXY_SETTINGS_LINK_START" />mipangilio yako ya proksi<ph name="PROXY_SETTINGS_LINK_END" />.</translation>
 <translation id="8831623914872394308">Mipangilio ya pointa</translation>
+<translation id="8833040047958643283">Dhibiti maudhui ambayo tovuti zinaweza kukuonyesha na maelezo ambayo zinaweza kutumia unapovinjari</translation>
 <translation id="8837103518490433332">Je, unataka <ph name="PASSWORD_MANAGER_BRAND" /> ihifadhi nenosiri lako la <ph name="ORIGIN" />?</translation>
 <translation id="8838770651474809439">Hambaga</translation>
+<translation id="8839157109304700852">Hufungua Dashibodi ya Google</translation>
 <translation id="8841142799574815336">Sehemu ya kutazamia inayoonekana isiyoweza kusonga.</translation>
 <translation id="884264119367021077">Anwani ya kusafirisha</translation>
 <translation id="8845001906332463065">Pata usaidizi</translation>
@@ -5594,11 +5733,13 @@
 <translation id="885381502874625531">Kibodi ya Kibelarusi</translation>
 <translation id="8856844195561710094">Imeshindwa kukomesha ufufuaji wa kifaa cha Bluetooth.</translation>
 <translation id="885701979325669005">Hifadhi</translation>
+<translation id="8858798938034909167">Fikia manenosiri yako kutoka kwenye kifaa chochote kwenye <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="8859057652521303089">Chagua lugha yako:</translation>
 <translation id="8859116917079399781">Maudhui yamezuiwa</translation>
 <translation id="8859174528519900719">Fremu ndogo: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="8860454412039442620">Lahajedwali la Excel</translation>
 <translation id="8863489667196658337">Huwasha mfumo mpya wa kuunda programu za alamisho.</translation>
+<translation id="8866013684546696613">Idadi ya juu zaidi ya madirisha katika muhtasari yanayoweza kutumia maumbo.</translation>
 <translation id="8866441758832353668">Kuhimili Usogezaji</translation>
 <translation id="8868245144144497543">Imeundwa Na</translation>
 <translation id="8868626022555786497">Inatumika</translation>
@@ -5656,6 +5797,7 @@
 <translation id="894360074127026135">Netscape International Step-Up</translation>
 <translation id="8944779739948852228">Printa imegunduliwa</translation>
 <translation id="8944964446326379280"><ph name="APP_NAME" /> inashiriki dirisha na <ph name="TAB_NAME" />.</translation>
+<translation id="8946284507644756416">Kifaa chako cha <ph name="DEVICE_TYPE" /> kinaweza kufunguliwa kwa kutumia simu yako ya Android.</translation>
 <translation id="8946359700442089734">Vipengele vya kutatua havikuwashwa kikamilifu kwenye kifaa hiki cha <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation>
 <translation id="8946784827990177241">Washa matumizi ya WebUSB.</translation>
 <translation id="89515141420106838">Huwasha programu ya Ghala la Duka la Chrome kwenye Wavuti kwa viendeshaji vya printa. Programu hutafuta Duka la Chrome kwenye Wavuti kwa viendelezi vinavyotumia uchapishaji kwenye printa ya USB yenye Kitambulisho mahususi cha USB.</translation>
@@ -5733,6 +5875,7 @@
 <translation id="9040185888511745258">Wavamizi kwenye <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> huenda wakajaribu kukulaghai ili kusakinisha programu zinazodhuru hali yako ya kuvinjari (kwa mfano, kwa kubadilisha ukurasa wako wa mwanzo au kuonyesha matangazo ya ziada kwenye tovuti unazotembelea).</translation>
 <translation id="9040421302519041149">Ufikiaji wa mtandao huu umelindwa.</translation>
 <translation id="9041603713188951722">Onyesha mipangilio katika dirisha</translation>
+<translation id="9042893549633094279">Faragha na usalama</translation>
 <translation id="904451693890288097">Tafadhali weka nenosiri la "<ph name="DEVICE_NAME" />":</translation>
 <translation id="9049835026521739061">Modi ya Hangul</translation>
 <translation id="9050666287014529139">Kaulisiri</translation>
@@ -5743,6 +5886,7 @@
 <translation id="9056810968620647706">Hakuna zinazolingana zilizopatikana.</translation>
 <translation id="9059868303873565140">Menyu ya hali</translation>
 <translation id="9064142312330104323">Picha ya Wasifu kwenye Google (inapakia)</translation>
+<translation id="9064275926664971810">Washa kipengele cha Kujaza otomatiki ili kujaza fomu kwa mbofyo mmoja</translation>
 <translation id="9064939804718829769">Inahamisha...</translation>
 <translation id="9065203028668620118">Badilisha</translation>
 <translation id="9066075624350113914">Sehemu za hati hii ya PDF hazingeweza kuonyeshwa</translation>
@@ -5764,6 +5908,8 @@
 <translation id="9088917181875854783">Tafadhali thibitisha nenosiri hili limeonyeshwa kwenye "<ph name="DEVICE_NAME" />":</translation>
 <translation id="9092426026094675787">Alamisha asili zisizo salama kama zisizo salama</translation>
 <translation id="9094033019050270033">Sasisha nenosiri</translation>
+<translation id="9094982973264386462">Ondoa</translation>
+<translation id="9095253524804455615">Ondoa</translation>
 <translation id="9100765901046053179">Mipangilio ya kina</translation>
 <translation id="910077499156148110">Ongeza kighairi cha tovuti</translation>
 <translation id="9100825730060086615">Aina ya kibodi</translation>
@@ -5855,8 +6001,11 @@
 <translation id="9218430445555521422">Weka kama chaguo-msingi</translation>
 <translation id="9219103736887031265">Picha</translation>
 <translation id="9220525904950070496">Ondoa akaunti</translation>
+<translation id="9221503095691269353">Weka mipangilio ya kufungua haraka</translation>
 <translation id="923467487918828349">Onyesha Yote</translation>
+<translation id="927151012416335806">Inasasisha kifaa chako kwenda kituo cha <ph name="CHANNEL_NAME" /></translation>
 <translation id="930268624053534560">Mihuri ya muda iliyo na maelezo ya kina</translation>
+<translation id="931068751149008062">Chagua aina ya fonti na usimbaji</translation>
 <translation id="932327136139879170">Mwanzo</translation>
 <translation id="932508678520956232">Haikuweza kuanzisha uchapishaji.</translation>
 <translation id="936801553271523408">Data ya uchungzi wa mfumo</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 895a068..51ad05eb 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1932,6 +1932,7 @@
 <translation id="3590559774363307859">கடவுச்சொல் சேமிக்கப்பட்டது. இந்தக் கடவுச்சொல்லையும் எல்லா <ph name="SAVED_PASSWORDS_LINK" /> ஐயும், எந்த உலாவியில் இருந்தும் அணுகலாம்.</translation>
 <translation id="3590587280253938212">வேகம்</translation>
 <translation id="3592260987370335752">&amp;மேலும் அறிக</translation>
+<translation id="3592313833691251126">உலாவிச் சட்டகத்திற்கு வெளியே பேனல் சாளரங்களை உருவாக்க நீட்டிப்புகளை அனுமதிக்கும். இது இயக்கப்படாவிட்டால் பேனலைத் திறப்பதற்கான முயற்சிகளின் போது அதற்குப் பதிலாக பாப்அப்பைத் திறக்கும். இயல்புநிலைச் செயல்பாட்டில் ஏற்புபட்டியலில் உள்ள நீட்டிப்புகளுக்கு மட்டும் இதை அனுமதிக்கும். இயக்கப்பட்ட செயல்பாட்டில் எல்லா நீட்டிப்புகளுக்கும் இதை அனுமதிக்கும். முடக்கப்பட்ட செயல்பாட்டில் எந்த நீட்டிப்புகளுக்கும் பேனல்களை அனுமதிக்காது.</translation>
 <translation id="359283478042092570">உள்நுழைக</translation>
 <translation id="3593152357631900254">பொருத்தமற்ற-பின்யின் பயன்முறையை இயக்கு</translation>
 <translation id="3593965109698325041">சான்றிதழ் பெயர் கட்டுப்பாடுகள்</translation>
@@ -2255,7 +2256,6 @@
 <translation id="4034042927394659004">விசை ஒளிர்வைக் குறை</translation>
 <translation id="4035758313003622889">&amp;பணி நிர்வாகி</translation>
 <translation id="4037084878352560732">குதிரை</translation>
-<translation id="4037102579141982963">இந்தச் சாதனம் பிழை அறிக்கையையும் உபயோகத் தரவையும் தானாகவே Googleக்கு அனுப்பும். இதை எப்போது வேண்டுமானாலும் சாதன <ph name="BEGIN_LINK1" />அமைப்புகளில்<ph name="END_LINK1" /> மாற்றலாம். <ph name="BEGIN_LINK2" />மேலும் அறிக<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Android க்கான அணுகல் தாவலின் மாற்றியை இயக்கவும்.</translation>
 <translation id="4044260751144303020">பொருத்தப்பட்ட நிலையான உறுப்புகளுக்கான மாற்றம்.</translation>
 <translation id="404493185430269859">இயல்பு தேடல் இன்ஜின்</translation>
@@ -3224,7 +3224,6 @@
 <translation id="5439568486246921931">இவ்வாறு செய்வதால், இந்தப் பயனரின் பதிவிறக்கங்கள், ஆஃப்லைன் கோப்புகள் மற்றும் உலாவல் தரவு ஆகியவை நிரந்தரமாக நீக்கப்படும். இவற்றை மீண்டும் பெற முடியாது.</translation>
 <translation id="544083962418256601">குறுக்குவழிகளை உருவாக்கு...</translation>
 <translation id="5441100684135434593">கம்பியாலான பிணையம்</translation>
-<translation id="5445088910157062298">உங்கள் இருப்பிடத்தை விரைவாகவும் துல்லியமாகவும் (பேட்டரி உபயோகத்தைக் குறைக்கலாம்) கண்டறிய பயன்பாடுகளுக்கு உதவ, Google இன் இருப்பிடச் சேவையை அனுமதிக்கவும். எந்தப் பயன்பாடும் இயங்காத போதும், அநாமதேய இருப்பிடத் தரவு Googleக்கு அனுப்பப்படும்.</translation>
 <translation id="5448293924669608770">அச்சச்சோ, உள்நுழைவதில் ஏதோ தவறு ஏற்பட்டது</translation>
 <translation id="5449588825071916739">எல்லா தாவல்களையும் புக்மார்க்கிடுக</translation>
 <translation id="5449716055534515760">Close Win&amp;dow</translation>
@@ -3691,7 +3690,6 @@
 <translation id="6110466548232134880"><ph name="LOCALITY" /> இல் <ph name="ORGANIZATION" /> இன் அடையாளத்தை <ph name="ISSUER" /> சரிபார்த்தது. சேவையகம் சான்றிதழ் வெளிப்படைத்தன்மை தகவல் எதையும் வழங்கவில்லை.</translation>
 <translation id="6111770213269631447">ஒலிபெயர்ப்பு (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">இயல்புநிலையில் அனுமதித்தவை</translation>
-<translation id="6112929985131461002">இந்தச் சாதனம் பிழை அறிக்கையையும் உபயோகத் தரவையும் தானாகவே Googleக்கு அனுப்பும். இந்த <ph name="BEGIN_LINK1" />அமைப்பை<ph name="END_LINK1" /> உங்கள் நிர்வாகி இயக்கியுள்ளார். <ph name="BEGIN_LINK2" />மேலும் அறிக<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">மொழி மற்றும் உள்ளீட்டு அமைப்புகளை மாற்றவும்</translation>
 <translation id="6120205520491252677">தொடக்கத் திரையில் இந்தப் பக்கத்தைப் பொருத்து...</translation>
 <translation id="6122081475643980456">உங்கள் இணைய இணைப்பு கட்டுப்படுத்தப்படுகிறது</translation>
@@ -3927,7 +3925,6 @@
 <translation id="6452181791372256707">நிராகரி</translation>
 <translation id="6454421252317455908">சீன உள்ளீட்டு முறை (விரைவு)</translation>
 <translation id="6455348477571378046">சான்றிதழ் வகை:</translation>
-<translation id="6456234919706689841">உங்கள் நிர்வாகி இந்தச் சாதனத்திற்கான பிழை அறிக்கையையும் உபயோகத் தரவையும் Googleக்கு அனுப்பு என்பதைத் தேர்வுசெய்யலாம். இந்த <ph name="BEGIN_LINK1" />அமைப்பை<ph name="END_LINK1" /> இங்கே பார்க்கலாம். <ph name="BEGIN_LINK2" />மேலும் அறிக<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">JavaScript ஐத் தடுப்பதைத் தொடர்க</translation>
 <translation id="6458308652667395253">JavaScript ஐத் தடுப்பதை நிர்வகி...</translation>
 <translation id="6459488832681039634">தேடுவதற்கு தேர்ந்தெடுத்ததைப் பயன்படுத்து</translation>
@@ -4698,7 +4695,6 @@
 <translation id="7587108133605326224">பால்டிக்</translation>
 <translation id="7589461650300748890">கவனமாக இருக்கவும்.</translation>
 <translation id="7589661784326793847">ஒரு வினாடி காத்திருக்கவும்</translation>
-<translation id="7593635197364225277">Play பயன்பாட்டுத் தரவை Google இயக்ககத்தில் தானாகவே காப்புப் பிரதி எடுத்து மீட்டமைக்கலாம். இதை எப்போது வேண்டுமானாலும் Android அமைப்புகளில் மாற்றலாம். <ph name="BEGIN_LINK1" />மேலும் அறிக<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (பிழைக் குறியீடு <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">சரி, இறக்குமதிசெய்</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" /> ஐ எப்போதும் மொழிபெயர்க்க வேண்டாம்</translation>
@@ -5204,7 +5200,6 @@
 <translation id="8300607741108698921">1-நிமிட அமைவு</translation>
 <translation id="8303650969500425356">திரையின் திசையமைப்பைப் பூட்டுவதற்கான javascriptஐ அனுமதிக்கும்.</translation>
 <translation id="8303655282093186569">பின்யின் உள்ளீட்டு அமைப்புகள்</translation>
-<translation id="830424806940379275">உலாவி ஃபிரேமிற்கு வெளியே திறக்கப்படும் பேனல் சாளரங்களை உருவாக்க நீட்டிப்புகளை அனுமதிக்கும். இயல்பாகவே அல்லது முடக்கப்பட்டிருந்தால், பேனலைத் திறக்க முயலும் போது அதற்குப் பதிலாக, பாப் அப் திறக்கப்படும். டெஸ்க்டாப் OSகளில் உள்ள பேனல்கள் நிறுத்தப்பட்டன, அவை விரைவில் அகற்றப்படும்.</translation>
 <translation id="8306534594034939679">மாற்றுச் சேவைகளுக்கான உதவியை இயக்கு, பரிசோதனைக்குரிய HTTP அம்சம்.</translation>
 <translation id="8307376264102990850">கணக்கிட்ட நேரம் முழுமையாகும் வரை சார்ஜ் ஆகிறது</translation>
 <translation id="8308179586020895837"><ph name="HOST" /> உங்கள் கேமராவை அணுக விரும்புகிறதா எனக் கேட்கவும்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 8fd7897..1310c15 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -1932,6 +1932,7 @@
 <translation id="3590559774363307859">పాస్‌వర్డ్ సేవ్ చేయబడింది. మీరు ఏ బ్రౌజర్ నుండైనా దీన్ని మరియు మీ అన్ని <ph name="SAVED_PASSWORDS_LINK" />ను ప్రాప్యత చేయవచ్చు.</translation>
 <translation id="3590587280253938212">వేగంగా</translation>
 <translation id="3592260987370335752">&amp;మరింత తెలుసుకోండి</translation>
+<translation id="3592313833691251126">బ్రౌజర్ ఫ్రేమ్ వెలుపల తెరవబడే ప్యానెల్ విండోలను సృష్టించడానికి పొడిగింపులను అనుమతిస్తుంది. ప్రారంభించకపోతే, ప్యానెల్‌ను తెరవడానికి ప్రయత్నాలు వలన బదులుగా పాప్అప్ తెరవబడుతుంది. డిఫాల్ట్ ప్రవర్తన అనుమతి జాబితాలోని పొడిగింపుల కోసం మాత్రమే అనుమతించడానికి ఉద్దేశించబడింది. ప్రారంభిత ప్రవర్తన అన్ని పొడిగింపుల కోసం అనుమతించడానికి ఉద్దేశించబడింది. నిలిపివేత ప్రవర్తన ఏదైనా పొడిగింపు కోసం ప్యానెల్‌లను నిరాకరించడానికి ఉద్దేశించబడింది.</translation>
 <translation id="359283478042092570">నమోదు చేయి</translation>
 <translation id="3593152357631900254">Fuzzy-Pinyin మోడ్‌ను అనుమతించు</translation>
 <translation id="3593965109698325041">సర్టిఫికెట్ పేరు పరిమితులు</translation>
@@ -2254,7 +2255,6 @@
 <translation id="4034042927394659004">కీబోర్డ్ ప్రకాశాన్ని తగ్గించు</translation>
 <translation id="4035758313003622889">&amp;కార్య నిర్వాహకుడు</translation>
 <translation id="4037084878352560732">గుర్రం</translation>
-<translation id="4037102579141982963">ఈ పరికరం విశ్లేషణ మరియు వినియోగ డేటాను స్వయంచాలకంగా Googleకు పంపుతుంది. మీరు దీన్ని మీ పరికర <ph name="BEGIN_LINK1" />సెట్టింగ్‌ల<ph name="END_LINK1" />లో ఎప్పుడైనా మార్చవచ్చు. <ph name="BEGIN_LINK2" />మరింత తెలుసుకోండి<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Android కోసం ప్రాప్యత ట్యాబ్ స్విచ్చర్‌ని ప్రారంభించండి.</translation>
 <translation id="4044260751144303020">స్థిర స్థాన మూలకాల కోసం మార్చడం.</translation>
 <translation id="404493185430269859">డిఫాల్ట్ శోధన ఇంజిన్</translation>
@@ -3228,7 +3228,6 @@
 <translation id="5439568486246921931">ఈ చర్య వలన ఈ వినియోగదారు డౌన్‌లోడ్‌లు, ఆఫ్‌లైన్ ఫైల్‌లు, బ్రౌజింగ్ డేటా శాశ్వతంగా తొలగించబడతాయి. దీన్ని ఒకసారి అమలు చేసాక తిరిగి రద్దు చేయలేరు.</translation>
 <translation id="544083962418256601">సత్వరమార్గాలను సృష్టించు...</translation>
 <translation id="5441100684135434593">తంత్రీ నెట్‌వర్క్</translation>
-<translation id="5445088910157062298">మీ స్థానాన్ని త్వరగా మరియు ఖచ్చితంగా కనుగొనడంలో అనువర్తనాలకు సహాయపడే Google స్థాన సేవను అనుమతించండి, ఇది బ్యాటరీ వినియోగాన్ని తగ్గించవచ్చు. అనువర్తనాలు ఏవీ అమలులో లేనప్పటికీ అనామక స్థాన డేటా Googleకి పంపబడుతుంది.</translation>
 <translation id="5448293924669608770">అయ్యో, సైన్ ఇన్ చేయడంలో ఏదో తప్పు జరిగింది</translation>
 <translation id="5449588825071916739">అన్ని ట్యాబ్‌లను బుక్‌మార్క్ చేయి</translation>
 <translation id="5449716055534515760">&amp;విండో మూసివెయ్యి</translation>
@@ -3694,7 +3693,6 @@
 <translation id="6110466548232134880"><ph name="LOCALITY" /> ప్రాంతంలో ఉన్న <ph name="ORGANIZATION" /> గుర్తింపు <ph name="ISSUER" /> ద్వారా ధృవీకరించబడింది. ప్రమాణపత్రం పారదర్శకత సమాచారం ఏదీ సర్వర్ ద్వారా సరఫరా చేయబడలేదు.</translation>
 <translation id="6111770213269631447">లిప్యంతరీకరణ (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">డిఫాల్ట్‌గా అనుమతించబడింది</translation>
-<translation id="6112929985131461002">ఈ పరికరం విశ్లేషణ మరియు వినియోగ డేటాను స్వయంచాలకంగా Googleకు పంపుతుంది. ఈ <ph name="BEGIN_LINK1" />సెట్టింగ్‌<ph name="END_LINK1" />ను మీ నిర్వాహకులు అమలు చేసారు. <ph name="BEGIN_LINK2" />మరింత తెలుసుకోండి<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">భాష మరియు ఇన్‌పుట్ సెట్టింగ్‌లను మార్చండి</translation>
 <translation id="6120205520491252677">ప్రారంభ స్క్రీన్‌కు ఈ పేజీని పిన్ చేయి...</translation>
 <translation id="6122081475643980456">మీ ఇంటర్నెట్ కనెక్షన్ నియంత్రించబడుతోంది</translation>
@@ -3930,7 +3928,6 @@
 <translation id="6452181791372256707">తిరస్కరించు</translation>
 <translation id="6454421252317455908">చైనీస్ ఇన్‌పుట్ పద్ధతి (త్వరిత)</translation>
 <translation id="6455348477571378046">ప్రమాణపత్రం రకం:</translation>
-<translation id="6456234919706689841">మీ నిర్వాహకులు ఈ పరికరం కోసం విశ్లేషణ మరియు వినియోగ డేటాను Googleకి పంపాలో లేదో ఎంచుకోవచ్చు. మీరు ఈ <ph name="BEGIN_LINK1" />సెట్టింగ్<ph name="END_LINK1" />ని ఇక్కడ వీక్షించవచ్చు. <ph name="BEGIN_LINK2" />మరింత తెలుసుకోండి<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">JavaScriptను నిరోధించడాన్ని కొనసాగించు</translation>
 <translation id="6458308652667395253">JavaScript నిరోధించడాన్ని నిర్వహించు...</translation>
 <translation id="6459488832681039634">కనుగొనడానికి ఎంపికను ఉపయోగించండి</translation>
@@ -4710,7 +4707,6 @@
 <translation id="7587108133605326224">బాల్టిక్</translation>
 <translation id="7589461650300748890">అయ్యో, అక్కడ. జాగ్రత్తగా ఉండండి.</translation>
 <translation id="7589661784326793847">ఒక క్షణం వేచి ఉండండి</translation>
-<translation id="7593635197364225277">Play అనువర్తన డేటాను స్వయంచాలకంగా Google డిస్క్‌కి బ్యాకప్ చేస్తుంది మరియు పునరుద్ధరిస్తుంది. మీరు దీన్ని Android సెట్టింగ్‌ల్లో ఎప్పుడైనా మార్చవచ్చు. <ph name="BEGIN_LINK1" />మరింత తెలుసుకోండి<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (లోపం కోడ్ <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">సరే, దిగుమతి చేయి</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" />ను ఎప్పటికీ అనువదించవద్దు</translation>
@@ -5213,7 +5209,6 @@
 <translation id="8300607741108698921">1-నిమిషం సెటప్</translation>
 <translation id="8303650969500425356">స్క్రీన్ దృగ్విన్యాసాన్ని లాక్ చేయడానికి జావాస్క్రిప్ట్‌ని అనుమతిస్తుంది.</translation>
 <translation id="8303655282093186569">పిన్‌యిన్ ఇన్‌పుట్ సెట్టింగ్‌లు</translation>
-<translation id="830424806940379275">బ్రౌజర్ ఫ్రేమ్ వెలుపల తెరవబడే ప్యానెల్ విండోలను సృష్టించడానికి పొడిగింపులను అనుమతిస్తుంది. డిఫాల్ట్‌గా లేదా నిలిపివేసినా, ప్యానెల్‌ను తెరవడానికి ప్రయత్నించినప్పుడు, బదులుగా పాప్అప్ తెరవబడుతుంది. డెస్క్‌టాప్ OSల్లో ప్యానెల్‌లు నిలిపివేయబడతాయి మరియు త్వరలో తీసివేయబడతాయి.</translation>
 <translation id="8306534594034939679">ప్రయోగాత్మక HTTP లక్షణం అయిన ప్రత్యామ్నాయ సేవల కోసం మద్దతును ప్రారంభిస్తుంది.</translation>
 <translation id="8307376264102990850">ఛార్జింగ్ పూర్తి అయ్యే సమయాన్ని లెక్కిస్తోంది</translation>
 <translation id="8308179586020895837"><ph name="HOST" /> మీ కెమెరాను ప్రాప్యత చేయాలనుకుంటే నాకు తెలియజేయి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index f0cdf9b5..e73594e 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1932,6 +1932,7 @@
 <translation id="3590559774363307859">บันทึกรหัสผ่านแล้ว คุณสามารถเข้าถึงรหัสผ่านและ <ph name="SAVED_PASSWORDS_LINK" /> ทั้งหมดได้จากเบราว์เซอร์ใดก็ได้</translation>
 <translation id="3590587280253938212">รวดเร็ว</translation>
 <translation id="3592260987370335752">&amp;เรียนรู้เพิ่มเติม</translation>
+<translation id="3592313833691251126">อนุญาตให้ส่วนขยายสร้างหน้าต่างแผงที่เปิดภายนอกเฟรมของเบราว์เซอร์ ความพยายามที่จะเปิดแผงจะเป็นการเปิดป๊อปอัปแทนหากไม่ได้เปิดใช้ การทำงานตามค่าเริ่มต้นจะเป็นการอนุญาตเฉพาะสำหรับส่วนขยายที่อนุญาตพิเศษเท่านั้น การทำงานเมื่อเปิดใช้งานจะอนุญาตสำหรับส่วนขยายทุกรายการ การทำงานเมื่อปิดใช้งานจะไม่อนุญาตแผงสำหรับส่วนขยายทุกรายการ</translation>
 <translation id="359283478042092570">ป้อน</translation>
 <translation id="3593152357631900254">เปิดการใช้งานโหมด Fuzzy-Pinyin</translation>
 <translation id="3593965109698325041">ข้อจำกัดของชื่อใบรับรอง</translation>
@@ -2254,7 +2255,6 @@
 <translation id="4034042927394659004">ลดความสว่างของแป้น</translation>
 <translation id="4035758313003622889">&amp;ตัวจัดการงาน</translation>
 <translation id="4037084878352560732">ม้า</translation>
-<translation id="4037102579141982963">อุปกรณ์นี้จะส่งข้อมูลการวินิจฉัยและการใช้งานไปยัง Google โดยอัตโนมัติ คุณสามารถเปลี่ยนการตั้งค่านี้ได้ตลอดเวลาใน<ph name="BEGIN_LINK1" />การตั้งค่า<ph name="END_LINK1" />ของอุปกรณ์ <ph name="BEGIN_LINK2" />เรียนรู้เพิ่มเติม<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">เปิดใช้ตัวสลับแท็บความสามารถในการเข้าถึงสำหรับ Android </translation>
 <translation id="4044260751144303020">การประกอบหน้าเว็บสำหรับเอลิเมนต์ที่มีตำแหน่งคงที่</translation>
 <translation id="404493185430269859">เครื่องมือค้นหาเริ่มต้น</translation>
@@ -3227,7 +3227,6 @@
 <translation id="5439568486246921931">การดำเนินการนี้จะลบการดาวน์โหลดของผู้ใช้ ไฟล์ออฟไลน์ และข้อมูลการท่องเว็บอย่างถาวร และไม่สามารถยกเลิกได้</translation>
 <translation id="544083962418256601">สร้างทางลัด...</translation>
 <translation id="5441100684135434593">เครือข่ายแบบใช้สาย</translation>
-<translation id="5445088910157062298">ให้บริการตำแหน่งของ Google ช่วยแอปค้นหาตำแหน่งของคุณได้อย่างแม่นยำและรวดเร็ว อีกทั้งยังช่วยประหยัดพลังงานแบตเตอรี่ ระบบจะส่งข้อมูลตำแหน่งแบบไม่ระบุชื่อไปที่ Google แม้จะไม่ได้เปิดแอปก็ตาม</translation>
 <translation id="5448293924669608770">อ๊ะ เกิดข้อผิดพลาดในการลงชื่อเข้าใช้</translation>
 <translation id="5449588825071916739">บุ๊กมาร์กแท็บทั้งหมด</translation>
 <translation id="5449716055534515760">ปิดหน้าต่&amp;าง</translation>
@@ -3693,7 +3692,6 @@
 <translation id="6110466548232134880">ข้อมูลประจำตัวของ <ph name="ORGANIZATION" /> ที่ <ph name="LOCALITY" /> ได้รับการยืนยันโดย <ph name="ISSUER" /> เซิร์ฟเวอร์ไม่ได้นำส่งข้อมูลประกาศนียบัตรความโปร่งใส</translation>
 <translation id="6111770213269631447">การทับศัพท์ (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">อนุญาตโดยค่าเริ่มต้น</translation>
-<translation id="6112929985131461002">อุปกรณ์นี้จะส่งข้อมูลการวินิจฉัยและการใช้งานไปยัง Google โดยอัตโนมัติ <ph name="BEGIN_LINK1" />การตั้งค่า<ph name="END_LINK1" />นี้จะบังคับใช้โดยผู้ดูแลระบบของคุณ <ph name="BEGIN_LINK2" />เรียนรู้เพิ่มเติม<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">เปลี่ยนการตั้งค่าภาษาและการป้อนข้อมูล</translation>
 <translation id="6120205520491252677">ตรึงหน้าเว็บนี้ไว้ที่หน้าจอเริ่ม...</translation>
 <translation id="6122081475643980456">กำลังมีการควบคุมการเชื่อมต่ออินเทอร์เน็ตของคุณ</translation>
@@ -3929,7 +3927,6 @@
 <translation id="6452181791372256707">ปฏิเสธ</translation>
 <translation id="6454421252317455908">วิธีป้อนข้อมูลภาษาจีน (แบบด่วน)</translation>
 <translation id="6455348477571378046">ประเภทใบรับรอง:</translation>
-<translation id="6456234919706689841">ผู้ดูแลระบบของคุณอาจเลือกที่จะส่งข้อมูลการวินิจฉัยและการใช้งานสำหรับอุปกรณ์นี้ไปยัง Google คุณสามารถดู<ph name="BEGIN_LINK1" />การตั้งค่า<ph name="END_LINK1" />นี้ได้ที่นี่ <ph name="BEGIN_LINK2" />เรียนรู้เพิ่มเติม<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">บล็อกการเรียกใช้ JavaScript</translation>
 <translation id="6458308652667395253">จัดการการบล็อก JavaScript...</translation>
 <translation id="6459488832681039634">ใช้สิ่งที่เลือกเพื่อค้นหา</translation>
@@ -4708,7 +4705,6 @@
 <translation id="7587108133605326224">บอลติก</translation>
 <translation id="7589461650300748890">อ๊ะ โปรดระวัง</translation>
 <translation id="7589661784326793847">รอสักครู่</translation>
-<translation id="7593635197364225277">สำรองและคืนค่าข้อมูลแอป Play ไปยัง Google ไดรฟ์โดยอัตโนมัติ คุณสามารถเปลี่ยนการตั้งค่านี้ในการตั้งค่า Android ได้ทุกเมื่อ <ph name="BEGIN_LINK1" />เรียนรู้เพิ่มเติม<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (รหัสข้อผิดพลาด <ph name="ERROR_CODE" />)</translation>
 <translation id="7596831438341298034">ตกลง นำเข้า</translation>
 <translation id="7600965453749440009">ไม่ต้องแปลภาษา<ph name="LANGUAGE" /></translation>
@@ -5214,7 +5210,6 @@
 <translation id="8300607741108698921">ติดตั้งใน 1 นาที</translation>
 <translation id="8303650969500425356">อนุญาตให้ JavaScript ล็อกการวางแนวหน้าจอ</translation>
 <translation id="8303655282093186569">การตั้งค่าการป้อนข้อมูลพินอิน</translation>
-<translation id="830424806940379275">อนุญาตให้ส่วนขยายสร้างหน้าต่างแผงที่เปิดภายนอกเฟรมของเบราว์เซอร์ ตามค่าเริ่มต้นหรือหากปิดใช้งาน การพยายามเปิดแผงจะเป็นการเปิดป๊อปอัปแทน ระบบจะเลิกใช้งานระบบปฏิบัติการ Desktop และจะนำออกเร็วๆ นี้</translation>
 <translation id="8306534594034939679">เปิดใช้การสนับสนุนบริการสำรอง ซึ่งเป็นคุณลักษณะ HTTP แบบทดลอง</translation>
 <translation id="8307376264102990850">การคำนวณเวลาในการชาร์จจนเต็ม</translation>
 <translation id="8308179586020895837">ถามว่า <ph name="HOST" /> ต้องการเข้าถึงกล้องของคุณไหม</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 923eb741..a298d3d 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -1934,6 +1934,7 @@
 <translation id="3590559774363307859">Şifre kaydedildi. Bu şifreye ve tüm <ph name="SAVED_PASSWORDS_LINK" /> öğelerinize herhangi bir tarayıcıdan erişebilirsiniz.</translation>
 <translation id="3590587280253938212">hızlı</translation>
 <translation id="3592260987370335752">&amp;Daha fazla bilgi edinin</translation>
+<translation id="3592313833691251126">Uzantıların, tarayıcı çerçevesinin dışında açılan panel pencereleri oluşturmasına izin verin. Bu etkinleştirilmezse, bir panel açılmaya çalışıldığında onun yerine pop-up açılır. Varsayılan davranış, yalnızca beyaz listeye eklenmiş uzantılara izin verilmesidir. Etkin durumdayken davranış, tüm uzantılara izin verilmesidir. Devre dışıyken davranış, hiçbir uzantının panellerine izin verilmemesidir.</translation>
 <translation id="359283478042092570">Gir</translation>
 <translation id="3593152357631900254">Benzer Pinyin modunu etkinleştir</translation>
 <translation id="3593965109698325041">Sertifika Adı Kısıtlamaları</translation>
@@ -2256,7 +2257,6 @@
 <translation id="4034042927394659004">Tuş parlaklığını azalt</translation>
 <translation id="4035758313003622889">&amp;Görev yöneticisi</translation>
 <translation id="4037084878352560732">At</translation>
-<translation id="4037102579141982963">Bu cihaz, teşhis ve kullanım verilerini otomatik olarak Google'a gönderir. Bu seçimi, cihaz <ph name="BEGIN_LINK1" />ayarlarınızdan<ph name="END_LINK1" /> istediğiniz zaman değiştirebilirsiniz. <ph name="BEGIN_LINK2" />Daha Fazla Bilgi Edinin<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Android için erişilebilirlik sekmesi anahtarını etkinleştirin.</translation>
 <translation id="4044260751144303020">Sabit konumlu öğeler için birleştirme.</translation>
 <translation id="404493185430269859">Varsayılan arama motoru</translation>
@@ -3230,7 +3230,6 @@
 <translation id="5439568486246921931">Bu işlem, bu kullanıcının indirilen dosyalarını, çevrimdışı dosyalarını ve tarama verilerini kalıcı olarak silecektir ve geri alınamaz.</translation>
 <translation id="544083962418256601">Kısayol oluştur...</translation>
 <translation id="5441100684135434593">Kablolu ağ</translation>
-<translation id="5445088910157062298">Uygulamaların konumunuzu hızlı ve doğru bir şekilde bulmasına yardımcı olması için Google'ın konum hizmetine izin verin. Bu seçenek, pil tüketimini azaltabilir. Hiçbir uygulama çalışmıyorken bile konum bilgileri Google'a anonim olarak gönderilir.</translation>
 <translation id="5448293924669608770">Hata! Oturum açarken bir hata oluştu</translation>
 <translation id="5449588825071916739">Tüm Sekmelere Yer İşareti Koy</translation>
 <translation id="5449716055534515760">Pencereyi &amp;Kapat</translation>
@@ -3697,7 +3696,6 @@
 <translation id="6110466548232134880"><ph name="LOCALITY" /> konumundaki <ph name="ORGANIZATION" /> kuruluşunun kimliği <ph name="ISSUER" /> tarafından doğrulandı. Sunucu tarafından Sertifika Şeffaflığı ile ilgili bilgi sağlanmadı.</translation>
 <translation id="6111770213269631447">Harf çevirisi (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Varsayılan olarak izin verilir</translation>
-<translation id="6112929985131461002">Bu cihaz teşhis ve kullanım verilerini Google'a otomatik olarak gönderir. Bu <ph name="BEGIN_LINK1" />ayar<ph name="END_LINK1" />, yöneticiniz tarafından zorunlu tutuluyor. <ph name="BEGIN_LINK2" />Daha Fazla Bilgi Edinin<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Dil ve giriş ayarlarını değiştir</translation>
 <translation id="6120205520491252677">Bu sayfayı Başlangıç ekranına sabitle...</translation>
 <translation id="6122081475643980456">İnternet bağlantınız kontrol ediliyor</translation>
@@ -3933,7 +3931,6 @@
 <translation id="6452181791372256707">Reddet</translation>
 <translation id="6454421252317455908">Çince giriş yöntemi (hızlı)</translation>
 <translation id="6455348477571378046">Sertifika Türü:</translation>
-<translation id="6456234919706689841">Yöneticiniz bu cihazın teşhis ve kullanım verilerini Google'a göndermeyi seçebilir. Bu <ph name="BEGIN_LINK1" />ayarı<ph name="END_LINK1" />, buradan görüntüleyebilirsiniz. <ph name="BEGIN_LINK2" />Daha Fazla Bilgi Edinin<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">JavaScript'i engellemeye devam et</translation>
 <translation id="6458308652667395253">JavaScript engellemeyi yönet...</translation>
 <translation id="6459488832681039634">Bul için Seçim'i Kullan</translation>
@@ -4712,7 +4709,6 @@
 <translation id="7587108133605326224">Baltık</translation>
 <translation id="7589461650300748890">Aman, dikkatli olun.</translation>
 <translation id="7589661784326793847">Bir saniye bekleyin</translation>
-<translation id="7593635197364225277">Play uygulama verilerini otomatik olarak Google Drive'a yedekleyin ve geri yükleyin. Bunu istediğiniz zaman Android Ayarları'ndan değiştirebilirsiniz. <ph name="BEGIN_LINK1" />Daha Fazla Bilgi Edinin<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (hata kodu <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Tamam, içe aktar</translation>
 <translation id="7600965453749440009"><ph name="LANGUAGE" /> dilini asla çevirme</translation>
@@ -5219,7 +5215,6 @@
 <translation id="8300607741108698921">1 dakikada kurulum</translation>
 <translation id="8303650969500425356">JavaScript'in ekran yönünü kilitlemesine izin verir.</translation>
 <translation id="8303655282093186569">Pinyin giriş ayarları</translation>
-<translation id="830424806940379275">Uzantıların, tarayıcı çerçevesinin dışında açılan panel pencereleri oluşturmalarına izin verin. Varsayılan olarak veya devre dışı bırakıldığında, panel açma girişimleri bunun yerine bir pop-up açar. OSes masaüstündeki paneller artık kullanılmamaktadır ve yakında kaldırılacaktır.</translation>
 <translation id="8306534594034939679">Deneysel bir HTTP özelliği olan Alternatif Hizmetler için desteği etkinleştirin.</translation>
 <translation id="8307376264102990850">Şarj ediliyor
 Dolana kadar geçecek süre hesaplanıyor</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 900d0cc7..0bea125 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1932,6 +1932,7 @@
 <translation id="3590559774363307859">Пароль збережено. Він і всі ваші <ph name="SAVED_PASSWORDS_LINK" /> доступні в будь-якому веб-переглядачі.</translation>
 <translation id="3590587280253938212">швидкий</translation>
 <translation id="3592260987370335752">&amp;Докладніше</translation>
+<translation id="3592313833691251126">Розширення можуть створювати вікна панелі, що відкриваються поза межами веб-переглядача. Якщо цю функцію вимкнено, під час спроби відкрити панель з’являтиметься спливаюче вікно. За умовчанням панелі ввімкнені для дозволених розширень. Якщо ввімкнути цю функцію, панелі відкриватимуться для всіх розширень, а якщо вимкнути – панелі не з’являтимуться.</translation>
 <translation id="359283478042092570">Увійти</translation>
 <translation id="3593152357631900254">Увімкнути режим приблизних збігів для стандарту піньїнь</translation>
 <translation id="3593965109698325041">Обмеження імені сертифіката</translation>
@@ -2254,7 +2255,6 @@
 <translation id="4034042927394659004">Зменшити яскравість клавіатури</translation>
 <translation id="4035758313003622889">&amp;Диспетчер завдань</translation>
 <translation id="4037084878352560732">Кінь</translation>
-<translation id="4037102579141982963">Цей пристрій автоматично надсилатиме в Google дані про діагностику та використання. Цей параметр можна будь-коли змінити в <ph name="BEGIN_LINK1" />налаштуваннях<ph name="END_LINK1" /> пристрою. <ph name="BEGIN_LINK2" />Докладніше<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Увімкнути доступність переходу між вкладками для Android.</translation>
 <translation id="4044260751144303020">Компонування для елементів із фіксованою позицією.</translation>
 <translation id="404493185430269859">Пошукова система за умовчанням</translation>
@@ -3228,7 +3228,6 @@
 <translation id="5439568486246921931">Буде назавжди видалено завантаження, офлайн-файли та дані веб-перегляду цього користувача. Цю дію не можна відмінити.</translation>
 <translation id="544083962418256601">Створення ярликів...</translation>
 <translation id="5441100684135434593">Дротова мережа</translation>
-<translation id="5445088910157062298">Завдяки службі локації Google додатки швидко й точно визначають ваше місцезнаходження та споживають менше заряду акумулятора. Анонімні геодані надсилатимуться в Google, навіть коли додатки не запущено.</translation>
 <translation id="5448293924669608770">На жаль, під час входу сталася помилка</translation>
 <translation id="5449588825071916739">Зробити закладки для всіх вкладок</translation>
 <translation id="5449716055534515760">Закрити вік&amp;но</translation>
@@ -3694,7 +3693,6 @@
 <translation id="6110466548232134880"><ph name="ISSUER" /> підтверджує ідентифікатор організації <ph name="ORGANIZATION" /> (<ph name="LOCALITY" />). Сервер надав інформацію про прозорість сертифіката.</translation>
 <translation id="6111770213269631447">Транслітерація (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Дозволено за умовчанням</translation>
-<translation id="6112929985131461002">Цей пристрій автоматично надсилатиме в Google дані про діагностику та використання. Цей <ph name="BEGIN_LINK1" />параметр<ph name="END_LINK1" /> увімкнув адміністратор. <ph name="BEGIN_LINK2" />Докладніше<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Змінити налаштування мови та введення</translation>
 <translation id="6120205520491252677">Закріпити цю сторінку на екрані запуску...</translation>
 <translation id="6122081475643980456">Ваше з’єднання з Інтернетом контролюється</translation>
@@ -3930,7 +3928,6 @@
 <translation id="6452181791372256707">Відхилити</translation>
 <translation id="6454421252317455908">Метод введення для китайської мови (швидкий)</translation>
 <translation id="6455348477571378046">Тип сертифіката:</translation>
-<translation id="6456234919706689841">Адміністратор може ввімкнути надсилання в Google даних про діагностику та використання. Цей <ph name="BEGIN_LINK1" />параметр<ph name="END_LINK1" /> можна переглянути тут. <ph name="BEGIN_LINK2" />Докладніше<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Продовжити блокування JavaScript</translation>
 <translation id="6458308652667395253">Керувати блокуванням JavaScript...</translation>
 <translation id="6459488832681039634">Використати виділення для пошуку</translation>
@@ -4710,7 +4707,6 @@
 <translation id="7587108133605326224">Балтійська</translation>
 <translation id="7589461650300748890">Обережно!</translation>
 <translation id="7589661784326793847">Зачекайте</translation>
-<translation id="7593635197364225277">Автоматично створювати резервні копії та відновлювати дані додатка Play на Google Диску. Ви можете будь-коли змінити цей параметр у налаштуваннях Android. <ph name="BEGIN_LINK1" />Докладніше<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (код помилки <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Імпортувати</translation>
 <translation id="7600965453749440009">Ніколи не перекладати з такої мови: <ph name="LANGUAGE" /></translation>
@@ -5216,7 +5212,6 @@
 <translation id="8300607741108698921">Миттєве налаштування</translation>
 <translation id="8303650969500425356">JavaScript може блокувати орієнтацію екрана.</translation>
 <translation id="8303655282093186569">Налаштування введення даних для стандарту піньїнь</translation>
-<translation id="830424806940379275">Розширення можуть створювати вікна панелі, що відкриваються поза межами веб-переглядача. За умовчанням або якщо функцію вимкнено, під час спроби відкрити панель з’являтиметься спливаюче вікно. Панелі більше не підтримуються на операційних системах для настільних комп’ютерів. Незабаром їх буде видалено.</translation>
 <translation id="8306534594034939679">Увімкнути підтримку Alternative Services, експериментальної функції HTTP.</translation>
 <translation id="8307376264102990850">Заряджається: обчислення часу до повного зарядження</translation>
 <translation id="8308179586020895837">Запитувати, якщо хост <ph name="HOST" /> хоче отримати доступ до вашої камери</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 30622cc1..ee55011 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -34,6 +34,7 @@
 <translation id="1047431265488717055">Sao chép &amp;văn bản liên kết</translation>
 <translation id="1047726139967079566">Đánh dấu Trang Này...</translation>
 <translation id="1047956942837015229">Đang xóa <ph name="COUNT" /> mục...</translation>
+<translation id="1048286738600630630">Hiển thị</translation>
 <translation id="1048597748939794622">Bắt buộc bật cho tất cả các lớp</translation>
 <translation id="1049795001945932310">&amp;Cài đặt ngôn ngữ</translation>
 <translation id="1049926623896334335">Tài liệu Word</translation>
@@ -98,6 +99,7 @@
 <translation id="1125520545229165057">Dvorak (Hsu)</translation>
 <translation id="1128109161498068552">Không cho phép bất cứ trang web nào sử dụng thông báo dành riêng cho hệ thống để truy cập thiết bị MIDI</translation>
 <translation id="1128128132059598906">EAP-TTLS</translation>
+<translation id="1128591060186966949">Chỉnh sửa công cụ tìm kiếm</translation>
 <translation id="1128987120443782698">Thiết bị lưu trữ có dung lượng <ph name="DEVICE_CAPACITY" />. Vui lòng lắp thẻ SD hoặc thẻ nhớ USB có dung lượng ít nhất 4GB.</translation>
 <translation id="1132956125173653312">Bật ứng dụng Android trên Chromebook.</translation>
 <translation id="1137135726305341424">domContentLoaded và tất cả các lượt tải tài nguyên đã bắt đầu trước domContentLoaded (khung chính và các iframe gốc tương tự).</translation>
@@ -107,6 +109,7 @@
 <translation id="1145292499998999162">Plugin bị chặn</translation>
 <translation id="1146204723345436916">Nhập dấu trang từ tệp HTML...</translation>
 <translation id="1148624853678088576">Bạn đã hoàn tất!</translation>
+<translation id="1149401351239820326">Tháng hết hạn</translation>
 <translation id="1151972924205500581">Mật khẩu bắt buộc</translation>
 <translation id="1154228249304313899">Mở trang này:</translation>
 <translation id="115443833402798225">Hangul Ahnmatae</translation>
@@ -118,6 +121,7 @@
 <translation id="1162223735669141505"><ph name="BEGIN_LINK" />Plugin Native Client<ph name="END_LINK" /> cần được bật để sử dụng tính năng này.</translation>
 <translation id="1163361280229063150">{NUM_DOWNLOAD,plural, =1{Một tải xuống hiện đang diễn ra. Bạn có muốn hủy tải xuống và thoát khỏi chế độ ẩn danh không?}other{# tải xuống hiện đang diễn ra. Bạn có muốn hủy tải xuống và thoát khỏi chế độ ẩn danh không?}}</translation>
 <translation id="1163931534039071049">&amp;Xem nguồn khung</translation>
+<translation id="1164674268730883318">Tắt Smart Lock cho <ph name="DEVICE_TYPE" />?</translation>
 <translation id="1165039591588034296">Lỗi</translation>
 <translation id="1166212789817575481">Đóng Tab Bên phải</translation>
 <translation id="1166359541137214543">ABC</translation>
@@ -135,6 +139,7 @@
 <translation id="1181037720776840403">Xóa</translation>
 <translation id="1183083053288481515">Sử dụng chứng chỉ do quản trị viên cung cấp</translation>
 <translation id="1183237619868651138">Không thể cài đặt <ph name="EXTERNAL_CRX_FILE" /> trong bộ nhớ cache cục bộ.</translation>
+<translation id="1183917921992319637">Định cấu hình mã PIN</translation>
 <translation id="1185924365081634987">Bạn cũng có thể thử <ph name="GUEST_SIGNIN_LINK_START" />duyệt với tư cách khách<ph name="GUEST_SIGNIN_LINK_END" /> để khắc phục lỗi mạng này.</translation>
 <translation id="1187722533808055681">Đánh thức khỏi chế độ rảnh</translation>
 <translation id="1188807932851744811">Nhật ký chưa được tải lên.</translation>
@@ -200,6 +205,7 @@
 <translation id="1277908057200820621">Xem danh sách thiết bị</translation>
 <translation id="1278049586634282054">Kiểm tra chế độ xem:</translation>
 <translation id="1278813325885878377">Bàn phím QWERTY dành cho tiếng Hungary</translation>
+<translation id="1284355409890639046">Ghép nối thiết bị Bluetooth</translation>
 <translation id="1285320974508926690">Không bao giờ dịch trang web này</translation>
 <translation id="1285484354230578868">Lưu trữ dữ liệu trong tài khoản Google Drive của bạn</translation>
 <translation id="1290223615328246825">Không đăng nhập tự động được</translation>
@@ -305,6 +311,7 @@
 <translation id="143027896309062157">Đọc và thay đổi tất cả dữ liệu trên máy tính của bạn và các trang web bạn truy cập</translation>
 <translation id="1430915738399379752">In</translation>
 <translation id="1432581352905426595">Quản lý công cụ tìm kiếm</translation>
+<translation id="1433811987160647649">Hỏi trước khi truy cập</translation>
 <translation id="1434696352799406980">Thao tác này sẽ đặt lại trang khởi động, trang tab mới, công cụ tìm kiếm và tab được ghim. Thao tác này cũng sẽ vô hiệu hóa tất cả các tiện ích và xóa dữ liệu tạm thời như cookie. Dấu trang, lịch sử và mật khẩu đã lưu của bạn sẽ không bị xóa.</translation>
 <translation id="1434886155212424586">Trang chủ là trang Tab mới</translation>
 <translation id="1435550882135542937">Thiết kế lại thanh công cụ tiện ích</translation>
@@ -340,6 +347,7 @@
 <translation id="14720830734893704">Bật hỗ trợ bàn phím ảo.</translation>
 <translation id="1474079335130556426">Bật chế độ nền cho API Push. Điều này cho phép Chrome tiếp tục chạy sau khi cửa sổ cuối cùng đóng và khởi chạy khi khởi động OS nếu API Push cần.</translation>
 <translation id="1474339897586437869">"<ph name="FILENAME" />" không được tải lên. Không có đủ dung lượng trống trong Google Drive của bạn.</translation>
+<translation id="1475502736924165259">Bạn có các chứng chỉ trên tệp không phù hợp với bất kỳ danh mục nào khác</translation>
 <translation id="1476607407192946488">&amp;Cài đặt ngôn ngữ</translation>
 <translation id="1476949146811612304">Đặt công cụ tìm kiếm được sử dụng khi tìm kiếm từ
         <ph name="BEGIN_LINK" />thanh địa chỉ<ph name="END_LINK" />.</translation>
@@ -377,6 +385,7 @@
     máy chủ proxy, hãy điều chỉnh <ph name="LINK_START" />cài đặt proxy<ph name="LINK_END" /> của bạn.</translation>
 <translation id="1510907582379248592">Đã lưu mật khẩu cho <ph name="ORIGIN" />:</translation>
 <translation id="1511004689539562549">Không cho phép các trang web truy cập vào máy ảnh của bạn</translation>
+<translation id="1511388193702657997">Đề xuất lưu mật khẩu web của bạn</translation>
 <translation id="1511623662787566703">Đã đăng nhập là <ph name="USER_EMAIL_ADDRESS" />. Đã ngừng đồng bộ hóa qua Trang tổng quan của Google.</translation>
 <translation id="1514215615641002767">Thêm vào màn hình</translation>
 <translation id="1514298457297359873">Cho phép ứng dụng sử dụng NaCl Socket API. Chỉ sử dụng để kiểm tra plugin NaCl.</translation>
@@ -398,6 +407,7 @@
 <translation id="1529968269513889022">tuần trước</translation>
 <translation id="1531004739673299060">Cửa sổ ứng dụng</translation>
 <translation id="1531865825384516080">Báo cáo URL Tìm kiếm an toàn.</translation>
+<translation id="1532687502998799885">Mã PIN phải có ít nhất 4 chữ số:</translation>
 <translation id="1532697124104874386">Bật/Tắt triển khai bàn phím ảo thông minh.</translation>
 <translation id="1533897085022183721">Dưới <ph name="MINUTES" />.</translation>
 <translation id="1533920822694388968">Căn chỉnh TV</translation>
@@ -426,6 +436,7 @@
 <translation id="1558988940633416251">Bật công cụ bố cục HarfBuzz giữa các nền tảng cho văn bản giao diện người dùng. Không ảnh hưởng đến nội dung web.</translation>
 <translation id="1559235587769913376">Nhập các ký tự Unicode</translation>
 <translation id="1561092721008294962">HarfBuzz dành cho văn bản giao diện người dùng</translation>
+<translation id="1566049601598938765">Trang web</translation>
 <translation id="1566958206723629112">Flash và PDF</translation>
 <translation id="1567723158593978621">Khi được bật, quá trình đăng nhập vào trình duyệt sẽ sử dụng luồng đăng nhập phân cách bằng mật khẩu gaia mới.</translation>
 <translation id="1567993339577891801">Bảng điều khiển JavaScript</translation>
@@ -483,6 +494,7 @@
 <translation id="1645228020260124617"><ph name="PRECENTAGE" />%</translation>
 <translation id="1645870377513700713">Bật thông báo gốc.</translation>
 <translation id="1646136617204068573">Bàn phím tiếng Hungari</translation>
+<translation id="1646982517418478057">Vui lòng nhập mật khẩu để mã hóa chứng chỉ này</translation>
 <translation id="164729547906544836">Bàn phím tiếng Tamil (itrans)</translation>
 <translation id="164814987133974965">Người dùng được giám sát có thể khám phá web dưới sự hướng dẫn của bạn. Là người quản lý của người dùng được giám sát, bạn có thể
     <ph name="BEGIN_BOLD" />cho phép hoặc cấm<ph name="END_BOLD" /> các trang web nhất định,
@@ -510,6 +522,7 @@
 <translation id="1673103856845176271">Không thể truy cập tệp vì các lý do bảo mật.</translation>
 <translation id="1675023460278456180">Material Hybrid</translation>
 <translation id="167832068858235403">giảm âm</translation>
+<translation id="1678331212993975953">Chi tiết trang web</translation>
 <translation id="1679068421605151609">Công cụ dành cho nhà phát triển</translation>
 <translation id="1681120471812444678">Thiết lập để thêm máy in…</translation>
 <translation id="1682324559341535203">Đăng ký <ph name="DEVICE_TYPE" /></translation>
@@ -531,11 +544,13 @@
 <translation id="1699395855685456105">Hiệu chỉnh phần cứng:</translation>
 <translation id="1700199471143028312">Quản trị viên của bạn không cho phép bạn tạo người dùng được giám sát.</translation>
 <translation id="1701062906490865540">Xóa người này</translation>
+<translation id="1702294042233267824">Công cụ tìm kiếm được sử dụng khi tìm kiếm từ thanh địa chỉ</translation>
 <translation id="1702534956030472451">Western</translation>
 <translation id="1707463636381878959">Chia sẻ mạng này với những người dùng khác</translation>
 <translation id="1708199901407471282">Khi mở trang web được đề xuất từ trang Tab mới, nếu tab đã mở cho đề xuất, hãy chuyển sang tab đó thay vì tải đề xuất trong tab mới.</translation>
 <translation id="1708338024780164500">(Không hoạt động)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
+<translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Gốc)</translation>
 <translation id="1711973684025117106">Nén không thành công, lỗi không mong đợi: $1</translation>
 <translation id="1715941336038158809">Tên người dùng hoặc mật khẩu không hợp lệ.</translation>
 <translation id="1717733954209022288">Hộp kiểm lưu thẻ Google Payments</translation>
@@ -630,6 +645,7 @@
 <translation id="1852799913675865625">Đã có lỗi khi tìm cách đọc tệp: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1856715684130786728">Thêm vị trí...</translation>
 <translation id="1857166538520940818">Đính kém tệp:</translation>
+<translation id="1858585891038687145">Tin tưởng chứng chỉ này khi nhận dạng nhà sản xuất phần mềm</translation>
 <translation id="1859234291848436338">Hướng Ghi</translation>
 <translation id="1864111464094315414">Đăng nhập</translation>
 <translation id="1864676585353837027">Thay đổi cách chia sẻ các tệp này</translation>
@@ -661,6 +677,7 @@
 <translation id="1909880997794698664">Bạn có chắc chắn bạn muốn giữ vĩnh viễn thiết bị này ở chế độ kiosk không?</translation>
 <translation id="1910572251697014317">Google đã gửi thông báo đến điện thoại này. Lưu ý rằng với Bluetooth, điện thoại của bạn có thể luôn mở khóa <ph name="DEVICE_TYPE" /> của mình từ khoảng cách trên 100 foot. Trong trường hợp xảy ra sự cố, bạn có thể &lt;a&gt;tạm thời tắt tính năng này&lt;/a&gt;.</translation>
 <translation id="1910721550319506122">Chào mừng bạn!</translation>
+<translation id="1911073860190924580">Chỉ mật khẩu</translation>
 <translation id="1916502483199172559">Hình đại diện màu đỏ mặc định</translation>
 <translation id="191688485499383649">Đã xảy ra lỗi không xác định khi cố gắng kết nối với "<ph name="DEVICE_NAME" />".</translation>
 <translation id="1918141783557917887">&amp;Nhỏ hơn</translation>
@@ -722,6 +739,8 @@
 <translation id="2007404777272201486">Báo cáo sự cố...</translation>
 <translation id="2011110593081822050">Người làm việc trên Web: <ph name="WORKER_NAME" /></translation>
 <translation id="2012766523151663935">Hiệu chỉnh chương trình cơ sở:</translation>
+<translation id="2013984794184160106">15</translation>
+<translation id="2016430552235416146">Truyền thống</translation>
 <translation id="2017052954220678795">Tạo điểm ảnh GPU theo chuỗi</translation>
 <translation id="2017334798163366053">Tắt tính năng thu thập dữ liệu hoạt động</translation>
 <translation id="2018352199541442911">Rất tiếc, thiết bị lưu trữ bên ngoài của bạn không được hỗ trợ vào thời điểm này.</translation>
@@ -738,6 +757,7 @@
 <translation id="204497730941176055">Tên Mẫu Chứng chỉ của Microsoft</translation>
 <translation id="2045969484888636535">Tiếp tục chặn cookie</translation>
 <translation id="204622017488417136">Thiết bị của bạn sẽ được quay lại phiên bản Chrome đã cài đặt trước đó. Tất cả các tài khoản người dùng và dữ liệu cục bộ sẽ bị xóa. Không thể hoàn tác thao tác này.</translation>
+<translation id="2047962517134476164">Xác nhận thông tin đăng nhập của bạn để tiếp tục</translation>
 <translation id="2048182445208425546">Truy cập lưu lượng mạng của bạn</translation>
 <translation id="2049137146490122801">Quyền truy cập vào tệp cục bộ trên máy của bạn bị vô hiệu hóa bởi quản trị viên.</translation>
 <translation id="204914487372604757">Tạo lối tắt</translation>
@@ -823,10 +843,12 @@
 <translation id="2155931291251286316">Luôn cho phép cửa sổ bật lên từ <ph name="HOST" /></translation>
 <translation id="215753907730220065">Thoát khỏi Chế độ Toàn màn hình</translation>
 <translation id="2157875535253991059">Trang này hiện ở chế độ toàn màn hình.</translation>
+<translation id="2161553589239083578">Xác nhận mã PIN của bạn:</translation>
 <translation id="216169395504480358">Thêm Wi-Fi...</translation>
 <translation id="2163470535490402084">Vui lòng kết nối Internet để đăng nhập vào <ph name="DEVICE_TYPE" /> của bạn.</translation>
 <translation id="2164862903024139959">Bàn phím tiếng Việt (TCVN)</translation>
 <translation id="2165453356262207111">Smart Lock (beta)</translation>
+<translation id="2166369534954157698">Lươn ngắn lại chê trạch dài</translation>
 <translation id="2167276631610992935">Javascript</translation>
 <translation id="2168214441502403371">Bàn phím tiếng Ba Tư</translation>
 <translation id="2168725742002792683">Đuôi tệp</translation>
@@ -843,6 +865,7 @@
 <translation id="2190355936436201913">(trống)</translation>
 <translation id="2190469909648452501">Giảm</translation>
 <translation id="2192505247865591433">Từ:</translation>
+<translation id="2193365732679659387">Cài đặt tin cậy</translation>
 <translation id="2195729137168608510">Bảo vệ Email</translation>
 <translation id="2198315389084035571">Tiếng Trung giản thể</translation>
 <translation id="2199829153606285995">Nhập bằng giọng nói trên bàn phím ảo</translation>
@@ -860,9 +883,11 @@
 <translation id="2213819743710253654">Tác vụ Trang</translation>
 <translation id="2215277870964745766">Chào mừng bạn! Hãy đặt ngôn ngữ và mạng của bạn</translation>
 <translation id="2217501013957346740">Tạo một tên -</translation>
+<translation id="2218019600945559112">Chuột và bàn di chuột</translation>
 <translation id="2218515861914035131">Dán dưới dạng văn bản thuần túy</translation>
 <translation id="2218947405056773815">Rất tiếc! <ph name="API_NAME" /> đã gặp sự cố không mong đợi.</translation>
 <translation id="2220529011494928058">Báo cáo sự cố</translation>
+<translation id="2220572644011485463">Mã PIN hoặc mật khẩu</translation>
 <translation id="2221240591176106785">Bật tính năng tải lại không xác thực</translation>
 <translation id="2222641695352322289">Cách duy nhất để hoàn tác tác vụ này là cài đặt lại <ph name="IDS_SHORT_PRODUCT_OS_NAME" />.</translation>
 <translation id="2224444042887712269">Cài đặt này thuộc về <ph name="OWNER_EMAIL" />.</translation>
@@ -906,6 +931,7 @@
 <translation id="2258195278080713720">Tính năng JavaScript ổn định mới nhất</translation>
 <translation id="2260567344816042527">Google Chrome sẽ sử dụng dữ liệu di động nếu bạn không được kết nối với một mạng khác.</translation>
 <translation id="2260654768907572711">PLUGIN TRÌNH DUYỆT</translation>
+<translation id="2262477216570151239">Độ trễ trước khi lặp lại</translation>
 <translation id="226269835214688456">Nếu tắt Smart Lock cho Chromebook, bạn sẽ không thể mở khóa thiết bị Chrome bằng điện thoại của mình. Bạn cần nhập mật khẩu của mình.</translation>
 <translation id="2262903407161221567">Một số thành phần UI sẽ hiển thị phản hồi bằng hình ảnh khi tương tác bằng cảm ứng.</translation>
 <translation id="2263497240924215535">(Đã tắt)</translation>
@@ -919,6 +945,7 @@
 <translation id="2273562597641264981">Nhà cung cấp:</translation>
 <translation id="2275694568175246751">Phải sang trái</translation>
 <translation id="2276503375879033601">Thêm ứng dụng khác</translation>
+<translation id="2277255602909579701">Tất cả cookie và dữ liệu trang web</translation>
 <translation id="2278098630001018905">Sử dụng địa chỉ giao hàng khác</translation>
 <translation id="2278562042389100163">Mở cửa sổ trình duyệt</translation>
 <translation id="2278988676849463018">Bàn phím tiếng Kannada (Ngữ âm)</translation>
@@ -959,6 +986,7 @@
 <translation id="2339120501444485379">Nhập tên mới</translation>
 <translation id="2339641773402824483">Kiểm tra cập nhật...</translation>
 <translation id="2342060820861917889">dài (2000 mili giây)</translation>
+<translation id="2342282706041269970">Thử đăng xuất và đăng nhập lại.</translation>
 <translation id="23434688402327542">Bàn phím tiếng Kazakh</translation>
 <translation id="2344028582131185878">Tải xuống tự động</translation>
 <translation id="2344262275956902282">Sử dụng các phím - và = để đánh số trang danh sách tùy chọn</translation>
@@ -1073,6 +1101,7 @@
 <translation id="2494837236724268445">Bàn phím tiếng Gujarat (Ngữ âm)</translation>
 <translation id="2496180316473517155">Lịch sử duyệt web</translation>
 <translation id="2496540304887968742">Thiết bị phải có dung lượng 4 GB hoặc cao hơn.</translation>
+<translation id="2497229222757901769">Tốc độ chuột</translation>
 <translation id="249819058197909513">Không cảnh báo lại đối với ứng dụng này</translation>
 <translation id="2498436043474441766">Thêm máy in</translation>
 <translation id="2498539833203011245">Thu nhỏ</translation>
@@ -1147,6 +1176,7 @@
 <translation id="2587203970400270934">Mã nhà cung cấp:</translation>
 <translation id="2587922270115112871">Việc tạo người dùng được giám sát không tạo tài khoản Google cũng như các cài đặt
     và dữ liệu của họ sẽ không đồng bộ hóa với các thiết bị khác bằng Chrome Sync. Người dùng được giám sát chỉ áp dụng cho thiết bị này.</translation>
+<translation id="25912682830130293">Xem cài đặt được báo cáo</translation>
 <translation id="2594049137847833442">Tùy chọn trang web quan trọng trong hộp thoại xóa dữ liệu duyệt web</translation>
 <translation id="2594056015203442344">Khi được bật, chỉ báo âm thanh trong thanh tab gấp đôi điều khiển tắt âm thanh tab.  Thao tác này cũng thêm các lệnh trong menu ngữ cảnh tab để nhanh chóng tắt tiếng nhiều tab được chọn.</translation>
 <translation id="259421303766146093">Thu nhỏ</translation>
@@ -1199,6 +1229,7 @@
 <translation id="2665394472441560184">Thêm từ mới</translation>
 <translation id="2665717534925640469">Trang này hiện đang ở chế độ toàn màn hình và đã tắt con trỏ chuột của bạn.</translation>
 <translation id="2665919335226618153">Ôi, hỏng! Đã xảy ra lỗi trong khi định dạng.</translation>
+<translation id="2667463864537187133">Quản lý kiểm tra lỗi chính tả</translation>
 <translation id="2668079306436607263">Điều hướng lịch sử từ thanh cuộn qua</translation>
 <translation id="2670102641511624474"><ph name="APP_NAME" /> đang chia sẻ một tab trong Chrome.</translation>
 <translation id="2670965183549957348">Phương pháp nhập chewing</translation>
@@ -1221,7 +1252,9 @@
 <translation id="2694026874607847549">1 cookie</translation>
 <translation id="2696862700756109583">Ngoại lệ cho chế độ toàn màn hình</translation>
 <translation id="2702540957532124911">Bàn phím:</translation>
+<translation id="2704142793323512908">Đồng thời, xóa dữ liệu hiện có của bạn khỏi thiết bị này.</translation>
 <translation id="2704184184447774363">Ký Tài liệu của Microsoft</translation>
+<translation id="270516211545221798">Tốc độ bàn di chuột</translation>
 <translation id="2706892089432507937">Thiết bị USB</translation>
 <translation id="2707024448553392710">Thành phần đang tải xuống</translation>
 <translation id="270921614578699633">Trên trung bình</translation>
@@ -1400,6 +1433,7 @@
 <translation id="2902734494705624966">Mở rộng của Hoa Kỳ</translation>
 <translation id="2903493209154104877">Địa chỉ</translation>
 <translation id="290444763029043472"><ph name="DOWNLOADED_AMOUNT_MB" /> MB / <ph name="TOTAL_AMOUNT_MB" /> MB đã tải xuống</translation>
+<translation id="2904456025988372123">Hỏi khi trang web cố gắng tự động tải tệp xuống sau tệp đầu tiên</translation>
 <translation id="2907619724991574506">URL khởi động</translation>
 <translation id="2908162660801918428">Thêm thư viện của phương tiện theo thư mục</translation>
 <translation id="2908789530129661844">Thu nhỏ màn hình</translation>
@@ -1446,6 +1480,7 @@
 <translation id="2963151496262057773">Plugin sau không hồi đáp: <ph name="PLUGIN_NAME" />Bạn có muốn dừng lại không?</translation>
 <translation id="2963783323012015985">Bàn phím tiếng Thổ Nhĩ Kỳ</translation>
 <translation id="2964193600955408481">Tắt Wi-Fi</translation>
+<translation id="2964313852984024865">Chỉnh sửa</translation>
 <translation id="2966459079597787514">Bàn phím tiếng Thụy Điển</translation>
 <translation id="2966598748518102999">Cải thiện tìm kiếm bằng giọng nói bằng cách gửi âm thanh "Ok Google" và vài giây trước tới Google.</translation>
 <translation id="2967544384642772068">Xóa</translation>
@@ -1594,6 +1629,7 @@
 <translation id="3150927491400159470">Tải lại cứng</translation>
 <translation id="315116470104423982">Dữ liệu di động</translation>
 <translation id="315141861755603168">"<ph name="BUNDLE_NAME" />" thêm các ứng dụng sau:</translation>
+<translation id="3151786313568798007">Hướng</translation>
 <translation id="3153177132960373163">Cho phép tất cả các trang web sử dụng plugin để truy cập vào máy tính của bạn</translation>
 <translation id="3154429428035006212">Ngoại tuyến hơn một tháng</translation>
 <translation id="3157931365184549694">Khôi phục</translation>
@@ -1650,6 +1686,7 @@
 <translation id="3234666976984236645">Luôn luôn phát hiện nội dung quan trọng trên trang web này</translation>
 <translation id="3236997602556743698">Bộ 3 (390)</translation>
 <translation id="3237784613213365159"><ph name="NEW_PROFILE_NAME" /> hiện là người dùng được giám sát</translation>
+<translation id="323803881985677942">Mở tùy chọn tiện ích</translation>
 <translation id="324056286105023296">Bạn không phải là <ph name="PROFILE_NAME" />?</translation>
 <translation id="3241680850019875542">Chọn thư mục gốc của tiện ích để đóng gói. Để cập nhật tiện ích, bạn cũng chọn tệp khóa cá nhân để sử dụng lại.</translation>
 <translation id="3241720467332021590">Tiếng Ai-len</translation>
@@ -1675,6 +1712,7 @@
 <translation id="3268451620468152448">Tab đang mở</translation>
 <translation id="3269093882174072735">Tải hình ảnh</translation>
 <translation id="3269101346657272573">Vui lòng nhập PIN.</translation>
+<translation id="3269737334347286816">Chi tiết đăng nhập đã lỗi thời.</translation>
 <translation id="326999365752735949">Đang tải xuống phần khác nhau</translation>
 <translation id="3270965368676314374">Đọc, thay đổi và xóa ảnh, nhạc và các phương tiện khác khỏi máy tính của bạn</translation>
 <translation id="3273410961255278341">Gửi cho:</translation>
@@ -1774,6 +1812,7 @@
 <translation id="3382073616108123819">Rất tiếc! Hệ thống không thể xác định số nhận dạng thiết bị cho thiết bị này.</translation>
 <translation id="3384773155383850738">Số gợi ý tối đa</translation>
 <translation id="3385050660708634073">Mã hóa tất cả dữ liệu đã đồng bộ hóa bằng cụm mật khẩu đồng bộ hóa của riêng bạn.</translation>
+<translation id="3385131213214862288">Xóa các mục sau đây khỏi</translation>
 <translation id="338583716107319301">Dấu phân tách</translation>
 <translation id="3386219708421216619">Đã thêm dấu trang</translation>
 <translation id="3391392691301057522">Mã PIN cũ:</translation>
@@ -1809,6 +1848,7 @@
 <translation id="3439153939049640737">Luôn cho phép <ph name="HOST" /> truy cập micrô của bạn</translation>
 <translation id="3439282137581679399">Bật Danh sách cấm đối với quyền sẽ chặn các quyền đối với các trang web nằm trong danh sách cấm cho người dùng tính năng Duyệt web an toàn.</translation>
 <translation id="3439970425423980614">Mở PDF ở chế độ xem trước</translation>
+<translation id="3440761377721825626">Hỏi khi một trang web muốn sử dụng plugin để truy cập máy tính của bạn</translation>
 <translation id="3441653493275994384">Màn hình</translation>
 <translation id="3441653695259810643">Sử dụng lại phông chữ đã lưu vào bộ nhớ cache trong kết xuất đồ họa để cung cấp các kích thước phông chữ khác nhau cho bố cục nhanh hơn.</translation>
 <translation id="3445092916808119474">Đặt làm màn hình chính</translation>
@@ -1823,6 +1863,7 @@
 <translation id="3456236151053308041">Bật tiện ích IME để cung cấp chế độ xem tùy chỉnh cho thao tác nhập của người dùng chẳng hạn như bàn phím ảo.</translation>
 <translation id="345693547134384690">Mở &amp;hình ảnh trong tab mới</translation>
 <translation id="3458620904104024826">Bật xuất sự kiện theo dõi vào ETW.</translation>
+<translation id="3459509316159669723">In</translation>
 <translation id="3459774175445953971">Sửa đổi lần cuối:</translation>
 <translation id="3460771772332290399">Chế độ tự động tải lại ngoại tuyến</translation>
 <translation id="3462413494201477527">Hủy thiết lập tài khoản?</translation>
@@ -1866,6 +1907,7 @@
 <translation id="3508920295779105875">Chọn Thư mục Khác...</translation>
 <translation id="3509527969829946096">Tùy chọn này bật hỗ trợ trong Cast Streaming để mã hóa luồng video bằng phần cứng nền tảng.</translation>
 <translation id="3510797500218907545">WiMAX</translation>
+<translation id="3511200754045804813">Quét lại</translation>
 <translation id="3511307672085573050">S&amp;ao chép Địa chỉ Liên kết</translation>
 <translation id="3511399794969432965">Bạn gặp sự cố khi kết nối?</translation>
 <translation id="351152300840026870">Phông chữ có chiều rộng cố định</translation>
@@ -1935,6 +1977,7 @@
 <translation id="3590559774363307859">Đã lưu mật khẩu. Bạn có thể truy cập mật khẩu và tất cả <ph name="SAVED_PASSWORDS_LINK" /> của mình từ bất kỳ trình duyệt nào.</translation>
 <translation id="3590587280253938212">nhanh</translation>
 <translation id="3592260987370335752">&amp;Tìm hiểu thêm</translation>
+<translation id="3592313833691251126">Cho phép tiện ích tạo cửa sổ bảng điều khiển mở bên ngoài khung trình duyệt. Nếu chưa được bật, các lần mở bảng điều khiển sẽ mở cửa sổ bật lên thay vào đó. Thao tác mặc định nhằm chỉ cho phép các tiện ích được liệt kê trong danh sách cho phép. Thao tác bật nhằm cho phép tất cả các tiện ích. Thao tác tắt nhằm không cho phép bảng điều khiển đối với bất kỳ tiện ích nào.</translation>
 <translation id="359283478042092570">Nhập</translation>
 <translation id="3593152357631900254">Bật chế độ Fuzzy-Pinyin</translation>
 <translation id="3593965109698325041">Ràng buộc Tên của Chứng chỉ</translation>
@@ -2012,6 +2055,7 @@
 <translation id="3695919544155087829">Vui lòng nhập mật khẩu đã sử dụng để mã hóa tệp chứng chỉ này.</translation>
 <translation id="3696411085566228381">không có</translation>
 <translation id="3697100740575341996">Quản trị viên CNTT của bạn đã tắt Chrome Goodies cho thiết bị của bạn. <ph name="MORE_INFO_LINK" /></translation>
+<translation id="3699080292907545058">Đặt phiên bản TLS được bật tối đa.</translation>
 <translation id="3699624789011381381">Địa chỉ email</translation>
 <translation id="3704162925118123524">Mạng mà bạn đang sử dụng có thể yêu cầu bạn phải truy cập trang đăng nhập của mạng đó.</translation>
 <translation id="3704331259350077894">Dừng Hoạt động</translation>
@@ -2057,10 +2101,12 @@
 <translation id="3758201569871381925">Vui lòng đảm bảo rằng thiết bị Hotrod của bạn được bật và kết nối với TV.</translation>
 <translation id="375841316537350618">Đang tải xuống tập lệnh proxy...</translation>
 <translation id="3759371141211657149">Quản lý cài đặt trình xử lý...</translation>
+<translation id="3759553810934020361">Đã tắt bluetooth.</translation>
 <translation id="3759933321830434300">Chặn các phần của trang web</translation>
 <translation id="3760460896538743390">Kiểm tra trang &amp;nền</translation>
 <translation id="37613671848467444">Mở trong &amp;Cửa sổ ẩn danh</translation>
 <translation id="3763401818161139108">Luôn chạy trên <ph name="ORIGIN" /></translation>
+<translation id="3764314093345384080">Thông tin bản dựng chi tiết</translation>
 <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Kết nối với một thiết bị USB}other{Kết nối với # thiết bị USB}}</translation>
 <translation id="3764800135428056022">Đề xuất lưu mật khẩu web của bạn.</translation>
 <translation id="3764986667044728669">Không thể đăng ký</translation>
@@ -2090,6 +2136,7 @@
 <translation id="3798449238516105146">Phiên bản</translation>
 <translation id="3798935682015223249">Hỗ trợ MTP trong Trình quản lý tệp</translation>
 <translation id="3800764353337460026">Kiểu biểu tượng</translation>
+<translation id="3800806661949714323">Hiển thị tất cả (được đề xuất)</translation>
 <translation id="3801082500826908679">Tiếng Faroe</translation>
 <translation id="3803991353670408298">Vui lòng thêm phương thức nhập khác trước khi xóa phương thức này.</translation>
 <translation id="380408572480438692">Việc bật tính năng thu thập dữ liệu hoạt động sẽ giúp Google liên tục cải thiện hệ thống. Không dữ liệu nào được gửi cho tới khi bạn gửi báo cáo phản hồi (Alt-Shift-I) và cung cấp dữ liệu hoạt động. Bạn có thể quay lại màn hình này để tắt tính năng thu thập bất kỳ lúc nào.</translation>
@@ -2107,6 +2154,7 @@
 <translation id="3819007103695653773">Cho phép tất cả các trang web gửi thông báo đẩy trong nền</translation>
 <translation id="3819752733757735746">Truy cập bằng nút chuyển (điều khiển máy tính chỉ bằng một hoặc hai nút chuyển)</translation>
 <translation id="3819800052061700452">&amp;Toàn màn hình</translation>
+<translation id="3821453754632750466">Bật thanh toán trên web</translation>
 <translation id="3822265067668554284">Không cho phép bất kỳ trang web nào theo dõi vị trí thực của bạn</translation>
 <translation id="3825863595139017598">Bàn phím chữ Mông Cổ</translation>
 <translation id="3827306204503227641">Tiếp tục cho phép plugin không có hộp cát</translation>
@@ -2168,9 +2216,11 @@
 <translation id="3899968422636198696"><ph name="ORGNAME" /> <ph name="HOSTNAME" /></translation>
 <translation id="3901991538546252627">Đang kết nối với <ph name="NAME" /></translation>
 <translation id="3902799646152133632">Bỏ qua khung chính không lưu trữ.</translation>
+<translation id="3904196543277238487">Đã bật phiên bản TLS tối đa.</translation>
 <translation id="3905761538810670789">Sửa ứng dụng</translation>
 <translation id="390718707505136526">Bật bản dùng thử gốc để kiểm soát quyền truy cập vào thử nghiệm API/tính năng.</translation>
 <translation id="3908501907586732282">Bật tiện ích</translation>
+<translation id="3909690856344416952"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /> và 1 ngôn ngữ khác</translation>
 <translation id="3909791450649380159">Cắ&amp;t</translation>
 <translation id="3910699493603749297">Bàn phím tiếng Khmer</translation>
 <translation id="3911073280391218446"><ph name="USER_DISPLAY_NAME" /> (tên sử dụng trên thiết bị này)</translation>
@@ -2190,6 +2240,7 @@
 <translation id="3930521966936686665">Phát trên</translation>
 <translation id="3936390757709632190">&amp;Mở âm thanh trong tab mới</translation>
 <translation id="3936768791051458634">Thay đổi kênh...</translation>
+<translation id="3936925983113350642">Mật khẩu bạn chọn sẽ cần dùng để khôi phục chứng chỉ này về sau. Vui lòng ghi lại mật khẩu này vào một vị trí an toàn.</translation>
 <translation id="3937640725563832867">Tên Thay thế của Nhà cung cấp Chứng chỉ</translation>
 <translation id="3938113500786732264">Chuyển đổi người dùng nhanh hơn</translation>
 <translation id="3940233957883229251">Bật tính năng tự động lặp lại</translation>
@@ -2257,9 +2308,10 @@
 <translation id="4034042927394659004">Giảm độ sáng của phím</translation>
 <translation id="4035758313003622889">&amp;Trình quản lý tác vụ</translation>
 <translation id="4037084878352560732">Ngựa</translation>
-<translation id="4037102579141982963">Thiết bị này sẽ tự động gửi dữ liệu sử dụng và chẩn đoán cho Google. Bạn có thể thay đổi điều này bất cứ lúc nào trong <ph name="BEGIN_LINK1" />cài đặt<ph name="END_LINK1" /> thiết bị. <ph name="BEGIN_LINK2" />Tìm hiểu thêm<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">Bật trình chuyển đổi tab khả năng truy cập cho Anroid.</translation>
+<translation id="4037889604535939429">Chỉnh sửa người</translation>
 <translation id="4044260751144303020">Tổng hợp cho các phần tử vị trí cố định.</translation>
+<translation id="4044612648082411741">Nhập mật khẩu chứng chỉ của bạn</translation>
 <translation id="404493185430269859">Công cụ tìm kiếm mặc định</translation>
 <translation id="4047112090469382184">Tính năng này an toàn như thế nào</translation>
 <translation id="4047345532928475040">Không có</translation>
@@ -2352,6 +2404,7 @@
 <translation id="417475959318757854">Đặt trình chạy ứng dụng ở vị trí trung tâm.</translation>
 <translation id="4176463684765177261">Đã bị vô hiệu</translation>
 <translation id="4179512409951755566">Bật tính năng cuộn qua cho OSK</translation>
+<translation id="418062721134714140">Quản lý cài đặt và chứng chỉ SSL của bạn</translation>
 <translation id="4180788401304023883">Xóa chứng chỉ CA "<ph name="CERTIFICATE_NAME" />"?</translation>
 <translation id="418179967336296930">Bàn phím ngữ âm tiếng Nga (YaZHert)</translation>
 <translation id="4181841719683918333">Ngôn ngữ</translation>
@@ -2366,6 +2419,7 @@
 <translation id="4195643157523330669">Mở bằng tab mới</translation>
 <translation id="4195814663415092787">Tiếp tục từ điểm bạn đã dừng lại</translation>
 <translation id="4197674956721858839">Chọn file nén zip</translation>
+<translation id="4200689466366162458">Từ tùy chỉnh</translation>
 <translation id="4200983522494130825">&amp;Tab mới</translation>
 <translation id="4206144641569145248">Người ngoài hành tinh</translation>
 <translation id="420665587194630159">(Tiện ích này đã được quản lý và không thể bị xóa hoặc tắt).</translation>
@@ -2462,10 +2516,12 @@
 <translation id="4350019051035968019">Không thể đăng ký thiết bị này vào miền có tài khoản của bạn vì thiết bị được miền khác đánh dấu để quản lý.</translation>
 <translation id="4354806558096370704">Cho phép sử dụng chương trình phụ trợ in CUPS gốc.</translation>
 <translation id="4355925451975609675">Nhấn |<ph name="ACCELERATOR1" />|+|<ph name="ACCELERATOR2" />| để tiến lên</translation>
+<translation id="4358353773267946514"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /></translation>
 <translation id="4358697938732213860">Thêm địa chỉ</translation>
 <translation id="4359408040881008151">Đã được cài đặt vì (các) tiện ích phụ thuộc.</translation>
 <translation id="4361190688154226069">Nhắm mục tiêu theo hình chữ nhật trong các chế độ xem</translation>
 <translation id="4361765875689149937"><ph name="ORIGIN" /> muốn ghép nối với:</translation>
+<translation id="4363771538994847871">Không tìm thấy điểm đến Truyền nào. Bạn cần trợ giúp?</translation>
 <translation id="4364444725319685468">Đã tải xuống <ph name="FILE_NAME" /></translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> đang chia sẻ một cửa sổ.</translation>
 <translation id="4364830672918311045">Hiển thị thông báo</translation>
@@ -2557,6 +2613,7 @@
 <translation id="4509345063551561634">Vị trí:</translation>
 <translation id="4514542542275172126">Thiết lập người dùng được giám sát mới</translation>
 <translation id="4514914692061505365">Buộc sử dụng trình dịch nhanh Subzero của PNaCl cho tất cả các tệp pexe.</translation>
+<translation id="451515744433878153">Xóa</translation>
 <translation id="4516641987425683031">Tab được đồng bộ hóa</translation>
 <translation id="4518677423782794009">Chrome có đang gặp lỗi, hiển thị thanh công cụ hay trang khởi động bất thường hoặc quảng cáo không mong muốn mà bạn không loại bỏ được hoặc làm thay đổi trải nghiệm duyệt web của bạn không? Bạn có thể khắc phục sự cố bằng cách chạy Công cụ làm sạch Chrome.</translation>
 <translation id="452039078290142656">thiết bị không xác định từ <ph name="VENDOR_NAME" /></translation>
@@ -2593,6 +2650,7 @@
 <translation id="4562991793854515912">cực ngắn (600 mili giây)</translation>
 <translation id="4563210852471260509">Ngôn ngữ nhập vào ban đầu là tiếng Trung</translation>
 <translation id="456664934433279154">Kiểm soát xem có sử dụng cửa sổ Ứng dụng Chrome dựa trên Chế độ xem bộ công cụ hay không.</translation>
+<translation id="4567772783389002344">Thêm từ</translation>
 <translation id="4569998400745857585">Menu chứa các tiện ích bị ẩn</translation>
 <translation id="4570444215489785449">Giờ đây, bạn có thể khóa từ xa thiết bị này bất cứ lúc nào trên Trình quản lý Chrome.</translation>
 <translation id="4572659312570518089">Đã hủy xác thực trong khi kết nối với "<ph name="DEVICE_NAME" />".</translation>
@@ -2604,11 +2662,13 @@
 <translation id="4582447636905308869">IME tiếng Hàn mới dựa trên công cụ HMM thuộc Công cụ nhập liệu của Google.</translation>
 <translation id="4582563038311694664">Đặt lại tất cả cài đặt</translation>
 <translation id="4583537898417244378">Tệp lỗi hoặc không hợp lệ.</translation>
+<translation id="4585793705637313973">Chỉnh sửa trang</translation>
 <translation id="4589268276914962177">Thiết bị đầu cuối mới</translation>
 <translation id="4590324241397107707">Bộ nhớ cơ sở dữ liệu</translation>
 <translation id="4593021220803146968">Đ&amp;i đến <ph name="URL" /></translation>
 <translation id="4594109696316595112">Kích hoạt một lần: Hãy nhập mật khẩu của bạn để kích hoạt Smart Lock trên <ph name="DEVICE_TYPE" /> này. Với Smart Lock, điện thoại của bạn sẽ mở khóa thiết bị này—không cần mật khẩu. Để thay đổi hoặc tắt tính năng này, hãy truy cập cài đặt của <ph name="DEVICE_TYPE" />.</translation>
 <translation id="4595560905247879544">Chỉ người quản lý mới có thể sửa đổi ứng dụng và tiện ích (<ph name="CUSTODIAN_NAME" />).</translation>
+<translation id="4596295440756783523">Bạn có các chứng chỉ trên tệp có thể nhận dạng các máy chủ này</translation>
 <translation id="4598556348158889687">Quản lý bộ nhớ</translation>
 <translation id="4601242977939794209">Bộ chuyển đổi EMF</translation>
 <translation id="4602466770786743961">Luôn cho phép <ph name="HOST" /> truy cập vào máy ảnh và micrô của bạn</translation>
@@ -2674,6 +2734,7 @@
 <translation id="4697551882387947560">Khi phiên duyệt kết thúc</translation>
 <translation id="4699172675775169585">Tệp và hình ảnh được lưu trong bộ nhớ cache</translation>
 <translation id="4699357559218762027">(tự động chạy)</translation>
+<translation id="4704677965327178154">Không cho phép bất kỳ trang web nào sử dụng plugin để truy cập máy tính của bạn.</translation>
 <translation id="4707302005824653064">Người quản lý (<ph name="CUSTODIAN_EMAIL" />) có thể xem lại mức sử dụng và lịch sử trên chrome.com.</translation>
 <translation id="4707579418881001319">L2TP/IPsec + chứng chỉ người dùng</translation>
 <translation id="4707934200082538898">Vui lòng kiểm tra email của bạn tại <ph name="BEGIN_BOLD" /><ph name="MANAGER_EMAIL" /><ph name="END_BOLD" /> để được hướng dẫn thêm.</translation>
@@ -2711,6 +2772,7 @@
 <translation id="4744574733485822359">Tải xuống của bạn đã hoàn tất</translation>
 <translation id="4746971725921104503">Dường như bạn đã quản lý một người dùng có tên đó. Bạn có muốn <ph name="LINK_START" />nhập<ph name="USER_DISPLAY_NAME" /> vào thiết bị này<ph name="LINK_END" /> không?</translation>
 <translation id="4747271164117300400">Tiếng Macedonia</translation>
+<translation id="4748762018725435655">Yêu cầu tiện ích từ Cửa hàng Chrome trực tuyến</translation>
 <translation id="4749157430980974800">Bàn phím chữ Georgia</translation>
 <translation id="4750394297954878236">Đề xuất</translation>
 <translation id="475088594373173692">Người dùng đầu tiên</translation>
@@ -2724,6 +2786,7 @@
 <translation id="4763830802490665879">Cookie từ nhiều trang web sẽ bị xóa khi thoát.</translation>
 <translation id="4764029864566166446">Cập nhật plugin...</translation>
 <translation id="4764865176798926079">domContentLoaded của khung chính và tất cả các lượt tải tài nguyên đã bắt đầu trước domContentLoaded (iframe bị bỏ qua).</translation>
+<translation id="4768332406694066911">Bạn có các chứng chỉ từ những tổ chức nhận dạng bạn sau đây</translation>
 <translation id="4768698601728450387">Cắt hình ảnh</translation>
 <translation id="4773696473262035477">Bạn có thể truy cập mật khẩu này và tất cả <ph name="SAVED_PASSWORDS_LINK" /> của mình từ mọi trình duyệt.</translation>
 <translation id="4776917500594043016">Mật khẩu cho <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -2741,10 +2804,12 @@
 <translation id="4793866834012505469">Đào tạo lại mẫu giọng nói</translation>
 <translation id="479536056609751218">Trang web, chỉ HTML</translation>
 <translation id="479989351350248267">search</translation>
+<translation id="480036413855787547">Truy cập mật khẩu của bạn từ mọi thiết bị tại <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />. Trên máy Mac, mật khẩu có thể được lưu vào Keychain cũng như có thể được truy cập hoặc đồng bộ hóa bởi những người dùng Chrome khác dùng chung tài khoản OS X này.</translation>
 <translation id="4801257000660565496">Tạo Phím tắt cho Ứng dụng</translation>
 <translation id="4801448226354548035">Ẩn tài khoản</translation>
 <translation id="4801512016965057443">Cho phép chuyển vùng dữ liệu di động</translation>
 <translation id="4801956050125744859">Giữ cả hai</translation>
+<translation id="4803121606678474433">Bật chuyển đổi chế độ hiển thị động canvas 2D.</translation>
 <translation id="4803909571878637176">Gỡ cài đặt</translation>
 <translation id="4804331037112292643">Hộp thoại mở/lưu tệp</translation>
 <translation id="4804818685124855865">Ngắt kết nối</translation>
@@ -2763,6 +2828,7 @@
 <translation id="4824518112777153488">Hỗ trợ cho màn hình cảm ứng hỗ trợ di chuột</translation>
 <translation id="4827948050554950725">Thêm thẻ tín dụng</translation>
 <translation id="4828493911650550108">Cải thiện độ chính xác của vị trí bằng cách cho phép ứng dụng và dịch vụ quét tìm mạng Wi‑Fi và thiết bị Bluetooth.</translation>
+<translation id="4828937774870308359">Tiếng Úc</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> của bạn không thể kết nối Internet bằng cách sử dụng <ph name="NETWORK_NAME" />. Vui lòng chọn mạng khác. <ph name="LEARN_MORE_LINK_START" />Tìm hiểu thêm<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Thông tin nhận dạng của <ph name="ORGANIZATION" /> tại <ph name="LOCALITY" /> đã được <ph name="ISSUER" /> xác minh. Thông tin hợp lệ về Tính rõ ràng của chứng chỉ đã được máy chủ cung cấp.</translation>
 <translation id="4834912470034578916">Bật bố cục tùy chỉnh cho Thông báo trên web.</translation>
@@ -2781,6 +2847,7 @@
 <translation id="4849517651082200438">Không cài đặt</translation>
 <translation id="4850258771229959924">Xem trong Công cụ nhà phát triển</translation>
 <translation id="4850458635498951714">Thêm thiết bị</translation>
+<translation id="4850669014075537160">Cuộn</translation>
 <translation id="4850886885716139402">Xem</translation>
 <translation id="4853020600495124913">Mở trong &amp;cửa sổ mới</translation>
 <translation id="485316830061041779">Tiếng Đức</translation>
@@ -2828,6 +2895,7 @@
 <translation id="4903369323166982260">Chạy Công cụ làm sạch Chrome</translation>
 <translation id="4906679076183257864">Đặt lại về mặc định</translation>
 <translation id="4907125798206348918">MemoryCache yếu.</translation>
+<translation id="4907306957610201395">Danh mục quyền</translation>
 <translation id="49088176676474409">Ẩn giá trị VPD.</translation>
 <translation id="4910021444507283344">WebGL</translation>
 <translation id="4910673011243110136">Mạng riêng</translation>
@@ -2854,6 +2922,7 @@
 <translation id="4938972461544498524">Cài đặt bàn di chuột</translation>
 <translation id="4940047036413029306">Dấu ngoặc kép</translation>
 <translation id="4941246025622441835">Sử dụng yêu cầu thiết bị này khi đăng ký thiết bị để quản lý doanh nghiệp:</translation>
+<translation id="4941627891654116707">Cỡ chữ</translation>
 <translation id="4942394808693235155">Kiểm tra và áp dụng bản cập nhật</translation>
 <translation id="494286511941020793">Trợ giúp Cấu hình Proxy</translation>
 <translation id="4950138595962845479">Tùy chọn...</translation>
@@ -2864,6 +2933,7 @@
 <translation id="4956847150856741762">1</translation>
 <translation id="495931528404527476">Trong Chrome</translation>
 <translation id="496226124210045887">Thư mục bạn đã chọn chứa các tệp nhạy cảm. Bạn có chắc chắn muốn cấp quyền truy cập đọc vĩnh viễn "$1" cho thư mục này không?</translation>
+<translation id="4964455510556214366">Sắp xếp</translation>
 <translation id="4964673849688379040">Đang kiểm tra...</translation>
 <translation id="4966802378343010715">Tạo người dùng mới</translation>
 <translation id="4967749818080339523">Chọn tài khoản</translation>
@@ -2988,6 +3058,7 @@
 <translation id="5144820558584035333">Hangul 3 bộ (390)</translation>
 <translation id="5145331109270917438">Ngày sửa đổi</translation>
 <translation id="5146631943508592569">Tắt thông báo khi thiết bị hết hạn sử dụng.</translation>
+<translation id="5147113189823897615">Vì tài khoản này do <ph name="DOMAIN" /> quản lý nên dấu trang, lịch sử, mật khẩu và các cài đặt khác của bạn sẽ bị xóa khỏi thiết bị này. Tuy nhiên, dữ liệu sẽ vẫn được lưu trữ trong Tài khoản Google.</translation>
 <translation id="5147237161038757796">Tự động sửa trên bàn phím thực</translation>
 <translation id="5148320352496581610">Nhắm mục tiêu theo hình chữ nhật sử dụng phương pháp phỏng đoán để xác định mục tiêu có khả năng xảy ra nhất của một cử chỉ, nơi vùng cảm ứng được biểu thị bằng một hình chữ nhật.</translation>
 <translation id="5150254825601720210">Tên Máy chủ SSL của Chứng chỉ Netscape</translation>
@@ -3024,6 +3095,7 @@
 <translation id="5181140330217080051">Đang tải xuống</translation>
 <translation id="5182671122927417841">Tắt tiện ích</translation>
 <translation id="5184063094292164363">Bảng điều khiển &amp;JavaScript</translation>
+<translation id="5184662919967270437">Đang cập nhật thiết bị của bạn</translation>
 <translation id="5185386675596372454">Phiên bản mới nhất của "<ph name="EXTENSION_NAME" />" đã bị tắt vì phiên bản đó yêu cầu nhiều giấy phép hơn.</translation>
 <translation id="5185403602014064051">Tính năng này cho phép bạn truy cập nhanh bất kỳ người dùng đã đăng nhập nào mà không cần mật khẩu.</translation>
 <translation id="5186650237607254032">Cập nhật khóa màn hình của điện thoại để khóa này tắt khi bạn đang ở gần. Bạn sẽ mở khóa điện thoại nhanh hơn và có trải nghiệm tuyệt vời hơn với Smart Lock trên <ph name="DEVICE_TYPE" />.</translation>
@@ -3035,6 +3107,7 @@
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5197680270886368025">Hoàn tất quá trình đồng bộ hóa.</translation>
 <translation id="5204967432542742771">Nhập mật khẩu</translation>
+<translation id="5206215183583316675">Xóa "<ph name="CERTIFICATE_NAME" />"?</translation>
 <translation id="520621735928254154">Lỗi nhập chứng chỉ</translation>
 <translation id="5208988882104884956">Nửa độ rộng</translation>
 <translation id="5209320130288484488">Không tìm thấy thiết bị nào</translation>
@@ -3052,6 +3125,7 @@
 <translation id="5227808808023563348">Tìm văn bản trước đó</translation>
 <translation id="5228076606934445476">Đã xảy ra lỗi với thiết bị.  Để khắc phục lỗi này, bạn sẽ cần khởi động lại thiết bị và thử lại.</translation>
 <translation id="5228962187251412618">Chỉ kiểm tra trực tuyến</translation>
+<translation id="5229189185761556138">Quản lý phương thức nhập</translation>
 <translation id="5229622432348746578">Tắt âm thanh cho chia sẻ màn hình</translation>
 <translation id="5230516054153933099">Cửa sổ</translation>
 <translation id="5232178406098309195">Khi bạn sử dụng lệnh kích hoạt bằng âm thanh, chẳng hạn như "Ok Google" hoặc chạm vào biểu tượng micrô, Hoạt động giọng nói và âm thanh riêng tư của bạn sẽ lưu trữ một số giọng nói và âm thanh khác vào tài khoản của bạn. Bản ghi giọng nói/âm thanh tiếp theo, cùng với vài giây trước đó, sẽ được lưu trữ.</translation>
@@ -3231,7 +3305,6 @@
 <translation id="5439568486246921931">Thao tác này sẽ xóa vĩnh viễn các tài nguyên đã tải xuống, tệp ngoại tuyến và dữ liệu duyệt web của người dùng này. Không thể hoàn tác thao tác này.</translation>
 <translation id="544083962418256601">Tạo phím tắt...</translation>
 <translation id="5441100684135434593">Mạng có dây</translation>
-<translation id="5445088910157062298">Cho phép dịch vụ vị trí của Google giúp các ứng dụng tìm vị trí của bạn nhanh chóng và chính xác để có thể giảm mức tiêu thụ pin. Dữ liệu vị trí ẩn danh sẽ được gửi tới Google ngay cả khi không có ứng dụng nào đang chạy.</translation>
 <translation id="5448293924669608770">Rất tiếc, đã xảy ra lỗi khi đăng nhập</translation>
 <translation id="5449588825071916739">Đánh dấu trang tất cả các tab</translation>
 <translation id="5449716055534515760">Đóng cửa &amp;sổ</translation>
@@ -3394,6 +3467,7 @@
 <translation id="5675224880872496917">Tạo hoạt ảnh mượt mà khi cuộn nội dung trang.</translation>
 <translation id="5676267133227121599">Truy cập mật khẩu của bạn từ bất kỳ thiết bị nào tại <ph name="MANAGEMENT_LINK" />.</translation>
 <translation id="5677503058916217575">Ngôn ngữ trang:</translation>
+<translation id="5677850799565527075">Chặn cookie của bên thứ ba.</translation>
 <translation id="5677928146339483299">Bị chặn</translation>
 <translation id="5678550637669481956">Quyền truy cập đọc và ghi vào <ph name="VOLUME_NAME" /> đã được cấp.</translation>
 <translation id="567881659373499783">Phiên bản <ph name="PRODUCT_VERSION" /></translation>
@@ -3423,6 +3497,7 @@
 <translation id="5711983031544731014">Không mở khóa được. Hãy nhập mật khẩu của bạn.</translation>
 <translation id="5712966208980506909">Nếu được bật, URL chrome://md-policy sẽ tải trang chính sách Material Design.</translation>
 <translation id="5715711091495208045">Trình môi giới plugin: <ph name="PLUGIN_NAME" /></translation>
+<translation id="5719603411793408026">Công cụ tìm kiếm mặc định</translation>
 <translation id="572328651809341494">Các tab gần đây</translation>
 <translation id="5723508132121499792">Không có ứng dụng nền nào đang chạy</translation>
 <translation id="5725124651280963564">Vui lòng đăng nhập vào <ph name="TOKEN_NAME" /> để tạo khóa cho <ph name="HOST_NAME" />.</translation>
@@ -3430,14 +3505,18 @@
 <translation id="572525680133754531">Hiển thị đường viền quanh Lớp kết xuất tổng hợp để trợ giúp gỡ rối và nghiên cứu cách tập hợp lớp.</translation>
 <translation id="5726521882516480114">Cho phép sử dụng GPU để thực hiện kết xuất canvas 2d thay vì sử dụng kết xuất phần mềm.</translation>
 <translation id="5727728807527375859">Tiện ích, ứng dụng và chủ đề có thể gây hại cho máy tính của bạn. Bạn có chắc chắn muốn tiếp tục không?</translation>
+<translation id="5727970983344022445">Không cho phép bất kỳ trang web nào sử dụng tính năng tạo khóa trong biểu mẫu</translation>
 <translation id="5729712731028706266">&amp;Xem</translation>
 <translation id="5729996640881880439">Rất tiếc, chúng tôi không thể hiển thị mã cho lỗi này.</translation>
 <translation id="5731247495086897348">Dá&amp;n và Truy cập</translation>
 <translation id="5731751937436428514">Phương pháp nhập tiếng Việt (VIQR)</translation>
 <translation id="5732790216998904518">Chỉnh sửa ngoại tuyến đối với Tài liệu, Trang tính và Trang trình bày nhằm mục đích thử nghiệm.</translation>
 <translation id="5734362860645681824">Truyền thông</translation>
+<translation id="5739458112391494395">Rất lớn</translation>
+<translation id="5740331643563157105"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /> và <ph name="NUM_ADDITIONAL_LANGUAGES" /> ngôn ngữ khác</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: chọn để chỉnh sửa</translation>
 <translation id="5741454054957165976">Bật Phiên bản mới của Can thiệp tác nhân người dùng để tải WebFonts.</translation>
+<translation id="5742598604154146709">Không cho phép bất kỳ trang web nào tự động tải nhiều tệp xuống.</translation>
 <translation id="574392208103952083">Trung bình</translation>
 <translation id="5744368829843057748">Translate 2016Q2 UI</translation>
 <translation id="5745056705311424885">Đã phát hiện thấy thẻ nhớ USB</translation>
@@ -3621,6 +3700,7 @@
 <translation id="5996258716334177896">Không thể mở hồ sơ của bạn đúng cách.
 
 Một số tính năng có thể không có sẵn. Hãy kiểm tra xem hồ sơ có tồn tại và bạn có quyền đọc và ghi nội dung trong hồ sơ không.</translation>
+<translation id="6001799583597751002">Mã PIN không khớp:</translation>
 <translation id="6003177993629630467"><ph name="PRODUCT_NAME" /> không thể tự cập nhật.</translation>
 <translation id="6003294706906016758">Bật khung kiểu ứng dụng web cho các ứng dụng được lưu trữ</translation>
 <translation id="600424552813877586">Ứng dụng không hợp lệ.</translation>
@@ -3646,6 +3726,7 @@
 <translation id="604001903249547235">Sao lưu đám mây</translation>
 <translation id="6040143037577758943">Đóng</translation>
 <translation id="604124094241169006">Tự động</translation>
+<translation id="6041935588605837913">10</translation>
 <translation id="6042308850641462728">Thêm</translation>
 <translation id="604257181445267932">Smart Lock giúp bạn đăng nhập nhanh vào ứng dụng và trang web nhờ sử dụng mật khẩu bạn đã lưu với Google.</translation>
 <translation id="6043317578411397101"><ph name="APP_NAME" /> đang chia sẻ một tab trong Chrome với <ph name="TAB_NAME" />.</translation>
@@ -3665,6 +3746,7 @@
 <translation id="6062697480277116433">Bạn đang sử dụng dữ liệu di động</translation>
 <translation id="6065289257230303064">Các Thuộc tính Thư mục Đối tượng Chứng chỉ</translation>
 <translation id="6071181508177083058">xác nhận mật khẩu</translation>
+<translation id="6073903501322152803">Thêm tính năng trợ năng</translation>
 <translation id="6074825444536523002">Biểu mẫu Google</translation>
 <translation id="6075731018162044558">Rất tiếc! Hệ thống không lấy được mã thông báo truy cập API dài hạn cho thiết bị này.</translation>
 <translation id="6075880972317537864">Những kẻ tấn công trên <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> có thể cố gắng đánh lừa bạn để ăn cắp thông tin của bạn (ví dụ: mật khẩu, thư hoặc thẻ tín dụng).</translation>
@@ -3699,7 +3781,6 @@
 <translation id="6110466548232134880">Thông tin nhận dạng của <ph name="ORGANIZATION" /> tại <ph name="LOCALITY" /> đã được <ph name="ISSUER" /> xác minh. Không có thông tin nào về Tính rõ ràng của chứng chỉ được máy chủ cung cấp.</translation>
 <translation id="6111770213269631447">Chuyển ngữ (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">Được cho phép theo mặc định</translation>
-<translation id="6112929985131461002">Thiết bị này sẽ tự động gửi dữ liệu sử dụng và chẩn đoán cho Google. Quản trị viên của bạn buộc thực thi <ph name="BEGIN_LINK1" />cài đặt<ph name="END_LINK1" /> này. <ph name="BEGIN_LINK2" />Tìm hiểu thêm<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">Thay đổi cài đặt ngôn ngữ và phương thức nhập</translation>
 <translation id="6120205520491252677">Ghim trang này vào màn hình Bắt đầu...</translation>
 <translation id="6122081475643980456">Kết nối Internet của bạn đang bị kiểm soát</translation>
@@ -3721,8 +3802,10 @@
 <translation id="6143186082490678276">Nhận trợ giúp</translation>
 <translation id="6144697279259829572">{NUM_ITEMS,plural, =1{Thao tác này sẽ xóa vĩnh viễn ít nhất $1 mục khỏi thiết bị này.}other{Thao tác này sẽ xóa vĩnh viễn ít nhất $1 mục khỏi thiết bị này.}}</translation>
 <translation id="6144890426075165477"><ph name="PRODUCT_NAME" /> hiện tại không phải là trình duyệt mặc định của bạn.</translation>
+<translation id="6145860855437952742">Số lượng cửa sổ xem trước tối đa ở chế độ tổng quan có thể sử dụng mặt nạ để ẩn tiêu đề cửa sổ và sử dụng các góc tròn.</translation>
 <translation id="6147020289383635445">Không thể xem trước bản in.</translation>
 <translation id="614998064310228828">Mẫu thiết bị:</translation>
+<translation id="6150555451039504280">Thu gọn/mở rộng</translation>
 <translation id="6150853954427645995">Để lưu tệp này để sử dụng ngoại tuyến, hãy trực tuyến trở lại, nhấp chuột phải vào tệp và chọn tùy chọn <ph name="OFFLINE_CHECKBOX_NAME" />.</translation>
 <translation id="6151323131516309312">Nhấp vào <ph name="SEARCH_KEY" /> để tìm kiếm <ph name="SITE_NAME" /></translation>
 <translation id="6154697846084421647">Hiện đã đăng nhập</translation>
@@ -3820,6 +3903,7 @@
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Máy in mới trên mạng của bạn}other{Máy in mới trên mạng của bạn}}</translation>
 <translation id="6285395082104474418">Khay trạng thái hiển thị cho bạn trạng thái hiện tại của mạng, pin và các thông tin khác.</translation>
 <translation id="6286684120317096255">Đang đo lường mức sử dụng dữ liệu</translation>
+<translation id="6286708577777130801">Chi tiết mật khẩu đã lưu</translation>
 <translation id="6287852322318138013">Chọn một ứng dụng để mở tệp này</translation>
 <translation id="6288919040208869552">Nếu được định cấu hình, proxy thường chặn ủy quyền trên các cổng cố định khác nhau. Việc này sẽ bật tính năng mở hộp thoại ủy quyền cổng cố định trong một cửa sổ riêng biệt, bỏ qua cài đặt proxy.</translation>
 <translation id="6290556621549272952">Bạn có thể sử dụng tính năng này để hiển thị nội dung từ Chromium trên TV hoặc các thiết bị khác.</translation>
@@ -3861,6 +3945,7 @@
 <translation id="6353618411602605519">Bàn phím tiếng Croatia</translation>
 <translation id="6356936121715252359">Cài đặt lưu trữ của Adobe Flash Player...</translation>
 <translation id="6357619544108132570">Chào mừng bạn đến với nhóm sản phẩm <ph name="SHORT_PRODUCT_NAME" />. Đây không phải là máy tính thông thường.</translation>
+<translation id="63617602971594377">Bật API cho thanh toán trên web</translation>
 <translation id="6361850914223837199">Chi tiết lỗi:</translation>
 <translation id="6362853299801475928">&amp;Báo cáo sự cố...</translation>
 <translation id="636343209757971102">Địa chỉ IPv6:</translation>
@@ -3896,6 +3981,7 @@
 <translation id="6410063390789552572">Không thể truy cập thư viện mạng</translation>
 <translation id="6410257289063177456">Tệp hình ảnh</translation>
 <translation id="6410328738210026208">Thay đổi kênh và Powerwash</translation>
+<translation id="6410668567036790476">Thêm công cụ tìm kiếm</translation>
 <translation id="641105183165925463">$1 MB</translation>
 <translation id="6412931879992742813">Cửa sổ ẩn danh mới</translation>
 <translation id="6418160186546245112">Hoàn nguyên về phiên bản được cài đặt trước của <ph name="IDS_SHORT_PRODUCT_NAME" /></translation>
@@ -3928,14 +4014,15 @@
 <translation id="6443783728907198276">Khi được bật, thông báo Stun do WebRTC tạo sẽ chứa tiêu đề gốc.</translation>
 <translation id="6444070574980481588">Đặt ngày giờ</translation>
 <translation id="6445450263907939268">Nếu không thích những thay đổi này, bạn có thể khôi phục cài đặt trước của mình.</translation>
+<translation id="6447388538018752757">Bật chuyển đổi kênh hiển thị hình ảnh động trong canvas 2D để tối ưu hóa hiệu suất dựa trên loại tác vụ vẽ được gọi.</translation>
 <translation id="6447842834002726250">Cookie</translation>
 <translation id="6449285849137521213">Ứng dụng "<ph name="EXTENSION_NAME" />" đã được thêm.</translation>
 <translation id="6450876761651513209">Thay đổi các cài đặt liên quan đến bảo mật của bạn</translation>
+<translation id="6451180435462401570">Quản lý thiết bị Cloud Print</translation>
 <translation id="6451650035642342749">Xóa cài đặt tự động mở</translation>
 <translation id="6452181791372256707">Từ chối</translation>
 <translation id="6454421252317455908">Phương pháp nhập tiếng Trung (nhanh)</translation>
 <translation id="6455348477571378046">Loại chứng chỉ:</translation>
-<translation id="6456234919706689841">Quản trị viên của bạn có thể chọn gửi dữ liệu sử dụng và chẩn đoán của thiết bị này cho Google. Bạn có thể xem <ph name="BEGIN_LINK1" />cài đặt<ph name="END_LINK1" /> này ở đây. <ph name="BEGIN_LINK2" />Tìm hiểu thêm<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">Tiếp tục chặn JavaScript</translation>
 <translation id="6458308652667395253">Quản lý chặn JavaScript...</translation>
 <translation id="6459488832681039634">Sử dụng Phần lựa chọn cho Tìm kiếm</translation>
@@ -3989,10 +4076,12 @@
 <translation id="6526654154229718724">Chế độ toàn màn hình thử nghiệm với chế độ khóa bàn phím yêu cầu người dùng phải giữ Esc để thoát.</translation>
 <translation id="6527303717912515753">Chia sẻ</translation>
 <translation id="6528546217685656218">Khóa cá nhân cho chứng chỉ ứng dụng khách này còn thiếu hoặc không hợp lệ.</translation>
+<translation id="652948702951888897">Lịch sử Chrome</translation>
 <translation id="653019979737152879">Đang đồng bộ hóa <ph name="FILE_NAME" />...</translation>
 <translation id="6534583978616527129">Khởi tạo kết nối</translation>
 <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Lưu ý:<ph name="END_BOLD" /> Chỉ bật nếu bạn biết mình đang làm gì hoặc nếu bạn đã được yêu cầu bật vì việc thu thập dữ liệu có thể giảm hiệu suất hoạt động.</translation>
 <translation id="654233263479157500">Sử dụng dịch vụ web để giúp giải quyết lỗi điều hướng</translation>
+<translation id="6545665334409411530">Tốc độ lặp lại</translation>
 <translation id="6545834809683560467">Sử dụng dịch vụ truy vấn dự đoán để giúp hoàn thành các tìm kiếm và URL được nhập vào thanh địa chỉ hoặc hộp tìm kiếm của trình chạy ứng dụng</translation>
 <translation id="6546686722964485737">Tham gia mạng Wimax</translation>
 <translation id="6547316139431024316">Không cảnh báo lại đối với tiện ích này</translation>
@@ -4063,9 +4152,11 @@
 <translation id="6643016212128521049">Xóa</translation>
 <translation id="6644756108386233011">Đặt lại cài đặt <ph name="IDS_SHORT_PRODUCT_NAME" /> đã thay đổi?</translation>
 <translation id="6647228709620733774">URL thu hồi của tổ chức phát hành chứng chỉ Netscape</translation>
+<translation id="6647838571840953560">Hiện ở trên <ph name="CHANNEL_NAME" /></translation>
 <translation id="6649018507441623493">Hãy đợi giây lát…</translation>
 <translation id="6649068951642910388">Giao diện người dùng khôi phục phiên sẽ được hiển thị trong bong bóng thay vì hiển thị trên thanh thông tin.</translation>
 <translation id="665061930738760572">Mở trong cửa sổ &amp;mới</translation>
+<translation id="6651237644330755633">Tin tưởng chứng chỉ này khi nhận dạng trang web</translation>
 <translation id="6652975592920847366">Tạo phương tiện khôi phục hệ điều hành</translation>
 <translation id="6653525630739667879">Không thể lưu vào $1. Tất cả chỉnh sửa sẽ được lưu vào $2 trong thư mục Tải xuống.</translation>
 <translation id="6655190889273724601">Chế độ dành cho nhà phát triển</translation>
@@ -4120,6 +4211,7 @@
 <translation id="6725970970008349185">Số lượng ứng viên để hiển thị trên mỗi trang</translation>
 <translation id="672609503628871915">Xem tính năng mới</translation>
 <translation id="6727005317916125192">Ngăn trước đó</translation>
+<translation id="6727842159866499206">Số lượng cửa sổ xem trước tối đa ở chế độ tổng quan có thể sử dụng hình dạng để ẩn tiêu đề cửa sổ.</translation>
 <translation id="6731320427842222405">Việc này có thể mất vài phút</translation>
 <translation id="6731638353631257659">Chế độ lưu vào bộ nhớ cache V8.</translation>
 <translation id="6732586201820838268">Không thể thiết lập kết nối với điện thoại của bạn. Đảm bảo rằng bạn đang sử dụng điện thoại Android tương thích đã được bật và trong tầm tay. &lt;a&gt;Tìm hiểu thêm&lt;/a&gt;</translation>
@@ -4145,6 +4237,7 @@
 <translation id="6769712124046837540">Đang thêm máy in...</translation>
 <translation id="6771503742377376720">Là Tổ chức phát hành chứng chỉ</translation>
 <translation id="6773575010135450071">Thêm tác vụ...</translation>
+<translation id="677965093459947883">Rất nhỏ</translation>
 <translation id="6780439250949340171">quản lý các cài đặt khác</translation>
 <translation id="6786747875388722282">Tiện ích</translation>
 <translation id="6787839852456839824">Phím tắt</translation>
@@ -4168,6 +4261,7 @@
 <translation id="6815353853907306610"><ph name="IDS_SHORT_PRODUCT_NAME" /> phát hiện thấy cài đặt trình duyệt của bạn có thể đã bị thay đổi mà bạn không biết. Bạn có muốn đặt lại cài đặt về mặc định ban đầu không?</translation>
 <translation id="6815551780062710681">chỉnh sửa</translation>
 <translation id="6817358880000653228">Đã lưu mật khẩu cho trang web này:</translation>
+<translation id="6820008762872335722">Đặt lại để hỏi</translation>
 <translation id="6820687829547641339">Lưu trữ tar được nén bởi Gzip</translation>
 <translation id="682123305478866682">Truyền màn hình</translation>
 <translation id="6823506025919456619">Bạn cần đăng nhập vào Chrome để thấy thiết bị của mình</translation>
@@ -4188,7 +4282,9 @@
 <translation id="683526731807555621">Thêm công cụ t.kiếm mới
 </translation>
 <translation id="6835762382653651563">Vui lòng kết nối Internet để cập nhật <ph name="DEVICE_TYPE" /> của bạn.</translation>
+<translation id="6839158130869314728">Phản chiếu màn hình</translation>
 <translation id="6839225236531462745">Lỗi xóa chứng chỉ</translation>
+<translation id="6840155290835956714">Hỏi trước khi gửi</translation>
 <translation id="6840184929775541289">Không phải là Tổ chức phát hành chứng chỉ</translation>
 <translation id="6840313690797192085">$1 PB</translation>
 <translation id="6841186874966388268">Lỗi</translation>
@@ -4198,6 +4294,7 @@
 <translation id="6847758263950452722">Lưu trang dưới dạng MHTML</translation>
 <translation id="6853388645642883916">Trình cập nhật đang ở chế độ ngủ</translation>
 <translation id="68541483639528434">Đóng các tab khác</translation>
+<translation id="6855099371444560844">Thêm thiết bị</translation>
 <translation id="6856701878604560493">Bật dấu trang ngoại tuyến</translation>
 <translation id="6860097299815761905">Cài đặt proxy...</translation>
 <translation id="6860427144121307915">Mở trong một tab</translation>
@@ -4279,11 +4376,13 @@
 <translation id="6980956047710795611">Chuyển tất cả dữ liệu trên hệ điều hành Chrome sang mật khẩu mới
 (yêu cầu mật khẩu trước đó)</translation>
 <translation id="6981982820502123353">Truy cập</translation>
+<translation id="6981992744085917617">Chọn phương pháp bạn muốn sử dụng để đăng nhập lại vào tài khoản của mình:</translation>
 <translation id="6982896539684144327">Đã phát hiện thấy máy in từ <ph name="VENDOR_NAME" /></translation>
 <translation id="6983783921975806247">OID đã Đăng ký</translation>
 <translation id="6983991971286645866">Tất cả các chỉnh sửa sẽ được lưu vào $1.</translation>
 <translation id="6985235333261347343">Tác nhân Phục hồi Khoá của Microsoft</translation>
 <translation id="6985276906761169321">ID:</translation>
+<translation id="6985607387932385770">Máy in</translation>
 <translation id="6986605181115043220">Rất tiếc, Đồng bộ hóa đã ngừng hoạt động. <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation>
 <translation id="6989294135336900804">Không có tab nào được đồng bộ hóa</translation>
 <translation id="6990081529015358884">Bạn đã hết dung lượng lưu trữ</translation>
@@ -4306,6 +4405,7 @@
 <translation id="7006844981395428048">Âm thanh $1</translation>
 <translation id="7008270479623533562">Để chạy tiện ích này, bạn cần phải làm mới trang. Bạn có thể chạy tiện ích này tự động trên trang web này bằng cách nhấp chuột phải vào biểu tượng tiện ích.</translation>
 <translation id="7009045250432250765">Tự đồng điền bằng một lần nhấp</translation>
+<translation id="7009420427128923703">Số lượng cửa sổ tối đa ở chế độ tổng quan có thể sử dụng mặt nạ.</translation>
 <translation id="7010160495478792664">Giải mã video được tăng tốc phần cứng khi có thể.</translation>
 <translation id="7010400591230614821">Chiến lược phát hành tab linh hoạt</translation>
 <translation id="701080569351381435">Xem Nguồn</translation>
@@ -4349,6 +4449,7 @@
 <translation id="7061692898138851896">Tự động lưu mật khẩu</translation>
 <translation id="7062222374113411376">Cho phép các trang web đóng gần đây hoàn tất gửi và nhận dữ liệu (khuyến nghị)</translation>
 <translation id="7063129466199351735">Đang xử lý lối tắt...</translation>
+<translation id="7063957500469387217">Thiết lập hoặc quản lý máy in trong Google Cloud Print.</translation>
 <translation id="7065223852455347715">Thiết bị này bị khóa trong chế độ ngăn đăng ký doanh nghiệp.  Nếu bạn muốn đăng ký thiết bị, trước tiên bạn cần khôi phục thiết bị.</translation>
 <translation id="7065534935986314333">Giới thiệu về Hệ thống</translation>
 <translation id="7066944511817949584">Không thể kết nối với "<ph name="DEVICE_NAME" />".</translation>
@@ -4411,6 +4512,7 @@
 <translation id="715118844758971915">Máy in cổ điển</translation>
 <translation id="7154130902455071009">Thay đổi trang chủ của bạn thành: <ph name="START_PAGE" /></translation>
 <translation id="715487527529576698">Chế độ tiếng Trung ban đầu là tiếng Trung Giản thể</translation>
+<translation id="7155171745945906037">Ảnh hiện có từ máy ảnh hoặc tệp</translation>
 <translation id="715568033737470079">Chỉ định plugin PPAPI sẽ được chạy trong chính sách hộp cát khóa Win32k (Chỉ Windows 10 trở lên).</translation>
 <translation id="7156235233373189579">Tệp này được thiết kế cho PC sử dụng phần mềm Windows. Tệp này không tương thích với thiết bị chạy Chrome OS của bạn. Hãy tìm kiếm ứng dụng thay thế phù hợp trên <ph name="BEGIN_LINK" />Cửa hàng Chrome trực tuyến<ph name="END_LINK" />. <ph name="BEGIN_LINK_HELP" />Tìm hiểu thêm<ph name="END_LINK_HELP" /></translation>
 <translation id="7157063064925785854">Bằng cách nhấp vào Tiếp tục, bạn đồng ý với <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" /> và <ph name="LEGAL_DOC_LINK_TEXT_4" />.</translation>
@@ -4427,6 +4529,7 @@
 <translation id="7175353351958621980">Được tải từ:</translation>
 <translation id="7180611975245234373">Làm mới</translation>
 <translation id="7180865173735832675">Tùy chỉnh</translation>
+<translation id="7185078796915954712">TLS 1.3</translation>
 <translation id="7185690883425432021">Ẩn nút đóng của các tab không hoạt động khi thanh tab ở chế độ xếp chồng.</translation>
 <translation id="7186088072322679094">Giữ trong thanh công cụ</translation>
 <translation id="719009910964971313">Bàn phím US Programmer Dvorak</translation>
@@ -4466,6 +4569,8 @@
 <translation id="7240120331469437312">Tên Thay thế Đối tượng của Chứng chỉ</translation>
 <translation id="7241389281993241388">Vui lòng đăng nhập vào <ph name="TOKEN_NAME" /> để nhập chứng chỉ ứng dụng khách.</translation>
 <translation id="7243055093079293866">Nói "Ok Google" vào tab mới và google.com</translation>
+<translation id="7243632151880336635">Xóa và đăng xuất</translation>
+<translation id="7245628041916450754"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Tốt nhất)</translation>
 <translation id="724691107663265825">Trang web sắp truy cập chứa phần mềm độc hại</translation>
 <translation id="725109152065019550">Rất tiếc, quản trị viên của bạn đã tắt bộ nhớ ngoài trên tài khoản của bạn.</translation>
 <translation id="7252661675567922360">Không tải</translation>
@@ -4479,7 +4584,9 @@
 <translation id="7262004276116528033">Dịch vụ đăng nhập này do <ph name="SAML_DOMAIN" /> lưu trữ</translation>
 <translation id="7262221505565121">Ngoại lệ truy cập plugin không có hộp cát</translation>
 <translation id="7264275118036872269">Không thể bắt đầu khám phá thiết bị Bluetooth.</translation>
+<translation id="7264454014834869122">Chọn từ Cửa hàng Chrome trực tuyến</translation>
 <translation id="726502072182862130">Tên và biểu tượng hồ sơ trên Google</translation>
+<translation id="7267186368513450821">5</translation>
 <translation id="7268365133021434339">Đóng tab</translation>
 <translation id="7268659760406822741">Dịch vụ khả dụng</translation>
 <translation id="7273110280511444812">được đính kèm lần cuối vào <ph name="DATE" /></translation>
@@ -4496,6 +4603,7 @@
 <translation id="7287143125007575591">Truy cập bị từ chối.</translation>
 <translation id="7288592446024861651">Dấu trang, lịch sử, mật khẩu và các cài đặt khác sẽ được đồng bộ hóa với Tài khoản Google của bạn để bạn có thể sử dụng chúng trên tất cả thiết bị của mình. Điều khiển những nội dung cần đồng bộ hóa trong <ph name="BEGIN_LINK" /></translation>
 <translation id="7288676996127329262"><ph name="HORIZONTAL_DPI" />x<ph name="VERTICAL_DPI" /> dpi</translation>
+<translation id="7289225569524511578">Mở ứng dụng hình nền</translation>
 <translation id="7290242001003353852">Dịch vụ đăng nhập này, do <ph name="SAML_DOMAIN" /> lưu trữ, đang truy cập vào máy ảnh của bạn.</translation>
 <translation id="7290594223351252791">Xác nhận đăng ký</translation>
 <translation id="7295019613773647480">Bật người dùng được giám sát</translation>
@@ -4534,6 +4642,7 @@
 <translation id="7347751611463936647">Để sử dụng tiện ích này, nhập "<ph name="EXTENSION_KEYWORD" />", sau đó nhấn TAB rồi câu lệnh hoặc tìm kiếm của bạn.</translation>
 <translation id="7348093485538360975">Bàn phím ảo</translation>
 <translation id="7348749398828259943">Bàn phím quốc tế Workman Hoa Kỳ</translation>
+<translation id="7352495173098919663">Chỉnh sửa</translation>
 <translation id="7352651011704765696">Đã xảy ra lỗi</translation>
 <translation id="7353651168734309780"><ph name="EXTENSION_NAME" /> yêu cầu giấy phép mới</translation>
 <translation id="7361039089383199231">$1 byte</translation>
@@ -4645,6 +4754,7 @@
 <translation id="749028671485790643">Cá nhân <ph name="VALUE" /></translation>
 <translation id="7491962110804786152">tab</translation>
 <translation id="7493386493263658176">Tiện ích <ph name="EXTENSION_NAME" /> có thể thu thập tất cả nội dung bạn nhập, bao gồm dữ liệu cá nhân như mật khẩu và số thẻ tín dụng. Bạn có muốn sử dụng tiện ích này không?</translation>
+<translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="7495424355577885780">Nếu được bật, việc báo cáo sự cố sẽ tải giao diện người dùng phản hồi của thiết kế Material Design.</translation>
 <translation id="7495778526395737099">Quên mật khẩu cũ của bạn?</translation>
 <translation id="7503191893372251637">Loại Chứng chỉ Netscape</translation>
@@ -4716,7 +4826,6 @@
 <translation id="7587108133605326224">Baltic</translation>
 <translation id="7589461650300748890">Oa. Hãy cẩn thận.</translation>
 <translation id="7589661784326793847">Xin đợi một chút</translation>
-<translation id="7593635197364225277">Tự động sao lưu và khôi phục dữ liệu ứng dụng Play vào Google Drive. Bạn có thể thay đổi điều này bất cứ lúc nào trong Cài đặt Android. <ph name="BEGIN_LINK1" />Tìm hiểu thêm<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (mã lỗi <ph name="ERROR_CODE" />).</translation>
 <translation id="7596831438341298034">Ok, nhập</translation>
 <translation id="7600965453749440009">Không bao giờ dịch <ph name="LANGUAGE" /></translation>
@@ -4762,6 +4871,7 @@
 <translation id="7654941827281939388">Tài khoản này đã đang được sử dụng trên máy tính này.</translation>
 <translation id="7658239707568436148">Hủy</translation>
 <translation id="7659584679870740384">Bạn không được phép sử dụng thiết bị này. Vui lòng liên hệ với quản trị viên để có quyền đăng nhập.</translation>
+<translation id="7661259717474717992">Cho phép trang web lưu và đọc dữ liệu cookie</translation>
 <translation id="7663719505383602579">Bộ thu: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7664620655576155379">Thiết bị Bluetooth không được hỗ trợ: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="7665369617277396874">Thêm tài khoản</translation>
@@ -4791,6 +4901,7 @@
 <translation id="7709152031285164251">Không thành công - <ph name="INTERRUPT_REASON" /></translation>
 <translation id="7709980197120276510">Bằng cách nhấp vào Tiếp tục, bạn đồng ý với <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" />, <ph name="LEGAL_DOC_LINK_TEXT_4" /> và <ph name="LEGAL_DOC_LINK_TEXT_5" />.</translation>
 <translation id="7712140766624186755">Yêu cầu bởi chính sách</translation>
+<translation id="7712196439824268605">Mã PIN này rất dễ đoán:</translation>
 <translation id="7713320380037170544">Cho phép mọi trang web sử dụng thông báo dành riêng cho hệ thống truy cập thiết bị MIDI</translation>
 <translation id="7714464543167945231">Chứng chỉ</translation>
 <translation id="7716020873543636594">Tự động nhấp chuột khi con trỏ dừng lại</translation>
@@ -4798,6 +4909,8 @@
 <translation id="7716781361494605745">URL chính sách của tổ chức phát hành chứng chỉ Netscape</translation>
 <translation id="7716970641886237992">Được sửa đổi bởi</translation>
 <translation id="7717014941119698257">Đang tải xuống: <ph name="STATUS" /></translation>
+<translation id="7717845620320228976">Kiểm tra các bản cập nhật</translation>
+<translation id="7719367874908701697">Thu phóng trang</translation>
 <translation id="7719421816612904796">Huấn luyện đã hết thời gian chờ</translation>
 <translation id="771953673318695590">QA</translation>
 <translation id="7720375555307821262">Để giám sát người này, hãy <ph name="BEGIN_LINK" />đăng nhập vào Chrome<ph name="END_LINK" />.</translation>
@@ -4810,6 +4923,7 @@
 <translation id="7742762435724633909">Tên nhà cung cấp:</translation>
 <translation id="774465434535803574">Lỗi đóng gói tiện ích</translation>
 <translation id="7748528009589593815">Tab trước</translation>
+<translation id="7748734060566306235">Sử dụng các phím mũi tên để điều chỉnh kích thước hình ảnh và căn chỉnh.</translation>
 <translation id="7751260505918304024">Hiển thị tất cả</translation>
 <translation id="7754704193130578113">Hỏi vị trí lưu từng tệp trước khi tải xuống</translation>
 <translation id="775622227562445982">Đóng tab/cửa sổ nhanh</translation>
@@ -4846,6 +4960,7 @@
 <translation id="7791543448312431591">Thêm</translation>
 <translation id="7792012425874949788">Đã xảy ra lỗi khi đăng nhập</translation>
 <translation id="7792388396321542707">Dừng chia sẻ</translation>
+<translation id="7792744925237334808">Ngăn các trang web của bên thứ ba lưu và đọc dữ liệu cookie.</translation>
 <translation id="7794058097940213561">Định dạng thiết bị</translation>
 <translation id="7799329977874311193">Tài liệu HTML</translation>
 <translation id="7800518121066352902">Xoay &amp;ngược chiều kim đồng hồ</translation>
@@ -4927,6 +5042,7 @@
 <translation id="7902482560616980555">Chia tỷ lệ FontCache</translation>
 <translation id="7903128267494448252">Xóa người này</translation>
 <translation id="7903345046358933331">Trang không hồi đáp. Bạn có thể chờ trang hồi đáp hoặc đóng trang.</translation>
+<translation id="7903742244674067440">Bạn có các chứng chỉ trên tệp có thể nhận dạng các tổ chức cấp chứng chỉ này</translation>
 <translation id="7903925330883316394">Tiện ích: <ph name="UTILITY_TYPE" /></translation>
 <translation id="7903984238293908205">Katakana</translation>
 <translation id="7904094684485781019">Quản trị viên của tài khoản này đã không cho phép đăng nhập nhiều tài khoản.</translation>
@@ -4974,6 +5090,7 @@
 <translation id="7973320858902175766">Trình vá thành phần</translation>
 <translation id="7974067550340408553">Nhận thông báo trên điện thoại của bạn mỗi lần Smart Lock mở khóa <ph name="DEVICE_TYPE" />.</translation>
 <translation id="7974566588408714340">Thử lại bằng <ph name="EXTENSIONNAME" /></translation>
+<translation id="7974936243149753750">Quét thừa</translation>
 <translation id="7977551819349545646">Đang cập nhật Chromebox...</translation>
 <translation id="7978412674231730200">Khoá cá nhân</translation>
 <translation id="7979036127916589816">Lỗi Đồng bộ hóa</translation>
@@ -5040,9 +5157,11 @@
 <translation id="8054563304616131773">Vui lòng nhập địa chỉ email hợp lệ</translation>
 <translation id="8054921503121346576">Đã kết nối bàn phím USB</translation>
 <translation id="8056430285089645882">Đã nhận, không hiển thị lại nội dung này.</translation>
+<translation id="8058655154417507695">Năm hết hạn</translation>
 <translation id="8059178146866384858">Tệp có tên là "$1" đã tồn tại. Vui lòng chọn tên khác.</translation>
 <translation id="8059417245945632445">&amp;Kiểm tra thiết bị</translation>
 <translation id="8061298200659260393">Không cho phép bất kỳ trang web nào gửi thông báo đẩy</translation>
+<translation id="8061820249063924643">Quản lý người dùng được giám sát</translation>
 <translation id="8063235345342641131">Hình đại diện màu xanh lục mặc định</translation>
 <translation id="8064671687106936412">Khoá:</translation>
 <translation id="806705617346045388">Đã phát hiện hành vi bất thường</translation>
@@ -5050,7 +5169,9 @@
 <translation id="8069615408251337349">Google Cloud Print</translation>
 <translation id="8071942001314758122">Chỉ cần nói "Ok Google" ba lần</translation>
 <translation id="8072988827236813198">Ghim các tab</translation>
+<translation id="8074127646604999664">Cho phép các trang web đóng gần đây hoàn tất gửi và nhận dữ liệu</translation>
 <translation id="8079530767338315840">Lặp lại</translation>
+<translation id="8081705606384362428">Chọn mã PIN của bạn:</translation>
 <translation id="8083739373364455075">Nhận 100 GB miễn phí với Google Drive</translation>
 <translation id="8088137642766812908">Hãy cẩn thận, tính năng này có thể gây sự cố</translation>
 <translation id="8089520772729574115">dưới 1 MB</translation>
@@ -5202,6 +5323,7 @@
 <translation id="827097179112817503">Hiển thị nút trang chủ</translation>
 <translation id="8272443605911821513">Quản lý tiện ích của bạn bằng cách nhấp vào Tiện ích trong menu "Công cụ khác".</translation>
 <translation id="8275038454117074363">Nhập</translation>
+<translation id="827606011343515871">Bạn không có chứng chỉ</translation>
 <translation id="8276560076771292512">Làm trống bộ nhớ cache và tải lại cứng</translation>
 <translation id="8279388322240498158">Bàn phím tiếng Kurd Sorani dựa trên tiếng Anh</translation>
 <translation id="8280151743281770066">Phiên âm tiếng Armenia</translation>
@@ -5222,7 +5344,6 @@
 <translation id="8300607741108698921">Thiết lập chỉ trong 1 phút</translation>
 <translation id="8303650969500425356">Cho phép Javascript khóa đổi hướng màn hình.</translation>
 <translation id="8303655282093186569">Cài đặt phương thức nhập Pinyin</translation>
-<translation id="830424806940379275">Cho phép tiện ích tạo cửa sổ bảng điều khiển mở bên ngoài khung trình duyệt. Theo mặc định hoặc nếu bị tắt, thao tác mở bảng điều khiển sẽ mở một cửa sổ bật lên. Bảng điều khiển trên hệ điều hành máy tính để bàn không được dùng nữa và sẽ sớm bị xóa.</translation>
 <translation id="8306534594034939679">Bật hỗ trợ cho Dịch vụ thay thế, một tính năng HTTP thử nghiệm.</translation>
 <translation id="8307376264102990850">Đang tính thời gian đến khi sạc đầy</translation>
 <translation id="8308179586020895837">Hỏi nếu <ph name="HOST" /> muốn truy cập máy ảnh của bạn</translation>
@@ -5246,9 +5367,11 @@
 <translation id="8337399713761067085">Bạn hiện đang ngoại tuyến</translation>
 <translation id="8338952601723052325">Trang web dành cho nhà phát triển</translation>
 <translation id="8339012082103782726">Không cho phép trang web truy cập vào micrô của bạn</translation>
+<translation id="8339059274628563283"><ph name="SITE" /> đã lưu trữ dữ liệu cục bộ</translation>
 <translation id="8342318071240498787">Tệp hoặc thư mục có cùng tên đã tồn tại.</translation>
 <translation id="834457929814110454">Nếu bạn hiểu các rủi ro về bảo mật, bạn có thể <ph name="BEGIN_LINK" />truy cập trang này<ph name="END_LINK" /> trước khi các chương trình độc hại bị xóa.</translation>
 <translation id="8345553596530559351">Nếu được bật, URL chrome://history/ sẽ tải trang lịch sử thiết kế Material Design.</translation>
+<translation id="8347045947573765315">Cho phép tất cả các trang web sử dụng tính năng tạo khóa trong biểu mẫu</translation>
 <translation id="8351419472474436977">Tiện ích này đã chiếm quyền kiểm soát cài đặt proxy của bạn, điều đó có nghĩa là tiện ích này có thể thay đổi, làm gián đoạn hoặc nghe trộm bất kỳ điều gì bạn thực hiện trực tuyến. Nếu bạn không chắc chắn về lý do thay đổi này diễn ra, bạn có thể không cần tiện ích này.</translation>
 <translation id="8352772353338965963">Thêm một tài khoản để đăng nhập nhiều lần. Tất cả các tài khoản đã đăng nhập đều có thể truy cập được mà không cần mật khẩu, do đó bạn chỉ nên sử dụng tính năng này với các tài khoản đáng tin cậy.</translation>
 <translation id="8353683614194668312">Tiện ích/ứng dụng có thể:</translation>
@@ -5333,15 +5456,20 @@
 <translation id="845627346958584683">Thời gian hết hạn</translation>
 <translation id="8456681095658380701">Tên không hợp lệ</translation>
 <translation id="8457625695411745683">tốt</translation>
+<translation id="8460336040822756677">Nếu tắt Smart Lock cho <ph name="DEVICE_TYPE" />, bạn sẽ không thể mở khóa thiết bị Chrome bằng điện thoại của mình. Bạn cần phải nhập mật khẩu của mình.</translation>
+<translation id="84613761564611563">Yêu cầu giao diện người dùng định cấu hình mạng, vui lòng chờ...</translation>
 <translation id="8461914792118322307">Proxy</translation>
 <translation id="8463215747450521436">Người dùng được giám sát này có thể đã bị nhà quản lý xóa hoặc vô hiệu hóa. Vui lòng liên hệ với nhà quản lý nếu bạn muốn tiếp tục đăng nhập với tư cách người dùng này.</translation>
 <translation id="8464132254133862871">Tài khoản người dùng này không đủ điều kiện cho dịch vụ.</translation>
 <translation id="8464505512337106916">Phát hiện và chạy nội dung plugin quan trọng (đề xuất)</translation>
+<translation id="8465252176946159372">Không hợp lệ</translation>
 <translation id="8466234950814670489">Lưu trữ tar</translation>
 <translation id="8467473010914675605">Phương pháp nhập tiếng Hàn</translation>
+<translation id="8468750959626135884">Mở khóa <ph name="DEVICE_TYPE" /> của bạn bằng điện thoại Android.</translation>
 <translation id="8472623782143987204">được hỗ trợ bằng phần cứng</translation>
 <translation id="8475313423285172237">Một chương trình khác trên máy tính của bạn đã thêm một tiện ích có thể thay đổi cách Chrome hoạt động.</translation>
 <translation id="8475647382427415476">Google Drive không thể đồng bộ hóa "<ph name="FILENAME" />" ngay bây giờ. Google Drive sẽ thử lại sau.</translation>
+<translation id="8476195663057048998">Xóa và đặt lại</translation>
 <translation id="8477241577829954800">Đã thay thế</translation>
 <translation id="8477384620836102176">&amp;Chung</translation>
 <translation id="8480417584335382321">Thu phóng trang:</translation>
@@ -5373,6 +5501,7 @@
 <translation id="8524066305376229396">Bộ nhớ liên tục:</translation>
 <translation id="8525306231823319788">Toàn màn hình</translation>
 <translation id="8528962588711550376">Đang đăng nhập.</translation>
+<translation id="8532294913309524834">Sắp xếp ngôn ngữ dựa trên tùy chọn của bạn.</translation>
 <translation id="8535005006684281994">URL Gia hạn Chứng chỉ của Netscape</translation>
 <translation id="8539727552378197395">Không (HttpOnly)</translation>
 <translation id="8543181531796978784">Bạn có thể <ph name="BEGIN_ERROR_LINK" />báo cáo sự cố đã phát hiện<ph name="END_ERROR_LINK" /> hoặc nếu bạn hiểu rủi ro với bảo mật của mình, hãy <ph name="BEGIN_LINK" />truy cập trang web không an toàn này<ph name="END_LINK" />.</translation>
@@ -5387,6 +5516,7 @@
 <translation id="855081842937141170">Ghim tab</translation>
 <translation id="8551388862522347954">Giấy phép</translation>
 <translation id="8551494947769799688">Tiếng Lát-vi-a</translation>
+<translation id="8553342806078037065">Quản lý những người khác</translation>
 <translation id="855705891482654011">Tải tiện ích đã giải nén</translation>
 <translation id="855773602626431402">Plugin không có hộp cát bị ngăn không cho chạy trên trang này.</translation>
 <translation id="8559694214572302298">Trình giải mã hình ảnh</translation>
@@ -5464,6 +5594,7 @@
 <translation id="8662978096466608964">Chrome không thể đặt hình nền.</translation>
 <translation id="8663099077749055505">Luôn chặn nhiều bản tải xuống tự động trên <ph name="HOST" /></translation>
 <translation id="8664389313780386848">X&amp;em nguồn trang</translation>
+<translation id="866611985033792019">Tin tưởng chứng chỉ này khi nhận dạng người dùng email</translation>
 <translation id="8666678546361132282">Tiếng Anh</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> hiện ở chế độ toàn màn hình và đã tắt con trỏ chuột của bạn.</translation>
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" /> của bạn đã cập nhật.</translation>
@@ -5587,6 +5718,7 @@
 <translation id="8813811964357448561">trang giấy</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="881799181680267069">Ẩn Cửa sổ khác</translation>
+<translation id="8818152010000655963">Hình nền</translation>
 <translation id="8818152613617627612">Chi tiết thanh toán</translation>
 <translation id="8820817407110198400">Dấu trang</translation>
 <translation id="8820961991571528294">Kiểm tra</translation>
@@ -5597,8 +5729,10 @@
 <translation id="8828933418460119530">Tên DNS</translation>
 <translation id="8830796635868321089">Kiểm tra cập nhật không thành công khi sử dụng cài đặt proxy hiện tại. Vui lòng điều chỉnh <ph name="PROXY_SETTINGS_LINK_START" />cài đặt proxy<ph name="PROXY_SETTINGS_LINK_END" /> của bạn.</translation>
 <translation id="8831623914872394308">Cài đặt con trỏ</translation>
+<translation id="8833040047958643283">Kiểm soát nội dung trang web có thể hiển thị cho bạn và thông tin trang web có thể sử dụng khi bạn duyệt web</translation>
 <translation id="8837103518490433332">Bạn có muốn <ph name="PASSWORD_MANAGER_BRAND" /> lưu mật khẩu của bạn cho <ph name="ORIGIN" /> không?</translation>
 <translation id="8838770651474809439">Bánh hamburger</translation>
+<translation id="8839157109304700852">Mở Trang tổng quan Google</translation>
 <translation id="8841142799574815336">Chế độ xem hình ảnh tĩnh.</translation>
 <translation id="884264119367021077">Ðịa chỉ giao hàng</translation>
 <translation id="8845001906332463065">Nhận trợ giúp</translation>
@@ -5609,11 +5743,13 @@
 <translation id="885381502874625531">Bàn phím chữ Belarus</translation>
 <translation id="8856844195561710094">Không thể ngừng khám phá thiết bị Bluetooth.</translation>
 <translation id="885701979325669005">Dung lượng</translation>
+<translation id="8858798938034909167">Truy cập mật khẩu của bạn từ mọi thiết bị tại <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="8859057652521303089">Chọn ngôn ngữ:</translation>
 <translation id="8859116917079399781">Nội dung bị chặn</translation>
 <translation id="8859174528519900719">Khung phụ: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="8860454412039442620">Bảng tính Excel</translation>
 <translation id="8863489667196658337">Bật hệ thống mới để tạo ứng dụng dấu trang.</translation>
+<translation id="8866013684546696613">Số lượng cửa sổ tối đa ở chế độ tổng quan có thể sử dụng hình dạng.</translation>
 <translation id="8866441758832353668">Liên kết cuộn</translation>
 <translation id="8868245144144497543">Được tạo bởi</translation>
 <translation id="8868626022555786497">Được dùng</translation>
@@ -5671,6 +5807,7 @@
 <translation id="894360074127026135">Netscape International Step-Up</translation>
 <translation id="8944779739948852228">Đã phát hiện thấy máy in</translation>
 <translation id="8944964446326379280"><ph name="APP_NAME" /> đang chia sẻ một cửa sổ với <ph name="TAB_NAME" />.</translation>
+<translation id="8946284507644756416">Có thể mở khóa <ph name="DEVICE_TYPE" /> của bạn bằng điện thoại Android.</translation>
 <translation id="8946359700442089734">Tính năng gỡ lỗi không được bật hoàn toàn trên thiết bị <ph name="IDS_SHORT_PRODUCT_NAME" /> này.</translation>
 <translation id="8946784827990177241">Bật hỗ trợ WebUSB.</translation>
 <translation id="89515141420106838">Bật ứng dụng Thư viện của Cửa hàng Chrome trực tuyến cho trình điều khiển máy in. Ứng dụng này sẽ tìm kiếm các tiện ích hỗ trợ in tới máy in USB với ID USB riêng trong Cửa hàng Chrome trực tuyến.</translation>
@@ -5748,6 +5885,7 @@
 <translation id="9040185888511745258">Những kẻ tấn công trên trang <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> có thể đánh lừa bạn cài đặt các chương trình ảnh hưởng đến trải nghiệm duyệt web của bạn (ví dụ: bằng cách thay đổi trang chủ của bạn hoặc hiển thị thêm quảng cáo trên các trang bạn truy cập).</translation>
 <translation id="9040421302519041149">Quyền truy cập vào mạng này được bảo vệ.</translation>
 <translation id="9041603713188951722">Hiển thị cài đặt trong một cửa sổ</translation>
+<translation id="9042893549633094279">Quyền riêng tư và bảo mật</translation>
 <translation id="904451693890288097">Vui lòng nhập mã cho "<ph name="DEVICE_NAME" />":</translation>
 <translation id="9049835026521739061">Chế độ Hangul</translation>
 <translation id="9050666287014529139">Cụm mật khẩu</translation>
@@ -5758,6 +5896,7 @@
 <translation id="9056810968620647706">Không tìm thấy kết quả phù hợp nào.</translation>
 <translation id="9059868303873565140">Menu trạng thái</translation>
 <translation id="9064142312330104323">Ảnh hồ sơ trên Google (đang tải)</translation>
+<translation id="9064275926664971810">Bật Tự động điền để điền các biểu mẫu chỉ bằng một lần nhấp</translation>
 <translation id="9064939804718829769">Đang chuyển...</translation>
 <translation id="9065203028668620118">Chỉnh sửa</translation>
 <translation id="9066075624350113914">Không thể hiển thị các phần của tài liệu PDF này.</translation>
@@ -5779,6 +5918,8 @@
 <translation id="9088917181875854783">Vui lòng xác nhận mã xác nhận này được hiển thị trên "<ph name="DEVICE_NAME" />":</translation>
 <translation id="9092426026094675787">Đánh dấu các nguồn gốc không an toàn là không an toàn</translation>
 <translation id="9094033019050270033">Cập nhật mật khẩu</translation>
+<translation id="9094982973264386462">Xóa</translation>
+<translation id="9095253524804455615">Xóa</translation>
 <translation id="9100765901046053179">Cài đặt nâng cao</translation>
 <translation id="910077499156148110">Thêm ngoại lệ cho trang web</translation>
 <translation id="9100825730060086615">Loại bàn phím</translation>
@@ -5870,8 +6011,11 @@
 <translation id="9218430445555521422">Đặt làm mặc định</translation>
 <translation id="9219103736887031265">Hình ảnh</translation>
 <translation id="9220525904950070496">Xóa tài khoản</translation>
+<translation id="9221503095691269353">Định cấu hình mở khóa nhanh</translation>
 <translation id="923467487918828349">Hiển thị Tất cả</translation>
+<translation id="927151012416335806">Đang cập nhật thiết bị tới kênh <ph name="CHANNEL_NAME" /></translation>
 <translation id="930268624053534560">Dấu thời gian chi tiết</translation>
+<translation id="931068751149008062">Chọn mã hóa và kiểu phông chữ</translation>
 <translation id="932327136139879170">Trang chủ</translation>
 <translation id="932508678520956232">Không thể chạy in.</translation>
 <translation id="936801553271523408">Dữ liệu chẩn đoán hệ thống</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 6a873ef..903b710 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -1926,6 +1926,7 @@
 <translation id="3590559774363307859">密码已保存。您可以通过任意浏览器获取此密码以及您所有的<ph name="SAVED_PASSWORDS_LINK" />。</translation>
 <translation id="3590587280253938212">快速</translation>
 <translation id="3592260987370335752">了解详情(&amp;L)</translation>
+<translation id="3592313833691251126">允许扩展程序创建在浏览器框架之外打开的面板窗口。如果未启用,尝试打开面板时,系统将改为打开一个弹出式窗口。默认情况下,只有加入白名单的扩展程序可执行这项操作。启用后,所有扩展程序皆可执行这项操作;停用后,系统将禁止任何扩展程序打开面板。</translation>
 <translation id="359283478042092570">输入</translation>
 <translation id="3593152357631900254">启用模糊拼音模式</translation>
 <translation id="3593965109698325041">证书名称约束</translation>
@@ -2247,7 +2248,6 @@
 <translation id="4034042927394659004">降低键盘亮度</translation>
 <translation id="4035758313003622889">任务管理器(&amp;T)</translation>
 <translation id="4037084878352560732">马</translation>
-<translation id="4037102579141982963">该设备会自动向 Google 发送诊断信息和使用情况数据。您随时可在设备的<ph name="BEGIN_LINK1" />设置<ph name="END_LINK1" />部分中更改这项设置。<ph name="BEGIN_LINK2" />了解详情<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">启用 Android 的无障碍标签页切换器。</translation>
 <translation id="4044260751144303020">为固定位置的元素合成。</translation>
 <translation id="404493185430269859">默认搜索引擎</translation>
@@ -3209,7 +3209,6 @@
 <translation id="5439568486246921931">此操作将永久删除此用户的下载内容、离线文件和浏览数据。此操作无法撤消。</translation>
 <translation id="544083962418256601">创建快捷方式...</translation>
 <translation id="5441100684135434593">有线网络</translation>
-<translation id="5445088910157062298">利用 Google 的位置信息服务帮助应用快速而准确地找到您的位置,这样可以减少电池消耗。系统会将位置数据匿名发送给 Google(即使设备未运行任何应用)。</translation>
 <translation id="5448293924669608770">糟糕,登录时出了点问题</translation>
 <translation id="5449588825071916739">为所有标签页添加书签</translation>
 <translation id="5449716055534515760">关闭窗口(&amp;D)</translation>
@@ -3675,7 +3674,6 @@
 <translation id="6110466548232134880">位于<ph name="LOCALITY" />的<ph name="ORGANIZATION" />的身份已通过了<ph name="ISSUER" />的验证。服务器未提供任何 Certificate Transparency 信息。</translation>
 <translation id="6111770213269631447">音译(namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">默认允许</translation>
-<translation id="6112929985131461002">该设备会自动向 Google 发送诊断信息和使用情况数据。这项<ph name="BEGIN_LINK1" />设置<ph name="END_LINK1" />由您的管理员强制执行。<ph name="BEGIN_LINK2" />了解详情<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">更改语言和输入设置</translation>
 <translation id="6120205520491252677">将此网页固定到“开始”屏幕...</translation>
 <translation id="6122081475643980456">您的互联网连接受到控制</translation>
@@ -3910,7 +3908,6 @@
 <translation id="6452181791372256707">拒绝</translation>
 <translation id="6454421252317455908">中文输入法(快速)</translation>
 <translation id="6455348477571378046">证书类型:</translation>
-<translation id="6456234919706689841">您的管理员可能会选择向 Google 发送该设备的诊断信息和使用情况数据。您可在此处查看这项<ph name="BEGIN_LINK1" />设置<ph name="END_LINK1" />。<ph name="BEGIN_LINK2" />了解详情<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">继续拦截 JavaScript</translation>
 <translation id="6458308652667395253">管理 JavaScript 拦截…</translation>
 <translation id="6459488832681039634">使用所选内容查找</translation>
@@ -4680,7 +4677,6 @@
 <translation id="7587108133605326224">波罗的海周边语言</translation>
 <translation id="7589461650300748890">注意!</translation>
 <translation id="7589661784326793847">请稍候</translation>
-<translation id="7593635197364225277">自动将 Play 应用数据备份到 Google 云端硬盘以及从中恢复相应数据。您随时可以在 Android 设置中更改这项设置。<ph name="BEGIN_LINK1" />了解详情<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" />(错误代码为:<ph name="ERROR_CODE" />)。</translation>
 <translation id="7596831438341298034">确认导入</translation>
 <translation id="7600965453749440009">一律不翻译<ph name="LANGUAGE" /></translation>
@@ -5186,7 +5182,6 @@
 <translation id="8300607741108698921">1分钟即可完成设置</translation>
 <translation id="8303650969500425356">允许 JavaScript 锁定屏幕方向。</translation>
 <translation id="8303655282093186569">拼音输入设置</translation>
-<translation id="830424806940379275">允许扩展程序创建在浏览器框架之外打开的面板窗口。默认情况下或此项处于停用状态时,如果用户尝试打开面板,系统将改为打开弹出式窗口。在桌面版操作系统上,面板已被弃用,并且很快将会被移除。</translation>
 <translation id="8306534594034939679">启用对替代服务(实验性 HTTP 功能)的支持。</translation>
 <translation id="8307376264102990850">正在计算充满电所需剩余时间</translation>
 <translation id="8308179586020895837">当 <ph name="HOST" /> 想要使用摄像头时询问我</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 74d63e4..e377ec0b 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1932,6 +1932,7 @@
 <translation id="3590559774363307859">密碼已儲存。您可以透過任何瀏覽器存取該密碼和您的所有 <ph name="SAVED_PASSWORDS_LINK" />。</translation>
 <translation id="3590587280253938212">快</translation>
 <translation id="3592260987370335752">瞭解詳情(&amp;L)</translation>
+<translation id="3592313833691251126">允許擴充功能建立在瀏覽器頁框外開啟的面板視窗。如果未啟用,嘗試開啟面板時,會以彈出式視窗取代。在預設狀態下,只有許可清單中的擴充功能可執行這項操作。啟用後,所有擴充功能皆可執行這項操作;停用後,系統將禁止任何擴充功能開啟面板。</translation>
 <translation id="359283478042092570">輸入</translation>
 <translation id="3593152357631900254">啟用模糊拼音模式</translation>
 <translation id="3593965109698325041">憑證名稱限制</translation>
@@ -2253,7 +2254,6 @@
 <translation id="4034042927394659004">降低按鍵亮度</translation>
 <translation id="4035758313003622889">工作管理員(&amp;T)</translation>
 <translation id="4037084878352560732">馬</translation>
-<translation id="4037102579141982963">這個裝置會自動將診斷資料和使用資料傳送給 Google。您隨時可以在裝置<ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />中變更這項設定。<ph name="BEGIN_LINK2" />瞭解詳情<ph name="END_LINK2" /></translation>
 <translation id="4037463823853863991">啟用 Android 的協助工具分頁切換選項。</translation>
 <translation id="4044260751144303020">結合固定位置元素。</translation>
 <translation id="404493185430269859">預設搜尋引擎</translation>
@@ -3222,7 +3222,6 @@
 <translation id="5439568486246921931">這個動作會永久刪除這位使用者的下載內容、離線檔案和瀏覽資料,且無法復原。</translation>
 <translation id="544083962418256601">建立捷徑...</translation>
 <translation id="5441100684135434593">有線網路</translation>
-<translation id="5445088910157062298">讓 Google 的定位服務協助應用程式快速找到您的準確位置,減少耗電量。系統會傳送匿名位置資料給 Google (即使未執行任何應用程式)。</translation>
 <translation id="5448293924669608770">糟糕,登入帳戶時發生錯誤</translation>
 <translation id="5449588825071916739">將所有分頁加入書籤</translation>
 <translation id="5449716055534515760">關閉視窗(&amp;D)</translation>
@@ -3688,7 +3687,6 @@
 <translation id="6110466548232134880"><ph name="ORGANIZATION" /> (所在地:<ph name="LOCALITY" />) 的身分已通過 <ph name="ISSUER" /> 驗證,但伺服器未提供 Certificate Transparency 資訊。</translation>
 <translation id="6111770213269631447">音譯 (namaskar → নমস্কার)</translation>
 <translation id="6111974609785983504">預設允許</translation>
-<translation id="6112929985131461002">這個裝置會自動將診斷資料和使用資料傳送給 Google。您的管理員強制啟用了這項<ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />。<ph name="BEGIN_LINK2" />瞭解詳情<ph name="END_LINK2" /></translation>
 <translation id="6116921718742659598">變更語言和輸入設定</translation>
 <translation id="6120205520491252677">將這個網頁固定到開始畫面...</translation>
 <translation id="6122081475643980456">您的網際網路連線目前受到控制</translation>
@@ -3923,7 +3921,6 @@
 <translation id="6452181791372256707">拒絕</translation>
 <translation id="6454421252317455908">中文輸入法 (快速)</translation>
 <translation id="6455348477571378046">憑證類型:</translation>
-<translation id="6456234919706689841">您的管理員可能會選擇將這個裝置的診斷資料和使用資料傳送給 Google。您可以在這裡查看這項<ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />。<ph name="BEGIN_LINK2" />瞭解詳情<ph name="END_LINK2" /></translation>
 <translation id="645705751491738698">繼續封鎖 JavaScript</translation>
 <translation id="6458308652667395253">管理封鎖 JavaScript 設定...</translation>
 <translation id="6459488832681039634">使用所選範圍尋找</translation>
@@ -4699,7 +4696,6 @@
 <translation id="7587108133605326224">波羅的海語系</translation>
 <translation id="7589461650300748890">哎唷,請注意!</translation>
 <translation id="7589661784326793847">請稍候片刻</translation>
-<translation id="7593635197364225277">自動使用 Google 雲端硬碟備份及還原 Play 應用程式資料。您隨時可以在「Android 設定」中變更這項設定。<ph name="BEGIN_LINK1" />瞭解詳情<ph name="END_LINK1" /></translation>
 <translation id="7595547011743502844"><ph name="ERROR" /> (錯誤代碼 <ph name="ERROR_CODE" />)。</translation>
 <translation id="7596831438341298034">是的,匯入</translation>
 <translation id="7600965453749440009">一律不翻譯<ph name="LANGUAGE" /></translation>
@@ -5205,7 +5201,6 @@
 <translation id="8300607741108698921">1 分鐘完成設定</translation>
 <translation id="8303650969500425356">允許使用 JavaScript 鎖定螢幕方向。</translation>
 <translation id="8303655282093186569">拼音輸入法設定</translation>
-<translation id="830424806940379275">允許擴充功能建立在瀏覽器頁框以外的區域開啟的面板視窗。在預設或停用狀態下,開啟面板時則會彈出其他視窗。在電腦作業系統上,面板已淘汰,將於近期內遭到移除。</translation>
 <translation id="8306534594034939679">啟用替代服務支援功能,這個服務是實驗性的 HTTP 功能。</translation>
 <translation id="8307376264102990850">充電中:正在計算所需時間</translation>
 <translation id="8308179586020895837">當 <ph name="HOST" /> 要求存取攝影機時詢問我。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb
index 310b307..46fda5b 100644
--- a/chrome/app/resources/google_chrome_strings_am.xtb
+++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -25,6 +25,7 @@
 <translation id="1553358976309200471">Chromeን አዘምን</translation>
 <translation id="1587223624401073077">Google Chrome ካሜራዎን እየተጠቀመ ነው።</translation>
 <translation id="1619887657840448962">Chromeን ይበልጥ ደህንነቱ የተጠበቀ እንዲሆን ለማድረግ፣ በ<ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> ውስጥ ያልተዘረዘረውን የሚከተለውን ቅጥያ አሰናክለነዋል እና እርስዎ ሳያውቁት የታከለ ሊሆን ይችላል።</translation>
+<translation id="1628000112320670027">Chrome ላይ እገዛ ያግኙ</translation>
 <translation id="163860049029591106">በChrome ስርዓተ ክወና ይጀምሩ</translation>
 <translation id="1653828314016431939">እሺ - አሁን ዳግም አስጀምር</translation>
 <translation id="1682634494516646069">Google Chrome የውሂብ አቃፊውን ማንበብ እና እሱ ላይ መጻፍ አይችልም፦
@@ -47,6 +48,7 @@
 <translation id="2286950485307333924">አሁን በመለያ ወደ Chrome ገብተዋል</translation>
 <translation id="2290014774651636340">የGoogle ኤ ፒ አይ ቁልፎች ይጎድላሉ። አንዳንድ የGoogle Chrome ተግባራት ይሰናከላሉ።</translation>
 <translation id="2290095356545025170">እርግጠኛ ነዎት Google Chromeን ማራገፍ ይፈልጋሉ?</translation>
+<translation id="2309047409763057870">ይሄ ሁለተኛ የGoogle Chrome ጭነት ነው፣ እና ነባሪ አሳሽዎ ማድረግ አይቻልም።</translation>
 <translation id="2316129865977710310">አይ፣ አመሰግናለሁ</translation>
 <translation id="2334084861041072223">የቅጂ መብት <ph name="YEAR" /> Google Inc.። ሁሉም መብቶች የተጠበቁ ናቸው።</translation>
 <translation id="2346876346033403680">የሆነ ሰው ከዚህ ቀደም በዚህ ኮምፒውተር ላይ እንደ <ph name="ACCOUNT_EMAIL_LAST" /> ሆኖ ወደ Chrome ገብቶ ነበር። ያ መለያዎ ካልሆነ መረጃዎን ለይተው ለማስቀመጥ አዲስ የChromium ተጠቃሚ ይፍጠሩ።
@@ -70,6 +72,7 @@
 <translation id="2847461019998147611">Google Chromeን በዚህ ቋንቋ አሳይ</translation>
 <translation id="2871893339301912279">ወደ Chrome ገብተዋል!</translation>
 <translation id="2888126860611144412">ስለChrome</translation>
+<translation id="2900322993655997287">Google Chrome ነባሪ አሳሹን መወሰን አልቻለም።</translation>
 <translation id="2997147809295888909"><ph name="ISSUER" /> የዚህን የድር ጣቢያ ምስክር ወረቀት እንደሰጠ Chrome አረጋግጧል። አገልጋዩ ማንኛውንም የምስክር ወረቀት ግልፅነት መረጃን አላቀረበም።</translation>
 <translation id="3037838751736561277">Google Chrome በጀርባ ሁኔታ ላይ ነው።</translation>
 <translation id="3047079729301751317"><ph name="USERNAME" />ን ግንኙነት ማቋረጥ ታሪክዎን፣ ቅንበሮችዎን እና ሌሎች በዚህ መሳሪያ ላይ የተቀመጡትን ሌሎች የChrome ውሂብ ያጸዳል። በGoogle መለያዎ ላይ ያለው ውሂብ የማይጸዳ ሲሆን በ<ph name="GOOGLE_DASHBOARD_LINK" />Google Dashboard<ph name="END_GOOGLE_DASHBOARD_LINK" /> ላይ መተዳደር ይችላል።</translation>
@@ -86,6 +89,7 @@
 <translation id="3282568296779691940">Chrome ውስጥ ይግቡ</translation>
 <translation id="3311976847535831054">ይህ ኮምፒውተር ከአሁን በኋላ 32-ቢት የGoogle Chrome ዝማኔዎችን አይቀበልም። እባክዎን ወደ 64-ቢት Google Chrome ያሻሽሉ።</translation>
 <translation id="3360895254066713204">Chrome አጋዥ</translation>
+<translation id="3395323229510056640">Chrome OS ላይ እገዛ ያግኙ</translation>
 <translation id="3396977131400919238">በመጫን ጊዜ የሥርዓተ ክወና ስህተት ተፈጥሯል። እባክዎ Google Chromeን እንደገና ያውርዱ።</translation>
 <translation id="3398288718845740432">በChrome ምናሌ ውስጥ ደብቅ</translation>
 <translation id="3451115285585441894">ወድ Chrome በማከል ላይ...</translation>
@@ -141,7 +145,9 @@
 <translation id="5170938038195470297">መገለጫዎ የአዲስ Google Chrome ስሪት አካል ስለሆነ መጠቀም አይቻልም።
 
 አንዳንድ ባሕሪያት ላይገኙ ይችላሉ። እባክዎ የተለየ የመገለጫ አቃፊ ይግለጹ ወይም አዲሱን የChrome ስሪት ይጠቀሙ።</translation>
+<translation id="5176234269072261959">የአሁኖቹ ቅንብሮችን ሪፖርት በማድረግ Google Chrome የተሻለ እንዲሆን ያግዙ።</translation>
 <translation id="5204098752394657250">Google Chrome <ph name="TERMS_OF_SERVICE_LINK" />የአገልግሎት ውል<ph name="END_TERMS_OF_SERVICE_LINK" /></translation>
+<translation id="5243785881901838525">Google Payments (ወደ Chrome ተቀድቷል)</translation>
 <translation id="5251420635869119124">እንግዳዎች ምንም ነገር ሳይተዉ Chromeን መጠቀም ይችላሉ።</translation>
 <translation id="5253588388888612165">ይህን ኮምፒውተር ከ<ph name="PROFILE_NAME" /> ጋር የሚጋሩ ከሆኑ ተለይተው ለማሰስ እራስዎን Chrome ላይ ያክሉ። አለበለዚያ የGoogle መለያቸውን ያላቅቁት።</translation>
 <translation id="5284703908158630707">{SECONDS,plural, =1{Google Chrome በ1 ሰከንድ ውስጥ ዳግም ይጀምራል።}one{Google Chrome በ​​# ሰከንዶች ውስጥ ዳግም ይጀምራል።}other{Google Chrome በ​​# ሰከንዶች ውስጥ ዳግም ይጀምራል።}}</translation>
@@ -177,6 +183,7 @@
 <translation id="6235018212288296708">Google Chrome ለmDNS ትራፊክ ለመፍቀድ የውስጥ ደንብ።</translation>
 <translation id="6236285698028833233">Google Chrome ማዘመን አቁሟል፣ እና ከአሁን በኋላ ይህን የስርዓተ ክወናዎን ስሪት አይደግፍም።</translation>
 <translation id="629218512217695915">በChrome የመነቸ የይለፍ ቃል ይጠቀሙ</translation>
+<translation id="6338556085225130112">Google Chromeን በማዘመን ላይ</translation>
 <translation id="6368805772029492593">ለተጨማሪ ደህንነት ሲባል Google Chrome ውሂብዎን ያመሳጥረዋል።</translation>
 <translation id="6368958679917195344">Chrome ስርዓተ ክወና በተጨማሪ <ph name="BEGIN_LINK_CROS_OSS" />ክፍት ምንጭ ሶፍትዌር<ph name="END_LINK_CROS_OSS" /> እውን ሊሆን ችሏል።</translation>
 <translation id="6400076122676892962">Mac OS X 10.6፣ 10.7 እና 10.8 ከአሁን በኋላ ስለማይደገፉ ይህ ኮምፒውተር በቅርቡ የGoogle Chrome ዝማኔዎችን መቀበል ያቆማል።</translation>
@@ -186,6 +193,7 @@
 <translation id="6600954340915313787">ወደ Chrome ተቀድቷል</translation>
 <translation id="6626317981028933585">በሚያሳዝን ሁኔታ፣ የMozilla Firefox ቅንብሮች ዎ የሉም አሳሹ እየሄደ ባለበት ጊዜ። እነዚህን ቅንብሮች  ወደ Google Chrome ለማስመጣት፣ ስራዎን ያስቀምጡና ሁሉንም የFirefox መስኮቶች ይዝጉ። ከዚያም ቀጥልን የጫኑ።</translation>
 <translation id="6634887557811630702">Google Chrome የተዘመነ ነው።</translation>
+<translation id="6648058004052854464">Google Chrome ነባሪው አሳስ ለመሆን አልቻልም።</translation>
 <translation id="6676384891291319759">በይነመረብን ተዳረስ</translation>
 <translation id="6757767188268205357">አታርመኝ</translation>
 <translation id="683440813066116847">Google Chrome Canary ለmDNS ትራፊክ ለመፍቀድ የውስጥ ደንብ።</translation>
@@ -211,6 +219,7 @@
 <translation id="7242029209006116544">በሚተዳደር መለያ እየገቡ ነው፣ እና አስተዳዳሪው በእርስዎ Google Chrome መገለጫ ላይ ቁጥጥር እየሰጡት ነው። እንደየእርስዎ  መተግበሪያዎች፣ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች ያሉ የእርስዎ Chrome ውሂብ እስከ መጨረሻው ከ<ph name="USER_NAME" /> ጋር የተያያዙ ይሆናሉ። ይህን ውሂብ በGoogle የመለያዎች Dashboard አማካኝነት ሊሰርዙት ይችላሉ፣ ነገር ግን ይህን ውሂብ ከሌላ መለያ ጋር ሊያጎዳኙት አይችሉም። ነባሩ የእርስዎ Chrome ውሂብ ለይተው ለማስቀመጥም አዲስ መገለጫ እንደ አማራጭ መፍጠር ይችላሉ። <ph name="LEARN_MORE" /></translation>
 <translation id="729375352412857283">Windows XP እና Windows Vista ከአሁን በኋላ ስለማይደገፉ ይህ ኮምፒውተር በቅርቡ የGoogle Chrome ዝማኔዎችን መቀበል ያቆማል።</translation>
 <translation id="7339898014177206373">አዲሰ መስኮት</translation>
+<translation id="7393806081343982361">Google Chrome ነባሪ አሳሽዎ አይደለም። ወንዳታ!</translation>
 <translation id="7398801000654795464">እንደ <ph name="USER_EMAIL_ADDRESS" /> ሆነው ወደ Chrome ገብተዋል። እባክዎ እንደገና ለመግባት ተመሳሳዩን መለያ ይጠቀሙ።</translation>
 <translation id="7400722733683201933">ስለ Google Chrome</translation>
 <translation id="7408085963519505752">የChrome OS ውል</translation>
@@ -260,6 +269,7 @@
 <translation id="8669527147644353129">Google Chrome አጋዥ</translation>
 <translation id="8679801911857917785">እንዲሁም Chromeን ሲጀምሩት የሚታየውን ገጽ ይቆጣጠራል።</translation>
 <translation id="870251953148363156">&amp;Google Chromeን አዘምን</translation>
+<translation id="8793772303278047003">Chrome ጊዜው አልፎበታል።</translation>
 <translation id="8796108026289707191">አሁን Google Chromeን ዳግም ማስጀመር አለብዎት።</translation>
 <translation id="8823341990149967727">Chrome ጊዜው አልፎበታል</translation>
 <translation id="884296878221830158">እንዲሁም Chromeን ሲጀምሩት ወይም የመነሻ አዝራሩን ጠቅ ሲያደርጉት የሚታየውን ገጽ ይቆጣጠራል።</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb
index bc6f8d1d..e0cad890 100644
--- a/chrome/app/resources/google_chrome_strings_ar.xtb
+++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -23,6 +23,7 @@
 <translation id="1553358976309200471">‏تحديث Chrome‏</translation>
 <translation id="1587223624401073077">‏يستخدم Google Chrome الكاميرا.</translation>
 <translation id="1619887657840448962">‏لجعل Chrome أكثر أمنًا، عطلنا الإضافة التالية التي لم تُدرج في <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> وربما تكون قد أضيفت دون علمك.</translation>
+<translation id="1628000112320670027">‏الحصول على مساعدة في Chrome</translation>
 <translation id="163860049029591106">‏البدء في استخدام نظام التشغيل Chrome</translation>
 <translation id="1653828314016431939">موافق - إعادة التشغيل الآن</translation>
 <translation id="1682634494516646069">‏يتعذر على Google Chrome القراءة والكتابة في دليل البيانات الخاص به:
@@ -45,6 +46,7 @@
 <translation id="2286950485307333924">‏تم تسجيل دخولك الآن إلى Chrome</translation>
 <translation id="2290014774651636340">‏مفاتيح واجهة برمجة تطبيقات Google مفقودة. وسيترتب على ذلك توقف بعض وظائف Google Chrome عن العمل.</translation>
 <translation id="2290095356545025170">‏هل تريد بالتأكيد إزالة Google Chrome؟</translation>
+<translation id="2309047409763057870">‏هذا تثبيت ثانوي من Google Chrome، ولا يمكن جعله متصفحك الافتراضي.</translation>
 <translation id="2316129865977710310">لا، شكرًا</translation>
 <translation id="2334084861041072223">‏حقوق الطبع والنشر لعام <ph name="YEAR" /> لصالح شركة .Google Inc. جميع الحقوق محفوظة.</translation>
 <translation id="2346876346033403680">‏سجّل شخص ما الدخول من قبل إلى Chrome على هذا الكمبيوتر باعتباره <ph name="ACCOUNT_EMAIL_LAST" />. فإذا لم يكن هذا هو حسابك، فأنشئ حساب مستخدم Chrome جديدًا للإبقاء على معلوماتك بشكل منفصل.
@@ -68,6 +70,7 @@
 <translation id="2847461019998147611">‏عرض Google Chrome بهذه اللغة</translation>
 <translation id="2871893339301912279">‏تم تسجيل دخولك إلى Chrome!</translation>
 <translation id="2888126860611144412">‏حول Chrome</translation>
+<translation id="2900322993655997287">‏يتعذر على Google Chrome تحديد المتصفح الافتراضي أو تعيينه.</translation>
 <translation id="2997147809295888909">‏تحقق Chrome من أن <ph name="ISSUER" /> أصدر شهادة موقع الويب هذا. ولم يقدم الخادم أي معلومات لشفافية الشهادة.</translation>
 <translation id="3037838751736561277">‏Google Chrome في وضع الخلفية.</translation>
 <translation id="3047079729301751317">‏سيؤدي قطع اتصال <ph name="USERNAME" /> إلى مسح السجّل والإشارات المرجعية والإعدادات وبيانات Chrome الأخرى المخزنة على هذا الجهاز. لن يتم مسح البيانات المخزنة في حساب Google ويمكن إدارتها على <ph name="GOOGLE_DASHBOARD_LINK" />لوحة تحكم Google<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
@@ -84,6 +87,7 @@
 <translation id="3282568296779691940">‏تسجيل الدخول إلى Chrome</translation>
 <translation id="3311976847535831054">‏لن يتلقى هذا الكمبيوتر تحديثات Google Chrome إصدار 32 بت بعد الآن. الرجاء الترقية إلى Google Chrome إصدار 64 بت.</translation>
 <translation id="3360895254066713204">‏مساعد Chrome</translation>
+<translation id="3395323229510056640">‏الحصول على مساعدة في نظام التشغيل Chrome</translation>
 <translation id="3396977131400919238">‏حدث خطأ في نظام التشغيل أثناء عملية التثبيت. يُرجى تنزيل Google Chrome مرة أخرى.</translation>
 <translation id="3398288718845740432">‏الإخفاء في قائمة Chrome</translation>
 <translation id="3451115285585441894">‏جارٍ الإضافة إلى Chrome...</translation>
@@ -139,7 +143,9 @@
 <translation id="5170938038195470297">‏لا يمكن استخدام ملفك الشخصي نظرًا لأنه من إصدار أحدث من Google Chrome.
 
 قد تكون بعض الميزات غير متاحة. الرجاء تحديد دليل ملف شخصي مختلف أو استخدام إصدار أحدث من Chrome.</translation>
+<translation id="5176234269072261959">‏ساعد في تحسين Chrome من خلال الإبلاغ عن الإعدادات الحالية.</translation>
 <translation id="5204098752394657250">‏<ph name="TERMS_OF_SERVICE_LINK" />بنود خدمة<ph name="END_TERMS_OF_SERVICE_LINK" /> Google Chrome</translation>
+<translation id="5243785881901838525">‏Google Payments (تم النسخ إلى Chrome)</translation>
 <translation id="5251420635869119124">‏يمكن للضيف استخدام Chrome بدون أن يترك أي أثر وراءه.</translation>
 <translation id="5253588388888612165">‏إذا كنت تشارك جهاز الكمبيوتر هذا مع <ph name="PROFILE_NAME" />، فأضف نفسك إلى Chrome للتصفح بشكلٍ منفصل. أو ألغِ ربط حسابك بحسابه في Google.</translation>
 <translation id="5284703908158630707">{SECONDS,plural, =1{‏ستتم إعادة تشغيل Google Chrome خلال ثانية واحدة (1).}zero{‏ستتم إعادة تشغيل Google Chrome خلال # ثانية.}two{‏ستتم إعادة تشغيل Google Chrome خلال ثانيتين (#).}few{‏ستتم إعادة تشغيل Google Chrome خلال # ثوانٍ.}many{‏ستتم إعادة تشغيل Google Chrome خلال # ثانية.}other{‏ستتم إعادة تشغيل Google Chrome خلال # ثانية.}}</translation>
@@ -173,6 +179,7 @@
 <translation id="6235018212288296708">‏قاعدة الوارد إلى Google Chrome للسماح بحركة مرور mDNS.</translation>
 <translation id="6236285698028833233">‏توقف تحديث Google Chrome ولم يعد متوافقًا مع هذا الإصدار من نظام التشغيل.</translation>
 <translation id="629218512217695915">‏استخدام كلمة المرور التي تم إنشاؤها بواسطة Chrome</translation>
+<translation id="6338556085225130112">‏تحديث Google Chrome</translation>
 <translation id="6368805772029492593">‏لمزيد من الأمان، سيشفر Google Chrome بياناتك</translation>
 <translation id="6368958679917195344">‏أصبح نظام التشغيل Chrome متاحًا من خلال <ph name="BEGIN_LINK_CROS_OSS" />برنامج مفتوح المصدر<ph name="END_LINK_CROS_OSS" /> إضافي.</translation>
 <translation id="6400076122676892962">‏سيتوقف هذا الكمبيوتر قريبًا عن استلام تحديثات Google Chrome لأن أنظمة Mac OS X 10.6 و10.7 و10.8 ستصبح غير مدعومة.</translation>
@@ -182,6 +189,7 @@
 <translation id="6600954340915313787">‏تم النسخ إلى Chrome</translation>
 <translation id="6626317981028933585">‏لا يمكن استيراد إعدادات موزيلا فايرفوكس أثناء تشغيل المتصفّح. لاستيراد الإعدادات إلى متصفّح Google Chrome، احفظ عملك وأغلق جميع نوافذ فايرفوكس، ثمّ انقر على زرّ المتابعة.</translation>
 <translation id="6634887557811630702">‏Google Chrome محدّث.</translation>
+<translation id="6648058004052854464">‏تعذر على Google Chrome أن يكون المتصفح الافتراضي.</translation>
 <translation id="6676384891291319759">الدخول إلى الإنترنت</translation>
 <translation id="6757767188268205357">عدم المطالبة مرة أخرى</translation>
 <translation id="683440813066116847">‏قاعدة الوارد إلى Google Chrome Canary للسماح بحركة مرور mDNS.</translation>
@@ -207,6 +215,7 @@
 <translation id="7242029209006116544">‏إنك تسجل الدخول باستخدام حساب مُدار وتمنح المشرف إمكانية التحكم في ملفك الشخصي في Google Chrome. وسيتم ربط بيانات Chrome التابعة لك، مثل التطبيقات والإشارات المرجعية والسجلّ وكلمات المرور والإعدادات الأخرى بالمستخدم <ph name="USER_NAME" />. وستتمكن من حذف هذه البيانات عبر لوحة تحكم حسابات Google، ولكنك لن تتمكن من إقران هذه البيانات بحساب آخر. ويُمكنك اختيار إنشاء ملف شخصي جديد للإبقاء على بياناتك الحالية في Chrome بشكل مستقل. <ph name="LEARN_MORE" /></translation>
 <translation id="729375352412857283">‏سيتوقف هذا الكمبيوتر قريبًا عن استلام تحديثات Google Chrome لأن أنظمة Windows XP وWindows Vista لن تصبح مدعومة بعد الآن.</translation>
 <translation id="7339898014177206373">نافذة جديدة</translation>
+<translation id="7393806081343982361">‏Google Chrome هو متصفحك الافتراضي. رائع!</translation>
 <translation id="7398801000654795464">‏تم تسجيل دخولك إلى Chrome باعتبارك <ph name="USER_EMAIL_ADDRESS" />. الرجاء استخدام الحساب نفسه لتسجيل الدخول مرة أخرى.</translation>
 <translation id="7400722733683201933">‏معلومات عن Google Chrome</translation>
 <translation id="7408085963519505752">‏بنود نظام التشغيل Chrome</translation>
@@ -256,6 +265,7 @@
 <translation id="8669527147644353129">‏مساعد Google Chrome</translation>
 <translation id="8679801911857917785">‏كما أنها تتحكم في الصفحة التي تظهر عند تشغيل Chrome.</translation>
 <translation id="870251953148363156">‏&amp;تحديث Google Chrome</translation>
+<translation id="8793772303278047003">‏إصدار Chrome قديم.</translation>
 <translation id="8796108026289707191">‏يجب عليك إعادة تشغيل Google Chrome الآن.</translation>
 <translation id="8823341990149967727">‏إصدار Chrome قديم</translation>
 <translation id="884296878221830158">‏كما أنها تتحكم في الصفحة التي تظهر عند تشغيل Chrome أو النقر على زر الصفحة الرئيسية.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb
index b5b5191..60896e4 100644
--- a/chrome/app/resources/google_chrome_strings_bg.xtb
+++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -23,6 +23,7 @@
 <translation id="1553358976309200471">Актуализиране на Chrome</translation>
 <translation id="1587223624401073077">Google Chrome използва камерата ви.</translation>
 <translation id="1619887657840448962">За да направим Chrome по-безопасен, деактивирахме следното разширение, което липсва от <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> и може да е било добавено без ваше знание.</translation>
+<translation id="1628000112320670027">Получаване на помощ за Chrome</translation>
 <translation id="163860049029591106">Първи стъпки с Chrome OS</translation>
 <translation id="1653828314016431939">OK – Рестартиране сега</translation>
 <translation id="1682634494516646069">Google Chrome не може да чете и записва в директорията си за данни:
@@ -45,6 +46,7 @@
 <translation id="2286950485307333924">Вече влязохте в Chrome</translation>
 <translation id="2290014774651636340">Ключовете на приложния програмен интерфейс (API) на Google липсват. Някои функции на Google Chrome ще бъдат деактивирани.</translation>
 <translation id="2290095356545025170">Наистина ли искате да деинсталирате Google Chrome?</translation>
+<translation id="2309047409763057870">Тази инсталация на Google Chrome е алтернативна и не може да се зададе като браузър по подразбиране.</translation>
 <translation id="2316129865977710310">Не, благодаря</translation>
 <translation id="2334084861041072223">Авторски права <ph name="YEAR" /> Google Inc. Всички права запазени.</translation>
 <translation id="2346876346033403680">По-рано някой влезе в Chrome на този компютър като <ph name="ACCOUNT_EMAIL_LAST" />. Ако това не е профилът ви, създайте нов потребител в браузъра, за да се съхранява отделно информацията ви.
@@ -68,6 +70,7 @@
 <translation id="2847461019998147611">Показване на Google Chrome на този език</translation>
 <translation id="2871893339301912279">Влязохте в Chrome!</translation>
 <translation id="2888126860611144412">Всичко за Chrome</translation>
+<translation id="2900322993655997287">Google Chrome не може да определи или зададе браузъра по подразбиране.</translation>
 <translation id="2997147809295888909">Chrome потвърди, че сертификатът на този уебсайт е издаден от <ph name="ISSUER" />. Сървърът не предостави информация за прозрачност на сертификата.</translation>
 <translation id="3037838751736561277">Google Chrome работи на заден план.</translation>
 <translation id="3047079729301751317">Прекратяването на връзката с/ъс <ph name="USERNAME" /> ще изчисти историята, отметките, настройките и другите данни в Chrome, съхранени на това устройство. Данните в профила ви в Google няма да бъдат изчистени и могат да се управляват в <ph name="GOOGLE_DASHBOARD_LINK" />Google Табло за управление<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
@@ -84,6 +87,7 @@
 <translation id="3282568296779691940">Вход в Chrome</translation>
 <translation id="3311976847535831054">Този компютър вече няма да получава актуализации за 32-битовата версия на Google Chrome. Моля, надстройте до 64-битовата версия на браузъра.</translation>
 <translation id="3360895254066713204">Chrome Helper</translation>
+<translation id="3395323229510056640">Получаване на помощ за Chrome OS</translation>
 <translation id="3396977131400919238">По време на инсталирането възникна грешка в операционната система. Моля, изтеглете Google Chrome отново.</translation>
 <translation id="3398288718845740432">Скриване в менюто на Chrome</translation>
 <translation id="3451115285585441894">Добавя се към Chrome...</translation>
@@ -137,7 +141,9 @@
 <translation id="5132929315877954718">Открийте отлични приложения, игри, разширения и теми за Google Chrome.</translation>
 <translation id="5148419164691878332">Chrome ще съхрани това при <ph name="SAVED_PASSWORDS_LINK" /> и ще си го спомни следващия път, когато ви е необходимо.</translation>
 <translation id="5170938038195470297">Потребителският ви профил не може да се използва, защото е от по-нова версия на Google Chrome. Някои функции може да не са налице. Моля, посочете друга директория в потребителския профил или използвайте по-нова версия на Chrome.</translation>
+<translation id="5176234269072261959">Помогнете за подобряването на Chrome, като подадете сигнал за текущите настройки.</translation>
 <translation id="5204098752394657250"><ph name="TERMS_OF_SERVICE_LINK" />Общи условия<ph name="END_TERMS_OF_SERVICE_LINK" /> на Google Chrome</translation>
+<translation id="5243785881901838525">Google Payments (копирано в Chrome)</translation>
 <translation id="5251420635869119124">Гостите могат да използват Chrome, без да оставят следи.</translation>
 <translation id="5253588388888612165">Ако споделяте компютъра с/ъс <ph name="PROFILE_NAME" />, добавете се към Chrome, за да сърфирате отделно. В противен случай прекратете връзката с профила в Google на този потребител.</translation>
 <translation id="5284703908158630707">{SECONDS,plural, =1{Google Chrome ще се рестартира след 1 секунда.}other{Google Chrome ще се рестартира след # секунди.}}</translation>
@@ -171,6 +177,7 @@
 <translation id="6235018212288296708">Правило за Google Chrome за допускане на входящия трафик за mDNS.</translation>
 <translation id="6236285698028833233">Google Chrome спря да се актуализира и вече не поддържа тази версия на операционната ви система.</translation>
 <translation id="629218512217695915">Използвайте парола, генерирана от Chrome</translation>
+<translation id="6338556085225130112">Google Chrome се актуализира</translation>
 <translation id="6368805772029492593">За повишаване на сигурността Google Chrome ще шифрова данните ви.</translation>
 <translation id="6368958679917195344">Chrome OS е възможна благодарение на допълнителен <ph name="BEGIN_LINK_CROS_OSS" />софтуер с отворен код<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6400076122676892962">Този компютър скоро ще спре да получава актуализации на Google Chrome, тъй като Mac OS X 10.6, 10.7 и 10.8 вече няма да се поддържат.</translation>
@@ -180,6 +187,7 @@
 <translation id="6600954340915313787">Копирано в Chrome</translation>
 <translation id="6626317981028933585">За съжаление настройките на Mozilla Firefox са недостъпни, докато този браузър работи. За да импортирате тези настройки в Google Chrome, запазете работата си и затворете всички прозорци на Firefox. След това кликнете върху „Напред”.</translation>
 <translation id="6634887557811630702">Google Chrome е актуален.</translation>
+<translation id="6648058004052854464">Google Chrome не можа да се зададе като браузър по подразбиране.</translation>
 <translation id="6676384891291319759">Достъп до интернет</translation>
 <translation id="6757767188268205357">Не ме занимавайте</translation>
 <translation id="683440813066116847">Правило за Google Chrome Canary за допускане на входящия трафик за mDNS.</translation>
@@ -205,6 +213,7 @@
 <translation id="7242029209006116544">Влизате с управляван профил и давате на администратора му контрол над потребителския си профил в Google Chrome. Данните ви в браузъра, като например приложения, отметки, история, пароли и други настройки, ще се свържат за постоянно с/ъс <ph name="USER_NAME" />. Ще можете да ги изтриете чрез таблото за управление на Google Профили, но не и да ги свържете с друг профил. По избор можете да създадете нов потребителски профил, за да отделите съществуващите си данни в Chrome. <ph name="LEARN_MORE" /></translation>
 <translation id="729375352412857283">Този компютър скоро ще спре да получава актуализации на Google Chrome, тъй като Windows XP и Windows Vista вече няма да се поддържат.</translation>
 <translation id="7339898014177206373">Нов прозорец</translation>
+<translation id="7393806081343982361">Google Chrome е браузърът ви по подразбиране. Ура!</translation>
 <translation id="7398801000654795464">Бяхте влезли в Chrome като <ph name="USER_EMAIL_ADDRESS" />. Моля, използвайте същия профил, за да влезете отново.</translation>
 <translation id="7400722733683201933">Всичко за Google Chrome</translation>
 <translation id="7408085963519505752">Общи условия на Chrome OS</translation>
@@ -254,6 +263,7 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">То също контролира коя страница се показва при стартиране на Chrome.</translation>
 <translation id="870251953148363156">Актуализиране на &amp;Google Chrome</translation>
+<translation id="8793772303278047003">Chrome не е актуален.</translation>
 <translation id="8796108026289707191">Трябва да рестартирате Google Chrome сега.</translation>
 <translation id="8823341990149967727">Chrome не е актуален</translation>
 <translation id="884296878221830158">То също контролира коя страница се показва при стартиране на Chrome или при кликване върху бутона „Начална страница“.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb
index 44bc142..153398bf 100644
--- a/chrome/app/resources/google_chrome_strings_en-GB.xtb
+++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -25,6 +25,7 @@
 <translation id="1553358976309200471">Update Chrome</translation>
 <translation id="1587223624401073077">Google Chrome is using your camera.</translation>
 <translation id="1619887657840448962">To make Chrome safer, we disabled the following extension that isn't listed in the <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> and may have been added without your knowledge.</translation>
+<translation id="1628000112320670027">Get help with Chrome</translation>
 <translation id="163860049029591106">Get Started with Chrome OS</translation>
 <translation id="1653828314016431939">OK - Restart now</translation>
 <translation id="1682634494516646069">Google Chrome cannot read and write to its data directory:
@@ -47,6 +48,7 @@
 <translation id="2286950485307333924">You're now signed in to Chrome</translation>
 <translation id="2290014774651636340">Google API keys are missing. Some functionality of Google Chrome will be disabled.</translation>
 <translation id="2290095356545025170">Are you sure you want to uninstall Google Chrome?</translation>
+<translation id="2309047409763057870">This is a secondary installation of Google Chrome, and cannot be made your default browser.</translation>
 <translation id="2316129865977710310">No, thank you</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. All rights reserved.</translation>
 <translation id="2346876346033403680">Someone previously signed in to Chrome on this computer as <ph name="ACCOUNT_EMAIL_LAST" />. If that isn't your account, create a new Chrome user to keep your information separate.
@@ -70,6 +72,7 @@
 <translation id="2847461019998147611">Display Google Chrome in this language</translation>
 <translation id="2871893339301912279">You're signed in to Chrome!</translation>
 <translation id="2888126860611144412">About Chrome</translation>
+<translation id="2900322993655997287">Google Chrome cannot determine or set the default browser.</translation>
 <translation id="2997147809295888909">Chrome verified that <ph name="ISSUER" /> issued this website's certificate. The server did not supply any Certificate Transparency information.</translation>
 <translation id="3037838751736561277">Google Chrome is in background mode.</translation>
 <translation id="3047079729301751317">Disconnecting <ph name="USERNAME" /> will clear your history, bookmarks, settings and other Chrome data stored on this device. Data stored in your Google Account will not be cleared and can be managed on <ph name="GOOGLE_DASHBOARD_LINK" />Google Dashboard<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
@@ -86,6 +89,7 @@
 <translation id="3282568296779691940">Sign in to Chrome</translation>
 <translation id="3311976847535831054">This computer will no longer receive 32-bit Google Chrome updates. Please upgrade to 64-bit Google Chrome.</translation>
 <translation id="3360895254066713204">Chrome Helper</translation>
+<translation id="3395323229510056640">Get help with Chrome OS</translation>
 <translation id="3396977131400919238">An operating system error occurred during installation. Please download Google Chrome again.</translation>
 <translation id="3398288718845740432">Hide in Chrome Menu</translation>
 <translation id="3451115285585441894">Adding to Chrome...</translation>
@@ -141,7 +145,9 @@
 <translation id="5170938038195470297">Your profile cannot be used because it is from a newer version of Google Chrome.
 
 Some features may be unavailable. Please specify a different profile directory or use a newer version of Chrome.</translation>
+<translation id="5176234269072261959">Help make Chrome better by reporting the current settings.</translation>
 <translation id="5204098752394657250">Google Chrome <ph name="TERMS_OF_SERVICE_LINK" />Terms of Service<ph name="END_TERMS_OF_SERVICE_LINK" /></translation>
+<translation id="5243785881901838525">Google Payments (copied to Chrome)</translation>
 <translation id="5251420635869119124">Guests can use Chrome without leaving anything behind.</translation>
 <translation id="5253588388888612165">If you share this computer with <ph name="PROFILE_NAME" />, add yourself to Chrome to browse separately. Otherwise disconnect their Google Account.</translation>
 <translation id="5284703908158630707">{SECONDS,plural, =1{Google Chrome will restart in 1 second.}other{Google Chrome will restart in # seconds.}}</translation>
@@ -177,6 +183,7 @@
 <translation id="6235018212288296708">Inbound rule for Google Chrome to allow mDNS traffic.</translation>
 <translation id="6236285698028833233">Google Chrome has stopped updating and no longer supports this version of your operating system.</translation>
 <translation id="629218512217695915">Use password generated by Chrome</translation>
+<translation id="6338556085225130112">Updating Google Chrome</translation>
 <translation id="6368805772029492593">For added security, Google Chrome will encrypt your data.</translation>
 <translation id="6368958679917195344">Chrome OS is made possible by additional <ph name="BEGIN_LINK_CROS_OSS" />open-source software<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6400076122676892962">This computer will soon stop receiving Google Chrome updates because Mac OS X 10.6, 10.7 and 10.8 will no longer be supported.</translation>
@@ -186,6 +193,7 @@
 <translation id="6600954340915313787">Copied to Chrome</translation>
 <translation id="6626317981028933585">Sadly, your Mozilla Firefox settings are not available while that browser is running. To import those settings to Google Chrome, save your work and close all Firefox windows. Then click Continue.</translation>
 <translation id="6634887557811630702">Google Chrome is up to date.</translation>
+<translation id="6648058004052854464">Google Chrome was not able to become the default browser.</translation>
 <translation id="6676384891291319759">Access the Internet</translation>
 <translation id="6757767188268205357">Don't bother me</translation>
 <translation id="683440813066116847">Inbound rule for Google Chrome Canary to allow mDNS traffic.</translation>
@@ -211,6 +219,7 @@
 <translation id="7242029209006116544">You are signing in with a managed account and giving its administrator control over your Google Chrome profile. Your Chrome data, such as your apps, bookmarks, history, passwords and other settings will become permanently tied to <ph name="USER_NAME" />. You will be able to delete this data via the Google Accounts Dashboard, but you will not be able to associate this data with another account. You can optionally create a new profile to keep your existing Chrome data separate. <ph name="LEARN_MORE" /></translation>
 <translation id="729375352412857283">This computer will soon stop receiving Google Chrome updates because Windows XP and Windows Vista will no longer be supported.</translation>
 <translation id="7339898014177206373">New window</translation>
+<translation id="7393806081343982361">Google Chrome is your default browser. Yeah!</translation>
 <translation id="7398801000654795464">You were signed in to Chrome as <ph name="USER_EMAIL_ADDRESS" />. Please use the same account to sign in again.</translation>
 <translation id="7400722733683201933">About Google Chrome</translation>
 <translation id="7408085963519505752">Chrome OS terms</translation>
@@ -260,6 +269,7 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">It also controls what page is shown when you start Chrome.</translation>
 <translation id="870251953148363156">Update &amp;Google Chrome</translation>
+<translation id="8793772303278047003">Chrome is out of date.</translation>
 <translation id="8796108026289707191">You should restart Google Chrome now.</translation>
 <translation id="8823341990149967727">Chrome is Out of Date</translation>
 <translation id="884296878221830158">It also controls what page is shown when you start Chrome or click the Home button.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb
index 9c75568..285adc06 100644
--- a/chrome/app/resources/google_chrome_strings_ko.xtb
+++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -25,6 +25,7 @@
 <translation id="1553358976309200471">Chrome 업데이트</translation>
 <translation id="1587223624401073077">Chrome에서 카메라를 사용 중입니다.</translation>
 <translation id="1619887657840448962">Google에서는 Chrome의 보안을 강화하기 위해 <ph name="IDS_EXTENSION_WEB_STORE_TITLE" />에 표시되지 않고 사용자가 모르게 추가되었을 수 있는 다음 확장 프로그램의 사용을 중지했습니다.</translation>
+<translation id="1628000112320670027">Chrome 도움말 보기</translation>
 <translation id="163860049029591106">Chrome OS 시작하기</translation>
 <translation id="1653828314016431939">확인 - 지금 다시 시작</translation>
 <translation id="1682634494516646069">Chrome에서 다음 데이터 디렉토리를 읽고 쓸 수 없습니다.
@@ -47,6 +48,7 @@
 <translation id="2286950485307333924">이제 Chrome에 로그인되었습니다.</translation>
 <translation id="2290014774651636340">Google API 키가 누락되었습니다. Chrome의 일부 기능이 사용 중지됩니다.</translation>
 <translation id="2290095356545025170">Chrome을 제거하시겠습니까?</translation>
+<translation id="2309047409763057870">Chrome의 보조 설치이며 기본 브라우저로 설정할 수 없습니다.</translation>
 <translation id="2316129865977710310">아니요, 괜찮습니다.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. All rights reserved.</translation>
 <translation id="2346876346033403680">다른 사용자가 이전에 이 컴퓨터에서 <ph name="ACCOUNT_EMAIL_LAST" />(으)로 Chrome에 로그인했습니다. 본인의 계정이 아닌 경우 새 Chrome 사용자를 만들어 개인 정보를 분리하세요.
@@ -70,6 +72,7 @@
 <translation id="2847461019998147611">이 언어로 Chrome 표시</translation>
 <translation id="2871893339301912279">Chrome에 로그인되어 있습니다.</translation>
 <translation id="2888126860611144412">크롬 정보</translation>
+<translation id="2900322993655997287">Chrome에서 기본 브라우저를 결정하거나 설정할 수 없습니다.</translation>
 <translation id="2997147809295888909">Chrome에서 <ph name="ISSUER" />이(가) 이 웹사이트의 인증서를 발행했음을 확인했습니다. 서버에서 인증서 투명성 정보를 제공하지 않았습니다.</translation>
 <translation id="3037838751736561277">Chrome이 백그라운드 모드로 실행 중입니다.</translation>
 <translation id="3047079729301751317"><ph name="USERNAME" />의 연결을 해제하면 이 기기에 저장된 방문 기록, 북마크, 설정 및 기타 Chrome 데이터가 삭제됩니다. Google 계정에 저장된 데이터는 삭제되지 않으며 <ph name="GOOGLE_DASHBOARD_LINK" />Google 대시보드<ph name="END_GOOGLE_DASHBOARD_LINK" />에서 관리될 수 있습니다.</translation>
@@ -86,6 +89,7 @@
 <translation id="3282568296779691940">Chrome에 로그인</translation>
 <translation id="3311976847535831054">이 컴퓨터에서 더 이상 32비트 Chrome 업데이트를 사용할 수 없습니다. 64비트 Chrome으로 업그레이드하세요.</translation>
 <translation id="3360895254066713204">Chrome 도우미</translation>
+<translation id="3395323229510056640">Chrome OS 도움말 보기</translation>
 <translation id="3396977131400919238">설치 중 운영체제 오류가 발생했습니다. Chrome을 다시 다운로드하세요.</translation>
 <translation id="3398288718845740432">Chrome 메뉴에서 숨기기</translation>
 <translation id="3451115285585441894">Chrome에 추가하는 중...</translation>
@@ -141,7 +145,9 @@
 <translation id="5170938038195470297">최신 버전의 Chrome에서 가져온 사용자 프로필이기 때문에 사용할 수 없습니다.
 
 일부 기능은 사용하지 못할 수 있습니다. 다른 프로필 디렉토리를 지정하거나 최신 버전의 Chrome을 사용하세요.</translation>
+<translation id="5176234269072261959">현재 설정을 보고하여 Chrome 개선에 참여</translation>
 <translation id="5204098752394657250">Chrome <ph name="TERMS_OF_SERVICE_LINK" />서비스 약관<ph name="END_TERMS_OF_SERVICE_LINK" /></translation>
+<translation id="5243785881901838525">Google Payments(Chrome에 복사됨)</translation>
 <translation id="5251420635869119124">손님으로 사용 기록을 남기지 않고 Chrome을 사용할 수 있습니다.</translation>
 <translation id="5253588388888612165"><ph name="PROFILE_NAME" />님과 컴퓨터를 공유하는 경우 개별적으로 인터넷을 사용하려면 본인을 Chrome에 추가하세요. 아니면 상대방의 Google 계정 연결을 해제하세요.</translation>
 <translation id="5284703908158630707">{SECONDS,plural, =1{1초 후에 Chrome이 다시 시작됩니다.}other{#초 후에 Chrome이 다시 시작됩니다.}}</translation>
@@ -177,6 +183,7 @@
 <translation id="6235018212288296708">Chrome이 mDNS 트래픽을 허용하는 인바운드 규칙입니다.</translation>
 <translation id="6236285698028833233">Chrome에서 업데이트를 중단했으며 이 버전의 운영체제를 더 이상 지원하지 않습니다.</translation>
 <translation id="629218512217695915">Chrome에서 생성한 비밀번호 사용</translation>
+<translation id="6338556085225130112">Chrome 업데이트 중</translation>
 <translation id="6368805772029492593">보안 강화를 위해 Chrome에서 사용자 데이터를 암호화합니다.</translation>
 <translation id="6368958679917195344">Chrome OS는 추가 <ph name="BEGIN_LINK_CROS_OSS" />오픈소스 소프트웨어<ph name="END_LINK_CROS_OSS" />를 사용했습니다.</translation>
 <translation id="6400076122676892962">Mac OS X 10.6, 10.7, 10.8이 더 이상 지원되지 않을 예정이므로 곧 이 컴퓨터에서 Chrome 업데이트를 받을 수 없게 됩니다.</translation>
@@ -186,6 +193,7 @@
 <translation id="6600954340915313787">Chrome에 복사됨</translation>
 <translation id="6626317981028933585">Mozilla Firefox 브라우저가 실행 중일 때는 설정 기능을 사용할 수 없습니다. 이 설정을 Chrome으로 가져오려면 현재 작업을 저장하고 Firefox 창을 모두 닫습니다. 그런 다음 '계속'을 클릭합니다.</translation>
 <translation id="6634887557811630702">Chrome이 최신 버전입니다.</translation>
+<translation id="6648058004052854464">Chrome을 기본 브라우저로 설정할 수 없습니다.</translation>
 <translation id="6676384891291319759">인터넷 연결</translation>
 <translation id="6757767188268205357">더 이상 묻지 않음</translation>
 <translation id="683440813066116847">Chrome Canary가 mDNS 트래픽을 허용하는 인바운드 규칙입니다.</translation>
@@ -211,6 +219,7 @@
 <translation id="7242029209006116544">관리 계정으로 로그인하고 관리자에게 Chrome 프로필에 대한 제어권을 부여하려고 합니다. 앱, 북마크, 방문 기록, 비밀번호 및 기타 설정과 같은 Chrome 데이터가 <ph name="USER_NAME" /> 계정에 영구적으로 연결됩니다. 이후 이 데이터를 Google 계정 대시보드에서 삭제할 수는 있지만 다른 계정에 연결할 수는 없습니다. 기존 Chrome 데이터를 유지하려면 새 프로필을 만드는 방법이 있습니다. <ph name="LEARN_MORE" /></translation>
 <translation id="729375352412857283">Windows XP 및 Windows Vista가 더 이상 지원되지 않을 예정이므로 곧 이 컴퓨터에서 Chrome 업데이트를 받을 수 없게 됩니다.</translation>
 <translation id="7339898014177206373">새 창</translation>
+<translation id="7393806081343982361">Chrome이 기본 브라우저입니다.</translation>
 <translation id="7398801000654795464"><ph name="USER_EMAIL_ADDRESS" />(으)로 Chrome에 로그인되어 있습니다. 같은 계정으로 다시 로그인해 주세요.</translation>
 <translation id="7400722733683201933">Chrome 정보</translation>
 <translation id="7408085963519505752">Chrome OS 이용약관</translation>
@@ -260,6 +269,7 @@
 <translation id="8669527147644353129">Chrome 도우미</translation>
 <translation id="8679801911857917785">또한 Chrome을 시작할 때 표시되는 페이지를 설정합니다.</translation>
 <translation id="870251953148363156">Chrome 업데이트(&amp;G)</translation>
+<translation id="8793772303278047003">Chrome이 이전 버전입니다.</translation>
 <translation id="8796108026289707191">지금 Chrome을 다시 시작해야 합니다.</translation>
 <translation id="8823341990149967727">Chrome이 이전 버전임</translation>
 <translation id="884296878221830158">또한 Chrome을 시작하거나 홈 버튼을 클릭할 때 표시되는 페이지를 설정합니다.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb
index 2d0cadb..8134f2b 100644
--- a/chrome/app/resources/google_chrome_strings_ms.xtb
+++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -23,6 +23,7 @@
 <translation id="1553358976309200471">Kemas Kini Chrome</translation>
 <translation id="1587223624401073077">Google Chrome menggunakan kamera anda.</translation>
 <translation id="1619887657840448962">Untuk menjadikan Chrome lebih selamat, kami melumpuhkan sambungan berikut yang tidak disenaraikan dalam <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> dan mungkin telah ditambahkan tanpa pengetahuan anda.</translation>
+<translation id="1628000112320670027">Dapatkan bantuan dengan Chrome</translation>
 <translation id="163860049029591106">Bermula dengan OS Chrome</translation>
 <translation id="1653828314016431939">OK - Mulakan semula sekarang</translation>
 <translation id="1682634494516646069">Google Chrome tidak dapat membaca atau menulis pada direktori datanya: <ph name="USER_DATA_DIRECTORY" /></translation>
@@ -43,6 +44,7 @@
 <translation id="2286950485307333924">Anda kini dilog masuk ke Chrome</translation>
 <translation id="2290014774651636340">Kunci API Google tiada. Sesetengah fungsi Google Chrome akan dilumpuhkan.</translation>
 <translation id="2290095356545025170">Adakah anda pasti anda mahu menyahpasang Google Chrome?</translation>
+<translation id="2309047409763057870">Ini adalah pemasangan kedua Google Chrome dan tidak boleh dijadikan penyemak imbas lalai anda.</translation>
 <translation id="2316129865977710310">Tidak, terima kasih</translation>
 <translation id="2334084861041072223">Hak Cipta <ph name="YEAR" /> Google Inc. Hak cipta terpelihara.</translation>
 <translation id="2346876346033403680">Seseorang telah log masuk ke Chrome pada komputer ini sebagai <ph name="ACCOUNT_EMAIL_LAST" /> sebelum ini. Jika itu bukan akaun anda, buat pengguna Chrome yang baharu untuk mengasingkan maklumat anda.
@@ -66,6 +68,7 @@
 <translation id="2847461019998147611">Paparkan Google Chrome dalam bahasa ini</translation>
 <translation id="2871893339301912279">Anda kini telah log masuk ke Chrome!</translation>
 <translation id="2888126860611144412">Perihal Chrome</translation>
+<translation id="2900322993655997287">Google Chrome tidak dapat menentukan atau menetapkan penyemak imbas lalai.</translation>
 <translation id="2997147809295888909">Chrome mengesahkan bahawa <ph name="ISSUER" /> mengeluarkan sijil tapak web ini. Pelayan tidak membekalkan sebarang maklumat Ketelusan Sijil.</translation>
 <translation id="3037838751736561277">Google Chrome dalam mod latar belakang.</translation>
 <translation id="3047079729301751317">Memutuskan sambungan <ph name="USERNAME" /> akan mengosongkan sejarah anda, penanda halaman, tetapan dan data Chrome lain yang tersimpan pada peranti ini. Data yang disimpan dalam Akaun Google anda tidak akan dikosongkan dan boleh diurus pada <ph name="GOOGLE_DASHBOARD_LINK" />Papan Pemuka Google<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
@@ -82,6 +85,7 @@
 <translation id="3282568296779691940">Log masuk ke Chrome</translation>
 <translation id="3311976847535831054">Komputer ini tidak akan menerima kemas kini Google Chrome 32 bit lagi. Sila tingkatkan kepada Google Chrome 64 bit.</translation>
 <translation id="3360895254066713204">Chrome Helper</translation>
+<translation id="3395323229510056640">Dapatkan bantuan dengan Chrome OS</translation>
 <translation id="3396977131400919238">Ralat sistem pengendalian berlaku semasa pemasangan. Sila muat turun Google Chrome semula.</translation>
 <translation id="3398288718845740432">Sembunyikan dalam Menu Chrome</translation>
 <translation id="3451115285585441894">Menambahkan pada Chrome...</translation>
@@ -135,7 +139,9 @@
 <translation id="5132929315877954718">Temui apl, permainan, sambungan dan tema hebat untuk Google Chrome.</translation>
 <translation id="5148419164691878332">Chrome akan menyimpan ini dalam <ph name="SAVED_PASSWORDS_LINK" /> anda dan mengingatinya apabila anda memerlukannya nanti.</translation>
 <translation id="5170938038195470297">Profil anda tidak boleh digunakan kerana ia adalah dari versi Google Chrome yang lebih baharu. Beberapa ciri mungkin tidak tersedia. Sila tetapkan direktori profil lain atau gunakan versi Chrome yang lebih baharu.</translation>
+<translation id="5176234269072261959">Bantu menjadikan Chrome lebih baik dengan melaporkan tetapan semasa.</translation>
 <translation id="5204098752394657250"><ph name="TERMS_OF_SERVICE_LINK" />Syarat Perkhidmatan<ph name="END_TERMS_OF_SERVICE_LINK" /> Google Chrome </translation>
+<translation id="5243785881901838525">Google Payments (disalin ke Chrome)</translation>
 <translation id="5251420635869119124">Tetamu boleh menggunakan Chrome tanpa meninggalkan apa-apa.</translation>
 <translation id="5253588388888612165">Jika anda berkongsi komputer ini dengan <ph name="PROFILE_NAME" /> , tambahkan diri anda pada Chrome untuk menyemak imbas secara berasingan. Jika tidak, putuskan sambungan Akaun Googlenya.</translation>
 <translation id="5284703908158630707">{SECONDS,plural, =1{Google Chrome akan dimulakan semula dalam 1 saat.}other{Google Chrome akan dimulakan semula dalam # saat.}}</translation>
@@ -169,6 +175,7 @@
 <translation id="6235018212288296708">Peraturan masuk bagi Google Chrome untuk membenarkan trafik mDNS.</translation>
 <translation id="6236285698028833233">Google Chrome telah berhenti mengemas kini dan tidak lagi menyokong versi sistem pengendalian anda ini.</translation>
 <translation id="629218512217695915">Gunakan kata laluan yang dijana oleh Chrome</translation>
+<translation id="6338556085225130112">Mengemas kini Google Chrome</translation>
 <translation id="6368805772029492593">Untuk keselamatan tambahan, Google Chrome akan menyulitkan data anda.</translation>
 <translation id="6368958679917195344">OS Chrome menjadi kenyataan dengan <ph name="BEGIN_LINK_CROS_OSS" />perisian sumber terbuka<ph name="END_LINK_CROS_OSS" /> tambahan.</translation>
 <translation id="6400076122676892962">Tidak lama lagi komputer ini akan berhenti menerima kemas kini Google Chrome kerana Mac OS X 10.6, 10.7 dan 10.8 tidak lagi akan disokong.</translation>
@@ -178,6 +185,7 @@
 <translation id="6600954340915313787">Disalin ke Chrome</translation>
 <translation id="6626317981028933585">Malangnya, tetapan Mozilla Firefox anda tidak tersedia semasa penyemak imbas tersebut dijalankan. Untuk mengimport tetapan tersebut ke Google Chrome, simpan kerja anda dan tutup semua tetingkap Firefox. Kemudian klik Teruskan.</translation>
 <translation id="6634887557811630702">Google Chrome telah dikemas kini.</translation>
+<translation id="6648058004052854464">Google Chrome tidak dapat dijadikan penyemak imbas lalai.</translation>
 <translation id="6676384891291319759">Akses Internet</translation>
 <translation id="6757767188268205357">Jangan ganggu saya</translation>
 <translation id="683440813066116847">Peraturan masuk bagi Google Chrome Canary untuk membenarkan trafik mDNS.</translation>
@@ -203,6 +211,7 @@
 <translation id="7242029209006116544">Anda log masuk menggunakan akaun terurus dan memberikan pentadbirnya kawalan terhadap profil Google Chrome anda. Data Chrome anda, seperti apl, penanda halaman, sejarah, kata laluan dan tetapan anda yang lain akan terikat kepada <ph name="USER_NAME" /> secara kekal. Anda akan dapat memadamkan data ini melalui Papan Pemuka Akaun Google, tetapi anda tidak akan dapat mengaitkan data ini dengan akaun lain. Anda boleh memilih membuat profil baharu untuk mengasingkan data Chrome anda yang sedia ada. <ph name="LEARN_MORE" /></translation>
 <translation id="729375352412857283">Tidak lama lagi komputer ini akan berhenti menerima kemas kini Google Chrome kerana Windows XP dan Windows Vista tidak lagi akan disokong.</translation>
 <translation id="7339898014177206373">Tetingkap baharu</translation>
+<translation id="7393806081343982361">Google Chrome ialah penyemak imbas lalai anda. Yei!</translation>
 <translation id="7398801000654795464">Anda telah log masuk ke Chrome sebagai <ph name="USER_EMAIL_ADDRESS" />. Sila gunakan akaun yang sama untuk log masuk lagi.</translation>
 <translation id="7400722733683201933">Mengenai Google Chrome</translation>
 <translation id="7408085963519505752">Syarat Chrome OS</translation>
@@ -252,6 +261,7 @@
 <translation id="8669527147644353129">Pembantu Google Chrome</translation>
 <translation id="8679801911857917785">Sambungan turut mengawal halaman yang ditunjukkan apabila anda memulakan Chrome.</translation>
 <translation id="870251953148363156">Kemas kini &amp;Google Chrome</translation>
+<translation id="8793772303278047003">Chrome sudah usang.</translation>
 <translation id="8796108026289707191">Anda perlu memulakan semula Google Chrome sekarang.</translation>
 <translation id="8823341990149967727">Chrome sudah Usang</translation>
 <translation id="884296878221830158">Sambungan turut mengawal halaman yang ditunjukkan apabila anda memulakan Chrome atau mengklik butang Laman Utama.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb
index fe36fa7..eb3e4dd9 100644
--- a/chrome/app/resources/google_chrome_strings_sv.xtb
+++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -25,6 +25,7 @@
 <translation id="1553358976309200471">Uppdatera Chrome</translation>
 <translation id="1587223624401073077">Google Chrome använder din kamera.</translation>
 <translation id="1619887657840448962">Vi har gjort Chromium säkrare genom att inaktivera följande tillägg som inte anges i <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> och som kan ha lagts till utan att du vet om det.</translation>
+<translation id="1628000112320670027">Få hjälp med Chrome</translation>
 <translation id="163860049029591106">Komma igång med Chrome OS</translation>
 <translation id="1653828314016431939">OK - starta om nu</translation>
 <translation id="1682634494516646069">Google Chrome kan inte läsa och skriva till datakatalogen:
@@ -47,6 +48,7 @@
 <translation id="2286950485307333924">Du är nu inloggad i Chrome</translation>
 <translation id="2290014774651636340">Googles API-nycklar saknas. Vissa funktioner i Google Chrome kommer att vara inaktiverade.</translation>
 <translation id="2290095356545025170">Är du säker på att du vill avinstallera Google Chrome?</translation>
+<translation id="2309047409763057870">Det här är en sekundär installation av Google Chrome. Det går inte att göra den till standardwebbläsare.</translation>
 <translation id="2316129865977710310">Nej tack</translation>
 <translation id="2334084861041072223">Upphovsrätt <ph name="YEAR" /> Google Inc. Med ensamrätt.</translation>
 <translation id="2346876346033403680">Någon har tidigare loggat in i Chrome på den här datorn som <ph name="ACCOUNT_EMAIL_LAST" />. Om det inte är ditt konto skapar du en ny Chrome-användare för att hålla din information privat för dig.
@@ -70,6 +72,7 @@
 <translation id="2847461019998147611">Visa Google Chrome på det här språket</translation>
 <translation id="2871893339301912279">Du är inloggad i Chrome.</translation>
 <translation id="2888126860611144412">Om Chrome</translation>
+<translation id="2900322993655997287">Google Chrome kan inte fastställa eller ange standardwebbläsaren.</translation>
 <translation id="2997147809295888909">Chrome har verifierat att webbplatsens certifikat har utfärdats av <ph name="ISSUER" />. Inga certifikattransparensuppgifter skickades från servern.</translation>
 <translation id="3037838751736561277">Google Chrome körs i bakgrundsläge.</translation>
 <translation id="3047079729301751317">Om du kopplar från <ph name="USERNAME" /> rensas din historik, dina bokmärken, dina inställningar och annan Chrome-data som du har lagrat på enheten. Data som lagras i Google-kontot rensas inte utan kan hanteras via <ph name="GOOGLE_DASHBOARD_LINK" />Google Översikt<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
@@ -86,6 +89,7 @@
 <translation id="3282568296779691940">Logga in i Chrome</translation>
 <translation id="3311976847535831054">Den här datorn får inte längre uppdateringar för 32-bitarsversionen av Google Chrome. Uppgradera till Google Chrome med 64 bitar.</translation>
 <translation id="3360895254066713204">Chrome Helper</translation>
+<translation id="3395323229510056640">Få hjälp med Chrome OS</translation>
 <translation id="3396977131400919238">Ett operativsystemsfel inträffade under installationen. Ladda ned Google Chrome igen.</translation>
 <translation id="3398288718845740432">Dölj i Chrome-menyn</translation>
 <translation id="3451115285585441894">Lägger till i Chrome ...</translation>
@@ -141,7 +145,9 @@
 <translation id="5170938038195470297">Profilen kan inte användas eftersom den tillhör en nyare version av Google Chrome.
 
 Vissa funktioner är kanske inte tillgängliga. Ange en annan profilkatalog om du vill använda en nyare version av Chrome.</translation>
+<translation id="5176234269072261959">Hjälp oss att förbättra Chrome genom att rapportera dina aktuella inställningar.</translation>
 <translation id="5204098752394657250">Google Chromes <ph name="TERMS_OF_SERVICE_LINK" />användarvillkor<ph name="END_TERMS_OF_SERVICE_LINK" /></translation>
+<translation id="5243785881901838525">Google Payments (har kopierats till Chrome)</translation>
 <translation id="5251420635869119124">Gäster kan använda Chrome utan att lämna spår.</translation>
 <translation id="5253588388888612165">Om du delar den här datorn med <ph name="PROFILE_NAME" /> lägger du till dig själv i Chrome så att du kan surfa enskilt. I annat fall kopplar du från deras Google-konto.</translation>
 <translation id="5284703908158630707">{SECONDS,plural, =1{Google Chrome startas om om en sekund.}other{Google Chrome startas om om # sekunder.}}</translation>
@@ -177,6 +183,7 @@
 <translation id="6235018212288296708">Regel som tillåter inkommande mDNS-trafik för Google Chrome.</translation>
 <translation id="6236285698028833233">Google Chrome uppdateras inte längre och har inte längre stöd för den här versionen av ditt operativsystem.</translation>
 <translation id="629218512217695915">Använd lösenordet som genererats av Chrome</translation>
+<translation id="6338556085225130112">Uppdatera Google Chrome</translation>
 <translation id="6368805772029492593">Din data krypteras i Google Chrome för att öka säkerheten.</translation>
 <translation id="6368958679917195344">Chrome OS fungerar tack vare <ph name="BEGIN_LINK_CROS_OSS" />öppen källkod<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6400076122676892962">Den här datorn slutar snart ta emot uppdateringar för Google Chrome eftersom stödet för Mac OS X 10.6, 10.7 och 10.8 kommer att upphöra.</translation>
@@ -186,6 +193,7 @@
 <translation id="6600954340915313787">Kopierat till Chrome</translation>
 <translation id="6626317981028933585">Inställningarna för Mozilla Firefox är tyvärr inte tillgängliga medan webbläsaren körs. Om du vill importera dessa inställningar till Google Chrome måste du spara ditt arbete och stänga alla Firefox-fönster. Klicka sedan på Fortsätt.</translation>
 <translation id="6634887557811630702">Google Chrome behöver inte uppdateras.</translation>
+<translation id="6648058004052854464">Det gick inte att ange Google Chrome som standardwebbläsare.</translation>
 <translation id="6676384891291319759">Gå ut på Internet</translation>
 <translation id="6757767188268205357">Stör mig inte</translation>
 <translation id="683440813066116847">Regel som tillåter inkommande mDNS-trafik för Google Chrome Canary.</translation>
@@ -211,6 +219,7 @@
 <translation id="7242029209006116544">Du loggar in med ett hanterat konto och ger dess administratör kontroll över din Google Chrome-profil. Dina Chrome-uppgifter, t.ex. dina appar, bokmärken, din historik, dina lösenord och andra inställningar, knyts permanent till <ph name="USER_NAME" />. Du kommer att kunna ta bort dessa uppgifter via instrumentpanelen i Google Konton, men du kommer inte att kunna koppla dessa uppgifter till ett annat konto. Du kan skapa en ny profil om du vill hålla dina befintliga Chrome-uppgifter separata. <ph name="LEARN_MORE" /></translation>
 <translation id="729375352412857283">Den här datorn slutar snart ta emot uppdateringar för Google Chrome eftersom stödet för Windows XP och Windows Vista kommer att upphöra.</translation>
 <translation id="7339898014177206373">Nytt fönster</translation>
+<translation id="7393806081343982361">Google Chrome är din standardwebbläsare.</translation>
 <translation id="7398801000654795464">Du var inloggad i Chrome som <ph name="USER_EMAIL_ADDRESS" />. Använd samma konto när du loggar in igen.</translation>
 <translation id="7400722733683201933">Om Google Chrome</translation>
 <translation id="7408085963519505752">Villkor för Chrome OS</translation>
@@ -260,6 +269,7 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">Det styr också vilken sida som visas när du startar Chrome.</translation>
 <translation id="870251953148363156">Uppdatera &amp;Google Chrome</translation>
+<translation id="8793772303278047003">Den här versionen av Chrome är inaktuell.</translation>
 <translation id="8796108026289707191">Starta om Google Chrome nu.</translation>
 <translation id="8823341990149967727">Den här versionen av Chrome är inaktuell</translation>
 <translation id="884296878221830158">Det styr också vilken sida som visas när du startar Chrome eller klickar på knappen Startsida.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb
index 9c5b9a92..a234d15 100644
--- a/chrome/app/resources/google_chrome_strings_sw.xtb
+++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -25,6 +25,7 @@
 <translation id="1553358976309200471">Sasisha Chrome</translation>
 <translation id="1587223624401073077">Google Chrome inatumia kamera yako.</translation>
 <translation id="1619887657840448962">Ili kufanya Chrome salama zaidi, tumezima kiendelezi kinachofuata ambacho hakijaorodheshwa katika <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> na huenda kimeongezwa bila ridhaa yako.</translation>
+<translation id="1628000112320670027">Pata usaidizi wa kutumia Chrome</translation>
 <translation id="163860049029591106">Anza kutumia Chrome OS</translation>
 <translation id="1653828314016431939">Sawa - Anzisha upya sasa</translation>
 <translation id="1682634494516646069">Google Chrome haiwezi kusoma na kuandika kwenye saraka yake ya data:
@@ -47,6 +48,7 @@
 <translation id="2286950485307333924">Sasa umeingia katika Chrome</translation>
 <translation id="2290014774651636340">Funguo za API za Google zinakosekana. Baadhi ya utendaji wa Google Chrome utazimwa.</translation>
 <translation id="2290095356545025170">Je, una hakika kuwa ungependa kusanidua Google Chrome?</translation>
+<translation id="2309047409763057870">Huu ni usakinishaji wa pili wa Google Chrome, na haiwezi kufanywa kuwa kivinjari chako chaguo-msingi.</translation>
 <translation id="2316129865977710310">La, asante</translation>
 <translation id="2334084861041072223">Hakimiliki <ph name="YEAR" /> Google Inc. Haki zote zimehifadhiwa.</translation>
 <translation id="2346876346033403680">Awali mtu aliingia katika Chrome kwenye kompyuta hii kama <ph name="ACCOUNT_EMAIL_LAST" />. Iwapo hiyo sio akaunti yako, weka mtumiaji mwengine wa Chrome ili utenganishe maelezo yako.
@@ -70,6 +72,7 @@
 <translation id="2847461019998147611">Onyesha Google Chrome katika lugha hii</translation>
 <translation id="2871893339301912279">Umeingia kwenye Chrome!</translation>
 <translation id="2888126860611144412">Kuhusu Chrome</translation>
+<translation id="2900322993655997287">Google Chrome haijafaulu wala kuweka kivinjari chaguo-msingi.</translation>
 <translation id="2997147809295888909">Chrome ilithibitisha kuwa <ph name="ISSUER" /> ndiye mtoa cheti cha tovuti hii. Seva haikutoa maelezo yoyote ya Cheti cha Uwazi.</translation>
 <translation id="3037838751736561277">Google Chrome iko katika hali ya chini chini.</translation>
 <translation id="3047079729301751317">Kuondoa <ph name="USERNAME" /> kutafuta historia, alamisho, mipangilio, na data zako nyingine kwenye Chrome zilizohifadhiwa kwenye kifaa hiki. Data iliyohifadhiwa katika Akaunti ya Google haitafutwa na inaweza kudhibitiwa kwenye <ph name="GOOGLE_DASHBOARD_LINK" />Dashibodi ya Google<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
@@ -86,6 +89,7 @@
 <translation id="3282568296779691940">Ingia katika Chrome</translation>
 <translation id="3311976847535831054">Kompyuta hii haitapokea tena sasisho za Google Chrome za 32-bit. Tafadhali pata toleo jipya la Google Chrome la 64-bit.</translation>
 <translation id="3360895254066713204">Msaidizi wa Chrome</translation>
+<translation id="3395323229510056640">Pata usaidizi wa kutumia mfumo wa uendeshaji wa Chrome</translation>
 <translation id="3396977131400919238">Hitilafu ya mfumo wa uendeshaji imetokea wakati wa kusanidi. Tafadhali pakua Google Chrome tena.</translation>
 <translation id="3398288718845740432">Ficha katika Menyu ya Chrome</translation>
 <translation id="3451115285585441894">Inaongeza kwenye Chrome...</translation>
@@ -141,7 +145,9 @@
 <translation id="5170938038195470297">Wasifu wako huenda usitumike kwa sababu unatoka katika toleo jipya la Google Chrome.
 
 Huenda baadhi ya vipengele visipatikane. Tafadhali bainisha saraka tofauti ya wasifu au tumia toleo jipya la Chrome.</translation>
+<translation id="5176234269072261959">Saidia kuboresha Chrome kwa kuripoti kuhusu mipangilio ya sasa.</translation>
 <translation id="5204098752394657250">Sheria na Masharti za <ph name="TERMS_OF_SERVICE_LINK" />Google Chrome<ph name="END_TERMS_OF_SERVICE_LINK" /></translation>
+<translation id="5243785881901838525">Google Payments (imenakiliwa kwenye Chrome)</translation>
 <translation id="5251420635869119124">Walioalikwa wanaweza kutumia Chrome bila kuacha chochote nyuma.</translation>
 <translation id="5253588388888612165">Ukishiriki kompyuta hii na <ph name="PROFILE_NAME" />, jiongeze kwenye Chrome ili uvinjari tofauti. Vinginevyo ondoa Akaunti yake ya Google.</translation>
 <translation id="5284703908158630707">{SECONDS,plural, =1{Google Chrome itazimika na kuwaka tena baada ya sekunde 1.}other{Google Chrome itazimika na kuwaka tena baada ya sekunde #.}}</translation>
@@ -177,6 +183,7 @@
 <translation id="6235018212288296708">Sheria ya ndani ya Google Chrome ili kuruhusu trafiki ya mDNS.</translation>
 <translation id="6236285698028833233">Google Chrome imekoma kusasisha na haiwezi kutumiwa tena na toleo hili la mfumo wako wa uendeshaji.</translation>
 <translation id="629218512217695915">Tumia nenosiri lililozalishwa na Chrome</translation>
+<translation id="6338556085225130112">Inasasisha Google Chrome</translation>
 <translation id="6368805772029492593">Kwa usalama ulioongezwa, Google Chrome itasimba data yako kwa njia fiche.</translation>
 <translation id="6368958679917195344">Chrome OS imewezeshwa na programu ya ziada ya <ph name="BEGIN_LINK_CROS_OSS" />programu huria<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="6400076122676892962">Kompyuta hii itaacha kupokea sasisho za Google Chrome hivi karibuni kwa sababu Mac OS X 10.6, 10.7, na 10.8 hazitatumika tena.</translation>
@@ -186,6 +193,7 @@
 <translation id="6600954340915313787">Imenakiliwa kwenye Chrome</translation>
 <translation id="6626317981028933585">Yasikitisha, mipangilio ya Mozilla Firefox haipatikani kivinjari hicho kikiwa kinatumika. Kuingiza mipangilio hiyo kwa Google Chrome, hifadhi kazi yako na ufunge madirisha yote ya Firefox. Kisha bofya Endelea.</translation>
 <translation id="6634887557811630702">Google Chrome imesasishwa.</translation>
+<translation id="6648058004052854464">Google Chrome haikuwekwa kuwa kivinjari chaguo-msingi.</translation>
 <translation id="6676384891291319759">Fika kwenye wavuti</translation>
 <translation id="6757767188268205357">Usinisumbue</translation>
 <translation id="683440813066116847">Sheria ya ndani ya Google Chrome Canary ili kuruhusu trafiki ya mDNS.</translation>
@@ -211,6 +219,7 @@
 <translation id="7242029209006116544">Unaingia katika akaunti ykitumia akaunti inayodhibitiwa na kumpa msimamizi wa akaunti hiyo udhibiti wa wasifu wako kwenye Google Chrome. Data yako ya Chrome, kama vile programu zako, alamisho, historia, manenosiri, na mipangilio mingine itahishwa na <ph name="USER_NAME" /> daima. Utaweza kufuta data hii kupitia Dashibodi ya Akaunti za Google, lakini hutaweza kuhusisha data hii na akaunti nyingine. Unaweza kuunda kwa hiari wasifu mpya ili kuweka data yako ya Chrome iliyo kando. <ph name="LEARN_MORE" /></translation>
 <translation id="729375352412857283">Kompyuta hii itaacha kupokea sasisho za Google Chrome hivi karibuni kwa sababu Windows XP na Windows Vista hazitatumika tena.</translation>
 <translation id="7339898014177206373">Dirisha jipya</translation>
+<translation id="7393806081343982361">Google Chrome ni kivinjari chako chaguo-msingi. Hongera!</translation>
 <translation id="7398801000654795464">Uliingia kwenye Chrome kama <ph name="USER_EMAIL_ADDRESS" />. Tafadhali tumia akaunti sawa ili kuingia tena.</translation>
 <translation id="7400722733683201933">Kuhusu Google Chrome</translation>
 <translation id="7408085963519505752">Masharti ya Chrome OS</translation>
@@ -260,6 +269,7 @@
 <translation id="8669527147644353129">Msaidizi wa Google Chrome</translation>
 <translation id="8679801911857917785">Pia inadhibiti ukurasa unaoonyeshwa unapoanzisha Chrome.</translation>
 <translation id="870251953148363156">Sasisha &amp;Google Chrome</translation>
+<translation id="8793772303278047003">Toleo hili la Chrome limeisha muda wa matumizi.</translation>
 <translation id="8796108026289707191">Unapaswa kuzima na kuwasha Google Chrome sasa.</translation>
 <translation id="8823341990149967727">Toleo hili la Chrome Limepitwa na Wakati</translation>
 <translation id="884296878221830158">Pia inadhibiti ukurasa unaoonyeshwa unapoanzisha Chrome au unapobofya kitufe cha Mwanzo.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb
index 66b12756..f15348e 100644
--- a/chrome/app/resources/google_chrome_strings_vi.xtb
+++ b/chrome/app/resources/google_chrome_strings_vi.xtb
@@ -23,6 +23,7 @@
 <translation id="1553358976309200471">Cập nhật Chrome</translation>
 <translation id="1587223624401073077">Google Chrome đang sử dụng máy ảnh của bạn.</translation>
 <translation id="1619887657840448962">Để làm cho Chrome an toàn hơn, chúng tôi đã vô hiệu hóa tiện ích không được liệt kê trong <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> và có thể đã được thêm mà bạn không biết.</translation>
+<translation id="1628000112320670027">Nhận trợ giúp về Chrome</translation>
 <translation id="163860049029591106">Bắt đầu với Chrome OS</translation>
 <translation id="1653828314016431939">OK - Khởi động lại ngay bây giờ</translation>
 <translation id="1682634494516646069">Google Chrome không thể đọc và ghi vào thư mục dữ liệu:
@@ -45,6 +46,7 @@
 <translation id="2286950485307333924">Bạn hiện đã đăng nhập vào Chrome</translation>
 <translation id="2290014774651636340">Khóa API của Google bị thiếu. Một số chức năng của Google Chrome sẽ bị tắt.</translation>
 <translation id="2290095356545025170">Bạn có chắc chắn muốn gỡ cài đặt Google Chrome không?</translation>
+<translation id="2309047409763057870">Đây là cài đặt thứ cấp của Google Chrome và không thể trở thành trình duyệt mặc định của bạn.</translation>
 <translation id="2316129865977710310">Không, cảm ơn</translation>
 <translation id="2334084861041072223">Bản quyền <ph name="YEAR" /> Google Inc. Mọi quyền được bảo lưu.</translation>
 <translation id="2346876346033403680">Ai đó trước đây đã đăng nhập vào Chrome trên máy tính này là <ph name="ACCOUNT_EMAIL_LAST" />. Nếu đó không phải là tài khoản của bạn, hãy tạo người dùng Chrome mới để giữ riêng biệt thông tin của bạn.
@@ -68,6 +70,7 @@
 <translation id="2847461019998147611">Hiển thị Google Chrome bằng ngôn ngữ này</translation>
 <translation id="2871893339301912279">Bạn đã đăng nhập vào Chrome!</translation>
 <translation id="2888126860611144412">Giới thiệu Chrome</translation>
+<translation id="2900322993655997287">Google Chrome không thể xác định hoặc đặt trình duyệt mặc định.</translation>
 <translation id="2997147809295888909">Chrome đã xác minh rằng <ph name="ISSUER" /> cấp chứng chỉ của trang web này. Máy chủ không cung cấp bất kỳ thông tin nào về Tính minh mạch của chứng chỉ.</translation>
 <translation id="3037838751736561277">Google Chrome đang chạy trong nền.</translation>
 <translation id="3047079729301751317">Ngắt kết nối <ph name="USERNAME" /> sẽ xóa lịch sử, dấu trang, cài đặt và các dữ liệu Chrome khác của bạn trên thiết bị này. Dữ liệu được lưu trữ trong tài khoản Google của bạn sẽ không bị xóa và có thể được quản lý trên <ph name="GOOGLE_DASHBOARD_LINK" />Trang tổng quan của Google<ph name="END_GOOGLE_DASHBOARD_LINK" />.</translation>
@@ -84,6 +87,7 @@
 <translation id="3282568296779691940">Đăng nhập Chrome</translation>
 <translation id="3311976847535831054">Máy tính này sẽ không còn nhận bản cập nhật Google Chrome 32 bit nữa. Vui lòng nâng cấp lên Google Chrome 64 bit.</translation>
 <translation id="3360895254066713204">Trình trợ giúp của Chrome</translation>
+<translation id="3395323229510056640">Nhận trợ giúp về Chrome OS</translation>
 <translation id="3396977131400919238">Đã xảy ra lỗi hệ điều hành trong quá trình cài đặt. Vui lòng tải xuống lại Google Chrome.</translation>
 <translation id="3398288718845740432">Ẩn trong menu Chrome</translation>
 <translation id="3451115285585441894">Đang thêm vào Chrome...</translation>
@@ -140,7 +144,9 @@
 <translation id="5170938038195470297">Không thể sử dụng hồ sơ của bạn vì hồ sơ được tạo từ phiên bản Google Chrome mới hơn.
 
 Một số tính năng có thể không khả dụng. Vui lòng chỉ định thư mục hồ sơ khác hoặc sử dụng phiên bản Chrome mới hơn.</translation>
+<translation id="5176234269072261959">Giúp cải thiện Google Chrome bằng cách báo cáo cài đặt hiện tại.</translation>
 <translation id="5204098752394657250"><ph name="TERMS_OF_SERVICE_LINK" />Điều khoản dịch vụ<ph name="END_TERMS_OF_SERVICE_LINK" /> của Google Chrome</translation>
+<translation id="5243785881901838525">Google Payments (đã sao chép vào Chrome)</translation>
 <translation id="5251420635869119124">Khách có thể sử dụng Chrome mà không phải thoát khỏi bất cứ nội dung nào.</translation>
 <translation id="5253588388888612165">Nếu bạn chia sẻ máy tính này với <ph name="PROFILE_NAME" />, hãy thêm chính mình vào Chrome để duyệt web riêng biệt. Nếu không, hãy ngắt kết nối tài khoản Google của họ.</translation>
 <translation id="5284703908158630707">{SECONDS,plural, =1{Google Chrome sẽ khởi động lại sau 1 giây.}other{Google Chrome sẽ khởi động lại sau # giây.}}</translation>
@@ -174,6 +180,7 @@
 <translation id="6235018212288296708">Quy tắc kết nối để Google Chrome cho phép lưu lượng truy cập mDNS.</translation>
 <translation id="6236285698028833233">Google Chrome đã ngừng cập nhật và không còn hỗ trợ phiên bản này của hệ điều hành của bạn.</translation>
 <translation id="629218512217695915">Sử dụng mật khẩu do Chrome tạo</translation>
+<translation id="6338556085225130112">Đang cập nhật Google Chrome</translation>
 <translation id="6368805772029492593">Để bảo mật hơn, Google Chrome sẽ mã hóa dữ liệu của bạn.</translation>
 <translation id="6368958679917195344">Chrome OS trở nên khả thi là nhờ <ph name="BEGIN_LINK_CROS_OSS" />phần mềm nguồn mở<ph name="END_LINK_CROS_OSS" /> bổ sung.</translation>
 <translation id="6400076122676892962">Máy tính này sắp dừng nhận bản cập nhật Google Chrome do Mac OS X 10.6, 10.7 và 10.8 sẽ không được hỗ trợ nữa.</translation>
@@ -183,6 +190,7 @@
 <translation id="6600954340915313787">Đã sao chép vào Chrome</translation>
 <translation id="6626317981028933585">Thật đáng tiếc, cài đặt Mozilla Firefox của bạn không có sẵn khi trình duyệt đang chạy. Để nhập những cài đặt đó vào Google Chrome, hãy lưu công việc của bạn và đóng tất cả cửa sổ Firefox. Sau đó, nhấp Tiếp tục.</translation>
 <translation id="6634887557811630702">Google Chrome đã được cập nhật.</translation>
+<translation id="6648058004052854464">Google Chrome không thể trở thành trình duyệt mặc định.</translation>
 <translation id="6676384891291319759">Truy cập Internet</translation>
 <translation id="6757767188268205357">Đừng hỏi lại</translation>
 <translation id="683440813066116847">Quy tắc kết nối để Google Chrome Canary cho phép lưu lượng truy cập mDNS.</translation>
@@ -208,6 +216,7 @@
 <translation id="7242029209006116544">Bạn đang đăng nhập bằng tài khoản được quản lý và cấp cho quản trị viên của tài khoản quyền kiểm soát cấu hình trên Google Chrome của bạn. Dữ liệu Chrome của bạn, chẳng hạn như ứng dụng, dấu trang, lịch sử, mật khẩu và các cài đặt khác sẽ vĩnh viễn được liên kết với <ph name="USER_NAME" />. Bạn có thể xóa dữ liệu này thông qua Trang tổng quan của tài khoản Google nhưng không thể liên kết dữ liệu này với tài khoản khác. Bạn có thể tùy chọn tạo một cấu hình mới để giữ cho dữ liệu Chrome hiện có của bạn riêng biệt. <ph name="LEARN_MORE" /></translation>
 <translation id="729375352412857283">Máy tính này sắp dừng nhận bản cập nhật Google Chrome do Windows XP và Windows Vista sẽ không được hỗ trợ nữa.</translation>
 <translation id="7339898014177206373">Cửa sổ mới</translation>
+<translation id="7393806081343982361">Google Chrome là trình duyệt mặc định của bạn. Tuyệt vời!</translation>
 <translation id="7398801000654795464">Bạn đã đăng nhập vào Chrome là <ph name="USER_EMAIL_ADDRESS" />. Vui lòng sử dụng cùng tài khoản để đăng nhập lại.</translation>
 <translation id="7400722733683201933">Giới thiệu về Google Chrome</translation>
 <translation id="7408085963519505752">Điều khoản của Chrome OS</translation>
@@ -257,6 +266,7 @@
 <translation id="8669527147644353129">Trình trợ giúp của Google Chrome</translation>
 <translation id="8679801911857917785">Tiện ích này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chrome.</translation>
 <translation id="870251953148363156">Cập nhật &amp;Google Chrome</translation>
+<translation id="8793772303278047003">Chrome đã lỗi thời.</translation>
 <translation id="8796108026289707191">Bạn phải khởi động lại Google Chrome ngay bây giờ.</translation>
 <translation id="8823341990149967727">Chrome đã lỗi thời</translation>
 <translation id="884296878221830158">Tiện ích này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chrome hoặc nhấp vào nút Trang chủ.</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index d4f18e5..15d60541 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -463,6 +463,7 @@
       "//chrome/browser/sync_file_system/drive_backend:sync_file_system_drive_proto",
       "//chrome/common/extensions/api",
       "//chrome/common/extensions/api:api_registration",
+      "//chrome/common/extensions/api:extensions_features",
       "//components/drive:drive",
       "//components/proximity_auth/ble",
       "//components/proximity_auth/cryptauth",
diff --git a/chrome/browser/android/data_usage/data_use_tab_helper.cc b/chrome/browser/android/data_usage/data_use_tab_helper.cc
index 0e503ad..7bfd8b69 100644
--- a/chrome/browser/android/data_usage/data_use_tab_helper.cc
+++ b/chrome/browser/android/data_usage/data_use_tab_helper.cc
@@ -51,9 +51,9 @@
   // The last committed navigation entry should correspond to the current
   // navigation. This should not be null since the DidFinishNavigation
   // callback is received for a committed navigation.
-  auto navigation_entry = navigation_handle->GetWebContents()
-                              ->GetController()
-                              .GetLastCommittedEntry();
+  auto* navigation_entry = navigation_handle->GetWebContents()
+                               ->GetController()
+                               .GetLastCommittedEntry();
   DCHECK(navigation_entry);
   DCHECK_EQ(navigation_handle->GetURL(), navigation_entry->GetURL());
   data_use_ui_tab_model->ReportBrowserNavigation(
diff --git a/chrome/browser/android/download/chrome_download_delegate.cc b/chrome/browser/android/download/chrome_download_delegate.cc
index c592446..5c9e7d6f 100644
--- a/chrome/browser/android/download/chrome_download_delegate.cc
+++ b/chrome/browser/android/download/chrome_download_delegate.cc
@@ -206,7 +206,7 @@
 void Init(JNIEnv* env,
           const JavaParamRef<jobject>& obj,
           const JavaParamRef<jobject>& jweb_contents) {
-  auto web_contents = WebContents::FromJavaWebContents(jweb_contents);
+  auto* web_contents = WebContents::FromJavaWebContents(jweb_contents);
   ChromeDownloadDelegate::CreateForWebContents(web_contents);
   ChromeDownloadDelegate::FromWebContents(web_contents)->SetJavaRef(env, obj);
 }
diff --git a/chrome/browser/android/download/download_manager_service.cc b/chrome/browser/android/download/download_manager_service.cc
index b5e73442..6a5503d 100644
--- a/chrome/browser/android/download/download_manager_service.cc
+++ b/chrome/browser/android/download/download_manager_service.cc
@@ -79,10 +79,11 @@
 void DownloadManagerService::ResumeDownload(
     JNIEnv* env,
     jobject obj,
-    const JavaParamRef<jstring>& jdownload_guid) {
+    const JavaParamRef<jstring>& jdownload_guid,
+    bool is_off_the_record) {
   std::string download_guid = ConvertJavaStringToUTF8(env, jdownload_guid);
-  if (is_history_query_complete_)
-    ResumeDownloadInternal(download_guid);
+  if (is_history_query_complete_ || is_off_the_record)
+    ResumeDownloadInternal(download_guid, is_off_the_record);
   else
     EnqueueDownloadAction(download_guid, RESUME);
 }
@@ -90,10 +91,11 @@
 void DownloadManagerService::PauseDownload(
     JNIEnv* env,
     jobject obj,
-    const JavaParamRef<jstring>& jdownload_guid) {
+    const JavaParamRef<jstring>& jdownload_guid,
+    bool is_off_the_record) {
   std::string download_guid = ConvertJavaStringToUTF8(env, jdownload_guid);
-  if (is_history_query_complete_)
-    PauseDownloadInternal(download_guid);
+  if (is_history_query_complete_ || is_off_the_record)
+    PauseDownloadInternal(download_guid, is_off_the_record);
   else
     EnqueueDownloadAction(download_guid, PAUSE);
 }
@@ -149,20 +151,12 @@
     bool is_off_the_record,
     bool is_notification_dismissed) {
   std::string download_guid = ConvertJavaStringToUTF8(env, jdownload_guid);
-
   DownloadController::RecordDownloadCancelReason(
       is_notification_dismissed ?
           DownloadController::CANCEL_REASON_NOTIFICATION_DISMISSED :
           DownloadController::CANCEL_REASON_ACTION_BUTTON);
-  // Incognito download can only be cancelled in the same browser session, no
-  // need to wait for download history.
-  if (is_off_the_record) {
-    CancelDownloadInternal(download_guid, true);
-    return;
-  }
-
-  if (is_history_query_complete_)
-    CancelDownloadInternal(download_guid, false);
+  if (is_history_query_complete_ || is_off_the_record)
+    CancelDownloadInternal(download_guid, is_off_the_record);
   else
     EnqueueDownloadAction(download_guid, CANCEL);
 }
@@ -175,10 +169,10 @@
     std::string download_guid = iter->first;
     switch (action) {
       case RESUME:
-        ResumeDownloadInternal(download_guid);
+        ResumeDownloadInternal(download_guid, false);
         break;
       case PAUSE:
-        PauseDownloadInternal(download_guid);
+        PauseDownloadInternal(download_guid, false);
         break;
       case CANCEL:
         CancelDownloadInternal(download_guid, false);
@@ -195,8 +189,8 @@
 }
 
 void DownloadManagerService::ResumeDownloadInternal(
-    const std::string& download_guid) {
-  content::DownloadManager* manager = GetDownloadManager(false);
+    const std::string& download_guid, bool is_off_the_record) {
+  content::DownloadManager* manager = GetDownloadManager(is_off_the_record);
   if (!manager) {
     OnResumptionFailed(download_guid);
     return;
@@ -229,8 +223,8 @@
 }
 
 void DownloadManagerService::PauseDownloadInternal(
-    const std::string& download_guid) {
-  content::DownloadManager* manager = GetDownloadManager(false);
+    const std::string& download_guid, bool is_off_the_record) {
+  content::DownloadManager* manager = GetDownloadManager(is_off_the_record);
   if (!manager)
     return;
   content::DownloadItem* item = manager->GetDownloadByGuid(download_guid);
diff --git a/chrome/browser/android/download/download_manager_service.h b/chrome/browser/android/download/download_manager_service.h
index 8fc59b5..1887d08c 100644
--- a/chrome/browser/android/download/download_manager_service.h
+++ b/chrome/browser/android/download/download_manager_service.h
@@ -41,7 +41,8 @@
   // |jdownload_guid|..
   void ResumeDownload(JNIEnv* env,
                       jobject obj,
-                      const JavaParamRef<jstring>& jdownload_guid);
+                      const JavaParamRef<jstring>& jdownload_guid,
+                      bool is_off_the_record);
 
   // Called to cancel a download item that has GUID equal to |jdownload_guid|.
   // If the DownloadItem is not yet created, retry after a while.
@@ -55,7 +56,8 @@
   // If the DownloadItem is not yet created, do nothing as it is already paused.
   void PauseDownload(JNIEnv* env,
                      jobject obj,
-                     const JavaParamRef<jstring>& jdownload_guid);
+                     const JavaParamRef<jstring>& jdownload_guid,
+                     bool is_off_the_record);
 
   // Called to request that the DownloadManagerService return data about all
   // downloads in the user's history.
@@ -73,14 +75,16 @@
   friend class DownloadManagerServiceTest;
 
   // Helper function to start the download resumption.
-  void ResumeDownloadInternal(const std::string& download_guid);
+  void ResumeDownloadInternal(const std::string& download_guid,
+                              bool is_off_the_record);
 
   // Helper function to cancel a download.
   void CancelDownloadInternal(const std::string& download_guid,
                               bool is_off_the_record);
 
   // Helper function to pause a download.
-  void PauseDownloadInternal(const std::string& download_guid);
+  void PauseDownloadInternal(const std::string& download_guid,
+                             bool is_off_the_record);
 
   // Helper function to send info about all downloads to the Java-side.
   void GetAllDownloadsInternal();
diff --git a/chrome/browser/android/download/download_manager_service_unittest.cc b/chrome/browser/android/download/download_manager_service_unittest.cc
index 1201291..f4430be9 100644
--- a/chrome/browser/android/download/download_manager_service_unittest.cc
+++ b/chrome/browser/android/download/download_manager_service_unittest.cc
@@ -77,7 +77,8 @@
         env, nullptr,
         JavaParamRef<jstring>(
             env,
-            base::android::ConvertUTF8ToJavaString(env, download_guid).obj()));
+            base::android::ConvertUTF8ToJavaString(env, download_guid).obj()),
+        false);
     EXPECT_FALSE(success_);
     service_->OnHistoryQueryComplete();
     while (!finished_)
diff --git a/chrome/browser/android/ntp/most_visited_sites_bridge.cc b/chrome/browser/android/ntp/most_visited_sites_bridge.cc
index 73e68b4..1040bc1f 100644
--- a/chrome/browser/android/ntp/most_visited_sites_bridge.cc
+++ b/chrome/browser/android/ntp/most_visited_sites_bridge.cc
@@ -64,7 +64,7 @@
 bool MostVisitedSitesBridge::SupervisorBridge::IsBlocked(const GURL& url) {
   SupervisedUserService* supervised_user_service =
       SupervisedUserServiceFactory::GetForProfile(profile_);
-  auto url_filter = supervised_user_service->GetURLFilterForUIThread();
+  auto* url_filter = supervised_user_service->GetURLFilterForUIThread();
   return url_filter->GetFilteringBehaviorForURL(url) ==
          SupervisedUserURLFilter::FilteringBehavior::BLOCK;
 }
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm
index f482d56c..0568b6a 100644
--- a/chrome/browser/app_controller_mac.mm
+++ b/chrome/browser/app_controller_mac.mm
@@ -968,11 +968,6 @@
                            currentProfile:lastProfile];
           break;
         }
-#if defined(GOOGLE_CHROME_BUILD)
-        case IDC_FEEDBACK:
-          enable = NO;
-          break;
-#endif
         default:
           enable = menuState_->IsCommandEnabled(tag) ?
                    ![self keyWindowIsModal] : NO;
diff --git a/chrome/browser/background/background_mode_manager.cc b/chrome/browser/background/background_mode_manager.cc
index daf22d2..e41b14b 100644
--- a/chrome/browser/background/background_mode_manager.cc
+++ b/chrome/browser/background/background_mode_manager.cc
@@ -23,6 +23,7 @@
 #include "build/build_config.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/background/background_application_list_model.h"
+#include "chrome/browser/background/background_mode_optimizer.h"
 #include "chrome/browser/background/background_trigger.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_shutdown.h"
@@ -92,6 +93,9 @@
 }
 }  // namespace
 
+// static
+bool BackgroundModeManager::should_restart_in_background_ = false;
+
 BackgroundModeManager::BackgroundModeData::BackgroundModeData(
     Profile* profile,
     CommandIdHandlerVector* command_id_handler_vector)
@@ -318,6 +322,7 @@
     // in a mode that doesn't open a browser window. It will be resumed when the
     // first browser window is opened.
     SuspendBackgroundMode();
+    optimizer_ = BackgroundModeOptimizer::Create();
   }
 
   // If the -keep-alive-for-test flag is passed, then always keep chrome running
@@ -671,6 +676,7 @@
 //  BackgroundModeManager, private
 void BackgroundModeManager::ReleaseStartupKeepAliveCallback() {
   keep_alive_for_startup_.reset();
+  optimizer_ = BackgroundModeOptimizer::Create();
 }
 
 void BackgroundModeManager::ReleaseStartupKeepAlive() {
diff --git a/chrome/browser/background/background_mode_manager.h b/chrome/browser/background/background_mode_manager.h
index 8bfabe8..d17d8ada 100644
--- a/chrome/browser/background/background_mode_manager.h
+++ b/chrome/browser/background/background_mode_manager.h
@@ -26,6 +26,7 @@
 #include "content/public/browser/notification_registrar.h"
 #include "extensions/common/extension_id.h"
 
+class BackgroundModeOptimizer;
 class BackgroundTrigger;
 class Browser;
 class PrefRegistrySimple;
@@ -79,6 +80,16 @@
   // Opens a new browser window if there isn't one for the active desktop.
   static Browser* GetBrowserWindowForProfile(Profile* profile);
 
+  // Getter and setter for the flag indicating whether Chrome should start in
+  // background mode the next time.
+  static bool should_restart_in_background() {
+    return should_restart_in_background_;
+  }
+
+  static void set_should_restart_in_background(bool enable) {
+    should_restart_in_background_ = enable;
+  }
+
   // Returns true if background mode is active.
   virtual bool IsBackgroundModeActive();
 
@@ -314,7 +325,7 @@
   // and has a status bar icon.
   void StartBackgroundMode();
 
-  // Invoked to take Chrome out of KeepAlive mode - chrome stops running in
+  // Invoked to take Chrome out of KeepAlive mode - Chrome stops running in
   // the background and removes its status bar icon.
   void EndBackgroundMode();
 
@@ -389,6 +400,11 @@
   // if the profile isn't locked. Returns NULL otherwise.
   BackgroundModeData* GetBackgroundModeDataForLastProfile() const;
 
+  // Set to true when the next restart should be done in background mode.
+  // Static because its value is read after the background mode manager is
+  // destroyed.
+  static bool should_restart_in_background_;
+
   // Reference to the ProfileAttributesStorage. It is used to update the
   // background app status of profiles when they open/close background apps.
   ProfileAttributesStorage* profile_storage_;
@@ -431,6 +447,10 @@
   // chrome would immediately exit due to having no open windows.
   std::unique_ptr<ScopedKeepAlive> keep_alive_for_startup_;
 
+  // Reference to the optimizer to use to reduce Chrome's footprint when in
+  // background mode. If null, optimizations are disabled.
+  std::unique_ptr<BackgroundModeOptimizer> optimizer_;
+
   // Set to true when Chrome is running with the --keep-alive-for-test flag
   // (used for testing background mode without having to install a background
   // app).
diff --git a/chrome/browser/background/background_mode_manager_unittest.cc b/chrome/browser/background/background_mode_manager_unittest.cc
index ab89237..6da58ea 100644
--- a/chrome/browser/background/background_mode_manager_unittest.cc
+++ b/chrome/browser/background/background_mode_manager_unittest.cc
@@ -261,12 +261,14 @@
     // We're getting ready to shutdown the message loop. Clear everything out!
     base::RunLoop().RunUntilIdle();
 
-    test_keep_alive_.reset();
-
     // TestBackgroundModeManager has dependencies on the infrastructure.
     // It should get cleared first.
     manager_.reset();
 
+    // Now that the background manager is destroyed, the test KeepAlive can be
+    // cleared without having |manager_| attempt to perform optimizations.
+    test_keep_alive_.reset();
+
     // The Profile Manager references the Browser Process.
     // The Browser Process references the Notification UI Manager.
     // The Notification UI Manager references the Message Center.
diff --git a/chrome/browser/background/background_mode_optimizer.cc b/chrome/browser/background/background_mode_optimizer.cc
new file mode 100644
index 0000000..e3bbae8
--- /dev/null
+++ b/chrome/browser/background/background_mode_optimizer.cc
@@ -0,0 +1,89 @@
+// 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 "chrome/browser/background/background_mode_optimizer.h"
+
+#include "base/command_line.h"
+#include "base/feature_list.h"
+#include "base/memory/ptr_util.h"
+#include "chrome/browser/background/background_mode_manager.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/browser_shutdown.h"
+#include "chrome/browser/lifetime/application_lifetime.h"
+#include "chrome/browser/lifetime/keep_alive_registry.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/common/chrome_switches.h"
+
+BackgroundModeOptimizer::~BackgroundModeOptimizer() {
+  KeepAliveRegistry::GetInstance()->RemoveObserver(this);
+  BrowserList::RemoveObserver(this);
+}
+
+// static
+std::unique_ptr<BackgroundModeOptimizer> BackgroundModeOptimizer::Create() {
+  // If the -keep-alive-for-test flag is passed, then always keep chrome running
+  // in the background until the user explicitly terminates it.
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kKeepAliveForTest))
+    return nullptr;
+
+#if defined(OS_WIN) || defined(OS_LINUX)
+  if (base::FeatureList::IsEnabled(features::kBackgroundModeAllowRestart))
+    return base::WrapUnique(new BackgroundModeOptimizer());
+#endif  // defined(OS_WIN) || defined(OS_LINUX)
+
+  return nullptr;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//  KeepAliveRegistry implementation
+
+void BackgroundModeOptimizer::OnKeepAliveStateChanged(bool is_keeping_alive) {
+  // Nothing to do
+}
+
+void BackgroundModeOptimizer::OnKeepAliveRestartStateChanged(bool can_restart) {
+  if (can_restart)
+    TryBrowserRestart();
+}
+///////////////////////////////////////////////////////////////////////////////
+//  BrowserListObserver implementation
+
+void BackgroundModeOptimizer::OnBrowserAdded(Browser* browser) {
+  browser_was_added_ = true;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//  private methods
+
+BackgroundModeOptimizer::BackgroundModeOptimizer() : browser_was_added_(false) {
+  KeepAliveRegistry::GetInstance()->AddObserver(this);
+  BrowserList::AddObserver(this);
+}
+
+void BackgroundModeOptimizer::TryBrowserRestart() {
+  // Avoid unecessary restarts. Whether a browser window has been shown is
+  // our current heuristic to determine if it's worth it.
+  if (!browser_was_added_) {
+    DVLOG(1) << "TryBrowserRestart: Cancelled because no browser was added "
+             << "since the last restart";
+    return;
+  }
+
+  // If the application is already shutting down, do not turn it into a restart.
+  if (browser_shutdown::IsTryingToQuit() ||
+      browser_shutdown::GetShutdownType() != browser_shutdown::NOT_VALID) {
+    DVLOG(1) << "TryBrowserRestart: Cancelled because we are shutting down.";
+    return;
+  }
+
+  DVLOG(1) << "TryBrowserRestart: Restarting.";
+  DoRestart();
+}
+
+void BackgroundModeOptimizer::DoRestart() {
+  BackgroundModeManager::set_should_restart_in_background(true);
+  chrome::AttemptRestart();
+}
diff --git a/chrome/browser/background/background_mode_optimizer.h b/chrome/browser/background/background_mode_optimizer.h
new file mode 100644
index 0000000..b2468b1
--- /dev/null
+++ b/chrome/browser/background/background_mode_optimizer.h
@@ -0,0 +1,53 @@
+// 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 CHROME_BROWSER_BACKGROUND_BACKGROUND_MODE_OPTIMIZER_H_
+#define CHROME_BROWSER_BACKGROUND_BACKGROUND_MODE_OPTIMIZER_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "chrome/browser/lifetime/keep_alive_state_observer.h"
+#include "chrome/browser/ui/browser_list_observer.h"
+
+class Browser;
+
+// BackgroundModeOptimizer is responsible for applying some optimizations to
+// save resources (memory) when Chrome runs in background-only mode.
+// It tries to restart the browser to release accumulated memory when it
+// is considered non distruptive.
+class BackgroundModeOptimizer : public KeepAliveStateObserver,
+                                chrome::BrowserListObserver {
+ public:
+  ~BackgroundModeOptimizer() override;
+
+  // Creates a new BackgroundModeOptimizer. Can return null if optimizations
+  // are not supported.
+  static std::unique_ptr<BackgroundModeOptimizer> Create();
+
+  // KeepAliveStateObserver implementation
+  void OnKeepAliveStateChanged(bool is_keeping_alive) override;
+  void OnKeepAliveRestartStateChanged(bool can_restart) override;
+
+  // chrome::BrowserListObserver implementation.
+  void OnBrowserAdded(Browser* browser) override;
+
+ private:
+  friend class DummyBackgroundModeOptimizer;
+
+  BackgroundModeOptimizer();
+
+  // Calls DoRestart() if the current state of the process allows it.
+  void TryBrowserRestart();
+
+  // Stop the browser and restart it in background mode.
+  // Virtual for testing purposes.
+  virtual void DoRestart();
+
+  bool browser_was_added_;
+
+  DISALLOW_COPY_AND_ASSIGN(BackgroundModeOptimizer);
+};
+
+#endif  // CHROME_BROWSER_BACKGROUND_BACKGROUND_MODE_OPTIMIZER_H_
diff --git a/chrome/browser/background/background_mode_optimizer_unittest.cc b/chrome/browser/background/background_mode_optimizer_unittest.cc
new file mode 100644
index 0000000..e4b1f30
--- /dev/null
+++ b/chrome/browser/background/background_mode_optimizer_unittest.cc
@@ -0,0 +1,41 @@
+// 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 <memory>
+
+#include "chrome/browser/background/background_mode_optimizer.h"
+#include "chrome/browser/browser_shutdown.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+// Dummy optimizer that skips doing the restart.
+// friend with BackgroundModeOptimizer, can't be in the anonymous namespace.
+class DummyBackgroundModeOptimizer : public BackgroundModeOptimizer {
+ public:
+  DummyBackgroundModeOptimizer() {}
+  MOCK_METHOD0(DoRestart, void());
+};
+
+TEST(BackgroundModeOptimizerTest, Foo) {
+  // Strict mock, will fail the test if a non expected call is made.
+  testing::StrictMock<DummyBackgroundModeOptimizer> optimizer;
+
+  // No restart until we have at least one browser that got opened
+  optimizer.OnKeepAliveRestartStateChanged(true);
+
+  optimizer.OnBrowserAdded(nullptr);
+  EXPECT_CALL(optimizer, DoRestart()).RetiresOnSaturation();
+  optimizer.OnKeepAliveRestartStateChanged(true);
+
+  // Restart should not be called when we are trying to quit
+  browser_shutdown::SetTryingToQuit(true);
+  optimizer.OnKeepAliveRestartStateChanged(true);
+
+  // Restart should check that restart changed to be allowed.
+  browser_shutdown::SetTryingToQuit(false);
+  optimizer.OnKeepAliveRestartStateChanged(false);
+
+  EXPECT_CALL(optimizer, DoRestart()).RetiresOnSaturation();
+  optimizer.OnKeepAliveRestartStateChanged(true);
+}
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index 954c8a5..e6b375b3 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -124,6 +124,7 @@
             <include name="IDR_MD_DOWNLOADS_CONSTANTS_JS" file="resources\md_downloads\constants.js" type="BINDATA" />
             <include name="IDR_MD_DOWNLOADS_DOWNLOADS_JS" file="resources\md_downloads\downloads.js" type="BINDATA" />
             <include name="IDR_MD_DOWNLOADS_I18N_SETUP_HTML" file="resources\md_downloads\i18n_setup.html" type="BINDATA" />
+            <include name="IDR_MD_DOWNLOADS_ICONS_HTML" file="resources\md_downloads\icons.html" type="BINDATA" />
             <include name="IDR_MD_DOWNLOADS_ITEM_CSS" file="resources\md_downloads\item.css" type="BINDATA" flattenhtml="true" />
             <include name="IDR_MD_DOWNLOADS_ITEM_HTML" file="resources\md_downloads\item.html" type="BINDATA" />
             <include name="IDR_MD_DOWNLOADS_ITEM_JS" file="resources\md_downloads\item.js" type="BINDATA" />
diff --git a/chrome/browser/browser_shutdown.cc b/chrome/browser/browser_shutdown.cc
index ab8f9d7..c494792 100644
--- a/chrome/browser/browser_shutdown.cc
+++ b/chrome/browser/browser_shutdown.cc
@@ -47,6 +47,10 @@
 #include "chrome/browser/first_run/upgrade_util.h"
 #endif
 
+#if BUILDFLAG(ENABLE_BACKGROUND)
+#include "chrome/browser/background/background_mode_manager.h"
+#endif
+
 #if defined(ENABLE_RLZ)
 #include "components/rlz/rlz_tracker.h"
 #endif
@@ -194,7 +198,7 @@
   return restart_last_session;
 }
 
-void ShutdownPostThreadsStop(bool restart_last_session) {
+void ShutdownPostThreadsStop(int shutdown_flags) {
   delete g_browser_process;
   g_browser_process = NULL;
 
@@ -214,7 +218,7 @@
   }
 #endif
 
-  if (restart_last_session) {
+  if (shutdown_flags & RESTART_LAST_SESSION) {
 #if !defined(OS_CHROMEOS)
     // Make sure to relaunch the browser with the original command line plus
     // the Restore Last Session flag. Note that Chrome can be launched (ie.
@@ -239,6 +243,8 @@
       else
         new_cl->AppendSwitch(it.first);
     }
+    if (shutdown_flags & RESTART_IN_BACKGROUND)
+      new_cl->AppendSwitch(switches::kNoStartupWindow);
 
 #if defined(OS_POSIX) || defined(OS_WIN)
     upgrade_util::RelaunchChromeBrowser(*new_cl.get());
@@ -329,6 +335,24 @@
 
 void SetTryingToQuit(bool quitting) {
   g_trying_to_quit = quitting;
+
+  if (quitting)
+    return;
+
+  // Reset the restart-related preferences. They get set unconditionally through
+  // calls such as chrome::AttemptRestart(), and need to be reset if the restart
+  // attempt is cancelled.
+  PrefService* pref_service = g_browser_process->local_state();
+  if (pref_service) {
+#if !defined(OS_ANDROID)
+    pref_service->ClearPref(prefs::kWasRestarted);
+#endif  // !defined(OS_ANDROID)
+    pref_service->ClearPref(prefs::kRestartLastSessionOnShutdown);
+  }
+
+#if BUILDFLAG(ENABLE_BACKGROUND)
+  BackgroundModeManager::set_should_restart_in_background(false);
+#endif  // BUILDFLAG(ENABLE_BACKGROUND)
 }
 
 bool IsTryingToQuit() {
diff --git a/chrome/browser/browser_shutdown.h b/chrome/browser/browser_shutdown.h
index c345032..e3cf650 100644
--- a/chrome/browser/browser_shutdown.h
+++ b/chrome/browser/browser_shutdown.h
@@ -11,6 +11,20 @@
 
 namespace browser_shutdown {
 
+// Shutdown flags
+enum Flags {
+  NO_FLAGS = 0,
+
+  // If |RESTART_LAST_SESSION| is set, the browser will attempt to restart in
+  // in the last session after the shutdown.
+  RESTART_LAST_SESSION = 1 << 0,
+
+  // Makes a panned restart happen in the background. The browser will just come
+  // up in the system tray but not open a new window after restarting. This flag
+  // has no effect if |RESTART_LAST_SESSION| is not set.
+  RESTART_IN_BACKGROUND = 1 << 1
+};
+
 enum ShutdownType {
   // an uninitialized value
   NOT_VALID = 0,
@@ -41,9 +55,8 @@
 // Performs the remaining shutdown tasks after all threads but the
 // main thread have been stopped.  This includes deleting g_browser_process.
 //
-// The provided parameter indicates whether a preference to restart
-// the session was present.
-void ShutdownPostThreadsStop(bool restart_last_session);
+// See |browser_shutdown::Flags| for the possible flag values and their effects.
+void ShutdownPostThreadsStop(int shutdown_flags);
 #endif
 
 // Called at startup to create a histogram from our previous shutdown time.
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 1166a7f..203e732 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -235,6 +235,10 @@
 #include "components/nacl/browser/nacl_process_host.h"
 #endif  // !defined(DISABLE_NACL)
 
+#if BUILDFLAG(ENABLE_BACKGROUND)
+#include "chrome/browser/background/background_mode_manager.h"
+#endif  // BUILDFLAG(ENABLE_BACKGROUND)
+
 #if defined(ENABLE_EXTENSIONS)
 #include "chrome/browser/extensions/startup_helper.h"
 #include "extensions/browser/extension_protocols.h"
@@ -2035,11 +2039,24 @@
   // not finish.
   NOTREACHED();
 #else
+
+  int restart_flags = restart_last_session_
+                          ? browser_shutdown::RESTART_LAST_SESSION
+                          : browser_shutdown::NO_FLAGS;
+
+#if BUILDFLAG(ENABLE_BACKGROUND)
+  if (restart_flags) {
+    restart_flags |= BackgroundModeManager::should_restart_in_background()
+                         ? browser_shutdown::RESTART_IN_BACKGROUND
+                         : browser_shutdown::NO_FLAGS;
+  }
+#endif  // BUILDFLAG(ENABLE_BACKGROUND)
+
   browser_process_->PostDestroyThreads();
   // browser_shutdown takes care of deleting browser_process, so we need to
   // release it.
   ignore_result(browser_process_.release());
-  browser_shutdown::ShutdownPostThreadsStop(restart_last_session_);
+  browser_shutdown::ShutdownPostThreadsStop(restart_flags);
   master_prefs_.reset();
   process_singleton_.reset();
   device_event_log::Shutdown();
diff --git a/chrome/browser/chrome_browser_main_linux.cc b/chrome/browser/chrome_browser_main_linux.cc
index fe95885..16808f1 100644
--- a/chrome/browser/chrome_browser_main_linux.cc
+++ b/chrome/browser/chrome_browser_main_linux.cc
@@ -58,9 +58,10 @@
 
 #if !defined(OS_CHROMEOS)
   // Forward to os_crypt the flag to use a specific password store.
-  std::string password_store =
-      parsed_command_line().GetSwitchValueASCII(switches::kPasswordStore);
-  OSCrypt::SetStore(password_store);
+  OSCrypt::SetStore(
+      parsed_command_line().GetSwitchValueASCII(switches::kPasswordStore));
+  // Forward the product name
+  OSCrypt::SetProductName(l10n_util::GetStringUTF8(IDS_PRODUCT_NAME));
 #endif
 
   ChromeBrowserMainPartsPosix::PreProfileInit();
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 1ef0931..d311691 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -965,11 +965,10 @@
 #if defined(ENABLE_PRINTING)
   host->AddFilter(new printing::PrintingMessageFilter(id, profile));
 #endif
-  host->AddOwnedInterface(
-      base::MakeUnique<SearchProviderInstallStateImpl>(id, profile),
-      &SearchProviderInstallStateImpl::Bind,
+  host->GetInterfaceRegistry()->AddInterface(
+      base::Bind(&SearchProviderInstallStateImpl::Create, id, profile),
       content::BrowserThread::GetTaskRunnerForThread(
-          content::BrowserThread::IO));
+          content::BrowserThread::UI));
 #if defined(ENABLE_SPELLCHECK)
   host->AddFilter(new SpellCheckMessageFilter(id));
 #endif
@@ -2291,10 +2290,6 @@
   return g_browser_process->net_log();
 }
 
-bool ChromeContentBrowserClient::IsFastShutdownPossible() {
-  return true;
-}
-
 void ChromeContentBrowserClient::OverrideWebkitPrefs(
     RenderViewHost* rvh, WebPreferences* web_prefs) {
   Profile* profile = Profile::FromBrowserContext(
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index ae3be770..546792e 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -210,8 +210,6 @@
   content::SpeechRecognitionManagerDelegate*
   CreateSpeechRecognitionManagerDelegate() override;
   net::NetLog* GetNetLog() override;
-
-  bool IsFastShutdownPossible() override;
   void OverrideWebkitPrefs(content::RenderViewHost* rvh,
                            content::WebPreferences* prefs) override;
   void BrowserURLHandlerCreated(content::BrowserURLHandler* handler) override;
diff --git a/chrome/browser/chromeos/accessibility/accessibility_highlight_manager.cc b/chrome/browser/chromeos/accessibility/accessibility_highlight_manager.cc
index bc163f1..3af8b1f 100644
--- a/chrome/browser/chromeos/accessibility/accessibility_highlight_manager.cc
+++ b/chrome/browser/chromeos/accessibility/accessibility_highlight_manager.cc
@@ -139,7 +139,7 @@
 }
 
 void AccessibilityHighlightManager::UpdateFocusAndCaretHighlights() {
-  auto controller = AccessibilityFocusRingController::GetInstance();
+  auto* controller = AccessibilityFocusRingController::GetInstance();
 
   // The caret highlight takes precedence over the focus highlight if
   // both are visible.
diff --git a/chrome/browser/chromeos/arc/arc_auth_service.cc b/chrome/browser/chromeos/arc/arc_auth_service.cc
index cfa5038..daa7594 100644
--- a/chrome/browser/chromeos/arc/arc_auth_service.cc
+++ b/chrome/browser/chromeos/arc/arc_auth_service.cc
@@ -127,6 +127,7 @@
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
   registry->RegisterBooleanPref(prefs::kArcSignedIn, false);
   registry->RegisterBooleanPref(prefs::kArcBackupRestoreEnabled, true);
+  registry->RegisterBooleanPref(prefs::kArcLocationServiceEnabled, true);
 }
 
 // static
@@ -257,6 +258,8 @@
   UpdateProvisioningTiming(base::Time::Now() - sign_in_time_, true,
                            IsAccountManaged(profile_));
   UpdateProvisioningResultUMA(ProvisioningResult::SUCCESS);
+
+  FOR_EACH_OBSERVER(Observer, observer_list_, OnInitialStart());
 }
 
 void ArcAuthService::OnSignInFailed(arc::mojom::ArcSignInFailureReason reason) {
diff --git a/chrome/browser/chromeos/arc/arc_auth_service.h b/chrome/browser/chromeos/arc/arc_auth_service.h
index 47433878..af4f90a 100644
--- a/chrome/browser/chromeos/arc/arc_auth_service.h
+++ b/chrome/browser/chromeos/arc/arc_auth_service.h
@@ -86,6 +86,9 @@
 
     // Called to notify that ARC enabled state has been updated.
     virtual void OnOptInEnabled(bool enabled) {}
+
+    // Called to notify that ARC has been initialized successfully.
+    virtual void OnInitialStart() {}
   };
 
   explicit ArcAuthService(ArcBridgeService* bridge_service);
diff --git a/chrome/browser/chromeos/arc/arc_navigation_throttle.h b/chrome/browser/chromeos/arc/arc_navigation_throttle.h
index 78181703..0690af2a 100644
--- a/chrome/browser/chromeos/arc/arc_navigation_throttle.h
+++ b/chrome/browser/chromeos/arc/arc_navigation_throttle.h
@@ -23,10 +23,6 @@
 
 namespace arc {
 
-// Restricts the amount of apps displayed to the user without the need of a
-// ScrollView.
-constexpr size_t kMaxAppResults = 3;
-
 // A class that allow us to retrieve ARC app's information and handle URL
 // traffic initiated on Chrome browser, either on Chrome or an ARC's app.
 class ArcNavigationThrottle : public content::NavigationThrottle {
@@ -43,6 +39,10 @@
     SIZE,
   };
 
+  // Restricts the amount of apps displayed to the user without the need of a
+  // ScrollView.
+  enum { kMaxAppResults = 3 };
+
   using NameAndIcon = std::pair<std::string, gfx::Image>;
   using ShowDisambigDialogCallback =
       base::Callback<void(content::NavigationHandle* handle,
diff --git a/chrome/browser/chromeos/arc/arc_policy_bridge.cc b/chrome/browser/chromeos/arc/arc_policy_bridge.cc
index e154398..b65dac8 100644
--- a/chrome/browser/chromeos/arc/arc_policy_bridge.cc
+++ b/chrome/browser/chromeos/arc/arc_policy_bridge.cc
@@ -306,7 +306,7 @@
       user_manager::UserManager::Get()->GetPrimaryUser();
   Profile* const profile =
       chromeos::ProfileHelper::Get()->GetProfileByUser(primary_user);
-  auto profile_policy_connector =
+  auto* profile_policy_connector =
       policy::ProfilePolicyConnectorFactory::GetForBrowserContext(profile);
   policy_service_ = profile_policy_connector->policy_service();
   is_managed_ = profile_policy_connector->IsManaged();
diff --git a/chrome/browser/chromeos/arc/arc_process_service.cc b/chrome/browser/chromeos/arc/arc_process_service.cc
index aa8ec507..78a203c3e 100644
--- a/chrome/browser/chromeos/arc/arc_process_service.cc
+++ b/chrome/browser/chromeos/arc/arc_process_service.cc
@@ -98,10 +98,10 @@
     mojo::Array<arc::mojom::RunningAppProcessInfoPtr> mojo_processes) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-  auto raw_processes = new vector<mojom::RunningAppProcessInfoPtr>();
+  auto* raw_processes = new vector<mojom::RunningAppProcessInfoPtr>();
   mojo_processes.Swap(raw_processes);
 
-  auto ret_processes = new vector<ArcProcess>();
+  auto* ret_processes = new vector<ArcProcess>();
   // Post to its dedicated worker thread to avoid race condition.
   // Since no two tasks with the same token should be run at the same.
   // Note: GetSequencedTaskRunner's shutdown behavior defaults to
diff --git a/chrome/browser/chromeos/arc/arc_settings_service.cc b/chrome/browser/chromeos/arc/arc_settings_service.cc
index 8c314d6..f4ff00f 100644
--- a/chrome/browser/chromeos/arc/arc_settings_service.cc
+++ b/chrome/browser/chromeos/arc/arc_settings_service.cc
@@ -10,6 +10,7 @@
 #include "base/json/json_writer.h"
 #include "base/strings/stringprintf.h"
 #include "base/values.h"
+#include "chrome/browser/chromeos/arc/arc_auth_service.h"
 #include "chrome/browser/chromeos/settings/cros_settings.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/common/pref_names.h"
@@ -63,7 +64,8 @@
 // about and sends the new values to Android to keep the state in sync.
 class ArcSettingsServiceImpl
     : public chromeos::system::TimezoneSettings::Observer,
-      public device::BluetoothAdapter::Observer {
+      public device::BluetoothAdapter::Observer,
+      public ArcAuthService::Observer {
  public:
   explicit ArcSettingsServiceImpl(ArcBridgeService* arc_bridge_service);
   ~ArcSettingsServiceImpl() override;
@@ -72,13 +74,16 @@
   // Obtains the new pref value and sends it to Android.
   void OnPrefChanged(const std::string& pref_name) const;
 
-  // TimezoneSettings::Observer
+  // TimezoneSettings::Observer:
   void TimezoneChanged(const icu::TimeZone& timezone) override;
 
-  // BluetoothAdapter::Observer
+  // BluetoothAdapter::Observer:
   void AdapterPoweredChanged(device::BluetoothAdapter* adapter,
                              bool powered) override;
 
+  // ArcAuthService::Observer:
+  void OnInitialStart() override;
+
  private:
   // Registers to observe changes for Chrome settings we care about.
   void StartObservingSettingsChanges();
@@ -86,8 +91,12 @@
   // Stops listening for Chrome settings changes.
   void StopObservingSettingsChanges();
 
-  // Retrives Chrome's state for the settings and send it to Android.
-  void SyncAllPrefs() const;
+  // Retrieves Chrome's state for the settings that need to be synced on each
+  // Android boot and send it to Android.
+  void SyncRuntimeSettings() const;
+  // Send settings that need to be synced only on Android first start to
+  // Android.
+  void SyncInitialSettings() const;
   void SyncFontSize() const;
   void SyncLocale() const;
   void SyncProxySettings() const;
@@ -96,6 +105,7 @@
   void SyncTimeZone() const;
   void SyncUse24HourClock() const;
   void SyncBackupEnabled() const;
+  void SyncLocationServiceEnabled() const;
 
   void OnBluetoothAdapterInitialized(
       scoped_refptr<device::BluetoothAdapter> adapter);
@@ -106,6 +116,10 @@
   // Returns the integer value of the pref.  pref_name must exist.
   int GetIntegerPref(const std::string& pref_name) const;
 
+  // Sends boolean pref broadcast to the delegate.
+  void SendBoolPrefSettingsBroadcast(const std::string& pref_name,
+                                     const std::string& action) const;
+
   // Sends a broadcast to the delegate.
   void SendSettingsBroadcast(const std::string& action,
                              const base::DictionaryValue& extras) const;
@@ -129,15 +143,20 @@
     ArcBridgeService* arc_bridge_service)
     : arc_bridge_service_(arc_bridge_service), weak_factory_(this) {
   StartObservingSettingsChanges();
-  SyncAllPrefs();
+  SyncRuntimeSettings();
+  DCHECK(ArcAuthService::Get());
+  ArcAuthService::Get()->AddObserver(this);
 }
 
 ArcSettingsServiceImpl::~ArcSettingsServiceImpl() {
   StopObservingSettingsChanges();
 
-  if (bluetooth_adapter_) {
+  ArcAuthService* arc_auth_service = ArcAuthService::Get();
+  if (arc_auth_service)
+    arc_auth_service->RemoveObserver(this);
+
+  if (bluetooth_adapter_)
     bluetooth_adapter_->RemoveObserver(this);
-  }
 }
 
 void ArcSettingsServiceImpl::StartObservingSettingsChanges() {
@@ -175,7 +194,11 @@
   AdapterPoweredChanged(adapter.get(), adapter->IsPowered());
 }
 
-void ArcSettingsServiceImpl::SyncAllPrefs() const {
+void ArcSettingsServiceImpl::OnInitialStart() {
+  SyncInitialSettings();
+}
+
+void ArcSettingsServiceImpl::SyncRuntimeSettings() const {
   SyncFontSize();
   SyncLocale();
   SyncProxySettings();
@@ -185,6 +208,11 @@
   SyncUse24HourClock();
 }
 
+void ArcSettingsServiceImpl::SyncInitialSettings() const {
+  SyncBackupEnabled();
+  SyncLocationServiceEnabled();
+}
+
 void ArcSettingsServiceImpl::StopObservingSettingsChanges() {
   registrar_.RemoveAll();
   reporting_consent_subscription_.reset();
@@ -217,8 +245,6 @@
     SyncUse24HourClock();
   } else if (pref_name == proxy_config::prefs::kProxy) {
     SyncProxySettings();
-  } else if (pref_name == prefs::kArcBackupRestoreEnabled) {
-    SyncBackupEnabled();
   } else {
     LOG(ERROR) << "Unknown pref changed.";
   }
@@ -252,17 +278,25 @@
                         extras);
 }
 
-void ArcSettingsServiceImpl::SyncSpokenFeedbackEnabled() const {
-  const PrefService::Preference* pref = registrar_.prefs()->FindPreference(
-      prefs::kAccessibilitySpokenFeedbackEnabled);
+void ArcSettingsServiceImpl::SendBoolPrefSettingsBroadcast(
+    const std::string& pref_name,
+    const std::string& action) const {
+  const PrefService::Preference* pref =
+      registrar_.prefs()->FindPreference(pref_name);
   DCHECK(pref);
   bool enabled = false;
   bool value_exists = pref->GetValue()->GetAsBoolean(&enabled);
   DCHECK(value_exists);
   base::DictionaryValue extras;
   extras.SetBoolean("enabled", enabled);
-  SendSettingsBroadcast(
-      "org.chromium.arc.intent_helper.SET_SPOKEN_FEEDBACK_ENABLED", extras);
+  extras.SetBoolean("managed", !pref->IsUserModifiable());
+  SendSettingsBroadcast(action, extras);
+}
+
+void ArcSettingsServiceImpl::SyncSpokenFeedbackEnabled() const {
+  SendBoolPrefSettingsBroadcast(
+      prefs::kAccessibilitySpokenFeedbackEnabled,
+      "org.chromium.arc.intent_helper.SET_SPOKEN_FEEDBACK_ENABLED");
 }
 
 void ArcSettingsServiceImpl::SyncLocale() const {
@@ -367,17 +401,15 @@
 }
 
 void ArcSettingsServiceImpl::SyncBackupEnabled() const {
-  const PrefService::Preference* const pref =
-      registrar_.prefs()->FindPreference(prefs::kArcBackupRestoreEnabled);
-  DCHECK(pref);
-  bool enabled = false;
-  bool value_exists = pref->GetValue()->GetAsBoolean(&enabled);
-  DCHECK(value_exists);
-  base::DictionaryValue extras;
-  extras.SetBoolean("enabled", enabled);
-  extras.SetBoolean("managed", !pref->IsUserModifiable());
-  SendSettingsBroadcast("org.chromium.arc.intent_helper.SET_BACKUP_ENABLED",
-                        extras);
+  SendBoolPrefSettingsBroadcast(
+      prefs::kArcBackupRestoreEnabled,
+      "org.chromium.arc.intent_helper.SET_BACKUP_ENABLED");
+}
+
+void ArcSettingsServiceImpl::SyncLocationServiceEnabled() const {
+  SendBoolPrefSettingsBroadcast(
+      prefs::kArcLocationServiceEnabled,
+      "org.chromium.arc.intent_helper.SET_LOCATION_SERVICE_ENABLED");
 }
 
 void ArcSettingsServiceImpl::SendSettingsBroadcast(
diff --git a/chrome/browser/chromeos/arc/arc_support_host.cc b/chrome/browser/chromeos/arc/arc_support_host.cc
index f49c7cf..b6b434e 100644
--- a/chrome/browser/chromeos/arc/arc_support_host.cc
+++ b/chrome/browser/chromeos/arc/arc_support_host.cc
@@ -31,6 +31,7 @@
 namespace {
 const char kAction[] = "action";
 const char kBackupRestoreEnabled[] = "backupRestoreEnabled";
+const char kLocationServiceEnabled[] = "locationServiceEnabled";
 const char kCanEnable[] = "canEnable";
 const char kCode[] = "code";
 const char kData[] = "data";
@@ -49,6 +50,7 @@
 const char kActionEnableMetrics[] = "enableMetrics";
 const char kActionSendFeedback[] = "sendFeedback";
 const char kActionSetBackupRestore[] = "setBackupRestore";
+const char kActionSetLocationService[] = "setLocationService";
 const char kActionCloseUI[] = "closeUI";
 const char kActionShowPage[] = "showPage";
 }  // namespace
@@ -155,6 +157,9 @@
       "textBackupRestore",
       l10n_util::GetStringUTF16(IDS_ARC_OPT_IN_DIALOG_BACKUP_RESTORE));
   loadtime_data->SetString(
+      "textLocationService",
+      l10n_util::GetStringUTF16(IDS_ARC_OPT_IN_LOCATION_SETTING));
+  loadtime_data->SetString(
       "serverError",
       l10n_util::GetStringUTF16(IDS_ARC_SERVER_COMMUNICATION_ERROR));
 
@@ -165,6 +170,9 @@
   loadtime_data->SetBoolean(kBackupRestoreEnabled,
                             arc_auth_service->profile()->GetPrefs()->GetBoolean(
                                 prefs::kArcBackupRestoreEnabled));
+  loadtime_data->SetBoolean(kLocationServiceEnabled,
+                            arc_auth_service->profile()->GetPrefs()->GetBoolean(
+                                prefs::kArcLocationServiceEnabled));
 
   webui::SetLoadTimeDataDefaults(app_locale, loadtime_data.get());
   DCHECK(arc_auth_service);
@@ -267,6 +275,13 @@
   pref_service->SetBoolean(prefs::kArcBackupRestoreEnabled, is_enabled);
 }
 
+void ArcSupportHost::EnableLocationService(bool is_enabled) {
+  arc::ArcAuthService* arc_auth_service = arc::ArcAuthService::Get();
+  DCHECK(arc_auth_service && arc_auth_service->IsAllowed());
+  PrefService* pref_service = arc_auth_service->profile()->GetPrefs();
+  pref_service->SetBoolean(prefs::kArcLocationServiceEnabled, is_enabled);
+}
+
 void ArcSupportHost::OnMessage(const std::string& request_string) {
   std::unique_ptr<base::Value> request_value =
       base::JSONReader::Read(request_string);
@@ -312,6 +327,13 @@
       return;
     }
     EnableBackupRestore(is_enabled);
+  } else if (action == kActionSetLocationService) {
+    bool is_enabled;
+    if (!request->GetBoolean(kEnabled, &is_enabled)) {
+      NOTREACHED();
+      return;
+    }
+    EnableLocationService(is_enabled);
   } else {
     NOTREACHED();
   }
diff --git a/chrome/browser/chromeos/arc/arc_support_host.h b/chrome/browser/chromeos/arc/arc_support_host.h
index 175866e..9e65e01 100644
--- a/chrome/browser/chromeos/arc/arc_support_host.h
+++ b/chrome/browser/chromeos/arc/arc_support_host.h
@@ -49,6 +49,7 @@
   void SendMetricsMode();
   void EnableMetrics(bool is_enabled);
   void EnableBackupRestore(bool is_enabled);
+  void EnableLocationService(bool is_enabled);
 
   // Unowned pointer.
   Client* client_ = nullptr;
diff --git a/chrome/browser/chromeos/arc/arc_wallpaper_handler.cc b/chrome/browser/chromeos/arc/arc_wallpaper_handler.cc
index 6f93b13..740eb05 100644
--- a/chrome/browser/chromeos/arc/arc_wallpaper_handler.cc
+++ b/chrome/browser/chromeos/arc/arc_wallpaper_handler.cc
@@ -10,7 +10,6 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h"
-#include "chrome/browser/image_decoder.h"
 #include "components/signin/core/account_id/account_id.h"
 #include "components/user_manager/user_manager.h"
 #include "components/wallpaper/wallpaper_files_id.h"
@@ -58,58 +57,34 @@
 
 }  // namespace
 
-// An implementation of ImageDecoder::ImageRequest that just calls back
-// ArcWallpaperHandler.
-class ArcWallpaperHandler::ImageRequestImpl
-    : public ImageDecoder::ImageRequest {
- public:
-  // |handler| outlives this instance.
-  explicit ImageRequestImpl(ArcWallpaperHandler* handler) : handler_(handler) {}
-
-  // ImageDecoder::ImageRequest implementation.
-  void OnImageDecoded(const SkBitmap& bitmap) override {
-    handler_->OnImageDecoded(this, bitmap);
-  }
-  void OnDecodeImageFailed() override { handler_->OnDecodeImageFailed(this); }
-
- private:
-  ArcWallpaperHandler* const handler_;
-
-  DISALLOW_COPY_AND_ASSIGN(ImageRequestImpl);
-};
-
 ArcWallpaperHandler::ArcWallpaperHandler() = default;
 
 ArcWallpaperHandler::~ArcWallpaperHandler() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  // Cancel in-flight requests.
-  for (auto& request : inflight_requests_)
-    ImageDecoder::Cancel(request.get());
-  inflight_requests_.clear();
+  // Make sure the callback is never called after destruction. It is safe to
+  // call Cancel() even when there is no in-flight request.
+  ImageDecoder::Cancel(this);
 }
 
 void ArcWallpaperHandler::SetWallpaper(const std::vector<uint8_t>& jpeg_data) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  std::unique_ptr<ImageRequestImpl> request =
-      base::MakeUnique<ImageRequestImpl>(this);
+  // If there is an in-flight request, cancel it. It is safe to call Cancel()
+  // even when there is no in-flight request.
+  ImageDecoder::Cancel(this);
   // TODO(nya): Improve ImageDecoder to minimize copy.
   std::string jpeg_data_as_string(
       reinterpret_cast<const char*>(jpeg_data.data()), jpeg_data.size());
-  ImageDecoder::StartWithOptions(request.get(), jpeg_data_as_string,
+  ImageDecoder::StartWithOptions(this, jpeg_data_as_string,
                                  ImageDecoder::ROBUST_JPEG_CODEC, true);
-  inflight_requests_.insert(std::move(request));
 }
 
-void ArcWallpaperHandler::OnImageDecoded(ImageRequestImpl* request,
-                                         const SkBitmap& bitmap) {
+void ArcWallpaperHandler::OnImageDecoded(const SkBitmap& bitmap) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  inflight_requests_.erase(base::WrapUnique(request));
   SetBitmapAsWallpaper(bitmap);
 }
 
-void ArcWallpaperHandler::OnDecodeImageFailed(ImageRequestImpl* request) {
+void ArcWallpaperHandler::OnDecodeImageFailed() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  inflight_requests_.erase(base::WrapUnique(request));
   LOG(ERROR) << "Failed to decode wallpaper image.";
 }
 
diff --git a/chrome/browser/chromeos/arc/arc_wallpaper_handler.h b/chrome/browser/chromeos/arc/arc_wallpaper_handler.h
index cb4b96d6..fee2354 100644
--- a/chrome/browser/chromeos/arc/arc_wallpaper_handler.h
+++ b/chrome/browser/chromeos/arc/arc_wallpaper_handler.h
@@ -12,6 +12,7 @@
 #include <vector>
 
 #include "base/macros.h"
+#include "chrome/browser/image_decoder.h"
 #include "components/arc/set_wallpaper_delegate.h"
 
 class SkBitmap;
@@ -19,7 +20,8 @@
 namespace arc {
 
 // Lives on the UI thread.
-class ArcWallpaperHandler : public SetWallpaperDelegate {
+class ArcWallpaperHandler : public SetWallpaperDelegate,
+                            public ImageDecoder::ImageRequest {
  public:
   ArcWallpaperHandler();
   ~ArcWallpaperHandler() override;
@@ -27,16 +29,11 @@
   // SetWallpaperDelegate implementation.
   void SetWallpaper(const std::vector<uint8_t>& jpeg_data) override;
 
+  // ImageDecoder::ImageRequest implementation.
+  void OnImageDecoded(const SkBitmap& bitmap) override;
+  void OnDecodeImageFailed() override;
+
  private:
-  class ImageRequestImpl;
-
-  // Called from ImageRequestImpl on decode completion.
-  void OnImageDecoded(ImageRequestImpl* request, const SkBitmap& bitmap);
-  void OnDecodeImageFailed(ImageRequestImpl* request);
-
-  // The set of in-flight decode requests.
-  std::set<std::unique_ptr<ImageRequestImpl>> inflight_requests_;
-
   DISALLOW_COPY_AND_ASSIGN(ArcWallpaperHandler);
 };
 
diff --git a/chrome/browser/chromeos/arc/gpu_arc_video_service_host.cc b/chrome/browser/chromeos/arc/gpu_arc_video_service_host.cc
index 9da329c..513b166 100644
--- a/chrome/browser/chromeos/arc/gpu_arc_video_service_host.cc
+++ b/chrome/browser/chromeos/arc/gpu_arc_video_service_host.cc
@@ -73,7 +73,7 @@
 
 void GpuArcVideoServiceHost::OnInstanceReady() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  auto video_instance = arc_bridge_service()->video()->instance();
+  auto* video_instance = arc_bridge_service()->video()->instance();
   DCHECK(video_instance);
   video_instance->Init(binding_.CreateInterfacePtrAndBind());
 }
diff --git a/chrome/browser/chromeos/base/file_flusher.cc b/chrome/browser/chromeos/base/file_flusher.cc
index 4315dbf2..43e06b5 100644
--- a/chrome/browser/chromeos/base/file_flusher.cc
+++ b/chrome/browser/chromeos/base/file_flusher.cc
@@ -166,14 +166,14 @@
 FileFlusher::FileFlusher() : weak_factory_(this) {}
 
 FileFlusher::~FileFlusher() {
-  for (const auto& job : jobs_)
+  for (auto* job : jobs_)
     job->Cancel();
 }
 
 void FileFlusher::RequestFlush(const base::FilePath& path,
                                const std::vector<base::FilePath>& excludes,
                                const base::Closure& callback) {
-  for (const auto& job : jobs_) {
+  for (auto* job : jobs_) {
     if (path == job->path() || path.IsParent(job->path()))
       job->Cancel();
   }
@@ -187,7 +187,7 @@
   if (jobs_.empty())
     return;
 
-  auto job = jobs_.front();
+  auto* job = jobs_.front();
   if (!job->started())
     job->Start();
 }
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
index bf9389d8..c103e4e 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
@@ -303,7 +303,7 @@
 
   const std::vector<Profile*>& profiles =
       g_browser_process->profile_manager()->GetLoadedProfiles();
-  for (const auto& profile : profiles) {
+  for (auto* profile : profiles) {
     if (profile->IsOffTheRecord())
       continue;
     const GURL site = util::GetSiteForExtensionId(extension_id(), profile);
diff --git a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc
index d5cf655..d44a5bbd 100644
--- a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc
+++ b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc
@@ -179,7 +179,7 @@
   }
 
   std::string SetModesWithError(const std::string& args) {
-    auto func = new QuickUnlockPrivateSetModesFunction();
+    auto* func = new QuickUnlockPrivateSetModesFunction();
     func->SetAuthenticatorAllocatorForTesting(
         base::Bind(&CreateFakeAuthenticator));
     func->SetModesChangedEventHandlerForTesting(base::Bind(&DoNothing));
diff --git a/chrome/browser/chromeos/file_system_provider/request_manager.cc b/chrome/browser/chromeos/file_system_provider/request_manager.cc
index 944df5d..17b3777 100644
--- a/chrome/browser/chromeos/file_system_provider/request_manager.cc
+++ b/chrome/browser/chromeos/file_system_provider/request_manager.cc
@@ -226,7 +226,7 @@
   // which is at most once every 10 seconds per request (except tests).
   const extensions::WindowControllerList::ControllerList& windows =
       extensions::WindowControllerList::GetInstance()->windows();
-  for (const auto& window : windows) {
+  for (auto* window : windows) {
     const Browser* const browser = window->GetBrowser();
     if (!browser)
       continue;
diff --git a/chrome/browser/chromeos/hats/hats_notification_controller.h b/chrome/browser/chromeos/hats/hats_notification_controller.h
index 20d36a5..059f4a39 100644
--- a/chrome/browser/chromeos/hats/hats_notification_controller.h
+++ b/chrome/browser/chromeos/hats/hats_notification_controller.h
@@ -37,6 +37,18 @@
   static bool ShouldShowSurveyToProfile(Profile* profile);
 
  private:
+  friend class HatsNotificationControllerTest;
+  FRIEND_TEST_ALL_PREFIXES(HatsNotificationControllerTest,
+                           NewDevice_ShouldNotShowNotification);
+  FRIEND_TEST_ALL_PREFIXES(HatsNotificationControllerTest,
+                           OldDevice_ShouldShowNotification);
+  FRIEND_TEST_ALL_PREFIXES(HatsNotificationControllerTest,
+                           NoInternet_DoNotShowNotification);
+  FRIEND_TEST_ALL_PREFIXES(HatsNotificationControllerTest,
+                           InternetConnected_ShowNotification);
+  FRIEND_TEST_ALL_PREFIXES(HatsNotificationControllerTest,
+                           DismissNotification_ShouldUpdatePref);
+
   ~HatsNotificationController() override;
 
   // NotificationDelegate overrides:
diff --git a/chrome/browser/chromeos/hats/hats_notification_controller_unittest.cc b/chrome/browser/chromeos/hats/hats_notification_controller_unittest.cc
new file mode 100644
index 0000000..da47962
--- /dev/null
+++ b/chrome/browser/chromeos/hats/hats_notification_controller_unittest.cc
@@ -0,0 +1,234 @@
+// 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 "base/strings/string_split.h"
+#include "chrome/browser/chromeos/hats/hats_notification_controller.h"
+#include "chrome/browser/notifications/message_center_notification_manager.h"
+#include "chrome/browser/notifications/notification.h"
+#include "chrome/browser/notifications/notification_ui_manager.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/browser_with_test_window_test.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "chrome/test/base/testing_profile.h"
+#include "chrome/test/base/testing_profile_manager.h"
+#include "chromeos/network/network_state.h"
+#include "chromeos/network/portal_detector/network_portal_detector.h"
+#include "components/prefs/pref_service.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "content/public/test/test_utils.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/message_center/fake_message_center_tray_delegate.h"
+#include "ui/message_center/message_center.h"
+
+using testing::_;
+using testing::AtLeast;
+using testing::Invoke;
+using testing::Return;
+using testing::SaveArg;
+using testing::StrictMock;
+
+namespace chromeos {
+
+namespace {
+
+class MockNetworkPortalDetector : public NetworkPortalDetector {
+ public:
+  MockNetworkPortalDetector() {}
+  ~MockNetworkPortalDetector() override {}
+
+  MOCK_METHOD1(AddObserver,
+               void(chromeos::NetworkPortalDetector::Observer* observer));
+  MOCK_METHOD1(RemoveObserver,
+               void(chromeos::NetworkPortalDetector::Observer* observer));
+  MOCK_METHOD1(AddAndFireObserver,
+               void(chromeos::NetworkPortalDetector::Observer* observer));
+  MOCK_METHOD1(GetCaptivePortalState,
+               chromeos::NetworkPortalDetector::CaptivePortalState(
+                   const std::string& service_path));
+  MOCK_METHOD0(IsEnabled, bool());
+  MOCK_METHOD1(Enable, void(bool start_detection));
+  MOCK_METHOD0(StartDetectionIfIdle, bool());
+  MOCK_METHOD1(SetStrategy,
+               void(chromeos::PortalDetectorStrategy::StrategyId id));
+  MOCK_METHOD0(OnLockScreenRequest, void());
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MockNetworkPortalDetector);
+};
+
+}  // namespace
+
+class HatsNotificationControllerTest : public BrowserWithTestWindowTest {
+ public:
+  HatsNotificationControllerTest() {}
+  ~HatsNotificationControllerTest() override {}
+
+  void SetUp() override {
+    BrowserWithTestWindowTest::SetUp();
+
+    profile_manager_.reset(
+        new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
+    ASSERT_TRUE(profile_manager_->SetUp());
+
+    MessageCenterNotificationManager* manager =
+        static_cast<MessageCenterNotificationManager*>(
+            g_browser_process->notification_ui_manager());
+    manager->SetMessageCenterTrayDelegateForTest(
+        new message_center::FakeMessageCenterTrayDelegate(
+            message_center::MessageCenter::Get()));
+
+    network_portal_detector::InitializeForTesting(
+        &mock_network_portal_detector_);
+  }
+
+  void TearDown() override {
+    g_browser_process->notification_ui_manager()->CancelAll();
+    profile_manager_.reset();
+    network_portal_detector::InitializeForTesting(nullptr);
+    BrowserWithTestWindowTest::TearDown();
+  }
+
+  scoped_refptr<HatsNotificationController> InstantiateHatsController() {
+    // The initialization will fail since the function IsNewDevice() will return
+    // true.
+    scoped_refptr<HatsNotificationController> hats_notification_controller =
+        new HatsNotificationController(&profile_);
+
+    // HatsController::IsNewDevice() is run on a blocking thread.
+    content::RunAllBlockingPoolTasksUntilIdle();
+
+    // Send a callback to the observer to simulate internet connectivity is
+    // present on device.
+    ON_CALL(mock_network_portal_detector_,
+            AddAndFireObserver(hats_notification_controller.get()))
+        .WillByDefault(Invoke(
+            [&hats_notification_controller](NetworkPortalDetector::Observer*) {
+              NetworkPortalDetector::CaptivePortalState online_state;
+              NetworkState network_state("");
+              online_state.status =
+                  NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE;
+              hats_notification_controller->OnPortalDetectionCompleted(
+                  &network_state, online_state);
+            }));
+
+    return hats_notification_controller;
+  }
+
+  TestingProfile profile_;
+  StrictMock<MockNetworkPortalDetector> mock_network_portal_detector_;
+
+ private:
+  std::unique_ptr<TestingProfileManager> profile_manager_;
+
+  DISALLOW_COPY_AND_ASSIGN(HatsNotificationControllerTest);
+};
+
+TEST_F(HatsNotificationControllerTest, NewDevice_ShouldNotShowNotification) {
+  int64_t initial_timestamp = base::Time::Now().ToInternalValue();
+  PrefService* pref_service = profile_.GetPrefs();
+  pref_service->SetInt64(prefs::kHatsLastInteractionTimestamp,
+                         initial_timestamp);
+
+  auto hats_notification_controller = InstantiateHatsController();
+  hats_notification_controller->Initialize(true);
+
+  int64_t current_timestamp =
+      pref_service->GetInt64(prefs::kHatsLastInteractionTimestamp);
+
+  // When the device is new, the controller does not begin initialization and
+  // simply updates the timestamp to Time::Now().
+  ASSERT_TRUE(base::Time::FromInternalValue(current_timestamp) >
+              base::Time::FromInternalValue(initial_timestamp));
+
+  // Destructor for HatsController removes self from observer list.
+  EXPECT_CALL(mock_network_portal_detector_,
+              RemoveObserver(hats_notification_controller.get()))
+      .Times(1);
+
+  const Notification* notification =
+      g_browser_process->notification_ui_manager()->FindById(
+          HatsNotificationController::kDelegateId, &profile_);
+  EXPECT_FALSE(notification);
+}
+
+TEST_F(HatsNotificationControllerTest, OldDevice_ShouldShowNotification) {
+  auto hats_notification_controller = InstantiateHatsController();
+
+  // On initialization, HatsNotificationController adds itself as an observer to
+  // NetworkPortalDetector to detect internet connectivity.
+  EXPECT_CALL(mock_network_portal_detector_,
+              AddAndFireObserver(hats_notification_controller.get()))
+      .Times(1);
+  // Observer is removed if an internet connection is detected. It is called
+  // a second time when hats_notification_controller is destroyed.
+  EXPECT_CALL(mock_network_portal_detector_,
+              RemoveObserver(hats_notification_controller.get()))
+      .Times(2);
+
+  hats_notification_controller->Initialize(false);
+
+  // Finally check if notification was launched to confirm initialization.
+  const Notification* notification =
+      g_browser_process->notification_ui_manager()->FindById(
+          HatsNotificationController::kDelegateId, &profile_);
+  EXPECT_TRUE(notification != nullptr);
+}
+
+TEST_F(HatsNotificationControllerTest, NoInternet_DoNotShowNotification) {
+  auto hats_notification_controller = InstantiateHatsController();
+
+  // Upon destruction HatsNotificationController removes itself as an observer
+  // from NetworkPortalDetector. This will only be called once from the
+  EXPECT_CALL(mock_network_portal_detector_,
+              RemoveObserver(hats_notification_controller.get()))
+      .Times(1);
+
+  NetworkState network_state("");
+  NetworkPortalDetector::CaptivePortalState online_state;
+  hats_notification_controller->OnPortalDetectionCompleted(&network_state,
+                                                           online_state);
+
+  online_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE;
+  hats_notification_controller->OnPortalDetectionCompleted(&network_state,
+                                                           online_state);
+
+  online_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL;
+  hats_notification_controller->OnPortalDetectionCompleted(&network_state,
+                                                           online_state);
+
+  online_state.status =
+      NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED;
+  hats_notification_controller->OnPortalDetectionCompleted(&network_state,
+                                                           online_state);
+
+  const Notification* notification =
+      g_browser_process->notification_ui_manager()->FindById(
+          HatsNotificationController::kDelegateId, &profile_);
+  EXPECT_FALSE(notification);
+}
+
+TEST_F(HatsNotificationControllerTest, DismissNotification_ShouldUpdatePref) {
+  int64_t now_timestamp = base::Time::Now().ToInternalValue();
+  PrefService* pref_service = profile_.GetPrefs();
+  pref_service->SetInt64(prefs::kHatsLastInteractionTimestamp, now_timestamp);
+
+  auto hats_notification_controller = InstantiateHatsController();
+
+  // Simulate closing notification via user interaction.
+  hats_notification_controller->Close(true);
+
+  int64_t new_timestamp =
+      pref_service->GetInt64(prefs::kHatsLastInteractionTimestamp);
+  // The flag should be updated to a new timestamp.
+  ASSERT_TRUE(base::Time::FromInternalValue(new_timestamp) >
+              base::Time::FromInternalValue(now_timestamp));
+
+  // Destructor for HatsController removes self from observer list.
+  EXPECT_CALL(mock_network_portal_detector_,
+              RemoveObserver(hats_notification_controller.get()))
+      .Times(1);
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/existing_user_controller.cc b/chrome/browser/chromeos/login/existing_user_controller.cc
index e49ad9c..41816e4 100644
--- a/chrome/browser/chromeos/login/existing_user_controller.cc
+++ b/chrome/browser/chromeos/login/existing_user_controller.cc
@@ -230,7 +230,7 @@
 
   cros_settings_->GetBoolean(kAccountsPrefShowUserNamesOnSignIn,
                              &show_users_on_signin);
-  for (const auto& user : users) {
+  for (auto* user : users) {
     // Skip kiosk apps for login screen user list. Kiosk apps as pods (aka new
     // kiosk UI) is currently disabled and it gets the apps directly from
     // KioskAppManager.
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc
index 4a7f9fc..e92b20a2 100644
--- a/chrome/browser/chromeos/login/session/user_session_manager.cc
+++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -1855,7 +1855,7 @@
     return false;
   bool ephemeral_users_enabled = false;
   bool show_names_on_signin = true;
-  auto cros_settings = CrosSettings::Get();
+  auto* cros_settings = CrosSettings::Get();
   cros_settings->GetBoolean(kAccountsPrefEphemeralUsersEnabled,
                             &ephemeral_users_enabled);
   cros_settings->GetBoolean(kAccountsPrefShowUserNamesOnSignIn,
diff --git a/chrome/browser/chromeos/login/signin/token_handle_util.cc b/chrome/browser/chromeos/login/signin/token_handle_util.cc
index c85b92b..0d8d942 100644
--- a/chrome/browser/chromeos/login/signin/token_handle_util.cc
+++ b/chrome/browser/chromeos/login/signin/token_handle_util.cc
@@ -86,7 +86,7 @@
   }
 
   if (!gaia_client_.get()) {
-    auto request_context =
+    auto* request_context =
         chromeos::ProfileHelper::Get()->GetSigninProfile()->GetRequestContext();
     gaia_client_.reset(new gaia::GaiaOAuthClient(request_context));
   }
diff --git a/chrome/browser/chromeos/login/ui/captive_portal_window_proxy.cc b/chrome/browser/chromeos/login/ui/captive_portal_window_proxy.cc
index 9acc390..e01d1ce0 100644
--- a/chrome/browser/chromeos/login/ui/captive_portal_window_proxy.cc
+++ b/chrome/browser/chromeos/login/ui/captive_portal_window_proxy.cc
@@ -74,7 +74,7 @@
   InitCaptivePortalView();
 
   CaptivePortalView* portal = captive_portal_view_.release();
-  auto manager =
+  auto* manager =
       web_modal::WebContentsModalDialogManager::FromWebContents(web_contents_);
   widget_ = CreateWindowAsFramelessChild(
       portal,
diff --git a/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc b/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
index 83492ce..590a5828 100644
--- a/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
+++ b/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
@@ -976,7 +976,7 @@
 
   // Get the current list of device local accounts.
   std::vector<std::string> old_accounts;
-  for (const auto& user : users_) {
+  for (auto* user : users_) {
     if (user->IsDeviceLocalAccount())
       old_accounts.push_back(user->email());
   }
diff --git a/chrome/browser/chromeos/login/users/mock_user_manager.cc b/chrome/browser/chromeos/login/users/mock_user_manager.cc
index c894bd7a..500bec9 100644
--- a/chrome/browser/chromeos/login/users/mock_user_manager.cc
+++ b/chrome/browser/chromeos/login/users/mock_user_manager.cc
@@ -143,7 +143,7 @@
 }
 
 bool MockUserManager::ShouldReportUser(const std::string& user_id) const {
-  for (const auto& user : user_list_) {
+  for (auto* user : user_list_) {
     if (user->email() == user_id)
       return user->IsAffiliated();
   }
diff --git a/chrome/browser/chromeos/policy/device_status_collector.cc b/chrome/browser/chromeos/policy/device_status_collector.cc
index 97378795..6d5f1161 100644
--- a/chrome/browser/chromeos/policy/device_status_collector.cc
+++ b/chrome/browser/chromeos/policy/device_status_collector.cc
@@ -881,7 +881,7 @@
   const user_manager::UserList& users =
       chromeos::ChromeUserManager::Get()->GetUsers();
 
-  for (const auto& user : users) {
+  for (auto* user : users) {
     // Only users with gaia accounts (regular) are reported.
     if (!user->HasGaiaAccount())
       continue;
diff --git a/chrome/browser/chromeos/policy/system_log_uploader.cc b/chrome/browser/chromeos/policy/system_log_uploader.cc
index 9259642..12e895d 100644
--- a/chrome/browser/chromeos/policy/system_log_uploader.cc
+++ b/chrome/browser/chromeos/policy/system_log_uploader.cc
@@ -46,7 +46,7 @@
   std::unique_ptr<policy::SystemLogUploader::SystemLogs> system_logs(
       new policy::SystemLogUploader::SystemLogs());
   feedback::AnonymizerTool anonymizer;
-  for (auto const file_path : kSystemLogFileNames) {
+  for (auto* file_path : kSystemLogFileNames) {
     if (!base::PathExists(base::FilePath(file_path)))
       continue;
     std::string data = std::string();
diff --git a/chrome/browser/chromeos/policy/system_log_uploader_unittest.cc b/chrome/browser/chromeos/policy/system_log_uploader_unittest.cc
index e2cd081..267847b 100644
--- a/chrome/browser/chromeos/policy/system_log_uploader_unittest.cc
+++ b/chrome/browser/chromeos/policy/system_log_uploader_unittest.cc
@@ -27,7 +27,7 @@
 // Generate the fake system log files.
 SystemLogUploader::SystemLogs GenerateTestSystemLogFiles() {
   SystemLogUploader::SystemLogs system_logs;
-  for (auto const file_path : kTestSystemLogFileNames) {
+  for (auto* file_path : kTestSystemLogFileNames) {
     system_logs.push_back(std::make_pair(file_path, file_path));
   }
   return system_logs;
diff --git a/chrome/browser/chromeos/policy/upload_job_impl.cc b/chrome/browser/chromeos/policy/upload_job_impl.cc
index 2c567f2..37962432 100644
--- a/chrome/browser/chromeos/policy/upload_job_impl.cc
+++ b/chrome/browser/chromeos/policy/upload_job_impl.cc
@@ -212,7 +212,7 @@
   std::set<std::string> used_names;
 
   // Check uniqueness of header field names.
-  for (const auto& data_segment : data_segments_) {
+  for (auto* data_segment : data_segments_) {
     if (!used_names.insert(data_segment->GetName()).second)
       return false;
   }
@@ -224,7 +224,7 @@
   // allocation more efficient. It is not an error if this turns out to be too
   // small as std::string will take care of the realloc.
   size_t size = 0;
-  for (const auto& data_segment : data_segments_) {
+  for (auto* data_segment : data_segments_) {
     for (const auto& entry : data_segment->GetHeaderEntries())
       size += entry.first.size() + entry.second.size();
     size += kMaxMimeBoundarySize + data_segment->GetName().size() +
@@ -237,7 +237,7 @@
   post_data_.reset(new std::string);
   post_data_->reserve(size);
 
-  for (const auto& data_segment : data_segments_) {
+  for (auto* data_segment : data_segments_) {
     post_data_->append("--" + *mime_boundary_.get() + "\r\n");
     post_data_->append("Content-Disposition: form-data; name=\"" +
                        data_segment->GetName() + "\"");
diff --git a/chrome/browser/chromeos/resource_reporter/resource_reporter.cc b/chrome/browser/chromeos/resource_reporter/resource_reporter.cc
index 21906ec..1428201 100644
--- a/chrome/browser/chromeos/resource_reporter/resource_reporter.cc
+++ b/chrome/browser/chromeos/resource_reporter/resource_reporter.cc
@@ -327,7 +327,7 @@
   // See https://en.wikipedia.org/wiki/Reservoir_sampling.
   TaskRecord* sampled_task = nullptr;
   double cpu_weights_sum = 0;
-  for (const auto& task_data : task_records_by_cpu_) {
+  for (auto* task_data : task_records_by_cpu_) {
     if ((base::RandDouble() * (cpu_weights_sum + task_data->cpu_percent)) >=
         cpu_weights_sum) {
       sampled_task = task_data;
@@ -346,7 +346,7 @@
   // See https://en.wikipedia.org/wiki/Reservoir_sampling.
   TaskRecord* sampled_task = nullptr;
   int64_t memory_weights_sum = 0;
-  for (const auto& task_data : task_records_by_memory_) {
+  for (auto* task_data : task_records_by_memory_) {
     if ((base::RandDouble() * (memory_weights_sum + task_data->memory_bytes)) >=
         memory_weights_sum) {
       sampled_task = task_data;
@@ -381,7 +381,7 @@
         GET_ENUM_VAL(MemoryUsageRange::NUM_RANGES));
 
     // For the rest of tasks, report them using Rappor.
-    auto rappor_service = g_browser_process->rappor_service();
+    auto* rappor_service = g_browser_process->rappor_service();
     if (!rappor_service)
       return;
 
diff --git a/chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc b/chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc
index 78adad1..82958d3 100644
--- a/chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc
+++ b/chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc
@@ -161,7 +161,7 @@
   // properly sorted by the CPU usage in a descending order.
   bool IsCpuRecordsSetSorted() const {
     double current_cpu = std::numeric_limits<double>::max();
-    for (const auto& record : resource_reporter()->task_records_by_cpu_) {
+    for (auto* record : resource_reporter()->task_records_by_cpu_) {
       if (record->cpu_percent > current_cpu)
         return false;
       current_cpu = record->cpu_percent;
@@ -174,7 +174,7 @@
   // are properly sorted by the memory usage in a descending order.
   bool IsMemoryRecordsSetSorted() const {
     int64_t current_memory = std::numeric_limits<int64_t>::max();
-    for (const auto& record : resource_reporter()->task_records_by_memory_) {
+    for (auto* record : resource_reporter()->task_records_by_memory_) {
       if (record->memory_bytes > current_memory)
         return false;
       current_memory = record->memory_bytes;
diff --git a/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc b/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
index c42e008b..1a13aa9 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
@@ -159,7 +159,7 @@
     };
 
     const base::FundamentalValue expected_enable_value(expected_enable_state);
-    for (const auto& setting : reporting_settings) {
+    for (auto* setting : reporting_settings) {
       EXPECT_TRUE(base::Value::Equals(provider_->Get(setting),
                                       &expected_enable_value))
           << "Value for " << setting << " does not match expected";
diff --git a/chrome/browser/component_updater/chrome_component_updater_configurator_unittest.cc b/chrome/browser/component_updater/chrome_component_updater_configurator_unittest.cc
index dcd57143..f6c958f 100644
--- a/chrome/browser/component_updater/chrome_component_updater_configurator_unittest.cc
+++ b/chrome/browser/component_updater/chrome_component_updater_configurator_unittest.cc
@@ -33,7 +33,11 @@
 
   const auto config(MakeChromeComponentUpdaterConfigurator(&cmdline, nullptr));
 
-  ASSERT_EQ(10, config->InitialDelay());
+  CHECK_EQ(10, config->InitialDelay());
+  CHECK_EQ(6 * 60 * 60, config->NextCheckDelay());
+  CHECK_EQ(1, config->StepDelay());
+  CHECK_EQ(2, config->OnDemandDelay());
+  CHECK_EQ(10, config->UpdateDelay());
 }
 
 TEST(ChromeComponentUpdaterConfiguratorTest, TestOverrideUrl) {
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc
index 09a961f..6a2a45d 100644
--- a/chrome/browser/devtools/devtools_window.cc
+++ b/chrome/browser/devtools/devtools_window.cc
@@ -90,6 +90,20 @@
   return false;
 }
 
+void SetPreferencesFromJson(Profile* profile, const std::string& json) {
+  base::DictionaryValue* dict = nullptr;
+  std::unique_ptr<base::Value> parsed = base::JSONReader::Read(json);
+  if (!parsed || !parsed->GetAsDictionary(&dict))
+    return;
+  DictionaryPrefUpdate update(profile->GetPrefs(), prefs::kDevToolsPreferences);
+  for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) {
+    if (!it.value().IsType(base::Value::TYPE_STRING))
+      continue;
+    update.Get()->SetWithoutPathExpansion(
+        it.key(), it.value().CreateDeepCopy());
+  }
+}
+
 // DevToolsToolboxDelegate ----------------------------------------------------
 
 class DevToolsToolboxDelegate
@@ -791,7 +805,7 @@
   GURL url(GetDevToolsURL(profile, frontend_url,
                           shared_worker_frontend,
                           remote_frontend,
-                          can_dock, settings));
+                          can_dock));
   std::unique_ptr<WebContents> main_web_contents(
       WebContents::Create(WebContents::CreateParams(profile)));
   main_web_contents->GetController().LoadURL(
@@ -801,7 +815,8 @@
       DevToolsUIBindings::ForWebContents(main_web_contents.get());
   if (!bindings)
     return nullptr;
-
+  if (!settings.empty())
+    SetPreferencesFromJson(profile, settings);
   return new DevToolsWindow(profile, main_web_contents.release(), bindings,
                             inspected_web_contents, can_dock);
 }
@@ -811,8 +826,7 @@
                                     const GURL& base_url,
                                     bool shared_worker_frontend,
                                     const std::string& remote_frontend,
-                                    bool can_dock,
-                                    const std::string& settings) {
+                                    bool can_dock) {
   // Compatibility errors are encoded with data urls, pass them
   // through with no decoration.
   if (base_url.SchemeIs("data"))
@@ -834,8 +848,6 @@
   }
   if (can_dock)
     url_string += "&can_dock=true";
-  if (settings.size())
-    url_string += "&settings=" + settings;
   return GURL(url_string);
 }
 
diff --git a/chrome/browser/devtools/devtools_window.h b/chrome/browser/devtools/devtools_window.h
index a64befe..a32b4c9 100644
--- a/chrome/browser/devtools/devtools_window.h
+++ b/chrome/browser/devtools/devtools_window.h
@@ -254,8 +254,7 @@
                              const GURL& base_url,
                              bool shared_worker_frontend,
                              const std::string& remote_frontend,
-                             bool can_dock,
-                             const std::string& settings);
+                             bool can_dock);
 
   static DevToolsWindow* CreateDevToolsWindowForWorker(Profile* profile);
   static void ToggleDevToolsWindow(
diff --git a/chrome/browser/download/download_item_model_unittest.cc b/chrome/browser/download/download_item_model_unittest.cc
index be3049d..dfb07fe 100644
--- a/chrome/browser/download/download_item_model_unittest.cc
+++ b/chrome/browser/download/download_item_model_unittest.cc
@@ -308,9 +308,9 @@
     //         .-- .TimeRemaining() is known.
     //        |       .-- .GetOpenWhenComplete()
     //        |      |      .---- .IsPaused()
-    { 0, 0, false, false, false, "Starting..." },
+    { 0, 0, false, false, false, "Starting\xE2\x80\xA6" },
     { 1, 0, false, false, false, "1 B" },
-    { 0, 2, false, false, false, "Starting..." },
+    { 0, 2, false, false, false, "Starting\xE2\x80\xA6"},
     { 1, 2, false, false, false, "1/2 B" },
     { 0, 2, true,  false, false, "0/2 B, 10 secs left" },
     { 1, 2, true,  false, false, "1/2 B, 10 secs left" },
@@ -318,8 +318,8 @@
     { 1, 0, false, true,  false, "Opening when complete" },
     { 0, 2, false, true,  false, "Opening when complete" },
     { 1, 2, false, true,  false, "Opening when complete" },
-    { 0, 2, true,  true,  false, "Opening in 10 secs..." },
-    { 1, 2, true,  true,  false, "Opening in 10 secs..." },
+    { 0, 2, true,  true,  false, "Opening in 10 secs\xE2\x80\xA6"},
+    { 1, 2, true,  true,  false, "Opening in 10 secs\xE2\x80\xA6"},
     { 0, 0, false, false, true,  "0 B, Paused" },
     { 1, 0, false, false, true,  "1 B, Paused" },
     { 0, 2, false, false, true,  "0/2 B, Paused" },
diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/browser/download/download_target_determiner.cc
index 07f13da..61e6095 100644
--- a/chrome/browser/download/download_target_determiner.cc
+++ b/chrome/browser/download/download_target_determiner.cc
@@ -324,9 +324,9 @@
 #if BUILDFLAG(ANDROID_JAVA_UI)
   if (!verified) {
     if (path.empty()) {
-      CancelOnFailureAndDeleteSelf();
       DownloadManagerService::OnDownloadCanceled(
           download_, DownloadController::CANCEL_REASON_NO_EXTERNAL_STORAGE);
+      CancelOnFailureAndDeleteSelf();
       return;
     }
     if (!download_->GetWebContents()) {
@@ -334,10 +334,10 @@
       // is no way to prompt user for an infobar. This could happen after chrome
       // gets killed, and user tries to resume a download while another app has
       // created the target file (not the temporary .crdownload file).
-      CancelOnFailureAndDeleteSelf();
       DownloadManagerService::OnDownloadCanceled(
           download_,
           DownloadController::CANCEL_REASON_CANNOT_DETERMINE_DOWNLOAD_TARGET);
+      CancelOnFailureAndDeleteSelf();
       return;
     }
   }
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn
index 08bf9ded..a38c519 100644
--- a/chrome/browser/extensions/BUILD.gn
+++ b/chrome/browser/extensions/BUILD.gn
@@ -44,6 +44,7 @@
     "//chrome/browser/devtools",
     "//chrome/common",
     "//chrome/common/extensions/api:api_registration",
+    "//chrome/common/extensions/api:extensions_features",
     "//chrome/common/safe_browsing:proto",
     "//chrome/installer/util:with_no_strings",
     "//components/data_reduction_proxy/proto:data_reduction_proxy_proto",
diff --git a/chrome/browser/extensions/all_urls_apitest.cc b/chrome/browser/extensions/all_urls_apitest.cc
index e1e8a6c..9eb283099 100644
--- a/chrome/browser/extensions/all_urls_apitest.cc
+++ b/chrome/browser/extensions/all_urls_apitest.cc
@@ -71,7 +71,7 @@
 IN_PROC_BROWSER_TEST_F(AllUrlsApiTest, WhitelistedExtension) {
   WhitelistExtensions();
 
-  auto bystander = LoadExtension(
+  auto* bystander = LoadExtension(
       test_data_dir_.AppendASCII("all_urls").AppendASCII("bystander"));
   ASSERT_TRUE(bystander);
 
diff --git a/chrome/browser/extensions/api/cast_devices_private/cast_devices_private_api.cc b/chrome/browser/extensions/api/cast_devices_private/cast_devices_private_api.cc
index b40895c..8537677 100644
--- a/chrome/browser/extensions/api/cast_devices_private/cast_devices_private_api.cc
+++ b/chrome/browser/extensions/api/cast_devices_private/cast_devices_private_api.cc
@@ -99,7 +99,7 @@
         ConvertReceiverAndActivityType(device.receiver, device.activity.get()));
   }
 
-  auto listeners = CastDeviceUpdateListeners::Get(browser_context());
+  auto* listeners = CastDeviceUpdateListeners::Get(browser_context());
   listeners->NotifyCallbacks(devices);
 
   return RespondNow(NoArguments());
diff --git a/chrome/browser/extensions/api/dial/dial_registry.cc b/chrome/browser/extensions/api/dial/dial_registry.cc
index 9dc6318..6444f0c 100644
--- a/chrome/browser/extensions/api/dial/dial_registry.cc
+++ b/chrome/browser/extensions/api/dial/dial_registry.cc
@@ -157,7 +157,7 @@
   bool pruned_device = false;
   DeviceByLabelMap::iterator it = device_by_label_map_.begin();
   while (it != device_by_label_map_.end()) {
-    const auto& device = it->second;
+    auto* device = it->second;
     if (IsDeviceExpired(*device)) {
       VLOG(2) << "Device " << device->label() << " expired, removing";
       const size_t num_erased_by_id =
diff --git a/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc b/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
index 0ae5d37..fdb10da1 100644
--- a/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
+++ b/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
@@ -722,7 +722,7 @@
       extensions::ProcessManager::Get(browser()->profile());
   std::set<content::RenderFrameHost*> frame_hosts =
       manager->GetRenderFrameHostsForExtension(extension->id());
-  for (auto host : frame_hosts) {
+  for (auto* host : frame_hosts) {
     if (host->GetFrameName() == "child_frame") {
       frame_host = host;
       break;
diff --git a/chrome/browser/extensions/api/file_system/file_system_api.cc b/chrome/browser/extensions/api/file_system/file_system_api.cc
index f3c0852..63f80f2 100644
--- a/chrome/browser/extensions/api/file_system/file_system_api.cc
+++ b/chrome/browser/extensions/api/file_system/file_system_api.cc
@@ -461,7 +461,7 @@
 
 bool ConsentProviderDelegate::IsWhitelistedComponent(
     const Extension& extension) {
-  for (const auto& whitelisted_id : kRequestFileSystemComponentWhitelist) {
+  for (auto* whitelisted_id : kRequestFileSystemComponentWhitelist) {
     if (extension.id().compare(whitelisted_id) == 0)
       return true;
   }
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc b/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc
index 483482e..5092c74a 100644
--- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc
+++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.cc
@@ -182,7 +182,7 @@
 
   const ScopedVector<SpellcheckHunspellDictionary>& dictionaries(
       service->GetHunspellDictionaries());
-  for (const auto& dictionary : dictionaries) {
+  for (auto* dictionary : dictionaries) {
     hunspell_dictionaries_.push_back(dictionary->AsWeakPtr());
     if (should_listen)
       dictionary->AddObserver(this);
diff --git a/chrome/browser/extensions/api/tabs/tabs_api.cc b/chrome/browser/extensions/api/tabs/tabs_api.cc
index 1b6efc2..a6efc8c 100644
--- a/chrome/browser/extensions/api/tabs/tabs_api.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_api.cc
@@ -336,7 +336,7 @@
   // The WindowControllerList should contain a list of application,
   // browser and devtools windows.
   WindowController* controller = nullptr;
-  for (auto iter : WindowControllerList::GetInstance()->windows()) {
+  for (auto* iter : WindowControllerList::GetInstance()->windows()) {
     if (windows_util::CanOperateOnWindow(this, iter,
                                          extractor.type_filters())) {
       controller = iter;
diff --git a/chrome/browser/extensions/chrome_extension_web_contents_observer.cc b/chrome/browser/extensions/chrome_extension_web_contents_observer.cc
index 466ac326d..19dab65 100644
--- a/chrome/browser/extensions/chrome_extension_web_contents_observer.cc
+++ b/chrome/browser/extensions/chrome_extension_web_contents_observer.cc
@@ -51,7 +51,7 @@
     return;
 
   int process_id = render_view_host->GetProcess()->GetID();
-  auto policy = content::ChildProcessSecurityPolicy::GetInstance();
+  auto* policy = content::ChildProcessSecurityPolicy::GetInstance();
 
   // Components of chrome that are implemented as extensions or platform apps
   // are allowed to use chrome://resources/ and chrome://theme/ URLs.
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.cc b/chrome/browser/extensions/chrome_extensions_browser_client.cc
index f1c6956..ef67583 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.cc
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.cc
@@ -350,7 +350,7 @@
     int embedder_process_id,
     int view_instance_id) {
   // Clean up context menus for the WebView.
-  auto menu_manager =
+  auto* menu_manager =
       MenuManager::Get(Profile::FromBrowserContext(browser_context));
   menu_manager->RemoveAllContextItems(
       MenuItem::ExtensionKey("", embedder_process_id, view_instance_id));
diff --git a/chrome/browser/extensions/extension_management.cc b/chrome/browser/extensions/extension_management.cc
index 025b8616..6b926d7 100644
--- a/chrome/browser/extensions/extension_management.cc
+++ b/chrome/browser/extensions/extension_management.cc
@@ -219,7 +219,7 @@
 bool ExtensionManagement::IsPermissionSetAllowed(
     const Extension* extension,
     const PermissionSet& perms) const {
-  for (const auto& blocked_api : GetBlockedAPIPermissions(extension)) {
+  for (auto* blocked_api : GetBlockedAPIPermissions(extension)) {
     if (perms.HasAPIPermission(blocked_api->id()))
       return false;
   }
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index f0b864a..0d1c2c1 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -234,16 +234,16 @@
     const ScopedVector<ExternalInstallInfoFile>& file_extensions,
     const std::set<std::string>& removed_extensions) {
   // Update pending_extension_manager() with the new extensions first.
-  for (const auto& extension : update_url_extensions)
+  for (auto* extension : update_url_extensions)
     OnExternalExtensionUpdateUrlFound(*extension, false);
-  for (const auto& extension : file_extensions)
+  for (auto* extension : file_extensions)
     OnExternalExtensionFileFound(*extension);
 
 #if DCHECK_IS_ON()
   for (const std::string& id : removed_extensions) {
-    for (const auto& extension : update_url_extensions)
+    for (auto* extension : update_url_extensions)
       DCHECK_NE(id, extension->extension_id);
-    for (const auto& extension : file_extensions)
+    for (auto* extension : file_extensions)
       DCHECK_NE(id, extension->extension_id);
   }
 #endif
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index 5ea5657..7bfd6ee39 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -253,7 +253,7 @@
   size_t bubble_count = 0u;
   std::vector<ExternalInstallError*> errors =
       service->external_install_manager()->GetErrorsForTesting();
-  for (const auto& error : errors)
+  for (auto* error : errors)
     bubble_count += error->alert_type() == ExternalInstallError::BUBBLE_ALERT;
   return bubble_count;
 }
@@ -536,11 +536,11 @@
       const ScopedVector<ExternalInstallInfoUpdateUrl>& update_url_extensions,
       const ScopedVector<ExternalInstallInfoFile>& file_extensions,
       const std::set<std::string>& removed_extensions) override {
-    for (const auto& extension_info : update_url_extensions)
+    for (auto* extension_info : update_url_extensions)
       update_url_extension_ids_.insert(extension_info->extension_id);
     EXPECT_EQ(update_url_extension_ids_.size(), update_url_extensions.size());
 
-    for (const auto& extension_info : file_extensions)
+    for (auto* extension_info : file_extensions)
       file_extension_ids_.insert(extension_info->extension_id);
     EXPECT_EQ(file_extension_ids_.size(), file_extensions.size());
 
@@ -3143,7 +3143,7 @@
 
   // The extension should be disabled, both "blacklist" and "blacklist_state"
   // prefs should be set.
-  const auto prefs = ExtensionPrefs::Get(profile());
+  auto* prefs = ExtensionPrefs::Get(profile());
   EXPECT_FALSE(registry()->enabled_extensions().Contains(good0));
   EXPECT_TRUE(prefs->IsExtensionBlacklisted(good0));
   EXPECT_EQ(extensions::BLACKLISTED_MALWARE,
diff --git a/chrome/browser/extensions/external_provider_impl.cc b/chrome/browser/extensions/external_provider_impl.cc
index 9d130940..9a7026c 100644
--- a/chrome/browser/extensions/external_provider_impl.cc
+++ b/chrome/browser/extensions/external_provider_impl.cc
@@ -127,10 +127,10 @@
 
   RetrieveExtensionsFromPrefs(&external_update_url_extensions,
                               &external_file_extensions);
-  for (const auto& extension : external_update_url_extensions)
+  for (auto* extension : external_update_url_extensions)
     service_->OnExternalExtensionUpdateUrlFound(*extension, true);
 
-  for (const auto& extension : external_file_extensions)
+  for (auto* extension : external_file_extensions)
     service_->OnExternalExtensionFileFound(*extension);
 
   service_->OnExternalProviderReady(this);
diff --git a/chrome/browser/extensions/permissions_based_management_policy_provider_unittest.cc b/chrome/browser/extensions/permissions_based_management_policy_provider_unittest.cc
index 0eac627d..aa919c0 100644
--- a/chrome/browser/extensions/permissions_based_management_policy_provider_unittest.cc
+++ b/chrome/browser/extensions/permissions_based_management_policy_provider_unittest.cc
@@ -49,7 +49,7 @@
   // Get API permissions name for |id|, we cannot use arbitrary strings since
   // they will be ignored by ExtensionManagementService.
   std::string GetAPIPermissionName(APIPermission::ID id) {
-    for (const auto& perm : perm_list_) {
+    for (auto* perm : perm_list_) {
       if (perm->id() == id)
         return perm->name();
     }
diff --git a/chrome/browser/google/google_update_win.cc b/chrome/browser/google/google_update_win.cc
index 02706b0..61ae8ca8 100644
--- a/chrome/browser/google/google_update_win.cc
+++ b/chrome/browser/google/google_update_win.cc
@@ -9,6 +9,7 @@
 #include <stdint.h>
 #include <string.h>
 
+#include <utility>
 #include <vector>
 
 #include "base/bind.h"
@@ -211,7 +212,7 @@
   // Runs an update check on |task_runner|, invoking methods of |delegate| on
   // the caller's thread to report progress and final results.
   static void RunUpdateCheck(
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
+      scoped_refptr<base::SingleThreadTaskRunner> task_runner,
       const std::string& locale,
       bool install_update_if_possible,
       gfx::AcceleratedWidget elevation_window,
@@ -221,7 +222,7 @@
   friend class base::DeleteHelper<UpdateCheckDriver>;
 
   UpdateCheckDriver(
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
+      scoped_refptr<base::SingleThreadTaskRunner> task_runner,
       const std::string& locale,
       bool install_update_if_possible,
       gfx::AcceleratedWidget elevation_window,
@@ -230,6 +231,16 @@
   // Invokes a completion or error method on all delegates, as appropriate.
   ~UpdateCheckDriver();
 
+  // If an UpdateCheckDriver is already running, the delegate is added to the
+  // existing one instead of creating a new one.
+  void AddDelegate(const base::WeakPtr<UpdateCheckDelegate>& delegate);
+
+  // Notifies delegates of an update's progress. |progress|, a number between 0
+  // and 100 (inclusive), is an estimation as to what percentage of the upgrade
+  // has completed. |new_version| indicates the version that is being download
+  // and installed.
+  void NotifyUpgradeProgress(int progress, const base::string16& new_version);
+
   // Starts an update check.
   void BeginUpdateCheck();
 
@@ -305,10 +316,7 @@
   // previous notification) and another future poll will be scheduled.
   void PollGoogleUpdate();
 
-  // If an UpdateCheckDriver is already running, the delegate is added to the
-  // existing one instead of creating a new one.
-  void AddDelegate(const base::WeakPtr<UpdateCheckDelegate>& delegate);
-
+  // The global driver instance. Accessed only on the caller's thread.
   static UpdateCheckDriver* driver_;
 
   // The task runner on which the update checks runs.
@@ -327,7 +335,8 @@
   // A parent window in case any UX is required (e.g., an elevation prompt).
   gfx::AcceleratedWidget elevation_window_;
 
-  // Contains all delegates by which feedback is conveyed.
+  // Contains all delegates by which feedback is conveyed. Accessed only on the
+  // caller's thread.
   std::vector<base::WeakPtr<UpdateCheckDelegate>> delegates_;
 
   // Number of remaining retries allowed when errors occur.
@@ -364,7 +373,7 @@
 
 // static
 void UpdateCheckDriver::RunUpdateCheck(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
     const std::string& locale,
     bool install_update_if_possible,
     gfx::AcceleratedWidget elevation_window,
@@ -388,25 +397,24 @@
 
 // Runs on the caller's thread.
 UpdateCheckDriver::UpdateCheckDriver(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
     const std::string& locale,
     bool install_update_if_possible,
     gfx::AcceleratedWidget elevation_window,
     const base::WeakPtr<UpdateCheckDelegate>& delegate)
-    : task_runner_(task_runner),
+    : task_runner_(std::move(task_runner)),
       result_runner_(base::ThreadTaskRunnerHandle::Get()),
       locale_(locale),
       install_update_if_possible_(install_update_if_possible),
       elevation_window_(elevation_window),
+      delegates_(1, delegate),
       allowed_retries_(kGoogleAllowedRetries),
       system_level_install_(false),
       last_reported_progress_(0),
       status_(UPGRADE_ERROR),
       error_code_(GOOGLE_UPDATE_NO_ERROR),
       hresult_(S_OK),
-      installer_exit_code_(-1) {
-  delegates_.push_back(delegate);
-}
+      installer_exit_code_(-1) {}
 
 UpdateCheckDriver::~UpdateCheckDriver() {
   DCHECK(result_runner_->BelongsToCurrentThread());
@@ -427,7 +435,7 @@
 
   // Clear the driver before calling the delegates because they might call
   // BeginUpdateCheck() and they must not add themselves to the current
-  // instance of UpdateCheckDriver, which is currently being destroyed.
+  // instance of UpdateCheckDriver, which is being destroyed.
   driver_ = nullptr;
 
   for (const auto& delegate : delegates_) {
@@ -442,6 +450,23 @@
   }
 }
 
+void UpdateCheckDriver::AddDelegate(
+    const base::WeakPtr<UpdateCheckDelegate>& delegate) {
+  DCHECK(result_runner_->BelongsToCurrentThread());
+  delegates_.push_back(delegate);
+}
+
+void UpdateCheckDriver::NotifyUpgradeProgress(
+    int progress,
+    const base::string16& new_version) {
+  DCHECK(result_runner_->BelongsToCurrentThread());
+
+  for (const auto& delegate : delegates_) {
+    if (delegate)
+      delegate->OnUpgradeProgress(progress, new_version);
+  }
+}
+
 void UpdateCheckDriver::BeginUpdateCheck() {
   GoogleUpdateErrorCode error_code = GOOGLE_UPDATE_NO_ERROR;
   HRESULT hresult = BeginUpdateCheckInternal(&error_code);
@@ -783,12 +808,10 @@
 
       // It is safe to post this task with an unretained pointer since the task
       // is guaranteed to run before a subsequent DeleteSoon is handled.
-      for (const auto& delegate : delegates_) {
-        result_runner_->PostTask(
-            FROM_HERE,
-            base::Bind(&UpdateCheckDelegate::OnUpgradeProgress, delegate,
-                       last_reported_progress_, new_version_));
-      }
+      result_runner_->PostTask(
+          FROM_HERE, base::Bind(&UpdateCheckDriver::NotifyUpgradeProgress,
+                                base::Unretained(this), last_reported_progress_,
+                                new_version_));
     }
 
     // Schedule the next check.
@@ -810,11 +833,6 @@
   result_runner_->DeleteSoon(FROM_HERE, this);
 }
 
-void UpdateCheckDriver::AddDelegate(
-    const base::WeakPtr<UpdateCheckDelegate>& delegate) {
-  delegates_.push_back(delegate);
-}
-
 void UpdateCheckDriver::OnUpgradeError(GoogleUpdateErrorCode error_code,
                                        HRESULT hresult,
                                        int installer_exit_code,
@@ -855,12 +873,12 @@
 // Globals ---------------------------------------------------------------------
 
 void BeginUpdateCheck(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
     const std::string& locale,
     bool install_update_if_possible,
     gfx::AcceleratedWidget elevation_window,
     const base::WeakPtr<UpdateCheckDelegate>& delegate) {
-  UpdateCheckDriver::RunUpdateCheck(task_runner, locale,
+  UpdateCheckDriver::RunUpdateCheck(std::move(task_runner), locale,
                                     install_update_if_possible,
                                     elevation_window, delegate);
 }
diff --git a/chrome/browser/google/google_update_win.h b/chrome/browser/google/google_update_win.h
index 0c4efac..33760ca 100644
--- a/chrome/browser/google/google_update_win.h
+++ b/chrome/browser/google/google_update_win.h
@@ -94,7 +94,7 @@
 // invoked on the caller's thread to provide feedback on the operation, with
 // messages localized to |locale| if possible.
 void BeginUpdateCheck(
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
     const std::string& locale,
     bool install_update_if_possible,
     gfx::AcceleratedWidget elevation_window,
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc
index 33ee5ea4..b25829b2 100644
--- a/chrome/browser/io_thread.cc
+++ b/chrome/browser/io_thread.cc
@@ -548,15 +548,18 @@
           curr_log, ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
       CHECK_GE(log_metadata.size(), 3u)
           << "CT log metadata missing: Switch format is "
-          << "'description:base64_key:url_without_schema'.";
+          << "'description:base64_key:url_without_schema[:dns_domain]'.";
       std::string log_description(log_metadata[0]);
       std::string log_url(std::string("https://") + log_metadata[2]);
+      std::string log_dns_domain;
+      if (log_metadata.size() >= 4)
+        log_dns_domain = log_metadata[3];
       std::string ct_public_key_data;
       CHECK(base::Base64Decode(log_metadata[1], &ct_public_key_data))
           << "Unable to decode CT public key.";
       scoped_refptr<const net::CTLogVerifier> external_log_verifier(
           net::CTLogVerifier::Create(ct_public_key_data, log_description,
-                                     log_url));
+                                     log_url, log_dns_domain));
       CHECK(external_log_verifier) << "Unable to parse CT public key.";
       VLOG(1) << "Adding log with description " << log_description;
       ct_logs.push_back(external_log_verifier);
diff --git a/chrome/browser/lifetime/browser_close_manager.cc b/chrome/browser/lifetime/browser_close_manager.cc
index 809a4568..e8c64d2 100644
--- a/chrome/browser/lifetime/browser_close_manager.cc
+++ b/chrome/browser/lifetime/browser_close_manager.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/browser_shutdown.h"
 #include "chrome/browser/download/download_service.h"
 #include "chrome/browser/download/download_service_factory.h"
+#include "chrome/browser/lifetime/application_lifetime.h"
 #include "chrome/browser/notifications/notification_ui_manager.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/browser.h"
diff --git a/chrome/browser/lifetime/keep_alive_registry.cc b/chrome/browser/lifetime/keep_alive_registry.cc
index f1ed172..77c3ae3 100644
--- a/chrome/browser/lifetime/keep_alive_registry.cc
+++ b/chrome/browser/lifetime/keep_alive_registry.cc
@@ -92,12 +92,14 @@
   bool new_keeping_alive = IsKeepingAlive();
   bool new_restart_allowed = IsRestartAllowed();
 
-  if (new_restart_allowed != old_restart_allowed)
-    OnRestartAllowedChanged(new_restart_allowed);
-
+  // Update the KeepAlive state first, so that listeners can check if we are
+  // trying to shutdown.
   if (new_keeping_alive != old_keeping_alive)
     OnKeepAliveStateChanged(new_keeping_alive);
 
+  if (new_restart_allowed != old_restart_allowed)
+    OnRestartAllowedChanged(new_restart_allowed);
+
   DVLOG(1) << "New state of the KeepAliveRegistry:" << *this;
 }
 
diff --git a/chrome/browser/media/router/BUILD.gn b/chrome/browser/media/router/BUILD.gn
index 5dd8c81..34114c8 100644
--- a/chrome/browser/media/router/BUILD.gn
+++ b/chrome/browser/media/router/BUILD.gn
@@ -81,8 +81,6 @@
   sources = [
     "mojo/media_router.mojom",
   ]
-
-  use_new_wrapper_types = false
 }
 
 static_library("test_support") {
diff --git a/chrome/browser/media/router/media_router.gyp b/chrome/browser/media/router/media_router.gyp
index cfbe5d9..2785f49a 100644
--- a/chrome/browser/media/router/media_router.gyp
+++ b/chrome/browser/media/router/media_router.gyp
@@ -46,9 +46,6 @@
       'sources': [
         'mojo/media_router.mojom',
       ],
-      'variables': {
-        'use_new_wrapper_types': 'false',
-      },
       'includes': [
         '../../../../mojo/mojom_bindings_generator.gypi',
       ],
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
index f81b1afbc..961b958e 100644
--- a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
+++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
@@ -46,20 +46,19 @@
   std::unique_ptr<content::PresentationSessionMessage> output;
   switch (input->type) {
     case interfaces::RouteMessage::Type::TEXT: {
-      DCHECK(!input->message.is_null());
-      DCHECK(input->data.is_null());
+      DCHECK(input->message);
+      DCHECK(!input->data);
       output.reset(new content::PresentationSessionMessage(
           content::PresentationMessageType::TEXT));
-      input->message.Swap(&output->message);
+      output->message = std::move(*input->message);
       return output;
     }
     case interfaces::RouteMessage::Type::BINARY: {
-      DCHECK(!input->data.is_null());
-      DCHECK(input->message.is_null());
+      DCHECK(input->data);
+      DCHECK(!input->message);
       output.reset(new content::PresentationSessionMessage(
           content::PresentationMessageType::ARRAY_BUFFER));
-      output->data.reset(new std::vector<uint8_t>);
-      input->data.Swap(output->data.get());
+      output->data.reset(new std::vector<uint8_t>(std::move(*input->data)));
       return output;
     }
   }
@@ -68,11 +67,6 @@
   return output;
 }
 
-void ForwardSinkSearchCallback(const MediaSinkSearchResponseCallback& callback,
-                               mojo::String sink_id) {
-  callback.Run(sink_id);
-}
-
 }  // namespace
 
 MediaRouterMojoImpl::MediaRoutesQuery::MediaRoutesQuery() = default;
@@ -200,9 +194,9 @@
 }
 
 void MediaRouterMojoImpl::OnSinksReceived(
-    const mojo::String& media_source,
-    mojo::Array<interfaces::MediaSinkPtr> sinks,
-    mojo::Array<mojo::String> origins) {
+    const std::string& media_source,
+    std::vector<interfaces::MediaSinkPtr> sinks,
+    const std::vector<std::string>& origins) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DVLOG_WITH_INSTANCE(1) << "OnSinksReceived";
   auto it = sinks_queries_.find(media_source);
@@ -214,7 +208,7 @@
   std::vector<GURL> origin_list;
   origin_list.reserve(origins.size());
   for (size_t i = 0; i < origins.size(); ++i) {
-    GURL origin(origins[i].get());
+    GURL origin(origins[i]);
     if (!origin.is_valid()) {
       LOG(WARNING) << "Received invalid origin: " << origin
                    << ". Dropping result.";
@@ -244,9 +238,9 @@
 }
 
 void MediaRouterMojoImpl::OnRoutesUpdated(
-    mojo::Array<interfaces::MediaRoutePtr> routes,
-    const mojo::String& media_source,
-    mojo::Array<mojo::String> joinable_route_ids) {
+    std::vector<interfaces::MediaRoutePtr> routes,
+    const std::string& media_source,
+    const std::vector<std::string>& joinable_route_ids) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   DVLOG_WITH_INSTANCE(1) << "OnRoutesUpdated";
@@ -260,16 +254,12 @@
 
   std::vector<MediaRoute> routes_converted;
   routes_converted.reserve(routes.size());
-
   for (size_t i = 0; i < routes.size(); ++i)
     routes_converted.push_back(routes[i].To<MediaRoute>());
 
-  std::vector<MediaRoute::Id> joinable_routes_converted =
-      joinable_route_ids.To<std::vector<std::string>>();
-
   FOR_EACH_OBSERVER(
       MediaRoutesObserver, it->second->observers,
-      OnRoutesUpdated(routes_converted, joinable_routes_converted));
+      OnRoutesUpdated(routes_converted, joinable_route_ids));
 }
 
 void MediaRouterMojoImpl::RouteResponseReceived(
@@ -277,14 +267,13 @@
     bool incognito,
     const std::vector<MediaRouteResponseCallback>& callbacks,
     interfaces::MediaRoutePtr media_route,
-    mojo::String error_text,
+    const base::Optional<std::string>& error_text,
     interfaces::RouteRequestResultCode result_code) {
   std::unique_ptr<RouteRequestResult> result;
   if (media_route.is_null()) {
     // An error occurred.
-    DCHECK(!error_text.is_null());
-    std::string error =
-        !error_text.get().empty() ? error_text.get() : "Unknown error.";
+    const std::string& error = (error_text && !error_text->empty())
+        ? *error_text : std::string("Unknown error.");
     result = RouteRequestResult::FromError(
         error, mojo::RouteRequestResultCodeFromMojo(result_code));
   } else if (media_route->incognito != incognito) {
@@ -712,10 +701,7 @@
     std::unique_ptr<std::vector<uint8_t>> data,
     const SendRouteMessageCallback& callback) {
   DVLOG_WITH_INSTANCE(1) << "SendRouteBinaryMessage " << route_id;
-  mojo::Array<uint8_t> mojo_array;
-  mojo_array.Swap(data.get());
-  media_route_provider_->SendRouteBinaryMessage(route_id, std::move(mojo_array),
-                                                callback);
+  media_route_provider_->SendRouteBinaryMessage(route_id, *data, callback);
 }
 
 void MediaRouterMojoImpl::DoStartListeningForRouteMessages(
@@ -741,16 +727,15 @@
   sink_search_criteria->input = search_input;
   sink_search_criteria->domain = domain;
   media_route_provider_->SearchSinks(
-      sink_id, source_id, std::move(sink_search_criteria),
-      base::Bind(&ForwardSinkSearchCallback, sink_callback));
+      sink_id, source_id, std::move(sink_search_criteria), sink_callback);
 }
 
 void MediaRouterMojoImpl::OnRouteMessagesReceived(
-    const mojo::String& route_id,
-    mojo::Array<interfaces::RouteMessagePtr> messages) {
+    const std::string& route_id,
+    std::vector<interfaces::RouteMessagePtr> messages) {
   DVLOG_WITH_INSTANCE(1) << "OnRouteMessagesReceived";
 
-  DCHECK(!messages.storage().empty());
+  DCHECK(!messages.empty());
 
   auto* observer_list = messages_observers_.get(route_id);
   if (!observer_list) {
@@ -796,16 +781,16 @@
 }
 
 void MediaRouterMojoImpl::OnPresentationConnectionStateChanged(
-    const mojo::String& route_id,
+    const std::string& route_id,
     interfaces::MediaRouter::PresentationConnectionState state) {
   NotifyPresentationConnectionStateChange(
       route_id, mojo::PresentationConnectionStateFromMojo(state));
 }
 
 void MediaRouterMojoImpl::OnPresentationConnectionClosed(
-    const mojo::String& route_id,
+    const std::string& route_id,
     interfaces::MediaRouter::PresentationConnectionCloseReason reason,
-    const mojo::String& message) {
+    const std::string& message) {
   NotifyPresentationConnectionClose(
       route_id, mojo::PresentationConnectionCloseReasonFromMojo(reason),
       message);
@@ -813,11 +798,12 @@
 
 void MediaRouterMojoImpl::OnTerminateRouteResult(
     const MediaRoute::Id& route_id,
-    mojo::String error_text,
+    const base::Optional<std::string>& error_text,
     interfaces::RouteRequestResultCode result_code) {
   if (result_code != interfaces::RouteRequestResultCode::OK) {
-    LOG(WARNING) << "Failed to terminate route " << route_id <<
-        ": result_code = " << result_code << ", " << error_text;
+    LOG(WARNING) << "Failed to terminate route " << route_id
+                 << ": result_code = " << result_code << ", "
+                 << error_text.value_or(std::string());
   }
   MediaRouterMojoMetrics::RecordMediaRouteProviderTerminateRoute(
       mojo::RouteRequestResultCodeFromMojo(result_code));
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.h b/chrome/browser/media/router/mojo/media_router_mojo_impl.h
index 72f18aa..a32fa52 100644
--- a/chrome/browser/media/router/mojo/media_router_mojo_impl.h
+++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.h
@@ -287,29 +287,30 @@
       const interfaces::MediaRouter::RegisterMediaRouteProviderCallback&
           callback) override;
   void OnIssue(interfaces::IssuePtr issue) override;
-  void OnSinksReceived(const mojo::String& media_source,
-                       mojo::Array<interfaces::MediaSinkPtr> sinks,
-                       mojo::Array<mojo::String> origins) override;
-  void OnRoutesUpdated(mojo::Array<interfaces::MediaRoutePtr> routes,
-                       const mojo::String& media_source,
-                       mojo::Array<mojo::String> joinable_route_ids) override;
+  void OnSinksReceived(const std::string& media_source,
+                       std::vector<interfaces::MediaSinkPtr> sinks,
+                       const std::vector<std::string>& origins) override;
+  void OnRoutesUpdated(
+      std::vector<interfaces::MediaRoutePtr> routes,
+      const std::string& media_source,
+      const std::vector<std::string>& joinable_route_ids) override;
   void OnSinkAvailabilityUpdated(
       interfaces::MediaRouter::SinkAvailability availability) override;
   void OnPresentationConnectionStateChanged(
-      const mojo::String& route_id,
+      const std::string& route_id,
       interfaces::MediaRouter::PresentationConnectionState state) override;
   void OnPresentationConnectionClosed(
-      const mojo::String& route_id,
+      const std::string& route_id,
       interfaces::MediaRouter::PresentationConnectionCloseReason reason,
-      const mojo::String& message) override;
+      const std::string& message) override;
   void OnRouteMessagesReceived(
-      const mojo::String& route_id,
-      mojo::Array<interfaces::RouteMessagePtr> messages) override;
+      const std::string& route_id,
+      std::vector<interfaces::RouteMessagePtr> messages) override;
 
   // Result callback when Mojo terminateRoute is invoked.  |route_id| is bound
   // to the ID of the route that was terminated.
   void OnTerminateRouteResult(const MediaRoute::Id& route_id,
-                              mojo::String error_text,
+                              const base::Optional<std::string>& error_text,
                               interfaces::RouteRequestResultCode result_code);
 
   // Converts the callback result of calling Mojo CreateRoute()/JoinRoute()
@@ -319,7 +320,7 @@
       bool incognito,
       const std::vector<MediaRouteResponseCallback>& callbacks,
       interfaces::MediaRoutePtr media_route,
-      mojo::String error_text,
+      const base::Optional<std::string>& error_text,
       interfaces::RouteRequestResultCode result_code);
 
   // Callback invoked by |event_page_tracker_| after an attempt to wake the
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl_unittest.cc b/chrome/browser/media/router/mojo/media_router_mojo_impl_unittest.cc
index 959910e..8ca4222 100644
--- a/chrome/browser/media/router/mojo/media_router_mojo_impl_unittest.cc
+++ b/chrome/browser/media/router/mojo/media_router_mojo_impl_unittest.cc
@@ -96,11 +96,10 @@
 interfaces::IssuePtr CreateMojoIssue(const std::string& title) {
   interfaces::IssuePtr mojoIssue = interfaces::Issue::New();
   mojoIssue->title = title;
-  mojoIssue->message = "msg";
-  mojoIssue->route_id = "";
+  mojoIssue->message = std::string("msg");
+  mojoIssue->route_id = std::string();
   mojoIssue->default_action = interfaces::Issue::ActionType::DISMISS;
-  mojoIssue->secondary_actions =
-      mojo::Array<interfaces::Issue::ActionType>::New(0);
+  mojoIssue->secondary_actions = std::vector<interfaces::Issue::ActionType>();
   mojoIssue->severity = interfaces::Issue::Severity::WARNING;
   mojoIssue->is_blocking = false;
   mojoIssue->help_page_id = -1;
@@ -109,7 +108,7 @@
 
 interfaces::MediaRoutePtr CreateMojoRoute() {
   interfaces::MediaRoutePtr route = interfaces::MediaRoute::New();
-  route->media_source = kSource;
+  route->media_source = std::string(kSource);
   route->media_sink_id = kSinkId;
   route->media_route_id = kRouteId;
   route->description = kDescription;
@@ -222,7 +221,7 @@
 // Mockable class for awaiting RegisterMediaRouteProvider callbacks.
 class RegisterMediaRouteProviderHandler {
  public:
-  MOCK_METHOD1(Invoke, void(mojo::String instance_id));
+  MOCK_METHOD1(Invoke, void(const std::string& instance_id));
 };
 
 TEST_F(MediaRouterMojoImplTest, CreateRoute) {
@@ -234,14 +233,13 @@
   // a limitation with GMock::Invoke that prevents it from using move-only types
   // in runnable parameter lists.
   EXPECT_CALL(mock_media_route_provider_,
-              CreateRoute(mojo::String(kSource), mojo::String(kSinkId), _,
-                          mojo::String(kOrigin), kInvalidTabId, _, _, _))
+              CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, _, _, _))
       .WillOnce(Invoke(
-          [](const mojo::String& source, const mojo::String& sink,
-             const mojo::String& presentation_id, const mojo::String& origin,
+          [](const std::string& source, const std::string& sink,
+             const std::string& presentation_id, const std::string& origin,
              int tab_id, int64_t timeout_millis, bool incognito,
              const interfaces::MediaRouteProvider::CreateRouteCallback& cb) {
-            cb.Run(CreateMojoRoute(), mojo::String(),
+            cb.Run(CreateMojoRoute(), std::string(),
                    interfaces::RouteRequestResultCode::OK);
           }));
 
@@ -269,17 +267,17 @@
   // a limitation with GMock::Invoke that prevents it from using move-only types
   // in runnable parameter lists.
   EXPECT_CALL(mock_media_route_provider_,
-              CreateRoute(mojo::String(kSource), mojo::String(kSinkId), _,
-                          mojo::String(kOrigin), kInvalidTabId, _, _, _))
+              CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, _, _, _))
       .WillOnce(Invoke(
-          [](const mojo::String& source, const mojo::String& sink,
-             const mojo::String& presentation_id, const mojo::String& origin,
+          [](const std::string& source, const std::string& sink,
+             const std::string& presentation_id, const std::string& origin,
              int tab_id, int64_t timeout_millis, bool incognito,
              const interfaces::MediaRouteProvider::CreateRouteCallback& cb) {
             interfaces::MediaRoutePtr route = CreateMojoRoute();
-            route->custom_controller_path = "custom/controller/path";
+            route->custom_controller_path =
+                std::string("custom/controller/path");
             route->incognito = true;
-            cb.Run(std::move(route), mojo::String(),
+            cb.Run(std::move(route), std::string(),
                    interfaces::RouteRequestResultCode::OK);
           }));
 
@@ -300,14 +298,14 @@
 TEST_F(MediaRouterMojoImplTest, CreateRouteFails) {
   EXPECT_CALL(
       mock_media_route_provider_,
-      CreateRoute(mojo::String(kSource), mojo::String(kSinkId), _,
-                  mojo::String(kOrigin), kInvalidTabId, kTimeoutMillis, _, _))
+      CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId, kTimeoutMillis,
+                  _, _))
       .WillOnce(Invoke(
-          [](const mojo::String& source, const mojo::String& sink,
-             const mojo::String& presentation_id, const mojo::String& origin,
+          [](const std::string& source, const std::string& sink,
+             const std::string& presentation_id, const std::string& origin,
              int tab_id, int64_t timeout_millis, bool incognito,
              const interfaces::MediaRouteProvider::CreateRouteCallback& cb) {
-            cb.Run(interfaces::MediaRoutePtr(), mojo::String(kError),
+            cb.Run(interfaces::MediaRoutePtr(), std::string(kError),
                    interfaces::RouteRequestResultCode::TIMED_OUT);
           }));
 
@@ -327,15 +325,14 @@
 
 TEST_F(MediaRouterMojoImplTest, CreateRouteIncognitoMismatchFails) {
   EXPECT_CALL(mock_media_route_provider_,
-              CreateRoute(mojo::String(kSource), mojo::String(kSinkId), _,
-                          mojo::String(kOrigin), kInvalidTabId, kTimeoutMillis,
-                          true, _))
+              CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId,
+                          kTimeoutMillis, true, _))
       .WillOnce(Invoke(
-          [](const mojo::String& source, const mojo::String& sink,
-             const mojo::String& presentation_id, const mojo::String& origin,
+          [](const std::string& source, const std::string& sink,
+             const std::string& presentation_id, const std::string& origin,
              int tab_id, int64_t timeout_millis, bool incognito,
              const interfaces::MediaRouteProvider::CreateRouteCallback& cb) {
-            cb.Run(CreateMojoRoute(), mojo::String(),
+            cb.Run(CreateMojoRoute(), std::string(),
                    interfaces::RouteRequestResultCode::OK);
           }));
 
@@ -359,17 +356,16 @@
   route->incognito = true;
 
   EXPECT_CALL(mock_media_route_provider_,
-              CreateRoute(mojo::String(kSource), mojo::String(kSinkId), _,
-                          mojo::String(kOrigin), kInvalidTabId, kTimeoutMillis,
-                          true, _))
+              CreateRoute(kSource, kSinkId, _, kOrigin, kInvalidTabId,
+                          kTimeoutMillis, true, _))
       .WillOnce(Invoke(
-          [](const mojo::String& source, const mojo::String& sink,
-             const mojo::String& presentation_id, const mojo::String& origin,
+          [](const std::string& source, const std::string& sink,
+             const std::string& presentation_id, const std::string& origin,
              int tab_id, int64_t timeout_millis, bool incognito,
              const interfaces::MediaRouteProvider::CreateRouteCallback& cb) {
             interfaces::MediaRoutePtr route = CreateMojoRoute();
             route->incognito = true;
-            cb.Run(std::move(route), mojo::String(),
+            cb.Run(std::move(route), std::string(),
                    interfaces::RouteRequestResultCode::OK);
           }));
   base::RunLoop run_loop;
@@ -377,21 +373,20 @@
                         std::vector<MediaRouteResponseCallback>(),
                         base::TimeDelta::FromMilliseconds(kTimeoutMillis),
                         true);
-  mojo::Array<interfaces::MediaRoutePtr> mojo_routes(1);
+  std::vector<interfaces::MediaRoutePtr> mojo_routes(1);
   mojo_routes[0] = route->Clone();
-  router()->OnRoutesUpdated(std::move(mojo_routes), mojo::String(),
-                            mojo::Array<mojo::String>());
+  router()->OnRoutesUpdated(std::move(mojo_routes), std::string(),
+                            std::vector<std::string>());
 
   // TODO(mfoltz): Where possible, convert other tests to use RunUntilIdle
   // instead of manually calling Run/Quit on the run loop.
   run_loop.RunUntilIdle();
 
-  EXPECT_CALL(mock_media_route_provider_,
-              TerminateRoute(mojo::String(kRouteId), _))
+  EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _))
       .WillOnce(Invoke([](
-          const mojo::String& route_id,
+          const std::string& route_id,
           const interfaces::MediaRouteProvider::TerminateRouteCallback& cb) {
-         cb.Run(mojo::String(), interfaces::RouteRequestResultCode::OK);
+         cb.Run(base::nullopt, interfaces::RouteRequestResultCode::OK);
        }));
 
   base::RunLoop run_loop2;
@@ -407,10 +402,10 @@
   interfaces::MediaRoutePtr route = CreateMojoRoute();
   // Make sure the MR has received an update with the route, so it knows there
   // is a route to join.
-  mojo::Array<interfaces::MediaRoutePtr> mojo_routes(1);
+  std::vector<interfaces::MediaRoutePtr> mojo_routes(1);
   mojo_routes[0] = route->Clone();
-  router()->OnRoutesUpdated(std::move(mojo_routes), mojo::String(),
-                            mojo::Array<mojo::String>());
+  router()->OnRoutesUpdated(std::move(mojo_routes), std::string(),
+                            std::vector<std::string>());
   EXPECT_TRUE(router()->HasJoinableRoute());
 
   // Use a lambda function as an invocation target here to work around
@@ -418,14 +413,14 @@
   // in runnable parameter lists.
   EXPECT_CALL(
       mock_media_route_provider_,
-      JoinRoute(mojo::String(kSource), mojo::String(kPresentationId),
-                mojo::String(kOrigin), kInvalidTabId, kTimeoutMillis, _, _))
+      JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId,
+                kTimeoutMillis, _, _))
       .WillOnce(Invoke([&route](
-          const mojo::String& source, const mojo::String& presentation_id,
-          const mojo::String& origin, int tab_id, int64_t timeout_millis,
+          const std::string& source, const std::string& presentation_id,
+          const std::string& origin, int tab_id, int64_t timeout_millis,
           bool incognito,
           const interfaces::MediaRouteProvider::JoinRouteCallback& cb) {
-        cb.Run(std::move(route), mojo::String(),
+        cb.Run(std::move(route), std::string(),
                interfaces::RouteRequestResultCode::OK);
       }));
 
@@ -461,22 +456,22 @@
 TEST_F(MediaRouterMojoImplTest, JoinRouteTimedOutFails) {
   // Make sure the MR has received an update with the route, so it knows there
   // is a route to join.
-  mojo::Array<interfaces::MediaRoutePtr> mojo_routes(1);
+  std::vector<interfaces::MediaRoutePtr> mojo_routes(1);
   mojo_routes[0] = CreateMojoRoute();
-  router()->OnRoutesUpdated(std::move(mojo_routes), mojo::String(),
-                            mojo::Array<mojo::String>());
+  router()->OnRoutesUpdated(std::move(mojo_routes), std::string(),
+                            std::vector<std::string>());
   EXPECT_TRUE(router()->HasJoinableRoute());
 
   EXPECT_CALL(
       mock_media_route_provider_,
-      JoinRoute(mojo::String(kSource), mojo::String(kPresentationId),
-                mojo::String(kOrigin), kInvalidTabId, kTimeoutMillis, _, _))
+      JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId,
+                kTimeoutMillis, _, _))
       .WillOnce(Invoke(
-          [](const mojo::String& source, const mojo::String& presentation_id,
-             const mojo::String& origin, int tab_id, int64_t timeout_millis,
+          [](const std::string& source, const std::string& presentation_id,
+             const std::string& origin, int tab_id, int64_t timeout_millis,
              bool incognito,
              const interfaces::MediaRouteProvider::JoinRouteCallback& cb) {
-            cb.Run(interfaces::MediaRoutePtr(), mojo::String(kError),
+            cb.Run(interfaces::MediaRoutePtr(), std::string(kError),
                    interfaces::RouteRequestResultCode::TIMED_OUT);
           }));
 
@@ -499,10 +494,10 @@
 
   // Make sure the MR has received an update with the route, so it knows there
   // is a route to join.
-  mojo::Array<interfaces::MediaRoutePtr> mojo_routes(1);
+  std::vector<interfaces::MediaRoutePtr> mojo_routes(1);
   mojo_routes[0] = route->Clone();
-  router()->OnRoutesUpdated(std::move(mojo_routes), mojo::String(),
-                            mojo::Array<mojo::String>());
+  router()->OnRoutesUpdated(std::move(mojo_routes), std::string(),
+                            std::vector<std::string>());
   EXPECT_TRUE(router()->HasJoinableRoute());
 
   // Use a lambda function as an invocation target here to work around
@@ -510,14 +505,14 @@
   // in runnable parameter lists.
   EXPECT_CALL(
       mock_media_route_provider_,
-      JoinRoute(mojo::String(kSource), mojo::String(kPresentationId),
-                mojo::String(kOrigin), kInvalidTabId, kTimeoutMillis, true, _))
+      JoinRoute(kSource, kPresentationId, kOrigin, kInvalidTabId,
+                kTimeoutMillis, true, _))
       .WillOnce(Invoke([&route](
-          const mojo::String& source, const mojo::String& presentation_id,
-          const mojo::String& origin, int tab_id, int64_t timeout_millis,
+          const std::string& source, const std::string& presentation_id,
+          const std::string& origin, int tab_id, int64_t timeout_millis,
           bool incognito,
           const interfaces::MediaRouteProvider::JoinRouteCallback& cb) {
-        cb.Run(std::move(route), mojo::String(),
+        cb.Run(std::move(route), std::string(),
                interfaces::RouteRequestResultCode::OK);
       }));
 
@@ -548,15 +543,14 @@
   // in runnable parameter lists.
   EXPECT_CALL(
       mock_media_route_provider_,
-      ConnectRouteByRouteId(mojo::String(kSource), mojo::String(kRouteId), _,
-                            mojo::String(kOrigin), kInvalidTabId,
+      ConnectRouteByRouteId(kSource, kRouteId, _, kOrigin, kInvalidTabId,
                             kTimeoutMillis, false, _))
       .WillOnce(Invoke([&route](
-          const mojo::String& source, const mojo::String& route_id,
-          const mojo::String& presentation_id, const mojo::String& origin,
+          const std::string& source, const std::string& route_id,
+          const std::string& presentation_id, const std::string& origin,
           int tab_id, int64_t timeout_millis, bool incognito,
           const interfaces::MediaRouteProvider::JoinRouteCallback& cb) {
-        cb.Run(std::move(route), mojo::String(),
+        cb.Run(std::move(route), std::string(),
                interfaces::RouteRequestResultCode::OK);
       }));
 
@@ -577,15 +571,14 @@
 TEST_F(MediaRouterMojoImplTest, ConnectRouteByRouteIdFails) {
   EXPECT_CALL(
       mock_media_route_provider_,
-      ConnectRouteByRouteId(mojo::String(kSource), mojo::String(kRouteId), _,
-                            mojo::String(kOrigin), kInvalidTabId,
+      ConnectRouteByRouteId(kSource, kRouteId, _, kOrigin, kInvalidTabId,
                             kTimeoutMillis, true, _))
       .WillOnce(Invoke(
-          [](const mojo::String& source, const mojo::String& route_id,
-             const mojo::String& presentation_id, const mojo::String& origin,
+          [](const std::string& source, const std::string& route_id,
+             const std::string& presentation_id, const std::string& origin,
              int tab_id, int64_t timeout_millis, bool incognito,
              const interfaces::MediaRouteProvider::JoinRouteCallback& cb) {
-            cb.Run(interfaces::MediaRoutePtr(), mojo::String(kError),
+            cb.Run(interfaces::MediaRoutePtr(), std::string(kError),
                    interfaces::RouteRequestResultCode::TIMED_OUT);
           }));
 
@@ -611,15 +604,14 @@
   // in runnable parameter lists.
   EXPECT_CALL(
       mock_media_route_provider_,
-      ConnectRouteByRouteId(mojo::String(kSource), mojo::String(kRouteId), _,
-                            mojo::String(kOrigin), kInvalidTabId,
+      ConnectRouteByRouteId(kSource, kRouteId, _, kOrigin, kInvalidTabId,
                             kTimeoutMillis, true, _))
       .WillOnce(Invoke([&route](
-          const mojo::String& source, const mojo::String& route_id,
-          const mojo::String& presentation_id, const mojo::String& origin,
+          const std::string& source, const std::string& route_id,
+          const std::string& presentation_id, const std::string& origin,
           int tab_id, int64_t timeout_millis, bool incognito,
           const interfaces::MediaRouteProvider::JoinRouteCallback& cb) {
-        cb.Run(std::move(route), mojo::String(),
+        cb.Run(std::move(route), std::string(),
                interfaces::RouteRequestResultCode::OK);
       }));
 
@@ -640,7 +632,7 @@
 
 TEST_F(MediaRouterMojoImplTest, DetachRoute) {
   base::RunLoop run_loop;
-  EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId)))
+  EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId))
       .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
   router()->DetachRoute(kRouteId);
   run_loop.Run();
@@ -648,12 +640,11 @@
 
 TEST_F(MediaRouterMojoImplTest, TerminateRoute) {
   base::RunLoop run_loop;
-  EXPECT_CALL(mock_media_route_provider_,
-              TerminateRoute(mojo::String(kRouteId), _))
+  EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _))
       .WillOnce(Invoke([&run_loop](
-          const mojo::String& route_id,
+          const std::string& route_id,
           const interfaces::MediaRouteProvider::TerminateRouteCallback& cb) {
-        cb.Run(mojo::String(), interfaces::RouteRequestResultCode::OK);
+         cb.Run(base::nullopt, interfaces::RouteRequestResultCode::OK);
       }));
   router()->TerminateRoute(kRouteId);
   run_loop.RunUntilIdle();
@@ -664,12 +655,12 @@
 
 TEST_F(MediaRouterMojoImplTest, TerminateRouteFails) {
   base::RunLoop run_loop;
-  EXPECT_CALL(mock_media_route_provider_,
-              TerminateRoute(mojo::String(kRouteId), _))
+  EXPECT_CALL(mock_media_route_provider_, TerminateRoute(kRouteId, _))
       .WillOnce(Invoke([&run_loop](
           const mojo::String& route_id,
           const interfaces::MediaRouteProvider::TerminateRouteCallback& cb) {
-        cb.Run(mojo::String(), interfaces::RouteRequestResultCode::TIMED_OUT);
+         cb.Run(std::string("timed out"),
+                interfaces::RouteRequestResultCode::TIMED_OUT);
       }));
   router()->TerminateRoute(kRouteId);
   run_loop.RunUntilIdle();
@@ -743,10 +734,8 @@
 
   // These should only be called once even if there is more than one observer
   // for a given source.
-  EXPECT_CALL(mock_media_route_provider_,
-              StartObservingMediaSinks(mojo::String(kSource)));
-  EXPECT_CALL(mock_media_route_provider_,
-              StartObservingMediaSinks(mojo::String(kSource2)));
+  EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource));
+  EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource2));
 
   std::unique_ptr<MockMediaSinksObserver> sinks_observer(
       new MockMediaSinksObserver(router(), media_source, origin));
@@ -765,7 +754,7 @@
   expected_sinks.push_back(
       MediaSink(kSinkId2, kSinkName, MediaSink::IconType::CAST));
 
-  mojo::Array<interfaces::MediaSinkPtr> mojo_sinks(2);
+  std::vector<interfaces::MediaSinkPtr> mojo_sinks(2);
   mojo_sinks[0] = interfaces::MediaSink::New();
   mojo_sinks[0]->sink_id = kSinkId;
   mojo_sinks[0]->name = kSinkName;
@@ -777,16 +766,14 @@
   mojo_sinks[1]->icon_type =
       media_router::interfaces::MediaSink::IconType::CAST;
 
-  mojo::Array<mojo::String> mojo_origins(1);
-  mojo_origins[0] = origin.spec();
-
   base::RunLoop run_loop;
   EXPECT_CALL(*sinks_observer, OnSinksReceived(SequenceEquals(expected_sinks)));
   EXPECT_CALL(*extra_sinks_observer,
               OnSinksReceived(SequenceEquals(expected_sinks)))
       .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
-  media_router_proxy_->OnSinksReceived(media_source.id(), std::move(mojo_sinks),
-                                       std::move(mojo_origins));
+  media_router_proxy_->OnSinksReceived(
+      media_source.id(), std::move(mojo_sinks),
+      std::vector<std::string>(1, origin.spec()));
   run_loop.Run();
 
   // Since the MediaRouterMojoImpl has already received results for
@@ -806,10 +793,8 @@
   EXPECT_TRUE(cached_sinks_observer2->Init());
 
   base::RunLoop run_loop2;
-  EXPECT_CALL(mock_media_route_provider_,
-              StopObservingMediaSinks(mojo::String(kSource)));
-  EXPECT_CALL(mock_media_route_provider_,
-              StopObservingMediaSinks(mojo::String(kSource2)))
+  EXPECT_CALL(mock_media_route_provider_, StopObservingMediaSinks(kSource));
+  EXPECT_CALL(mock_media_route_provider_, StopObservingMediaSinks(kSource2))
       .WillOnce(InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); }));
   sinks_observer.reset();
   extra_sinks_observer.reset();
@@ -836,11 +821,9 @@
       new MockMediaSinksObserver(router(), media_source2, origin));
   EXPECT_CALL(*sinks_observer2, OnSinksReceived(IsEmpty()));
   EXPECT_TRUE(sinks_observer2->Init());
-  EXPECT_CALL(mock_media_route_provider_,
-              StartObservingMediaSinks(mojo::String(kSource)))
+  EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource))
       .Times(0);
-  EXPECT_CALL(mock_media_route_provider_,
-              StartObservingMediaSinks(mojo::String(kSource2)))
+  EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource2))
       .Times(0);
   ProcessEventLoop();
   EXPECT_TRUE(Mock::VerifyAndClearExpectations(&mock_media_route_provider_));
@@ -849,11 +832,9 @@
   // sent to MRPM.
   router()->OnSinkAvailabilityUpdated(
       interfaces::MediaRouter::SinkAvailability::AVAILABLE);
-  EXPECT_CALL(mock_media_route_provider_,
-              StartObservingMediaSinks(mojo::String(kSource)))
+  EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource))
       .Times(1);
-  EXPECT_CALL(mock_media_route_provider_,
-              StartObservingMediaSinks(mojo::String(kSource2)))
+  EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource2))
       .Times(1);
   ProcessEventLoop();
   EXPECT_TRUE(Mock::VerifyAndClearExpectations(&mock_media_route_provider_));
@@ -861,11 +842,9 @@
   // No change in availability status; no calls should be made to MRPM.
   router()->OnSinkAvailabilityUpdated(
       interfaces::MediaRouter::SinkAvailability::AVAILABLE);
-  EXPECT_CALL(mock_media_route_provider_,
-              StartObservingMediaSinks(mojo::String(kSource)))
+  EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource))
       .Times(0);
-  EXPECT_CALL(mock_media_route_provider_,
-              StartObservingMediaSinks(mojo::String(kSource2)))
+  EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource2))
       .Times(0);
   ProcessEventLoop();
   EXPECT_TRUE(Mock::VerifyAndClearExpectations(&mock_media_route_provider_));
@@ -874,8 +853,7 @@
   // Unregistering observer won't result in call to MRPM to remove query.
   router()->OnSinkAvailabilityUpdated(
       interfaces::MediaRouter::SinkAvailability::UNAVAILABLE);
-  EXPECT_CALL(mock_media_route_provider_,
-              StopObservingMediaSinks(mojo::String(kSource)))
+  EXPECT_CALL(mock_media_route_provider_, StopObservingMediaSinks(kSource))
       .Times(0);
   sinks_observer.reset();
   ProcessEventLoop();
@@ -885,8 +863,7 @@
   // observer is unregistered.
   router()->OnSinkAvailabilityUpdated(
       interfaces::MediaRouter::SinkAvailability::AVAILABLE);
-  EXPECT_CALL(mock_media_route_provider_,
-              StopObservingMediaSinks(mojo::String(kSource2)));
+  EXPECT_CALL(mock_media_route_provider_, StopObservingMediaSinks(kSource2));
   sinks_observer2.reset();
   ProcessEventLoop();
 }
@@ -896,11 +873,11 @@
   MediaSource media_source(kSource);
   MediaSource different_media_source(kSource2);
   EXPECT_CALL(mock_media_route_provider_,
-              StartObservingMediaRoutes(mojo::String(media_source.id())))
+              StartObservingMediaRoutes(media_source.id()))
       .Times(2);
   EXPECT_CALL(
       mock_media_route_provider_,
-      StartObservingMediaRoutes(mojo::String(different_media_source.id())))
+      StartObservingMediaRoutes(different_media_source.id()))
       .Times(1);
 
   MediaRoutesObserver* observer_captured;
@@ -930,11 +907,11 @@
   expected_joinable_route_ids.push_back(kJoinableRouteId);
   expected_joinable_route_ids.push_back(kJoinableRouteId2);
 
-  mojo::Array<mojo::String> mojo_joinable_routes(2);
+  std::vector<std::string> mojo_joinable_routes(2);
   mojo_joinable_routes[0] = kJoinableRouteId;
   mojo_joinable_routes[1] = kJoinableRouteId2;
 
-  mojo::Array<interfaces::MediaRoutePtr> mojo_routes(2);
+  std::vector<interfaces::MediaRoutePtr> mojo_routes(2);
   mojo_routes[0] = CreateMojoRoute();
   mojo_routes[1] = CreateMojoRoute();
   mojo_routes[1]->media_route_id = kRouteId2;
@@ -963,18 +940,17 @@
   router()->UnregisterMediaRoutesObserver(&extra_routes_observer);
   router()->UnregisterMediaRoutesObserver(&different_routes_observer);
   EXPECT_CALL(mock_media_route_provider_,
-              StopObservingMediaRoutes(mojo::String(media_source.id())))
+              StopObservingMediaRoutes(media_source.id()))
       .Times(1);
   EXPECT_CALL(
       mock_media_route_provider_,
-      StopObservingMediaRoutes(mojo::String(different_media_source.id())));
+      StopObservingMediaRoutes(different_media_source.id()));
   ProcessEventLoop();
 }
 
 TEST_F(MediaRouterMojoImplTest, SendRouteMessage) {
   EXPECT_CALL(
-      mock_media_route_provider_,
-      SendRouteMessage(mojo::String(kRouteId), mojo::String(kMessage), _))
+      mock_media_route_provider_, SendRouteMessage(kRouteId, kMessage, _))
       .WillOnce(Invoke([](
           const MediaRoute::Id& route_id, const std::string& message,
           const interfaces::MediaRouteProvider::SendRouteMessageCallback& cb) {
@@ -997,7 +973,7 @@
                                kBinaryMessage + arraysize(kBinaryMessage)));
 
   EXPECT_CALL(mock_media_route_provider_,
-              SendRouteBinaryMessageInternal(mojo::String(kRouteId), _, _))
+              SendRouteBinaryMessageInternal(kRouteId, _, _))
       .WillOnce(Invoke([](
           const MediaRoute::Id& route_id, const std::vector<uint8_t>& data,
           const interfaces::MediaRouteProvider::SendRouteMessageCallback& cb) {
@@ -1018,13 +994,13 @@
 }
 
 TEST_F(MediaRouterMojoImplTest, PresentationSessionMessagesSingleObserver) {
-  mojo::Array<interfaces::RouteMessagePtr> mojo_messages(2);
+  std::vector<interfaces::RouteMessagePtr> mojo_messages(2);
   mojo_messages[0] = interfaces::RouteMessage::New();
   mojo_messages[0]->type = interfaces::RouteMessage::Type::TEXT;
-  mojo_messages[0]->message = "text";
+  mojo_messages[0]->message = std::string("text");
   mojo_messages[1] = interfaces::RouteMessage::New();
   mojo_messages[1]->type = interfaces::RouteMessage::Type::BINARY;
-  mojo_messages[1]->data.push_back(1);
+  mojo_messages[1]->data = std::vector<uint8_t>(1, UINT8_C(1));
 
   ScopedVector<content::PresentationSessionMessage> expected_messages;
   std::unique_ptr<content::PresentationSessionMessage> message;
@@ -1035,7 +1011,7 @@
 
   message.reset(new content::PresentationSessionMessage(
       content::PresentationMessageType::ARRAY_BUFFER));
-  message->data.reset(new std::vector<uint8_t>(1, 1));
+  message->data.reset(new std::vector<uint8_t>(1, UINT8_C(1)));
   expected_messages.push_back(std::move(message));
 
   base::RunLoop run_loop;
@@ -1062,13 +1038,13 @@
 }
 
 TEST_F(MediaRouterMojoImplTest, PresentationSessionMessagesMultipleObservers) {
-  mojo::Array<interfaces::RouteMessagePtr> mojo_messages(2);
+  std::vector<interfaces::RouteMessagePtr> mojo_messages(2);
   mojo_messages[0] = interfaces::RouteMessage::New();
   mojo_messages[0]->type = interfaces::RouteMessage::Type::TEXT;
-  mojo_messages[0]->message = "text";
+  mojo_messages[0]->message = std::string("text");
   mojo_messages[1] = interfaces::RouteMessage::New();
   mojo_messages[1]->type = interfaces::RouteMessage::Type::BINARY;
-  mojo_messages[1]->data.push_back(1);
+  mojo_messages[1]->data = std::vector<uint8_t>(1, UINT8_C(1));
 
   ScopedVector<content::PresentationSessionMessage> expected_messages;
   std::unique_ptr<content::PresentationSessionMessage> message;
@@ -1079,7 +1055,7 @@
 
   message.reset(new content::PresentationSessionMessage(
       content::PresentationMessageType::ARRAY_BUFFER));
-  message->data.reset(new std::vector<uint8_t>(1, 1));
+  message->data.reset(new std::vector<uint8_t>(1, UINT8_C(1)));
   expected_messages.push_back(std::move(message));
 
   base::RunLoop run_loop;
@@ -1190,8 +1166,8 @@
   EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id()))
       .Times(2)
       .WillRepeatedly(Return(false));
-  EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId)));
-  EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2)));
+  EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId));
+  EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId2));
   ConnectProviderManagerService();
   ProcessEventLoop();
 }
@@ -1202,10 +1178,9 @@
   MediaSource media_source(kSource);
 
   EXPECT_CALL(
-      mock_media_route_provider_,
-      SearchSinks_(mojo::String(kSinkId), mojo::String(kSource), _, _))
+      mock_media_route_provider_, SearchSinks_(kSinkId, kSource, _, _))
       .WillOnce(Invoke([&search_input, &domain](
-          const mojo::String& sink_id, const mojo::String& source,
+          const std::string& sink_id, const std::string& source,
           const interfaces::SinkSearchCriteriaPtr& search_criteria,
           const interfaces::MediaRouteProvider::SearchSinksCallback& cb) {
         EXPECT_EQ(search_input, search_criteria->input);
@@ -1340,7 +1315,7 @@
       .WillOnce(Return(false));
   EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery())
       .Times(AtMost(1));
-  EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId)))
+  EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId))
       .WillOnce(InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); }));
   RegisterMediaRouteProvider();
   run_loop.Run();
@@ -1368,7 +1343,7 @@
       .WillOnce(Return(false));
   EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery())
       .Times(AtMost(1));
-  EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2)))
+  EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId2))
       .WillOnce(InvokeWithoutArgs([&run_loop5]() { run_loop5.Quit(); }));
   BindMediaRouteProvider();
   RegisterMediaRouteProvider();
@@ -1477,7 +1452,7 @@
   EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id()));
   EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery())
       .Times(AtMost(1));
-  EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2)))
+  EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId2))
       .Times(kMaxPendingRequests)
       .WillRepeatedly(InvokeWithoutArgs([&run_loop2, &count]() {
         if (++count == MediaRouterMojoImpl::kMaxPendingRequests)
@@ -1506,7 +1481,7 @@
   EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id()))
       .WillOnce(Return(false)).WillOnce(Return(false));
   EXPECT_CALL(mock_media_route_provider_,
-              UpdateMediaSinks(mojo::String(MediaSourceForDesktop().id())))
+              UpdateMediaSinks(MediaSourceForDesktop().id()))
       .Times(2);
   // EnableMdnsDisocvery() is never called except on Windows.
   EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery())
@@ -1546,9 +1521,9 @@
   EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id()))
       .WillOnce(Return(false)).WillOnce(Return(false));
   // Expected because it was used to wake up the page.
-  EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId)));
+  EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId));
   EXPECT_CALL(mock_media_route_provider_,
-              UpdateMediaSinks(mojo::String(MediaSourceForDesktop().id())));
+              UpdateMediaSinks(MediaSourceForDesktop().id()));
   // EnableMdnsDisocvery() is never called except on Windows.
   EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery())
       .WillOnce(InvokeWithoutArgs([&run_loop6]() {
@@ -1595,7 +1570,7 @@
   EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery());
 #endif
   EXPECT_CALL(mock_media_route_provider_,
-              UpdateMediaSinks(mojo::String(MediaSourceForDesktop().id())))
+              UpdateMediaSinks(MediaSourceForDesktop().id()))
       .WillOnce(InvokeWithoutArgs([&run_loop2]() {
         run_loop2.Quit();
       }));
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_test.cc b/chrome/browser/media/router/mojo/media_router_mojo_test.cc
index c4ff378..1252396 100644
--- a/chrome/browser/media/router/mojo/media_router_mojo_test.cc
+++ b/chrome/browser/media/router/mojo/media_router_mojo_test.cc
@@ -14,8 +14,8 @@
 
 const char kInstanceId[] = "instance123";
 
-template <typename T1, typename T2>
-void ExpectAsyncResultEqual(T1 expected, T2 actual) {
+void ExpectEqualStrings(const std::string& expected,
+                        const std::string& actual) {
   EXPECT_EQ(expected, actual);
 }
 
@@ -50,8 +50,7 @@
       &mock_media_route_provider_, mojo::GetProxy(&mojo_media_router)));
   media_router_proxy_->RegisterMediaRouteProvider(
       std::move(mojo_media_router),
-      base::Bind(&ExpectAsyncResultEqual<std::string, mojo::String>,
-                 kInstanceId));
+      base::Bind(&ExpectEqualStrings, kInstanceId));
 }
 
 void MediaRouterMojoTest::SetUp() {
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_test.h b/chrome/browser/media/router/mojo/media_router_mojo_test.h
index 9a36a18..76e0aed 100644
--- a/chrome/browser/media/router/mojo/media_router_mojo_test.h
+++ b/chrome/browser/media/router/mojo/media_router_mojo_test.h
@@ -31,70 +31,70 @@
   ~MockMediaRouteProvider() override;
 
   MOCK_METHOD8(CreateRoute,
-               void(const mojo::String& source_urn,
-                    const mojo::String& sink_id,
-                    const mojo::String& presentation_id,
-                    const mojo::String& origin,
+               void(const std::string& source_urn,
+                    const std::string& sink_id,
+                    const std::string& presentation_id,
+                    const std::string& origin,
                     int tab_id,
                     int64_t timeout_secs,
                     bool incognito,
                     const CreateRouteCallback& callback));
   MOCK_METHOD7(JoinRoute,
-               void(const mojo::String& source_urn,
-                    const mojo::String& presentation_id,
-                    const mojo::String& origin,
+               void(const std::string& source_urn,
+                    const std::string& presentation_id,
+                    const std::string& origin,
                     int tab_id,
                     int64_t timeout_secs,
                     bool incognito,
                     const JoinRouteCallback& callback));
   MOCK_METHOD8(ConnectRouteByRouteId,
-               void(const mojo::String& source_urn,
-                    const mojo::String& route_id,
-                    const mojo::String& presentation_id,
-                    const mojo::String& origin,
+               void(const std::string& source_urn,
+                    const std::string& route_id,
+                    const std::string& presentation_id,
+                    const std::string& origin,
                     int tab_id,
                     int64_t timeout_secs,
                     bool incognito,
                     const JoinRouteCallback& callback));
-  MOCK_METHOD1(DetachRoute, void(const mojo::String& route_id));
-  MOCK_METHOD2(TerminateRoute, void(const mojo::String& route_id,
+  MOCK_METHOD1(DetachRoute, void(const std::string& route_id));
+  MOCK_METHOD2(TerminateRoute, void(const std::string& route_id,
                                     const TerminateRouteCallback& callback));
-  MOCK_METHOD1(StartObservingMediaSinks, void(const mojo::String& source));
-  MOCK_METHOD1(StopObservingMediaSinks, void(const mojo::String& source));
+  MOCK_METHOD1(StartObservingMediaSinks, void(const std::string& source));
+  MOCK_METHOD1(StopObservingMediaSinks, void(const std::string& source));
   MOCK_METHOD3(SendRouteMessage,
-               void(const mojo::String& media_route_id,
-                    const mojo::String& message,
+               void(const std::string& media_route_id,
+                    const std::string& message,
                     const SendRouteMessageCallback& callback));
   void SendRouteBinaryMessage(
-      const mojo::String& media_route_id,
-      mojo::Array<uint8_t> data,
+      const std::string& media_route_id,
+      const std::vector<uint8_t>& data,
       const SendRouteMessageCallback& callback) override {
-    SendRouteBinaryMessageInternal(media_route_id, data.storage(), callback);
+    SendRouteBinaryMessageInternal(media_route_id, data, callback);
   }
   MOCK_METHOD3(SendRouteBinaryMessageInternal,
-               void(const mojo::String& media_route_id,
+               void(const std::string& media_route_id,
                     const std::vector<uint8_t>& data,
                     const SendRouteMessageCallback& callback));
   MOCK_METHOD1(StartListeningForRouteMessages,
-               void(const mojo::String& route_id));
+               void(const std::string& route_id));
   MOCK_METHOD1(StopListeningForRouteMessages,
-               void(const mojo::String& route_id));
+               void(const std::string& route_id));
   MOCK_METHOD1(OnPresentationSessionDetached,
-               void(const mojo::String& route_id));
-  MOCK_METHOD1(StartObservingMediaRoutes, void(const mojo::String& source));
-  MOCK_METHOD1(StopObservingMediaRoutes, void(const mojo::String& source));
+               void(const std::string& route_id));
+  MOCK_METHOD1(StartObservingMediaRoutes, void(const std::string& source));
+  MOCK_METHOD1(StopObservingMediaRoutes, void(const std::string& source));
   MOCK_METHOD0(EnableMdnsDiscovery, void());
-  MOCK_METHOD1(UpdateMediaSinks, void(const mojo::String& source));
+  MOCK_METHOD1(UpdateMediaSinks, void(const std::string& source));
   void SearchSinks(
-      const mojo::String& sink_id,
-      const mojo::String& media_source,
+      const std::string& sink_id,
+      const std::string& media_source,
       interfaces::SinkSearchCriteriaPtr search_criteria,
       const SearchSinksCallback& callback) override {
     SearchSinks_(sink_id, media_source, search_criteria, callback);
   }
   MOCK_METHOD4(SearchSinks_,
-               void(const mojo::String& sink_id,
-                    const mojo::String& media_source,
+               void(const std::string& sink_id,
+                    const std::string& media_source,
                     interfaces::SinkSearchCriteriaPtr& search_criteria,
                     const SearchSinksCallback& callback));
 
diff --git a/chrome/browser/media/router/mojo/media_router_type_converters.cc b/chrome/browser/media/router/mojo/media_router_type_converters.cc
index 4df3754..a152148b 100644
--- a/chrome/browser/media/router/mojo/media_router_type_converters.cc
+++ b/chrome/browser/media/router/mojo/media_router_type_converters.cc
@@ -62,10 +62,10 @@
     const MediaSinkPtr& input) {
   media_router::MediaSink sink(input->sink_id, input->name,
                                SinkIconTypeFromMojo(input->icon_type));
-  if (!input->description.get().empty())
-    sink.set_description(input->description);
-  if (!input->domain.get().empty())
-    sink.set_domain(input->domain);
+  if (input->description && !input->description->empty())
+    sink.set_description(*input->description);
+  if (input->domain && !input->domain->empty())
+    sink.set_domain(*input->domain);
 
   return sink;
 }
@@ -75,9 +75,11 @@
 TypeConverter<media_router::MediaRoute, MediaRoutePtr>::Convert(
     const MediaRoutePtr& input) {
   media_router::MediaRoute media_route(
-      input->media_route_id, media_router::MediaSource(input->media_source),
+      input->media_route_id,
+      media_router::MediaSource(input->media_source.value_or(std::string())),
       input->media_sink_id, input->description, input->is_local,
-      input->custom_controller_path, input->for_display);
+      input->custom_controller_path.value_or(std::string()),
+      input->for_display);
   media_route.set_incognito(input->incognito);
   return media_route;
 }
@@ -88,9 +90,12 @@
               MediaRoutePtr>::Convert(const MediaRoutePtr& input) {
   std::unique_ptr<media_router::MediaRoute> media_route(
       new media_router::MediaRoute(
-          input->media_route_id, media_router::MediaSource(input->media_source),
+          input->media_route_id,
+          media_router::MediaSource(
+              input->media_source.value_or(std::string())),
           input->media_sink_id, input->description, input->is_local,
-          input->custom_controller_path, input->for_display));
+          input->custom_controller_path.value_or(std::string()),
+          input->for_display));
   media_route->set_incognito(input->incognito);
   return media_route;
 }
@@ -128,16 +133,15 @@
     const IssuePtr& input) {
   std::vector<media_router::IssueAction> actions;
   if (input->secondary_actions) {
-    actions.reserve(input->secondary_actions.size());
-    for (size_t i = 0; i < input->secondary_actions.size(); ++i) {
-      actions.push_back(media_router::IssueAction(
-          IssueActionTypeFromMojo(input->secondary_actions[i])));
-    }
+    actions.reserve(input->secondary_actions->size());
+    for (auto a : *input->secondary_actions)
+      actions.push_back(media_router::IssueAction(IssueActionTypeFromMojo(a)));
   }
   return media_router::Issue(
-      input->title, input->message,
+      input->title, input->message.value_or(std::string()),
       media_router::IssueAction(IssueActionTypeFromMojo(input->default_action)),
-      actions, input->route_id, IssueSeverityFromMojo(input->severity),
+      actions, input->route_id.value_or(std::string()),
+      IssueSeverityFromMojo(input->severity),
       input->is_blocking, input->help_page_id);
 }
 
diff --git a/chrome/browser/media/router/mojo/media_router_type_converters_unittest.cc b/chrome/browser/media/router/mojo/media_router_type_converters_unittest.cc
index 27c50e9..88ed3669 100644
--- a/chrome/browser/media/router/mojo/media_router_type_converters_unittest.cc
+++ b/chrome/browser/media/router/mojo/media_router_type_converters_unittest.cc
@@ -20,8 +20,8 @@
   interfaces::MediaSinkPtr mojo_sink(interfaces::MediaSink::New());
   mojo_sink->sink_id = "sinkId1";
   mojo_sink->name = "Sink 1";
-  mojo_sink->description = "description";
-  mojo_sink->domain = "domain";
+  mojo_sink->description = std::string("description");
+  mojo_sink->domain = std::string("domain");
   mojo_sink->icon_type = media_router::interfaces::MediaSink::IconType::CAST;
 
   MediaSink media_sink = mojo::TypeConverter<
@@ -83,7 +83,7 @@
   mojo_route->media_sink_id = "sinkId";
   mojo_route->description = "Description";
   mojo_route->is_local = false;
-  mojo_route->custom_controller_path = "cast_view.html";
+  mojo_route->custom_controller_path = std::string("cast_view.html");
   mojo_route->for_display = true;
   mojo_route->incognito = true;
 
@@ -122,12 +122,11 @@
   interfaces::IssuePtr mojoIssue;
   mojoIssue = interfaces::Issue::New();
   mojoIssue->title = "title";
-  mojoIssue->message = "msg";
-  mojoIssue->route_id = "routeId";
+  mojoIssue->message = std::string("msg");
+  mojoIssue->route_id = std::string("routeId");
   mojoIssue->default_action = interfaces::Issue::ActionType::LEARN_MORE;
-  mojoIssue->secondary_actions =
-      mojo::Array<interfaces::Issue::ActionType>::New(1);
-  mojoIssue->secondary_actions[0] = interfaces::Issue::ActionType::DISMISS;
+  mojoIssue->secondary_actions = std::vector<interfaces::Issue::ActionType>(
+      1, interfaces::Issue::ActionType::DISMISS);
   mojoIssue->severity = interfaces::Issue::Severity::WARNING;
   mojoIssue->is_blocking = true;
   mojoIssue->help_page_id = 12345;
diff --git a/chrome/browser/memory/tab_manager.cc b/chrome/browser/memory/tab_manager.cc
index d8ae87d8..00a0409 100644
--- a/chrome/browser/memory/tab_manager.cc
+++ b/chrome/browser/memory/tab_manager.cc
@@ -116,7 +116,7 @@
 // TODO(chrisha): Move this do the default implementation of a delegate.
 base::MemoryPressureListener::MemoryPressureLevel
 GetCurrentPressureLevel() {
-  auto monitor = base::MemoryPressureMonitor::Get();
+  auto* monitor = base::MemoryPressureMonitor::Get();
   if (monitor)
     return monitor->GetCurrentPressureLevel();
   return base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE;
@@ -243,7 +243,7 @@
   // Convert the tab sort order to a process sort order. The process inherits
   // the priority of its highest priority tab.
   for (auto& tab : tab_stats) {
-    auto renderer = tab.render_process_host;
+    auto* renderer = tab.render_process_host;
 
     // Skip renderers associated with visible tabs as handling memory pressure
     // notifications in these processes can cause jank. This code works because
@@ -314,7 +314,7 @@
                               TabChangeType change_type) {
   if (change_type != TabChangeType::ALL)
     return;
-  auto data = GetWebContentsData(contents);
+  auto* data = GetWebContentsData(contents);
   bool old_state = data->IsRecentlyAudible();
   bool current_state = contents->WasRecentlyAudible();
   if (old_state != current_state) {
@@ -721,7 +721,7 @@
 TabManager::WebContentsData* TabManager::GetWebContentsData(
     content::WebContents* contents) const {
   WebContentsData::CreateForWebContents(contents);
-  auto web_contents_data = WebContentsData::FromWebContents(contents);
+  auto* web_contents_data = WebContentsData::FromWebContents(contents);
   web_contents_data->set_test_tick_clock(test_tick_clock_);
   return web_contents_data;
 }
diff --git a/chrome/browser/memory/tab_manager_browsertest.cc b/chrome/browser/memory/tab_manager_browsertest.cc
index 579ba31e..8813ee2b 100644
--- a/chrome/browser/memory/tab_manager_browsertest.cc
+++ b/chrome/browser/memory/tab_manager_browsertest.cc
@@ -79,7 +79,7 @@
   browser()->OpenURL(open3);
   load3.Wait();
 
-  auto tsm = browser()->tab_strip_model();
+  auto* tsm = browser()->tab_strip_model();
   EXPECT_EQ(3, tsm->count());
 
   // Navigate the current (third) tab to a different URL, so we can test
@@ -308,7 +308,7 @@
   base::SimpleTestTickClock test_clock_;
   tab_manager->set_test_tick_clock(&test_clock_);
 
-  auto tsm = browser()->tab_strip_model();
+  auto* tsm = browser()->tab_strip_model();
 
   // Set the minimum time of protection.
   tab_manager->minimum_protection_time_ =
@@ -368,7 +368,7 @@
       browser(), GURL(chrome::kChromeUIAboutURL), NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
-  auto tab = browser()->tab_strip_model()->GetWebContentsAt(1);
+  auto* tab = browser()->tab_strip_model()->GetWebContentsAt(1);
 
   // Simulate that a video stream is now being captured.
   content::MediaStreamDevice fake_media_device(
diff --git a/chrome/browser/memory/tab_manager_delegate_chromeos.cc b/chrome/browser/memory/tab_manager_delegate_chromeos.cc
index f2c3a075..67d1f88 100644
--- a/chrome/browser/memory/tab_manager_delegate_chromeos.cc
+++ b/chrome/browser/memory/tab_manager_delegate_chromeos.cc
@@ -337,10 +337,10 @@
                  content::NotificationService::AllBrowserContextsAndSources());
   registrar_.Add(this, content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED,
                  content::NotificationService::AllBrowserContextsAndSources());
-  auto arc_bridge_service = arc::ArcBridgeService::Get();
+  auto* arc_bridge_service = arc::ArcBridgeService::Get();
   if (arc_bridge_service)
     arc_bridge_service->process()->AddObserver(this);
-  auto activation_client = GetActivationClient();
+  auto* activation_client = GetActivationClient();
   if (activation_client)
     activation_client->AddObserver(this);
   BrowserList::GetInstance()->AddObserver(this);
@@ -348,10 +348,10 @@
 
 TabManagerDelegate::~TabManagerDelegate() {
   BrowserList::GetInstance()->RemoveObserver(this);
-  auto activation_client = GetActivationClient();
+  auto* activation_client = GetActivationClient();
   if (activation_client)
     activation_client->RemoveObserver(this);
-  auto arc_bridge_service = arc::ArcBridgeService::Get();
+  auto* arc_bridge_service = arc::ArcBridgeService::Get();
   if (arc_bridge_service)
     arc_bridge_service->process()->RemoveObserver(this);
 }
@@ -373,7 +373,7 @@
 }
 
 void TabManagerDelegate::OnInstanceReady() {
-  auto arc_bridge_service = arc::ArcBridgeService::Get();
+  auto* arc_bridge_service = arc::ArcBridgeService::Get();
   DCHECK(arc_bridge_service);
 
   arc_process_instance_ = arc_bridge_service->process()->instance();
diff --git a/chrome/browser/memory/tab_manager_observer_browsertest.cc b/chrome/browser/memory/tab_manager_observer_browsertest.cc
index aa74c15..f105da95 100644
--- a/chrome/browser/memory/tab_manager_observer_browsertest.cc
+++ b/chrome/browser/memory/tab_manager_observer_browsertest.cc
@@ -84,7 +84,7 @@
 IN_PROC_BROWSER_TEST_F(TabManagerObserverTest, OnDiscardStateChange) {
   TabManager* tab_manager = g_browser_process->GetTabManager();
   ASSERT_TRUE(tab_manager);
-  auto tsm = browser()->tab_strip_model();
+  auto* tsm = browser()->tab_strip_model();
   set_tab_strip_model(tsm);
 
   // Open two tabs.
diff --git a/chrome/browser/memory/tab_manager_unittest.cc b/chrome/browser/memory/tab_manager_unittest.cc
index 9304b913..207aac9 100644
--- a/chrome/browser/memory/tab_manager_unittest.cc
+++ b/chrome/browser/memory/tab_manager_unittest.cc
@@ -551,9 +551,9 @@
       &TabManagerTest::NotifyRendererProcess, base::Unretained(this));
 
   // Create two dummy tabs.
-  auto tab0 = CreateWebContents();
-  auto tab1 = CreateWebContents();
-  auto tab2 = CreateWebContents();
+  auto* tab0 = CreateWebContents();
+  auto* tab1 = CreateWebContents();
+  auto* tab2 = CreateWebContents();
   tabstrip.AppendWebContents(tab0, true);   // Foreground tab.
   tabstrip.AppendWebContents(tab1, false);  // Background tab.
   tabstrip.AppendWebContents(tab2, false);  // Background tab.
diff --git a/chrome/browser/memory/tab_manager_web_contents_data_unittest.cc b/chrome/browser/memory/tab_manager_web_contents_data_unittest.cc
index 25f1108..e8adeefb 100644
--- a/chrome/browser/memory/tab_manager_web_contents_data_unittest.cc
+++ b/chrome/browser/memory/tab_manager_web_contents_data_unittest.cc
@@ -94,7 +94,7 @@
 
 TEST_F(TabManagerWebContentsDataTest, CopyState) {
   std::unique_ptr<WebContents> web_contents2;
-  auto tab_data2 = CreateWebContentsAndTabData(&web_contents2);
+  auto* tab_data2 = CreateWebContentsAndTabData(&web_contents2);
 
   EXPECT_EQ(tab_data()->tab_data_, tab_data2->tab_data_);
   tab_data()->IncrementDiscardCount();
diff --git a/chrome/browser/metrics/leak_detector/leak_detector_controller.cc b/chrome/browser/metrics/leak_detector/leak_detector_controller.cc
index 68a01d4..898dd06 100644
--- a/chrome/browser/metrics/leak_detector/leak_detector_controller.cc
+++ b/chrome/browser/metrics/leak_detector/leak_detector_controller.cc
@@ -8,6 +8,7 @@
 
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
+#include "components/metrics/leak_detector/gnu_build_id_reader.h"
 #include "components/variations/variations_associated_data.h"
 #include "content/public/browser/browser_thread.h"
 
@@ -90,6 +91,9 @@
 
 LeakDetectorController::LeakDetectorController()
     : params_(GetVariationParameters()) {
+  // Read the build ID once and store it.
+  leak_detector::gnu_build_id_reader::ReadBuildID(&build_id_);
+
   LeakDetector* detector = LeakDetector::GetInstance();
   detector->AddObserver(this);
 
@@ -138,6 +142,8 @@
     stored_reports_.push_back(report);
     stored_reports_.back().mutable_params()->CopyFrom(params_);
     stored_reports_.back().set_source_process(process_type);
+    stored_reports_.back().mutable_build_id()->assign(build_id_.begin(),
+                                                      build_id_.end());
   }
 }
 
diff --git a/chrome/browser/metrics/leak_detector/leak_detector_controller.h b/chrome/browser/metrics/leak_detector/leak_detector_controller.h
index 59b05ce..7fdeb93 100644
--- a/chrome/browser/metrics/leak_detector/leak_detector_controller.h
+++ b/chrome/browser/metrics/leak_detector/leak_detector_controller.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_BROWSER_METRICS_LEAK_DETECTOR_LEAK_DETECTOR_CONTROLLER_H_
 #define CHROME_BROWSER_METRICS_LEAK_DETECTOR_LEAK_DETECTOR_CONTROLLER_H_
 
+#include <stdint.h>
+
 #include <vector>
 
 #include "base/macros.h"
@@ -53,6 +55,9 @@
   // protobuf message instead of in separate member variables.
   const MemoryLeakReportProto::Params params_;
 
+  // The build ID of the current Chrome binary.
+  std::vector<uint8_t> build_id_;
+
   // For thread safety.
   base::ThreadChecker thread_checker_;
 
diff --git a/chrome/browser/password_manager/account_chooser_dialog_android.cc b/chrome/browser/password_manager/account_chooser_dialog_android.cc
index aa3cd3de..5f27e2f 100644
--- a/chrome/browser/password_manager/account_chooser_dialog_android.cc
+++ b/chrome/browser/password_manager/account_chooser_dialog_android.cc
@@ -41,7 +41,7 @@
     password_manager::CredentialType type,
     int indexStart = 0) {
   int index = indexStart;
-  for (auto password_form : password_forms) {
+  for (auto* password_form : password_forms) {
     ScopedJavaLocalRef<jobject> java_credential = CreateNativeCredential(
         env, *password_form, index - indexStart, static_cast<int>(type));
     env->SetObjectArrayElement(java_credentials_array.obj(), index,
@@ -93,11 +93,11 @@
     const std::vector<const autofill::PasswordForm*>& password_forms,
     int index,
     net::URLRequestContextGetter* request_context) {
-  for (auto password_form : password_forms) {
+  for (auto* password_form : password_forms) {
     if (!password_form->icon_url.is_valid())
       continue;
     // Fetcher deletes itself once fetching is finished.
-    auto fetcher =
+    auto* fetcher =
         new AvatarFetcherAndroid(password_form->icon_url, index, java_dialog);
     fetcher->Start(request_context);
     ++index;
diff --git a/chrome/browser/password_manager/native_backend_gnome_x.cc b/chrome/browser/password_manager/native_backend_gnome_x.cc
index dad1caf..5c1118c 100644
--- a/chrome/browser/password_manager/native_backend_gnome_x.cc
+++ b/chrome/browser/password_manager/native_backend_gnome_x.cc
@@ -706,7 +706,7 @@
   if (!GetAllLogins(&forms))
     return false;
 
-  for (auto& form : forms) {
+  for (auto* form : forms) {
     if (origin_filter.Run(form->origin) && !form->skip_zero_click) {
       form->skip_zero_click = true;
       if (!UpdateLogin(*form, changes))
@@ -816,7 +816,7 @@
   base::Time PasswordForm::*date_member = date_to_compare == CREATION_TIMESTAMP
                                               ? &PasswordForm::date_created
                                               : &PasswordForm::date_synced;
-  for (auto& saved_form : all_forms) {
+  for (auto*& saved_form : all_forms) {
     if (get_begin <= saved_form->*date_member &&
         (get_end.is_null() || saved_form->*date_member < get_end)) {
       forms->push_back(saved_form);
diff --git a/chrome/browser/password_manager/native_backend_kwallet_x.cc b/chrome/browser/password_manager/native_backend_kwallet_x.cc
index 066f625..a383723 100644
--- a/chrome/browser/password_manager/native_backend_kwallet_x.cc
+++ b/chrome/browser/password_manager/native_backend_kwallet_x.cc
@@ -478,7 +478,7 @@
 
   ScopedVector<autofill::PasswordForm> kept_forms;
   kept_forms.reserve(all_forms.size());
-  for (auto& saved_form : all_forms) {
+  for (auto*& saved_form : all_forms) {
     if (!ArePasswordFormUniqueKeyEqual(form, *saved_form)) {
       kept_forms.push_back(saved_form);
       saved_form = nullptr;
@@ -516,7 +516,7 @@
   if (!GetAllLogins(&all_forms))
     return false;
 
-  for (auto& form : all_forms) {
+  for (auto* form : all_forms) {
     if (origin_filter.Run(form->origin) && !form->skip_zero_click) {
       form->skip_zero_click = true;
       if (!UpdateLogin(*form, changes))
@@ -630,7 +630,7 @@
   }
   // We have to read all the entries, and then filter them here.
   forms->reserve(all_forms.size());
-  for (auto& saved_form : all_forms) {
+  for (auto*& saved_form : all_forms) {
     if (saved_form->blacklisted_by_user ==
         (options == BlacklistOptions::BLACKLISTED)) {
       forms->push_back(saved_form);
@@ -742,7 +742,7 @@
         date_to_compare == CREATION_TIMESTAMP
             ? &autofill::PasswordForm::date_created
             : &autofill::PasswordForm::date_synced;
-    for (auto& saved_form : all_forms) {
+    for (auto*& saved_form : all_forms) {
       if (delete_begin <= saved_form->*date_member &&
           (delete_end.is_null() || saved_form->*date_member < delete_end)) {
         changes->push_back(password_manager::PasswordStoreChange(
diff --git a/chrome/browser/password_manager/native_backend_libsecret.cc b/chrome/browser/password_manager/native_backend_libsecret.cc
index 899e77d5..f31f3d1 100644
--- a/chrome/browser/password_manager/native_backend_libsecret.cc
+++ b/chrome/browser/password_manager/native_backend_libsecret.cc
@@ -287,7 +287,7 @@
   if (!GetLoginsList(nullptr, ALL_LOGINS, &all_forms))
     return false;
 
-  for (auto& form : all_forms) {
+  for (auto* form : all_forms) {
     if (origin_filter.Run(form->origin) && !form->skip_zero_click) {
       form->skip_zero_click = true;
       if (!UpdateLogin(*form, changes))
@@ -469,7 +469,7 @@
       date_to_compare == CREATION_TIMESTAMP
           ? &autofill::PasswordForm::date_created
           : &autofill::PasswordForm::date_synced;
-  for (auto& saved_form : all_forms) {
+  for (auto*& saved_form : all_forms) {
     if (get_begin <= saved_form->*date_member &&
         (get_end.is_null() || saved_form->*date_member < get_end)) {
       forms->push_back(saved_form);
diff --git a/chrome/browser/password_manager/native_backend_libsecret_unittest.cc b/chrome/browser/password_manager/native_backend_libsecret_unittest.cc
index f9db9a3c..84480e9 100644
--- a/chrome/browser/password_manager/native_backend_libsecret_unittest.cc
+++ b/chrome/browser/password_manager/native_backend_libsecret_unittest.cc
@@ -162,7 +162,7 @@
 
   ScopedVector<MockSecretItem> kept_mock_libsecret_items;
   kept_mock_libsecret_items.reserve(global_mock_libsecret_items->size());
-  for (auto& item : *global_mock_libsecret_items) {
+  for (auto*& item : *global_mock_libsecret_items) {
     if (!Matches(item, attributes)) {
       kept_mock_libsecret_items.push_back(item);
       item = nullptr;
@@ -895,7 +895,7 @@
   VerifiedAdd(&backend, form_facebook_);
 
   EXPECT_EQ(2u, global_mock_libsecret_items->size());
-  for (const auto& item : *global_mock_libsecret_items)
+  for (auto* item : *global_mock_libsecret_items)
     CheckUint32Attribute(item, "should_skip_zero_click", 0);
 
   // Set the canonical forms to the updated value for the following comparison.
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc
index 95bb15a6..8a89f37 100644
--- a/chrome/browser/password_manager/password_manager_browsertest.cc
+++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -3020,7 +3020,7 @@
   // frame.
   EXPECT_LT(1u, detached_web_contents->GetAllFrames().size());
 
-  auto tab_strip_model = browser()->tab_strip_model();
+  auto* tab_strip_model = browser()->tab_strip_model();
   // Check that the autofill and password manager driver factories are notified
   // about all frames, not just the main one. The factories should receive
   // messages for non-main frames, in particular
diff --git a/chrome/browser/password_manager/password_store_mac.cc b/chrome/browser/password_manager/password_store_mac.cc
index 8efe360..aa058c2 100644
--- a/chrome/browser/password_manager/password_store_mac.cc
+++ b/chrome/browser/password_manager/password_store_mac.cc
@@ -546,7 +546,7 @@
   // Clear out all the Keychain entries we used.
   ScopedVector<autofill::PasswordForm> unused_keychain_forms;
   unused_keychain_forms.reserve(keychain_forms->size());
-  for (auto& keychain_form : *keychain_forms) {
+  for (auto*& keychain_form : *keychain_forms) {
     if (!ContainsKey(used_keychain_forms, keychain_form)) {
       unused_keychain_forms.push_back(keychain_form);
       keychain_form = nullptr;
diff --git a/chrome/browser/permissions/mock_permission_request.cc b/chrome/browser/permissions/mock_permission_request.cc
index be7dd48..dc172243 100644
--- a/chrome/browser/permissions/mock_permission_request.cc
+++ b/chrome/browser/permissions/mock_permission_request.cc
@@ -10,45 +10,52 @@
 
 MockPermissionRequest::MockPermissionRequest()
     : MockPermissionRequest("test",
-                                  "button",
-                                  "button",
-                                  GURL("http://www.google.com"),
-                                  PermissionRequestType::UNKNOWN) {}
+                            "button",
+                            "button",
+                            GURL("http://www.google.com"),
+                            PermissionRequestType::UNKNOWN,
+                            PermissionRequestGestureType::UNKNOWN) {}
 
 MockPermissionRequest::MockPermissionRequest(
     const std::string& text)
     : MockPermissionRequest(text,
-                                  "button",
-                                  "button",
-                                  GURL("http://www.google.com"),
-                                  PermissionRequestType::UNKNOWN) {}
+                            "button",
+                            "button",
+                            GURL("http://www.google.com"),
+                            PermissionRequestType::UNKNOWN,
+                            PermissionRequestGestureType::UNKNOWN) {}
 
 MockPermissionRequest::MockPermissionRequest(
-    const std::string& text, PermissionRequestType request_type)
+    const std::string& text,
+    PermissionRequestType request_type,
+    PermissionRequestGestureType gesture_type)
     : MockPermissionRequest(text,
-                                  "button",
-                                  "button",
-                                  GURL("http://www.google.com"),
-                                  request_type) {}
+                            "button",
+                            "button",
+                             GURL("http://www.google.com"),
+                             request_type,
+                             gesture_type) {}
 
 MockPermissionRequest::MockPermissionRequest(
     const std::string& text,
     const GURL& url)
     : MockPermissionRequest(text,
-                                  "button",
-                                  "button",
-                                  url,
-                                  PermissionRequestType::UNKNOWN) {}
+                            "button",
+                            "button",
+                            url,
+                            PermissionRequestType::UNKNOWN,
+                            PermissionRequestGestureType::UNKNOWN) {}
 
 MockPermissionRequest::MockPermissionRequest(
     const std::string& text,
     const std::string& accept_label,
     const std::string& deny_label)
     : MockPermissionRequest(text,
-                                  accept_label,
-                                  deny_label,
-                                  GURL("http://www.google.com"),
-                                  PermissionRequestType::UNKNOWN) {}
+                            accept_label,
+                            deny_label,
+                            GURL("http://www.google.com"),
+                            PermissionRequestType::UNKNOWN,
+                            PermissionRequestGestureType::UNKNOWN) {}
 
 MockPermissionRequest::~MockPermissionRequest() {}
 
@@ -87,6 +94,11 @@
   return request_type_;
 }
 
+PermissionRequestGestureType MockPermissionRequest::GetGestureType()
+    const {
+  return gesture_type_;
+}
+
 bool MockPermissionRequest::granted() {
   return granted_;
 }
@@ -104,11 +116,13 @@
     const std::string& accept_label,
     const std::string& deny_label,
     const GURL& origin,
-    PermissionRequestType request_type)
+    PermissionRequestType request_type,
+    PermissionRequestGestureType gesture_type)
     : granted_(false),
       cancelled_(false),
       finished_(false),
-      request_type_(request_type) {
+      request_type_(request_type),
+      gesture_type_(gesture_type) {
   text_ = base::UTF8ToUTF16(text);
   accept_label_ = base::UTF8ToUTF16(accept_label);
   deny_label_ = base::UTF8ToUTF16(deny_label);
diff --git a/chrome/browser/permissions/mock_permission_request.h b/chrome/browser/permissions/mock_permission_request.h
index b4e8a60..9563925 100644
--- a/chrome/browser/permissions/mock_permission_request.h
+++ b/chrome/browser/permissions/mock_permission_request.h
@@ -14,11 +14,12 @@
   MockPermissionRequest();
   explicit MockPermissionRequest(const std::string& text);
   MockPermissionRequest(const std::string& text,
-                              PermissionRequestType request_type);
+                        PermissionRequestType request_type,
+                        PermissionRequestGestureType gesture_type);
   MockPermissionRequest(const std::string& text, const GURL& url);
   MockPermissionRequest(const std::string& text,
-                              const std::string& accept_label,
-                              const std::string& deny_label);
+                        const std::string& accept_label,
+                        const std::string& deny_label);
 
   ~MockPermissionRequest() override;
 
@@ -31,6 +32,7 @@
   void Cancelled() override;
   void RequestFinished() override;
   PermissionRequestType GetPermissionRequestType() const override;
+  PermissionRequestGestureType GetGestureType() const override;
 
   bool granted();
   bool cancelled();
@@ -38,14 +40,16 @@
 
  private:
   MockPermissionRequest(const std::string& text,
-                              const std::string& accept_label,
-                              const std::string& deny_label,
-                              const GURL& url,
-                              PermissionRequestType request_type);
+                        const std::string& accept_label,
+                        const std::string& deny_label,
+                        const GURL& url,
+                        PermissionRequestType request_type,
+                        PermissionRequestGestureType gesture_type);
   bool granted_;
   bool cancelled_;
   bool finished_;
   PermissionRequestType request_type_;
+  PermissionRequestGestureType gesture_type_;
 
   base::string16 text_;
   base::string16 accept_label_;
diff --git a/chrome/browser/permissions/permission_context_base.cc b/chrome/browser/permissions/permission_context_base.cc
index 873b2bea..f0fc52c 100644
--- a/chrome/browser/permissions/permission_context_base.cc
+++ b/chrome/browser/permissions/permission_context_base.cc
@@ -177,7 +177,7 @@
   if (!permission_request_manager)
     return;
   std::unique_ptr<PermissionRequest> request_ptr(new PermissionRequestImpl(
-          requesting_origin, permission_type_, profile_,
+          requesting_origin, permission_type_, profile_, user_gesture,
           base::Bind(&PermissionContextBase::PermissionDecided,
                      weak_factory_.GetWeakPtr(), id, requesting_origin,
                      embedding_origin, callback),
diff --git a/chrome/browser/permissions/permission_request.cc b/chrome/browser/permissions/permission_request.cc
index 311444a..ba24d37 100644
--- a/chrome/browser/permissions/permission_request.cc
+++ b/chrome/browser/permissions/permission_request.cc
@@ -13,3 +13,7 @@
 PermissionRequestType PermissionRequest::GetPermissionRequestType() const {
   return PermissionRequestType::UNKNOWN;
 }
+
+PermissionRequestGestureType PermissionRequest::GetGestureType() const {
+  return PermissionRequestGestureType::UNKNOWN;
+}
diff --git a/chrome/browser/permissions/permission_request.h b/chrome/browser/permissions/permission_request.h
index 67a5ae6..98453d7 100644
--- a/chrome/browser/permissions/permission_request.h
+++ b/chrome/browser/permissions/permission_request.h
@@ -37,6 +37,17 @@
   NUM
 };
 
+// Used for UMA to record whether a gesture was associated with the request. For
+// simplicity not all request types track whether a gesture is associated with
+// it or not, for these types of requests metrics are not recorded.
+enum class PermissionRequestGestureType {
+  UNKNOWN,
+  GESTURE,
+  NO_GESTURE,
+  // NUM must be the last value in the enum.
+  NUM
+};
+
 // Describes the interface a feature making permission requests should
 // implement. A class of this type is registered with the permission request
 // manager to receive updates about the result of the permissions request
@@ -85,6 +96,11 @@
 
   // Used to record UMA metrics for permission requests.
   virtual PermissionRequestType GetPermissionRequestType() const;
+
+  // Used to record UMA for whether requests are associated with a user gesture.
+  // To keep things simple this metric is only recorded for the most popular
+  // request types.
+  virtual PermissionRequestGestureType GetGestureType() const;
 };
 
 #endif  // CHROME_BROWSER_PERMISSIONS_PERMISSION_REQUEST_H_
diff --git a/chrome/browser/permissions/permission_request_impl.cc b/chrome/browser/permissions/permission_request_impl.cc
index c7b2269..da4c649 100644
--- a/chrome/browser/permissions/permission_request_impl.cc
+++ b/chrome/browser/permissions/permission_request_impl.cc
@@ -18,11 +18,13 @@
     const GURL& request_origin,
     content::PermissionType permission_type,
     Profile* profile,
+    bool has_gesture,
     const PermissionDecidedCallback& permission_decided_callback,
     const base::Closure delete_callback)
     : request_origin_(request_origin),
       permission_type_(permission_type),
       profile_(profile),
+      has_gesture_(has_gesture),
       permission_decided_callback_(permission_decided_callback),
       delete_callback_(delete_callback),
       is_finished_(false),
@@ -158,3 +160,9 @@
       return PermissionRequestType::UNKNOWN;
   }
 }
+
+PermissionRequestGestureType PermissionRequestImpl::GetGestureType()
+    const {
+  return has_gesture_ ? PermissionRequestGestureType::GESTURE
+                      : PermissionRequestGestureType::NO_GESTURE;
+}
diff --git a/chrome/browser/permissions/permission_request_impl.h b/chrome/browser/permissions/permission_request_impl.h
index 5b4d34c..333f04ef 100644
--- a/chrome/browser/permissions/permission_request_impl.h
+++ b/chrome/browser/permissions/permission_request_impl.h
@@ -27,6 +27,7 @@
       const GURL& request_origin,
       content::PermissionType permission_type,
       Profile* profile,
+      bool has_gesture,
       const PermissionDecidedCallback& permission_decided_callback,
       const base::Closure delete_callback);
 
@@ -48,10 +49,12 @@
   void Cancelled() override;
   void RequestFinished() override;
   PermissionRequestType GetPermissionRequestType() const override;
+  PermissionRequestGestureType GetGestureType() const override;
 
   GURL request_origin_;
   content::PermissionType permission_type_;
   Profile* profile_;
+  bool has_gesture_;
 
   // Called once a decision is made about the permission.
   const PermissionDecidedCallback permission_decided_callback_;
diff --git a/chrome/browser/permissions/permission_request_manager_unittest.cc b/chrome/browser/permissions/permission_request_manager_unittest.cc
index f3f72e95..f1e90b4 100644
--- a/chrome/browser/permissions/permission_request_manager_unittest.cc
+++ b/chrome/browser/permissions/permission_request_manager_unittest.cc
@@ -22,12 +22,16 @@
  public:
   PermissionRequestManagerTest()
       : ChromeRenderViewHostTestHarness(),
-        request1_("test1", PermissionRequestType::QUOTA),
-        request2_("test2", PermissionRequestType::DOWNLOAD),
+        request1_("test1",
+                  PermissionRequestType::QUOTA,
+                  PermissionRequestGestureType::GESTURE),
+        request2_("test2",
+                  PermissionRequestType::DOWNLOAD,
+                  PermissionRequestGestureType::NO_GESTURE),
         iframe_request_same_domain_("iframe",
                                     GURL("http://www.google.com/some/url")),
-        iframe_request_other_domain_("iframe",
-                                     GURL("http://www.youtube.com")) {}
+        iframe_request_other_domain_("iframe", GURL("http://www.youtube.com")) {
+  }
   ~PermissionRequestManagerTest() override {}
 
   void SetUp() override {
@@ -454,7 +458,7 @@
   EXPECT_TRUE(view_factory_->is_visible());
 }
 
-TEST_F(PermissionRequestManagerTest, UMAForSimpleAcceptedBubble) {
+TEST_F(PermissionRequestManagerTest, UMAForSimpleAcceptedGestureBubble) {
   base::HistogramTester histograms;
 
   manager_->AddRequest(&request1_);
@@ -465,6 +469,12 @@
       static_cast<base::HistogramBase::Sample>(PermissionRequestType::QUOTA),
       1);
   histograms.ExpectUniqueSample(
+      PermissionUmaUtil::kPermissionsPromptShownGesture,
+      static_cast<base::HistogramBase::Sample>(PermissionRequestType::QUOTA),
+      1);
+  histograms.ExpectTotalCount(
+      PermissionUmaUtil::kPermissionsPromptShownNoGesture, 0);
+  histograms.ExpectUniqueSample(
       PermissionUmaUtil::kPermissionsPromptRequestsPerPrompt, 1, 1);
 
   ToggleAccept(0, true);
@@ -473,22 +483,47 @@
       PermissionUmaUtil::kPermissionsPromptAccepted,
       static_cast<base::HistogramBase::Sample>(PermissionRequestType::QUOTA),
       1);
-}
+  histograms.ExpectTotalCount(
+      PermissionUmaUtil::kPermissionsPromptDenied, 0);
 
-TEST_F(PermissionRequestManagerTest, UMAForSimpleDeniedBubble) {
-  base::HistogramTester histograms;
-
-  manager_->AddRequest(&request1_);
-  manager_->DisplayPendingRequests();
-  WaitForCoalescing();
-  // No need to test UMA for showing prompts again, they were tested in
-  // UMAForSimpleAcceptedBubble.
-
-  Deny();
   histograms.ExpectUniqueSample(
-      PermissionUmaUtil::kPermissionsPromptDenied,
+      PermissionUmaUtil::kPermissionsPromptAcceptedGesture,
       static_cast<base::HistogramBase::Sample>(PermissionRequestType::QUOTA),
       1);
+  histograms.ExpectTotalCount(
+      PermissionUmaUtil::kPermissionsPromptAcceptedNoGesture, 0);
+}
+
+TEST_F(PermissionRequestManagerTest, UMAForSimpleDeniedNoGestureBubble) {
+  base::HistogramTester histograms;
+
+  manager_->AddRequest(&request2_);
+  manager_->DisplayPendingRequests();
+  WaitForCoalescing();
+
+  histograms.ExpectTotalCount(
+      PermissionUmaUtil::kPermissionsPromptShownGesture, 0);
+  histograms.ExpectUniqueSample(
+      PermissionUmaUtil::kPermissionsPromptShownNoGesture,
+      static_cast<base::HistogramBase::Sample>(PermissionRequestType::DOWNLOAD),
+      1);
+  // No need to test the other UMA for showing prompts again, they were tested
+  // in UMAForSimpleAcceptedBubble.
+
+  Deny();
+  histograms.ExpectTotalCount(
+      PermissionUmaUtil::kPermissionsPromptAccepted, 0);
+  histograms.ExpectUniqueSample(
+      PermissionUmaUtil::kPermissionsPromptDenied,
+      static_cast<base::HistogramBase::Sample>(PermissionRequestType::DOWNLOAD),
+      1);
+
+  histograms.ExpectUniqueSample(
+      PermissionUmaUtil::kPermissionsPromptDeniedNoGesture,
+      static_cast<base::HistogramBase::Sample>(PermissionRequestType::DOWNLOAD),
+      1);
+  histograms.ExpectTotalCount(
+      PermissionUmaUtil::kPermissionsPromptDeniedGesture, 0);
 }
 
 // This code path (calling Accept on a non-merged bubble, with no accepted
@@ -533,6 +568,10 @@
       1);
   histograms.ExpectUniqueSample(
       PermissionUmaUtil::kPermissionsPromptRequestsPerPrompt, 2, 1);
+  histograms.ExpectTotalCount(
+      PermissionUmaUtil::kPermissionsPromptShownGesture, 0);
+  histograms.ExpectTotalCount(
+      PermissionUmaUtil::kPermissionsPromptShownNoGesture, 0);
 
   ToggleAccept(0, true);
   ToggleAccept(1, true);
diff --git a/chrome/browser/permissions/permission_uma_util.cc b/chrome/browser/permissions/permission_uma_util.cc
index d25bc5b..4697e8d 100644
--- a/chrome/browser/permissions/permission_uma_util.cc
+++ b/chrome/browser/permissions/permission_uma_util.cc
@@ -40,11 +40,22 @@
                               PERMISSION_ACTION_NUM);                       \
   }
 
-#define PERMISSION_BUBBLE_TYPE_UMA(metric_name, permission_bubble_type)      \
-    UMA_HISTOGRAM_ENUMERATION(                                               \
-        metric_name,                                                         \
-        static_cast<base::HistogramBase::Sample>(permission_bubble_type),    \
-        static_cast<base::HistogramBase::Sample>(PermissionRequestType::NUM))
+#define PERMISSION_BUBBLE_TYPE_UMA(metric_name, permission_bubble_type) \
+  UMA_HISTOGRAM_ENUMERATION(                                            \
+      metric_name,                                                      \
+      static_cast<base::HistogramBase::Sample>(permission_bubble_type), \
+      static_cast<base::HistogramBase::Sample>(PermissionRequestType::NUM))
+
+#define PERMISSION_BUBBLE_GESTURE_TYPE_UMA(gesture_metric_name,              \
+                                           no_gesture_metric_name,           \
+                                           gesture_type,                     \
+                                           permission_bubble_type)           \
+  if (gesture_type == PermissionRequestGestureType::GESTURE) {               \
+    PERMISSION_BUBBLE_TYPE_UMA(gesture_metric_name, permission_bubble_type); \
+  } else if (gesture_type == PermissionRequestGestureType::NO_GESTURE) {     \
+    PERMISSION_BUBBLE_TYPE_UMA(no_gesture_metric_name,                       \
+                               permission_bubble_type);                      \
+  }
 
 using content::PermissionType;
 
@@ -171,10 +182,22 @@
 
 const char PermissionUmaUtil::kPermissionsPromptShown[] =
     "Permissions.Prompt.Shown";
+const char PermissionUmaUtil::kPermissionsPromptShownGesture[] =
+    "Permissions.Prompt.Shown.Gesture";
+const char PermissionUmaUtil::kPermissionsPromptShownNoGesture[] =
+    "Permissions.Prompt.Shown.NoGesture";
 const char PermissionUmaUtil::kPermissionsPromptAccepted[] =
     "Permissions.Prompt.Accepted";
+const char PermissionUmaUtil::kPermissionsPromptAcceptedGesture[] =
+    "Permissions.Prompt.Accepted.Gesture";
+const char PermissionUmaUtil::kPermissionsPromptAcceptedNoGesture[] =
+    "Permissions.Prompt.Accepted.NoGesture";
 const char PermissionUmaUtil::kPermissionsPromptDenied[] =
     "Permissions.Prompt.Denied";
+const char PermissionUmaUtil::kPermissionsPromptDeniedGesture[] =
+    "Permissions.Prompt.Denied.Gesture";
+const char PermissionUmaUtil::kPermissionsPromptDeniedNoGesture[] =
+    "Permissions.Prompt.Denied.NoGesture";
 const char PermissionUmaUtil::kPermissionsPromptRequestsPerPrompt[] =
     "Permissions.Prompt.RequestsPerPrompt";
 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleTypes[] =
@@ -243,9 +266,17 @@
 
   PermissionRequestType permission_prompt_type =
       PermissionRequestType::MULTIPLE;
-  if (requests.size() == 1)
+  PermissionRequestGestureType permission_gesture_type =
+      PermissionRequestGestureType::UNKNOWN;
+  if (requests.size() == 1) {
     permission_prompt_type = requests[0]->GetPermissionRequestType();
+    permission_gesture_type = requests[0]->GetGestureType();
+  }
+
   PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptShown, permission_prompt_type);
+  PERMISSION_BUBBLE_GESTURE_TYPE_UMA(
+      kPermissionsPromptShownGesture, kPermissionsPromptShownNoGesture,
+      permission_gesture_type, permission_prompt_type);
 
   UMA_HISTOGRAM_ENUMERATION(
       kPermissionsPromptRequestsPerPrompt,
@@ -269,8 +300,11 @@
   bool all_accepted = accept_states[0];
   PermissionRequestType permission_prompt_type =
       requests[0]->GetPermissionRequestType();
+  PermissionRequestGestureType permission_gesture_type =
+      requests[0]->GetGestureType();
   if (requests.size() > 1) {
     permission_prompt_type = PermissionRequestType::MULTIPLE;
+    permission_gesture_type = PermissionRequestGestureType::UNKNOWN;
     for (size_t i = 0; i < requests.size(); ++i) {
       const auto* request = requests[i];
       if (accept_states[i]) {
@@ -287,9 +321,15 @@
   if (all_accepted) {
     PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptAccepted,
                                permission_prompt_type);
+    PERMISSION_BUBBLE_GESTURE_TYPE_UMA(
+        kPermissionsPromptAcceptedGesture, kPermissionsPromptAcceptedNoGesture,
+        permission_gesture_type, permission_prompt_type);
   } else {
     PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptDenied,
                                permission_prompt_type);
+    PERMISSION_BUBBLE_GESTURE_TYPE_UMA(
+        kPermissionsPromptDeniedGesture, kPermissionsPromptDeniedNoGesture,
+        permission_gesture_type, permission_prompt_type);
   }
 }
 
@@ -300,6 +340,9 @@
 
   PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptDenied,
                              requests[0]->GetPermissionRequestType());
+  PERMISSION_BUBBLE_GESTURE_TYPE_UMA(
+      kPermissionsPromptDeniedGesture, kPermissionsPromptDeniedNoGesture,
+      requests[0]->GetGestureType(), requests[0]->GetPermissionRequestType());
 }
 
 bool PermissionUmaUtil::IsOptedIntoPermissionActionReporting(Profile* profile) {
diff --git a/chrome/browser/permissions/permission_uma_util.h b/chrome/browser/permissions/permission_uma_util.h
index c256c997..d56a9f0 100644
--- a/chrome/browser/permissions/permission_uma_util.h
+++ b/chrome/browser/permissions/permission_uma_util.h
@@ -51,8 +51,14 @@
 class PermissionUmaUtil {
  public:
   static const char kPermissionsPromptShown[];
+  static const char kPermissionsPromptShownGesture[];
+  static const char kPermissionsPromptShownNoGesture[];
   static const char kPermissionsPromptAccepted[];
+  static const char kPermissionsPromptAcceptedGesture[];
+  static const char kPermissionsPromptAcceptedNoGesture[];
   static const char kPermissionsPromptDenied[];
+  static const char kPermissionsPromptDeniedGesture[];
+  static const char kPermissionsPromptDeniedNoGesture[];
   static const char kPermissionsPromptRequestsPerPrompt[];
   static const char kPermissionsPromptMergedBubbleTypes[];
   static const char kPermissionsPromptMergedBubbleAccepted[];
diff --git a/chrome/browser/plugins/chrome_plugin_service_filter.cc b/chrome/browser/plugins/chrome_plugin_service_filter.cc
index f6d648e..d785f95 100644
--- a/chrome/browser/plugins/chrome_plugin_service_filter.cc
+++ b/chrome/browser/plugins/chrome_plugin_service_filter.cc
@@ -21,6 +21,7 @@
 #include "chrome/common/render_messages.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/content_settings/content/common/content_settings_messages.h"
+#include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/infobars/core/confirm_infobar_delegate.h"
 #include "components/infobars/core/infobar.h"
 #include "content/public/browser/browser_thread.h"
@@ -56,17 +57,20 @@
 }
 
 void ChromePluginServiceFilter::RegisterResourceContext(
-    PluginPrefs* plugin_prefs,
+    scoped_refptr<PluginPrefs> plugin_prefs,
+    scoped_refptr<HostContentSettingsMap> host_content_settings_map,
     const void* context) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   base::AutoLock lock(lock_);
-  resource_context_map_[context] = plugin_prefs;
+  plugin_prefs_[context] = std::move(plugin_prefs);
+  host_content_settings_maps_[context] = std::move(host_content_settings_map);
 }
 
 void ChromePluginServiceFilter::UnregisterResourceContext(
     const void* context) {
   base::AutoLock lock(lock_);
-  resource_context_map_.erase(context);
+  plugin_prefs_.erase(context);
+  host_content_settings_maps_.erase(context);
 }
 
 void ChromePluginServiceFilter::OverridePluginForFrame(
@@ -106,22 +110,29 @@
     }
   }
 
+  // Check whether the plugin is disabled.
+  ResourceContextMap::iterator prefs_it = plugin_prefs_.find(context);
+  DCHECK(prefs_it != plugin_prefs_.end());
+
+  if (!prefs_it->second.get()->IsPluginEnabled(*plugin))
+    return false;
+
   // Check whether PreferHtmlOverPlugins feature is enabled.
   if (plugin->name == base::ASCIIToUTF16(content::kFlashPluginName) &&
       base::FeatureList::IsEnabled(features::kPreferHtmlOverPlugins)) {
-    return false;
+    auto host_content_settings_map_it =
+        host_content_settings_maps_.find(context);
+    DCHECK(host_content_settings_map_it != host_content_settings_maps_.end());
+
+    // TODO(trizzofo): Implement site-origin exceptions once we have the
+    // top-level frame origin.
+    ContentSetting content_setting =
+        host_content_settings_map_it->second->GetDefaultContentSetting(
+            CONTENT_SETTINGS_TYPE_PLUGINS, nullptr);
+    if (content_setting == CONTENT_SETTING_BLOCK)
+      return false;
   }
 
-  // Check whether the plugin is disabled.
-  ResourceContextMap::iterator prefs_it =
-      resource_context_map_.find(context);
-  if (prefs_it == resource_context_map_.end())
-    return false;
-
-  PluginPrefs* plugin_prefs = prefs_it->second.get();
-  if (!plugin_prefs->IsPluginEnabled(*plugin))
-    return false;
-
   return true;
 }
 
diff --git a/chrome/browser/plugins/chrome_plugin_service_filter.h b/chrome/browser/plugins/chrome_plugin_service_filter.h
index a84b3679..f3876e14 100644
--- a/chrome/browser/plugins/chrome_plugin_service_filter.h
+++ b/chrome/browser/plugins/chrome_plugin_service_filter.h
@@ -21,6 +21,7 @@
 #include "content/public/common/webplugininfo.h"
 #include "url/gurl.h"
 
+class HostContentSettingsMap;
 class PluginPrefs;
 class Profile;
 
@@ -36,7 +37,10 @@
   static ChromePluginServiceFilter* GetInstance();
 
   // This method should be called on the UI thread.
-  void RegisterResourceContext(PluginPrefs* plugin_prefs, const void* context);
+  void RegisterResourceContext(
+      scoped_refptr<PluginPrefs> plugin_prefs,
+      scoped_refptr<HostContentSettingsMap> host_content_settings_map,
+      const void* context);
 
   void UnregisterResourceContext(const void* context);
 
@@ -108,7 +112,10 @@
 
   base::Lock lock_;  // Guards access to member variables.
   typedef std::map<const void*, scoped_refptr<PluginPrefs> > ResourceContextMap;
-  ResourceContextMap resource_context_map_;
+  ResourceContextMap plugin_prefs_;
+
+  std::map<const void*, scoped_refptr<HostContentSettingsMap>>
+      host_content_settings_maps_;
 
   std::map<int, ProcessDetails> plugin_details_;
 };
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index 5761c16..eac49bf 100644
--- a/chrome/browser/prerender/prerender_browsertest.cc
+++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -122,6 +122,8 @@
 #include "net/url_request/url_request_interceptor.h"
 #include "net/url_request/url_request_job.h"
 #include "ppapi/shared_impl/ppapi_switches.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "url/gurl.h"
 
@@ -3780,6 +3782,50 @@
                    FINAL_STATUS_CLOSED, 0);
 }
 
+// Tests interaction between prerender and POST (i.e. POST request should still
+// be made and POST data should not be dropped when the POST target is the same
+// as a prerender link).
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, HttpPost) {
+  // Expect that the prerendered contents won't get used (i.e. the prerendered
+  // content should be destroyed when the test closes the browser under test).
+  std::unique_ptr<TestPrerender> prerender =
+      ExpectPrerender(FINAL_STATUS_APP_TERMINATING);
+
+  // Navigate to a page containing a form that targets a prerendered link.
+  GURL main_url(embedded_test_server()->GetURL(
+      "/prerender/form_that_posts_to_prerendered_echoall.html"));
+  ui_test_utils::NavigateToURL(current_browser(), main_url);
+
+  // Wait for the prerender to be ready.
+  prerender->WaitForStart();
+  prerender->WaitForLoads(1);
+  EXPECT_THAT(prerender->contents()->prerender_url().spec(),
+              ::testing::MatchesRegex("^http://127.0.0.1.*:\\d+/echoall$"));
+
+  // Submit the form.
+  content::WebContents* web_contents =
+      current_browser()->tab_strip_model()->GetActiveWebContents();
+  TestNavigationObserver form_post_observer(web_contents, 1);
+  EXPECT_TRUE(
+      ExecuteScript(web_contents, "document.getElementById('form').submit();"));
+  form_post_observer.Wait();
+
+  // Verify that we arrived at the expected location.
+  GURL target_url(embedded_test_server()->GetURL("/echoall"));
+  EXPECT_EQ(target_url, web_contents->GetLastCommittedURL());
+
+  // Verify that POST body was correctly passed to the server and ended up in
+  // the body of the page (i.e. verify that we haven't used the prerendered
+  // page that doesn't contain the POST body).
+  std::string body;
+  EXPECT_TRUE(ExecuteScriptAndExtractString(
+      web_contents,
+      "window.domAutomationController.send("
+      "document.getElementsByTagName('pre')[0].innerText);",
+      &body));
+  EXPECT_EQ("text=value\n", body);
+}
+
 class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest {
  public:
   void SetUpOnMainThread() override {
diff --git a/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc b/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
index c2639b7..9c97db2 100644
--- a/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
+++ b/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/bind_helpers.h"
+#include "base/files/file_path.h"
 #include "base/location.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
@@ -16,6 +17,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/plugins/chrome_plugin_service_filter.h"
 #include "chrome/browser/plugins/plugin_prefs.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/task_management/mock_web_contents_task_manager.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
@@ -172,6 +174,11 @@
   quit_closure.Run();
 }
 
+void PluginEnabledCallback(const base::Closure& quit_closure, bool can_enable) {
+  EXPECT_TRUE(can_enable);
+  quit_closure.Run();
+}
+
 bool GetPdfPluginInfo(content::WebPluginInfo* info) {
   base::FilePath pdf_plugin_path = base::FilePath::FromUTF8Unsafe(
       ChromeContentClient::kPDFPluginPath);
@@ -389,8 +396,14 @@
   ASSERT_TRUE(GetPdfPluginInfo(&pdf_plugin_info));
 
   // Disable the PDF plugin.
-  PluginPrefs::GetForProfile(browser()->profile())->EnablePluginGroup(
-      false, base::ASCIIToUTF16(ChromeContentClient::kPDFPluginName));
+  {
+    base::RunLoop run_loop;
+    PluginPrefs::GetForProfile(browser()->profile())->EnablePlugin(
+        false,
+        base::FilePath::FromUTF8Unsafe(ChromeContentClient::kPDFPluginPath),
+        base::Bind(&PluginEnabledCallback, run_loop.QuitClosure()));
+    run_loop.Run();
+  }
 
   // Make sure it is actually disabled for webpages.
   ChromePluginServiceFilter* filter = ChromePluginServiceFilter::GetInstance();
@@ -398,7 +411,7 @@
   EXPECT_FALSE(filter->IsPluginAvailable(
       initiator()->GetRenderProcessHost()->GetID(),
       initiator()->GetMainFrame()->GetRoutingID(),
-      nullptr,
+      browser()->profile()->GetResourceContext(),
       GURL("http://google.com"),
       GURL(),
       &dummy_pdf_plugin_info));
diff --git a/chrome/browser/profiles/off_the_record_profile_impl.cc b/chrome/browser/profiles/off_the_record_profile_impl.cc
index 6a994e7..7ebf93a 100644
--- a/chrome/browser/profiles/off_the_record_profile_impl.cc
+++ b/chrome/browser/profiles/off_the_record_profile_impl.cc
@@ -150,6 +150,7 @@
 #if defined(ENABLE_PLUGINS)
   ChromePluginServiceFilter::GetInstance()->RegisterResourceContext(
       PluginPrefs::GetForProfile(this).get(),
+      HostContentSettingsMapFactory::GetForProfile(this),
       io_data_->GetResourceContextNoInit());
 #endif
 
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index dabbbb8..892a4b0 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -626,6 +626,7 @@
 #if defined(ENABLE_PLUGINS)
   ChromePluginServiceFilter::GetInstance()->RegisterResourceContext(
       PluginPrefs::GetForProfile(this).get(),
+      HostContentSettingsMapFactory::GetForProfile(this),
       io_data_.GetResourceContextNoInit());
 #endif
 
diff --git a/chrome/browser/resources/chromeos/arc_support/background.js b/chrome/browser/resources/chromeos/arc_support/background.js
index e6acea59..65a459c 100644
--- a/chrome/browser/resources/chromeos/arc_support/background.js
+++ b/chrome/browser/resources/chromeos/arc_support/background.js
@@ -111,6 +111,7 @@
   appWindow.contentWindow.i18nTemplate.process(doc, loadTimeData);
   var countryCode = data.countryCode.toLowerCase();
   setBackupRestoreMode(data.textBackupRestore, data.backupRestoreEnabled);
+  setLocationServiceMode(data.textLocationService, data.locationServiceEnabled);
 
   var scriptSetCountryCode = 'document.countryCode = \'' + countryCode + '\';';
   termsView.addContentScripts([
@@ -148,7 +149,8 @@
 function setMetricsMode(text, canEnable, on) {
   var doc = appWindow.contentWindow.document;
   var enableMetrics = doc.getElementById('enable-metrics');
-  enableMetrics.hidden = !canEnable;
+  var enableMetricsContainer = doc.getElementById('enable-metrics-container');
+  enableMetricsContainer.hidden = !canEnable;
   enableMetrics.checked = on;
 
   var onSettings = function(event) {
@@ -166,7 +168,7 @@
 }
 
 /**
- * Sets current metrics mode.
+ * Sets current backup and restore mode.
  * @param {string} text String used to display next to checkbox.
  * @param {boolean} defaultCheckValue Defines the default value for backup and
  *     restore checkbox.
@@ -181,6 +183,21 @@
 }
 
 /**
+ * Sets current usage of location service opt in mode.
+ * @param {string} text String used to display next to checkbox.
+ * @param {boolean} defaultCheckValue Defines the default value for location
+ *     service opt in.
+ */
+function setLocationServiceMode(text, defaultCheckValue) {
+  var doc = appWindow.contentWindow.document;
+  doc.getElementById('enable-location-service').checked = defaultCheckValue;
+
+  doc.getElementById('text-location-service').innerHTML = text;
+  doc.getElementById('learn-more-link-location-service').
+      addEventListener('click', onLearnMore);
+}
+
+/**
  * Updates terms view height manually because webview is not automatically
  * resized in case parent div element gets resized.
  */
@@ -465,7 +482,9 @@
       termsAccepted = true;
 
       var enableMetrics = doc.getElementById('enable-metrics');
-      if (!enableMetrics.hidden) {
+      var enableMetricsContainer =
+          doc.getElementById('enable-metrics-container');
+      if (!enableMetricsContainer.hidden) {
         sendNativeMessage('enableMetrics', {
           'enabled': enableMetrics.checked
         });
@@ -476,6 +495,11 @@
         'enabled': enableBackupRestore.checked
       });
 
+      var enableLocationService = doc.getElementById('enable-location-service');
+      sendNativeMessage('setLocationService', {
+        'enabled': enableLocationService.checked
+      });
+
       sendNativeMessage('startLso');
     };
 
diff --git a/chrome/browser/resources/chromeos/arc_support/main.css b/chrome/browser/resources/chromeos/arc_support/main.css
index a71d6563..02be7b71 100644
--- a/chrome/browser/resources/chromeos/arc_support/main.css
+++ b/chrome/browser/resources/chromeos/arc_support/main.css
@@ -37,18 +37,32 @@
 }
 
 #terms-view {
-  width: 468px;
+  width: 640px;
 }
 
 .button-separator {
   width: 1px;
 }
 
-.checkbox-option {
-  height: 16px;
+.checkbox-container {
   margin: 0;
   padding: 0 8px 0 0;
-  width: 16px;
+}
+
+.checkbox-option {
+  height: 12px;
+  margin: 0;
+  padding: 0;
+  width: 12px;
+}
+
+.checkbox-text {
+  color: rgba(0, 0, 0, 0.54);
+  font-size: 10px;
+  font-weight: 400;
+  line-height: 16px;
+  margin: 0;
+  padding: 0;
 }
 
 .content {
@@ -81,7 +95,7 @@
 .section-buttons {
   margin: auto;
   padding: 16px 0 24px 0;
-  width: 468px;
+  width: 640px;
 }
 
 .section-flex {
@@ -93,7 +107,7 @@
   margin: auto;
   padding: 8px 0 0 0;
   text-align: left;
-  width: 468px;
+  width: 640px;
 }
 
 .section-terms {
@@ -103,7 +117,7 @@
   margin: 0 auto 8px auto;
   overflow: hidden;
   padding: 0;
-  width: 468px;
+  width: 640px;
 }
 
 .text-desc {
@@ -113,16 +127,7 @@
   line-height: 24px;
   margin: auto;
   padding: 16px 0 0 0;
-  width: 600px;
-}
-
-.checkbox-text {
-  color: rgba(0, 0, 0, 0.54);
-  font-size: 10px;
-  font-weight: 400;
-  line-height: 16px;
-  margin: 0;
-  padding: 0;
+  width: 640px;
 }
 
 .text-status {
@@ -138,9 +143,9 @@
   font-size: 10px;
   font-weight: 500;
   margin: auto;
-  padding: 14px 0 8px 0;
+  padding: 10px 0 8px 0;
   text-align: left;
-  width: 468px;
+  width: 640px;
 }
 
 .text-title {
diff --git a/chrome/browser/resources/chromeos/arc_support/main.html b/chrome/browser/resources/chromeos/arc_support/main.html
index c9dd9b2..a176eeb 100644
--- a/chrome/browser/resources/chromeos/arc_support/main.html
+++ b/chrome/browser/resources/chromeos/arc_support/main.html
@@ -62,17 +62,26 @@
         <div class="section-terms" id ="terms-container">
           <webview id="terms-view" partition="persist:arc_support"></webview>
         </div>
-        <div class="layout horizontal section-checkbox-container">
-          <input type="checkbox" class="checkbox-option" id="enable-metrics"
-              hidden>
+        <label class="layout horizontal section-checkbox-container">
+          <div class="checkbox-container" id="enable-metrics-container" hidden>
+            <input type="checkbox" class="checkbox-option" id="enable-metrics">
+          </div>
           <p class="checkbox-text" id="text-metrics"></p>
-        </div>
-        <div id="section-backup-restore" class="layout horizontal
-            section-checkbox-container">
-          <input type="checkbox" class="checkbox-option"
-              id="enable-backup-restore">
+        </label>
+        <label class="layout horizontal section-checkbox-container">
+          <div class="checkbox-container">
+            <input type="checkbox" class="checkbox-option"
+                id="enable-backup-restore">
+          </div>
           <p class="checkbox-text" id="text-backup-restore"></p>
-        </div>
+        </label>
+        <label class="layout horizontal section-checkbox-container">
+          <div class="checkbox-container">
+            <input type="checkbox" class="checkbox-option"
+                id="enable-location-service">
+          </div>
+          <p class="checkbox-text" id="text-location-service"></p>
+        </label>
         <div class="layout horizontal end-justified section-buttons">
           <paper-button class="white" id="button-cancel"
               i18n-content="buttonCancel">
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
index c144fbdd5..274068d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
@@ -269,6 +269,7 @@
 <translation id="3392045790598181549"><ph name="NAME" />፣ የምናሌ ንጥል</translation>
 <translation id="3406283310380167331">የቅጾች ዝርዝር አሳይ</translation>
 <translation id="3422338090358345848">የቁልፍ ሰሌዳ አሳሽን ይክፈቱ</translation>
+<translation id="3423495725743882470">ረድፍ $1 ዓምድ $2</translation>
 <translation id="3457000393508828486">በከፊል ተጭኗል</translation>
 <translation id="3462439746547587373"><ph name="NAME" />፣ አዝራር</translation>
 <translation id="3473644018603298796">sld <ph name="COUNT" /></translation>
@@ -412,6 +413,7 @@
 <translation id="5000760171916499057">ምንም ቅጾች የሉም።</translation>
 <translation id="5005670136041063723">ምንም ተጨማሪ የተለዩ አባላት የሉም።</translation>
 <translation id="501473567976723023">ጃንዩዋሪ</translation>
+<translation id="5040591161308540832">ሰንጠረዥ $1፣ $2 በ$3</translation>
 <translation id="5041394372352067729">የብሬይል ማሳያውን ወደ ገጹ አናት ያንቀሳቅሱ</translation>
 <translation id="5042770794184672516">የንግግር ድምጽ መጠን ይጨምሩ</translation>
 <translation id="5050015258024679800">ቀዳሚ የደረጃ 4 ርዕስ</translation>
@@ -555,6 +557,7 @@
 <translation id="6364795331201459219">h6</translation>
 <translation id="6368143427468974988">ቀዳሚ ርዕስ</translation>
 <translation id="6378565991815958969">$1 ቅዳ።</translation>
+<translation id="6385591741672306837">ዓምድ</translation>
 <translation id="6387719785439924554">aside</translation>
 <translation id="6411426777058107714">ምንም ቀዳሚ የሬዲዮ አዝራር የለም።</translation>
 <translation id="6414968628640960377">ቀዳሚ የተለየ አካል።</translation>
@@ -704,6 +707,7 @@
 <translation id="8153880621934657047">በሠንጠረዥ ውስጥ አይደሉም።</translation>
 <translation id="817440585505441544">{COUNT,plural, =1{ሰረዘዘብጥ}one{# ሰረዘዘብጦች}other{# ሰረዘዘብጦች}}</translation>
 <translation id="8179976553408161302">አስገባ</translation>
+<translation id="8184828902145951186">ረድፍ</translation>
 <translation id="8186185314313222077">ሙሉ ማያ ገጽ ቀያይር</translation>
 <translation id="8199231515320852133">የአሁኑ ሕዋስ ራስጌዎችን አስታውቅ</translation>
 <translation id="820417203470636242">ባዶ ሕዋስ።</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
index 4fc8bc1a..7f1a234 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
@@ -269,6 +269,7 @@
 <translation id="3392045790598181549">عنصر القائمة <ph name="NAME" /></translation>
 <translation id="3406283310380167331">عرض قائمة النماذج</translation>
 <translation id="3422338090358345848">فتح مستكشف لوحة المفاتيح</translation>
+<translation id="3423495725743882470">صف $1 عمود $2</translation>
 <translation id="3457000393508828486">مضغوط جزئيًا</translation>
 <translation id="3462439746547587373">الزر <ph name="NAME" /></translation>
 <translation id="3473644018603298796">تم تحديد <ph name="COUNT" /></translation>
@@ -412,6 +413,7 @@
 <translation id="5000760171916499057">ليس هناك أي نماذج.</translation>
 <translation id="5005670136041063723">ليس هناك المزيد من العناصر المماثلة.</translation>
 <translation id="501473567976723023">كانون الثاني (يناير)</translation>
+<translation id="5040591161308540832">جدول $1، $2 في $3</translation>
 <translation id="5041394372352067729">نقل عرض برايل إلى أعلى الصفحة</translation>
 <translation id="5042770794184672516">زيادة مستوى صوت النطق</translation>
 <translation id="5050015258024679800">عنوان المستوى الرابع السابق</translation>
@@ -555,6 +557,7 @@
 <translation id="6364795331201459219">h6</translation>
 <translation id="6368143427468974988">العنوان السابق</translation>
 <translation id="6378565991815958969">نسخ $1.</translation>
+<translation id="6385591741672306837">العمود</translation>
 <translation id="6387719785439924554">aside</translation>
 <translation id="6411426777058107714">ليس هناك زر اختيار سابق.</translation>
 <translation id="6414968628640960377">العنصر المختلف السابق.</translation>
@@ -704,6 +707,7 @@
 <translation id="8153880621934657047">ليس بداخل الجدول.</translation>
 <translation id="817440585505441544">{COUNT,plural, =1{شرطة سفلية واحدة}zero{# underscores}two{شرطتان سفليتان (#)}few{# شرطات سفلية}many{# شرطة سفلية}other{# من الشرطات السفلية}}</translation>
 <translation id="8179976553408161302">Enter</translation>
+<translation id="8184828902145951186">الصف</translation>
 <translation id="8186185314313222077">تبديل وضع ملء الشاشة</translation>
 <translation id="8199231515320852133">الإعلان عن عناوين الخلية الحالية</translation>
 <translation id="820417203470636242">خلية فارغة.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
index cd5c450..9bb072c 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
@@ -269,6 +269,7 @@
 <translation id="3392045790598181549">„<ph name="NAME" />“, елемент от меню</translation>
 <translation id="3406283310380167331">Показване на списъка с формуляри</translation>
 <translation id="3422338090358345848">Отваряне на инструмента за изследване на клавиатурата</translation>
+<translation id="3423495725743882470">ред $1, колона $2</translation>
 <translation id="3457000393508828486">Частично натиснато</translation>
 <translation id="3462439746547587373">„<ph name="NAME" />“, бутон</translation>
 <translation id="3473644018603298796"><ph name="COUNT" /> избрани</translation>
@@ -412,6 +413,7 @@
 <translation id="5000760171916499057">Няма формуляри.</translation>
 <translation id="5005670136041063723">Няма повече подобни елементи.</translation>
 <translation id="501473567976723023">януари</translation>
+<translation id="5040591161308540832">Таблица $1 – $2 х $3</translation>
 <translation id="5041394372352067729">Преместване на брайловия дисплей в горната част на страницата</translation>
 <translation id="5042770794184672516">Увеличаване на силата на звука на говора</translation>
 <translation id="5050015258024679800">Предишното заглавие от четвърто ниво</translation>
@@ -555,6 +557,7 @@
 <translation id="6364795331201459219">заглавие от шесто ниво</translation>
 <translation id="6368143427468974988">Предишното заглавие</translation>
 <translation id="6378565991815958969">Копиране на $1.</translation>
+<translation id="6385591741672306837">кол.</translation>
 <translation id="6387719785439924554">странично съдържание</translation>
 <translation id="6411426777058107714">Няма предишен бутон за избор.</translation>
 <translation id="6414968628640960377">Предишният различен елемент.</translation>
@@ -704,6 +707,7 @@
 <translation id="8153880621934657047">Не сте в таблицата.</translation>
 <translation id="817440585505441544">{COUNT,plural, =1{долна черта}other{# долни черти}}</translation>
 <translation id="8179976553408161302">Enter</translation>
+<translation id="8184828902145951186">ред</translation>
 <translation id="8186185314313222077">превключване на режима на цял екран</translation>
 <translation id="8199231515320852133">Съобщаване на заглавките за текущата клетка</translation>
 <translation id="820417203470636242">Празна клетка.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb
index 576808d..7c0e7f0 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb
@@ -269,6 +269,7 @@
 <translation id="3392045790598181549"><ph name="NAME" />, menu item</translation>
 <translation id="3406283310380167331">Show forms list</translation>
 <translation id="3422338090358345848">Open keyboard explorer</translation>
+<translation id="3423495725743882470">row $1 column $2</translation>
 <translation id="3457000393508828486">Partially pressed</translation>
 <translation id="3462439746547587373"><ph name="NAME" />, button</translation>
 <translation id="3473644018603298796">sld <ph name="COUNT" /></translation>
@@ -412,6 +413,7 @@
 <translation id="5000760171916499057">No forms.</translation>
 <translation id="5005670136041063723">No more similar elements.</translation>
 <translation id="501473567976723023">January</translation>
+<translation id="5040591161308540832">Table $1, $2 by $3</translation>
 <translation id="5041394372352067729">Move braille display to top of page</translation>
 <translation id="5042770794184672516">Increase speech volume</translation>
 <translation id="5050015258024679800">Previous level 4 heading</translation>
@@ -555,6 +557,7 @@
 <translation id="6364795331201459219">h6</translation>
 <translation id="6368143427468974988">Previous heading</translation>
 <translation id="6378565991815958969">copy $1.</translation>
+<translation id="6385591741672306837">col</translation>
 <translation id="6387719785439924554">aside</translation>
 <translation id="6411426777058107714">No previous radio button.</translation>
 <translation id="6414968628640960377">Previous different element.</translation>
@@ -704,6 +707,7 @@
 <translation id="8153880621934657047">Not inside table.</translation>
 <translation id="817440585505441544">{COUNT,plural, =1{underscore}other{# underscores}}</translation>
 <translation id="8179976553408161302">Enter</translation>
+<translation id="8184828902145951186">row</translation>
 <translation id="8186185314313222077">toggle full screen</translation>
 <translation id="8199231515320852133">Announce the headers of the current cell</translation>
 <translation id="820417203470636242">Empty cell.</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 3c3f361..d92442f2 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
@@ -269,6 +269,7 @@
 <translation id="3392045790598181549"><ph name="NAME" />, 메뉴 항목</translation>
 <translation id="3406283310380167331">양식 목록 표시</translation>
 <translation id="3422338090358345848">키보드 탐색기 열기</translation>
+<translation id="3423495725743882470">행 $1 열 $2</translation>
 <translation id="3457000393508828486">부분적으로 누름</translation>
 <translation id="3462439746547587373"><ph name="NAME" />, 버튼</translation>
 <translation id="3473644018603298796">sld <ph name="COUNT" /></translation>
@@ -412,6 +413,7 @@
 <translation id="5000760171916499057">양식이 없습니다.</translation>
 <translation id="5005670136041063723">더 이상 유사한 요소가 없습니다.</translation>
 <translation id="501473567976723023">1월</translation>
+<translation id="5040591161308540832">표 $1, $2 작성자: $3</translation>
 <translation id="5041394372352067729">점자 디스플레이를 페이지 상단으로 이동합니다.</translation>
 <translation id="5042770794184672516">음성 볼륨 높이기</translation>
 <translation id="5050015258024679800">이전 수준 4 제목</translation>
@@ -555,6 +557,7 @@
 <translation id="6364795331201459219">h6</translation>
 <translation id="6368143427468974988">이전 제목</translation>
 <translation id="6378565991815958969">$1 항목을 복사합니다.</translation>
+<translation id="6385591741672306837">열</translation>
 <translation id="6387719785439924554">aside</translation>
 <translation id="6411426777058107714">이전 라디오 버튼이 없습니다.</translation>
 <translation id="6414968628640960377">이전 다른 요소</translation>
@@ -704,6 +707,7 @@
 <translation id="8153880621934657047">표 내부가 아닙니다.</translation>
 <translation id="817440585505441544">{COUNT,plural, =1{밑줄}other{밑줄 기호 #개}}</translation>
 <translation id="8179976553408161302">Enter</translation>
+<translation id="8184828902145951186">행</translation>
 <translation id="8186185314313222077">전체화면 전환</translation>
 <translation id="8199231515320852133">현재 셀의 헤더 알림</translation>
 <translation id="820417203470636242">빈 셀입니다.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
index 8aabff85..6af91b0 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
@@ -269,6 +269,7 @@
 <translation id="3392045790598181549">Item menu, <ph name="NAME" /></translation>
 <translation id="3406283310380167331">Paparkan senarai borang</translation>
 <translation id="3422338090358345848">Buka penjelajah papan kekunci</translation>
+<translation id="3423495725743882470">baris $1 lajur $2</translation>
 <translation id="3457000393508828486">Separuh ditekan</translation>
 <translation id="3462439746547587373">Butang, <ph name="NAME" /></translation>
 <translation id="3473644018603298796">sld <ph name="COUNT" /></translation>
@@ -412,6 +413,7 @@
 <translation id="5000760171916499057">Tiada borang.</translation>
 <translation id="5005670136041063723">Tiada lagi unsur yang serupa.</translation>
 <translation id="501473567976723023">Januari</translation>
+<translation id="5040591161308540832">Jadual $1, $2 kali $3</translation>
 <translation id="5041394372352067729">Alihkan paparan braille ke bahagian atas halaman</translation>
 <translation id="5042770794184672516">Tingkatkan kelantangan pertuturan</translation>
 <translation id="5050015258024679800">Tajuk tahap 4 sebelumnya</translation>
@@ -555,6 +557,7 @@
 <translation id="6364795331201459219">h6</translation>
 <translation id="6368143427468974988">Tajuk sebelumnya</translation>
 <translation id="6378565991815958969">salin $1.</translation>
+<translation id="6385591741672306837">lajur</translation>
 <translation id="6387719785439924554">ke sebelah</translation>
 <translation id="6411426777058107714">Tiada butang radio terdahulu.</translation>
 <translation id="6414968628640960377">Elemen berbeza terdahulu.</translation>
@@ -704,6 +707,7 @@
 <translation id="8153880621934657047">Bukan dalam jadual.</translation>
 <translation id="817440585505441544">{COUNT,plural, =1{garis bawah}other{# garis bawah}}</translation>
 <translation id="8179976553408161302">Enter</translation>
+<translation id="8184828902145951186">baris</translation>
 <translation id="8186185314313222077">togol skrin penuh</translation>
 <translation id="8199231515320852133">Umumkan pengepala sel semasa</translation>
 <translation id="820417203470636242">Sel kosong.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
index 21df82d..41f84357 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
@@ -269,6 +269,7 @@
 <translation id="3392045790598181549"><ph name="NAME" />, menyalternativ</translation>
 <translation id="3406283310380167331">Visa formulärlistan</translation>
 <translation id="3422338090358345848">Öppna tangentbordsutforskaren</translation>
+<translation id="3423495725743882470">rad $1 kolumn $2</translation>
 <translation id="3457000393508828486">Delvis nedtryckt</translation>
 <translation id="3462439746547587373"><ph name="NAME" />, knapp</translation>
 <translation id="3473644018603298796"><ph name="COUNT" /> markerade</translation>
@@ -412,6 +413,7 @@
 <translation id="5000760171916499057">Det finns inga formulär.</translation>
 <translation id="5005670136041063723">Det finns inga fler liknande element.</translation>
 <translation id="501473567976723023">januari</translation>
+<translation id="5040591161308540832">Tabell $1, $2 av $3</translation>
 <translation id="5041394372352067729">Flytta punktskriftsskärmen till sidans början</translation>
 <translation id="5042770794184672516">Höj talvolymen</translation>
 <translation id="5050015258024679800">Föregående rubrik på nivå 4</translation>
@@ -555,6 +557,7 @@
 <translation id="6364795331201459219">rubr6</translation>
 <translation id="6368143427468974988">Föregående rubrik</translation>
 <translation id="6378565991815958969">kopiera $1.</translation>
+<translation id="6385591741672306837">kolumn</translation>
 <translation id="6387719785439924554">sidoruta</translation>
 <translation id="6411426777058107714">Det finns ingen föregående alternativknapp.</translation>
 <translation id="6414968628640960377">Föregående element av annan typ.</translation>
@@ -704,6 +707,7 @@
 <translation id="8153880621934657047">Inte i tabellen.</translation>
 <translation id="817440585505441544">{COUNT,plural, =1{understreck}other{# understreck}}</translation>
 <translation id="8179976553408161302">Enter</translation>
+<translation id="8184828902145951186">rad</translation>
 <translation id="8186185314313222077">helskärmsläge av/på</translation>
 <translation id="8199231515320852133">Läs upp rubriker för den aktuella cellen</translation>
 <translation id="820417203470636242">Tom cell.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
index d04665ed..1a7aabd 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
@@ -268,6 +268,7 @@
 <translation id="3392045790598181549"><ph name="NAME" />, kipengee cha menyu</translation>
 <translation id="3406283310380167331">Onyesha orodha ya fomu</translation>
 <translation id="3422338090358345848">Fungua kigunduzi cha kibodi</translation>
+<translation id="3423495725743882470">safu mlalo $1 safu wima $2</translation>
 <translation id="3457000393508828486">Imebonyezwa kiasi</translation>
 <translation id="3462439746547587373"><ph name="NAME" />, kitufe</translation>
 <translation id="3473644018603298796">sld <ph name="COUNT" /></translation>
@@ -411,6 +412,7 @@
 <translation id="5000760171916499057">Hakuna fomu.</translation>
 <translation id="5005670136041063723">Hakuna vipengee vinavyofanana tena.</translation>
 <translation id="501473567976723023">Januari</translation>
+<translation id="5040591161308540832">Jedwali $1, $2 kwa $3</translation>
 <translation id="5041394372352067729">Sogeza onyesho la breli hadi mwanzo wa ukurasa</translation>
 <translation id="5042770794184672516">Ongeza sauti ya usemi</translation>
 <translation id="5050015258024679800">Kichwa cha ngazi ya 4 kilichotangulia</translation>
@@ -554,6 +556,7 @@
 <translation id="6364795331201459219">h6</translation>
 <translation id="6368143427468974988">Kichwa kilichotangulia</translation>
 <translation id="6378565991815958969">nakili $1.</translation>
+<translation id="6385591741672306837">safu wima</translation>
 <translation id="6387719785439924554">kando</translation>
 <translation id="6411426777058107714">Hakuna kitufe kilichotangulia.</translation>
 <translation id="6414968628640960377">Kipengee tofauti kilichotangulia.</translation>
@@ -703,6 +706,7 @@
 <translation id="8153880621934657047">Haimo ndani ya jedwali.</translation>
 <translation id="817440585505441544">{COUNT,plural, =1{kistari cha chini}other{vistari # vya chini}}</translation>
 <translation id="8179976553408161302">Enter</translation>
+<translation id="8184828902145951186">safu mlalo</translation>
 <translation id="8186185314313222077">geuza skrini nzima</translation>
 <translation id="8199231515320852133">Tangaza vichwa vya kisanduku cha sasa</translation>
 <translation id="820417203470636242">Kisanduku kitupu.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
index b9162fe..7c6e71a 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
@@ -269,6 +269,7 @@
 <translation id="3392045790598181549"><ph name="NAME" />, mục menu</translation>
 <translation id="3406283310380167331">Hiển thị danh sách biểu mẫu</translation>
 <translation id="3422338090358345848">Mở trình khám phá bàn phím</translation>
+<translation id="3423495725743882470">hàng $1 cột $2</translation>
 <translation id="3457000393508828486">Được nhấn một phần</translation>
 <translation id="3462439746547587373"><ph name="NAME" />, nút</translation>
 <translation id="3473644018603298796">sld <ph name="COUNT" /></translation>
@@ -412,6 +413,7 @@
 <translation id="5000760171916499057">Không có biểu mẫu nào.</translation>
 <translation id="5005670136041063723">Không có phần tử tương tự nào khác.</translation>
 <translation id="501473567976723023">Tháng 1</translation>
+<translation id="5040591161308540832">Bảng $1, $2 x $3</translation>
 <translation id="5041394372352067729">Di chuyển màn hình chữ nổi về đầu trang</translation>
 <translation id="5042770794184672516">Tăng âm lượng giọng nói</translation>
 <translation id="5050015258024679800">Tiêu đề cấp 4 trước</translation>
@@ -555,6 +557,7 @@
 <translation id="6364795331201459219">h6</translation>
 <translation id="6368143427468974988">Tiêu đề trước</translation>
 <translation id="6378565991815958969">sao chép $1.</translation>
+<translation id="6385591741672306837">cột</translation>
 <translation id="6387719785439924554">loại trừ</translation>
 <translation id="6411426777058107714">Không có nút radio trước nào.</translation>
 <translation id="6414968628640960377">Phần tử khác trước.</translation>
@@ -704,6 +707,7 @@
 <translation id="8153880621934657047">Không phải bên trong bảng.</translation>
 <translation id="817440585505441544">{COUNT,plural, =1{dấu gạch dưới}other{# dấu gạch dưới}}</translation>
 <translation id="8179976553408161302">Enter</translation>
+<translation id="8184828902145951186">hàng</translation>
 <translation id="8186185314313222077">chuyển đổi chế độ toàn màn hình</translation>
 <translation id="8199231515320852133">Thông báo các tiêu đề của ô hiện tại</translation>
 <translation id="820417203470636242">Ô trống.</translation>
diff --git a/chrome/browser/resources/md_downloads/crisper.js b/chrome/browser/resources/md_downloads/crisper.js
index cf866b17..906dc57 100644
--- a/chrome/browser/resources/md_downloads/crisper.js
+++ b/chrome/browser/resources/md_downloads/crisper.js
@@ -1992,12 +1992,31 @@
      * and uses an expressive syntax to filter key presses.
      *
      * Use the `keyBindings` prototype property to express what combination of keys
-     * will trigger the event to fire.
+     * will trigger the callback. A key binding has the format
+     * `"KEY+MODIFIER:EVENT": "callback"` (`"KEY": "callback"` or
+     * `"KEY:EVENT": "callback"` are valid as well). Some examples:
      *
-     * Use the `key-event-target` attribute to set up event handlers on a specific
+     *      keyBindings: {
+     *        'space': '_onKeydown', // same as 'space:keydown'
+     *        'shift+tab': '_onKeydown',
+     *        'enter:keypress': '_onKeypress',
+     *        'esc:keyup': '_onKeyup'
+     *      }
+     *
+     * The callback will receive with an event containing the following information in `event.detail`:
+     *
+     *      _onKeydown: function(event) {
+     *        console.log(event.detail.combo); // KEY+MODIFIER, e.g. "shift+tab"
+     *        console.log(event.detail.key); // KEY only, e.g. "tab"
+     *        console.log(event.detail.event); // EVENT, e.g. "keydown"
+     *        console.log(event.detail.keyboardEvent); // the original KeyboardEvent
+     *      }
+     *
+     * Use the `keyEventTarget` attribute to set up event handlers on a specific
      * node.
-     * The `keys-pressed` event will fire when one of the key combinations set with the
-     * `keys` property is pressed.
+     *
+     * See the [demo source code](https://github.com/PolymerElements/iron-a11y-keys-behavior/blob/master/demo/x-key-aware.html)
+     * for an example.
      *
      * @demo demo/index.html
      * @polymerBehavior
@@ -2046,6 +2065,12 @@
         '_resetKeyEventListeners(keyEventTarget, _boundKeyHandlers)'
       ],
 
+
+      /**
+       * To be used to express what combination of keys  will trigger the relative
+       * callback. e.g. `keyBindings: { 'esc': '_onEscPressed'}`
+       * @type {Object}
+       */
       keyBindings: {},
 
       registered: function() {
@@ -5611,7 +5636,6 @@
    * @polymerBehavior Polymer.PaperRippleBehavior
    */
   Polymer.PaperRippleBehavior = {
-
     properties: {
       /**
        * If true, the element will not produce a ripple effect when interacted
@@ -5712,13 +5736,10 @@
         this._ripple.noink = noink;
       }
     }
-
   };
 /** @polymerBehavior Polymer.PaperButtonBehavior */
   Polymer.PaperButtonBehaviorImpl = {
-
     properties: {
-
       /**
        * The z-depth of this element, from 0-5. Setting to 0 will remove the
        * shadow, and each increasing number greater than 0 will be "deeper"
@@ -5733,7 +5754,6 @@
         reflectToAttribute: true,
         readOnly: true
       }
-
     },
 
     observers: [
@@ -5789,7 +5809,6 @@
         this._ripple.uiUpAction();
       }
     }
-
   };
 
   /** @polymerBehavior */
@@ -7361,11 +7380,12 @@
     /**
      * Focuses the previous item (relative to the currently focused item) in the
      * menu, disabled items will be skipped.
+     * Loop until length + 1 to handle case of single item in menu.
      */
     _focusPrevious: function() {
       var length = this.items.length;
       var curFocusIndex = Number(this.indexOf(this.focusedItem));
-      for (var i = 1; i < length; i++) {
+      for (var i = 1; i < length + 1; i++) {
         var item = this.items[(curFocusIndex - i + length) % length];
         if (!item.hasAttribute('disabled')) {
           this._setFocusedItem(item);
@@ -7377,11 +7397,12 @@
     /**
      * Focuses the next item (relative to the currently focused item) in the
      * menu, disabled items will be skipped.
+     * Loop until length + 1 to handle case of single item in menu.
      */
     _focusNext: function() {
       var length = this.items.length;
       var curFocusIndex = Number(this.indexOf(this.focusedItem));
-      for (var i = 1; i < length; i++) {
+      for (var i = 1; i < length + 1; i++) {
         var item = this.items[(curFocusIndex + i) % length];
         if (!item.hasAttribute('disabled')) {
           this._setFocusedItem(item);
@@ -7785,7 +7806,6 @@
      * Positions and fits the element into the `fitInto` element.
      */
     fit: function() {
-      this._discoverInfo();
       this.position();
       this.constrain();
       this.center();
@@ -7887,6 +7907,7 @@
         // needs to be centered, and it is done after constrain.
         return;
       }
+      this._discoverInfo();
 
       this.style.position = 'fixed';
       // Need border-box for margin/padding.
@@ -7947,6 +7968,8 @@
       if (this.horizontalAlign || this.verticalAlign) {
         return;
       }
+      this._discoverInfo();
+
       var info = this._fitInfo;
       // position at (0px, 0px) if not already positioned, so we can measure the natural size.
       if (!info.positionedBy.vertically) {
@@ -8001,6 +8024,8 @@
       if (this.horizontalAlign || this.verticalAlign) {
         return;
       }
+      this._discoverInfo();
+
       var positionedBy = this._fitInfo.positionedBy;
       if (positionedBy.vertically && positionedBy.horizontally) {
         // Already positioned.
@@ -8638,9 +8663,12 @@
 on top of other content. It includes an optional backdrop, and can be used to implement a variety
 of UI controls including dialogs and drop downs. Multiple overlays may be displayed at once.
 
+See the [demo source code](https://github.com/PolymerElements/iron-overlay-behavior/blob/master/demo/simple-overlay.html)
+for an example.
+
 ### Closing and canceling
 
-A dialog may be hidden by closing or canceling. The difference between close and cancel is user
+An overlay may be hidden by closing or canceling. The difference between close and cancel is user
 intent. Closing generally implies that the user acknowledged the content on the overlay. By default,
 it will cancel whenever the user taps outside it or presses the escape key. This behavior is
 configurable with the `no-cancel-on-esc-key` and the `no-cancel-on-outside-click` properties.
@@ -8659,6 +8687,10 @@
 appended to `<body>` and is of type `<iron-overlay-backdrop>`. See its doc page for styling
 options.
 
+In addition, `with-backdrop` will wrap the focus within the content in the light DOM.
+Override the [`_focusableNodes` getter](#Polymer.IronOverlayBehavior:property-_focusableNodes)
+to achieve a different behavior.
+
 ### Limitations
 
 The element is styled to appear on top of other content by setting its `z-index` property. You
@@ -8694,7 +8726,8 @@
       },
 
       /**
-       * Set to true to display a backdrop behind the overlay.
+       * Set to true to display a backdrop behind the overlay. It traps the focus
+       * within the light DOM of the overlay.
        */
       withBackdrop: {
         observer: '_withBackdropChanged',
@@ -8959,6 +8992,8 @@
           this._prepareRenderOpened();
           this._renderOpened();
         } else {
+          // Move the focus before actually closing.
+          this._applyFocus();
           this._renderClosed();
         }
       }.bind(this));
@@ -8995,6 +9030,9 @@
       this.refit();
       this._finishPositioning();
 
+      // Move the focus to the child node with [autofocus].
+      this._applyFocus();
+
       // Safari will apply the focus to the autofocus element when displayed for the first time,
       // so we blur it. Later, _applyFocus will set the focus if necessary.
       if (this.noAutoFocus && document.activeElement === this._focusNode) {
@@ -9023,8 +9061,6 @@
      * @protected
      */
     _finishRenderOpened: function() {
-      // Focus the child node with [autofocus]
-      this._applyFocus();
 
       this.notifyResize();
       this.__isAnimating = false;
@@ -9047,8 +9083,6 @@
       // Reset z-index only at the end of the animation.
       this.style.zIndex = '';
 
-      this._applyFocus();
-
       this.notifyResize();
       this.__isAnimating = false;
       this.fire('iron-overlay-closed', this.closingReason);
@@ -9374,28 +9408,30 @@
    */
   Polymer.NeonAnimationRunnerBehaviorImpl = {
 
-    properties: {
-
-      /** @type {?Object} */
-      _player: {
-        type: Object
-      }
-
-    },
-
-    _configureAnimationEffects: function(allConfigs) {
-      var allAnimations = [];
-      if (allConfigs.length > 0) {
-        for (var config, index = 0; config = allConfigs[index]; index++) {
-          var animation = document.createElement(config.name);
+    _configureAnimations: function(configs) {
+      var results = [];
+      if (configs.length > 0) {
+        for (var config, index = 0; config = configs[index]; index++) {
+          var neonAnimation = document.createElement(config.name);
           // is this element actually a neon animation?
-          if (animation.isNeonAnimation) {
-            var effect = animation.configure(config);
-            if (effect) {
-              allAnimations.push({
-                animation: animation,
+          if (neonAnimation.isNeonAnimation) {
+            var result = null;
+            // configuration or play could fail if polyfills aren't loaded
+            try {
+              result = neonAnimation.configure(config);
+              // Check if we have an Effect rather than an Animation
+              if (typeof result.cancel != 'function') { 
+                result = document.timeline.play(result);
+              }
+            } catch (e) {
+              result = null;
+              console.warn('Couldnt play', '(', config.name, ').', e);
+            }
+            if (result) {
+              results.push({
+                neonAnimation: neonAnimation,
                 config: config,
-                effect: effect
+                animation: result,
               });
             }
           } else {
@@ -9403,16 +9439,26 @@
           }
         }
       }
-      return allAnimations;
+      return results;
     },
 
-    _runAnimationEffects: function(allEffects) {
-      return document.timeline.play(new GroupEffect(allEffects));
+    _shouldComplete: function(activeEntries) {
+      var finished = true;
+      for (var i = 0; i < activeEntries.length; i++) {
+        if (activeEntries[i].animation.playState != 'finished') {
+          finished = false;
+          break;
+        }
+      }
+      return finished;
     },
 
-    _completeAnimations: function(allAnimations) {
-      for (var animation, index = 0; animation = allAnimations[index]; index++) {
-        animation.animation.complete(animation.config);
+    _complete: function(activeEntries) {
+      for (var i = 0; i < activeEntries.length; i++) {
+        activeEntries[i].neonAnimation.complete(activeEntries[i].config);
+      }
+      for (var i = 0; i < activeEntries.length; i++) {
+        activeEntries[i].animation.cancel();
       }
     },
 
@@ -9422,43 +9468,44 @@
      * @param {!Object=} cookie
      */
     playAnimation: function(type, cookie) {
-      var allConfigs = this.getAnimationConfig(type);
-      if (!allConfigs) {
+      var configs = this.getAnimationConfig(type);
+      if (!configs) {
         return;
       }
-      try {
-        var allAnimations = this._configureAnimationEffects(allConfigs);
-        var allEffects = allAnimations.map(function(animation) {
-          return animation.effect;
-        });
-
-        if (allEffects.length > 0) {
-          this._player = this._runAnimationEffects(allEffects);
-          this._player.onfinish = function() {
-            this._completeAnimations(allAnimations);
-
-            if (this._player) {
-              this._player.cancel();
-              this._player = null;
-            }
-
-            this.fire('neon-animation-finish', cookie, {bubbles: false});
-          }.bind(this);
-          return;
-        }
-      } catch (e) {
-        console.warn('Couldnt play', '(', type, allConfigs, ').', e);
+      this._active = this._active || {};
+      if (this._active[type]) {
+        this._complete(this._active[type]);
+        delete this._active[type];
       }
-      this.fire('neon-animation-finish', cookie, {bubbles: false});
+
+      var activeEntries = this._configureAnimations(configs);
+
+      if (activeEntries.length == 0) {
+        this.fire('neon-animation-finish', cookie, {bubbles: false});
+        return;
+      }
+
+      this._active[type] = activeEntries;
+
+      for (var i = 0; i < activeEntries.length; i++) {
+        activeEntries[i].animation.onfinish = function() {
+          if (this._shouldComplete(activeEntries)) {
+            this._complete(activeEntries);
+            delete this._active[type];
+            this.fire('neon-animation-finish', cookie, {bubbles: false});
+          }
+        }.bind(this);
+      }
     },
 
     /**
-     * Cancels the currently running animation.
+     * Cancels the currently running animations.
      */
     cancelAnimation: function() {
-      if (this._player) {
-        this._player.cancel();
+      for (var k in this._animations) {
+        this._animations[k].cancel();
       }
+      this._animations = {};
     }
   };
 
@@ -9561,6 +9608,14 @@
   });
 (function() {
     'use strict';
+    // Used to calculate the scroll direction during touch events.
+    var LAST_TOUCH_POSITION = {
+      pageX: 0,
+      pageY: 0
+    };
+    // Used to avoid computing event.path and filter scrollable nodes (better perf).
+    var ROOT_TARGET = null;
+    var SCROLLABLE_NODES = [];
 
     /**
      * The IronDropdownScrollManager is intended to provide a central source
@@ -9578,9 +9633,8 @@
         return this._lockingElements[this._lockingElements.length - 1];
       },
 
-
       /**
-       * Returns true if the provided element is "scroll locked," which is to
+       * Returns true if the provided element is "scroll locked", which is to
        * say that it cannot be scrolled via pointer or keyboard interactions.
        *
        * @param {HTMLElement} element An HTML element instance which may or may
@@ -9673,8 +9727,6 @@
 
       _unlockedElementCache: null,
 
-      _originalBodyStyles: {},
-
       _isScrollingKeypress: function(event) {
         return Polymer.IronA11yKeysBehavior.keyboardEventMatchesKeys(
           event, 'pageup pagedown home end up left down right');
@@ -9722,58 +9774,186 @@
       },
 
       _scrollInteractionHandler: function(event) {
-        var scrolledElement =
-            /** @type {HTMLElement} */(Polymer.dom(event).rootTarget);
-        if (Polymer
-              .IronDropdownScrollManager
-              .elementIsScrollLocked(scrolledElement)) {
-          if (event.type === 'keydown' &&
-              !Polymer.IronDropdownScrollManager._isScrollingKeypress(event)) {
-            return;
-          }
-
+        // Avoid canceling an event with cancelable=false, e.g. scrolling is in
+        // progress and cannot be interrupted.
+        if (event.cancelable && this._shouldPreventScrolling(event)) {
           event.preventDefault();
         }
+        // If event has targetTouches (touch event), update last touch position.
+        if (event.targetTouches) {
+          var touch = event.targetTouches[0];
+          LAST_TOUCH_POSITION.pageX = touch.pageX;
+          LAST_TOUCH_POSITION.pageY = touch.pageY;
+        }
       },
 
       _lockScrollInteractions: function() {
-        // Memoize body inline styles:
-        this._originalBodyStyles.overflow = document.body.style.overflow;
-        this._originalBodyStyles.overflowX = document.body.style.overflowX;
-        this._originalBodyStyles.overflowY = document.body.style.overflowY;
-
-        // Disable overflow scrolling on body:
-        // TODO(cdata): It is technically not sufficient to hide overflow on
-        // body alone. A better solution might be to traverse all ancestors of
-        // the current scroll locking element and hide overflow on them. This
-        // becomes expensive, though, as it would have to be redone every time
-        // a new scroll locking element is added.
-        document.body.style.overflow = 'hidden';
-        document.body.style.overflowX = 'hidden';
-        document.body.style.overflowY = 'hidden';
-
+        this._boundScrollHandler = this._boundScrollHandler ||
+          this._scrollInteractionHandler.bind(this);
         // Modern `wheel` event for mouse wheel scrolling:
-        document.addEventListener('wheel', this._scrollInteractionHandler, true);
+        document.addEventListener('wheel', this._boundScrollHandler, true);
         // Older, non-standard `mousewheel` event for some FF:
-        document.addEventListener('mousewheel', this._scrollInteractionHandler, true);
+        document.addEventListener('mousewheel', this._boundScrollHandler, true);
         // IE:
-        document.addEventListener('DOMMouseScroll', this._scrollInteractionHandler, true);
+        document.addEventListener('DOMMouseScroll', this._boundScrollHandler, true);
+        // Save the SCROLLABLE_NODES on touchstart, to be used on touchmove.
+        document.addEventListener('touchstart', this._boundScrollHandler, true);
         // Mobile devices can scroll on touch move:
-        document.addEventListener('touchmove', this._scrollInteractionHandler, true);
+        document.addEventListener('touchmove', this._boundScrollHandler, true);
         // Capture keydown to prevent scrolling keys (pageup, pagedown etc.)
-        document.addEventListener('keydown', this._scrollInteractionHandler, true);
+        document.addEventListener('keydown', this._boundScrollHandler, true);
       },
 
       _unlockScrollInteractions: function() {
-        document.body.style.overflow = this._originalBodyStyles.overflow;
-        document.body.style.overflowX = this._originalBodyStyles.overflowX;
-        document.body.style.overflowY = this._originalBodyStyles.overflowY;
+        document.removeEventListener('wheel', this._boundScrollHandler, true);
+        document.removeEventListener('mousewheel', this._boundScrollHandler, true);
+        document.removeEventListener('DOMMouseScroll', this._boundScrollHandler, true);
+        document.removeEventListener('touchstart', this._boundScrollHandler, true);
+        document.removeEventListener('touchmove', this._boundScrollHandler, true);
+        document.removeEventListener('keydown', this._boundScrollHandler, true);
+      },
 
-        document.removeEventListener('wheel', this._scrollInteractionHandler, true);
-        document.removeEventListener('mousewheel', this._scrollInteractionHandler, true);
-        document.removeEventListener('DOMMouseScroll', this._scrollInteractionHandler, true);
-        document.removeEventListener('touchmove', this._scrollInteractionHandler, true);
-        document.removeEventListener('keydown', this._scrollInteractionHandler, true);
+      /**
+       * Returns true if the event causes scroll outside the current locking
+       * element, e.g. pointer/keyboard interactions, or scroll "leaking"
+       * outside the locking element when it is already at its scroll boundaries.
+       * @param {!Event} event
+       * @return {boolean}
+       * @private
+       */
+      _shouldPreventScrolling: function(event) {
+        // Avoid expensive checks if the event is not one of the observed keys.
+        if (event.type === 'keydown') {
+          // Prevent event if it is one of the scrolling keys.
+          return this._isScrollingKeypress(event);
+        }
+
+        // Update if root target changed. For touch events, ensure we don't
+        // update during touchmove.
+        var target = Polymer.dom(event).rootTarget;
+        if (event.type !== 'touchmove' && ROOT_TARGET !== target) {
+          ROOT_TARGET = target;
+          SCROLLABLE_NODES = this._getScrollableNodes(Polymer.dom(event).path);
+        }
+
+        // Prevent event if no scrollable nodes.
+        if (!SCROLLABLE_NODES.length) {
+          return true;
+        }
+        // Don't prevent touchstart event inside the locking element when it has
+        // scrollable nodes.
+        if (event.type === 'touchstart') {
+          return false;
+        }
+        // Get deltaX/Y.
+        var info = this._getScrollInfo(event);
+        // Prevent if there is no child that can scroll.
+        return !this._getScrollingNode(SCROLLABLE_NODES, info.deltaX, info.deltaY);
+      },
+
+      /**
+       * Returns an array of scrollable nodes up to the current locking element,
+       * which is included too if scrollable.
+       * @param {!Array<Node>} nodes
+       * @return {Array<Node>} scrollables
+       * @private
+       */
+      _getScrollableNodes: function(nodes) {
+        var scrollables = [];
+        var lockingIndex = nodes.indexOf(this.currentLockingElement);
+        // Loop from root target to locking element (included).
+        for (var i = 0; i <= lockingIndex; i++) {
+          var node = nodes[i];
+          // Skip document fragments.
+          if (node.nodeType === 11) {
+            continue;
+          }
+          // Check inline style before checking computed style.
+          var style = node.style;
+          if (style.overflow !== 'scroll' && style.overflow !== 'auto') {
+            style = window.getComputedStyle(node);
+          }
+          if (style.overflow === 'scroll' || style.overflow === 'auto') {
+            scrollables.push(node);
+          }
+        }
+        return scrollables;
+      },
+
+      /**
+       * Returns the node that is scrolling. If there is no scrolling,
+       * returns undefined.
+       * @param {!Array<Node>} nodes
+       * @param {number} deltaX Scroll delta on the x-axis
+       * @param {number} deltaY Scroll delta on the y-axis
+       * @return {Node|undefined}
+       * @private
+       */
+      _getScrollingNode: function(nodes, deltaX, deltaY) {
+        // No scroll.
+        if (!deltaX && !deltaY) {
+          return;
+        }
+        // Check only one axis according to where there is more scroll.
+        // Prefer vertical to horizontal.
+        var verticalScroll = Math.abs(deltaY) >= Math.abs(deltaX);
+        for (var i = 0; i < nodes.length; i++) {
+          var node = nodes[i];
+          var canScroll = false;
+          if (verticalScroll) {
+            // delta < 0 is scroll up, delta > 0 is scroll down.
+            canScroll = deltaY < 0 ? node.scrollTop > 0 :
+              node.scrollTop < node.scrollHeight - node.clientHeight;
+          } else {
+            // delta < 0 is scroll left, delta > 0 is scroll right.
+            canScroll = deltaX < 0 ? node.scrollLeft > 0 :
+              node.scrollLeft < node.scrollWidth - node.clientWidth;
+          }
+          if (canScroll) {
+            return node;
+          }
+        }
+      },
+
+      /**
+       * Returns scroll `deltaX` and `deltaY`.
+       * @param {!Event} event The scroll event
+       * @return {{
+       *  deltaX: number The x-axis scroll delta (positive: scroll right,
+       *                 negative: scroll left, 0: no scroll),
+       *  deltaY: number The y-axis scroll delta (positive: scroll down,
+       *                 negative: scroll up, 0: no scroll)
+       * }} info
+       * @private
+       */
+      _getScrollInfo: function(event) {
+        var info = {
+          deltaX: event.deltaX,
+          deltaY: event.deltaY
+        };
+        // Already available.
+        if ('deltaX' in event) {
+          // do nothing, values are already good.
+        }
+        // Safari has scroll info in `wheelDeltaX/Y`.
+        else if ('wheelDeltaX' in event) {
+          info.deltaX = -event.wheelDeltaX;
+          info.deltaY = -event.wheelDeltaY;
+        }
+        // Firefox has scroll info in `detail` and `axis`.
+        else if ('axis' in event) {
+          info.deltaX = event.axis === 1 ? event.detail : 0;
+          info.deltaY = event.axis === 2 ? event.detail : 0;
+        }
+        // On mobile devices, calculate scroll direction.
+        else if (event.targetTouches) {
+          var touch = event.targetTouches[0];
+          // Touch moves from right to left => scrolling goes right.
+          info.deltaX = LAST_TOUCH_POSITION.pageX - touch.pageX;
+          // Touch moves from down to up => scrolling goes down.
+          info.deltaY = LAST_TOUCH_POSITION.pageY - touch.pageY;
+        }
+        return info;
       }
     };
   })();
@@ -9855,6 +10035,18 @@
           allowOutsideScroll: {
             type: Boolean,
             value: false
+          },
+
+          /**
+           * Callback for scroll events.
+           * @type {Function}
+           * @private
+           */
+          _boundOnCaptureScroll: {
+            type: Function,
+            value: function() {
+              return this._onCaptureScroll.bind(this);
+            }
           }
         },
 
@@ -9881,6 +10073,14 @@
           return this.focusTarget || this.containedElement;
         },
 
+        ready: function() {
+          // Memoized scrolling position, used to block scrolling outside.
+          this._scrollTop = 0;
+          this._scrollLeft = 0;
+          // Used to perform a non-blocking refit on scroll.
+          this._refitOnScrollRAF = null;
+        },
+
         detached: function() {
           this.cancelAnimation();
           Polymer.IronDropdownScrollManager.removeScrollLock(this);
@@ -9897,9 +10097,12 @@
             this.cancelAnimation();
             this.sizingTarget = this.containedElement || this.sizingTarget;
             this._updateAnimationConfig();
-            if (this.opened && !this.allowOutsideScroll) {
-              Polymer.IronDropdownScrollManager.pushScrollLock(this);
+            this._saveScrollPosition();
+            if (this.opened) {
+              document.addEventListener('scroll', this._boundOnCaptureScroll);
+              !this.allowOutsideScroll && Polymer.IronDropdownScrollManager.pushScrollLock(this);
             } else {
+              document.removeEventListener('scroll', this._boundOnCaptureScroll);
               Polymer.IronDropdownScrollManager.removeScrollLock(this);
             }
             Polymer.IronOverlayBehaviorImpl._openedChanged.apply(this, arguments);
@@ -9922,6 +10125,7 @@
          * Overridden from `IronOverlayBehavior`.
          */
         _renderClosed: function() {
+
           if (!this.noAnimations && this.animationConfig.close) {
             this.$.contentWrapper.classList.add('animating');
             this.playAnimation('close');
@@ -9945,6 +10149,47 @@
           }
         },
 
+        _onCaptureScroll: function() {
+          if (!this.allowOutsideScroll) {
+            this._restoreScrollPosition();
+          } else {
+            this._refitOnScrollRAF && window.cancelAnimationFrame(this._refitOnScrollRAF);
+            this._refitOnScrollRAF = window.requestAnimationFrame(this.refit.bind(this));
+          }
+        },
+
+        /**
+         * Memoizes the scroll position of the outside scrolling element.
+         * @private
+         */
+        _saveScrollPosition: function() {
+          if (document.scrollingElement) {
+            this._scrollTop = document.scrollingElement.scrollTop;
+            this._scrollLeft = document.scrollingElement.scrollLeft;
+          } else {
+            // Since we don't know if is the body or html, get max.
+            this._scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
+            this._scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
+          }
+        },
+
+        /**
+         * Resets the scroll position of the outside scrolling element.
+         * @private
+         */
+        _restoreScrollPosition: function() {
+          if (document.scrollingElement) {
+            document.scrollingElement.scrollTop = this._scrollTop;
+            document.scrollingElement.scrollLeft = this._scrollLeft;
+          } else {
+            // Since we don't know if is the body or html, set both.
+            document.documentElement.scrollTop = this._scrollTop;
+            document.documentElement.scrollLeft = this._scrollLeft;
+            document.body.scrollTop = this._scrollTop;
+            document.body.scrollLeft = this._scrollLeft;
+          }
+        },
+
         /**
          * Constructs the final animation config from different properties used
          * to configure specific parts of the opening and closing animations.
@@ -10115,6 +10360,11 @@
 (function() {
       'use strict';
 
+      var config = {
+        ANIMATION_CUBIC_BEZIER: 'cubic-bezier(.3,.95,.5,1)',
+        MAX_ANIMATION_TIME_MS: 400
+      };
+
       var PaperMenuButton = Polymer({
         is: 'paper-menu-button',
 
@@ -10167,6 +10417,16 @@
           },
 
           /**
+           * If true, the `horizontalAlign` and `verticalAlign` properties will
+           * be considered preferences instead of strict requirements when
+           * positioning the dropdown and may be changed if doing so reduces
+           * the area of the dropdown falling outside of `fitInto`.
+           */
+          dynamicAlign: {
+            type: Boolean
+          },
+
+          /**
            * A pixel value that will be added to the position calculated for the
            * given `horizontalAlign`. Use a negative value to offset to the
            * left, or a positive value to offset to the right.
@@ -10189,6 +10449,14 @@
           },
 
           /**
+           * If true, the dropdown will be positioned so that it doesn't overlap
+           * the button.
+           */
+          noOverlap: {
+            type: Boolean
+          },
+
+          /**
            * Set to true to disable animations when opening and closing the
            * dropdown.
            */
@@ -10207,6 +10475,15 @@
           },
 
           /**
+           * Set to true to enable automatically closing the dropdown after an
+           * item has been activated, even if the selection did not change.
+           */
+          closeOnActivate: {
+            type: Boolean,
+            value: false
+          },
+
+          /**
            * An animation config. If provided, this will be used to animate the
            * opening of the dropdown.
            */
@@ -10224,14 +10501,14 @@
                 timing: {
                   delay: 100,
                   duration: 150,
-                  easing: PaperMenuButton.ANIMATION_CUBIC_BEZIER
+                  easing: config.ANIMATION_CUBIC_BEZIER
                 }
               }, {
                 name: 'paper-menu-grow-height-animation',
                 timing: {
                   delay: 100,
                   duration: 275,
-                  easing: PaperMenuButton.ANIMATION_CUBIC_BEZIER
+                  easing: config.ANIMATION_CUBIC_BEZIER
                 }
               }];
             }
@@ -10254,7 +10531,7 @@
                 timing: {
                   delay: 100,
                   duration: 50,
-                  easing: PaperMenuButton.ANIMATION_CUBIC_BEZIER
+                  easing: config.ANIMATION_CUBIC_BEZIER
                 }
               }, {
                 name: 'paper-menu-shrink-height-animation',
@@ -10265,6 +10542,25 @@
               }];
             }
           },
+          
+          /**
+           * By default, the dropdown will constrain scrolling on the page
+           * to itself when opened.
+           * Set to true in order to prevent scroll from being constrained
+           * to the dropdown when it opens.
+           */
+          allowOutsideScroll: {
+            type: Boolean,
+            value: false
+          },
+
+          /**
+           * Whether focus should be restored to the button when the menu closes.
+           */
+          restoreFocusOnClose: {
+            type: Boolean,
+            value: true
+          },
 
           /**
            * This is the element intended to be bound as the focus target
@@ -10281,6 +10577,7 @@
         },
 
         listeners: {
+          'iron-activate': '_onIronActivate',
           'iron-select': '_onIronSelect'
         },
 
@@ -10335,6 +10632,18 @@
         },
 
         /**
+         * Closes the dropdown when an `iron-activate` event is received if
+         * `closeOnActivate` is true.
+         *
+         * @param {CustomEvent} event A CustomEvent of type 'iron-activate'.
+         */
+        _onIronActivate: function(event) {
+          if (this.closeOnActivate) {
+            this.close();
+          }
+        },
+
+        /**
          * When the dropdown opens, the `paper-menu-button` fires `paper-open`.
          * When the dropdown closes, the `paper-menu-button` fires `paper-close`.
          *
@@ -10380,8 +10689,9 @@
         }
       });
 
-      PaperMenuButton.ANIMATION_CUBIC_BEZIER = 'cubic-bezier(.3,.95,.5,1)';
-      PaperMenuButton.MAX_ANIMATION_TIME_MS = 400;
+      Object.keys(config).forEach(function (key) {
+        PaperMenuButton[key] = config[key];
+      });
 
       Polymer.PaperMenuButton = PaperMenuButton;
     })();
@@ -10391,7 +10701,6 @@
    * @polymerBehavior Polymer.PaperInkyFocusBehavior
    */
   Polymer.PaperInkyFocusBehaviorImpl = {
-
     observers: [
       '_focusedChanged(receivedFocusFromKeyboard)'
     ],
@@ -10412,7 +10721,6 @@
       ripple.classList.add('circle');
       return ripple;
     }
-
   };
 
   /** @polymerBehavior Polymer.PaperInkyFocusBehavior */
@@ -11423,11 +11731,9 @@
       if (menu.items.indexOf(e.relatedTarget) >= 0)
         return;
 
-      // This can be this.$.more.restoreFocusOnClose = false when this lands:
-      // https://github.com/PolymerElements/paper-menu-button/pull/94
-      this.$.more.$.dropdown.restoreFocusOnClose = false;
+      this.$.more.restoreFocusOnClose = false;
       this.closeMoreActions_();
-      this.$.more.$.dropdown.restoreFocusOnClose = true;
+      this.$.more.restoreFocusOnClose = true;
     },
 
     /** @private */
@@ -11460,12 +11766,6 @@
 
   return {Toolbar: Toolbar};
 });
-
-// TODO(dbeam): https://github.com/PolymerElements/iron-dropdown/pull/16/files
-/** @suppress {checkTypes} */
-(function() {
-Polymer.IronDropdownScrollManager.pushScrollLock = function() {};
-})();
 // 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.
diff --git a/chrome/browser/resources/md_downloads/toolbar.css b/chrome/browser/resources/md_downloads/toolbar.css
index de3d76b..90aed1fb 100644
--- a/chrome/browser/resources/md_downloads/toolbar.css
+++ b/chrome/browser/resources/md_downloads/toolbar.css
@@ -83,6 +83,12 @@
   -webkit-margin-start: 16px;
 }
 
+paper-menu {
+  --paper-menu-selected-item: {
+    font-weight: normal;
+  };
+}
+
 paper-item {
   -webkit-user-select: none;
   cursor: pointer;
diff --git a/chrome/browser/resources/md_downloads/toolbar.html b/chrome/browser/resources/md_downloads/toolbar.html
index 3689542..2b7046f 100644
--- a/chrome/browser/resources/md_downloads/toolbar.html
+++ b/chrome/browser/resources/md_downloads/toolbar.html
@@ -27,7 +27,8 @@
       <cr-search-field id="search-input" label="$i18n{search}"
           clear-label="$i18n{clearSearch}"
           on-search-changed="onSearchChanged_"></cr-search-field>
-      <paper-menu-button id="more" horizontal-align="[[overflowAlign_]]">
+      <paper-menu-button id="more" horizontal-align="[[overflowAlign_]]"
+          allow-outside-scroll>
         <paper-icon-button icon="cr:more-vert" title="$i18n{moreActions}"
              class="dropdown-trigger"></paper-icon-button>
         <paper-menu class="dropdown-content">
diff --git a/chrome/browser/resources/md_downloads/toolbar.js b/chrome/browser/resources/md_downloads/toolbar.js
index b4c0527..66d73f8 100644
--- a/chrome/browser/resources/md_downloads/toolbar.js
+++ b/chrome/browser/resources/md_downloads/toolbar.js
@@ -74,11 +74,9 @@
       if (menu.items.indexOf(e.relatedTarget) >= 0)
         return;
 
-      // This can be this.$.more.restoreFocusOnClose = false when this lands:
-      // https://github.com/PolymerElements/paper-menu-button/pull/94
-      this.$.more.$.dropdown.restoreFocusOnClose = false;
+      this.$.more.restoreFocusOnClose = false;
       this.closeMoreActions_();
-      this.$.more.$.dropdown.restoreFocusOnClose = true;
+      this.$.more.restoreFocusOnClose = true;
     },
 
     /** @private */
@@ -111,9 +109,3 @@
 
   return {Toolbar: Toolbar};
 });
-
-// TODO(dbeam): https://github.com/PolymerElements/iron-dropdown/pull/16/files
-/** @suppress {checkTypes} */
-(function() {
-Polymer.IronDropdownScrollManager.pushScrollLock = function() {};
-})();
diff --git a/chrome/browser/resources/md_downloads/vulcanized.html b/chrome/browser/resources/md_downloads/vulcanized.html
index 09f1165..db733349 100644
--- a/chrome/browser/resources/md_downloads/vulcanized.html
+++ b/chrome/browser/resources/md_downloads/vulcanized.html
@@ -455,24 +455,22 @@
 
 
 <dom-module id="iron-icon" assetpath="chrome://resources/polymer/v1_0/iron-icon/">
-
-  <style>
-    :host {
-      @apply(--layout-inline);
-      @apply(--layout-center-center);
-      position: relative;
-
-      vertical-align: middle;
-
-      fill: var(--iron-icon-fill-color, currentcolor);
-      stroke: var(--iron-icon-stroke-color, none);
-
-      width: var(--iron-icon-width, 24px);
-      height: var(--iron-icon-height, 24px);
-    }
-  </style>
-
   <template>
+    <style>
+      :host {
+        @apply(--layout-inline);
+        @apply(--layout-center-center);
+        position: relative;
+
+        vertical-align: middle;
+
+        fill: var(--iron-icon-fill-color, currentcolor);
+        stroke: var(--iron-icon-stroke-color, none);
+
+        width: var(--iron-icon-width, 24px);
+        height: var(--iron-icon-height, 24px);
+      }
+    </style>
   </template>
 
   </dom-module>
@@ -1989,20 +1987,21 @@
 
 
 <dom-module id="iron-dropdown" assetpath="chrome://resources/polymer/v1_0/iron-dropdown/">
-  <style>
-    :host {
-      position: fixed;
-    }
-
-    #contentWrapper ::content > * {
-      overflow: auto;
-    }
-
-    #contentWrapper.animating ::content > * {
-      overflow: hidden;
-    }
-  </style>
   <template>
+    <style>
+      :host {
+        position: fixed;
+      }
+
+      #contentWrapper ::content > * {
+        overflow: auto;
+      }
+
+      #contentWrapper.animating ::content > * {
+        overflow: hidden;
+      }
+    </style>
+
     <div id="contentWrapper">
       <content id="content" select=".dropdown-content"></content>
     </div>
@@ -2059,7 +2058,7 @@
       <content select=".dropdown-trigger"></content>
     </div>
 
-    <iron-dropdown id="dropdown" opened="{{opened}}" horizontal-align="[[horizontalAlign]]" vertical-align="[[verticalAlign]]" horizontal-offset="[[horizontalOffset]]" vertical-offset="[[verticalOffset]]" open-animation-config="[[openAnimationConfig]]" close-animation-config="[[closeAnimationConfig]]" no-animations="[[noAnimations]]" focus-target="[[_dropdownContent]]" restore-focus-on-close="" on-iron-overlay-canceled="__onIronOverlayCanceled">
+    <iron-dropdown id="dropdown" opened="{{opened}}" horizontal-align="[[horizontalAlign]]" vertical-align="[[verticalAlign]]" dynamic-align="[[dynamicAlign]]" horizontal-offset="[[horizontalOffset]]" vertical-offset="[[verticalOffset]]" no-overlap="[[noOverlap]]" open-animation-config="[[openAnimationConfig]]" close-animation-config="[[closeAnimationConfig]]" no-animations="[[noAnimations]]" focus-target="[[_dropdownContent]]" allow-outside-scroll="[[allowOutsideScroll]]" restore-focus-on-close="[[restoreFocusOnClose]]" on-iron-overlay-canceled="__onIronOverlayCanceled">
       <div class="dropdown-content">
         <content id="content" select=".dropdown-content"></content>
       </div>
@@ -2159,15 +2158,14 @@
 
 
 <dom-module id="iron-a11y-announcer" assetpath="chrome://resources/polymer/v1_0/iron-a11y-announcer/">
-  <style>
-    :host {
-      display: inline-block;
-      position: fixed;
-      clip: rect(0px,0px,0px,0px);
-    }
-  </style>
-
   <template>
+    <style>
+      :host {
+        display: inline-block;
+        position: fixed;
+        clip: rect(0px,0px,0px,0px);
+      }
+    </style>
     <div aria-live$="[[mode]]">[[_text]]</div>
   </template>
 
@@ -2182,7 +2180,7 @@
         @apply(--paper-input-container);
       }
 
-      :host[inline] {
+      :host([inline]) {
         display: inline-block;
       }
 
@@ -2584,6 +2582,12 @@
   -webkit-margin-start: 16px;
 }
 
+paper-menu {
+  --paper-menu-selected-item: {
+    font-weight: normal;
+  };
+}
+
 paper-item {
   -webkit-user-select: none;
   cursor: pointer;
@@ -2638,7 +2642,7 @@
     </div>
     <div id="search">
       <cr-search-field id="search-input" label="$i18n{search}" clear-label="$i18n{clearSearch}" on-search-changed="onSearchChanged_"></cr-search-field>
-      <paper-menu-button id="more" horizontal-align="[[overflowAlign_]]">
+      <paper-menu-button id="more" horizontal-align="[[overflowAlign_]]" allow-outside-scroll="">
         <paper-icon-button icon="cr:more-vert" title="$i18n{moreActions}" class="dropdown-trigger"></paper-icon-button>
         <paper-menu class="dropdown-content">
           <paper-item class="clear-all" on-tap="onClearAllTap_" on-blur="onItemBlur_">
diff --git a/chrome/browser/resources/md_feedback/feedback_container.html b/chrome/browser/resources/md_feedback/feedback_container.html
index 5f1029723..acb0772 100644
--- a/chrome/browser/resources/md_feedback/feedback_container.html
+++ b/chrome/browser/resources/md_feedback/feedback_container.html
@@ -1,5 +1,6 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-checkbox/paper-checkbox.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-input/paper-input.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-input/paper-textarea.html">
 <dom-module name="feedback-container">
@@ -23,6 +24,15 @@
       <paper-input label="$i18n{emailLabel}"></paper-input>
     </div>
     <div>
+      <paper-checkbox>$i18n{includeScreenshotLabel}</paper-checkbox>
+    </div>
+    <div>
+      <paper-checkbox>$i18n{sendSystemInfoLabel}</paper-checkbox>
+    </div>
+    <div>
+      <span>[[getPrivacyNote_()]]</span>
+    </div>
+    <div>
       <paper-button>$i18n{cancelButton}</paper-button>
       <paper-button id="submit-button">$i18n{sendReportButton}</paper-button>
     </div>
diff --git a/chrome/browser/resources/md_feedback/feedback_container.js b/chrome/browser/resources/md_feedback/feedback_container.js
index 403aa35..7caa6ab 100644
--- a/chrome/browser/resources/md_feedback/feedback_container.js
+++ b/chrome/browser/resources/md_feedback/feedback_container.js
@@ -7,4 +7,15 @@
 // to show and what will be submitted to the feedback servers.
 Polymer({
   is: 'feedback-container',
+
+  /**
+   * Retrieves the feedback privacy note text, if it exists. On non-officially
+   * branded builds, the string is not defined.
+   *
+   * @return {string} Privacy note text.
+   */
+  getPrivacyNote_: function() {
+    return loadTimeData.valueExists('privacyNote') ?
+        this.i18n('privacyNote') : '';
+  },
 });
diff --git a/chrome/browser/resources/settings/controls/settings_checkbox.html b/chrome/browser/resources/settings/controls/settings_checkbox.html
index 0acdf3d..fb33783 100644
--- a/chrome/browser/resources/settings/controls/settings_checkbox.html
+++ b/chrome/browser/resources/settings/controls/settings_checkbox.html
@@ -20,13 +20,6 @@
         @apply(--settings-secondary);
       }
 
-      #nonexistent {
-        /* HACK(michaelpg): Inform Polymer that this mixin can set "display". */
-        --settings-secondary-unchecked: {
-          display: block;
-        };
-      }
-
       paper-checkbox:not([checked]) .secondary {
         @apply(--settings-secondary-unchecked);
       }
diff --git a/chrome/browser/resources/settings/settings_main/settings_main.html b/chrome/browser/resources/settings/settings_main/settings_main.html
index 2c9a01d9..6e0e1dc3 100644
--- a/chrome/browser/resources/settings/settings_main/settings_main.html
+++ b/chrome/browser/resources/settings/settings_main/settings_main.html
@@ -61,6 +61,7 @@
       <settings-about-page current-route="{{currentRoute}}">
       </settings-about-page>
     </template>
+    <div id="overscroll"></div>
   </template>
   <script src="settings_main.js"></script>
   <script src="/search_settings.js"></script>
diff --git a/chrome/browser/resources/settings/settings_main/settings_main.js b/chrome/browser/resources/settings/settings_main/settings_main.js
index f80a8512..6c23227 100644
--- a/chrome/browser/resources/settings/settings_main/settings_main.js
+++ b/chrome/browser/resources/settings/settings_main/settings_main.js
@@ -130,6 +130,55 @@
       if (this.showPages_.advanced)
         this.advancedToggleExpanded_ = true;
     }
+
+    // Wait for the dom-if changes prior to calculating the overflow padding.
+    this.async(function() {
+      this.$.overscroll.style.paddingBottom = this.overscrollHeight_() + 'px';
+    });
+  },
+
+  /**
+   * Return the height that the over scroll padding should be set to.
+   * This is used to determine how much padding to apply to the end of the
+   * content so that the last element may align with the top of the content
+   * area.
+   * @return {number}
+   * @private
+   */
+  overscrollHeight_: function() {
+    if (!this.currentRoute || this.currentRoute.subpage.length != 0 ||
+        this.showPages_.about) {
+      return 0;
+    }
+
+    /**
+     * @param {!Element} element
+     * @return {number}
+     */
+    var calcHeight = function(element) {
+      var style = getComputedStyle(element);
+      var height = this.parentNode.scrollHeight - element.offsetHeight +
+          parseFloat(style.marginTop) + parseFloat(style.marginBottom);
+      assert(height >= 0);
+      return height;
+    }.bind(this);
+
+    if (this.showPages_.advanced) {
+      var lastSection = this.$$('settings-advanced-page').$$(
+          'settings-section:last-of-type');
+      // |lastSection| may be null in unit tests.
+      if (!lastSection)
+        return 0;
+      return calcHeight(lastSection);
+    }
+
+    assert(this.showPages_.basic);
+    var lastSection = this.$$('settings-basic-page').$$(
+        'settings-section:last-of-type');
+    // |lastSection| may be null in unit tests.
+    if (!lastSection)
+      return 0;
+    return calcHeight(lastSection) - this.$$('#toggleContainer').offsetHeight;
   },
 
   /** @private */
diff --git a/chrome/browser/resources/settings/settings_shared_css.html b/chrome/browser/resources/settings/settings_shared_css.html
index 29de8f36..a6c0645 100644
--- a/chrome/browser/resources/settings/settings_shared_css.html
+++ b/chrome/browser/resources/settings/settings_shared_css.html
@@ -103,13 +103,11 @@
         text-decoration: none;
       }
 
-      /*
-       * There are three main button styles, .primary-button, .secondary-button,
+      /* There are three main button styles, .primary-button, .secondary-button,
        * and .tertiary-button. The primary is the action button (e.g. "edit",
        * "delete") while the secondary is often a "Cancel" button. A tertiary
        * button may be used to get more information or similar, that we expect
-       * most users will not need.
-       */
+       * most users will not need. */
       paper-button.primary-button {
         --paper-button: {
           font-weight: 500;
@@ -178,11 +176,9 @@
         text-align: end;
       }
 
-      /*
-       * A list-frame is an outer container for list-items. It is intended to be
+      /* A list-frame is an outer container for list-items. It is intended to be
        * outside of a settings-box. A list-frame is likely to follow a
-       * settings box.
-       */
+       * settings box. */
       .list-frame {
         -webkit-padding-end: 20px;
         -webkit-padding-start: 56px;
@@ -197,10 +193,8 @@
         @apply(--settings-secondary);
       }
 
-      /*
-       * A list-item is intended to be contained within a list-frame. The list
-       * frame will setup the initial start margin.
-       */
+      /* A list-item is intended to be contained within a list-frame. The list
+       * frame will setup the initial start margin. */
       .list-item {
         align-items: center;
         display: flex;
@@ -247,10 +241,8 @@
         font-weight: 500;
       }
 
-      /*
-       * A settings-box is a horizontal row of text or controls within a
-       * setting section (page or subpage).
-       */
+      /* A settings-box is a horizontal row of text or controls within a
+       * setting section (page or subpage). */
       .settings-box {
         align-items: center;
         border-top: var(--settings-separator-line);
@@ -259,11 +251,9 @@
         padding: 0 20px;
       }
 
-      /*
-       * We use an explicit tag to remove the top border, rather than a
+      /* We use an explicit tag to remove the top border, rather than a
        * :first-of-type modifier. This is a conscious choice, please consult
-       * with dbeam@ or dschuyler@ prior to changing it.
-       */
+       * with dbeam@ or dschuyler@ prior to changing it. */
       .settings-box.first,
       .settings-box.continuation {
         border-top: none;
@@ -273,8 +263,7 @@
         display: block;
       }
 
-      /*
-       * A row with two lines of text. Often the lower line will be .secondary.
+      /* A row with two lines of text. Often the lower line will be .secondary.
        */
       .settings-box.two-line {
         min-height: 56px;
@@ -316,8 +305,7 @@
        *  | Main action area .settings-box    | .secondary-action |
        *  +-------------------------------------------------------+
        *  | Another setting-box without a secondary-action        |
-       *  +-------------------------------------------------------+
-       */
+       *  +-------------------------------------------------------+ */
       .settings-box .secondary-action {
         -webkit-border-start: var(--settings-separator-line);
         -webkit-padding-start: 20px;
diff --git a/chrome/browser/search_engines/search_provider_install_state_impl.cc b/chrome/browser/search_engines/search_provider_install_state_impl.cc
index 3d9a937..f6061cc 100644
--- a/chrome/browser/search_engines/search_provider_install_state_impl.cc
+++ b/chrome/browser/search_engines/search_provider_install_state_impl.cc
@@ -11,7 +11,6 @@
 #include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/browser/search_engines/ui_thread_search_terms_data.h"
 #include "chrome/common/search_provider.mojom.h"
-#include "content/public/browser/owned_interface.h"
 #include "content/public/browser/render_process_host.h"
 #include "services/shell/public/cpp/interface_registry.h"
 #include "url/gurl.h"
@@ -26,6 +25,7 @@
                      GoogleURLTrackerFactory::GetForProfile(profile),
                      content::RenderProcessHost::FromID(render_process_id)),
       is_off_the_record_(profile->IsOffTheRecord()),
+      binding_(this),
       weak_factory_(this) {
   // This is initialized by RenderProcessHostImpl. Do not add any non-trivial
   // initialization here. Instead do it lazily when required.
@@ -36,9 +36,23 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 }
 
-void SearchProviderInstallStateImpl::Bind(
+// static
+void SearchProviderInstallStateImpl::Create(
+    int render_process_id,
+    Profile* profile,
     chrome::mojom::SearchProviderInstallStateRequest request) {
-  binding_set_.AddBinding(this, std::move(request));
+  // BindOnIOThread takes ownership on the impl object:
+  BrowserThread::PostTask(
+      BrowserThread::IO, FROM_HERE,
+      base::Bind(&SearchProviderInstallStateImpl::BindOnIOThread,
+                 base::Unretained(new SearchProviderInstallStateImpl(
+                     render_process_id, profile)),
+                 base::Passed(&request)));
+}
+
+void SearchProviderInstallStateImpl::BindOnIOThread(
+    chrome::mojom::SearchProviderInstallStateRequest request) {
+  binding_.Bind(std::move(request));
 }
 
 chrome::mojom::InstallState
diff --git a/chrome/browser/search_engines/search_provider_install_state_impl.h b/chrome/browser/search_engines/search_provider_install_state_impl.h
index 8cbe51f..389855f 100644
--- a/chrome/browser/search_engines/search_provider_install_state_impl.h
+++ b/chrome/browser/search_engines/search_provider_install_state_impl.h
@@ -11,7 +11,7 @@
 #include "chrome/browser/search_engines/search_provider_install_data.h"
 #include "chrome/common/search_provider.mojom.h"
 #include "content/public/browser/browser_message_filter.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
+#include "mojo/public/cpp/bindings/strong_binding.h"
 
 class GURL;
 class Profile;
@@ -28,9 +28,13 @@
   SearchProviderInstallStateImpl(int render_process_id, Profile* profile);
   ~SearchProviderInstallStateImpl() override;
 
-  void Bind(chrome::mojom::SearchProviderInstallStateRequest request);
+  static void Create(int render_process_id,
+                     Profile* profile,
+                     chrome::mojom::SearchProviderInstallStateRequest request);
 
  private:
+  void BindOnIOThread(chrome::mojom::SearchProviderInstallStateRequest request);
+
   // Figures out the install state for the search provider.
   chrome::mojom::InstallState GetSearchProviderInstallState(
       const GURL& page_location,
@@ -54,7 +58,7 @@
   // thread.
   const bool is_off_the_record_;
 
-  mojo::BindingSet<chrome::mojom::SearchProviderInstallState> binding_set_;
+  mojo::StrongBinding<chrome::mojom::SearchProviderInstallState> binding_;
 
   // Used to schedule invocations of ReplyWithProviderInstallState.
   base::WeakPtrFactory<SearchProviderInstallStateImpl> weak_factory_;
diff --git a/chrome/browser/task_management/task_manager_tester.cc b/chrome/browser/task_management/task_manager_tester.cc
index 627ab684d..5540555 100644
--- a/chrome/browser/task_management/task_manager_tester.cc
+++ b/chrome/browser/task_management/task_manager_tester.cc
@@ -145,11 +145,7 @@
 
   // Returns the TaskManagerTableModel for the the visible NewTaskManagerView.
   static task_management::TaskManagerTableModel* GetRealModel() {
-    // This downcast is safe, as long as the new task manager is enabled.
-    task_management::TaskManagerTableModel* result =
-        static_cast<task_management::TaskManagerTableModel*>(
-            chrome::ShowTaskManager(nullptr));
-    return result;
+    return chrome::ShowTaskManager(nullptr);
   }
 
   task_management::TaskManagerTableModel* model_;
diff --git a/chrome/browser/ui/android/connection_info_popup_android.cc b/chrome/browser/ui/android/connection_info_popup_android.cc
index eab5cd9c..081e50c 100644
--- a/chrome/browser/ui/android/connection_info_popup_android.cc
+++ b/chrome/browser/ui/android/connection_info_popup_android.cc
@@ -7,6 +7,7 @@
 #include "base/android/jni_android.h"
 #include "base/android/jni_array.h"
 #include "base/android/jni_string.h"
+#include "base/stl_util.h"
 #include "chrome/browser/android/resource_mapper.h"
 #include "chrome/browser/infobars/infobar_service.h"
 #include "chrome/browser/profiles/profile.h"
@@ -193,6 +194,9 @@
 void ConnectionInfoPopupAndroid::SetPermissionInfo(
     const PermissionInfoList& permission_info_list,
     const ChosenObjectInfoList& chosen_object_info_list) {
+  STLDeleteContainerPointers(chosen_object_info_list.begin(),
+                             chosen_object_info_list.end());
+
   NOTIMPLEMENTED();
 }
 
diff --git a/chrome/browser/ui/android/website_settings_popup_android.cc b/chrome/browser/ui/android/website_settings_popup_android.cc
index 1e24271..75b5e48 100644
--- a/chrome/browser/ui/android/website_settings_popup_android.cc
+++ b/chrome/browser/ui/android/website_settings_popup_android.cc
@@ -95,6 +95,9 @@
     const ChosenObjectInfoList& chosen_object_info_list) {
   // TODO(reillyg): Display the contents of |chosen_object_info_list|.
   // https://crbug.com/424667.
+  STLDeleteContainerPointers(chosen_object_info_list.begin(),
+                             chosen_object_info_list.end());
+
   JNIEnv* env = base::android::AttachCurrentThread();
 
   // On Android, we only want to display a subset of the available options in a
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc
index 4500e99d..6937aada 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc
@@ -19,7 +19,6 @@
 #include "ash/shell.h"
 #include "ash/test/shelf_test_api.h"
 #include "ash/test/shelf_view_test_api.h"
-#include "ash/test/shell_test_api.h"
 #include "ash/wm/window_state_aura.h"
 #include "ash/wm/window_util.h"
 #include "base/macros.h"
@@ -200,9 +199,7 @@
     return extensions::PlatformAppBrowserTest::RunTestOnMainThreadLoop();
   }
 
-  ash::ShelfModel* shelf_model() {
-    return ash::test::ShellTestApi(ash::Shell::GetInstance()).shelf_model();
-  }
+  ash::ShelfModel* shelf_model() { return ash::WmShell::Get()->shelf_model(); }
 
   ash::ShelfID CreateAppShortcutLauncherItem(const std::string& name) {
     return controller_->CreateAppShortcutLauncherItem(
diff --git a/chrome/browser/ui/browser_dialogs.h b/chrome/browser/ui/browser_dialogs.h
index c510dedd..6545076 100644
--- a/chrome/browser/ui/browser_dialogs.h
+++ b/chrome/browser/ui/browser_dialogs.h
@@ -54,8 +54,11 @@
 class URLRequest;
 }
 
+namespace task_management {
+class TaskManagerTableModel;
+}
+
 namespace ui {
-class TableModel;
 class WebDialogDelegate;
 }
 
@@ -72,7 +75,7 @@
 // Shows or hides the Task Manager. |browser| can be NULL when called from Ash.
 // Returns a pointer to the underlying TableModel, which can be ignored, or used
 // for testing.
-ui::TableModel* ShowTaskManager(Browser* browser);
+task_management::TaskManagerTableModel* ShowTaskManager(Browser* browser);
 void HideTaskManager();
 
 #if !defined(OS_MACOSX)
@@ -132,7 +135,7 @@
                                     bool newly_bookmarked);
 
 // Bridging methods that show/hide the toolkit-views based Task Manager on Mac.
-ui::TableModel* ShowTaskManagerViews(Browser* browser);
+task_management::TaskManagerTableModel* ShowTaskManagerViews(Browser* browser);
 void HideTaskManagerViews();
 
 // Notifies the old task manager with network bytes read events when the Mac
diff --git a/chrome/browser/ui/cocoa/constrained_web_dialog_delegate_mac.mm b/chrome/browser/ui/cocoa/constrained_web_dialog_delegate_mac.mm
index e742f0e..9ef87e6 100644
--- a/chrome/browser/ui/cocoa/constrained_web_dialog_delegate_mac.mm
+++ b/chrome/browser/ui/cocoa/constrained_web_dialog_delegate_mac.mm
@@ -149,11 +149,7 @@
       EnableAutoResize();
   }
   void DocumentOnLoadCompletedInMainFrame() override {
-    if (!IsDialogAutoResizable())
-      return;
-
-    EnableAutoResize();
-    if (GetWebContents())
+    if (IsDialogAutoResizable() && GetWebContents())
       constrained_window_->ShowWebContentsModalDialog();
   }
 
@@ -202,8 +198,10 @@
             this)),
       min_size_(min_size),
       max_size_(max_size) {
-  if (IsDialogAutoResizable())
+  if (IsDialogAutoResizable()) {
     Observe(GetWebContents());
+    EnableAutoResize();
+  }
 
   // Create a window to hold web_contents in the constrained sheet:
   gfx::Size size;
diff --git a/chrome/browser/ui/cocoa/task_manager_mac.mm b/chrome/browser/ui/cocoa/task_manager_mac.mm
index 56dbb618..a8af408 100644
--- a/chrome/browser/ui/cocoa/task_manager_mac.mm
+++ b/chrome/browser/ui/cocoa/task_manager_mac.mm
@@ -597,7 +597,7 @@
 namespace chrome {
 
 // Declared in browser_dialogs.h.
-ui::TableModel* ShowTaskManager(Browser* browser) {
+task_management::TaskManagerTableModel* ShowTaskManager(Browser* browser) {
   if (chrome::ToolkitViewsDialogsEnabled())
     return chrome::ShowTaskManagerViews(browser);
 
diff --git a/chrome/browser/ui/sad_tab.cc b/chrome/browser/ui/sad_tab.cc
index 4689ab9..03c5c4dc 100644
--- a/chrome/browser/ui/sad_tab.cc
+++ b/chrome/browser/ui/sad_tab.cc
@@ -14,7 +14,8 @@
 #if defined(OS_CHROMEOS)
           status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM ||
 #endif
-          status == base::TERMINATION_STATUS_PROCESS_CRASHED);
+          status == base::TERMINATION_STATUS_PROCESS_CRASHED ||
+          status == base::TERMINATION_STATUS_OOM);
 }
 
 }  // namespace chrome
diff --git a/chrome/browser/ui/sad_tab_helper.cc b/chrome/browser/ui/sad_tab_helper.cc
index 4044af7..bc409bc 100644
--- a/chrome/browser/ui/sad_tab_helper.cc
+++ b/chrome/browser/ui/sad_tab_helper.cc
@@ -24,6 +24,8 @@
     case base::TERMINATION_STATUS_PROCESS_WAS_KILLED:
     case base::TERMINATION_STATUS_LAUNCH_FAILED:
       return chrome::SAD_TAB_KIND_KILLED;
+    case base::TERMINATION_STATUS_OOM:
+      return chrome::SAD_TAB_KIND_OOM;
     default:
       return chrome::SAD_TAB_KIND_CRASHED;
   }
diff --git a/chrome/browser/ui/sad_tab_types.h b/chrome/browser/ui/sad_tab_types.h
index 4323295..584ec96 100644
--- a/chrome/browser/ui/sad_tab_types.h
+++ b/chrome/browser/ui/sad_tab_types.h
@@ -10,11 +10,12 @@
 namespace chrome {
 
 enum SadTabKind {
-  SAD_TAB_KIND_CRASHED,  // Tab crashed.
+  SAD_TAB_KIND_CRASHED,        // Tab crashed.
 #if defined(OS_CHROMEOS)
   SAD_TAB_KIND_KILLED_BY_OOM,  // Tab killed by oom killer.
 #endif
-  SAD_TAB_KIND_KILLED  // Tab killed.
+  SAD_TAB_KIND_OOM,            // Tab ran out of memory.
+  SAD_TAB_KIND_KILLED          // Tab killed.
 };
 
 }  // namespace chrome
diff --git a/chrome/browser/ui/tab_contents/tab_contents_iterator_unittest.cc b/chrome/browser/ui/tab_contents/tab_contents_iterator_unittest.cc
index 5012641..7c71a2f0 100644
--- a/chrome/browser/ui/tab_contents/tab_contents_iterator_unittest.cc
+++ b/chrome/browser/ui/tab_contents/tab_contents_iterator_unittest.cc
@@ -195,10 +195,11 @@
   testing_browser_process->SetProfileManager(profile_manager);
 
   chrome::AttemptRestart();
+  EXPECT_TRUE(testing_pref_service.GetBoolean(prefs::kWasRestarted));
+
   // Cancel the effects of us calling chrome::AttemptRestart. Otherwise tests
   // ran after this one will fail.
   browser_shutdown::SetTryingToQuit(false);
 
-  EXPECT_TRUE(testing_pref_service.GetBoolean(prefs::kWasRestarted));
   testing_browser_process->SetLocalState(NULL);
 }
diff --git a/chrome/browser/ui/task_manager/task_manager_table_model.cc b/chrome/browser/ui/task_manager/task_manager_table_model.cc
index 2cf8af1..d921daa 100644
--- a/chrome/browser/ui/task_manager/task_manager_table_model.cc
+++ b/chrome/browser/ui/task_manager/task_manager_table_model.cc
@@ -755,18 +755,8 @@
 
     if (col_visibility) {
       if (sorted_col_id == col_id_key) {
-        if (sort_is_ascending == kColumns[i].initial_sort_is_ascending) {
-          table_view_delegate_->ToggleSortOrder(current_visible_column_index);
-        } else {
-          // Unfortunately the API of ui::TableView doesn't provide a clean way
-          // to sort by a particular column ID and a sort direction. If the
-          // retrieved sort direction is different than the initial one, we have
-          // to toggle the sort order twice!
-          // Note that the function takes the visible_column_index rather than
-          // a column ID.
-          table_view_delegate_->ToggleSortOrder(current_visible_column_index);
-          table_view_delegate_->ToggleSortOrder(current_visible_column_index);
-        }
+        table_view_delegate_->SetSortDescriptor(
+            TableSortDescriptor(col_id, sort_is_ascending));
       }
 
       ++current_visible_column_index;
diff --git a/chrome/browser/ui/task_manager/task_manager_table_model.h b/chrome/browser/ui/task_manager/task_manager_table_model.h
index e726e61..a983c07 100644
--- a/chrome/browser/ui/task_manager/task_manager_table_model.h
+++ b/chrome/browser/ui/task_manager/task_manager_table_model.h
@@ -45,9 +45,8 @@
 
   virtual TableSortDescriptor GetSortDescriptor() const = 0;
 
-  // As the name of |visible_column_index| implies, it must by the index of the
-  // column in the visible columns array.
-  virtual void ToggleSortOrder(int visible_column_index) = 0;
+  virtual void SetSortDescriptor(
+      const TableSortDescriptor& sort_descriptor) = 0;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(TableViewDelegate);
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc
index d3900308..dfac3cc 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc
@@ -354,7 +354,7 @@
 
 void ChromeNativeAppWindowViews::UpdateShape(std::unique_ptr<SkRegion> region) {
   shape_ = std::move(region);
-  widget()->SetShape(shape() ? new SkRegion(*shape()) : nullptr);
+  widget()->SetShape(shape() ? base::MakeUnique<SkRegion>(*shape()) : nullptr);
   widget()->OnSizeConstraintsChanged();
 }
 
diff --git a/chrome/browser/ui/views/browser_dialogs_views.cc b/chrome/browser/ui/views/browser_dialogs_views.cc
index 723ab26b..aa157e1 100644
--- a/chrome/browser/ui/views/browser_dialogs_views.cc
+++ b/chrome/browser/ui/views/browser_dialogs_views.cc
@@ -56,7 +56,7 @@
 
 namespace chrome {
 
-ui::TableModel* ShowTaskManager(Browser* browser) {
+task_management::TaskManagerTableModel* ShowTaskManager(Browser* browser) {
   return task_management::NewTaskManagerView::Show(browser);
 }
 
diff --git a/chrome/browser/ui/views/browser_dialogs_views_mac.cc b/chrome/browser/ui/views/browser_dialogs_views_mac.cc
index 8c169ce..abdbf531 100644
--- a/chrome/browser/ui/views/browser_dialogs_views_mac.cc
+++ b/chrome/browser/ui/views/browser_dialogs_views_mac.cc
@@ -56,7 +56,7 @@
       std::move(delegate), browser->profile(), virtual_url, already_bookmarked);
 }
 
-ui::TableModel* ShowTaskManagerViews(Browser* browser) {
+task_management::TaskManagerTableModel* ShowTaskManagerViews(Browser* browser) {
   // On platforms other than Mac, the new task manager is shown unless
   // explicitly disabled. Assume that running with ToolkitViewsDialogsEnabled()
   // on Mac also means the new task manager is desired.
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view.cc b/chrome/browser/ui/views/intent_picker_bubble_view.cc
index c5f007a5..0d46d81 100644
--- a/chrome/browser/ui/views/intent_picker_bubble_view.cc
+++ b/chrome/browser/ui/views/intent_picker_bubble_view.cc
@@ -4,8 +4,6 @@
 
 #include "chrome/browser/ui/views/intent_picker_bubble_view.h"
 
-#include <algorithm>
-
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/strings/string_piece.h"
@@ -18,16 +16,18 @@
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/canvas.h"
+#include "ui/views/border.h"
 #include "ui/views/controls/button/image_button.h"
+#include "ui/views/controls/scroll_view.h"
+#include "ui/views/controls/scrollbar/overlay_scroll_bar.h"
 #include "ui/views/layout/box_layout.h"
 #include "ui/views/layout/grid_layout.h"
 #include "ui/views/window/dialog_client_view.h"
 
 namespace {
 
-// TODO(djacobo): Add a scroll bar and remove kMaxAppResults.
-// Discriminating app results when the list is longer than |kMaxAppResults|
-constexpr size_t kMaxAppResults = 3;
+// Using |kMaxAppResults| as a measure of how many apps we want to show.
+constexpr size_t kMaxAppResults = arc::ArcNavigationThrottle::kMaxAppResults;
 // Main components sizes
 constexpr int kRowHeight = 40;
 constexpr int kMaxWidth = 320;
@@ -39,7 +39,7 @@
 
 // UI position wrt the Top Container
 constexpr int kTopContainerMerge = 3;
-constexpr int kAppTagNoneSelected = -1;
+constexpr size_t kAppTagNoneSelected = static_cast<size_t>(-1);
 
 // Arbitrary negative values to use as tags on the |always_button_| and
 // |just_once_button_|. These are negative to differentiate from the app's tags
@@ -89,6 +89,18 @@
   widget->Show();
 }
 
+// static
+std::unique_ptr<IntentPickerBubbleView>
+IntentPickerBubbleView::CreateBubbleView(
+    const std::vector<NameAndIcon>& app_info,
+    const ThrottleCallback& throttle_cb,
+    content::WebContents* web_contents) {
+  std::unique_ptr<IntentPickerBubbleView> bubble(
+      new IntentPickerBubbleView(app_info, throttle_cb, web_contents));
+  bubble->Init();
+  return bubble;
+}
+
 void IntentPickerBubbleView::Init() {
   SkColor button_text_color = SkColorSetRGB(0x42, 0x85, 0xf4);
 
@@ -128,6 +140,7 @@
   always_button_->SetTextColor(views::Button::STATE_HOVERED, button_text_color);
   always_button_->SetHorizontalAlignment(gfx::ALIGN_CENTER);
   always_button_->SetState(views::Button::STATE_DISABLED);
+  always_button_->SetBorder(views::Border::CreateEmptyBorder(gfx::Insets(16)));
 
   just_once_button_ = new views::LabelButton(
       this, l10n_util::GetStringUTF16(IDS_INTENT_PICKER_BUBBLE_VIEW_JUST_ONCE));
@@ -142,8 +155,18 @@
   just_once_button_->SetTextColor(views::Button::STATE_HOVERED,
                                   button_text_color);
   just_once_button_->SetHorizontalAlignment(gfx::ALIGN_CENTER);
+  just_once_button_->SetBorder(
+      views::Border::CreateEmptyBorder(gfx::Insets(16)));
 
-  for (size_t i = 0; i < std::min(app_info_.size(), kMaxAppResults); ++i) {
+  header_layout->StartRow(0, 0);
+  AddChildView(header);
+
+  // Creates a view to hold the views for each app.
+  views::View* scrollable_view = new views::View();
+  views::BoxLayout* scrollable_layout =
+      new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0);
+  scrollable_view->SetLayoutManager(scrollable_layout);
+  for (size_t i = 0; i < app_info_.size(); ++i) {
     views::LabelButton* tmp_label = new views::LabelButton(
         this, base::UTF8ToUTF16(base::StringPiece(app_info_[i].first)));
     tmp_label->SetFocusBehavior(View::FocusBehavior::ALWAYS);
@@ -152,23 +175,36 @@
     tmp_label->SetMinSize(gfx::Size(kMaxWidth, kRowHeight));
     tmp_label->SetMaxSize(gfx::Size(kMaxWidth, kRowHeight));
     tmp_label->set_tag(i);
-    const gfx::ImageSkia* icon_ = app_info_[i].second.ToImageSkia();
-    tmp_label->SetImage(views::ImageButton::STATE_NORMAL, *icon_);
-    header_layout->StartRow(0, 0);
-    header_layout->AddView(tmp_label);
+    if (!app_info_[i].second.IsEmpty()) {
+      tmp_label->SetImage(views::ImageButton::STATE_NORMAL,
+                          *app_info_[i].second.ToImageSkia());
+    }
+    tmp_label->SetBorder(views::Border::CreateEmptyBorder(10, 16, 10, 0));
+    scrollable_view->AddChildViewAt(tmp_label, i);
   }
 
-  // Adding the Upper part of the Intent Picker |open_with| label and all the
-  // app options to |this|.
-  header_layout->StartRow(0, 0);
-  header_layout->AddPaddingRow(0, 12);
-  AddChildView(header);
+  scroll_view_ = new views::ScrollView();
+  scroll_view_->SetContents(scrollable_view);
+  // Setting a customized ScrollBar which is shown only when the mouse pointer
+  // is inside the ScrollView.
+  scroll_view_->SetVerticalScrollBar(new views::OverlayScrollBar(false));
+  // This part gives the scroll a fixed width and height. The height depends on
+  // how many app candidates we got and how many we actually want to show.
+  // The added 0.5 on the else block allow us to let the user know there are
+  // more than |kMaxAppResults| apps accessible by scrolling the list.
+  if (app_info_.size() <= kMaxAppResults) {
+    scroll_view_->ClipHeightTo(kRowHeight, app_info_.size() * kRowHeight);
+  } else {
+    scroll_view_->ClipHeightTo(kRowHeight, (kMaxAppResults + 0.5) * kRowHeight);
+  }
+  AddChildView(scroll_view_);
 
   // The lower part of the Picker contains only the 2 buttons
   // |just_once_button_| and |always_button_|.
   View* footer = new View();
+  footer->SetBorder(views::Border::CreateEmptyBorder(24, 0, 12, 12));
   views::BoxLayout* buttons_layout = new views::BoxLayout(
-      views::BoxLayout::kHorizontal, 12, 12, kButtonSeparation);
+      views::BoxLayout::kHorizontal, 0, 0, kButtonSeparation);
   footer->SetLayoutManager(buttons_layout);
 
   buttons_layout->set_main_axis_alignment(
@@ -190,6 +226,7 @@
       selected_app_tag_(kAppTagNoneSelected),
       always_button_(nullptr),
       just_once_button_(nullptr),
+      scroll_view_(nullptr),
       app_info_(app_info) {}
 
 IntentPickerBubbleView::~IntentPickerBubbleView() {
@@ -228,11 +265,15 @@
       GetWidget()->Close();
       break;
     default:
-      // TODO(djacobo): Paint the background of the selected button on a
-      // different color, so the user has a clear remainder of his selection.
+      // The selected app must be a value in the range [0, app_info_.size()-1].
+      DCHECK(static_cast<size_t>(sender->tag()) < app_info_.size());
       // The user cannot click on the |always_button_| or |just_once_button_|
       // unless an explicit app has been selected.
+      if (selected_app_tag_ != kAppTagNoneSelected)
+        SetLabelButtonBackgroundColor(selected_app_tag_, SK_ColorWHITE);
       selected_app_tag_ = sender->tag();
+      SetLabelButtonBackgroundColor(selected_app_tag_,
+                                    SkColorSetRGB(0xeb, 0xeb, 0xeb));
       always_button_->SetState(views::Button::STATE_NORMAL);
       just_once_button_->SetState(views::Button::STATE_NORMAL);
   }
@@ -241,8 +282,15 @@
 gfx::Size IntentPickerBubbleView::GetPreferredSize() const {
   gfx::Size ps;
   ps.set_width(kMaxWidth);
-  ps.set_height((std::min(app_info_.size(), kMaxAppResults)) * kRowHeight +
-                kHeaderHeight + kFooterHeight);
+  int apps_height = app_info_.size();
+  // We are showing |kMaxAppResults| + 0.5 rows at max, the extra 0.5 is used so
+  // the user can notice that more options are available.
+  if (app_info_.size() > kMaxAppResults) {
+    apps_height = (kMaxAppResults + 0.5) * kRowHeight;
+  } else {
+    apps_height *= kRowHeight;
+  }
+  ps.set_height(apps_height + kHeaderHeight + kFooterHeight);
   return ps;
 }
 
@@ -256,3 +304,15 @@
   }
   GetWidget()->Close();
 }
+
+views::LabelButton* IntentPickerBubbleView::GetLabelButtonAt(size_t index) {
+  views::View* temp_contents = scroll_view_->contents();
+  return static_cast<views::LabelButton*>(temp_contents->child_at(index));
+}
+
+void IntentPickerBubbleView::SetLabelButtonBackgroundColor(size_t index,
+                                                           SkColor color) {
+  views::LabelButton* temp_lb = GetLabelButtonAt(index);
+  temp_lb->set_background(views::Background::CreateSolidBackground(color));
+  temp_lb->SchedulePaint();
+}
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view.h b/chrome/browser/ui/views/intent_picker_bubble_view.h
index ae516f2..36c0f475 100644
--- a/chrome/browser/ui/views/intent_picker_bubble_view.h
+++ b/chrome/browser/ui/views/intent_picker_bubble_view.h
@@ -18,10 +18,10 @@
 
 namespace content {
 class NavigationHandle;
+class WebContents;
 }  // namespace content
 
 namespace views {
-class EventMonitor;
 class Label;
 class LabelButton;
 class View;
@@ -60,19 +60,27 @@
   using ThrottleCallback =
       base::Callback<void(size_t, arc::ArcNavigationThrottle::CloseReason)>;
 
+  ~IntentPickerBubbleView() override;
   static void ShowBubble(content::NavigationHandle* handle,
                          const std::vector<NameAndIcon>& app_info,
                          const ThrottleCallback& throttle_cb);
+  static std::unique_ptr<IntentPickerBubbleView> CreateBubbleView(
+      const std::vector<NameAndIcon>& app_info,
+      const ThrottleCallback& throttle_cb,
+      content::WebContents* web_contents);
 
  protected:
   // views::BubbleDialogDelegateView overrides:
   void Init() override;
 
  private:
+  friend class IntentPickerBubbleViewTest;
+  FRIEND_TEST_ALL_PREFIXES(IntentPickerBubbleViewTest, NullIcons);
+  FRIEND_TEST_ALL_PREFIXES(IntentPickerBubbleViewTest, NonNullIcons);
+  FRIEND_TEST_ALL_PREFIXES(IntentPickerBubbleViewTest, LabelsPtrVectorSize);
   IntentPickerBubbleView(const std::vector<NameAndIcon>& app_info,
                          ThrottleCallback throttle_cb,
                          content::WebContents* web_contents);
-  ~IntentPickerBubbleView() override;
 
   // views::BubbleDialogDelegateView overrides:
   void OnWidgetDestroying(views::Widget* widget) override;
@@ -87,6 +95,11 @@
   // content::WebContentsObserver overrides:
   void WebContentsDestroyed() override;
 
+  // Retrieves the LabelButton* contained at position |index| from the internal
+  // ScrollView.
+  views::LabelButton* GetLabelButtonAt(size_t index);
+  void SetLabelButtonBackgroundColor(size_t index, SkColor color);
+
   // Flag set to true iff the callback was Run at some previous step, used to
   // ensure we only use the callback once.
   bool was_callback_run_;
@@ -99,6 +112,7 @@
 
   views::LabelButton* always_button_;
   views::LabelButton* just_once_button_;
+  views::ScrollView* scroll_view_;
 
   std::vector<NameAndIcon> app_info_;
 
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view_unittest.cc b/chrome/browser/ui/views/intent_picker_bubble_view_unittest.cc
new file mode 100644
index 0000000..f53a1cf2
--- /dev/null
+++ b/chrome/browser/ui/views/intent_picker_bubble_view_unittest.cc
@@ -0,0 +1,104 @@
+// 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 "chrome/browser/ui/views/intent_picker_bubble_view.h"
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/callback.h"
+#include "base/macros.h"
+#include "chrome/browser/chromeos/arc/arc_navigation_throttle.h"
+#include "chrome/test/base/browser_with_test_window_test.h"
+#include "content/public/browser/web_contents.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/gfx/image/image.h"
+#include "ui/views/controls/button/button.h"
+#include "ui/views/controls/button/label_button.h"
+#include "ui/views/controls/scroll_view.h"
+#include "ui/views/resources/grit/views_resources.h"
+#include "url/gurl.h"
+
+using NameAndIcon = arc::ArcNavigationThrottle::NameAndIcon;
+using content::WebContents;
+using content::OpenURLParams;
+using content::Referrer;
+
+class IntentPickerBubbleViewTest : public BrowserWithTestWindowTest {
+ public:
+  IntentPickerBubbleViewTest() = default;
+
+  void TearDown() override {
+    // Make sure the bubble is destroyed before the profile to avoid a crash.
+    bubble_.reset();
+
+    BrowserWithTestWindowTest::TearDown();
+  }
+
+ protected:
+  void CreateBubbleView(bool use_icons) {
+    // Pushing a couple of fake apps just to check they are created on the UI.
+    app_info_.emplace_back("dank app 1", gfx::Image());
+    app_info_.emplace_back("dank app 2", gfx::Image());
+
+    if (use_icons)
+      FillAppListWithDummyIcons();
+
+    // We create |web_contents| since the Bubble UI has an Observer that
+    // depends on this, otherwise it wouldn't work.
+    GURL url("http://www.google.com");
+    WebContents* web_contents = browser()->OpenURL(OpenURLParams(
+        url, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
+
+    bubble_ = IntentPickerBubbleView::CreateBubbleView(
+        app_info_, base::Bind(&IntentPickerBubbleViewTest::OnBubbleClosed,
+                              base::Unretained(this)),
+        web_contents);
+  }
+
+  void FillAppListWithDummyIcons() {
+    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
+    gfx::Image dummy_icon = rb.GetImageNamed(IDR_CLOSE);
+    for (auto& app : app_info_)
+      app.second = dummy_icon;
+  }
+
+  // Dummy method to be called upon bubble closing.
+  void OnBubbleClosed(size_t selected_app_tag,
+                      arc::ArcNavigationThrottle::CloseReason close_reason) {}
+
+  std::unique_ptr<IntentPickerBubbleView> bubble_;
+  std::vector<NameAndIcon> app_info_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(IntentPickerBubbleViewTest);
+};
+
+// Verifies that we didn't set up an image for any LabelButton.
+TEST_F(IntentPickerBubbleViewTest, NullIcons) {
+  CreateBubbleView(false);
+  size_t size = bubble_->app_info_.size();
+  for (size_t i = 0; i < size; ++i) {
+    views::LabelButton* app = bubble_->GetLabelButtonAt(i);
+    EXPECT_TRUE(
+        app->GetImage(views::Button::ButtonState::STATE_NORMAL).isNull()) << i;
+  }
+}
+
+// Verifies that all the icons contain a non-null icon.
+TEST_F(IntentPickerBubbleViewTest, NonNullIcons) {
+  CreateBubbleView(true);
+  size_t size = bubble_->app_info_.size();
+  for (size_t i = 0; i < size; ++i) {
+    views::LabelButton* app = bubble_->GetLabelButtonAt(i);
+    EXPECT_FALSE(
+        app->GetImage(views::Button::ButtonState::STATE_NORMAL).isNull()) << i;
+  }
+}
+
+// Verifies that the bubble contains as many rows as the input. Populated the
+// bubble with an arbitrary image in every row.
+TEST_F(IntentPickerBubbleViewTest, LabelsPtrVectorSize) {
+  CreateBubbleView(true);
+  EXPECT_EQ(app_info_.size(), bubble_->app_info_.size());
+}
diff --git a/chrome/browser/ui/views/new_task_manager_view.cc b/chrome/browser/ui/views/new_task_manager_view.cc
index 8d3135bb..618c9aa 100644
--- a/chrome/browser/ui/views/new_task_manager_view.cc
+++ b/chrome/browser/ui/views/new_task_manager_view.cc
@@ -128,8 +128,7 @@
   return tab_table_->is_sorted();
 }
 
-TableSortDescriptor
-NewTaskManagerView::GetSortDescriptor() const {
+TableSortDescriptor NewTaskManagerView::GetSortDescriptor() const {
   if (!IsTableSorted())
     return TableSortDescriptor();
 
@@ -137,8 +136,17 @@
   return TableSortDescriptor(descriptor.column_id, descriptor.ascending);
 }
 
-void NewTaskManagerView::ToggleSortOrder(int visible_column_index) {
-  tab_table_->ToggleSortOrder(visible_column_index);
+void NewTaskManagerView::SetSortDescriptor(
+    const TableSortDescriptor& descriptor) {
+  views::TableView::SortDescriptors descriptor_list;
+
+  // If |sorted_column_id| is the default value, it means to clear the sort.
+  if (descriptor.sorted_column_id != TableSortDescriptor().sorted_column_id) {
+    descriptor_list.emplace_back(descriptor.sorted_column_id,
+                                 descriptor.is_ascending);
+  }
+
+  tab_table_->SetSortDescriptors(descriptor_list);
 }
 
 gfx::Size NewTaskManagerView::GetPreferredSize() const {
diff --git a/chrome/browser/ui/views/new_task_manager_view.h b/chrome/browser/ui/views/new_task_manager_view.h
index ad177e6d..69de62c 100644
--- a/chrome/browser/ui/views/new_task_manager_view.h
+++ b/chrome/browser/ui/views/new_task_manager_view.h
@@ -51,7 +51,7 @@
   void SetColumnVisibility(int column_id, bool new_visibility) override;
   bool IsTableSorted() const override;
   TableSortDescriptor GetSortDescriptor() const override;
-  void ToggleSortOrder(int visible_column_index) override;
+  void SetSortDescriptor(const TableSortDescriptor& descriptor) override;
 
   // views::View:
   gfx::Size GetPreferredSize() const override;
diff --git a/chrome/browser/ui/views/sad_tab_view.cc b/chrome/browser/ui/views/sad_tab_view.cc
index 7b3c647a..593b791f 100644
--- a/chrome/browser/ui/views/sad_tab_view.cc
+++ b/chrome/browser/ui/views/sad_tab_view.cc
@@ -50,30 +50,26 @@
 void RecordKillCreated() {
   static int killed = 0;
   killed++;
-  UMA_HISTOGRAM_CUSTOM_COUNTS(
-      "Tabs.SadTab.KillCreated", killed, 1, 1000, 50);
+  UMA_HISTOGRAM_COUNTS_1000("Tabs.SadTab.KillCreated", killed);
 }
 
 void RecordKillDisplayed() {
   static int killed = 0;
   killed++;
-  UMA_HISTOGRAM_CUSTOM_COUNTS(
-      "Tabs.SadTab.KillDisplayed", killed, 1, 1000, 50);
+  UMA_HISTOGRAM_COUNTS_1000("Tabs.SadTab.KillDisplayed", killed);
 }
 
 #if defined(OS_CHROMEOS)
 void RecordKillCreatedOOM() {
   static int oom_killed = 0;
   oom_killed++;
-  UMA_HISTOGRAM_CUSTOM_COUNTS(
-      "Tabs.SadTab.KillCreated.OOM", oom_killed, 1, 1000, 50);
+  UMA_HISTOGRAM_COUNTS_1000("Tabs.SadTab.KillCreated.OOM", oom_killed);
 }
 
 void RecordKillDisplayedOOM() {
   static int oom_killed = 0;
   oom_killed++;
-  UMA_HISTOGRAM_CUSTOM_COUNTS(
-      "Tabs.SadTab.KillDisplayed.OOM", oom_killed, 1, 1000, 50);
+  UMA_HISTOGRAM_COUNTS_1000("Tabs.SadTab.KillDisplayed.OOM", oom_killed);
 }
 #endif
 
@@ -102,8 +98,7 @@
     case chrome::SAD_TAB_KIND_CRASHED: {
       static int crashed = 0;
       crashed++;
-      UMA_HISTOGRAM_CUSTOM_COUNTS(
-          "Tabs.SadTab.CrashCreated", crashed, 1, 1000, 50);
+      UMA_HISTOGRAM_COUNTS_1000("Tabs.SadTab.CrashCreated", crashed);
       break;
     }
     case chrome::SAD_TAB_KIND_KILLED: {
@@ -112,6 +107,12 @@
                    <<  web_contents->GetURL().GetOrigin().spec();
       break;
     }
+    case chrome::SAD_TAB_KIND_OOM: {
+      static int crashed_due_to_oom = 0;
+      crashed_due_to_oom++;
+      UMA_HISTOGRAM_COUNTS_1000("Tabs.SadTab.OomCreated", crashed_due_to_oom);
+      break;
+    }
 #if defined(OS_CHROMEOS)
     case chrome::SAD_TAB_KIND_KILLED_BY_OOM: {
       RecordKillCreated();
@@ -166,6 +167,8 @@
   if (kind_ == chrome::SAD_TAB_KIND_KILLED_BY_OOM)
     message_id = IDS_KILLED_TAB_BY_OOM_MESSAGE;
 #endif
+  if (kind_ == chrome::SAD_TAB_KIND_OOM)
+    message_id = IDS_SAD_TAB_OOM_MESSAGE;
 
   message_ = CreateLabel(l10n_util::GetStringUTF16(message_id));
 
@@ -248,8 +251,15 @@
     switch (kind_) {
       case chrome::SAD_TAB_KIND_CRASHED: {
         static int crashed = 0;
-        UMA_HISTOGRAM_CUSTOM_COUNTS(
-            "Tabs.SadTab.CrashDisplayed", ++crashed, 1, 1000, 50);
+        crashed++;
+        UMA_HISTOGRAM_COUNTS_1000("Tabs.SadTab.CrashDisplayed", crashed);
+        break;
+      }
+      case chrome::SAD_TAB_KIND_OOM: {
+        static int crashed_due_to_oom = 0;
+        crashed_due_to_oom++;
+        UMA_HISTOGRAM_COUNTS_1000(
+            "Tabs.SadTab.OomDisplayed", crashed_due_to_oom);
         break;
       }
       case chrome::SAD_TAB_KIND_KILLED:
diff --git a/chrome/browser/ui/website_settings/permission_bubble_request.cc b/chrome/browser/ui/website_settings/permission_bubble_request.cc
new file mode 100644
index 0000000..7180ab0
--- /dev/null
+++ b/chrome/browser/ui/website_settings/permission_bubble_request.cc
@@ -0,0 +1,19 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/website_settings/permission_bubble_request.h"
+
+#include "ui/gfx/vector_icons_public.h"
+
+gfx::VectorIconId PermissionBubbleRequest::GetVectorIconId() const {
+  return gfx::VectorIconId::VECTOR_ICON_NONE;
+}
+
+PermissionBubbleType PermissionBubbleRequest::GetPermissionBubbleType() const {
+  return PermissionBubbleType::UNKNOWN;
+}
+
+PermissionBubbleGestureType PermissionBubbleRequest::GetGestureType() const {
+  return PermissionBubbleGestureType::UNKNOWN;
+}
diff --git a/chrome/browser/ui/webui/md_downloads/md_downloads_ui.cc b/chrome/browser/ui/webui/md_downloads/md_downloads_ui.cc
index 8e6d33a..7055c523 100644
--- a/chrome/browser/ui/webui/md_downloads/md_downloads_ui.cc
+++ b/chrome/browser/ui/webui/md_downloads/md_downloads_ui.cc
@@ -116,6 +116,7 @@
   source->AddResourcePath("constants.js", IDR_MD_DOWNLOADS_CONSTANTS_JS);
   source->AddResourcePath("downloads.js", IDR_MD_DOWNLOADS_DOWNLOADS_JS);
   source->AddResourcePath("i18n_setup.html", IDR_MD_DOWNLOADS_I18N_SETUP_HTML);
+  source->AddResourcePath("icons.html", IDR_MD_DOWNLOADS_ICONS_HTML);
   source->AddResourcePath("item.css", IDR_MD_DOWNLOADS_ITEM_CSS);
   source->AddResourcePath("item.html", IDR_MD_DOWNLOADS_ITEM_HTML);
   source->AddResourcePath("item.js", IDR_MD_DOWNLOADS_ITEM_JS);
diff --git a/chrome/browser/ui/webui/md_feedback/md_feedback_ui.cc b/chrome/browser/ui/webui/md_feedback/md_feedback_ui.cc
index f740732..67a56bea 100644
--- a/chrome/browser/ui/webui/md_feedback/md_feedback_ui.cc
+++ b/chrome/browser/ui/webui/md_feedback/md_feedback_ui.cc
@@ -79,6 +79,10 @@
   // General strings.
   html_source->AddLocalizedString("headingText",
                                   IDS_MD_FEEDBACK_HEADING);
+#if defined(GOOGLE_CHROME_BUILD)
+  html_source->AddLocalizedString("privacyNote",
+                                  IDS_MD_FEEDBACK_PRIVACY_NOTE);
+#endif
 
   // Input labels.
   html_source->AddLocalizedString("emailLabel",
@@ -94,6 +98,12 @@
   html_source->AddLocalizedString("sendReportButton",
                                   IDS_MD_FEEDBACK_SEND_REPORT_BUTTON);
 
+  // Checkbox labels.
+  html_source->AddLocalizedString("includeScreenshotLabel",
+                                  IDS_MD_FEEDBACK_SCREENSHOT_LABEL);
+  html_source->AddLocalizedString("sendSystemInfoLabel",
+                                  IDS_MD_FEEDBACK_SEND_SYSTEM_INFO_LABEL);
+
   // Polymer resources.
   html_source->AddResourcePath("feedback_container.html",
         IDR_MD_FEEDBACK_FEEDBACK_CONTAINER_HTML);
diff --git a/chrome/browser/ui/webui/options/startup_page_list_browsertest.js b/chrome/browser/ui/webui/options/startup_page_list_browsertest.js
index 6879507..1df6e28 100644
--- a/chrome/browser/ui/webui/options/startup_page_list_browsertest.js
+++ b/chrome/browser/ui/webui/options/startup_page_list_browsertest.js
@@ -122,8 +122,8 @@
   return event;
 }
 
-// Disable if flaky again (crbug.com/419370)
-TEST_F('StartupPageListWebUITest', 'testDropFromOutsideSource',
+// Disabled due to: crbug.com/419370
+TEST_F('StartupPageListWebUITest', 'DISABLED_testDropFromOutsideSource',
        function() {
   /** @const */ var NEW_PAGE = 'http://google.com';
 
@@ -137,8 +137,8 @@
   expectTrue(mockDropEvent.defaultPrevented);
 });
 
-// Disable if flaky again (crbug.com/419370)
-TEST_F('StartupPageListWebUITest', 'testDropToReorder', function() {
+// Disabled due to: crbug.com/419370
+TEST_F('StartupPageListWebUITest', 'DISABLED_testDropToReorder', function() {
   // TODO(dbeam): mock4js doesn't handle complex arguments well. Fix this.
   this.mockHandler.expects(once()).dragDropStartupPage([0, [1].join()]);
 
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index ac960038..831acd3 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1575,6 +1575,8 @@
       'browser/background/background_mode_manager_chromeos.cc',
       'browser/background/background_mode_manager_mac.mm',
       'browser/background/background_mode_manager_win.cc',
+      'browser/background/background_mode_optimizer.cc',
+      'browser/background/background_mode_optimizer.h',
       'browser/background/background_trigger.h',
     ],
     'chrome_browser_bookmark_sources': [
diff --git a/chrome/chrome_common.gypi b/chrome/chrome_common.gypi
index fddaa7b5..8b2915e 100644
--- a/chrome/chrome_common.gypi
+++ b/chrome/chrome_common.gypi
@@ -369,6 +369,7 @@
           'dependencies': [
             '<(DEPTH)/device/usb/usb.gyp:device_usb',
             '<(DEPTH)/chrome/common/extensions/api/api.gyp:chrome_api',
+            '<(DEPTH)/chrome/common/extensions/api/api.gyp:extensions_features',
             '<(DEPTH)/extensions/common/api/api.gyp:extensions_api',
             '<(DEPTH)/extensions/extensions.gyp:extensions_common',
             '<(DEPTH)/extensions/extensions_resources.gyp:extensions_resources',
diff --git a/chrome/chrome_gpu.gypi b/chrome/chrome_gpu.gypi
index 3d153e3..c4e8a86 100644
--- a/chrome/chrome_gpu.gypi
+++ b/chrome/chrome_gpu.gypi
@@ -19,6 +19,7 @@
       'dependencies': [
         '../content/content.gyp:content_common',
         '../content/content.gyp:content_gpu',
+        '../media/media.gyp:media_gpu',
       ],
       'conditions': [
         ['chromeos==1', {
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index 3d93bbbf..ae59772 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -2663,6 +2663,10 @@
             # TODO(dbeam): log webui URLs on iOS and test them.
             'browser/ui/webui/log_web_ui_url_browsertest.cc',
           ],
+        }, { # else: OS != "ios"
+          'dependencies': [
+            '../mojo/mojo_base.gyp:mojo_common_lib',
+          ],
         }],
         ['enable_app_list==1', {
           'sources': [ '<@(chrome_browser_tests_app_list_sources)' ],
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index 0a9addc..5ceb90a 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -394,6 +394,7 @@
       'browser/background/background_application_list_model_unittest.cc',
       'browser/background/background_contents_service_unittest.cc',
       'browser/background/background_mode_manager_unittest.cc',
+      'browser/background/background_mode_optimizer_unittest.cc',
     ],
     'chrome_unit_tests_extensions_sources': [
       '../apps/saved_files_service_unittest.cc',
@@ -1032,6 +1033,7 @@
       'browser/chromeos/fileapi/external_file_url_util_unittest.cc',
       'browser/chromeos/fileapi/file_access_permissions_unittest.cc',
       'browser/chromeos/fileapi/file_system_backend_unittest.cc',
+      'browser/chromeos/hats/hats_notification_controller_unittest.cc',
       'browser/chromeos/input_method/browser_state_monitor_unittest.cc',
       'browser/chromeos/input_method/input_method_configuration_unittest.cc',
       'browser/chromeos/input_method/input_method_engine_unittest.cc',
@@ -1654,6 +1656,7 @@
     'chrome_unit_tests_arc_sources': [
       'browser/chromeos/arc/arc_auth_service_unittest.cc',
       'browser/chromeos/arc/arc_policy_bridge_unittest.cc',
+      'browser/ui/views/intent_picker_bubble_view_unittest.cc',
     ],
     # Sources for Offline pages. For now only for Android.
     'chrome_unit_tests_offline_pages_sources': [
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index 41269036..0b46d2f 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -165,6 +165,7 @@
                            "//chrome")
     public_deps += [
       "//chrome/common/extensions/api",
+      "//chrome/common/extensions/api:extensions_features",
       "//device/usb",
       "//extensions:extensions_resources",
       "//extensions/common",
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index f90959f..ddaa9e5 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -20,6 +20,14 @@
                                             base::FEATURE_DISABLED_BY_DEFAULT};
 #endif  // defined(OS_WIN) || defined(OS_MACOSX)
 
+#if defined(OS_WIN) || defined(OS_LINUX)
+// Enables the Restart background mode optimization. When all Chrome UI is
+// closed and it goes in the background, allows to restart the browser to
+// discard memory.
+const base::Feature kBackgroundModeAllowRestart{
+    "BackgroundModeAllowRestart", base::FEATURE_DISABLED_BY_DEFAULT};
+#endif  // defined(OS_WIN) || defined(OS_LINUX)
+
 // Experiment to disable small cross-origin content. (http://crbug.com/608886)
 const base::Feature kBlockSmallContent{"BlockSmallPluginContent",
                                        base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 3b668b4..8acd297 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -23,6 +23,10 @@
 extern const base::Feature kAutomaticTabDiscarding;
 #endif  // defined(OS_WIN) || defined(OS_MACOSX)
 
+#if defined(OS_WIN) || defined(OS_LINUX)
+extern const base::Feature kBackgroundModeAllowRestart;
+#endif  // defined(OS_WIN) || defined(OS_LINUX)
+
 extern const base::Feature kBlockSmallContent;
 
 extern const base::Feature kBrowserHangFixesExperiment;
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index 4940149a..216674d7 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -103,13 +103,17 @@
 // Certificate Transparency: Uses the provided log(s) for checking Signed
 // Certificate Timestamps provided with certificates.
 // The switch's value is:
-//   log_description:log_key:log_url,log_description:log_key:log_url,...
+//   log_description:log_key:log_url[:log_dns_domain],
+//   log_description:log_key:log_url[:log_dns_domain],...
 // where
 //   log_description is a textual description of the log.
 //   log_key is a Base64'd DER-encoded SubjectPublicKeyInfo of the log's
 //   public key.
 //   log_url is a URL for the log, excluding the schema (which is always
 //   assumed to be HTTPS as required by RFC6962).
+//   log_dns_domain is the domain name to use for DNS queries requesting
+//   inclusion proofs (as per
+//   https://github.com/google/certificate-transparency-rfcs/blob/master/dns/draft-ct-over-dns.md).
 // Multiple logs can be specified by repeating description:key pairs,
 // separated by a comma.
 const char kCertificateTransparencyLog[]    = "certificate-transparency-log";
diff --git a/chrome/common/common_resources.grd b/chrome/common/common_resources.grd
index cca511cd..22f08bbb 100644
--- a/chrome/common/common_resources.grd
+++ b/chrome/common/common_resources.grd
@@ -9,8 +9,6 @@
   <release seq="1">
     <includes>
       <include name="IDR_CHROME_EXTENSION_API_FEATURES" file="extensions\api\_api_features.json" type="BINDATA" />
-      <include name="IDR_CHROME_EXTENSION_MANIFEST_FEATURES" file="extensions\api\_manifest_features.json" type="BINDATA" />
-      <include name="IDR_CHROME_EXTENSION_PERMISSION_FEATURES" file="extensions\api\_permission_features.json" type="BINDATA" />
       <if expr="is_macosx">
         <include name="IDR_NACL_SANDBOX_PROFILE" file="nacl_loader.sb" type="BINDATA" />
       </if>
diff --git a/chrome/common/extensions/api/BUILD.gn b/chrome/common/extensions/api/BUILD.gn
index 38da9c9..307cb59 100644
--- a/chrome/common/extensions/api/BUILD.gn
+++ b/chrome/common/extensions/api/BUILD.gn
@@ -1,14 +1,16 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
+# 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.
 
 import("//build/json_schema_api.gni")
+import("//tools/json_schema_compiler/json_features.gni")
 import("schemas.gni")
 
 assert(enable_extensions)
 
 # GYP version: chrome/common/extensions/api/api.gyp:chrome_api
 json_schema_api("api") {
+  sources = schema_sources
   schemas = true
   bundle = true
   configs = [ "//build/config:precompiled_headers" ]
@@ -19,6 +21,7 @@
 
 # GYP version: chrome/browser/extensions/api/api.gyp:chrome_api_registration
 json_schema_api("api_registration") {
+  sources = schema_sources
   impl_dir = "//chrome/browser/extensions/api"
   bundle_registration = true
   configs = [ "//build/config:precompiled_headers" ]
@@ -43,3 +46,47 @@
   }
   deps += schema_dependencies
 }
+
+json_features("api_features") {
+  feature_class = "APIFeature"
+  provider_class = "APIFeatureProvider"
+  sources = [
+    "../../../../extensions/common/api/_api_features.json",
+    "_api_features.json",
+  ]
+}
+
+json_features("permission_features") {
+  feature_class = "PermissionFeature"
+  provider_class = "PermissionFeatureProvider"
+  sources = [
+    "../../../../extensions/common/api/_permission_features.json",
+    "_permission_features.json",
+  ]
+}
+
+json_features("manifest_features") {
+  feature_class = "ManifestFeature"
+  provider_class = "ManifestFeatureProvider"
+  sources = [
+    "../../../../extensions/common/api/_manifest_features.json",
+    "_manifest_features.json",
+  ]
+}
+
+json_features("behavior_features") {
+  feature_class = "BehaviorFeature"
+  provider_class = "BehaviorFeatureProvider"
+  sources = [
+    "../../../../extensions/common/api/_behavior_features.json",
+  ]
+}
+
+group("extensions_features") {
+  public_deps = [
+    ":api_features",
+    ":behavior_features",
+    ":manifest_features",
+    ":permission_features",
+  ]
+}
diff --git a/chrome/common/extensions/api/_manifest_features.json b/chrome/common/extensions/api/_manifest_features.json
index f18df29..3b9d2f9 100644
--- a/chrome/common/extensions/api/_manifest_features.json
+++ b/chrome/common/extensions/api/_manifest_features.json
@@ -93,8 +93,7 @@
     "channel": "stable",
     "extension_types": [
       "extension", "legacy_packaged_app", "hosted_app"
-    ],
-    "no_doc": true
+    ]
   },
   "event_rules": {
     "channel": "stable",
diff --git a/chrome/common/extensions/api/_permission_features.json b/chrome/common/extensions/api/_permission_features.json
index 53819946..ac89fe8 100644
--- a/chrome/common/extensions/api/_permission_features.json
+++ b/chrome/common/extensions/api/_permission_features.json
@@ -353,7 +353,8 @@
   },
   "fileSystem": [{
     "channel": "stable",
-    "extension_types": ["platform_app"]
+    "extension_types": ["platform_app"],
+    "default_parent": true
   },{
     "channel": "stable",
     "extension_types": ["extension"],
@@ -366,14 +367,14 @@
       "3F65507A3B39259B38C8173C6FFA3D12DF64CCE9"   // http://crbug.com/371562
     ]
   }],
-  "fileSystem.directory": [{
+  "fileSystem.directory": {
     "channel": "stable",
     "extension_types": ["platform_app"]
-  }],
-  "fileSystem.retainEntries": [{
+  },
+  "fileSystem.retainEntries": {
     "channel": "stable",
     "extension_types": ["platform_app"]
-  }],
+  },
   "fileSystem.write": [{
     "channel": "stable",
     "extension_types": ["platform_app"]
@@ -463,14 +464,10 @@
   "input": [{
     "channel": "stable",
     "extension_types": ["extension", "legacy_packaged_app"],
-    // TODO(kalman): Um what does this inply?
-    "inplies_full_url_access": true,
     "platforms": ["chromeos"]
   }, {
     "channel": "dev",
     "extension_types": ["extension", "legacy_packaged_app"],
-    // TODO(kalman): Um what does this inply?
-    "inplies_full_url_access": true,
     "platforms": ["win", "linux"]
   }],
   "inputMethodPrivate": [{
@@ -495,7 +492,7 @@
   "launcherSearchProvider": {
     "channel": "stable",
     "extension_types": ["extension", "platform_app"],
-    "platform": ["chromeos"],
+    "platforms": ["chromeos"],
     "whitelist": [
       "A948368FC53BE437A55FEB414106E207925482F5"  // File Manager
     ]
diff --git a/chrome/common/extensions/api/api.gyp b/chrome/common/extensions/api/api.gyp
index da226f7..1f752f70 100644
--- a/chrome/common/extensions/api/api.gyp
+++ b/chrome/common/extensions/api/api.gyp
@@ -22,5 +22,87 @@
         '<@(schema_dependencies)',
       ],
     },
+    {
+      # GN version: //chrome/common/extensions/api:extensions_features:api_features
+      'target_name': 'api_features',
+      'type': 'static_library',
+      'variables': {
+        'feature_class': 'APIFeature',
+        'provider_class': 'APIFeatureProvider',
+        'out_dir': 'chrome/common/extensions/api',
+        'out_base_filename': 'api_features',
+        'in_files': [
+          'chrome/common/extensions/api/_api_features.json',
+          'extensions/common/api/_api_features.json',
+        ],
+      },
+      'inputs': ['<@(in_files)'],
+      'sources': ['<@(in_files)'],
+      'includes': ['../../../../tools/json_schema_compiler/json_features.gypi'],
+    },
+    {
+      # GN version: //chrome/common/extensions/api:extensions_features:behavior_features
+      'target_name': 'behavior_features',
+      'type': 'static_library',
+      'variables': {
+        'feature_class': 'BehaviorFeature',
+        'provider_class': 'BehaviorFeatureProvider',
+        'out_dir': 'chrome/common/extensions/api',
+        'out_base_filename': 'behavior_features',
+        'in_files': [
+          'extensions/common/api/_behavior_features.json',
+        ],
+      },
+      'inputs': ['<@(in_files)'],
+      'sources': ['<@(in_files)'],
+      'includes': ['../../../../tools/json_schema_compiler/json_features.gypi'],
+    },
+    {
+      # GN version: //chrome/common/extensions/api:extensions_features:manifest_features
+      'target_name': 'manifest_features',
+      'type': 'static_library',
+      'variables': {
+        'feature_class': 'ManifestFeature',
+        'provider_class': 'ManifestFeatureProvider',
+        'out_dir': 'chrome/common/extensions/api',
+        'out_base_filename': 'manifest_features',
+        'in_files': [
+          'chrome/common/extensions/api/_manifest_features.json',
+          'extensions/common/api/_manifest_features.json',
+        ],
+      },
+      'inputs': ['<@(in_files)'],
+      'sources': ['<@(in_files)'],
+      'includes': ['../../../../tools/json_schema_compiler/json_features.gypi'],
+    },
+    {
+      # GN version: //chrome/common/extensions/api:extensions_features:permission_features
+      'target_name': 'permission_features',
+      'type': 'static_library',
+      'variables': {
+        'feature_class': 'PermissionFeature',
+        'provider_class': 'PermissionFeatureProvider',
+        'out_dir': 'chrome/common/extensions/api',
+        'out_base_filename': 'permission_features',
+        'in_files': [
+          'chrome/common/extensions/api/_permission_features.json',
+          'extensions/common/api/_permission_features.json',
+        ],
+      },
+      'inputs': ['<@(in_files)'],
+      'sources': ['<@(in_files)'],
+      'includes': ['../../../../tools/json_schema_compiler/json_features.gypi'],
+    },
+    {
+      # GN version: //chrome/common/extensions/api:extensions_features
+      'target_name': 'extensions_features',
+      'type': 'none',
+      'dependencies': [
+        'api_features',
+        'behavior_features',
+        'manifest_features',
+        'permission_features',
+      ],
+    },
   ],
 }
diff --git a/chrome/common/extensions/api/schemas.gni b/chrome/common/extensions/api/schemas.gni
index 0ffc46ac..debdbfe 100644
--- a/chrome/common/extensions/api/schemas.gni
+++ b/chrome/common/extensions/api/schemas.gni
@@ -13,23 +13,23 @@
                           [ "schemas.gypi" ])
 
 # Common sources that are both bundled and compiled.
-sources = gypi_values.main_schema_files
+schema_sources = gypi_values.main_schema_files
 if (enable_task_manager) {
-  sources += gypi_values.task_manager_dependent_schema_files
+  schema_sources += gypi_values.task_manager_dependent_schema_files
 }
 if (is_chromeos) {
-  sources += gypi_values.chromeos_schema_files
+  schema_sources += gypi_values.chromeos_schema_files
 } else if (is_linux || is_win) {
-  sources += gypi_values.input_ime_schema_file
+  schema_sources += gypi_values.input_ime_schema_file
 }
 if (enable_service_discovery) {
-  sources += gypi_values.service_discovery_schema_files
+  schema_sources += gypi_values.service_discovery_schema_files
 }
 if (enable_webrtc) {
-  sources += gypi_values.webrtc_schema_files
+  schema_sources += gypi_values.webrtc_schema_files
 }
 if (enable_app_list) {
-  sources += gypi_values.app_list_schema_files
+  schema_sources += gypi_values.app_list_schema_files
 }
 
 uncompiled_sources = gypi_values.main_non_compiled_schema_files
diff --git a/chrome/common/extensions/chrome_extensions_client.cc b/chrome/common/extensions/chrome_extensions_client.cc
index 4f85c1f..cba890a5 100644
--- a/chrome/common/extensions/chrome_extensions_client.cc
+++ b/chrome/common/extensions/chrome_extensions_client.cc
@@ -12,8 +12,12 @@
 #include "base/strings/string_util.h"
 #include "base/values.h"
 #include "chrome/common/chrome_switches.h"
+#include "chrome/common/extensions/api/api_features.h"
+#include "chrome/common/extensions/api/behavior_features.h"
 #include "chrome/common/extensions/api/extension_action/action_info.h"
 #include "chrome/common/extensions/api/generated_schemas.h"
+#include "chrome/common/extensions/api/manifest_features.h"
+#include "chrome/common/extensions/api/permission_features.h"
 #include "chrome/common/extensions/chrome_manifest_handlers.h"
 #include "chrome/common/extensions/extension_constants.h"
 #include "chrome/common/extensions/manifest_handlers/theme_handler.h"
@@ -140,20 +144,14 @@
 std::unique_ptr<FeatureProvider> ChromeExtensionsClient::CreateFeatureProvider(
     const std::string& name) const {
   std::unique_ptr<FeatureProvider> provider;
-  std::unique_ptr<JSONFeatureProviderSource> source(
-      CreateFeatureProviderSource(name));
   if (name == "api") {
-    provider.reset(new JSONFeatureProvider(source->dictionary(),
-                                           CreateFeature<APIFeature>));
+    provider.reset(new APIFeatureProvider());
   } else if (name == "manifest") {
-    provider.reset(new JSONFeatureProvider(source->dictionary(),
-                                           CreateFeature<ManifestFeature>));
+    provider.reset(new ManifestFeatureProvider());
   } else if (name == "permission") {
-    provider.reset(new JSONFeatureProvider(source->dictionary(),
-                                           CreateFeature<PermissionFeature>));
+    provider.reset(new PermissionFeatureProvider());
   } else if (name == "behavior") {
-    provider.reset(new JSONFeatureProvider(source->dictionary(),
-                                           CreateFeature<BehaviorFeature>));
+    provider.reset(new BehaviorFeatureProvider());
   } else {
     NOTREACHED();
   }
@@ -161,25 +159,11 @@
 }
 
 std::unique_ptr<JSONFeatureProviderSource>
-ChromeExtensionsClient::CreateFeatureProviderSource(
-    const std::string& name) const {
+ChromeExtensionsClient::CreateAPIFeatureSource() const {
   std::unique_ptr<JSONFeatureProviderSource> source(
-      new JSONFeatureProviderSource(name));
-  if (name == "api") {
-    source->LoadJSON(IDR_EXTENSION_API_FEATURES);
-    source->LoadJSON(IDR_CHROME_EXTENSION_API_FEATURES);
-  } else if (name == "manifest") {
-    source->LoadJSON(IDR_EXTENSION_MANIFEST_FEATURES);
-    source->LoadJSON(IDR_CHROME_EXTENSION_MANIFEST_FEATURES);
-  } else if (name == "permission") {
-    source->LoadJSON(IDR_EXTENSION_PERMISSION_FEATURES);
-    source->LoadJSON(IDR_CHROME_EXTENSION_PERMISSION_FEATURES);
-  } else if (name == "behavior") {
-    source->LoadJSON(IDR_EXTENSION_BEHAVIOR_FEATURES);
-  } else {
-    NOTREACHED();
-    source.reset();
-  }
+      new JSONFeatureProviderSource("api"));
+  source->LoadJSON(IDR_EXTENSION_API_FEATURES);
+  source->LoadJSON(IDR_CHROME_EXTENSION_API_FEATURES);
   return source;
 }
 
diff --git a/chrome/common/extensions/chrome_extensions_client.h b/chrome/common/extensions/chrome_extensions_client.h
index ad4b2b8c..ec257f7 100644
--- a/chrome/common/extensions/chrome_extensions_client.h
+++ b/chrome/common/extensions/chrome_extensions_client.h
@@ -31,8 +31,8 @@
   const std::string GetProductName() override;
   std::unique_ptr<FeatureProvider> CreateFeatureProvider(
       const std::string& name) const override;
-  std::unique_ptr<JSONFeatureProviderSource> CreateFeatureProviderSource(
-      const std::string& name) const override;
+  std::unique_ptr<JSONFeatureProviderSource> CreateAPIFeatureSource()
+      const override;
   void FilterHostPermissions(const URLPatternSet& hosts,
                              URLPatternSet* new_hosts,
                              PermissionIDSet* permissions) const override;
diff --git a/chrome/common/extensions/manifest_tests/extension_manifests_platformapp_unittest.cc b/chrome/common/extensions/manifest_tests/extension_manifests_platformapp_unittest.cc
index 328f4dfa..a3cdc4e 100644
--- a/chrome/common/extensions/manifest_tests/extension_manifests_platformapp_unittest.cc
+++ b/chrome/common/extensions/manifest_tests/extension_manifests_platformapp_unittest.cc
@@ -49,21 +49,22 @@
   RunTestcases(error_testcases, arraysize(error_testcases), EXPECT_TYPE_ERROR);
 
   Testcase warning_testcases[] = {
-    Testcase(
-        "init_invalid_platform_app_1.json",
-        "'app.launch' is only allowed for hosted apps and legacy packaged "
-            "apps, but this is a packaged app."),
-    Testcase(
-        "init_invalid_platform_app_4.json",
-        "'background' is only allowed for extensions, hosted apps, and legacy "
-            "packaged apps, but this is a packaged app."),
-    Testcase(
-        "init_invalid_platform_app_5.json",
-        "'background' is only allowed for extensions, hosted apps, and legacy "
-            "packaged apps, but this is a packaged app."),
-    Testcase("incognito_invalid_platform_app.json",
-        "'incognito' is only allowed for extensions and legacy packaged apps, "
-            "but this is a packaged app."),
+      Testcase(
+          "init_invalid_platform_app_1.json",
+          "'app.launch' is only allowed for legacy packaged apps and hosted "
+          "apps, but this is a packaged app."),
+      Testcase("init_invalid_platform_app_4.json",
+               "'background' is only allowed for extensions, legacy packaged "
+               "apps, and"
+               " hosted apps, but this is a packaged app."),
+      Testcase("init_invalid_platform_app_5.json",
+               "'background' is only allowed for extensions, legacy packaged "
+               "apps, and"
+               " hosted apps, but this is a packaged app."),
+      Testcase("incognito_invalid_platform_app.json",
+               "'incognito' is only allowed for extensions and legacy packaged "
+               "apps, "
+               "but this is a packaged app."),
   };
   RunTestcases(
       warning_testcases, arraysize(warning_testcases), EXPECT_TYPE_WARNING);
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index d85b232..ad612d3 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -20,6 +20,8 @@
 const char kArcBackupRestoreEnabled[] = "arc.backup_restore.enabled";
 // A preference to keep Android apps enabled state.
 const char kArcEnabled[] = "arc.enabled";
+// A preference to keep user's consent to use location service.
+const char kArcLocationServiceEnabled[] = "arc.location_service.enabled";
 // A preference to keep list of Android packages and their infomation.
 const char kArcPackages[] = "arc.packages";
 // A preference to keep deferred requests of setting notifications enabled flag.
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index e63e0d5..d8a3a8e4 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -19,6 +19,7 @@
 extern const char kArcApps[];
 extern const char kArcBackupRestoreEnabled[];
 extern const char kArcEnabled[];
+extern const char kArcLocationServiceEnabled[];
 extern const char kArcPackages[];
 extern const char kArcSetNotificationsEnabledDeferred[];
 extern const char kArcSignedIn[];
@@ -788,6 +789,10 @@
 
 extern const char kRegisteredSupervisedUserWhitelists[];
 
+#if BUILDFLAG(ENABLE_BACKGROUND)
+extern const char kRestartInBackground[];
+#endif
+
 #if defined(ENABLE_EXTENSIONS)
 extern const char kAnimationPolicy[];
 #endif
diff --git a/chrome/gpu/BUILD.gn b/chrome/gpu/BUILD.gn
index 384b4186..8dad8d9 100644
--- a/chrome/gpu/BUILD.gn
+++ b/chrome/gpu/BUILD.gn
@@ -6,6 +6,9 @@
   deps = [
     "//content/public/common",
     "//content/public/gpu",
+    "//gpu/command_buffer/service",
+    "//media",
+    "//media/gpu",
   ]
 
   sources = [
diff --git a/chrome/gpu/DEPS b/chrome/gpu/DEPS
index e6b56f1..6f14b3c 100644
--- a/chrome/gpu/DEPS
+++ b/chrome/gpu/DEPS
@@ -3,6 +3,7 @@
   "+content/public/gpu",
   "+media/video",
   "+media/base/video_frame.h",
+  "+media/gpu",
   "+mojo/edk/embedder",
   "+services/shell/public/cpp",
 ]
diff --git a/chrome/gpu/arc_gpu_video_decode_accelerator.cc b/chrome/gpu/arc_gpu_video_decode_accelerator.cc
index d86aa67..27adb0d 100644
--- a/chrome/gpu/arc_gpu_video_decode_accelerator.cc
+++ b/chrome/gpu/arc_gpu_video_decode_accelerator.cc
@@ -8,8 +8,8 @@
 #include "base/logging.h"
 #include "base/numerics/safe_math.h"
 #include "base/run_loop.h"
-#include "content/public/gpu/gpu_video_decode_accelerator_factory.h"
 #include "media/base/video_frame.h"
+#include "media/gpu/gpu_video_decode_accelerator_factory_impl.h"
 
 namespace chromeos {
 namespace arc {
@@ -51,11 +51,13 @@
 
 ArcGpuVideoDecodeAccelerator::OutputBufferInfo::~OutputBufferInfo() = default;
 
-ArcGpuVideoDecodeAccelerator::ArcGpuVideoDecodeAccelerator()
+ArcGpuVideoDecodeAccelerator::ArcGpuVideoDecodeAccelerator(
+    const gpu::GpuPreferences& gpu_preferences)
     : arc_client_(nullptr),
       next_bitstream_buffer_id_(0),
       output_pixel_format_(media::PIXEL_FORMAT_UNKNOWN),
-      output_buffer_size_(0) {}
+      output_buffer_size_(0),
+      gpu_preferences_(gpu_preferences) {}
 
 ArcGpuVideoDecodeAccelerator::~ArcGpuVideoDecodeAccelerator() {
   DCHECK(thread_checker_.CalledOnValidThread());
@@ -109,9 +111,10 @@
   vda_config.output_mode =
       media::VideoDecodeAccelerator::Config::OutputMode::IMPORT;
 
-  std::unique_ptr<content::GpuVideoDecodeAcceleratorFactory> vda_factory =
-      content::GpuVideoDecodeAcceleratorFactory::CreateWithNoGL();
-  vda_ = vda_factory->CreateVDA(this, vda_config);
+  auto vda_factory =
+      media::GpuVideoDecodeAcceleratorFactoryImpl::CreateWithNoGL();
+  vda_ = vda_factory->CreateVDA(
+      this, vda_config, gpu::GpuDriverBugWorkarounds(), gpu_preferences_);
   if (!vda_) {
     DLOG(ERROR) << "Failed to create VDA.";
     return PLATFORM_FAILURE;
diff --git a/chrome/gpu/arc_gpu_video_decode_accelerator.h b/chrome/gpu/arc_gpu_video_decode_accelerator.h
index 57dd2ea..1b24e13 100644
--- a/chrome/gpu/arc_gpu_video_decode_accelerator.h
+++ b/chrome/gpu/arc_gpu_video_decode_accelerator.h
@@ -28,7 +28,8 @@
       public media::VideoDecodeAccelerator::Client,
       public base::SupportsWeakPtr<ArcGpuVideoDecodeAccelerator> {
  public:
-  ArcGpuVideoDecodeAccelerator();
+  explicit ArcGpuVideoDecodeAccelerator(
+      const gpu::GpuPreferences& gpu_preferences);
   ~ArcGpuVideoDecodeAccelerator() override;
 
   // Implementation of the ArcVideoAccelerator interface.
diff --git a/chrome/gpu/chrome_content_gpu_client.cc b/chrome/gpu/chrome_content_gpu_client.cc
index 870ce620..6d30035 100644
--- a/chrome/gpu/chrome_content_gpu_client.cc
+++ b/chrome/gpu/chrome_content_gpu_client.cc
@@ -15,22 +15,24 @@
 namespace {
 
 void DeprecatedCreateGpuArcVideoService(
+    const gpu::GpuPreferences& gpu_preferences,
     ::arc::mojom::VideoAcceleratorServiceClientRequest request) {
   // GpuArcVideoService is strongly bound to the Mojo message pipe it
   // is connected to. When that message pipe is closed, either explicitly on the
   // other end (in the browser process), or by a connection error, this object
   // will be destroyed.
-  auto* service = new chromeos::arc::GpuArcVideoService();
+  auto* service = new chromeos::arc::GpuArcVideoService(gpu_preferences);
   service->Connect(std::move(request));
 }
 
 void CreateGpuArcVideoService(
+    const gpu::GpuPreferences& gpu_preferences,
     ::arc::mojom::VideoAcceleratorServiceRequest request) {
   // GpuArcVideoService is strongly bound to the Mojo message pipe it
   // is connected to. When that message pipe is closed, either explicitly on the
   // other end (in the browser process), or by a connection error, this object
   // will be destroyed.
-  new chromeos::arc::GpuArcVideoService(std::move(request));
+  new chromeos::arc::GpuArcVideoService(std::move(request), gpu_preferences);
 }
 
 }  // namespace
@@ -41,10 +43,13 @@
 ChromeContentGpuClient::~ChromeContentGpuClient() {}
 
 void ChromeContentGpuClient::ExposeInterfacesToBrowser(
-    shell::InterfaceRegistry* registry) {
+    shell::InterfaceRegistry* registry,
+    const gpu::GpuPreferences& gpu_preferences) {
 #if defined(OS_CHROMEOS)
-  registry->AddInterface(base::Bind(&CreateGpuArcVideoService));
-  registry->AddInterface(base::Bind(&DeprecatedCreateGpuArcVideoService));
+  registry->AddInterface(
+      base::Bind(&CreateGpuArcVideoService, gpu_preferences));
+  registry->AddInterface(
+      base::Bind(&DeprecatedCreateGpuArcVideoService, gpu_preferences));
 #endif
 }
 
diff --git a/chrome/gpu/chrome_content_gpu_client.h b/chrome/gpu/chrome_content_gpu_client.h
index 13cdf7e..12bcf30 100644
--- a/chrome/gpu/chrome_content_gpu_client.h
+++ b/chrome/gpu/chrome_content_gpu_client.h
@@ -18,7 +18,9 @@
 
   // content::ContentGpuClient:
   void Initialize(base::FieldTrialList::Observer* observer) override;
-  void ExposeInterfacesToBrowser(shell::InterfaceRegistry* registry) override;
+  void ExposeInterfacesToBrowser(
+      shell::InterfaceRegistry* registry,
+      const gpu::GpuPreferences& gpu_preferences) override;
 
  private:
   std::unique_ptr<chrome_variations::ChildProcessFieldTrialSyncer>
diff --git a/chrome/gpu/gpu_arc_video_service.cc b/chrome/gpu/gpu_arc_video_service.cc
index bb20aad..b765b100 100644
--- a/chrome/gpu/gpu_arc_video_service.cc
+++ b/chrome/gpu/gpu_arc_video_service.cc
@@ -132,11 +132,15 @@
 namespace chromeos {
 namespace arc {
 
-GpuArcVideoService::GpuArcVideoService() : binding_(this) {}
+GpuArcVideoService::GpuArcVideoService(
+    const gpu::GpuPreferences& gpu_preferences)
+    : gpu_preferences_(gpu_preferences), binding_(this) {}
 
 GpuArcVideoService::GpuArcVideoService(
-    ::arc::mojom::VideoAcceleratorServiceRequest request)
-    : accelerator_(new ArcGpuVideoDecodeAccelerator()),
+    ::arc::mojom::VideoAcceleratorServiceRequest request,
+    const gpu::GpuPreferences& gpu_preferences)
+    : gpu_preferences_(gpu_preferences),
+      accelerator_(new ArcGpuVideoDecodeAccelerator(gpu_preferences_)),
       binding_(this, std::move(request)) {
   DVLOG(2) << "GpuArcVideoService connected";
   binding_.set_connection_error_handler(base::Bind(&OnConnectionError));
@@ -154,7 +158,7 @@
       request.PassMessagePipe(), 0u));
   client_.set_connection_error_handler(base::Bind(&OnConnectionError));
 
-  accelerator_.reset(new ArcGpuVideoDecodeAccelerator());
+  accelerator_.reset(new ArcGpuVideoDecodeAccelerator(gpu_preferences_));
 
   ::arc::mojom::VideoAcceleratorServicePtr service;
   binding_.Bind(GetProxy(&service));
diff --git a/chrome/gpu/gpu_arc_video_service.h b/chrome/gpu/gpu_arc_video_service.h
index 38fb13e..5f7275f9 100644
--- a/chrome/gpu/gpu_arc_video_service.h
+++ b/chrome/gpu/gpu_arc_video_service.h
@@ -11,6 +11,7 @@
 #include "base/macros.h"
 #include "chrome/gpu/arc_video_accelerator.h"
 #include "components/arc/common/video_accelerator.mojom.h"
+#include "gpu/command_buffer/service/gpu_preferences.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 
 namespace chromeos {
@@ -24,9 +25,10 @@
 class GpuArcVideoService : public ::arc::mojom::VideoAcceleratorService,
                            public ArcVideoAccelerator::Client {
  public:
-  explicit GpuArcVideoService(
-      ::arc::mojom::VideoAcceleratorServiceRequest request);
-  GpuArcVideoService();
+  GpuArcVideoService(
+      ::arc::mojom::VideoAcceleratorServiceRequest request,
+      const gpu::GpuPreferences& gpu_preferences);
+  explicit GpuArcVideoService(const gpu::GpuPreferences& gpu_preferences);
   ~GpuArcVideoService() override;
 
   // Connects to VideoAcceleratorServiceClient.
@@ -75,6 +77,7 @@
 
   base::ThreadChecker thread_checker_;
 
+  gpu::GpuPreferences gpu_preferences_;
   std::unique_ptr<ArcVideoAccelerator> accelerator_;
   ::arc::mojom::VideoAcceleratorServiceClientPtr client_;
 
diff --git a/chrome/installer/mac/app/BUILD.gn b/chrome/installer/mac/app/BUILD.gn
index c08b6a0..c5545e8 100644
--- a/chrome/installer/mac/app/BUILD.gn
+++ b/chrome/installer/mac/app/BUILD.gn
@@ -2,6 +2,8 @@
 # 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("mac_installer_base") {
   sources = [
     "Downloader.m",
@@ -21,9 +23,19 @@
   deps = [
     ":mac_installer_base",
   ]
-  libs = [
-    "AppKit.framework",
-    "CoreFoundation.framework",
-    "Foundation.framework",
+  libs = [ "Foundation.framework" ]
+}
+
+test("mac_installer_test") {
+  sources = [
+    "testing/OmahaXMLRequest_test.mm",
+    "testing/SystemInfo_test.mm",
   ]
+  deps = [
+    ":mac_installer_base",
+    "//base:base",
+    "//base/test:run_all_unittests",
+    "//testing/gtest:gtest",
+  ]
+  libs = [ "Foundation.framework" ]
 }
diff --git a/chrome/installer/mac/app/testing/OmahaXMLRequest_test.mm b/chrome/installer/mac/app/testing/OmahaXMLRequest_test.mm
new file mode 100644
index 0000000..a0f285ef
--- /dev/null
+++ b/chrome/installer/mac/app/testing/OmahaXMLRequest_test.mm
@@ -0,0 +1,33 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "chrome/installer/mac/app/OmahaXMLRequest.h"
+
+#include "base/mac/scoped_nsobject.h"
+#include "base/macros.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+TEST(OmahaXMLRequestTest, CreateReturnsValidXML) {
+  base::scoped_nsobject<NSXMLDocument> xml_body_(
+      [OmahaXMLRequest createXMLRequestBody]);
+  ASSERT_TRUE(xml_body_);
+
+  NSString* requestDTDLocation = [[[[NSBundle mainBundle] bundlePath]
+      stringByAppendingPathComponent:
+          @"../../chrome/installer/mac/app/testing/requestCheck.dtd"]
+      stringByResolvingSymlinksInPath];
+  NSData* requestDTDData = [NSData dataWithContentsOfFile:requestDTDLocation];
+  ASSERT_TRUE(requestDTDData);
+
+  NSError* error;
+  NSXMLDTD* requestXMLChecker =
+      [[NSXMLDTD alloc] initWithData:requestDTDData options:0 error:&error];
+  [requestXMLChecker setName:@"request"];
+  [xml_body_ setDTD:requestXMLChecker];
+  EXPECT_TRUE([xml_body_ validateAndReturnError:&error]);
+}
+
+}  // namespace
diff --git a/chrome/installer/mac/app/testing/SystemInfo_test.mm b/chrome/installer/mac/app/testing/SystemInfo_test.mm
new file mode 100644
index 0000000..b12ca34
--- /dev/null
+++ b/chrome/installer/mac/app/testing/SystemInfo_test.mm
@@ -0,0 +1,32 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "chrome/installer/mac/app/SystemInfo.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+TEST(SystemInfoTest, GetArchReturnsExpectedString) {
+  NSString* arch = [SystemInfo getArch];
+
+  EXPECT_TRUE([arch isEqualToString:@"i486"] ||
+              [arch isEqualToString:@"x86_64h"]);
+}
+
+TEST(SystemInfoTest, GetOSVersionMatchesRegexFormat) {
+  NSString* os_version = [SystemInfo getOSVersion];
+
+  NSRegularExpression* regex = [NSRegularExpression
+      regularExpressionWithPattern:@"^10\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$"
+                           options:0
+                             error:nil];
+  NSUInteger matches =
+      [regex numberOfMatchesInString:os_version
+                             options:0
+                               range:NSMakeRange(0, os_version.length)];
+  EXPECT_EQ(1u, matches);
+}
+
+}  // namespace
diff --git a/chrome/installer/mac/app/testing/requestCheck.dtd b/chrome/installer/mac/app/testing/requestCheck.dtd
new file mode 100644
index 0000000..7a8571d6
--- /dev/null
+++ b/chrome/installer/mac/app/testing/requestCheck.dtd
@@ -0,0 +1,70 @@
+<!--
+  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.
+-->
+<!--
+
+  Welcome to a document type declaration (DTD).
+  This is a document that makes sure XML files are correctly formed.
+
+  Below, |request| is implied to be the root element of the XML document, whose
+  children are |os| and |app|.
+-->
+<!ELEMENT request (os, app)>
+<!--
+
+  Below, this indicates that |protocol| is a required attribute of the
+  |request| element; by indicating `NMTOKEN`, we indicate that this attribute
+  must have a value associated with it that does not contain whitespace. `CDATA`
+  would be the more commonly used keyword for content with whitespace.
+-->
+<!ATTLIST request protocol NMTOKEN #REQUIRED>
+<!--
+
+  The |os| element should not have any children and cannot have any content
+  within the tag. (<os/> and <os></os> are allowed, but <os>stuff here!</os> is
+  not a valid element.)
+-->
+<!ELEMENT os EMPTY>
+<!--
+
+  This |platform| attribute is a required attribute of |os|, and its value must
+  be "mac".
+-->
+<!ATTLIST os platform (mac) #REQUIRED>
+<!--
+
+  The |version|, |arch|, and |sp| attributes are optional attributes of |os|. If
+  a request's XML body has the |sp|, it may not need the version or arch; if the
+  |sp| is not included but |version| and |arch| are specified, the XML body is
+  still valid. Unfortunately there is relatively less logic available for
+  attributes, so I currently cannot reject the XML document if there is only
+  either |arch| or |version|.
+-->
+<!ATTLIST os version NMTOKEN #IMPLIED>
+<!ATTLIST os arch NMTOKEN #IMPLIED>
+<!ATTLIST os sp NMTOKEN #IMPLIED>
+<!--
+
+  |app| has only one child, |updatecheck|.
+-->
+<!ELEMENT app (updatecheck)>
+<!--
+
+  The |appid| attribute of the |app| element must have "com.google.Chrome" as
+  its value.
+-->
+<!ATTLIST app appid (com.google.Chrome) #REQUIRED>
+<!--
+
+  The following two attributes are required; their values must not contain
+  whitespace.
+-->
+<!ATTLIST app version NMTOKEN #REQUIRED>
+<!ATTLIST app lang NMTOKEN #REQUIRED>
+<!--
+
+  |updatecheck| must be an empty element.
+-->
+<!ELEMENT updatecheck EMPTY>
diff --git a/chrome/renderer/DEPS b/chrome/renderer/DEPS
index 793869b..eac0267 100644
--- a/chrome/renderer/DEPS
+++ b/chrome/renderer/DEPS
@@ -1,6 +1,7 @@
 include_rules = [
   "+chrome/grit",  # For generated headers
   "+components/autofill/content/common",
+  "+components/autofill/content/public/interfaces",
   "+components/autofill/content/renderer",
   "+components/autofill/core/common",
   "+components/cdm/renderer",
diff --git a/chrome/renderer/autofill/autofill_renderer_browsertest.cc b/chrome/renderer/autofill/autofill_renderer_browsertest.cc
index ead2cf8..eee167a8 100644
--- a/chrome/renderer/autofill/autofill_renderer_browsertest.cc
+++ b/chrome/renderer/autofill/autofill_renderer_browsertest.cc
@@ -12,12 +12,15 @@
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/test/base/chrome_render_view_test.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "components/autofill/content/common/autofill_messages.h"
+#include "components/autofill/content/public/interfaces/autofill_driver.mojom.h"
 #include "components/autofill/content/renderer/autofill_agent.h"
 #include "components/autofill/core/common/form_data.h"
 #include "components/autofill/core/common/form_field_data.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/renderer/render_frame.h"
+#include "content/public/renderer/render_view.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
+#include "services/shell/public/cpp/interface_provider.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/WebKit/public/platform/WebString.h"
 #include "third_party/WebKit/public/platform/WebURLRequest.h"
@@ -41,19 +44,109 @@
 
 namespace autofill {
 
+namespace {
+
+class FakeContentAutofillDriver : public mojom::AutofillDriver {
+ public:
+  FakeContentAutofillDriver() : called_field_change_(false) {}
+  ~FakeContentAutofillDriver() override {}
+
+  void BindRequest(mojom::AutofillDriverRequest request) {
+    bindings_.AddBinding(this, std::move(request));
+  }
+
+  bool called_field_change() const { return called_field_change_; }
+
+  const std::vector<FormData>* forms() const { return forms_.get(); }
+
+  void reset_forms() { return forms_.reset(); }
+
+ private:
+  // mojom::AutofillDriver:
+  void FirstUserGestureObserved() override {}
+
+  void FormsSeen(mojo::Array<FormData> forms,
+                 base::TimeTicks timestamp) override {
+    // FormsSeen() could be called multiple times and sometimes even with empty
+    // forms array for main frame, but we're interested in only the first time
+    // call.
+    if (!forms_)
+      forms_.reset(new std::vector<FormData>(forms.PassStorage()));
+  }
+
+  void WillSubmitForm(const FormData& form,
+                      base::TimeTicks timestamp) override {}
+
+  void FormSubmitted(const FormData& form) override {}
+
+  void TextFieldDidChange(const FormData& form,
+                          const FormFieldData& field,
+                          base::TimeTicks timestamp) override {
+    called_field_change_ = true;
+  }
+
+  void QueryFormFieldAutofill(int32_t id,
+                              const FormData& form,
+                              const FormFieldData& field,
+                              const gfx::RectF& bounding_box) override {}
+
+  void HidePopup() override {}
+
+  void PingAck() override {}
+
+  void FocusNoLongerOnForm() override {}
+
+  void DidFillAutofillFormData(const FormData& form,
+                               base::TimeTicks timestamp) override {}
+
+  void DidPreviewAutofillFormData() override {}
+
+  void DidEndTextFieldEditing() override {}
+
+  void SetDataList(mojo::Array<mojo::String> values,
+                   mojo::Array<mojo::String> labels) override {}
+
+  // Records whether TextFieldDidChange() get called.
+  bool called_field_change_;
+  // Records data received via FormSeen() call.
+  std::unique_ptr<std::vector<FormData>> forms_;
+
+  mojo::BindingSet<mojom::AutofillDriver> bindings_;
+};
+
+}  // namespace
+
 using AutofillQueryParam =
     std::tuple<int, autofill::FormData, autofill::FormFieldData, gfx::RectF>;
 
 class AutofillRendererTest : public ChromeRenderViewTest {
  public:
   AutofillRendererTest() {}
+
   ~AutofillRendererTest() override {}
 
  protected:
   void SetUp() override {
     ChromeRenderViewTest::SetUp();
+
+    // We only use the fake driver for main frame
+    // because our test cases only involve the main frame.
+    shell::InterfaceProvider* remote_interfaces =
+        view_->GetMainRenderFrame()->GetRemoteInterfaces();
+    shell::InterfaceProvider::TestApi test_api(remote_interfaces);
+    test_api.SetBinderForName(
+        mojom::AutofillDriver::Name_,
+        base::Bind(&AutofillRendererTest::BindAutofillDriver,
+                   base::Unretained(this)));
   }
 
+  void BindAutofillDriver(mojo::ScopedMessagePipeHandle handle) {
+    fake_driver_.BindRequest(
+        mojo::MakeRequest<mojom::AutofillDriver>(std::move(handle)));
+  }
+
+  FakeContentAutofillDriver fake_driver_;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(AutofillRendererTest);
 };
@@ -71,13 +164,11 @@
            "  </select>"
            "</form>");
 
+  base::RunLoop run_loop;
+  run_loop.RunUntilIdle();
   // Verify that "FormsSeen" sends the expected number of fields.
-  const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching(
-      AutofillHostMsg_FormsSeen::ID);
-  ASSERT_NE(nullptr, message);
-  AutofillHostMsg_FormsSeen::Param params;
-  AutofillHostMsg_FormsSeen::Read(message, &params);
-  std::vector<FormData> forms = std::get<0>(params);
+  ASSERT_TRUE(fake_driver_.forms());
+  std::vector<FormData> forms = *(fake_driver_.forms());
   ASSERT_EQ(1UL, forms.size());
   ASSERT_EQ(4UL, forms[0].fields.size());
 
@@ -109,7 +200,7 @@
   expected.max_length = 0;
   EXPECT_FORM_FIELD_DATA_EQUALS(expected, forms[0].fields[3]);
 
-  render_thread_->sink().ClearMessages();
+  fake_driver_.reset_forms();
 
   // Dynamically create a new form. A new message should be sent for it, but
   // not for the previous form.
@@ -136,11 +227,8 @@
       "document.body.appendChild(newForm);");
 
   WaitForAutofillDidAssociateFormControl();
-  message = render_thread_->sink().GetFirstMessageMatching(
-      AutofillHostMsg_FormsSeen::ID);
-  ASSERT_NE(nullptr, message);
-  AutofillHostMsg_FormsSeen::Read(message, &params);
-  forms = std::get<0>(params);
+  ASSERT_TRUE(fake_driver_.forms());
+  forms = *(fake_driver_.forms());
   ASSERT_EQ(1UL, forms.size());
   ASSERT_EQ(3UL, forms[0].fields.size());
 
@@ -166,13 +254,11 @@
            "  <input type='text' id='middlename'/>"
            "</form>");
 
+  base::RunLoop run_loop;
+  run_loop.RunUntilIdle();
   // Verify that "FormsSeen" isn't sent, as there are too few fields.
-  const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching(
-      AutofillHostMsg_FormsSeen::ID);
-  ASSERT_NE(nullptr, message);
-  AutofillHostMsg_FormsSeen::Param params;
-  AutofillHostMsg_FormsSeen::Read(message, &params);
-  const std::vector<FormData>& forms = std::get<0>(params);
+  ASSERT_TRUE(fake_driver_.forms());
+  const std::vector<FormData>& forms = *(fake_driver_.forms());
   ASSERT_EQ(0UL, forms.size());
 }
 
@@ -199,26 +285,21 @@
   ASSERT_TRUE(base::ReadFileToString(test_path, &html_data));
   LoadHTML(html_data.c_str());
 
+  base::RunLoop run_loop;
+  run_loop.RunUntilIdle();
   // Verify that "FormsSeen" sends the expected number of fields.
-  const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching(
-      AutofillHostMsg_FormsSeen::ID);
-  ASSERT_NE(nullptr, message);
-  AutofillHostMsg_FormsSeen::Param params;
-  AutofillHostMsg_FormsSeen::Read(message, &params);
-  std::vector<FormData> forms = std::get<0>(params);
+  ASSERT_TRUE(fake_driver_.forms());
+  std::vector<FormData> forms = *(fake_driver_.forms());
   ASSERT_EQ(1UL, forms.size());
   ASSERT_EQ(7UL, forms[0].fields.size());
 
-  render_thread_->sink().ClearMessages();
+  fake_driver_.reset_forms();
 
   ExecuteJavaScriptForTests("AddFields()");
 
   WaitForAutofillDidAssociateFormControl();
-  message = render_thread_->sink().GetFirstMessageMatching(
-      AutofillHostMsg_FormsSeen::ID);
-  ASSERT_NE(nullptr, message);
-  AutofillHostMsg_FormsSeen::Read(message, &params);
-  forms = std::get<0>(params);
+  ASSERT_TRUE(fake_driver_.forms());
+  forms = *(fake_driver_.forms());
   ASSERT_EQ(1UL, forms.size());
   ASSERT_EQ(9UL, forms[0].fields.size());
 
@@ -250,17 +331,16 @@
 
   // Not a user gesture, so no IPC message to browser.
   DisableUserGestureSimulationForAutofill();
+  ASSERT_FALSE(fake_driver_.called_field_change());
   full_name.setValue("Alice", true);
   GetMainFrame()->autofillClient()->textFieldDidChange(full_name);
   base::RunLoop().RunUntilIdle();
-  ASSERT_EQ(nullptr, render_thread_->sink().GetFirstMessageMatching(
-                         AutofillHostMsg_TextFieldDidChange::ID));
+  ASSERT_FALSE(fake_driver_.called_field_change());
 
   // A user gesture will send a message to the browser.
   EnableUserGestureSimulationForAutofill();
   SimulateUserInputChangeForElement(&full_name, "Alice");
-  ASSERT_NE(nullptr, render_thread_->sink().GetFirstMessageMatching(
-                         AutofillHostMsg_TextFieldDidChange::ID));
+  ASSERT_TRUE(fake_driver_.called_field_change());
 }
 
 }  // namespace autofill
diff --git a/chrome/renderer/autofill/form_autocomplete_browsertest.cc b/chrome/renderer/autofill/form_autocomplete_browsertest.cc
index 1527bd2..9900dcae0 100644
--- a/chrome/renderer/autofill/form_autocomplete_browsertest.cc
+++ b/chrome/renderer/autofill/form_autocomplete_browsertest.cc
@@ -11,7 +11,10 @@
 #include "components/autofill/content/common/autofill_messages.h"
 #include "components/autofill/content/renderer/autofill_agent.h"
 #include "components/autofill/core/common/form_data.h"
-#include "content/public/test/mock_render_thread.h"
+#include "content/public/renderer/render_frame.h"
+#include "content/public/renderer/render_view.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
+#include "services/shell/public/cpp/interface_provider.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/WebKit/public/web/WebDocument.h"
 #include "third_party/WebKit/public/web/WebElement.h"
@@ -24,72 +27,123 @@
 using blink::WebInputElement;
 using blink::WebString;
 
-typedef ChromeRenderViewTest FormAutocompleteTest;
-
 namespace autofill {
 
 namespace {
 
+class FakeContentAutofillDriver : public mojom::AutofillDriver {
+ public:
+  FakeContentAutofillDriver() : did_unfocus_form_(false) {}
+
+  ~FakeContentAutofillDriver() override {}
+
+  void BindRequest(mojom::AutofillDriverRequest request) {
+    bindings_.AddBinding(this, std::move(request));
+  }
+
+  bool did_unfocus_form() const { return did_unfocus_form_; }
+
+  const FormData* form_will_submit() const { return form_will_submit_.get(); }
+
+  const FormData* form_submitted() const { return form_submitted_.get(); }
+
+ private:
+  // mojom::AutofillDriver:
+  void FirstUserGestureObserved() override {}
+
+  void FormsSeen(mojo::Array<FormData> forms,
+                 base::TimeTicks timestamp) override {}
+
+  void WillSubmitForm(const FormData& form,
+                      base::TimeTicks timestamp) override {
+    form_will_submit_.reset(new FormData(form));
+  }
+
+  void FormSubmitted(const FormData& form) override {
+    form_submitted_.reset(new FormData(form));
+  }
+
+  void TextFieldDidChange(const FormData& form,
+                          const FormFieldData& field,
+                          base::TimeTicks timestamp) override {}
+
+  void QueryFormFieldAutofill(int32_t id,
+                              const FormData& form,
+                              const FormFieldData& field,
+                              const gfx::RectF& bounding_box) override {}
+
+  void HidePopup() override {}
+
+  void PingAck() override {}
+
+  void FocusNoLongerOnForm() override { did_unfocus_form_ = true; }
+
+  void DidFillAutofillFormData(const FormData& form,
+                               base::TimeTicks timestamp) override {}
+
+  void DidPreviewAutofillFormData() override {}
+
+  void DidEndTextFieldEditing() override {}
+
+  void SetDataList(mojo::Array<mojo::String> values,
+                   mojo::Array<mojo::String> labels) override {}
+
+  // Records whether FocusNoLongerOnForm() get called.
+  bool did_unfocus_form_;
+  // Records the form data received via WillSubmitForm() call.
+  std::unique_ptr<FormData> form_will_submit_;
+  // Records the form data received via FormSubmitted() call.
+  std::unique_ptr<FormData> form_submitted_;
+
+  mojo::BindingSet<mojom::AutofillDriver> bindings_;
+};
+
 // Helper function to verify the form-related messages received from the
 // renderer. The same data is expected in both messages. Depending on
 // |expect_submitted_message|, will verify presence of FormSubmitted message.
-void VerifyReceivedRendererMessages(content::MockRenderThread* render_thread,
-                                    const std::string& fname,
-                                    const std::string& lname,
-                                    bool expect_submitted_message) {
-  const IPC::Message* will_submit_message =
-      render_thread->sink().GetFirstMessageMatching(
-          AutofillHostMsg_WillSubmitForm::ID);
-  const IPC::Message* submitted_message =
-      render_thread->sink().GetFirstMessageMatching(
-          AutofillHostMsg_FormSubmitted::ID);
-  ASSERT_TRUE(will_submit_message != NULL);
-  ASSERT_EQ(expect_submitted_message, submitted_message != NULL);
+void VerifyReceivedRendererMessages(
+    const FakeContentAutofillDriver& fake_driver,
+    const std::string& fname,
+    const std::string& lname,
+    bool expect_submitted_message) {
+  ASSERT_TRUE(fake_driver.form_will_submit());
+  ASSERT_EQ(expect_submitted_message, fake_driver.form_submitted() != nullptr);
 
   // The tuple also includes a timestamp, which is ignored.
-  std::tuple<FormData, base::TimeTicks> will_submit_forms;
-  AutofillHostMsg_WillSubmitForm::Read(will_submit_message, &will_submit_forms);
-  ASSERT_LE(2U, std::get<0>(will_submit_forms).fields.size());
+  const FormData& will_submit_form = *(fake_driver.form_will_submit());
+  ASSERT_LE(2U, will_submit_form.fields.size());
 
-  FormFieldData& will_submit_form_field =
-      std::get<0>(will_submit_forms).fields[0];
-  EXPECT_EQ(WebString("fname"), will_submit_form_field.name);
-  EXPECT_EQ(WebString(base::UTF8ToUTF16(fname)), will_submit_form_field.value);
-  will_submit_form_field = std::get<0>(will_submit_forms).fields[1];
-  EXPECT_EQ(WebString("lname"), will_submit_form_field.name);
-  EXPECT_EQ(WebString(base::UTF8ToUTF16(lname)), will_submit_form_field.value);
+  EXPECT_EQ(WebString("fname"), will_submit_form.fields[0].name);
+  EXPECT_EQ(WebString(base::UTF8ToUTF16(fname)),
+            will_submit_form.fields[0].value);
+  EXPECT_EQ(WebString("lname"), will_submit_form.fields[1].name);
+  EXPECT_EQ(WebString(base::UTF8ToUTF16(lname)),
+            will_submit_form.fields[1].value);
 
   if (expect_submitted_message) {
-    std::tuple<FormData> submitted_forms;
-    AutofillHostMsg_FormSubmitted::Read(submitted_message, &submitted_forms);
-    ASSERT_LE(2U, std::get<0>(submitted_forms).fields.size());
+    const FormData& submitted_form = *(fake_driver.form_submitted());
+    ASSERT_LE(2U, submitted_form.fields.size());
 
-    FormFieldData& submitted_field = std::get<0>(submitted_forms).fields[0];
-    EXPECT_EQ(WebString("fname"), submitted_field.name);
-    EXPECT_EQ(WebString(base::UTF8ToUTF16(fname)), submitted_field.value);
-    submitted_field = std::get<0>(submitted_forms).fields[1];
-    EXPECT_EQ(WebString("lname"), submitted_field.name);
-    EXPECT_EQ(WebString(base::UTF8ToUTF16(lname)), submitted_field.value);
+    EXPECT_EQ(WebString("fname"), submitted_form.fields[0].name);
+    EXPECT_EQ(WebString(base::UTF8ToUTF16(fname)),
+              submitted_form.fields[0].value);
+    EXPECT_EQ(WebString("lname"), submitted_form.fields[1].name);
+    EXPECT_EQ(WebString(base::UTF8ToUTF16(lname)),
+              submitted_form.fields[1].value);
   }
 }
 
 // Helper function to verify that NO form-related messages are received from the
 // renderer.
-void VerifyNoSubmitMessagesReceived(content::MockRenderThread* render_thread) {
+void VerifyNoSubmitMessagesReceived(
+    const FakeContentAutofillDriver& fake_driver) {
   // No submission messages sent.
-  const IPC::Message* will_submit_message =
-      render_thread->sink().GetFirstMessageMatching(
-          AutofillHostMsg_WillSubmitForm::ID);
-  const IPC::Message* submitted_message =
-      render_thread->sink().GetFirstMessageMatching(
-          AutofillHostMsg_FormSubmitted::ID);
-  EXPECT_EQ(NULL, will_submit_message);
-  EXPECT_EQ(NULL, submitted_message);
+  EXPECT_EQ(nullptr, fake_driver.form_will_submit());
+  EXPECT_EQ(nullptr, fake_driver.form_submitted());
 }
 
 // Simulates receiving a message from the browser to fill a form.
-void SimulateOnFillForm(content::MockRenderThread* render_thread,
-                        autofill::AutofillAgent* autofill_agent,
+void SimulateOnFillForm(autofill::AutofillAgent* autofill_agent,
                         blink::WebFrame* main_frame) {
   WebDocument document = main_frame->document();
   WebElement element =
@@ -98,7 +152,6 @@
 
   // This call is necessary to setup the autofill agent appropriate for the
   // user selection; simulates the menu actually popping up.
-  render_thread->sink().ClearMessages();
   static_cast<autofill::PageClickListener*>(autofill_agent)
       ->FormControlElementClicked(element.to<WebInputElement>(), false);
 
@@ -119,13 +172,42 @@
   field_data.is_autofilled = true;
   data.fields.push_back(field_data);
 
-  AutofillMsg_FillForm msg(0, 0, data);
-  static_cast<content::RenderFrameObserver*>(autofill_agent)
-      ->OnMessageReceived(msg);
+  autofill_agent->FillForm(0, data);
 }
 
 }  // end namespace
 
+class FormAutocompleteTest : public ChromeRenderViewTest {
+ public:
+  FormAutocompleteTest() {}
+  ~FormAutocompleteTest() override {}
+
+ protected:
+  void SetUp() override {
+    ChromeRenderViewTest::SetUp();
+
+    // We only use the fake driver for main frame
+    // because our test cases only involve the main frame.
+    shell::InterfaceProvider* remote_interfaces =
+        view_->GetMainRenderFrame()->GetRemoteInterfaces();
+    shell::InterfaceProvider::TestApi test_api(remote_interfaces);
+    test_api.SetBinderForName(
+        mojom::AutofillDriver::Name_,
+        base::Bind(&FormAutocompleteTest::BindAutofillDriver,
+                   base::Unretained(this)));
+  }
+
+  void BindAutofillDriver(mojo::ScopedMessagePipeHandle handle) {
+    fake_driver_.BindRequest(
+        mojo::MakeRequest<mojom::AutofillDriver>(std::move(handle)));
+  }
+
+  FakeContentAutofillDriver fake_driver_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(FormAutocompleteTest);
+};
+
 // Tests that submitting a form generates WillSubmitForm and FormSubmitted
 // messages with the form fields.
 TEST_F(FormAutocompleteTest, NormalFormSubmit) {
@@ -137,7 +219,7 @@
   ExecuteJavaScriptForTests("document.getElementById('myForm').submit();");
   ProcessPendingMessages();
 
-  VerifyReceivedRendererMessages(render_thread_.get(), "Rick", "Deckard",
+  VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard",
                                  true /* expect_submitted_message */);
 }
 
@@ -157,7 +239,7 @@
       "document.querySelector('input[type=submit]').click();");
   ProcessPendingMessages();
 
-  VerifyReceivedRendererMessages(render_thread_.get(), "Rick", "Deckard",
+  VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard",
                                  false /* expect_submitted_message */);
 }
 
@@ -186,7 +268,7 @@
   static_cast<blink::WebAutofillClient*>(autofill_agent_)->ajaxSucceeded();
   ProcessPendingMessages();
 
-  VerifyReceivedRendererMessages(render_thread_.get(), "Rick", "Deckard",
+  VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard",
                                  true /* expect_submitted_message */);
 }
 
@@ -220,7 +302,7 @@
   static_cast<blink::WebAutofillClient*>(autofill_agent_)->ajaxSucceeded();
   ProcessPendingMessages();
 
-  VerifyReceivedRendererMessages(render_thread_.get(), "Rick", "Deckard",
+  VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard",
                                  true /* expect_submitted_message */);
 }
 
@@ -261,7 +343,7 @@
   static_cast<blink::WebAutofillClient*>(autofill_agent_)->ajaxSucceeded();
   ProcessPendingMessages();
 
-  VerifyReceivedRendererMessages(render_thread_.get(), "Rick", "Deckard",
+  VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard",
                                  true /* expect_submitted_message */);
 }
 
@@ -290,7 +372,7 @@
   static_cast<blink::WebAutofillClient*>(autofill_agent_)->ajaxSucceeded();
   ProcessPendingMessages();
 
-  VerifyReceivedRendererMessages(render_thread_.get(), "Rick", "Deckard",
+  VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard",
                                  true /* expect_submitted_message */);
 }
 
@@ -316,7 +398,7 @@
   ProcessPendingMessages();
 
   // No submission messages sent.
-  VerifyNoSubmitMessagesReceived(render_thread_.get());
+  VerifyNoSubmitMessagesReceived(fake_driver_);
 }
 
 // Tests that completing an Ajax request without any prior form interaction
@@ -339,7 +421,7 @@
   ProcessPendingMessages();
 
   // No submission messages sent.
-  VerifyNoSubmitMessagesReceived(render_thread_.get());
+  VerifyNoSubmitMessagesReceived(fake_driver_);
 }
 
 // Tests that completing an Ajax request after having autofilled a form,
@@ -353,7 +435,7 @@
       "<input name='lname'/></form></html>");
 
   // Simulate filling a form using Autofill.
-  SimulateOnFillForm(render_thread_.get(), autofill_agent_, GetMainFrame());
+  SimulateOnFillForm(autofill_agent_, GetMainFrame());
 
   // Simulate removing the form just before the ajax request completes.
   ExecuteJavaScriptForTests("var element = document.getElementById('myForm');"
@@ -363,7 +445,7 @@
   static_cast<blink::WebAutofillClient*>(autofill_agent_)->ajaxSucceeded();
   ProcessPendingMessages();
 
-  VerifyReceivedRendererMessages(render_thread_.get(), "John", "Smith",
+  VerifyReceivedRendererMessages(fake_driver_, "John", "Smith",
                                  true /* expect_submitted_message */);
 }
 
@@ -378,7 +460,7 @@
       "<input name='lname' value='Deckard'/></form></html>");
 
   // Simulate filling a form using Autofill.
-  SimulateOnFillForm(render_thread_.get(), autofill_agent_, GetMainFrame());
+  SimulateOnFillForm(autofill_agent_, GetMainFrame());
 
   // Form still visible.
 
@@ -387,7 +469,7 @@
   ProcessPendingMessages();
 
   // No submission messages sent.
-  VerifyNoSubmitMessagesReceived(render_thread_.get());
+  VerifyNoSubmitMessagesReceived(fake_driver_);
 }
 
 // Tests that completing an Ajax request without a form present will still
@@ -417,7 +499,7 @@
   static_cast<blink::WebAutofillClient*>(autofill_agent_)->ajaxSucceeded();
   ProcessPendingMessages();
 
-  VerifyReceivedRendererMessages(render_thread_.get(), "Kirby", "Puckett",
+  VerifyReceivedRendererMessages(fake_driver_, "Kirby", "Puckett",
                                  /* expect_submitted_message = */ true);
 }
 
@@ -465,15 +547,17 @@
   WebInputElement fname_element = element.to<WebInputElement>();
   SimulateUserInputChangeForElement(&fname_element, std::string("Rick"));
 
+  ASSERT_FALSE(fake_driver_.did_unfocus_form());
+
   // Change focus to a different node outside the form.
   WebElement different =
       document.getElementById(WebString::fromUTF8("different"));
   SetFocused(different);
 
-  ProcessPendingMessages();
+  base::RunLoop run_loop;
+  run_loop.RunUntilIdle();
 
-  EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching(
-                  AutofillHostMsg_FocusNoLongerOnForm::ID) != nullptr);
+  EXPECT_TRUE(fake_driver_.did_unfocus_form());
 }
 
 // Test that a FocusNoLongerOnForm message is sent if focus goes from one
@@ -495,6 +579,8 @@
   WebInputElement fname_element = element.to<WebInputElement>();
   SimulateUserInputChangeForElement(&fname_element, std::string("Rick"));
 
+  ASSERT_FALSE(fake_driver_.did_unfocus_form());
+
   // Simulate user input in the second form so that a "no longer focused"
   // message is sent for the first form.
   document = GetMainFrame()->document();
@@ -503,10 +589,10 @@
   fname_element = element.to<WebInputElement>();
   SimulateUserInputChangeForElement(&fname_element, std::string("John"));
 
-  ProcessPendingMessages();
+  base::RunLoop run_loop;
+  run_loop.RunUntilIdle();
 
-  EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching(
-                  AutofillHostMsg_FocusNoLongerOnForm::ID) != nullptr);
+  EXPECT_TRUE(fake_driver_.did_unfocus_form());
 }
 
 // Tests that submitting a form that has autocomplete="off" generates
@@ -522,7 +608,7 @@
   ExecuteJavaScriptForTests("document.getElementById('myForm').submit();");
   ProcessPendingMessages();
 
-  VerifyReceivedRendererMessages(render_thread_.get(), "Rick", "Deckard",
+  VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard",
                                  true /* expect_submitted_message */);
 }
 
@@ -538,7 +624,7 @@
   ExecuteJavaScriptForTests("document.getElementById('myForm').submit();");
   ProcessPendingMessages();
 
-  VerifyReceivedRendererMessages(render_thread_.get(), "Rick", "Deckard",
+  VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard",
                                  true /* expect_submitted_message */);
 }
 
@@ -566,7 +652,7 @@
   ExecuteJavaScriptForTests("document.getElementById('myForm').submit();");
   ProcessPendingMessages();
 
-  VerifyReceivedRendererMessages(render_thread_.get(), "Rick", "Deckard",
+  VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard",
                                  true /* expect_submitted_message */);
 }
 
diff --git a/chrome/renderer/autofill/form_autofill_browsertest.cc b/chrome/renderer/autofill/form_autofill_browsertest.cc
index 4ea54a0..1945424 100644
--- a/chrome/renderer/autofill/form_autofill_browsertest.cc
+++ b/chrome/renderer/autofill/form_autofill_browsertest.cc
@@ -2081,6 +2081,37 @@
   EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, result.text_direction);
 }
 
+TEST_F(FormAutofillTest, TextAlignOverridesDirection) {
+  // text-align: right
+  LoadHTML("<STYLE>input{direction:ltr;text-align:right}</STYLE>"
+           "<FORM>"
+           "  <INPUT type='text' id='element'/>"
+           "</FORM>");
+
+  WebFrame* frame = GetMainFrame();
+  ASSERT_NE(nullptr, frame);
+
+  WebFormControlElement element = GetFormControlElementById("element");
+
+  FormFieldData result;
+  WebFormControlElementToFormField(element, EXTRACT_VALUE, &result);
+  EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction);
+
+  // text-align: left
+  LoadHTML("<STYLE>input{direction:rtl;text-align:left}</STYLE>"
+           "<FORM>"
+           "  <INPUT type='text' id='element'/>"
+           "</FORM>");
+
+  frame = GetMainFrame();
+  ASSERT_NE(nullptr, frame);
+
+  element = GetFormControlElementById("element");
+
+  WebFormControlElementToFormField(element, EXTRACT_VALUE, &result);
+  EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, result.text_direction);
+}
+
 TEST_F(FormAutofillTest,
        DetectTextDirectionWhenParentHasBothDIRAttributeAndStyle) {
   LoadHTML("<STYLE>form{direction:ltr}</STYLE>"
diff --git a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
index 049db805..858cb51 100644
--- a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
+++ b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
@@ -22,6 +22,7 @@
 #include "components/autofill/core/common/password_form_field_prediction_map.h"
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "content/public/renderer/render_frame.h"
+#include "mojo/common/common_type_converters.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/WebKit/public/platform/WebString.h"
 #include "third_party/WebKit/public/platform/WebVector.h"
@@ -255,14 +256,11 @@
   }
 
   // Simulates the show initial password account suggestions message being sent
-  // to the renderer. We use that so we don't have to make
-  // RenderView::OnShowInitialPasswordAccountSuggestions() protected.
+  // to the renderer.
   void SimulateOnShowInitialPasswordAccountSuggestions(
       const PasswordFormFillData& fill_data) {
-    AutofillMsg_ShowInitialPasswordAccountSuggestions msg(
-        0, kPasswordFillFormDataId, fill_data);
-    static_cast<content::RenderFrameObserver*>(autofill_agent_)
-        ->OnMessageReceived(msg);
+    autofill_agent_->ShowInitialPasswordAccountSuggestions(
+        kPasswordFillFormDataId, fill_data);
   }
 
   void SendVisiblePasswordForms() {
@@ -387,9 +385,8 @@
     static_cast<autofill::PageClickListener*>(autofill_agent_)
         ->FormControlElementClicked(input, false);
 
-    AutofillMsg_FillPasswordSuggestion msg(0, username, password);
-    static_cast<content::RenderFrameObserver*>(autofill_agent_)
-        ->OnMessageReceived(msg);
+    autofill_agent_->FillPasswordSuggestion(mojo::String::From(username),
+                                            mojo::String::From(password));
   }
 
   void SimulateUsernameChange(const std::string& username) {
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index 6b80874..6409162 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -1066,13 +1066,6 @@
     return true;
   }
 
-  // For now, we skip the rest for POST submissions.  This is because
-  // http://crbug.com/101395 is more likely to cause compatibility issues
-  // with hosted apps and extensions than WebUI pages.  We will remove this
-  // check when cross-process POST submissions are supported.
-  if (http_method != "GET")
-    return false;
-
   // If |url| matches one of the prerendered URLs, stop this navigation and try
   // to swap in the prerendered page on the browser process. If the prerendered
   // page no longer exists by the time the OpenURL IPC is handled, a normal
diff --git a/chrome/renderer/chrome_render_frame_observer.cc b/chrome/renderer/chrome_render_frame_observer.cc
index 74b09d1..73fae19a 100644
--- a/chrome/renderer/chrome_render_frame_observer.cc
+++ b/chrome/renderer/chrome_render_frame_observer.cc
@@ -33,6 +33,7 @@
 #include "net/ssl/ssl_connection_status_flags.h"
 #include "skia/ext/image_operations.h"
 #include "third_party/WebKit/public/platform/WebImage.h"
+#include "third_party/WebKit/public/platform/WebURLRequest.h"
 #include "third_party/WebKit/public/platform/modules/app_banner/WebAppBannerPromptReply.h"
 #include "third_party/WebKit/public/web/WebDataSource.h"
 #include "third_party/WebKit/public/web/WebDocument.h"
diff --git a/chrome/renderer/net/net_error_helper.cc b/chrome/renderer/net/net_error_helper.cc
index acb98ccc..391f754 100644
--- a/chrome/renderer/net/net_error_helper.cc
+++ b/chrome/renderer/net/net_error_helper.cc
@@ -31,6 +31,7 @@
 #include "grit/components_resources.h"
 #include "ipc/ipc_message.h"
 #include "ipc/ipc_message_macros.h"
+#include "third_party/WebKit/public/platform/WebCachePolicy.h"
 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h"
 #include "third_party/WebKit/public/platform/WebURL.h"
 #include "third_party/WebKit/public/platform/WebURLError.h"
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 0ba5f6e..87e8d7f 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -980,9 +980,11 @@
       "//media",
       "//media/base:test_support",
       "//media/cast:test_support",
+      "//mojo/common:common_base",
       "//net",
       "//net:test_support",
       "//sdch",
+      "//services/shell/public/cpp",
       "//skia",
       "//sync",
       "//testing/gmock",
diff --git a/chrome/test/android/telemetry_tests/PRESUBMIT.py b/chrome/test/android/telemetry_tests/PRESUBMIT.py
new file mode 100644
index 0000000..54975213
--- /dev/null
+++ b/chrome/test/android/telemetry_tests/PRESUBMIT.py
@@ -0,0 +1,34 @@
+# 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.
+
+"""Presubmit script for android chrome telemetry tests.
+
+See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for
+details on the presubmit API built into depot_tools.
+"""
+def CommonChecks(input_api, output_api):
+  current_dir = input_api.PresubmitLocalPath()
+  chromium_src = input_api.os_path.join(current_dir, '..', '..', '..', '..')
+
+  def J(*dirs):
+    """Returns a path relative to chromium src directory."""
+    return input_api.os_path.join(chromium_src, *dirs)
+
+  return input_api.canned_checks.RunPylint(
+      input_api,
+      output_api,
+      pylintrc='pylintrc',
+      extra_paths_list=[
+          J('third_party', 'catapult', 'catapult_base'),
+          J('third_party', 'catapult', 'telemetry'),
+          J('tools', 'perf'),
+      ])
+
+
+def CheckChangeOnUpload(input_api, output_api):
+  return CommonChecks(input_api, output_api)
+
+
+def CheckChangeOnCommit(input_api, output_api):
+  return CommonChecks(input_api, output_api)
diff --git a/chrome/test/android/telemetry_tests/browser_tests/__init__.py b/chrome/test/android/telemetry_tests/browser_tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/chrome/test/android/telemetry_tests/browser_tests/__init__.py
diff --git a/chrome/test/android/telemetry_tests/browser_tests/popular_urls.py b/chrome/test/android/telemetry_tests/browser_tests/popular_urls.py
new file mode 100644
index 0000000..dd0b1046
--- /dev/null
+++ b/chrome/test/android/telemetry_tests/browser_tests/popular_urls.py
@@ -0,0 +1,153 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+
+from telemetry.testing import serially_executed_browser_test_case
+
+from catapult_base import cloud_storage
+
+_WPR_ARCHIVE_PATH = os.path.join(os.path.dirname(__file__),
+                                 'popular_urls_000.wpr')
+_POPULAR_URLS = [
+    'http://www.google.com/',
+    'http://www.facebook.com/',
+    'http://www.youtube.com/',
+    'http://www.yahoo.com/',
+    'http://www.baidu.com/',
+    'http://www.wikipedia.org/',
+    'http://www.live.com/',
+    'http://www.twitter.com/',
+    'http://www.qq.com/',
+    'http://www.amazon.com/',
+    'http://www.blogspot.com/',
+    'http://www.linkedin.com/',
+    'http://www.google.co.in/',
+    'http://www.taobao.com/',
+    'http://www.sina.com.cn/',
+    'http://www.yahoo.co.jp/',
+    'http://www.msn.com/',
+    'http://www.wordpress.com/',
+    'http://www.t.co/',
+    'http://www.google.de/',
+    'http://www.google.com.hk/',
+    'http://www.ebay.com/',
+    'http://www.googleusercontent.com/',
+    'http://www.google.co.uk/',
+    'http://www.google.co.jp/',
+    'http://www.yandex.ru/',
+    'http://www.163.com/',
+    'http://www.google.fr/',
+    'http://www.weibo.com/',
+    'http://www.bing.com/',
+    'http://www.microsoft.com/',
+    'http://www.google.com.br/',
+    'http://www.mail.ru/',
+    'http://www.tumblr.com/',
+    'http://www.pinterest.com/',
+    'http://www.paypal.com/',
+    'http://www.apple.com/',
+    'http://www.google.it/',
+    'http://www.blogger.com/',
+    'http://www.babylon.com/',
+    'http://www.google.es/',
+    'http://www.google.ru/',
+    'http://www.craigslist.org/',
+    'http://www.sohu.com/',
+    'http://www.imdb.com/',
+    'http://www.flickr.com/',
+    'http://www.bbc.co.uk/',
+    'http://www.xvideos.com/',
+    'http://www.fc2.com/',
+    'http://www.go.com/',
+    'http://www.xhamster.com/',
+    'http://www.ask.com/',
+    'http://www.ifeng.com/',
+    'http://www.google.com.mx/',
+    'http://www.youku.com/',
+    'http://www.google.ca/',
+    'http://www.livejasmin.com/',
+    'http://www.tmall.com/',
+    'http://www.zedo.com/',
+    'http://www.imgur.com/',
+    'http://www.conduit.com/',
+    'http://www.odnoklassniki.ru/',
+    'http://www.cnn.com/',
+    'http://www.adobe.com/',
+    'http://www.google.co.id/',
+    'http://www.mediafire.com/',
+    'http://www.thepiratebay.se/',
+    'http://www.pornhub.com/',
+    'http://www.aol.com/',
+    'http://www.hao123.com/',
+    'http://www.espn.go.com/',
+    'http://www.alibaba.com/',
+    'http://www.ebay.de/',
+    'http://www.google.com.tr/',
+    'http://www.rakuten.co.jp/',
+    'http://www.about.com/',
+    'http://www.avg.com/',
+    'http://www.google.com.au/',
+    'http://www.blogspot.in/',
+    'http://www.wordpress.org/',
+    'http://www.chinaz.com/',
+    'http://www.ameblo.jp/',
+    'http://www.ebay.co.uk/',
+    'http://www.godaddy.com/',
+    'http://www.amazon.de/',
+    'http://www.google.pl/',
+    'http://www.uol.com.br/',
+    'http://www.360buy.com/',
+    'http://www.stackoverflow.com/',
+    'http://www.amazon.co.jp/',
+    'http://www.bp.blogspot.com/',
+    'http://www.dailymotion.com/',
+    'http://www.huffingtonpost.com/',
+    'http://www.4shared.com/',
+    'http://www.mercadolivre.com.br/',
+    'http://www.vagalume.com.br/',
+    'http://www.letras.mus.br/',
+    'http://www.abril.com.br/',
+    'http://www.detik.com/',
+    'http://www.stafaband.info/',
+    'http://www.kaskus.co.id/',
+    'http://www.tribunnews.com/',
+    'http://www.kompas.com/',
+    'http://www.indianrail.gov.in/',
+    'http://www.flipkart.com/',
+    'http://www.snapdeal.com/',
+    'http://www.espncricinfo.com/',
+    'http://www.amazon.in/',
+]
+
+
+def ConvertPathToTestName(url):
+  return url.replace('.', '_').replace('/', '').replace(':', '')
+
+
+class PopularUrlsTest(
+    serially_executed_browser_test_case.SeriallyExecutedBrowserTestCase):
+
+  @classmethod
+  def GenerateTestCases_PageLoadTest(cls, options):
+    # pylint: disable=unused-argument
+    for url in _POPULAR_URLS:
+      yield 'page_load_%s' % ConvertPathToTestName(url), [url]
+
+  def PageLoadTest(self, url):
+    self.action_runner.Navigate(url)
+
+  @classmethod
+  def setUpClass(cls):
+    super(cls, PopularUrlsTest).setUpClass()
+    cls.SetBrowserOptions(cls._finder_options)
+    cls.StartWPRServer(archive_path=_WPR_ARCHIVE_PATH,
+                       archive_bucket=cloud_storage.PARTNER_BUCKET)
+    cls.StartBrowser()
+    cls.action_runner = cls.browser.tabs[0].action_runner
+
+  @classmethod
+  def tearDownClass(cls):
+    super(cls, PopularUrlsTest).tearDownClass()
+    cls.StopWPRServer()
diff --git a/chrome/test/android/telemetry_tests/browser_tests/popular_urls_000.wpr.sha1 b/chrome/test/android/telemetry_tests/browser_tests/popular_urls_000.wpr.sha1
new file mode 100644
index 0000000..5fe52c4
--- /dev/null
+++ b/chrome/test/android/telemetry_tests/browser_tests/popular_urls_000.wpr.sha1
@@ -0,0 +1 @@
+7e232ea57976e67721540ae227265ac08686dd25
\ No newline at end of file
diff --git a/chrome/test/android/telemetry_tests/pylintrc b/chrome/test/android/telemetry_tests/pylintrc
new file mode 100644
index 0000000..b3ab9b775
--- /dev/null
+++ b/chrome/test/android/telemetry_tests/pylintrc
@@ -0,0 +1,23 @@
+[BASIC]
+
+function-rgx=[A-Z_][a-zA-Z0-9_]{2,30}$
+method-rgx=[a-z_][a-zA-Z0-9_]{2,30}$
+
+good-names=e,f,i,j,k,main,_
+
+[FORMAT]
+
+indent-string='  '
+max-line-length=80
+
+[MESSAGES CONTROL]
+
+disable=invalid-name,missing-docstring,too-few-public-methods,too-many-arguments,too-many-branches,too-many-instance-attributes,too-many-lines,too-many-locals,too-many-public-methods,too-many-statements,
+
+[REPORTS]
+
+reports=no
+
+[VARIABLES]
+
+dummy-variables-rgx=^_.*$|dummy
diff --git a/chrome/test/android/telemetry_tests/run_chrome_browser_tests.py b/chrome/test/android/telemetry_tests/run_chrome_browser_tests.py
new file mode 100755
index 0000000..6e310b1
--- /dev/null
+++ b/chrome/test/android/telemetry_tests/run_chrome_browser_tests.py
@@ -0,0 +1,30 @@
+#!/usr/bin/env python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import sys
+
+CHROMIUM_SRC_DIR = os.path.abspath(
+    os.path.join(os.path.dirname(__file__), '..', '..', '..', '..'))
+PERF_DIR = os.path.join(CHROMIUM_SRC_DIR, 'tools', 'perf')
+sys.path.append(PERF_DIR)
+
+from chrome_telemetry_build import chromium_config
+sys.path.append(chromium_config.GetTelemetryDir())
+
+from telemetry import project_config
+from telemetry.testing import browser_test_runner
+
+
+def main():
+  options = browser_test_runner.TestRunOptions()
+  config = project_config.ProjectConfig(
+      top_level_dir=os.path.dirname(__file__),
+      benchmark_dirs=[os.path.join(os.path.dirname(__file__), 'browser_tests')])
+  return browser_test_runner.Run(config, options, sys.argv[1:])
+
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/chrome/test/data/prerender/form_that_posts_to_prerendered_echoall.html b/chrome/test/data/prerender/form_that_posts_to_prerendered_echoall.html
new file mode 100644
index 0000000..7fb872d5
--- /dev/null
+++ b/chrome/test/data/prerender/form_that_posts_to_prerendered_echoall.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <link rel="prerender" href="/echoall">
+  </head>
+  <body>
+    <form id="form" method="POST" action="/echoall">
+      <input type="text" name="text" value="value">
+      <input type="submit">
+    </form>
+  </body>
+</html>
diff --git a/chrome/tools/build/mac/clean_up_old_versions.py b/chrome/tools/build/mac/clean_up_old_versions.py
new file mode 100644
index 0000000..21d462c
--- /dev/null
+++ b/chrome/tools/build/mac/clean_up_old_versions.py
@@ -0,0 +1,34 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import optparse
+import os
+import shutil
+import sys
+
+
+def CleanUpOldVersions(path_to_app, keep_version, stamp_path):
+  versions_dir = os.path.join(path_to_app, 'Contents', 'Versions')
+  if os.path.exists(versions_dir):
+    for version in os.listdir(versions_dir):
+      if version != keep_version:
+        shutil.rmtree(os.path.join(versions_dir, version))
+
+  open(stamp_path, 'w').close()
+  os.utime(stamp_path, None)
+
+
+def Main():
+  parser = optparse.OptionParser(
+      usage='%prog path/to/Chromium.app keep_version stamp_path')
+  opts, args = parser.parse_args()
+  if len(args) != 3:
+    parser.error('missing arguments')
+    return 1
+
+  CleanUpOldVersions(*args)
+  return 0
+
+if __name__ == '__main__':
+  sys.exit(Main())
diff --git a/chromecast/browser/media/cast_browser_cdm_factory.cc b/chromecast/browser/media/cast_browser_cdm_factory.cc
index c9298c85..45606ec 100644
--- a/chromecast/browser/media/cast_browser_cdm_factory.cc
+++ b/chromecast/browser/media/cast_browser_cdm_factory.cc
@@ -53,7 +53,7 @@
   if (cast_key_system == chromecast::media::KEY_SYSTEM_CLEAR_KEY) {
     // TODO(gunsch): handle ClearKey decryption. See crbug.com/441957
   } else {
-    cast_cdm = CreatePlatformBrowserCdm(cast_key_system);
+    cast_cdm = CreatePlatformBrowserCdm(cast_key_system, security_origin);
   }
 
   if (!cast_cdm) {
@@ -81,7 +81,8 @@
 }
 
 scoped_refptr<CastCdm> CastBrowserCdmFactory::CreatePlatformBrowserCdm(
-    const CastKeySystem& cast_key_system) {
+    const CastKeySystem& cast_key_system,
+    const GURL& security_origin) {
   return nullptr;
 }
 
diff --git a/chromecast/browser/media/cast_browser_cdm_factory.h b/chromecast/browser/media/cast_browser_cdm_factory.h
index 1e3d138..b8c90e1 100644
--- a/chromecast/browser/media/cast_browser_cdm_factory.h
+++ b/chromecast/browser/media/cast_browser_cdm_factory.h
@@ -41,7 +41,8 @@
 
   // Provides a platform-specific BrowserCdm instance.
   virtual scoped_refptr<CastCdm> CreatePlatformBrowserCdm(
-      const CastKeySystem& cast_key_system);
+      const CastKeySystem& cast_key_system,
+      const GURL& security_origin);
 
  protected:
   MediaResourceTracker* media_resource_tracker_;
diff --git a/chromecast/media/cdm/BUILD.gn b/chromecast/media/cdm/BUILD.gn
index c6a21eba..ee79ca0 100644
--- a/chromecast/media/cdm/BUILD.gn
+++ b/chromecast/media/cdm/BUILD.gn
@@ -23,6 +23,7 @@
     "//base",
     "//chromecast/media/base",
     "//media",
+    "//url:url",
   ]
 
   if (is_android && use_playready) {
diff --git a/chromecast/media/cdm/cast_cdm.cc b/chromecast/media/cdm/cast_cdm.cc
index 5125648..958448b 100644
--- a/chromecast/media/cdm/cast_cdm.cc
+++ b/chromecast/media/cdm/cast_cdm.cc
@@ -16,6 +16,7 @@
 #include "media/base/cdm_key_information.h"
 #include "media/base/decryptor.h"
 #include "media/cdm/player_tracker_impl.h"
+#include "url/gurl.h"
 
 namespace chromecast {
 namespace media {
@@ -109,9 +110,8 @@
 
 void CastCdm::OnSessionMessage(const std::string& session_id,
                                const std::vector<uint8_t>& message,
-                               const GURL& destination_url,
                                ::media::MediaKeys::MessageType message_type) {
-  session_message_cb_.Run(session_id, message_type, message, destination_url);
+  session_message_cb_.Run(session_id, message_type, message, GURL::EmptyGURL());
 }
 
 void CastCdm::OnSessionClosed(const std::string& session_id) {
diff --git a/chromecast/media/cdm/cast_cdm.h b/chromecast/media/cdm/cast_cdm.h
index e9c7512..55a69110 100644
--- a/chromecast/media/cdm/cast_cdm.h
+++ b/chromecast/media/cdm/cast_cdm.h
@@ -77,7 +77,6 @@
 
   void OnSessionMessage(const std::string& session_id,
                         const std::vector<uint8_t>& message,
-                        const GURL& destination_url,
                         ::media::MediaKeys::MessageType message_type);
   void OnSessionClosed(const std::string& session_id);
   void OnSessionKeysChange(const std::string& session_id,
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 3a8e498a..3d0bdad 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-8630.0.0
\ No newline at end of file
+8634.0.0
\ No newline at end of file
diff --git a/chromeos/network/OWNERS b/chromeos/network/OWNERS
index 1debcec..c1a3ed3 100644
--- a/chromeos/network/OWNERS
+++ b/chromeos/network/OWNERS
@@ -2,5 +2,4 @@
 
 armansito@chromium.org
 cschuet@chromium.org
-gauravsh@chromium.org
 stevenjb@chromium.org
diff --git a/components/arc/bluetooth/arc_bluetooth_bridge.cc b/components/arc/bluetooth/arc_bluetooth_bridge.cc
index 06b4ea7..29b92d8 100644
--- a/components/arc/bluetooth/arc_bluetooth_bridge.cc
+++ b/components/arc/bluetooth/arc_bluetooth_bridge.cc
@@ -22,14 +22,12 @@
 #include "base/time/time.h"
 #include "components/arc/arc_bridge_service.h"
 #include "components/arc/bluetooth/bluetooth_type_converters.h"
-#include "device/bluetooth/bluetooth_adapter_factory.h"
 #include "device/bluetooth/bluetooth_common.h"
 #include "device/bluetooth/bluetooth_device.h"
 #include "device/bluetooth/bluetooth_gatt_connection.h"
 #include "device/bluetooth/bluetooth_gatt_notify_session.h"
-#include "device/bluetooth/bluetooth_remote_gatt_characteristic.h"
-#include "device/bluetooth/bluetooth_remote_gatt_descriptor.h"
-#include "device/bluetooth/bluetooth_remote_gatt_service.h"
+#include "device/bluetooth/bluetooth_local_gatt_characteristic.h"
+#include "device/bluetooth/bluetooth_local_gatt_descriptor.h"
 #include "mojo/edk/embedder/embedder.h"
 #include "mojo/edk/embedder/scoped_platform_handle.h"
 
@@ -44,14 +42,19 @@
 using device::BluetoothGattCharacteristic;
 using device::BluetoothGattDescriptor;
 using device::BluetoothGattService;
+using device::BluetoothLocalGattCharacteristic;
+using device::BluetoothLocalGattDescriptor;
+using device::BluetoothLocalGattService;
 using device::BluetoothRemoteGattCharacteristic;
 using device::BluetoothRemoteGattDescriptor;
 using device::BluetoothRemoteGattService;
+using device::BluetoothTransport;
 using device::BluetoothUUID;
 
 namespace {
 constexpr int32_t kMinBtleVersion = 1;
 constexpr int32_t kMinBtleNotifyVersion = 2;
+constexpr int32_t kMinGattServerVersion = 3;
 constexpr uint32_t kGattReadPermission =
     BluetoothGattCharacteristic::Permission::PERMISSION_READ |
     BluetoothGattCharacteristic::Permission::PERMISSION_READ_ENCRYPTED |
@@ -62,6 +65,114 @@
     BluetoothGattCharacteristic::Permission::PERMISSION_WRITE_ENCRYPTED |
     BluetoothGattCharacteristic::Permission::
         PERMISSION_WRITE_ENCRYPTED_AUTHENTICATED;
+constexpr int32_t kInvalidGattAttributeHandle = -1;
+// Bluetooth Specification Version 4.2 Vol 3 Part F Section 3.2.2
+// An attribute handle of value 0xFFFF is known as the maximum attribute handle.
+constexpr int32_t kMaxGattAttributeHandle = 0xFFFF;
+// Bluetooth Specification Version 4.2 Vol 3 Part F Section 3.2.9
+// The maximum length of an attribute value shall be 512 octets.
+constexpr int kMaxGattAttributeLength = 512;
+
+using GattStatusCallback =
+    base::Callback<void(arc::mojom::BluetoothGattStatus)>;
+using GattReadCallback =
+    base::Callback<void(arc::mojom::BluetoothGattValuePtr)>;
+
+// Example of identifier: /org/bluez/hci0/dev_E0_CF_65_8C_86_1A/service001a
+// Convert the last 4 characters of |identifier| to an
+// int, by interpreting them as hexadecimal digits.
+int ConvertGattIdentifierToId(const std::string identifier) {
+  return std::stoi(identifier.substr(identifier.size() - 4), nullptr, 16);
+}
+
+// Create GattDBElement and fill in common data for
+// Gatt Service/Characteristic/Descriptor.
+template <class RemoteGattAttribute>
+arc::mojom::BluetoothGattDBElementPtr CreateGattDBElement(
+    const arc::mojom::BluetoothGattDBAttributeType type,
+    const RemoteGattAttribute* attribute) {
+  arc::mojom::BluetoothGattDBElementPtr element =
+      arc::mojom::BluetoothGattDBElement::New();
+  element->type = type;
+  element->uuid = arc::mojom::BluetoothUUID::From(attribute->GetUUID());
+  element->id = element->attribute_handle = element->start_handle =
+      element->end_handle =
+          ConvertGattIdentifierToId(attribute->GetIdentifier());
+  element->properties = 0;
+  return element;
+}
+
+template <class RemoteGattAttribute>
+RemoteGattAttribute* FindGattAttributeByUuid(
+    const std::vector<RemoteGattAttribute*>& attributes,
+    const BluetoothUUID& uuid) {
+  auto it = std::find_if(
+      attributes.begin(), attributes.end(),
+      [uuid](RemoteGattAttribute* attr) { return attr->GetUUID() == uuid; });
+  return it != attributes.end() ? *it : nullptr;
+}
+
+// Common success callback for GATT operations that only need to report
+// GattStatus back to Android.
+void OnGattOperationDone(const GattStatusCallback& callback) {
+  callback.Run(arc::mojom::BluetoothGattStatus::GATT_SUCCESS);
+}
+
+// Common error callback for GATT operations that only need to report
+// GattStatus back to Android.
+void OnGattOperationError(const GattStatusCallback& callback,
+                          BluetoothGattService::GattErrorCode error_code) {
+  callback.Run(mojo::ConvertTo<arc::mojom::BluetoothGattStatus>(error_code));
+}
+
+// Common success callback for ReadGattCharacteristic and ReadGattDescriptor
+void OnGattReadDone(const GattReadCallback& callback,
+                    const std::vector<uint8_t>& result) {
+  arc::mojom::BluetoothGattValuePtr gattValue =
+      arc::mojom::BluetoothGattValue::New();
+  gattValue->status = arc::mojom::BluetoothGattStatus::GATT_SUCCESS;
+  gattValue->value = mojo::Array<uint8_t>::From(result);
+  callback.Run(std::move(gattValue));
+}
+
+// Common error callback for ReadGattCharacteristic and ReadGattDescriptor
+void OnGattReadError(const GattReadCallback& callback,
+                     BluetoothGattService::GattErrorCode error_code) {
+  arc::mojom::BluetoothGattValuePtr gattValue =
+      arc::mojom::BluetoothGattValue::New();
+  gattValue->status =
+      mojo::ConvertTo<arc::mojom::BluetoothGattStatus>(error_code);
+  gattValue->value = nullptr;
+  callback.Run(std::move(gattValue));
+}
+
+// Callback function for mojom::BluetoothInstance::RequestGattRead
+void OnGattServerRead(
+    const BluetoothLocalGattService::Delegate::ValueCallback& success_callback,
+    const BluetoothLocalGattService::Delegate::ErrorCallback& error_callback,
+    arc::mojom::BluetoothGattStatus status,
+    mojo::Array<uint8_t> value) {
+  if (status == arc::mojom::BluetoothGattStatus::GATT_SUCCESS)
+    success_callback.Run(value.To<std::vector<uint8_t>>());
+  else
+    error_callback.Run();
+}
+
+// Callback function for mojom::BluetoothInstance::RequestGattWrite
+void OnGattServerWrite(
+    const base::Closure& success_callback,
+    const BluetoothLocalGattService::Delegate::ErrorCallback& error_callback,
+    arc::mojom::BluetoothGattStatus status) {
+  if (status == arc::mojom::BluetoothGattStatus::GATT_SUCCESS)
+    success_callback.Run();
+  else
+    error_callback.Run();
+}
+
+bool IsGattOffsetValid(int offset) {
+  return 0 <= offset && offset < kMaxGattAttributeLength;
+}
+
 }  // namespace
 
 namespace arc {
@@ -80,6 +191,8 @@
 }
 
 ArcBluetoothBridge::~ArcBluetoothBridge() {
+  DCHECK(CalledOnValidThread());
+
   arc_bridge_service()->bluetooth()->RemoveObserver(this);
 
   if (bluetooth_adapter_)
@@ -88,6 +201,8 @@
 
 void ArcBluetoothBridge::OnAdapterInitialized(
     scoped_refptr<BluetoothAdapter> adapter) {
+  DCHECK(CalledOnValidThread());
+
   // We can downcast here because we are always running on Chrome OS, and
   // so our adapter uses BlueZ.
   bluetooth_adapter_ =
@@ -106,15 +221,6 @@
   bluetooth_instance->Init(binding_.CreateInterfacePtrAndBind());
 }
 
-void ArcBluetoothBridge::AdapterPresentChanged(BluetoothAdapter* adapter,
-                                               bool present) {
-  // If the adapter goes away, remove ourselves as an observer.
-  if (!present && adapter == bluetooth_adapter_) {
-    adapter->RemoveObserver(this);
-    bluetooth_adapter_ = nullptr;
-  }
-}
-
 void ArcBluetoothBridge::AdapterPoweredChanged(BluetoothAdapter* adapter,
                                                bool powered) {
   if (!HasBluetoothInstance())
@@ -293,6 +399,104 @@
   // Placeholder for GATT client functionality
 }
 
+template <class LocalGattAttribute>
+void ArcBluetoothBridge::OnGattAttributeReadRequest(
+    const BluetoothDevice* device,
+    const LocalGattAttribute* attribute,
+    int offset,
+    const ValueCallback& success_callback,
+    const ErrorCallback& error_callback) {
+  DCHECK(CalledOnValidThread());
+  if (!HasBluetoothInstance() ||
+      !CheckBluetoothInstanceVersion(kMinGattServerVersion) ||
+      !IsGattOffsetValid(offset)) {
+    error_callback.Run();
+    return;
+  }
+
+  DCHECK(gatt_handle_.find(attribute->GetIdentifier()) != gatt_handle_.end());
+
+  arc_bridge_service()->bluetooth()->instance()->RequestGattRead(
+      mojom::BluetoothAddress::From(device->GetAddress()),
+      gatt_handle_[attribute->GetIdentifier()], offset, false /* is_long */,
+      base::Bind(&OnGattServerRead, success_callback, error_callback));
+}
+
+template <class LocalGattAttribute>
+void ArcBluetoothBridge::OnGattAttributeWriteRequest(
+    const BluetoothDevice* device,
+    const LocalGattAttribute* attribute,
+    const std::vector<uint8_t>& value,
+    int offset,
+    const base::Closure& success_callback,
+    const ErrorCallback& error_callback) {
+  DCHECK(CalledOnValidThread());
+  if (!HasBluetoothInstance() ||
+      !CheckBluetoothInstanceVersion(kMinGattServerVersion) ||
+      !IsGattOffsetValid(offset)) {
+    error_callback.Run();
+    return;
+  }
+
+  DCHECK(gatt_handle_.find(attribute->GetIdentifier()) != gatt_handle_.end());
+
+  arc_bridge_service()->bluetooth()->instance()->RequestGattWrite(
+      mojom::BluetoothAddress::From(device->GetAddress()),
+      gatt_handle_[attribute->GetIdentifier()], offset,
+      mojo::Array<uint8_t>::From(value),
+      base::Bind(&OnGattServerWrite, success_callback, error_callback));
+}
+
+void ArcBluetoothBridge::OnCharacteristicReadRequest(
+    const BluetoothDevice* device,
+    const BluetoothLocalGattCharacteristic* characteristic,
+    int offset,
+    const ValueCallback& callback,
+    const ErrorCallback& error_callback) {
+  OnGattAttributeReadRequest(device, characteristic, offset, callback,
+                             error_callback);
+}
+
+void ArcBluetoothBridge::OnCharacteristicWriteRequest(
+    const BluetoothDevice* device,
+    const BluetoothLocalGattCharacteristic* characteristic,
+    const std::vector<uint8_t>& value,
+    int offset,
+    const base::Closure& callback,
+    const ErrorCallback& error_callback) {
+  OnGattAttributeWriteRequest(device, characteristic, value, offset, callback,
+                              error_callback);
+}
+
+void ArcBluetoothBridge::OnDescriptorReadRequest(
+    const BluetoothDevice* device,
+    const BluetoothLocalGattDescriptor* descriptor,
+    int offset,
+    const ValueCallback& callback,
+    const ErrorCallback& error_callback) {
+  OnGattAttributeReadRequest(device, descriptor, offset, callback,
+                             error_callback);
+}
+
+void ArcBluetoothBridge::OnDescriptorWriteRequest(
+    const BluetoothDevice* device,
+    const BluetoothLocalGattDescriptor* descriptor,
+    const std::vector<uint8_t>& value,
+    int offset,
+    const base::Closure& callback,
+    const ErrorCallback& error_callback) {
+  OnGattAttributeWriteRequest(device, descriptor, value, offset, callback,
+                              error_callback);
+}
+
+void ArcBluetoothBridge::OnNotificationsStart(
+    const BluetoothDevice* device,
+    const BluetoothLocalGattCharacteristic* characteristic) {}
+
+void ArcBluetoothBridge::OnNotificationsStop(
+    const BluetoothDevice* device,
+    const BluetoothLocalGattCharacteristic* characteristic) {}
+
 void ArcBluetoothBridge::EnableAdapter(const EnableAdapterCallback& callback) {
   DCHECK(bluetooth_adapter_);
   if (!bluetooth_adapter_->IsPowered()) {
@@ -659,6 +863,7 @@
 void ArcBluetoothBridge::OnStartLEListenDone(
     const StartLEListenCallback& callback,
     scoped_refptr<BluetoothAdvertisement> advertisement) {
+  DCHECK(CalledOnValidThread());
   advertisment_ = advertisement;
   callback.Run(mojom::BluetoothGattStatus::GATT_SUCCESS);
 }
@@ -666,11 +871,13 @@
 void ArcBluetoothBridge::OnStartLEListenError(
     const StartLEListenCallback& callback,
     BluetoothAdvertisement::ErrorCode error_code) {
+  DCHECK(CalledOnValidThread());
   advertisment_ = nullptr;
   callback.Run(mojom::BluetoothGattStatus::GATT_FAILURE);
 }
 
 void ArcBluetoothBridge::StartLEListen(const StartLEListenCallback& callback) {
+  DCHECK(CalledOnValidThread());
   std::unique_ptr<BluetoothAdvertisement::Data> adv_data =
       base::WrapUnique(new BluetoothAdvertisement::Data(
           BluetoothAdvertisement::ADVERTISEMENT_TYPE_BROADCAST));
@@ -683,6 +890,7 @@
 
 void ArcBluetoothBridge::OnStopLEListenDone(
     const StopLEListenCallback& callback) {
+  DCHECK(CalledOnValidThread());
   advertisment_ = nullptr;
   callback.Run(mojom::BluetoothGattStatus::GATT_SUCCESS);
 }
@@ -690,6 +898,7 @@
 void ArcBluetoothBridge::OnStopLEListenError(
     const StopLEListenCallback& callback,
     BluetoothAdvertisement::ErrorCode error_code) {
+  DCHECK(CalledOnValidThread());
   advertisment_ = nullptr;
   callback.Run(mojom::BluetoothGattStatus::GATT_FAILURE);
 }
@@ -707,30 +916,6 @@
                                        weak_factory_.GetWeakPtr(), callback));
 }
 
-// Example of identifier: /org/bluez/hci0/dev_E0_CF_65_8C_86_1A/service001a
-// We want to convert last digit of the identifier to int in base 16
-int ArcBluetoothBridge::ConvertGattIdentifierToId(
-    const std::string identifier) const {
-  return std::stoi(identifier.substr(identifier.size() - 4), nullptr, 16);
-}
-
-// Create GattDBElement and fill in common data for
-// Gatt Service/Characteristic/Descriptor.
-template <class T>
-mojom::BluetoothGattDBElementPtr ArcBluetoothBridge::CreateGattDBElement(
-    const mojom::BluetoothGattDBAttributeType type,
-    const T* gattObject) const {
-  mojom::BluetoothGattDBElementPtr element =
-      mojom::BluetoothGattDBElement::New();
-  element->type = type;
-  element->uuid = mojom::BluetoothUUID::From(gattObject->GetUUID());
-  element->id = element->attribute_handle = element->start_handle =
-      element->end_handle =
-          ConvertGattIdentifierToId(gattObject->GetIdentifier());
-  element->properties = 0;
-  return element;
-}
-
 void ArcBluetoothBridge::GetGattDB(mojom::BluetoothAddressPtr remote_addr) {
   if (!HasBluetoothInstance())
     return;
@@ -739,8 +924,7 @@
       bluetooth_adapter_->GetDevice(remote_addr->To<std::string>());
   mojo::Array<mojom::BluetoothGattDBElementPtr> db;
   for (auto* service : device->GetGattServices()) {
-    mojom::BluetoothGattDBElementPtr service_element = CreateGattDBElement<
-        device::BluetoothRemoteGattService>(
+    mojom::BluetoothGattDBElementPtr service_element = CreateGattDBElement(
         service->IsPrimary()
             ? mojom::BluetoothGattDBAttributeType::BTGATT_DB_PRIMARY_SERVICE
             : mojom::BluetoothGattDBAttributeType::BTGATT_DB_SECONDARY_SERVICE,
@@ -759,14 +943,14 @@
 
     for (auto* characteristic : characteristics) {
       mojom::BluetoothGattDBElementPtr characteristic_element =
-          CreateGattDBElement<device::BluetoothRemoteGattCharacteristic>(
+          CreateGattDBElement(
               mojom::BluetoothGattDBAttributeType::BTGATT_DB_CHARACTERISTIC,
               characteristic);
       characteristic_element->properties = characteristic->GetProperties();
       db.push_back(std::move(characteristic_element));
 
       for (auto* descriptor : characteristic->GetDescriptors()) {
-        db.push_back(CreateGattDBElement<device::BluetoothRemoteGattDescriptor>(
+        db.push_back(CreateGattDBElement(
             mojom::BluetoothGattDBAttributeType::BTGATT_DB_DESCRIPTOR,
             descriptor));
       }
@@ -777,18 +961,6 @@
       std::move(remote_addr), std::move(db));
 }
 
-// Find Gatt Service/Characteristic/Descriptor from std::vector from UUID.
-template <class T>
-T* ArcBluetoothBridge::FindGattObjectFromUuid(
-    const std::vector<T*> gatt_objs,
-    const device::BluetoothUUID uuid) const {
-  auto it = std::find_if(gatt_objs.begin(), gatt_objs.end(),
-                         [&](T* obj) { return obj->GetUUID() == uuid; });
-  if (it == gatt_objs.end())
-    return nullptr;
-  return *it;
-}
-
 BluetoothRemoteGattCharacteristic* ArcBluetoothBridge::FindGattCharacteristic(
     mojom::BluetoothAddressPtr remote_addr,
     mojom::BluetoothGattServiceIDPtr service_id,
@@ -802,14 +974,13 @@
   if (!device)
     return nullptr;
 
-  BluetoothRemoteGattService* service =
-      FindGattObjectFromUuid<BluetoothRemoteGattService>(
-          device->GetGattServices(), service_id->id->uuid.To<BluetoothUUID>());
+  BluetoothRemoteGattService* service = FindGattAttributeByUuid(
+      device->GetGattServices(), service_id->id->uuid.To<BluetoothUUID>());
   if (!service)
     return nullptr;
 
-  return FindGattObjectFromUuid<BluetoothRemoteGattCharacteristic>(
-      service->GetCharacteristics(), char_id->uuid.To<BluetoothUUID>());
+  return FindGattAttributeByUuid(service->GetCharacteristics(),
+                                 char_id->uuid.To<BluetoothUUID>());
 }
 
 BluetoothRemoteGattDescriptor* ArcBluetoothBridge::FindGattDescriptor(
@@ -822,40 +993,8 @@
   if (!characteristic)
     return nullptr;
 
-  return FindGattObjectFromUuid<BluetoothRemoteGattDescriptor>(
-      characteristic->GetDescriptors(), desc_id->uuid.To<BluetoothUUID>());
-}
-
-// Same callback for both ReadGattCharacteristic and ReadGattDescriptor
-void ArcBluetoothBridge::OnGattReadDone(
-    const GattReadCallback& callback,
-    const std::vector<uint8_t>& result) const {
-  mojom::BluetoothGattValuePtr gattValue = mojom::BluetoothGattValue::New();
-  gattValue->status = mojom::BluetoothGattStatus::GATT_SUCCESS;
-  gattValue->value = mojo::Array<uint8_t>::From(result);
-  callback.Run(std::move(gattValue));
-}
-
-void ArcBluetoothBridge::OnGattReadError(
-    const GattReadCallback& callback,
-    BluetoothGattService::GattErrorCode error_code) const {
-  mojom::BluetoothGattValuePtr gattValue = mojom::BluetoothGattValue::New();
-  gattValue->status = mojo::ConvertTo<mojom::BluetoothGattStatus>(error_code);
-  gattValue->value = nullptr;
-
-  callback.Run(std::move(gattValue));
-}
-
-// Same callback for both WriteGattCharacteristic and WriteGattDescriptor
-void ArcBluetoothBridge::OnGattWriteDone(
-    const GattWriteCallback& callback) const {
-  callback.Run(mojom::BluetoothGattStatus::GATT_SUCCESS);
-}
-
-void ArcBluetoothBridge::OnGattWriteError(
-    const GattWriteCallback& callback,
-    BluetoothGattService::GattErrorCode error_code) const {
-  callback.Run(mojo::ConvertTo<mojom::BluetoothGattStatus>(error_code));
+  return FindGattAttributeByUuid(characteristic->GetDescriptors(),
+                                 desc_id->uuid.To<BluetoothUUID>());
 }
 
 void ArcBluetoothBridge::ReadGattCharacteristic(
@@ -869,10 +1008,8 @@
   DCHECK(characteristic->GetPermissions() & kGattReadPermission);
 
   characteristic->ReadRemoteCharacteristic(
-      base::Bind(&ArcBluetoothBridge::OnGattReadDone,
-                 weak_factory_.GetWeakPtr(), callback),
-      base::Bind(&ArcBluetoothBridge::OnGattReadError,
-                 weak_factory_.GetWeakPtr(), callback));
+      base::Bind(&OnGattReadDone, callback),
+      base::Bind(&OnGattReadError, callback));
 }
 
 void ArcBluetoothBridge::WriteGattCharacteristic(
@@ -888,10 +1025,8 @@
 
   characteristic->WriteRemoteCharacteristic(
       value->value.To<std::vector<uint8_t>>(),
-      base::Bind(&ArcBluetoothBridge::OnGattWriteDone,
-                 weak_factory_.GetWeakPtr(), callback),
-      base::Bind(&ArcBluetoothBridge::OnGattWriteError,
-                 weak_factory_.GetWeakPtr(), callback));
+      base::Bind(&OnGattOperationDone, callback),
+      base::Bind(&OnGattOperationError, callback));
 }
 
 void ArcBluetoothBridge::ReadGattDescriptor(
@@ -906,11 +1041,8 @@
   DCHECK(descriptor);
   DCHECK(descriptor->GetPermissions() & kGattReadPermission);
 
-  descriptor->ReadRemoteDescriptor(
-      base::Bind(&ArcBluetoothBridge::OnGattReadDone,
-                 weak_factory_.GetWeakPtr(), callback),
-      base::Bind(&ArcBluetoothBridge::OnGattReadError,
-                 weak_factory_.GetWeakPtr(), callback));
+  descriptor->ReadRemoteDescriptor(base::Bind(&OnGattReadDone, callback),
+                                   base::Bind(&OnGattReadError, callback));
 }
 
 void ArcBluetoothBridge::WriteGattDescriptor(
@@ -935,37 +1067,25 @@
   // TODO(http://crbug.com/622832)
   if (descriptor->GetUUID() ==
       BluetoothGattDescriptor::ClientCharacteristicConfigurationUuid()) {
-    OnGattWriteDone(callback);
+    OnGattOperationDone(callback);
     return;
   }
 
   descriptor->WriteRemoteDescriptor(
       value->value.To<std::vector<uint8_t>>(),
-      base::Bind(&ArcBluetoothBridge::OnGattWriteDone,
-                 weak_factory_.GetWeakPtr(), callback),
-      base::Bind(&ArcBluetoothBridge::OnGattWriteError,
-                 weak_factory_.GetWeakPtr(), callback));
+      base::Bind(&OnGattOperationDone, callback),
+      base::Bind(&OnGattOperationError, callback));
 }
 
 void ArcBluetoothBridge::OnGattNotifyStartDone(
     const RegisterForGattNotificationCallback& callback,
     const std::string char_string_id,
     std::unique_ptr<BluetoothGattNotifySession> notify_session) {
+  DCHECK(CalledOnValidThread());
   notification_session_[char_string_id] = std::move(notify_session);
   callback.Run(mojom::BluetoothGattStatus::GATT_SUCCESS);
 }
 
-void ArcBluetoothBridge::OnGattNotifyStartError(
-    const RegisterForGattNotificationCallback& callback,
-    BluetoothGattService::GattErrorCode error_code) const {
-  callback.Run(mojo::ConvertTo<mojom::BluetoothGattStatus>(error_code));
-}
-
-void ArcBluetoothBridge::OnGattNotifyStopDone(
-    const DeregisterForGattNotificationCallback& callback) const {
-  callback.Run(mojom::BluetoothGattStatus::GATT_SUCCESS);
-}
-
 void ArcBluetoothBridge::RegisterForGattNotification(
     mojom::BluetoothAddressPtr remote_addr,
     mojom::BluetoothGattServiceIDPtr service_id,
@@ -988,8 +1108,7 @@
       base::Bind(&ArcBluetoothBridge::OnGattNotifyStartDone,
                  weak_factory_.GetWeakPtr(), callback,
                  characteristic->GetIdentifier()),
-      base::Bind(&ArcBluetoothBridge::OnGattNotifyStartError,
-                 weak_factory_.GetWeakPtr(), callback));
+      base::Bind(&OnGattOperationError, callback));
 }
 
 void ArcBluetoothBridge::DeregisterForGattNotification(
@@ -997,6 +1116,8 @@
     mojom::BluetoothGattServiceIDPtr service_id,
     mojom::BluetoothGattIDPtr char_id,
     const DeregisterForGattNotificationCallback& callback) {
+  DCHECK(CalledOnValidThread());
+
   BluetoothRemoteGattCharacteristic* characteristic = FindGattCharacteristic(
       std::move(remote_addr), std::move(service_id), std::move(char_id));
 
@@ -1014,8 +1135,7 @@
   std::unique_ptr<BluetoothGattNotifySession> notify =
       std::move(notification_session_[char_id_str]);
   notification_session_.erase(char_id_str);
-  notify->Stop(base::Bind(&ArcBluetoothBridge::OnGattNotifyStopDone,
-                          weak_factory_.GetWeakPtr(), callback));
+  notify->Stop(base::Bind(&OnGattOperationDone, callback));
 }
 
 void ArcBluetoothBridge::ReadRemoteRssi(
@@ -1050,6 +1170,153 @@
   callback.Run(std::move(scoped_handle));
 }
 
+bool ArcBluetoothBridge::IsGattServerAttributeHandleAvailable(int need) {
+  return gatt_server_attribute_next_handle_ + need <= kMaxGattAttributeHandle;
+}
+
+int32_t ArcBluetoothBridge::GetNextGattServerAttributeHandle() {
+  return IsGattServerAttributeHandleAvailable(1)
+             ? ++gatt_server_attribute_next_handle_
+             : kInvalidGattAttributeHandle;
+}
+
+template <class LocalGattAttribute>
+int32_t ArcBluetoothBridge::CreateGattAttributeHandle(
+    LocalGattAttribute* attribute) {
+  DCHECK(CalledOnValidThread());
+  if (!attribute)
+    return kInvalidGattAttributeHandle;
+  int32_t handle = GetNextGattServerAttributeHandle();
+  if (handle == kInvalidGattAttributeHandle)
+    return kInvalidGattAttributeHandle;
+  const std::string& identifier = attribute->GetIdentifier();
+  gatt_identifier_[handle] = identifier;
+  gatt_handle_[identifier] = handle;
+  return handle;
+}
+
+void ArcBluetoothBridge::AddService(mojom::BluetoothGattServiceIDPtr service_id,
+                                    int32_t num_handles,
+                                    const AddServiceCallback& callback) {
+  if (!IsGattServerAttributeHandleAvailable(num_handles)) {
+    callback.Run(kInvalidGattAttributeHandle);
+    return;
+  }
+  base::WeakPtr<BluetoothLocalGattService> service =
+      BluetoothLocalGattService::Create(
+          bluetooth_adapter_.get(), service_id->id->uuid.To<BluetoothUUID>(),
+          service_id->is_primary, nullptr /* included_service */,
+          this /* delegate */);
+  callback.Run(CreateGattAttributeHandle(service.get()));
+}
+
+void ArcBluetoothBridge::AddCharacteristic(
+    int32_t service_handle,
+    mojom::BluetoothUUIDPtr uuid,
+    int32_t properties,
+    int32_t permissions,
+    const AddCharacteristicCallback& callback) {
+  DCHECK(CalledOnValidThread());
+  DCHECK(gatt_identifier_.find(service_handle) != gatt_identifier_.end());
+  if (!IsGattServerAttributeHandleAvailable(1)) {
+    callback.Run(kInvalidGattAttributeHandle);
+    return;
+  }
+  base::WeakPtr<BluetoothLocalGattCharacteristic> characteristic =
+      BluetoothLocalGattCharacteristic::Create(
+          uuid.To<BluetoothUUID>(), properties, permissions,
+          bluetooth_adapter_->GetGattService(gatt_identifier_[service_handle]));
+  int32_t characteristic_handle =
+      CreateGattAttributeHandle(characteristic.get());
+  last_characteristic_[service_handle] = characteristic_handle;
+  callback.Run(characteristic_handle);
+}
+
+void ArcBluetoothBridge::AddDescriptor(int32_t service_handle,
+                                       mojom::BluetoothUUIDPtr uuid,
+                                       int32_t permissions,
+                                       const AddDescriptorCallback& callback) {
+  DCHECK(CalledOnValidThread());
+  if (!IsGattServerAttributeHandleAvailable(1)) {
+    callback.Run(kInvalidGattAttributeHandle);
+    return;
+  }
+  // Chrome automatically adds a CCC Descriptor to a characteristic when needed.
+  // We will generate a bogus handle for Android.
+  if (uuid.To<BluetoothUUID>() ==
+      BluetoothGattDescriptor::ClientCharacteristicConfigurationUuid()) {
+    int32_t handle = GetNextGattServerAttributeHandle();
+    callback.Run(handle);
+    return;
+  }
+
+  DCHECK(gatt_identifier_.find(service_handle) != gatt_identifier_.end());
+  BluetoothLocalGattService* service =
+      bluetooth_adapter_->GetGattService(gatt_identifier_[service_handle]);
+  DCHECK(service);
+  // Since the Android API does not give information about which characteristic
+  // is the parent of the new descriptor, we assume that it would be the last
+  // characteristic that was added to the given service. This matches the
+  // Android framework code at android/bluetooth/BluetoothGattServer.java#594.
+  // Link: https://goo.gl/cJZl1u
+  DCHECK(last_characteristic_.find(service_handle) !=
+         last_characteristic_.end());
+  int32_t last_characteristic_handle = last_characteristic_[service_handle];
+
+  DCHECK(gatt_identifier_.find(last_characteristic_handle) !=
+         gatt_identifier_.end());
+  BluetoothLocalGattCharacteristic* characteristic =
+      service->GetCharacteristic(gatt_identifier_[last_characteristic_handle]);
+  DCHECK(characteristic);
+
+  base::WeakPtr<BluetoothLocalGattDescriptor> descriptor =
+      BluetoothLocalGattDescriptor::Create(uuid.To<BluetoothUUID>(),
+                                           permissions, characteristic);
+  callback.Run(CreateGattAttributeHandle(descriptor.get()));
+}
+
+void ArcBluetoothBridge::StartService(int32_t service_handle,
+                                      const StartServiceCallback& callback) {
+  DCHECK(CalledOnValidThread());
+  DCHECK(gatt_identifier_.find(service_handle) != gatt_identifier_.end());
+  BluetoothLocalGattService* service =
+      bluetooth_adapter_->GetGattService(gatt_identifier_[service_handle]);
+  DCHECK(service);
+  service->Register(base::Bind(&OnGattOperationDone, callback),
+                    base::Bind(&OnGattOperationError, callback));
+}
+
+void ArcBluetoothBridge::StopService(int32_t service_handle,
+                                     const StopServiceCallback& callback) {
+  DCHECK(CalledOnValidThread());
+  DCHECK(gatt_identifier_.find(service_handle) != gatt_identifier_.end());
+  BluetoothLocalGattService* service =
+      bluetooth_adapter_->GetGattService(gatt_identifier_[service_handle]);
+  DCHECK(service);
+  service->Unregister(base::Bind(&OnGattOperationDone, callback),
+                      base::Bind(&OnGattOperationError, callback));
+}
+
+void ArcBluetoothBridge::DeleteService(int32_t service_handle,
+                                       const DeleteServiceCallback& callback) {
+  DCHECK(CalledOnValidThread());
+  DCHECK(gatt_identifier_.find(service_handle) != gatt_identifier_.end());
+  BluetoothLocalGattService* service =
+      bluetooth_adapter_->GetGattService(gatt_identifier_[service_handle]);
+  DCHECK(service);
+  gatt_identifier_.erase(service_handle);
+  gatt_handle_.erase(service->GetIdentifier());
+  service->Delete();
+  OnGattOperationDone(callback);
+}
+
+void ArcBluetoothBridge::SendIndication(
+    int32_t attribute_handle,
+    mojom::BluetoothAddressPtr address,
+    bool confirm,
+    mojo::Array<uint8_t> value,
+    const SendIndicationCallback& callback) {}
+
 void ArcBluetoothBridge::OnDiscoveryError() {
   LOG(WARNING) << "failed to change discovery state";
 }
@@ -1387,4 +1654,8 @@
   return false;
 }
 
+bool ArcBluetoothBridge::CalledOnValidThread() {
+  return thread_checker_.CalledOnValidThread();
+}
+
 }  // namespace arc
diff --git a/components/arc/bluetooth/arc_bluetooth_bridge.h b/components/arc/bluetooth/arc_bluetooth_bridge.h
index af8f5a6..f8b7150c 100644
--- a/components/arc/bluetooth/arc_bluetooth_bridge.h
+++ b/components/arc/bluetooth/arc_bluetooth_bridge.h
@@ -7,9 +7,9 @@
 
 #include <stdint.h>
 
-#include <map>
 #include <memory>
 #include <string>
+#include <unordered_map>
 #include <vector>
 
 #include "base/callback.h"
@@ -21,6 +21,7 @@
 #include "device/bluetooth/bluetooth_adapter_factory.h"
 #include "device/bluetooth/bluetooth_device.h"
 #include "device/bluetooth/bluetooth_discovery_session.h"
+#include "device/bluetooth/bluetooth_local_gatt_service.h"
 #include "device/bluetooth/bluetooth_remote_gatt_characteristic.h"
 #include "device/bluetooth/bluetooth_remote_gatt_descriptor.h"
 #include "device/bluetooth/bluetooth_remote_gatt_service.h"
@@ -36,21 +37,18 @@
       public InstanceHolder<mojom::BluetoothInstance>::Observer,
       public device::BluetoothAdapter::Observer,
       public device::BluetoothAdapterFactory::AdapterCallback,
+      public device::BluetoothLocalGattService::Delegate,
       public mojom::BluetoothHost {
  public:
   explicit ArcBluetoothBridge(ArcBridgeService* bridge_service);
   ~ArcBluetoothBridge() override;
 
-  // Overridden from
-  // InstanceHolder<mojom::BluetoothInstance>::Observer:
+  // Overridden from InstanceHolder<mojom::BluetoothInstance>::Observer:
   void OnInstanceReady() override;
 
   void OnAdapterInitialized(scoped_refptr<device::BluetoothAdapter> adapter);
 
   // Overridden from device::BluetoothAdadpter::Observer
-  void AdapterPresentChanged(device::BluetoothAdapter* adapter,
-                             bool present) override;
-
   void AdapterPoweredChanged(device::BluetoothAdapter* adapter,
                              bool powered) override;
 
@@ -115,6 +113,45 @@
       device::BluetoothRemoteGattDescriptor* descriptor,
       const std::vector<uint8_t>& value) override;
 
+  // Overridden from device::BluetoothLocalGattService::Delegate
+  void OnCharacteristicReadRequest(
+      const device::BluetoothDevice* device,
+      const device::BluetoothLocalGattCharacteristic* characteristic,
+      int offset,
+      const ValueCallback& callback,
+      const ErrorCallback& error_callback) override;
+
+  void OnCharacteristicWriteRequest(
+      const device::BluetoothDevice* device,
+      const device::BluetoothLocalGattCharacteristic* characteristic,
+      const std::vector<uint8_t>& value,
+      int offset,
+      const base::Closure& callback,
+      const ErrorCallback& error_callback) override;
+
+  void OnDescriptorReadRequest(
+      const device::BluetoothDevice* device,
+      const device::BluetoothLocalGattDescriptor* descriptor,
+      int offset,
+      const ValueCallback& callback,
+      const ErrorCallback& error_callback) override;
+
+  void OnDescriptorWriteRequest(
+      const device::BluetoothDevice* device,
+      const device::BluetoothLocalGattDescriptor* descriptor,
+      const std::vector<uint8_t>& value,
+      int offset,
+      const base::Closure& callback,
+      const ErrorCallback& error_callback) override;
+
+  void OnNotificationsStart(
+      const device::BluetoothDevice* device,
+      const device::BluetoothLocalGattCharacteristic* characteristic) override;
+
+  void OnNotificationsStop(
+      const device::BluetoothDevice* device,
+      const device::BluetoothLocalGattCharacteristic* characteristic) override;
+
   // Bluetooth Mojo host interface
   void EnableAdapter(const EnableAdapterCallback& callback) override;
   void DisableAdapter(const DisableAdapterCallback& callback) override;
@@ -150,11 +187,6 @@
   void StopLEListen(const StopLEListenCallback& callback) override;
   void SearchService(mojom::BluetoothAddressPtr remote_addr) override;
 
-  int ConvertGattIdentifierToId(const std::string identifier) const;
-  template <class T>
-  mojom::BluetoothGattDBElementPtr CreateGattDBElement(
-      const mojom::BluetoothGattDBAttributeType type,
-      const T* GattObject) const;
   void GetGattDB(mojom::BluetoothAddressPtr remote_addr) override;
   void ReadGattCharacteristic(
       mojom::BluetoothAddressPtr remote_addr,
@@ -195,6 +227,44 @@
   void OpenBluetoothSocket(
       const OpenBluetoothSocketCallback& callback) override;
 
+  // Bluetooth Mojo host interface - Bluetooth Gatt Server functions
+  // Android counterpart link:
+  // https://source.android.com/devices/halref/bt__gatt__server_8h.html
+  // Create a new service. Chrome will create an integer service handle based on
+  // that BlueZ identifier that will pass back to Android in the callback.
+  // num_handles: number of handle for characteristic / descriptor that will be
+  //              created in this service
+  void AddService(mojom::BluetoothGattServiceIDPtr service_id,
+                  int32_t num_handles,
+                  const AddServiceCallback& callback) override;
+  // Add a characteristic to a service and pass the characteristic handle back.
+  void AddCharacteristic(int32_t service_handle,
+                         mojom::BluetoothUUIDPtr uuid,
+                         int32_t properties,
+                         int32_t permissions,
+                         const AddCharacteristicCallback& callback) override;
+  // Add a descriptor to the last characteristic added to the given service
+  // and pass the descriptor handle back.
+  void AddDescriptor(int32_t service_handle,
+                     mojom::BluetoothUUIDPtr uuid,
+                     int32_t permissions,
+                     const AddDescriptorCallback& callback) override;
+  // Start a local service.
+  void StartService(int32_t service_handle,
+                    const StartServiceCallback& callback) override;
+  // Stop a local service.
+  void StopService(int32_t service_handle,
+                   const StopServiceCallback& callback) override;
+  // Delete a local service.
+  void DeleteService(int32_t service_handle,
+                     const DeleteServiceCallback& callback) override;
+  // Send value indication to a remote device.
+  void SendIndication(int32_t attribute_handle,
+                      mojom::BluetoothAddressPtr address,
+                      bool confirm,
+                      mojo::Array<uint8_t> value,
+                      const SendIndicationCallback& callback) override;
+
   // Chrome observer callbacks
   void OnPoweredOn(
       const base::Callback<void(mojom::BluetoothAdapterState)>& callback) const;
@@ -235,28 +305,10 @@
       const StopLEListenCallback& callback,
       device::BluetoothAdvertisement::ErrorCode error_code);
 
-  using GattReadCallback = base::Callback<void(mojom::BluetoothGattValuePtr)>;
-  void OnGattReadDone(const GattReadCallback& callback,
-                      const std::vector<uint8_t>& result) const;
-  void OnGattReadError(
-      const GattReadCallback& callback,
-      device::BluetoothGattService::GattErrorCode error_code) const;
-
-  using GattWriteCallback = base::Callback<void(mojom::BluetoothGattStatus)>;
-  void OnGattWriteDone(const GattWriteCallback& callback) const;
-  void OnGattWriteError(
-      const GattWriteCallback& callback,
-      device::BluetoothGattService::GattErrorCode error_code) const;
-
   void OnGattNotifyStartDone(
       const RegisterForGattNotificationCallback& callback,
       const std::string char_string_id,
       std::unique_ptr<device::BluetoothGattNotifySession> notify_session);
-  void OnGattNotifyStartError(
-      const RegisterForGattNotificationCallback& callback,
-      device::BluetoothGattService::GattErrorCode error_code) const;
-  void OnGattNotifyStopDone(
-      const DeregisterForGattNotificationCallback& callback) const;
 
  private:
   mojo::Array<mojom::BluetoothPropertyPtr> GetDeviceProperties(
@@ -271,9 +323,6 @@
   bool HasBluetoothInstance() const;
   bool CheckBluetoothInstanceVersion(uint32_t version_need) const;
 
-  template <class T>
-  T* FindGattObjectFromUuid(const std::vector<T*> objs,
-                            const device::BluetoothUUID uuid) const;
   device::BluetoothRemoteGattCharacteristic* FindGattCharacteristic(
       mojom::BluetoothAddressPtr remote_addr,
       mojom::BluetoothGattServiceIDPtr service_id,
@@ -288,13 +337,48 @@
   // Propagates the list of paired device to Android.
   void SendCachedPairedDevices() const;
 
+  bool IsGattServerAttributeHandleAvailable(int need);
+  int32_t GetNextGattServerAttributeHandle();
+  template <class LocalGattAttribute>
+  int32_t CreateGattAttributeHandle(LocalGattAttribute* attribute);
+
+  // Common code for OnCharacteristicReadRequest and OnDescriptorReadRequest
+  template <class LocalGattAttribute>
+  void OnGattAttributeReadRequest(const device::BluetoothDevice* device,
+                                  const LocalGattAttribute* attribute,
+                                  int offset,
+                                  const ValueCallback& success_callback,
+                                  const ErrorCallback& error_callback);
+
+  // Common code for OnCharacteristicWriteRequest and OnDescriptorWriteRequest
+  template <class LocalGattAttribute>
+  void OnGattAttributeWriteRequest(const device::BluetoothDevice* device,
+                                   const LocalGattAttribute* attribute,
+                                   const std::vector<uint8_t>& value,
+                                   int offset,
+                                   const base::Closure& success_callback,
+                                   const ErrorCallback& error_callback);
+
+  bool CalledOnValidThread();
+
   mojo::Binding<mojom::BluetoothHost> binding_;
 
   scoped_refptr<bluez::BluetoothAdapterBlueZ> bluetooth_adapter_;
   scoped_refptr<device::BluetoothAdvertisement> advertisment_;
   std::unique_ptr<device::BluetoothDiscoverySession> discovery_session_;
-  std::map<std::string, std::unique_ptr<device::BluetoothGattNotifySession>>
+  std::unordered_map<std::string,
+                     std::unique_ptr<device::BluetoothGattNotifySession>>
       notification_session_;
+  // Map from Android int handle to Chrome (BlueZ) string identifier.
+  std::unordered_map<int32_t, std::string> gatt_identifier_;
+  // Map from Chrome (BlueZ) string identifier to android int handle.
+  std::unordered_map<std::string, int32_t> gatt_handle_;
+  // Store last GattCharacteristic added to each GattService for GattServer.
+  std::unordered_map<int32_t, int32_t> last_characteristic_;
+  // Monotonically increasing value to use as handle to give to Android side.
+  int32_t gatt_server_attribute_next_handle_ = 0;
+
+  base::ThreadChecker thread_checker_;
 
   // WeakPtrFactory to use for callbacks.
   base::WeakPtrFactory<ArcBluetoothBridge> weak_factory_;
diff --git a/components/arc/common/bluetooth.mojom b/components/arc/common/bluetooth.mojom
index 38de1741..edb607ee 100644
--- a/components/arc/common/bluetooth.mojom
+++ b/components/arc/common/bluetooth.mojom
@@ -289,6 +289,33 @@
 
   [MinVersion=2] OpenBluetoothSocket@29()
       => (handle sock);
+
+  // Bluetooth Gatt Server functions
+  // Copied from Android API
+  // https://source.android.com/devices/halref/bt__gatt__server_8h.html
+  [MinVersion=3] AddService@30(BluetoothGattServiceID service_id,
+                               int32 num_handles)
+      => (int32 service_handle);
+  [MinVersion=3] AddCharacteristic@31(int32 service_handle,
+                                      BluetoothUUID uuid,
+                                      int32 properties,
+                                      int32 permissions)
+      => (int32 characteristic_handle);
+  [MinVersion=3] AddDescriptor@32(int32 service_handle,
+                                  BluetoothUUID uuid,
+                                  int32 permissions)
+      => (int32 descriptor_handle);
+  [MinVersion=3] StartService@33(int32 service_handle)
+      => (BluetoothGattStatus status);
+  [MinVersion=3] StopService@34(int32 service_handle)
+      => (BluetoothGattStatus status);
+  [MinVersion=3] DeleteService@35(int32 service_handle)
+      => (BluetoothGattStatus status);
+  [MinVersion=3] SendIndication@36(int32 attribute_handle,
+                                   BluetoothAddress address,
+                                   bool confirm,
+                                   array<uint8> value)
+      => (BluetoothGattStatus status);
 };
 
 interface BluetoothInstance {
@@ -328,4 +355,16 @@
                                  BluetoothGattID char_id,
                                  bool is_notify,
                                  array<uint8> value);
+
+  // Bluetooth Gatt Server functions
+  [MinVersion=3] RequestGattRead@14(BluetoothAddress address,
+                                    int32 attribute_handle,
+                                    int32 offset,
+                                    bool is_long)
+      => (BluetoothGattStatus status, array<uint8> value);
+  [MinVersion=3] RequestGattWrite@15(BluetoothAddress address,
+                                     int32 attribute_handle,
+                                     int32 offset,
+                                     array<uint8> value)
+      => (BluetoothGattStatus status);
 };
diff --git a/components/autofill.gypi b/components/autofill.gypi
index 0a4746e..ef324054 100644
--- a/components/autofill.gypi
+++ b/components/autofill.gypi
@@ -395,6 +395,9 @@
             ],
             'mojom_typemaps': [
               'autofill/content/public/cpp/autofill_types.typemap',
+              '<(DEPTH)/mojo/common/common_custom_types.typemap',
+              '<(DEPTH)/ui/gfx/geometry/mojo/geometry.typemap',
+              '<(DEPTH)/url/mojo/gurl.typemap',
             ],
             'use_new_wrapper_types': 'false',
           },
@@ -411,9 +414,14 @@
           'type': 'static_library',
           'export_dependent_settings': [
             '../mojo/mojo_public.gyp:mojo_cpp_bindings',
+            '../ui/gfx/gfx.gyp:mojo_geometry_bindings',
+            '../url/url.gyp:url_mojom',
+            'autofill_content_types_mojo_bindings',
            ],
           'dependencies': [
             '../mojo/mojo_public.gyp:mojo_cpp_bindings',
+            '../ui/gfx/gfx.gyp:mojo_geometry_bindings',
+            '../url/url.gyp:url_mojom',
             'autofill_content_mojo_bindings_mojom',
             'autofill_content_types_mojo_bindings',
           ],
@@ -494,6 +502,7 @@
             '../content/content.gyp:content_common',
             '../google_apis/google_apis.gyp:google_apis',
             '../ipc/ipc.gyp:ipc',
+            '../mojo/mojo_base.gyp:mojo_common_lib',
             '../net/net.gyp:net',
             '../skia/skia.gyp:skia',
             '../sql/sql.gyp:sql',
@@ -549,6 +558,7 @@
             '../content/content.gyp:content_renderer',
             '../google_apis/google_apis.gyp:google_apis',
             '../ipc/ipc.gyp:ipc',
+            '../mojo/mojo_base.gyp:mojo_common_lib',
             '../net/net.gyp:net',
             '../skia/skia.gyp:skia',
             '../third_party/re2/re2.gyp:re2',
diff --git a/components/autofill/content/DEPS b/components/autofill/content/DEPS
index c3b3bb1..14c92fd 100644
--- a/components/autofill/content/DEPS
+++ b/components/autofill/content/DEPS
@@ -4,6 +4,7 @@
   "+third_party/WebKit/public/platform",
   "+third_party/WebKit/public/web",
   "+ipc",
+  "+mojo/common",
   "+mojo/public",
   "+services/shell/public/cpp",
 ]
diff --git a/components/autofill/content/browser/BUILD.gn b/components/autofill/content/browser/BUILD.gn
index b2bec8c9..ccc04be 100644
--- a/components/autofill/content/browser/BUILD.gn
+++ b/components/autofill/content/browser/BUILD.gn
@@ -37,6 +37,7 @@
     "//google_apis",
     "//gpu/config",
     "//ipc",
+    "//mojo/common:common_base",
     "//net",
     "//services/shell/public/cpp",
     "//sql",
@@ -77,8 +78,10 @@
     "//google_apis",
     "//google_apis:test_support",
     "//ipc:test_support",
+    "//mojo/common:common_base",
     "//net",
     "//net:test_support",
+    "//services/shell/public/cpp",
     "//testing/gmock",
     "//testing/gtest",
   ]
diff --git a/components/autofill/content/browser/content_autofill_driver.cc b/components/autofill/content/browser/content_autofill_driver.cc
index 8d091cdc..c031fe4 100644
--- a/components/autofill/content/browser/content_autofill_driver.cc
+++ b/components/autofill/content/browser/content_autofill_driver.cc
@@ -8,6 +8,7 @@
 
 #include "base/command_line.h"
 #include "base/threading/sequenced_worker_pool.h"
+#include "components/autofill/content/browser/content_autofill_driver_factory.h"
 #include "components/autofill/content/common/autofill_messages.h"
 #include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/autofill_external_delegate.h"
@@ -23,7 +24,8 @@
 #include "content/public/browser/render_widget_host_view.h"
 #include "content/public/browser/site_instance.h"
 #include "content/public/browser/storage_partition.h"
-#include "ipc/ipc_message_macros.h"
+#include "content/public/browser/web_contents.h"
+#include "mojo/common/common_type_converters.h"
 #include "services/shell/public/cpp/interface_provider.h"
 #include "ui/gfx/geometry/size_f.h"
 
@@ -40,14 +42,24 @@
                                             client,
                                             app_locale,
                                             enable_download_manager)),
-      autofill_external_delegate_(autofill_manager_.get(), this) {
+      autofill_external_delegate_(autofill_manager_.get(), this),
+      binding_(this) {
   autofill_manager_->SetExternalDelegate(&autofill_external_delegate_);
 }
 
 ContentAutofillDriver::~ContentAutofillDriver() {}
 
+// static
+ContentAutofillDriver* ContentAutofillDriver::GetForRenderFrameHost(
+    content::RenderFrameHost* render_frame_host) {
+  ContentAutofillDriverFactory* factory =
+      ContentAutofillDriverFactory::FromWebContents(
+          content::WebContents::FromRenderFrameHost(render_frame_host));
+  return factory ? factory->DriverForFrame(render_frame_host) : nullptr;
+}
+
 void ContentAutofillDriver::BindRequest(mojom::AutofillDriverRequest request) {
-  bindings_.AddBinding(this, std::move(request));
+  binding_.Bind(std::move(request));
 }
 
 bool ContentAutofillDriver::IsOffTheRecord() const {
@@ -76,14 +88,13 @@
     const FormData& data) {
   if (!RendererIsAvailable())
     return;
+
   switch (action) {
     case FORM_DATA_ACTION_FILL:
-      render_frame_host_->Send(new AutofillMsg_FillForm(
-          render_frame_host_->GetRoutingID(), query_id, data));
+      GetAutofillAgent()->FillForm(query_id, data);
       break;
     case FORM_DATA_ACTION_PREVIEW:
-      render_frame_host_->Send(new AutofillMsg_PreviewForm(
-          render_frame_host_->GetRoutingID(), query_id, data));
+      GetAutofillAgent()->PreviewForm(query_id, data);
       break;
   }
 }
@@ -105,46 +116,41 @@
 
   std::vector<FormDataPredictions> type_predictions =
       FormStructure::GetFieldTypePredictions(forms);
-  render_frame_host_->Send(new AutofillMsg_FieldTypePredictionsAvailable(
-      render_frame_host_->GetRoutingID(), type_predictions));
+  GetAutofillAgent()->FieldTypePredictionsAvailable(
+      std::move(type_predictions));
 }
 
 void ContentAutofillDriver::RendererShouldAcceptDataListSuggestion(
     const base::string16& value) {
   if (!RendererIsAvailable())
     return;
-  render_frame_host_->Send(new AutofillMsg_AcceptDataListSuggestion(
-      render_frame_host_->GetRoutingID(), value));
+  GetAutofillAgent()->AcceptDataListSuggestion(mojo::String::From(value));
 }
 
 void ContentAutofillDriver::RendererShouldClearFilledForm() {
   if (!RendererIsAvailable())
     return;
-  render_frame_host_->Send(
-      new AutofillMsg_ClearForm(render_frame_host_->GetRoutingID()));
+  GetAutofillAgent()->ClearForm();
 }
 
 void ContentAutofillDriver::RendererShouldClearPreviewedForm() {
   if (!RendererIsAvailable())
     return;
-  render_frame_host_->Send(
-      new AutofillMsg_ClearPreviewedForm(render_frame_host_->GetRoutingID()));
+  GetAutofillAgent()->ClearPreviewedForm();
 }
 
 void ContentAutofillDriver::RendererShouldFillFieldWithValue(
     const base::string16& value) {
   if (!RendererIsAvailable())
     return;
-  render_frame_host_->Send(new AutofillMsg_FillFieldWithValue(
-      render_frame_host_->GetRoutingID(), value));
+  GetAutofillAgent()->FillFieldWithValue(mojo::String::From(value));
 }
 
 void ContentAutofillDriver::RendererShouldPreviewFieldWithValue(
     const base::string16& value) {
   if (!RendererIsAvailable())
     return;
-  render_frame_host_->Send(new AutofillMsg_PreviewFieldWithValue(
-      render_frame_host_->GetRoutingID(), value));
+  GetAutofillAgent()->PreviewFieldWithValue(mojo::String::From(value));
 }
 
 void ContentAutofillDriver::PopupHidden() {
@@ -172,47 +178,63 @@
   client_->OnFirstUserGestureObserved();
 }
 
-bool ContentAutofillDriver::HandleMessage(const IPC::Message& message) {
-  bool handled = true;
-  IPC_BEGIN_MESSAGE_MAP(ContentAutofillDriver, message)
-  IPC_MESSAGE_FORWARD(AutofillHostMsg_FormsSeen,
-                      autofill_manager_.get(),
-                      AutofillManager::OnFormsSeen)
-  IPC_MESSAGE_FORWARD(AutofillHostMsg_WillSubmitForm, autofill_manager_.get(),
-                      AutofillManager::OnWillSubmitForm)
-  IPC_MESSAGE_FORWARD(AutofillHostMsg_FormSubmitted,
-                      autofill_manager_.get(),
-                      AutofillManager::OnFormSubmitted)
-  IPC_MESSAGE_FORWARD(AutofillHostMsg_TextFieldDidChange,
-                      autofill_manager_.get(),
-                      AutofillManager::OnTextFieldDidChange)
-  IPC_MESSAGE_FORWARD(AutofillHostMsg_FocusNoLongerOnForm,
-                      autofill_manager_.get(),
-                      AutofillManager::OnFocusNoLongerOnForm)
-  IPC_MESSAGE_FORWARD(AutofillHostMsg_QueryFormFieldAutofill,
-                      autofill_manager_.get(),
-                      AutofillManager::OnQueryFormFieldAutofill)
-  IPC_MESSAGE_FORWARD(AutofillHostMsg_DidPreviewAutofillFormData,
-                      autofill_manager_.get(),
-                      AutofillManager::OnDidPreviewAutofillFormData)
-  IPC_MESSAGE_FORWARD(AutofillHostMsg_PingAck,
-                      &autofill_external_delegate_,
-                      AutofillExternalDelegate::OnPingAck)
-  IPC_MESSAGE_FORWARD(AutofillHostMsg_DidFillAutofillFormData,
-                      autofill_manager_.get(),
-                      AutofillManager::OnDidFillAutofillFormData)
-  IPC_MESSAGE_FORWARD(AutofillHostMsg_DidEndTextFieldEditing,
-                      autofill_manager_.get(),
-                      AutofillManager::OnDidEndTextFieldEditing)
-  IPC_MESSAGE_FORWARD(AutofillHostMsg_HidePopup,
-                      autofill_manager_.get(),
-                      AutofillManager::OnHidePopup)
-  IPC_MESSAGE_FORWARD(AutofillHostMsg_SetDataList,
-                      autofill_manager_.get(),
-                      AutofillManager::OnSetDataList)
-  IPC_MESSAGE_UNHANDLED(handled = false)
-  IPC_END_MESSAGE_MAP()
-  return handled;
+void ContentAutofillDriver::FormsSeen(mojo::Array<FormData> forms,
+                                      base::TimeTicks timestamp) {
+  autofill_manager_->OnFormsSeen(forms.storage(), timestamp);
+}
+
+void ContentAutofillDriver::WillSubmitForm(const FormData& form,
+                                           base::TimeTicks timestamp) {
+  autofill_manager_->OnWillSubmitForm(form, timestamp);
+}
+
+void ContentAutofillDriver::FormSubmitted(const FormData& form) {
+  autofill_manager_->OnFormSubmitted(form);
+}
+
+void ContentAutofillDriver::TextFieldDidChange(const FormData& form,
+                                               const FormFieldData& field,
+                                               base::TimeTicks timestamp) {
+  autofill_manager_->OnTextFieldDidChange(form, field, timestamp);
+}
+
+void ContentAutofillDriver::QueryFormFieldAutofill(
+    int32_t id,
+    const FormData& form,
+    const FormFieldData& field,
+    const gfx::RectF& bounding_box) {
+  autofill_manager_->OnQueryFormFieldAutofill(id, form, field, bounding_box);
+}
+
+void ContentAutofillDriver::HidePopup() {
+  autofill_manager_->OnHidePopup();
+}
+
+void ContentAutofillDriver::PingAck() {
+  autofill_external_delegate_.OnPingAck();
+}
+
+void ContentAutofillDriver::FocusNoLongerOnForm() {
+  autofill_manager_->OnFocusNoLongerOnForm();
+}
+
+void ContentAutofillDriver::DidFillAutofillFormData(const FormData& form,
+                                                    base::TimeTicks timestamp) {
+  autofill_manager_->OnDidFillAutofillFormData(form, timestamp);
+}
+
+void ContentAutofillDriver::DidPreviewAutofillFormData() {
+  autofill_manager_->OnDidPreviewAutofillFormData();
+}
+
+void ContentAutofillDriver::DidEndTextFieldEditing() {
+  autofill_manager_->OnDidEndTextFieldEditing();
+}
+
+void ContentAutofillDriver::SetDataList(mojo::Array<mojo::String> values,
+                                        mojo::Array<mojo::String> labels) {
+  autofill_manager_->OnSetDataList(values.To<std::vector<base::string16>>(),
+                                   labels.To<std::vector<base::string16>>());
 }
 
 void ContentAutofillDriver::DidNavigateFrame(
@@ -229,16 +251,17 @@
 }
 
 void ContentAutofillDriver::NotifyFirstUserGestureObservedInTab() {
-  ConnectToMojoAutofillAgentIfNeeded();
-  mojo_autofill_agent_->FirstUserGestureObservedInTab();
+  GetAutofillAgent()->FirstUserGestureObservedInTab();
 }
 
-void ContentAutofillDriver::ConnectToMojoAutofillAgentIfNeeded() {
-  if (mojo_autofill_agent_)
-    return;
+const mojom::AutofillAgentPtr& ContentAutofillDriver::GetAutofillAgent() {
+  // Here is a lazy binding, and will not reconnect after connection error.
+  if (!mojo_autofill_agent_) {
+    render_frame_host_->GetRemoteInterfaces()->GetInterface(
+        mojo::GetProxy(&mojo_autofill_agent_));
+  }
 
-  render_frame_host_->GetRemoteInterfaces()->GetInterface(
-      &mojo_autofill_agent_);
+  return mojo_autofill_agent_;
 }
 
 }  // namespace autofill
diff --git a/components/autofill/content/browser/content_autofill_driver.h b/components/autofill/content/browser/content_autofill_driver.h
index 2a2a9f1..94578f2 100644
--- a/components/autofill/content/browser/content_autofill_driver.h
+++ b/components/autofill/content/browser/content_autofill_driver.h
@@ -14,7 +14,7 @@
 #include "components/autofill/core/browser/autofill_driver.h"
 #include "components/autofill/core/browser/autofill_external_delegate.h"
 #include "components/autofill/core/browser/autofill_manager.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
+#include "mojo/public/cpp/bindings/binding.h"
 
 namespace content {
 class BrowserContext;
@@ -23,10 +23,6 @@
 struct LoadCommittedDetails;
 }
 
-namespace IPC {
-class Message;
-}
-
 namespace autofill {
 
 class AutofillClient;
@@ -44,6 +40,10 @@
       AutofillManager::AutofillDownloadManagerState enable_download_manager);
   ~ContentAutofillDriver() override;
 
+  // Gets the driver for |render_frame_host|.
+  static ContentAutofillDriver* GetForRenderFrameHost(
+      content::RenderFrameHost* render_frame_host);
+
   void BindRequest(mojom::AutofillDriverRequest request);
 
   // AutofillDriver:
@@ -71,9 +71,26 @@
 
   // mojom::AutofillDriver:
   void FirstUserGestureObserved() override;
-
-  // Handles a message that came from the associated render frame.
-  bool HandleMessage(const IPC::Message& message);
+  void FormsSeen(mojo::Array<FormData> forms,
+                 base::TimeTicks timestamp) override;
+  void WillSubmitForm(const FormData& form, base::TimeTicks timestamp) override;
+  void FormSubmitted(const FormData& form) override;
+  void TextFieldDidChange(const FormData& form,
+                          const FormFieldData& field,
+                          base::TimeTicks timestamp) override;
+  void QueryFormFieldAutofill(int32_t id,
+                              const FormData& form,
+                              const FormFieldData& field,
+                              const gfx::RectF& bounding_box) override;
+  void HidePopup() override;
+  void PingAck() override;
+  void FocusNoLongerOnForm() override;
+  void DidFillAutofillFormData(const FormData& form,
+                               base::TimeTicks timestamp) override;
+  void DidPreviewAutofillFormData() override;
+  void DidEndTextFieldEditing() override;
+  void SetDataList(mojo::Array<mojo::String> values,
+                   mojo::Array<mojo::String> labels) override;
 
   // Called when the frame has navigated.
   void DidNavigateFrame(const content::LoadCommittedDetails& details,
@@ -90,14 +107,14 @@
   AutofillManager* autofill_manager() { return autofill_manager_.get(); }
   content::RenderFrameHost* render_frame_host() { return render_frame_host_; }
 
+  const mojom::AutofillAgentPtr& GetAutofillAgent();
+
  protected:
   // Sets the manager to |manager| and sets |manager|'s external delegate
   // to |autofill_external_delegate_|. Takes ownership of |manager|.
   void SetAutofillManager(std::unique_ptr<AutofillManager> manager);
 
  private:
-  void ConnectToMojoAutofillAgentIfNeeded();
-
   // Weak ref to the RenderFrameHost the driver is associated with. Should
   // always be non-NULL and valid for lifetime of |this|.
   content::RenderFrameHost* const render_frame_host_;
@@ -113,7 +130,7 @@
   // case where the Autofill native UI is enabled.
   AutofillExternalDelegate autofill_external_delegate_;
 
-  mojo::BindingSet<mojom::AutofillDriver> bindings_;
+  mojo::Binding<mojom::AutofillDriver> binding_;
 
   mojom::AutofillAgentPtr mojo_autofill_agent_;
 };
diff --git a/components/autofill/content/browser/content_autofill_driver_factory.cc b/components/autofill/content/browser/content_autofill_driver_factory.cc
index 3e614dc..7cc11640 100644
--- a/components/autofill/content/browser/content_autofill_driver_factory.cc
+++ b/components/autofill/content/browser/content_autofill_driver_factory.cc
@@ -16,7 +16,6 @@
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
-#include "ipc/ipc_message_macros.h"
 
 namespace autofill {
 
@@ -95,12 +94,6 @@
   return mapping == frame_driver_map_.end() ? nullptr : mapping->second.get();
 }
 
-bool ContentAutofillDriverFactory::OnMessageReceived(
-    const IPC::Message& message,
-    content::RenderFrameHost* render_frame_host) {
-  return frame_driver_map_[render_frame_host]->HandleMessage(message);
-}
-
 void ContentAutofillDriverFactory::RenderFrameCreated(
     content::RenderFrameHost* render_frame_host) {
   auto insertion_result =
diff --git a/components/autofill/content/browser/content_autofill_driver_factory.h b/components/autofill/content/browser/content_autofill_driver_factory.h
index f2a233e..d121269 100644
--- a/components/autofill/content/browser/content_autofill_driver_factory.h
+++ b/components/autofill/content/browser/content_autofill_driver_factory.h
@@ -18,10 +18,6 @@
 class RenderFrameHost;
 }
 
-namespace IPC {
-class Message;
-}
-
 namespace autofill {
 
 class AutofillDriver;
@@ -50,8 +46,6 @@
       content::RenderFrameHost* render_frame_host);
 
   // content::WebContentsObserver:
-  bool OnMessageReceived(const IPC::Message& message,
-                         content::RenderFrameHost* render_frame_host) override;
   void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override;
   void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
   void DidNavigateAnyFrame(
diff --git a/components/autofill/content/browser/content_autofill_driver_unittest.cc b/components/autofill/content/browser/content_autofill_driver_unittest.cc
index bc88e12..90fb9df 100644
--- a/components/autofill/content/browser/content_autofill_driver_unittest.cc
+++ b/components/autofill/content/browser/content_autofill_driver_unittest.cc
@@ -13,8 +13,8 @@
 #include <vector>
 
 #include "base/command_line.h"
+#include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
-#include "components/autofill/content/common/autofill_messages.h"
 #include "components/autofill/core/browser/autofill_external_delegate.h"
 #include "components/autofill/core/browser/autofill_manager.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
@@ -28,7 +28,9 @@
 #include "content/public/common/frame_navigate_params.h"
 #include "content/public/test/mock_render_process_host.h"
 #include "content/public/test/test_renderer_host.h"
-#include "ipc/ipc_test_sink.h"
+#include "mojo/common/common_type_converters.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
+#include "services/shell/public/cpp/interface_provider.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -40,6 +42,190 @@
 const AutofillManager::AutofillDownloadManagerState kDownloadState =
     AutofillManager::DISABLE_AUTOFILL_DOWNLOAD_MANAGER;
 
+class FakeAutofillAgent : public mojom::AutofillAgent {
+ public:
+  FakeAutofillAgent()
+      : fill_form_id_(-1),
+        preview_form_id_(-1),
+        called_clear_form_(false),
+        called_clear_previewed_form_(false) {}
+
+  ~FakeAutofillAgent() override {}
+
+  void BindRequest(mojo::ScopedMessagePipeHandle handle) {
+    bindings_.AddBinding(
+        this, mojo::MakeRequest<mojom::AutofillAgent>(std::move(handle)));
+  }
+
+  void SetQuitLoopClosure(base::Closure closure) { quit_closure_ = closure; }
+
+  // Returns the id and formdata received via
+  // mojo interface method mojom::AutofillAgent::FillForm().
+  bool GetAutofillFillFormMessage(int* page_id, FormData* results) {
+    if (fill_form_id_ == -1)
+      return false;
+    if (!fill_form_form_)
+      return false;
+
+    if (page_id)
+      *page_id = fill_form_id_;
+    if (results)
+      *results = *fill_form_form_;
+    return true;
+  }
+
+  // Returns the id and formdata received via
+  // mojo interface method mojom::AutofillAgent::PreviewForm().
+  bool GetAutofillPreviewFormMessage(int* page_id, FormData* results) {
+    if (preview_form_id_ == -1)
+      return false;
+    if (!preview_form_form_)
+      return false;
+
+    if (page_id)
+      *page_id = preview_form_id_;
+    if (results)
+      *results = *preview_form_form_;
+    return true;
+  }
+
+  // Returns data received via mojo interface method
+  // mojom::AutofillAent::FieldTypePredictionsAvailable().
+  bool GetFieldTypePredictionsAvailable(
+      std::vector<FormDataPredictions>* predictions) {
+    if (!predictions_)
+      return false;
+    if (predictions)
+      *predictions = *predictions_;
+    return true;
+  }
+
+  // Returns whether mojo interface method mojom::AutofillAgent::ClearForm() got
+  // called.
+  bool GetCalledClearForm() { return called_clear_form_; }
+
+  // Returns whether mojo interface method
+  // mojom::AutofillAgent::ClearPreviewedForm() got called.
+  bool GetCalledClearPreviewedForm() { return called_clear_previewed_form_; }
+
+  // Returns data received via mojo interface method
+  // mojom::AutofillAent::FillFieldWithValue().
+  bool GetString16FillFieldWithValue(base::string16* value) {
+    if (!value_fill_field_)
+      return false;
+    if (value)
+      *value = *value_fill_field_;
+    return true;
+  }
+
+  // Returns data received via mojo interface method
+  // mojom::AutofillAent::PreviewFieldWithValue().
+  bool GetString16PreviewFieldWithValue(base::string16* value) {
+    if (!value_preview_field_)
+      return false;
+    if (value)
+      *value = *value_preview_field_;
+    return true;
+  }
+
+  // Returns data received via mojo interface method
+  // mojom::AutofillAent::AcceptDataListSuggestion().
+  bool GetString16AcceptDataListSuggestion(base::string16* value) {
+    if (!value_accept_data_)
+      return false;
+    if (value)
+      *value = *value_accept_data_;
+    return true;
+  }
+
+ private:
+  void CallDone() {
+    if (!quit_closure_.is_null()) {
+      quit_closure_.Run();
+      quit_closure_.Reset();
+    }
+  }
+
+  // mojom::AutofillAgent methods:
+  void FirstUserGestureObservedInTab() override {}
+
+  void FillForm(int32_t id, const FormData& form) override {
+    fill_form_id_ = id;
+    fill_form_form_ = form;
+    CallDone();
+  }
+
+  void PreviewForm(int32_t id, const FormData& form) override {
+    preview_form_id_ = id;
+    preview_form_form_ = form;
+    CallDone();
+  }
+
+  void FieldTypePredictionsAvailable(
+      mojo::Array<FormDataPredictions> forms) override {
+    predictions_ = forms.PassStorage();
+    CallDone();
+  }
+
+  void ClearForm() override {
+    called_clear_form_ = true;
+    CallDone();
+  }
+
+  void ClearPreviewedForm() override {
+    called_clear_previewed_form_ = true;
+    CallDone();
+  }
+
+  void FillFieldWithValue(const mojo::String& value) override {
+    value_fill_field_ = value.To<base::string16>();
+    CallDone();
+  }
+
+  void PreviewFieldWithValue(const mojo::String& value) override {
+    value_preview_field_ = value.To<base::string16>();
+    CallDone();
+  }
+
+  void AcceptDataListSuggestion(const mojo::String& value) override {
+    value_accept_data_ = value.To<base::string16>();
+    CallDone();
+  }
+
+  void FillPasswordSuggestion(const mojo::String& username,
+                              const mojo::String& password) override {}
+
+  void PreviewPasswordSuggestion(const mojo::String& username,
+                                 const mojo::String& password) override {}
+
+  void ShowInitialPasswordAccountSuggestions(
+      int32_t key,
+      const PasswordFormFillData& form_data) override {}
+
+  mojo::BindingSet<mojom::AutofillAgent> bindings_;
+
+  base::Closure quit_closure_;
+
+  // Records data received from FillForm() call.
+  int32_t fill_form_id_;
+  base::Optional<FormData> fill_form_form_;
+  // Records data received from PreviewForm() call.
+  int32_t preview_form_id_;
+  base::Optional<FormData> preview_form_form_;
+  // Records data received from FieldTypePredictionsAvailable() call.
+  base::Optional<std::vector<FormDataPredictions>> predictions_;
+  // Records whether ClearForm() got called.
+  bool called_clear_form_;
+  // Records whether ClearPreviewedForm() got called.
+  bool called_clear_previewed_form_;
+  // Records string received from FillFieldWithValue() call.
+  base::Optional<base::string16> value_fill_field_;
+  // Records string received from PreviewFieldWithValue() call.
+  base::Optional<base::string16> value_preview_field_;
+  // Records string received from AcceptDataListSuggestion() call.
+  base::Optional<base::string16> value_accept_data_;
+};
+
 }  // namespace
 
 class MockAutofillManager : public AutofillManager {
@@ -77,6 +263,13 @@
     test_autofill_client_.reset(new TestAutofillClient());
     driver_.reset(new TestContentAutofillDriver(web_contents()->GetMainFrame(),
                                                 test_autofill_client_.get()));
+
+    shell::InterfaceProvider* remote_interfaces =
+        web_contents()->GetMainFrame()->GetRemoteInterfaces();
+    shell::InterfaceProvider::TestApi test_api(remote_interfaces);
+    test_api.SetBinderForName(mojom::AutofillAgent::Name_,
+                              base::Bind(&FakeAutofillAgent::BindRequest,
+                                         base::Unretained(&fake_agent_)));
   }
 
   void TearDown() override {
@@ -87,118 +280,10 @@
   }
 
  protected:
-  // Searches for an |AutofillMsg_FillForm| message in the queue of sent IPC
-  // messages. If none is present, returns false. Otherwise, extracts the first
-  // |AutofillMsg_FillForm| message, fills the output parameters with the values
-  // of the message's parameters, and clears the queue of sent messages.
-  bool GetAutofillFillFormMessage(int* page_id, FormData* results) {
-    const uint32_t kMsgID = AutofillMsg_FillForm::ID;
-    const IPC::Message* message =
-        process()->sink().GetFirstMessageMatching(kMsgID);
-    if (!message)
-      return false;
-    std::tuple<int, FormData> autofill_param;
-    if (!AutofillMsg_FillForm::Read(message, &autofill_param))
-      return false;
-    if (page_id)
-      *page_id = std::get<0>(autofill_param);
-    if (results)
-      *results = std::get<1>(autofill_param);
-    process()->sink().ClearMessages();
-    return true;
-  }
-
-  // Searches for an |AutofillMsg_PreviewForm| message in the queue of sent IPC
-  // messages. If none is present, returns false. Otherwise, extracts the first
-  // |AutofillMsg_PreviewForm| message, fills the output parameters with the
-  // values of the message's parameters, and clears the queue of sent messages.
-  bool GetAutofillPreviewFormMessage(int* page_id, FormData* results) {
-    const uint32_t kMsgID = AutofillMsg_PreviewForm::ID;
-    const IPC::Message* message =
-        process()->sink().GetFirstMessageMatching(kMsgID);
-    if (!message)
-      return false;
-    std::tuple<int, FormData> autofill_param;
-    if (!AutofillMsg_PreviewForm::Read(message, &autofill_param))
-      return false;
-    if (page_id)
-      *page_id = std::get<0>(autofill_param);
-    if (results)
-      *results = std::get<1>(autofill_param);
-    process()->sink().ClearMessages();
-    return true;
-  }
-
-  // Searches for an |AutofillMsg_FieldTypePredictionsAvailable| message in the
-  // queue of sent IPC messages. If none is present, returns false. Otherwise,
-  // extracts the first |AutofillMsg_FieldTypePredictionsAvailable| message,
-  // fills the output parameter with the values of the message's parameter, and
-  // clears the queue of sent messages.
-  bool GetFieldTypePredictionsAvailable(
-      std::vector<FormDataPredictions>* predictions) {
-    const uint32_t kMsgID = AutofillMsg_FieldTypePredictionsAvailable::ID;
-    const IPC::Message* message =
-        process()->sink().GetFirstMessageMatching(kMsgID);
-    if (!message)
-      return false;
-    std::tuple<std::vector<FormDataPredictions> > autofill_param;
-    if (!AutofillMsg_FieldTypePredictionsAvailable::Read(message,
-                                                         &autofill_param))
-      return false;
-    if (predictions)
-      *predictions = std::get<0>(autofill_param);
-
-    process()->sink().ClearMessages();
-    return true;
-  }
-
-  // Searches for a message matching |messageID| in the queue of sent IPC
-  // messages. If none is present, returns false. Otherwise, extracts the first
-  // matching message, fills the output parameter with the string16 from the
-  // message's parameter, and clears the queue of sent messages.
-  bool GetString16FromMessageWithID(uint32_t messageID, base::string16* value) {
-    const IPC::Message* message =
-        process()->sink().GetFirstMessageMatching(messageID);
-    if (!message)
-      return false;
-    std::tuple<base::string16> autofill_param;
-    switch (messageID) {
-      case AutofillMsg_FillFieldWithValue::ID:
-        if (!AutofillMsg_FillFieldWithValue::Read(message, &autofill_param))
-          return false;
-        break;
-      case AutofillMsg_PreviewFieldWithValue::ID:
-        if (!AutofillMsg_PreviewFieldWithValue::Read(message, &autofill_param))
-          return false;
-        break;
-      case AutofillMsg_AcceptDataListSuggestion::ID:
-        if (!AutofillMsg_AcceptDataListSuggestion::Read(message,
-                                                        &autofill_param))
-          return false;
-        break;
-      default:
-        NOTREACHED();
-    }
-    if (value)
-      *value = std::get<0>(autofill_param);
-    process()->sink().ClearMessages();
-    return true;
-  }
-
-  // Searches for a message matching |messageID| in the queue of sent IPC
-  // messages. If none is present, returns false. Otherwise, clears the queue
-  // of sent messages and returns true.
-  bool HasMessageMatchingID(uint32_t messageID) {
-    const IPC::Message* message =
-        process()->sink().GetFirstMessageMatching(messageID);
-    if (!message)
-      return false;
-    process()->sink().ClearMessages();
-    return true;
-  }
-
   std::unique_ptr<TestAutofillClient> test_autofill_client_;
   std::unique_ptr<TestContentAutofillDriver> driver_;
+
+  FakeAutofillAgent fake_agent_;
 };
 
 TEST_F(ContentAutofillDriverTest, GetURLRequestContext) {
@@ -233,14 +318,19 @@
   int input_page_id = 42;
   FormData input_form_data;
   test::CreateTestAddressFormData(&input_form_data);
+  base::RunLoop run_loop;
+  fake_agent_.SetQuitLoopClosure(run_loop.QuitClosure());
   driver_->SendFormDataToRenderer(
       input_page_id, AutofillDriver::FORM_DATA_ACTION_FILL, input_form_data);
 
+  run_loop.RunUntilIdle();
+
   int output_page_id = 0;
   FormData output_form_data;
-  EXPECT_FALSE(
-      GetAutofillPreviewFormMessage(&output_page_id, &output_form_data));
-  EXPECT_TRUE(GetAutofillFillFormMessage(&output_page_id, &output_form_data));
+  EXPECT_FALSE(fake_agent_.GetAutofillPreviewFormMessage(&output_page_id,
+                                                         &output_form_data));
+  EXPECT_TRUE(fake_agent_.GetAutofillFillFormMessage(&output_page_id,
+                                                     &output_form_data));
   EXPECT_EQ(input_page_id, output_page_id);
   EXPECT_TRUE(input_form_data.SameFormAs(output_form_data));
 }
@@ -249,14 +339,19 @@
   int input_page_id = 42;
   FormData input_form_data;
   test::CreateTestAddressFormData(&input_form_data);
+  base::RunLoop run_loop;
+  fake_agent_.SetQuitLoopClosure(run_loop.QuitClosure());
   driver_->SendFormDataToRenderer(
       input_page_id, AutofillDriver::FORM_DATA_ACTION_PREVIEW, input_form_data);
 
+  run_loop.RunUntilIdle();
+
   int output_page_id = 0;
   FormData output_form_data;
-  EXPECT_FALSE(GetAutofillFillFormMessage(&output_page_id, &output_form_data));
-  EXPECT_TRUE(
-      GetAutofillPreviewFormMessage(&output_page_id, &output_form_data));
+  EXPECT_FALSE(fake_agent_.GetAutofillFillFormMessage(&output_page_id,
+                                                      &output_form_data));
+  EXPECT_TRUE(fake_agent_.GetAutofillPreviewFormMessage(&output_page_id,
+                                                        &output_form_data));
   EXPECT_EQ(input_page_id, output_page_id);
   EXPECT_TRUE(input_form_data.SameFormAs(output_form_data));
 }
@@ -267,8 +362,13 @@
   test::CreateTestAddressFormData(&form);
   FormStructure form_structure(form);
   std::vector<FormStructure*> forms(1, &form_structure);
+
+  base::RunLoop run_loop;
+  fake_agent_.SetQuitLoopClosure(run_loop.QuitClosure());
   driver_->SendAutofillTypePredictionsToRenderer(forms);
-  EXPECT_FALSE(GetFieldTypePredictionsAvailable(NULL));
+  run_loop.RunUntilIdle();
+
+  EXPECT_FALSE(fake_agent_.GetFieldTypePredictionsAvailable(NULL));
 }
 
 TEST_F(ContentAutofillDriverTest, TypePredictionsSentToRendererWhenEnabled) {
@@ -281,49 +381,72 @@
   std::vector<FormStructure*> forms(1, &form_structure);
   std::vector<FormDataPredictions> expected_type_predictions =
       FormStructure::GetFieldTypePredictions(forms);
+
+  base::RunLoop run_loop;
+  fake_agent_.SetQuitLoopClosure(run_loop.QuitClosure());
   driver_->SendAutofillTypePredictionsToRenderer(forms);
+  run_loop.RunUntilIdle();
 
   std::vector<FormDataPredictions> output_type_predictions;
-  EXPECT_TRUE(GetFieldTypePredictionsAvailable(&output_type_predictions));
+  EXPECT_TRUE(
+      fake_agent_.GetFieldTypePredictionsAvailable(&output_type_predictions));
   EXPECT_EQ(expected_type_predictions, output_type_predictions);
 }
 
 TEST_F(ContentAutofillDriverTest, AcceptDataListSuggestion) {
   base::string16 input_value(base::ASCIIToUTF16("barfoo"));
   base::string16 output_value;
+
+  base::RunLoop run_loop;
+  fake_agent_.SetQuitLoopClosure(run_loop.QuitClosure());
   driver_->RendererShouldAcceptDataListSuggestion(input_value);
-  EXPECT_TRUE(GetString16FromMessageWithID(
-      AutofillMsg_AcceptDataListSuggestion::ID, &output_value));
+  run_loop.RunUntilIdle();
+
+  EXPECT_TRUE(fake_agent_.GetString16AcceptDataListSuggestion(&output_value));
   EXPECT_EQ(input_value, output_value);
 }
 
 TEST_F(ContentAutofillDriverTest, ClearFilledFormSentToRenderer) {
+  base::RunLoop run_loop;
+  fake_agent_.SetQuitLoopClosure(run_loop.QuitClosure());
   driver_->RendererShouldClearFilledForm();
-  EXPECT_TRUE(HasMessageMatchingID(AutofillMsg_ClearForm::ID));
+  run_loop.RunUntilIdle();
+
+  EXPECT_TRUE(fake_agent_.GetCalledClearForm());
 }
 
 TEST_F(ContentAutofillDriverTest, ClearPreviewedFormSentToRenderer) {
+  base::RunLoop run_loop;
+  fake_agent_.SetQuitLoopClosure(run_loop.QuitClosure());
   driver_->RendererShouldClearPreviewedForm();
-  EXPECT_TRUE(HasMessageMatchingID(AutofillMsg_ClearPreviewedForm::ID));
+  run_loop.RunUntilIdle();
+
+  EXPECT_TRUE(fake_agent_.GetCalledClearPreviewedForm());
 }
 
 TEST_F(ContentAutofillDriverTest, FillFieldWithValue) {
   base::string16 input_value(base::ASCIIToUTF16("barqux"));
   base::string16 output_value;
 
+  base::RunLoop run_loop;
+  fake_agent_.SetQuitLoopClosure(run_loop.QuitClosure());
   driver_->RendererShouldFillFieldWithValue(input_value);
-  EXPECT_TRUE(GetString16FromMessageWithID(AutofillMsg_FillFieldWithValue::ID,
-                                           &output_value));
+  run_loop.RunUntilIdle();
+
+  EXPECT_TRUE(fake_agent_.GetString16FillFieldWithValue(&output_value));
   EXPECT_EQ(input_value, output_value);
 }
 
 TEST_F(ContentAutofillDriverTest, PreviewFieldWithValue) {
   base::string16 input_value(base::ASCIIToUTF16("barqux"));
   base::string16 output_value;
+
+  base::RunLoop run_loop;
+  fake_agent_.SetQuitLoopClosure(run_loop.QuitClosure());
   driver_->RendererShouldPreviewFieldWithValue(input_value);
-  EXPECT_TRUE(GetString16FromMessageWithID(
-      AutofillMsg_PreviewFieldWithValue::ID,
-      &output_value));
+  run_loop.RunUntilIdle();
+
+  EXPECT_TRUE(fake_agent_.GetString16PreviewFieldWithValue(&output_value));
   EXPECT_EQ(input_value, output_value);
 }
 
diff --git a/components/autofill/content/common/autofill_messages.h b/components/autofill/content/common/autofill_messages.h
index d32db5a..36d614e2 100644
--- a/components/autofill/content/common/autofill_messages.h
+++ b/components/autofill/content/common/autofill_messages.h
@@ -118,16 +118,6 @@
 
 // Autofill messages sent from the browser to the renderer.
 
-// Instructs the renderer to fill the active form with the given form data.
-IPC_MESSAGE_ROUTED2(AutofillMsg_FillForm,
-                    int /* query_id */,
-                    autofill::FormData /* form */)
-
-// Instructs the renderer to preview the active form with the given form data.
-IPC_MESSAGE_ROUTED2(AutofillMsg_PreviewForm,
-                    int /* query_id */,
-                    autofill::FormData /* form */)
-
 // Fill a password form and prepare field autocomplete for multiple
 // matching logins. Lets the renderer know if it should disable the popup
 // because the browser process will own the popup UI. |key| serves for
@@ -141,29 +131,6 @@
 // the decisions made about saving the password.
 IPC_MESSAGE_ROUTED1(AutofillMsg_SetLoggingState, bool /* active */)
 
-// Send the heuristic and server field type predictions to the renderer.
-IPC_MESSAGE_ROUTED1(
-    AutofillMsg_FieldTypePredictionsAvailable,
-    std::vector<autofill::FormDataPredictions> /* forms */)
-
-// Clears the currently displayed Autofill results.
-IPC_MESSAGE_ROUTED0(AutofillMsg_ClearForm)
-
-// Tells the renderer that the Autofill previewed form should be cleared.
-IPC_MESSAGE_ROUTED0(AutofillMsg_ClearPreviewedForm)
-
-// Sets the currently selected node's value.
-IPC_MESSAGE_ROUTED1(AutofillMsg_FillFieldWithValue,
-                    base::string16 /* value */)
-
-// Sets the suggested value for the currently previewed node.
-IPC_MESSAGE_ROUTED1(AutofillMsg_PreviewFieldWithValue,
-                    base::string16 /* value */)
-
-// Sets the currently selected node's value to be the given data list value.
-IPC_MESSAGE_ROUTED1(AutofillMsg_AcceptDataListSuggestion,
-                    base::string16 /* accepted data list value */)
-
 // Tells the renderer to populate the correct password fields with this
 // generated password.
 IPC_MESSAGE_ROUTED1(AutofillMsg_GeneratedPasswordAccepted,
@@ -172,24 +139,6 @@
 // Tells the renderer to enable the form classifier.
 IPC_MESSAGE_ROUTED0(AutofillMsg_AllowToRunFormClassifier)
 
-// Tells the renderer to fill the username and password with with given
-// values.
-IPC_MESSAGE_ROUTED2(AutofillMsg_FillPasswordSuggestion,
-                    base::string16 /* username */,
-                    base::string16 /* password */)
-
-// Tells the renderer to preview the username and password with the given
-// values.
-IPC_MESSAGE_ROUTED2(AutofillMsg_PreviewPasswordSuggestion,
-                    base::string16 /* username */,
-                    base::string16 /* password */)
-
-// Sent when a password form is initially detected and suggestions should be
-// shown. Used by the fill-on-select experiment.
-IPC_MESSAGE_ROUTED2(AutofillMsg_ShowInitialPasswordAccountSuggestions,
-                    int /* key */,
-                    autofill::PasswordFormFillData /* the fill form data */)
-
 // Tells the renderer to find the focused password form (assuming it exists).
 // Renderer is expected to respond with the message
 // |AutofillHostMsg_FocusedPasswordFormFound|.
@@ -222,12 +171,6 @@
 // TODO(creis): check in the browser that the renderer actually has permission
 // for the URL to avoid compromised renderers talking to the browser.
 
-// Notification that forms have been seen that are candidates for
-// filling/submitting by the AutofillManager.
-IPC_MESSAGE_ROUTED2(AutofillHostMsg_FormsSeen,
-                    std::vector<autofill::FormData> /* forms */,
-                    base::TimeTicks /* timestamp */)
-
 // Notification that password forms have been seen that are candidates for
 // filling/submitting by the password manager.
 IPC_MESSAGE_ROUTED1(AutofillHostMsg_PasswordFormsParsed,
@@ -261,21 +204,6 @@
 IPC_MESSAGE_ROUTED1(AutofillHostMsg_RecordSavePasswordProgress,
                     std::string /* log */)
 
-// Notification that a form is about to be submitted. The user hit the button.
-IPC_MESSAGE_ROUTED2(AutofillHostMsg_WillSubmitForm,
-                    autofill::FormData /* form */,
-                    base::TimeTicks /* timestamp */)
-
-// Notification that a form has been submitted.
-IPC_MESSAGE_ROUTED1(AutofillHostMsg_FormSubmitted,
-                    autofill::FormData /* form */)
-
-// Notification that a form field's value has changed.
-IPC_MESSAGE_ROUTED3(AutofillHostMsg_TextFieldDidChange,
-                    autofill::FormData /* the form */,
-                    autofill::FormFieldData /* the form field */,
-                    base::TimeTicks /* timestamp */)
-
 // Queries the browser for Autofill suggestions for a form input field.
 IPC_MESSAGE_ROUTED4(AutofillHostMsg_QueryFormFieldAutofill,
                     int /* id of this message */,
@@ -283,26 +211,6 @@
                     autofill::FormFieldData /* the form field */,
                     gfx::RectF /* input field bounds, window-relative */)
 
-// Sent when a form is previewed with Autofill suggestions.
-IPC_MESSAGE_ROUTED0(AutofillHostMsg_DidPreviewAutofillFormData)
-
-// Sent immediately after the renderer receives a ping IPC.
-IPC_MESSAGE_ROUTED0(AutofillHostMsg_PingAck)
-
-// Sent when the current form is no longer focused.
-IPC_MESSAGE_ROUTED0(AutofillHostMsg_FocusNoLongerOnForm)
-
-// Sent when a form is filled with Autofill suggestions.
-IPC_MESSAGE_ROUTED2(AutofillHostMsg_DidFillAutofillFormData,
-                    autofill::FormData /* the form */,
-                    base::TimeTicks /* timestamp */)
-
-// Send when a text field is done editing.
-IPC_MESSAGE_ROUTED0(AutofillHostMsg_DidEndTextFieldEditing)
-
-// Instructs the browser to hide the Autofill popup if it is open.
-IPC_MESSAGE_ROUTED0(AutofillHostMsg_HidePopup)
-
 // Instructs the browser that generation is available for this particular form.
 // This is used for UMA stats.
 IPC_MESSAGE_ROUTED1(AutofillHostMsg_GenerationAvailableForForm,
@@ -354,11 +262,6 @@
     int /* options bitmask of autofill::ShowPasswordSuggestionsOptions */,
     gfx::RectF /* input field bounds, window-relative */)
 
-// Inform browser of data list values for the curent field.
-IPC_MESSAGE_ROUTED2(AutofillHostMsg_SetDataList,
-                    std::vector<base::string16> /* values */,
-                    std::vector<base::string16> /* labels */)
-
 // Inform the browser which password form is currently focused, as a response
 // to the |AutofillMsg_FindFocusedPasswordForm| request. If no password form
 // is focused, the response will contain an empty |autofill::PasswordForm|.
diff --git a/components/autofill/content/public/interfaces/BUILD.gn b/components/autofill/content/public/interfaces/BUILD.gn
index 10d4ee20..9278f4b 100644
--- a/components/autofill/content/public/interfaces/BUILD.gn
+++ b/components/autofill/content/public/interfaces/BUILD.gn
@@ -12,6 +12,8 @@
 
   public_deps = [
     ":types",
+    "//mojo/common:common_custom_types",
+    "//ui/gfx/geometry/mojo",
   ]
 
   use_new_wrapper_types = false
diff --git a/components/autofill/content/public/interfaces/autofill_agent.mojom b/components/autofill/content/public/interfaces/autofill_agent.mojom
index 40c501d..cbdb78d 100644
--- a/components/autofill/content/public/interfaces/autofill_agent.mojom
+++ b/components/autofill/content/public/interfaces/autofill_agent.mojom
@@ -4,8 +4,51 @@
 
 module autofill.mojom;
 
+import "components/autofill/content/public/interfaces/autofill_types.mojom";
+
+// There is one instance of this interface per render frame in the render
+// process.
 interface AutofillAgent {
   // Tells the render frame that a user gesture was observed
   // somewhere in the tab (including in a different frame).
   FirstUserGestureObservedInTab();
+
+  // Instructs the renderer to fill the active form with the given form data.
+  // Please refer AutofillDriver.QueryFormFieldAutofill comments about the |id|.
+  FillForm(int32 id, FormData form);
+
+  // Instructs the renderer to preview the active form with the given form data.
+  // Please refer AutofillDriver.QueryFormFieldAutofill comments about the |id|.
+  PreviewForm(int32 id, FormData form);
+
+  // Sends the heuristic and server field type predictions to the renderer.
+  FieldTypePredictionsAvailable(array<FormDataPredictions> forms);
+
+  // Clears the currently displayed Autofill results.
+  ClearForm();
+
+  // Tells the renderer that the Autofill previewed form should be cleared.
+  ClearPreviewedForm();
+
+  // Sets the currently selected node's value.
+  FillFieldWithValue(string value);
+
+  // Sets the suggested value for the currently previewed node.
+  PreviewFieldWithValue(string value);
+
+  // Sets the currently selected node's value to be the given data list value.
+  AcceptDataListSuggestion(string value);
+
+  // Tells the renderer to fill the username and password with with given
+  // values.
+  FillPasswordSuggestion(string username, string password);
+
+  // Tells the renderer to preview the username and password with the given
+  // values.
+  PreviewPasswordSuggestion(string username, string password);
+
+  // Sent when a password form is initially detected and suggestions should be
+  // shown. Used by the fill-on-select experiment.
+  // |key| is the unique id associated with the password form fill data.
+  ShowInitialPasswordAccountSuggestions(int32 key, PasswordFormFillData form_data);
 };
diff --git a/components/autofill/content/public/interfaces/autofill_driver.mojom b/components/autofill/content/public/interfaces/autofill_driver.mojom
index 3724043..893adbd 100644
--- a/components/autofill/content/public/interfaces/autofill_driver.mojom
+++ b/components/autofill/content/public/interfaces/autofill_driver.mojom
@@ -4,7 +4,56 @@
 
 module autofill.mojom;
 
+import "components/autofill/content/public/interfaces/autofill_types.mojom";
+import "mojo/common/common_custom_types.mojom";
+import "ui/gfx/geometry/mojo/geometry.mojom";
+
+// There is one instance of this interface per render frame host in the browser
+// process.
 interface AutofillDriver {
   // Notification that there has been a user gesture.
   FirstUserGestureObserved();
+
+  // Notification that forms have been seen that are candidates for
+  // filling/submitting by the AutofillManager.
+  FormsSeen(array<FormData> forms, mojo.common.mojom.TimeTicks timestamp);
+
+  // Notification that a form is about to be submitted. The user hit the button.
+  WillSubmitForm(FormData form, mojo.common.mojom.TimeTicks timestamp);
+
+  // Notification that a form has been submitted.
+  FormSubmitted(FormData form);
+
+  // Notification that a form field's value has changed.
+  TextFieldDidChange(FormData form,
+                     FormFieldData field,
+                     mojo.common.mojom.TimeTicks timestamp);
+
+  // Queries the browser for Autofill suggestions for a form input field.
+  // |id| is the request ID which is used to map responses correctly.
+  QueryFormFieldAutofill(int32 id,
+                         FormData form,
+                         FormFieldData field,
+                         gfx.mojom.RectF bounding_box);
+
+  // Instructs the browser to hide the Autofill popup if it is open.
+  HidePopup();
+
+  // Sent immediately after the renderer receives a ping IPC.
+  PingAck();
+
+  // Sent when the current form is no longer focused.
+  FocusNoLongerOnForm();
+
+  // Sent when a form is filled with Autofill suggestions.
+  DidFillAutofillFormData(FormData form, mojo.common.mojom.TimeTicks timestamp);
+
+  // Sent when a form is previewed with Autofill suggestions.
+  DidPreviewAutofillFormData();
+
+  // Sent when a text field is done editing.
+  DidEndTextFieldEditing();
+
+  // Informs browser of data list values for the current field.
+  SetDataList(array<string> values, array<string> labels);
 };
diff --git a/components/autofill/content/renderer/BUILD.gn b/components/autofill/content/renderer/BUILD.gn
index 601e23d..4012297 100644
--- a/components/autofill/content/renderer/BUILD.gn
+++ b/components/autofill/content/renderer/BUILD.gn
@@ -36,6 +36,7 @@
     "//content/public/renderer",
     "//google_apis",
     "//ipc",
+    "//mojo/common:common_base",
     "//net",
     "//services/shell/public/cpp",
     "//skia",
diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc
index 44cee7f..a287c5b 100644
--- a/components/autofill/content/renderer/autofill_agent.cc
+++ b/components/autofill/content/renderer/autofill_agent.cc
@@ -42,6 +42,7 @@
 #include "content/public/common/url_constants.h"
 #include "content/public/renderer/render_frame.h"
 #include "content/public/renderer/render_view.h"
+#include "mojo/common/common_type_converters.h"
 #include "net/cert/cert_status_flags.h"
 #include "services/shell/public/cpp/interface_provider.h"
 #include "services/shell/public/cpp/interface_registry.h"
@@ -110,29 +111,7 @@
 void GetDataListSuggestions(const WebInputElement& element,
                             std::vector<base::string16>* values,
                             std::vector<base::string16>* labels) {
-  WebElementCollection options = element.dataListOptions();
-  if (options.isNull())
-    return;
-
-  // If the field accepts multiple email addresses, filter only on the last one.
-  base::string16 prefix = element.editingValue();
-  if (element.isMultiple() && element.isEmailField()) {
-    std::vector<base::string16> parts = base::SplitString(
-        prefix, base::ASCIIToUTF16(","), base::TRIM_WHITESPACE,
-        base::SPLIT_WANT_ALL);
-    if (!parts.empty())
-      base::TrimWhitespace(parts.back(), base::TRIM_LEADING, &prefix);
-  }
-
-  // Prefix filtering.
-  prefix = base::i18n::ToLower(prefix);
-  for (WebOptionElement option = options.firstItem().to<WebOptionElement>();
-       !option.isNull(); option = options.nextItem().to<WebOptionElement>()) {
-    if (!base::StartsWith(base::i18n::ToLower(base::string16(option.value())),
-                          prefix, base::CompareCase::SENSITIVE) ||
-        !element.isValidValue(option.value()))
-      continue;
-
+  for (const auto& option : element.filteredDataListOptions()) {
     values->push_back(option.value());
     if (option.value() != option.label())
       labels->push_back(option.label());
@@ -177,8 +156,10 @@
       ignore_text_changes_(false),
       is_popup_possibly_visible_(false),
       is_generation_popup_possibly_visible_(false),
+      binding_(this),
       weak_ptr_factory_(this) {
   render_frame->GetWebFrame()->setAutofillClient(this);
+  password_autofill_agent->SetAutofillAgent(this);
 
   // AutofillAgent is guaranteed to outlive |render_frame|.
   render_frame->GetInterfaceRegistry()->AddInterface(
@@ -194,7 +175,7 @@
 AutofillAgent::~AutofillAgent() {}
 
 void AutofillAgent::BindRequest(mojom::AutofillAgentRequest request) {
-  bindings_.AddBinding(this, std::move(request));
+  binding_.Bind(std::move(request));
 }
 
 bool AutofillAgent::FormDataCompare::operator()(const FormData& lhs,
@@ -203,31 +184,6 @@
          std::tie(rhs.name, rhs.origin, rhs.action, rhs.is_form_tag);
 }
 
-bool AutofillAgent::OnMessageReceived(const IPC::Message& message) {
-  bool handled = true;
-  IPC_BEGIN_MESSAGE_MAP(AutofillAgent, message)
-    IPC_MESSAGE_HANDLER(AutofillMsg_FillForm, OnFillForm)
-    IPC_MESSAGE_HANDLER(AutofillMsg_PreviewForm, OnPreviewForm)
-    IPC_MESSAGE_HANDLER(AutofillMsg_FieldTypePredictionsAvailable,
-                        OnFieldTypePredictionsAvailable)
-    IPC_MESSAGE_HANDLER(AutofillMsg_ClearForm, OnClearForm)
-    IPC_MESSAGE_HANDLER(AutofillMsg_ClearPreviewedForm, OnClearPreviewedForm)
-    IPC_MESSAGE_HANDLER(AutofillMsg_FillFieldWithValue, OnFillFieldWithValue)
-    IPC_MESSAGE_HANDLER(AutofillMsg_PreviewFieldWithValue,
-                        OnPreviewFieldWithValue)
-    IPC_MESSAGE_HANDLER(AutofillMsg_AcceptDataListSuggestion,
-                        OnAcceptDataListSuggestion)
-    IPC_MESSAGE_HANDLER(AutofillMsg_FillPasswordSuggestion,
-                        OnFillPasswordSuggestion)
-    IPC_MESSAGE_HANDLER(AutofillMsg_PreviewPasswordSuggestion,
-                        OnPreviewPasswordSuggestion)
-    IPC_MESSAGE_HANDLER(AutofillMsg_ShowInitialPasswordAccountSuggestions,
-                        OnShowInitialPasswordAccountSuggestions);
-    IPC_MESSAGE_UNHANDLED(handled = false)
-  IPC_END_MESSAGE_MAP()
-  return handled;
-}
-
 void AutofillAgent::DidCommitProvisionalLoad(bool is_new_navigation,
                                              bool is_same_page_navigation) {
   blink::WebFrame* frame = render_frame()->GetWebFrame();
@@ -273,7 +229,7 @@
     if (!last_interacted_form_.isNull()) {
       // Focus moved away from the last interacted form to somewhere else on
       // the page.
-      Send(new AutofillHostMsg_FocusNoLongerOnForm(routing_id()));
+      GetAutofillDriver()->FocusNoLongerOnForm();
     }
     return;
   }
@@ -285,7 +241,7 @@
       (!element || last_interacted_form_ != element->form())) {
     // The focused element is not part of the last interacted form (could be
     // in a different form).
-    Send(new AutofillHostMsg_FocusNoLongerOnForm(routing_id()));
+    GetAutofillDriver()->FocusNoLongerOnForm();
     return;
   }
 
@@ -316,13 +272,13 @@
   // because forms with a submit handler may fire both WillSendSubmitEvent
   // and WillSubmitForm, and we don't want duplicate messages.
   if (!submitted_forms_.count(form_data)) {
-    Send(new AutofillHostMsg_WillSubmitForm(routing_id(), form_data,
-                                            base::TimeTicks::Now()));
+    GetAutofillDriver()->WillSubmitForm(form_data, base::TimeTicks::Now());
     submitted_forms_.insert(form_data);
   }
 
-  if (form_submitted)
-    Send(new AutofillHostMsg_FormSubmitted(routing_id(), form_data));
+  if (form_submitted) {
+    GetAutofillDriver()->FormSubmitted(form_data);
+  }
 }
 
 void AutofillAgent::Shutdown() {
@@ -374,7 +330,7 @@
 
 void AutofillAgent::textFieldDidEndEditing(const WebInputElement& element) {
   password_autofill_agent_->TextFieldDidEndEditing(element);
-  Send(new AutofillHostMsg_DidEndTextFieldEditing(routing_id()));
+  GetAutofillDriver()->DidEndTextFieldEditing();
 }
 
 void AutofillAgent::textFieldDidChange(const WebFormControlElement& element) {
@@ -439,8 +395,8 @@
   FormFieldData field;
   if (form_util::FindFormAndFieldForFormControlElement(element, &form,
                                                        &field)) {
-    Send(new AutofillHostMsg_TextFieldDidChange(routing_id(), form, field,
-                                                base::TimeTicks::Now()));
+    GetAutofillDriver()->TextFieldDidChange(form, field,
+                                            base::TimeTicks::Now());
   }
 }
 
@@ -471,11 +427,10 @@
 void AutofillAgent::firstUserGestureObserved() {
   password_autofill_agent_->FirstUserGestureObserved();
 
-  ConnectToMojoAutofillDriverIfNeeded();
-  mojo_autofill_driver_->FirstUserGestureObserved();
+  GetAutofillDriver()->FirstUserGestureObserved();
 }
 
-void AutofillAgent::AcceptDataListSuggestion(
+void AutofillAgent::DoAcceptDataListSuggestion(
     const base::string16& suggested_value) {
   WebInputElement* input_element = toWebInputElement(&element_);
   DCHECK(input_element);
@@ -502,27 +457,7 @@
 
     new_value = base::JoinString(parts, base::ASCIIToUTF16(","));
   }
-  FillFieldWithValue(new_value, input_element);
-}
-
-void AutofillAgent::OnFieldTypePredictionsAvailable(
-    const std::vector<FormDataPredictions>& forms) {
-  for (size_t i = 0; i < forms.size(); ++i) {
-    form_cache_.ShowPredictions(forms[i]);
-  }
-}
-
-void AutofillAgent::OnFillForm(int query_id, const FormData& form) {
-  if (query_id != autofill_query_id_)
-    return;
-
-  was_query_node_autofilled_ = element_.isAutofilled();
-  form_util::FillForm(form, element_);
-  if (!element_.form().isNull())
-    last_interacted_form_ = element_.form();
-
-  Send(new AutofillHostMsg_DidFillAutofillFormData(routing_id(), form,
-                                                   base::TimeTicks::Now()));
+  DoFillFieldWithValue(new_value, input_element);
 }
 
 // mojom::AutofillAgent:
@@ -530,24 +465,44 @@
   password_autofill_agent_->FirstUserGestureObserved();
 }
 
-void AutofillAgent::OnPing() {
-  Send(new AutofillHostMsg_PingAck(routing_id()));
+void AutofillAgent::FillForm(int32_t id, const FormData& form) {
+  if (id != autofill_query_id_)
+    return;
+
+  was_query_node_autofilled_ = element_.isAutofilled();
+  form_util::FillForm(form, element_);
+  if (!element_.form().isNull())
+    last_interacted_form_ = element_.form();
+
+  GetAutofillDriver()->DidFillAutofillFormData(form, base::TimeTicks::Now());
 }
 
-void AutofillAgent::OnPreviewForm(int query_id, const FormData& form) {
-  if (query_id != autofill_query_id_)
+void AutofillAgent::PreviewForm(int32_t id, const FormData& form) {
+  if (id != autofill_query_id_)
     return;
 
   was_query_node_autofilled_ = element_.isAutofilled();
   form_util::PreviewForm(form, element_);
-  Send(new AutofillHostMsg_DidPreviewAutofillFormData(routing_id()));
+
+  GetAutofillDriver()->DidPreviewAutofillFormData();
 }
 
-void AutofillAgent::OnClearForm() {
+void AutofillAgent::OnPing() {
+  GetAutofillDriver()->PingAck();
+}
+
+void AutofillAgent::FieldTypePredictionsAvailable(
+    mojo::Array<FormDataPredictions> forms) {
+  for (const auto& form : forms) {
+    form_cache_.ShowPredictions(form);
+  }
+}
+
+void AutofillAgent::ClearForm() {
   form_cache_.ClearFormWithElement(element_);
 }
 
-void AutofillAgent::OnClearPreviewedForm() {
+void AutofillAgent::ClearPreviewedForm() {
   if (!element_.isNull()) {
     if (password_autofill_agent_->DidClearAutofillSelection(element_))
       return;
@@ -564,45 +519,40 @@
   }
 }
 
-void AutofillAgent::OnFillFieldWithValue(const base::string16& value) {
+void AutofillAgent::FillFieldWithValue(const mojo::String& value) {
   WebInputElement* input_element = toWebInputElement(&element_);
   if (input_element) {
-    FillFieldWithValue(value, input_element);
+    DoFillFieldWithValue(value.To<base::string16>(), input_element);
     input_element->setAutofilled(true);
   }
 }
 
-void AutofillAgent::OnPreviewFieldWithValue(const base::string16& value) {
+void AutofillAgent::PreviewFieldWithValue(const mojo::String& value) {
   WebInputElement* input_element = toWebInputElement(&element_);
   if (input_element)
-    PreviewFieldWithValue(value, input_element);
+    DoPreviewFieldWithValue(value.To<base::string16>(), input_element);
 }
 
-void AutofillAgent::OnAcceptDataListSuggestion(const base::string16& value) {
-  AcceptDataListSuggestion(value);
+void AutofillAgent::AcceptDataListSuggestion(const mojo::String& value) {
+  DoAcceptDataListSuggestion(value.To<base::string16>());
 }
 
-void AutofillAgent::OnFillPasswordSuggestion(const base::string16& username,
-                                             const base::string16& password) {
+void AutofillAgent::FillPasswordSuggestion(const mojo::String& username,
+                                           const mojo::String& password) {
   bool handled = password_autofill_agent_->FillSuggestion(
-      element_,
-      username,
-      password);
+      element_, username.To<base::string16>(), password.To<base::string16>());
   DCHECK(handled);
 }
 
-void AutofillAgent::OnPreviewPasswordSuggestion(
-    const base::string16& username,
-    const base::string16& password) {
+void AutofillAgent::PreviewPasswordSuggestion(const mojo::String& username,
+                                              const mojo::String& password) {
   bool handled = password_autofill_agent_->PreviewSuggestion(
-      element_,
-      username,
-      password);
+      element_, username.To<base::string16>(), password.To<base::string16>());
   DCHECK(handled);
 }
 
-void AutofillAgent::OnShowInitialPasswordAccountSuggestions(
-    int key,
+void AutofillAgent::ShowInitialPasswordAccountSuggestions(
+    int32_t key,
     const PasswordFormFillData& form_data) {
   std::vector<blink::WebInputElement> elements;
   std::unique_ptr<RendererSavePasswordProgressLogger> logger;
@@ -762,26 +712,23 @@
   }
 
   is_popup_possibly_visible_ = true;
-  Send(new AutofillHostMsg_SetDataList(routing_id(),
-                                       data_list_values,
-                                       data_list_labels));
 
-  Send(new AutofillHostMsg_QueryFormFieldAutofill(
-           routing_id(),
-           autofill_query_id_,
-           form,
-           field,
-           render_frame()->GetRenderView()->ElementBoundsInWindow(element_)));
+  GetAutofillDriver()->SetDataList(
+      mojo::Array<mojo::String>::From(data_list_values),
+      mojo::Array<mojo::String>::From(data_list_labels));
+  GetAutofillDriver()->QueryFormFieldAutofill(
+      autofill_query_id_, form, field,
+      render_frame()->GetRenderView()->ElementBoundsInWindow(element_));
 }
 
-void AutofillAgent::FillFieldWithValue(const base::string16& value,
-                                       WebInputElement* node) {
+void AutofillAgent::DoFillFieldWithValue(const base::string16& value,
+                                         WebInputElement* node) {
   base::AutoReset<bool> auto_reset(&ignore_text_changes_, true);
   node->setEditingValue(value.substr(0, node->maxLength()));
 }
 
-void AutofillAgent::PreviewFieldWithValue(const base::string16& value,
-                                          WebInputElement* node) {
+void AutofillAgent::DoPreviewFieldWithValue(const base::string16& value,
+                                            WebInputElement* node) {
   was_query_node_autofilled_ = element_.isAutofilled();
   node->setSuggestedValue(value.substr(0, node->maxLength()));
   node->setAutofilled(true);
@@ -798,8 +745,7 @@
 
   // Always communicate to browser process for topmost frame.
   if (!forms.empty() || !frame->parent()) {
-    Send(new AutofillHostMsg_FormsSeen(routing_id(), forms,
-                                       forms_seen_timestamp));
+    GetAutofillDriver()->FormsSeen(std::move(forms), forms_seen_timestamp);
   }
 }
 
@@ -808,7 +754,8 @@
     return;
   is_popup_possibly_visible_ = false;
   is_generation_popup_possibly_visible_ = false;
-  Send(new AutofillHostMsg_HidePopup(routing_id()));
+
+  GetAutofillDriver()->HidePopup();
 }
 
 bool AutofillAgent::IsUserGesture() const {
@@ -837,12 +784,13 @@
   password_autofill_agent_->AJAXSucceeded();
 }
 
-void AutofillAgent::ConnectToMojoAutofillDriverIfNeeded() {
-  if (mojo_autofill_driver_.is_bound() &&
-      !mojo_autofill_driver_.encountered_error())
-    return;
+const mojom::AutofillDriverPtr& AutofillAgent::GetAutofillDriver() {
+  if (!mojo_autofill_driver_) {
+    render_frame()->GetRemoteInterfaces()->GetInterface(
+        mojo::GetProxy(&mojo_autofill_driver_));
+  }
 
-  render_frame()->GetRemoteInterfaces()->GetInterface(&mojo_autofill_driver_);
+  return mojo_autofill_driver_;
 }
 
 // LegacyAutofillAgent ---------------------------------------------------------
diff --git a/components/autofill/content/renderer/autofill_agent.h b/components/autofill/content/renderer/autofill_agent.h
index 1fa267a1..1808bc21 100644
--- a/components/autofill/content/renderer/autofill_agent.h
+++ b/components/autofill/content/renderer/autofill_agent.h
@@ -18,7 +18,7 @@
 #include "components/autofill/content/renderer/page_click_listener.h"
 #include "content/public/renderer/render_frame_observer.h"
 #include "content/public/renderer/render_view_observer.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
+#include "mojo/public/cpp/bindings/binding.h"
 #include "third_party/WebKit/public/web/WebAutofillClient.h"
 #include "third_party/WebKit/public/web/WebFormControlElement.h"
 #include "third_party/WebKit/public/web/WebFormElement.h"
@@ -59,6 +59,27 @@
 
   void BindRequest(mojom::AutofillAgentRequest request);
 
+  const mojom::AutofillDriverPtr& GetAutofillDriver();
+
+  // mojom::AutofillAgent:
+  void FirstUserGestureObservedInTab() override;
+  void FillForm(int32_t id, const FormData& form) override;
+  void PreviewForm(int32_t id, const FormData& form) override;
+  void FieldTypePredictionsAvailable(
+      mojo::Array<FormDataPredictions> forms) override;
+  void ClearForm() override;
+  void ClearPreviewedForm() override;
+  void FillFieldWithValue(const mojo::String& value) override;
+  void PreviewFieldWithValue(const mojo::String& value) override;
+  void AcceptDataListSuggestion(const mojo::String& value) override;
+  void FillPasswordSuggestion(const mojo::String& username,
+                              const mojo::String& password) override;
+  void PreviewPasswordSuggestion(const mojo::String& username,
+                                 const mojo::String& password) override;
+  void ShowInitialPasswordAccountSuggestions(
+      int32_t key,
+      const PasswordFormFillData& form_data) override;
+
  protected:
   // blink::WebAutofillClient:
   void didAssociateFormControls(
@@ -123,7 +144,6 @@
   };
 
   // content::RenderFrameObserver:
-  bool OnMessageReceived(const IPC::Message& message) override;
   void DidCommitProvisionalLoad(bool is_new_navigation,
                                 bool is_same_page_navigation) override;
   void DidFinishDocumentLoad() override;
@@ -166,28 +186,7 @@
   void firstUserGestureObserved() override;
   void ajaxSucceeded() override;
 
-  void OnFieldTypePredictionsAvailable(
-      const std::vector<FormDataPredictions>& forms);
-  void OnFillForm(int query_id, const FormData& form);
   void OnPing();
-  void OnPreviewForm(int query_id, const FormData& form);
-
-  // mojom::AutofillAgent:
-  void FirstUserGestureObservedInTab() override;
-
-  // For external Autofill selection.
-  void OnClearForm();
-  void OnClearPreviewedForm();
-  void OnFillFieldWithValue(const base::string16& value);
-  void OnPreviewFieldWithValue(const base::string16& value);
-  void OnAcceptDataListSuggestion(const base::string16& value);
-  void OnFillPasswordSuggestion(const base::string16& username,
-                                const base::string16& password);
-  void OnPreviewPasswordSuggestion(const base::string16& username,
-                                   const base::string16& password);
-  void OnShowInitialPasswordAccountSuggestions(
-      int key,
-      const PasswordFormFillData& form_data);
 
   // Called when a same-page navigation is detected.
   void OnSamePageNavigationCompleted();
@@ -212,7 +211,7 @@
   void QueryAutofillSuggestions(const blink::WebFormControlElement& element);
 
   // Sets the element value to reflect the selected |suggested_value|.
-  void AcceptDataListSuggestion(const base::string16& suggested_value);
+  void DoAcceptDataListSuggestion(const base::string16& suggested_value);
 
   // Fills |form| and |field| with the FormData and FormField corresponding to
   // |node|. Returns true if the data was found; and false otherwise.
@@ -222,14 +221,14 @@
       FormFieldData* field) WARN_UNUSED_RESULT;
 
   // Set |node| to display the given |value|.
-  void FillFieldWithValue(const base::string16& value,
-                          blink::WebInputElement* node);
+  void DoFillFieldWithValue(const base::string16& value,
+                            blink::WebInputElement* node);
 
   // Set |node| to display the given |value| as a preview.  The preview is
   // visible on screen to the user, but not visible to the page via the DOM or
   // JavaScript.
-  void PreviewFieldWithValue(const base::string16& value,
-                             blink::WebInputElement* node);
+  void DoPreviewFieldWithValue(const base::string16& value,
+                               blink::WebInputElement* node);
 
   // Notifies browser of new fillable forms in |render_frame|.
   void ProcessForms();
@@ -249,8 +248,6 @@
   // overriden in tests.
   virtual bool IsUserGesture() const;
 
-  void ConnectToMojoAutofillDriverIfNeeded();
-
   // Formerly cached forms for all frames, now only caches forms for the current
   // frame.
   FormCache form_cache_;
@@ -301,7 +298,7 @@
   // for the password manager. TODO(gcasto): Have both UIs show on focus.
   bool is_generation_popup_possibly_visible_;
 
-  mojo::BindingSet<mojom::AutofillAgent> bindings_;
+  mojo::Binding<mojom::AutofillAgent> binding_;
 
   mojom::AutofillDriverPtr mojo_autofill_driver_;
 
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc
index a7c7efa..57da225 100644
--- a/components/autofill/content/renderer/form_autofill_util.cc
+++ b/components/autofill/content/renderer/form_autofill_util.cc
@@ -1398,8 +1398,15 @@
     if (!g_prevent_layout)
       field->is_focusable = element.isFocusable();
     field->should_autocomplete = element.autoComplete();
+
+    // Use 'text-align: left|right' if set or 'direction' otherwise.
+    // See crbug.com/482339
     field->text_direction = element.directionForFormData() ==
         "rtl" ? base::i18n::RIGHT_TO_LEFT : base::i18n::LEFT_TO_RIGHT;
+    if (element.alignmentForFormData() == "left")
+        field->text_direction = base::i18n::LEFT_TO_RIGHT;
+    else if (element.alignmentForFormData() == "right")
+        field->text_direction = base::i18n::RIGHT_TO_LEFT;
   }
 
   if (IsAutofillableInputElement(input_element)) {
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc
index 19d6562a..93dbdd5 100644
--- a/components/autofill/content/renderer/password_autofill_agent.cc
+++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -559,6 +559,10 @@
 PasswordAutofillAgent::~PasswordAutofillAgent() {
 }
 
+void PasswordAutofillAgent::SetAutofillAgent(AutofillAgent* autofill_agent) {
+  autofill_agent_ = autofill_agent;
+}
+
 PasswordAutofillAgent::PasswordValueGatekeeper::PasswordValueGatekeeper()
     : was_user_gesture_seen_(false) {
 }
@@ -1411,7 +1415,7 @@
 
   if (user_input.isPasswordField() && !user_input.isAutofilled() &&
       !user_input.value().isEmpty()) {
-    Send(new AutofillHostMsg_HidePopup(routing_id()));
+    GetAutofillDriver()->HidePopup();
     return false;
   }
 
@@ -1480,4 +1484,9 @@
          provisionally_saved_form_->new_password_value.empty());
 }
 
+const mojom::AutofillDriverPtr& PasswordAutofillAgent::GetAutofillDriver() {
+  DCHECK(autofill_agent_);
+  return autofill_agent_->GetAutofillDriver();
+}
+
 }  // namespace autofill
diff --git a/components/autofill/content/renderer/password_autofill_agent.h b/components/autofill/content/renderer/password_autofill_agent.h
index bc26b4f..9a28887 100644
--- a/components/autofill/content/renderer/password_autofill_agent.h
+++ b/components/autofill/content/renderer/password_autofill_agent.h
@@ -10,6 +10,8 @@
 #include <vector>
 
 #include "base/macros.h"
+#include "components/autofill/content/public/interfaces/autofill_driver.mojom.h"
+#include "components/autofill/content/renderer/autofill_agent.h"
 #include "components/autofill/content/renderer/password_form_conversion_utils.h"
 #include "components/autofill/core/common/form_data_predictions.h"
 #include "components/autofill/core/common/password_form_field_prediction_map.h"
@@ -34,6 +36,8 @@
   explicit PasswordAutofillAgent(content::RenderFrame* render_frame);
   ~PasswordAutofillAgent() override;
 
+  void SetAutofillAgent(AutofillAgent* autofill_agent);
+
   // WebFrameClient editor related calls forwarded by AutofillAgent.
   // If they return true, it indicates the event was consumed and should not
   // be used for any other autofill activity.
@@ -224,6 +228,8 @@
   // Helper function called when in-page navigation completed
   void OnSamePageNavigationCompleted();
 
+  const mojom::AutofillDriverPtr& GetAutofillDriver();
+
   // The logins we have filled so far with their associated info.
   WebInputToPasswordInfoMap web_input_to_password_info_;
   // A (sort-of) reverse map to |login_to_password_info_|.
@@ -255,6 +261,8 @@
   // fields for individual forms.
   FormsPredictionsMap form_predictions_;
 
+  AutofillAgent* autofill_agent_;  // Weak reference.
+
   DISALLOW_COPY_AND_ASSIGN(PasswordAutofillAgent);
 };
 
diff --git a/components/cast_certificate/cast_cert_validator_unittest.cc b/components/cast_certificate/cast_cert_validator_unittest.cc
index 275e18a..30b5c38 100644
--- a/components/cast_certificate/cast_cert_validator_unittest.cc
+++ b/components/cast_certificate/cast_cert_validator_unittest.cc
@@ -90,6 +90,10 @@
 }
 
 // Creates a time in UTC at midnight.
+//
+// The maximum date usable here is limited to year 2038 on 32 bit systems due to
+// base::Time::FromExploded clamping the range to what is supported by mktime
+// and timegm.
 base::Time CreateDate(int year, int month, int day) {
   base::Time::Exploded time = {0};
   time.year = year;
@@ -113,12 +117,12 @@
   return CreateDate(2015, 1, 1);
 }
 
-// Returns 2040-03-01 00:00:00 UTC.
+// Returns 2037-03-01 00:00:00 UTC.
 //
 // This is so far in the future that the test chains in this unit-test
 // should all be invalid.
-base::Time MarchFirst2040() {
-  return CreateDate(2040, 3, 1);
+base::Time MarchFirst2037() {
+  return CreateDate(2037, 3, 1);
 }
 
 // Tests verifying a valid certificate chain of length 2:
@@ -261,7 +265,7 @@
 
   // Use a time after notAfter.
   RunTest(RESULT_FAIL, "", CastDeviceCertPolicy::NONE, kCertsFile,
-          MarchFirst2040(), "");
+          MarchFirst2037(), "");
 }
 
 // Tests verifying a valid certificate chain of length 3:
diff --git a/components/certificate_transparency/single_tree_tracker_unittest.cc b/components/certificate_transparency/single_tree_tracker_unittest.cc
index 8bcb171..2f972f6 100644
--- a/components/certificate_transparency/single_tree_tracker_unittest.cc
+++ b/components/certificate_transparency/single_tree_tracker_unittest.cc
@@ -56,7 +56,7 @@
 class SingleTreeTrackerTest : public ::testing::Test {
   void SetUp() override {
     log_ = net::CTLogVerifier::Create(net::ct::GetTestPublicKey(), "testlog",
-                                      "https://ct.example.com");
+                                      "https://ct.example.com", "");
 
     ASSERT_TRUE(log_);
     ASSERT_EQ(log_->key_id(), net::ct::GetTestPublicKeyId());
diff --git a/components/component_updater/BUILD.gn b/components/component_updater/BUILD.gn
index b2adc5a..210a6be 100644
--- a/components/component_updater/BUILD.gn
+++ b/components/component_updater/BUILD.gn
@@ -50,6 +50,7 @@
   testonly = true
   sources = [
     "component_updater_service_unittest.cc",
+    "configurator_impl_unittest.cc",
     "default_component_installer_unittest.cc",
     "timer_unittest.cc",
   ]
diff --git a/components/component_updater/configurator_impl.cc b/components/component_updater/configurator_impl.cc
index 8da26fd6..9c4b68c 100644
--- a/components/component_updater/configurator_impl.cc
+++ b/components/component_updater/configurator_impl.cc
@@ -25,12 +25,15 @@
 namespace component_updater {
 
 namespace {
+
 // Default time constants.
 const int kDelayOneMinute = 60;
 const int kDelayOneHour = kDelayOneMinute * 60;
 
-// Debug values you can pass to --component-updater=value1,value2.
-// Speed up component checking.
+// Debug values you can pass to --component-updater=value1,value2. Do not
+// use these values in production code.
+
+// Speed up the initial component checking.
 const char kSwitchFastUpdate[] = "fast-update";
 
 // Add "testrequest=1" attribute to the update check request.
@@ -123,7 +126,7 @@
 }
 
 int ConfiguratorImpl::NextCheckDelay() const {
-  return fast_update_ ? 60 : (6 * kDelayOneHour);
+  return 6 * kDelayOneHour;
 }
 
 int ConfiguratorImpl::StepDelay() const {
diff --git a/components/component_updater/configurator_impl_unittest.cc b/components/component_updater/configurator_impl_unittest.cc
new file mode 100644
index 0000000..ec0c1cd
--- /dev/null
+++ b/components/component_updater/configurator_impl_unittest.cc
@@ -0,0 +1,53 @@
+// Copyright (c) 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 <memory>
+
+#include "base/command_line.h"
+#include "base/macros.h"
+#include "components/component_updater/configurator_impl.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace component_updater {
+
+namespace {
+
+const int kDelayOneMinute = 60;
+const int kDelayOneHour = kDelayOneMinute * 60;
+
+}  // namespace
+
+using base::CommandLine;
+
+class ComponentUpdaterConfiguratorImplTest : public testing::Test {
+ public:
+  ComponentUpdaterConfiguratorImplTest() {}
+  ~ComponentUpdaterConfiguratorImplTest() override {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ComponentUpdaterConfiguratorImplTest);
+};
+
+TEST_F(ComponentUpdaterConfiguratorImplTest, FastUpdate) {
+  // Test the default timing values when no command line argument is present.
+  base::CommandLine cmdline(base::CommandLine::NO_PROGRAM);
+  std::unique_ptr<ConfiguratorImpl> config(
+      new ConfiguratorImpl(&cmdline, nullptr, false));
+  CHECK_EQ(6 * kDelayOneMinute, config->InitialDelay());
+  CHECK_EQ(6 * kDelayOneHour, config->NextCheckDelay());
+  CHECK_EQ(1, config->StepDelay());
+  CHECK_EQ(30 * kDelayOneMinute, config->OnDemandDelay());
+  CHECK_EQ(15 * kDelayOneMinute, config->UpdateDelay());
+
+  // Test the fast-update timings.
+  cmdline.AppendSwitchASCII("--component-updater", "fast-update");
+  config.reset(new ConfiguratorImpl(&cmdline, nullptr, false));
+  CHECK_EQ(10, config->InitialDelay());
+  CHECK_EQ(6 * kDelayOneHour, config->NextCheckDelay());
+  CHECK_EQ(1, config->StepDelay());
+  CHECK_EQ(2, config->OnDemandDelay());
+  CHECK_EQ(10, config->UpdateDelay());
+}
+
+}  // namespace component_updater
diff --git a/components/components_tests.gyp b/components/components_tests.gyp
index 199b225..8053c8d 100644
--- a/components/components_tests.gyp
+++ b/components/components_tests.gyp
@@ -135,6 +135,7 @@
     'component_updater_unittest_sources': [
       'component_updater/component_updater_service_unittest.cc',
       'component_updater/default_component_installer_unittest.cc',
+      'component_updater/configurator_impl_unittest.cc',
       'component_updater/timer_unittest.cc',
     ],
     'content_settings_unittest_sources': [
@@ -619,6 +620,7 @@
       'proximity_auth/ble/bluetooth_low_energy_connection_finder_unittest.cc',
       'proximity_auth/ble/bluetooth_low_energy_connection_unittest.cc',
       'proximity_auth/ble/bluetooth_low_energy_device_whitelist_unittest.cc',
+      'proximity_auth/ble/bluetooth_low_energy_weave_client_connection_unittest.cc',
       'proximity_auth/ble/bluetooth_low_energy_weave_packet_generator_unittest.cc',
       'proximity_auth/ble/bluetooth_low_energy_weave_packet_receiver_unittest.cc',
       'proximity_auth/bluetooth_connection_finder_unittest.cc',
@@ -1345,6 +1347,7 @@
           ],
           'dependencies': [
             '../content/content_shell_and_tests.gyp:test_support_content',
+            '../mojo/mojo_base.gyp:mojo_common_lib',
             '../skia/skia.gyp:skia',
             'components.gyp:autofill_content_browser',
             'components.gyp:autofill_content_renderer',
@@ -1607,6 +1610,7 @@
         }],
         ['OS=="linux" and chromeos!=1', {
           'sources': [
+            'os_crypt/key_storage_kwallet_unittest.cc',
             'os_crypt/kwallet_dbus_unittest.cc',
             'os_crypt/os_crypt_linux_unittest.cc',
             'os_crypt/os_crypt_util_linux_unittest.cc',
diff --git a/components/crash/content/browser/crash_handler_host_linux.cc b/components/crash/content/browser/crash_handler_host_linux.cc
index 393c047..8c9216ff1 100644
--- a/components/crash/content/browser/crash_handler_host_linux.cc
+++ b/components/crash/content/browser/crash_handler_host_linux.cc
@@ -28,6 +28,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/threading/thread.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "breakpad/src/client/linux/handler/exception_handler.h"
 #include "breakpad/src/client/linux/minidump_writer/linux_dumper.h"
 #include "breakpad/src/client/linux/minidump_writer/minidump_writer.h"
@@ -55,6 +56,12 @@
 // The length of the regular payload:
 const size_t kCrashContextSize = sizeof(ExceptionHandler::CrashContext);
 
+// Crashing thread might be in "running" state, i.e. after sys_sendmsg() and
+// before sys_read(). Retry 3 times with interval of 100 ms when translating
+// TID.
+const int kNumAttemptsTranslatingTid = 3;
+const int kRetryIntervalTranslatingTidInMs = 100;
+
 // Handles the crash dump and frees the allocated BreakpadInfo struct.
 void CrashDumpTask(CrashHandlerHostLinux* handler,
                    std::unique_ptr<BreakpadInfo> info) {
@@ -280,11 +287,60 @@
   // but we just check syscall_number through arg3.
   base::StringAppendF(&expected_syscall_data, "%d 0x%x %p 0x1 ",
                       SYS_read, tid_fd, tid_buf_addr);
+
+  FindCrashingThreadAndDump(crashing_pid,
+                            expected_syscall_data,
+                            std::move(crash_context),
+                            std::move(crash_keys),
+#if defined(ADDRESS_SANITIZER)
+                            std::move(asan_report),
+#endif
+                            uptime,
+                            oom_size,
+                            signal_fd.release(),
+                            0);
+}
+
+void CrashHandlerHostLinux::FindCrashingThreadAndDump(
+    pid_t crashing_pid,
+    const std::string& expected_syscall_data,
+    std::unique_ptr<char[]> crash_context,
+    std::unique_ptr<CrashKeyStorage> crash_keys,
+#if defined(ADDRESS_SANITIZER)
+    std::unique_ptr<char[]> asan_report,
+#endif
+    uint64_t uptime,
+    size_t oom_size,
+    int signal_fd,
+    int attempt) {
   bool syscall_supported = false;
-  pid_t crashing_tid =
-      base::FindThreadIDWithSyscall(crashing_pid,
-                                    expected_syscall_data,
-                                    &syscall_supported);
+  pid_t crashing_tid = base::FindThreadIDWithSyscall(
+      crashing_pid, expected_syscall_data, &syscall_supported);
+  ++attempt;
+  if (crashing_tid == -1 && syscall_supported &&
+      attempt <= kNumAttemptsTranslatingTid) {
+    LOG(WARNING) << "Could not translate tid, attempt = " << attempt
+                 << " retry ...";
+    base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE,
+      base::Bind(&CrashHandlerHostLinux::FindCrashingThreadAndDump,
+                 base::Unretained(this),
+                 crashing_pid,
+                 expected_syscall_data,
+                 base::Passed(&crash_context),
+                 base::Passed(&crash_keys),
+#if defined(ADDRESS_SANITIZER)
+                 base::Passed(&asan_report),
+#endif
+                 uptime,
+                 oom_size,
+                 signal_fd,
+                 attempt),
+      base::TimeDelta::FromMilliseconds(kRetryIntervalTranslatingTidInMs));
+    return;
+  }
+
+
   if (crashing_tid == -1) {
     // We didn't find the thread we want. Maybe it didn't reach
     // sys_read() yet or the thread went away.  We'll just take a
@@ -338,7 +394,7 @@
                  base::Passed(&info),
                  base::Passed(&crash_context),
                  crashing_pid,
-                 signal_fd.release()));
+                 signal_fd));
 }
 
 void CrashHandlerHostLinux::WriteDumpFile(std::unique_ptr<BreakpadInfo> info,
diff --git a/components/crash/content/browser/crash_handler_host_linux.h b/components/crash/content/browser/crash_handler_host_linux.h
index 4052d639..efb7520 100644
--- a/components/crash/content/browser/crash_handler_host_linux.h
+++ b/components/crash/content/browser/crash_handler_host_linux.h
@@ -15,6 +15,7 @@
 #include "base/macros.h"
 #include "base/message_loop/message_loop.h"
 #include "base/threading/sequenced_worker_pool.h"
+#include "components/crash/content/app/breakpad_linux_impl.h"
 
 namespace base {
 class Thread;
@@ -71,6 +72,19 @@
   // Continue OnFileCanReadWithoutBlocking()'s work on the IO thread.
   void QueueCrashDumpTask(std::unique_ptr<BreakpadInfo> info, int signal_fd);
 
+  // Find crashing thread (may delay and retry) and dump on IPC thread.
+  void FindCrashingThreadAndDump(pid_t crashing_pid,
+                                 const std::string& expected_syscall_data,
+                                 std::unique_ptr<char[]> crash_context,
+                                 std::unique_ptr<CrashKeyStorage> crash_keys,
+#if defined(ADDRESS_SANITIZER)
+                                 std::unique_ptr<char[]> asan_report,
+#endif
+                                 uint64_t uptime,
+                                 size_t oom_size,
+                                 int signal_fd,
+                                 int attempt);
+
   std::string process_type_;
   base::FilePath dumps_path_;
 #if !defined(OS_ANDROID)
diff --git a/components/crash/content/tools/generate_breakpad_symbols.py b/components/crash/content/tools/generate_breakpad_symbols.py
index b4c3b48..d076e8fa 100755
--- a/components/crash/content/tools/generate_breakpad_symbols.py
+++ b/components/crash/content/tools/generate_breakpad_symbols.py
@@ -175,7 +175,7 @@
           break
 
         binary_info = GetBinaryInfoFromHeaderInfo(
-            GetCommandOutput([dump_syms, '-i', binary]))
+            GetCommandOutput([dump_syms, '-i', binary]).splitlines()[0])
         if not binary_info:
           should_dump_syms = False
           reason = "Could not obtain binary information."
diff --git a/components/exo/shell_surface.cc b/components/exo/shell_surface.cc
index 06c277d..94b926d 100644
--- a/components/exo/shell_surface.cc
+++ b/components/exo/shell_surface.cc
@@ -29,6 +29,7 @@
 #include "ui/gfx/path.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_observer.h"
+#include "ui/wm/core/coordinate_conversion.h"
 #include "ui/wm/core/shadow.h"
 #include "ui/wm/core/shadow_controller.h"
 #include "ui/wm/core/shadow_types.h"
@@ -1147,10 +1148,10 @@
   gfx::Rect visible_bounds = GetVisibleBounds();
   gfx::Rect new_widget_bounds = visible_bounds;
 
-  // Avoid changing widget origin unless initial bounds were specificed and
+  // Avoid changing widget origin unless initial bounds were specified and
   // widget origin is always relative to it.
   if (initial_bounds_.IsEmpty())
-    new_widget_bounds.set_origin(widget_->GetNativeWindow()->bounds().origin());
+    new_widget_bounds.set_origin(widget_->GetWindowBoundsInScreen().origin());
 
   // Update widget origin using the surface origin if the current location of
   // surface is being anchored to one side of the widget as a result of a
@@ -1158,9 +1159,7 @@
   if (resize_component_ != HTCAPTION) {
     gfx::Point new_widget_origin =
         GetSurfaceOrigin() + visible_bounds.OffsetFromOrigin();
-    aura::Window::ConvertPointToTarget(widget_->GetNativeWindow(),
-                                       widget_->GetNativeWindow()->parent(),
-                                       &new_widget_origin);
+    wm::ConvertPointToScreen(widget_->GetNativeWindow(), &new_widget_origin);
     new_widget_bounds.set_origin(new_widget_origin);
   }
 
@@ -1168,7 +1167,7 @@
   // should not result in a configure request.
   DCHECK(!ignore_window_bounds_changes_);
   ignore_window_bounds_changes_ = true;
-  if (widget_->GetNativeWindow()->bounds() != new_widget_bounds)
+  if (widget_->GetWindowBoundsInScreen() != new_widget_bounds)
     widget_->SetBounds(new_widget_bounds);
   ignore_window_bounds_changes_ = false;
 
diff --git a/components/exo/test/run_all_unittests.cc b/components/exo/test/run_all_unittests.cc
index cc90b71..e69d387 100644
--- a/components/exo/test/run_all_unittests.cc
+++ b/components/exo/test/run_all_unittests.cc
@@ -9,7 +9,7 @@
 int main(int argc, char** argv) {
   ash::test::AuraShellTestSuite test_suite(argc, argv);
 
-  return base::LaunchUnitTests(argc, argv,
-                               base::Bind(&ash::test::AuraShellTestSuite::Run,
-                                          base::Unretained(&test_suite)));
+  return base::LaunchUnitTestsSerially(
+      argc, argv, base::Bind(&ash::test::AuraShellTestSuite::Run,
+                             base::Unretained(&test_suite)));
 }
diff --git a/components/history/core/browser/typed_url_syncable_service.cc b/components/history/core/browser/typed_url_syncable_service.cc
index b152df1..018bf14 100644
--- a/components/history/core/browser/typed_url_syncable_service.cc
+++ b/components/history/core/browser/typed_url_syncable_service.cc
@@ -150,6 +150,9 @@
     const sync_pb::EntitySpecifics& specifics = sync_iter->GetSpecifics();
     const sync_pb::TypedUrlSpecifics& typed_url(specifics.typed_url());
 
+    if (ShouldIgnoreUrl(GURL(typed_url.url())))
+      continue;
+
     // Add url to cache of sync state. Note that this is done irrespective of
     // whether the synced url is ignored locally, so that we know what to delete
     // at a later point.
@@ -747,6 +750,12 @@
   if (net::IsLocalhost(url.host()))
     return true;
 
+  // Ignore username and password, sonce history backend will remove user name
+  // and password in URLDatabase::GURLToDatabaseURL and send username/password
+  // removed url to sync later.
+  if (url.has_username() || url.has_password())
+    return true;
+
   return false;
 }
 
diff --git a/components/history/core/browser/typed_url_syncable_service_unittest.cc b/components/history/core/browser/typed_url_syncable_service_unittest.cc
index beb3e0e..fbb4c68 100644
--- a/components/history/core/browser/typed_url_syncable_service_unittest.cc
+++ b/components/history/core/browser/typed_url_syncable_service_unittest.cc
@@ -1075,6 +1075,50 @@
             url_specifics.visit_transitions(0));
 }
 
+// Check that there is no crash during start sync, if history backend and sync
+// have same url, but sync has username/password in it.
+// Also check sync will not accept url with username and password.
+TEST_F(TypedUrlSyncableServiceTest, MergeUrlsWithUsernameAndPassword) {
+  const char kURLWithUsernameAndPassword[] =
+      "http://username:password@pie.com/";
+
+  // Add a url to backend.
+  VisitVector visits;
+  URLRow local_row = MakeTypedUrlRow(kURL, kTitle2, 1, 3, false, &visits);
+  fake_history_backend_->SetVisitsForUrl(local_row, visits);
+
+  // Create sync data for the same url but contain username and password.
+  VisitVector server_visits;
+  URLRow server_row = MakeTypedUrlRow(kURLWithUsernameAndPassword, kTitle, 1, 3,
+                                      false, &server_visits);
+  syncer::SyncDataList initial_sync_data;
+  sync_pb::EntitySpecifics entity_specifics;
+  sync_pb::TypedUrlSpecifics* typed_url = entity_specifics.mutable_typed_url();
+  WriteToTypedUrlSpecifics(server_row, server_visits, typed_url);
+  syncer::SyncData data =
+      syncer::SyncData::CreateLocalData(kURL, kTitle, entity_specifics);
+
+  // Make sure there is no crash when merge two urls.
+  initial_sync_data.push_back(data);
+  StartSyncing(initial_sync_data);
+
+  // Check that the username and password url did not get merged.
+  std::set<GURL> sync_state;
+  GetSyncedUrls(&sync_state);
+  EXPECT_EQ(1U, sync_state.size());
+  EXPECT_EQ(1U, sync_state.count(GURL(kURL)));
+
+  // Notify typed url sync service of the update.
+  typed_url_sync_service_->OnURLVisited(
+      fake_history_backend_.get(), ui::PAGE_TRANSITION_TYPED, server_row,
+      RedirectList(), base::Time::FromInternalValue(7));
+
+  // Check username/password url is not synced.
+  GetSyncedUrls(&sync_state);
+  EXPECT_EQ(1U, sync_state.size());
+  EXPECT_EQ(1U, sync_state.count(GURL(kURL)));
+}
+
 // Create a remote typed URL and visit, then send to syncable service after sync
 // has started. Check that local DB is received the new URL and visit.
 TEST_F(TypedUrlSyncableServiceTest, AddUrlAndVisits) {
diff --git a/components/memory_coordinator/browser/memory_coordinator.cc b/components/memory_coordinator/browser/memory_coordinator.cc
index b4e714a..9291fd0 100644
--- a/components/memory_coordinator/browser/memory_coordinator.cc
+++ b/components/memory_coordinator/browser/memory_coordinator.cc
@@ -4,8 +4,6 @@
 
 #include "components/memory_coordinator/browser/memory_coordinator.h"
 
-#include "base/memory/memory_pressure_listener.h"
-
 namespace memory_coordinator {
 
 // The implementation of MemoryCoordinatorHandle. See memory_coordinator.mojom
@@ -34,22 +32,11 @@
 };
 
 MemoryCoordinator::MemoryCoordinator()
-    : pressure_level_dispatcher_(
+    : pressure_listener_(
           base::Bind(&MemoryCoordinator::OnMemoryPressure,
-                     base::Unretained(this))) {
-  auto* monitor = base::MemoryPressureMonitor::Get();
-  if (monitor) {
-    monitor->SetDispatchCallback(pressure_level_dispatcher_);
-  }
-}
+                     base::Unretained(this))) {}
 
-MemoryCoordinator::~MemoryCoordinator() {
-  auto* monitor = base::MemoryPressureMonitor::Get();
-  if (monitor) {
-    monitor->SetDispatchCallback(
-        base::Bind(&base::MemoryPressureListener::NotifyMemoryPressure));
-  }
-}
+MemoryCoordinator::~MemoryCoordinator() {}
 
 void MemoryCoordinator::CreateHandle(
     int render_process_id,
@@ -70,7 +57,7 @@
 }
 
 void MemoryCoordinator::OnMemoryPressure(
-    base::MemoryPressureMonitor::MemoryPressureLevel level) {
+    base::MemoryPressureListener::MemoryPressureLevel level) {
   // TODO(bashi): The current implementation just translates memory pressure
   // levels to memory coordinator states. The logic will be replaced with
   // the priority tracker.
diff --git a/components/memory_coordinator/browser/memory_coordinator.h b/components/memory_coordinator/browser/memory_coordinator.h
index 51dcb5d..598132d 100644
--- a/components/memory_coordinator/browser/memory_coordinator.h
+++ b/components/memory_coordinator/browser/memory_coordinator.h
@@ -5,7 +5,7 @@
 #ifndef COMPONENTS_MEMORY_COORDINATOR_BROWSER_MEMORY_COORDINATOR_H_
 #define COMPONENTS_MEMORY_COORDINATOR_BROWSER_MEMORY_COORDINATOR_H_
 
-#include "base/memory/memory_pressure_monitor.h"
+#include "base/memory/memory_pressure_listener.h"
 #include "components/memory_coordinator/common/client_registry.h"
 #include "components/memory_coordinator/public/interfaces/memory_coordinator.mojom.h"
 #include "mojo/public/cpp/bindings/binding.h"
@@ -31,17 +31,17 @@
  private:
   void OnConnectionError(int render_process_id);
 
-  // Called when MemoryPressureMonitor detects memory pressure.
-  void OnMemoryPressure(base::MemoryPressureMonitor::MemoryPressureLevel level);
-
-  // A callback invoked when MemoryPressureMonitor detects memory pressure.
-  base::MemoryPressureMonitor::DispatchCallback pressure_level_dispatcher_;
+  // Called when MemoryPressureListener detects memory pressure.
+  void OnMemoryPressure(
+      base::MemoryPressureListener::MemoryPressureLevel level);
 
   // Mappings of RenderProcessHost::GetID() -> MemoryCoordinatorHandleImpl.
   // A mapping is added when a renderer connects to MemoryCoordinator and
   // removed automatically when a underlying binding is disconnected.
   std::map<int, std::unique_ptr<MemoryCoordinatorHandleImpl>> children_;
 
+  base::MemoryPressureListener pressure_listener_;
+
   DISALLOW_COPY_AND_ASSIGN(MemoryCoordinator);
 };
 
diff --git a/components/memory_coordinator/browser/memory_coordinator_unittest.cc b/components/memory_coordinator/browser/memory_coordinator_unittest.cc
index 5fe205e..2dc73c4 100644
--- a/components/memory_coordinator/browser/memory_coordinator_unittest.cc
+++ b/components/memory_coordinator/browser/memory_coordinator_unittest.cc
@@ -19,8 +19,7 @@
   ~MockMemoryPressureMonitor() override {}
 
   void Dispatch(MemoryPressureLevel level) {
-    DCHECK(!callback_.is_null());
-    callback_.Run(level);
+    base::MemoryPressureListener::NotifyMemoryPressure(level);
   }
 
   // MemoryPressureMonitor implementations:
@@ -28,12 +27,7 @@
     return base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE;
   }
 
-  void SetDispatchCallback(const DispatchCallback& callback) override {
-    callback_ = callback;
-  }
-
- private:
-  DispatchCallback callback_;
+  void SetDispatchCallback(const DispatchCallback& callback) override {}
 };
 
 class MockMemoryCoordinatorClient final : public MemoryCoordinatorClient {
@@ -52,11 +46,9 @@
 
 class MemoryCoordinatorTest : public testing::Test {
  public:
-  MemoryCoordinatorTest() : message_loop_(new base::MessageLoop) {
-    // MemoryCoordinator needs to be initialized after an instance of
-    // MemoryPressureMonitor is created.
-    coordinator_.reset(new MemoryCoordinator);
-  }
+  MemoryCoordinatorTest()
+      : message_loop_(new base::MessageLoop),
+        coordinator_(new MemoryCoordinator) {}
 
   MockMemoryPressureMonitor& monitor() { return monitor_; }
   MemoryCoordinator& coordinator() { return *coordinator_.get(); }
diff --git a/components/metrics.gypi b/components/metrics.gypi
index 43a9f80b..688e46c 100644
--- a/components/metrics.gypi
+++ b/components/metrics.gypi
@@ -270,6 +270,8 @@
             'metrics/leak_detector/call_stack_table.h',
             'metrics/leak_detector/custom_allocator.cc',
             'metrics/leak_detector/custom_allocator.h',
+            'metrics/leak_detector/gnu_build_id_reader.cc',
+            'metrics/leak_detector/gnu_build_id_reader.h',
             'metrics/leak_detector/leak_analyzer.cc',
             'metrics/leak_detector/leak_analyzer.h',
             'metrics/leak_detector/leak_detector.cc',
diff --git a/components/metrics/leak_detector/BUILD.gn b/components/metrics/leak_detector/BUILD.gn
index 03d904a7..5cd3ff9 100644
--- a/components/metrics/leak_detector/BUILD.gn
+++ b/components/metrics/leak_detector/BUILD.gn
@@ -14,6 +14,8 @@
       "call_stack_table.h",
       "custom_allocator.cc",
       "custom_allocator.h",
+      "gnu_build_id_reader.cc",
+      "gnu_build_id_reader.h",
       "leak_analyzer.cc",
       "leak_analyzer.h",
       "leak_detector.cc",
diff --git a/components/metrics/leak_detector/gnu_build_id_reader.cc b/components/metrics/leak_detector/gnu_build_id_reader.cc
new file mode 100644
index 0000000..ac0f07da
--- /dev/null
+++ b/components/metrics/leak_detector/gnu_build_id_reader.cc
@@ -0,0 +1,124 @@
+// 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/metrics/leak_detector/gnu_build_id_reader.h"
+
+#include <elf.h>
+
+#include <algorithm>
+
+#if defined(OS_CHROMEOS)
+#include <link.h>  // for dl_iterate_phdr
+#else
+#error "Getting binary mapping info is not supported on this platform."
+#endif  // defined(OS_CHROMEOS)
+
+namespace metrics {
+namespace leak_detector {
+namespace gnu_build_id_reader {
+
+namespace {
+
+// Contains data passed to dl_iterate_phdr() for reading build ID.
+struct ReadBuildIDData {
+  // Points to a vector for storing the build ID.
+  std::vector<uint8_t>* build_id;
+  // Indicates whether build ID was read successfully.
+  bool success;
+};
+
+// Given a pointer and an offset, add the offset to the pointer and round it up
+// to the next uint32_t.
+const void* AlignPtrAndOffsetToUint32(const void* ptr, intptr_t offset) {
+  uintptr_t addr = reinterpret_cast<uintptr_t>(ptr) + offset;
+  uintptr_t aligned_addr =
+      (addr + sizeof(uint32_t) - 1) & ~(sizeof(uint32_t) - 1);
+  return reinterpret_cast<const void*>(aligned_addr);
+}
+
+// Searches for the ELF note containing the build ID within the data range
+// specified by [start, end). Returns the build ID in |*result|. If the build ID
+// is not found, |*result| will be unchanged. Returns true if the build ID was
+// successfully read or false otherwise.
+bool GetBuildIdFromNotes(const void* start,
+                         const void* end,
+                         std::vector<uint8_t>* result) {
+  using NoteHeaderPtr = const ElfW(Nhdr)*;
+  NoteHeaderPtr note = reinterpret_cast<NoteHeaderPtr>(start);
+
+  while (note < end) {
+    const char* name_ptr = reinterpret_cast<const char*>(note + 1);
+    if (name_ptr >= end) {
+      break;
+    }
+    // |desc_ptr| points the to the actual build ID data.
+    const uint8_t* desc_ptr = reinterpret_cast<const uint8_t*>(
+        AlignPtrAndOffsetToUint32(name_ptr, note->n_namesz));
+    if (note->n_type == NT_GNU_BUILD_ID &&
+        note->n_namesz == sizeof(ELF_NOTE_GNU) &&
+        std::equal(name_ptr, name_ptr + sizeof(ELF_NOTE_GNU), ELF_NOTE_GNU)) {
+      result->assign(desc_ptr, desc_ptr + note->n_descsz);
+      return true;
+    }
+    NoteHeaderPtr next_ptr = reinterpret_cast<NoteHeaderPtr>(
+        AlignPtrAndOffsetToUint32(desc_ptr, note->n_descsz));
+    note = next_ptr;
+  }
+  return false;
+}
+
+// Callback for dl_iterate_phdr(). Finds the notes section and looks for the
+// build ID in there. |data| points to a ReadBuildIDData struct whose |build_id|
+// field should point to a valid std::vector<uint8_t>. Returns the build ID in
+// that field, and sets |ReadBuildIDData::success| based on whether the build ID
+// was successfully read.
+//
+// This function always returns 1 to signal the end of dl_iterate_phdr()'s
+// iteration, because it is only interested in the first binary iterated by
+// dl_iterate_phdr(), which is the current binary.
+int FindNotesAndGetBuildID(struct dl_phdr_info* info,
+                           size_t /* size */,
+                           void* data) {
+  uintptr_t mapping_addr = reinterpret_cast<uintptr_t>(info->dlpi_addr);
+  const ElfW(Ehdr)* file_header =
+      reinterpret_cast<const ElfW(Ehdr)*>(mapping_addr);
+
+  // Make sure that a valid |mapping_addr| was read.
+  if (!file_header || file_header->e_phentsize != sizeof(ElfW(Phdr))) {
+    return 1;
+  }
+
+  // Find the ELF segment header for the NOTES section.
+  for (int i = 0; i < info->dlpi_phnum; ++i) {
+    const ElfW(Phdr)& segment_header = info->dlpi_phdr[i];
+    if (segment_header.p_type == PT_NOTE) {
+      const void* note = reinterpret_cast<const void*>(
+          mapping_addr + segment_header.p_vaddr);
+      const void* note_end = reinterpret_cast<const void*>(
+          mapping_addr + segment_header.p_vaddr + segment_header.p_memsz);
+      ReadBuildIDData* read_data = reinterpret_cast<ReadBuildIDData*>(data);
+      read_data->success =
+          GetBuildIdFromNotes(note, note_end, read_data->build_id);
+    }
+  }
+  return 1;
+}
+
+}  // namespace
+
+bool ReadBuildID(std::vector<uint8_t>* build_id) {
+  ReadBuildIDData data;
+  data.build_id = build_id;
+  data.success = false;
+
+#if defined(OS_CHROMEOS)
+  dl_iterate_phdr(FindNotesAndGetBuildID, &data);
+#endif  // defined(OS_CHROMEOS)
+
+  return data.success;
+}
+
+}  // namespace gnu_build_id_reader
+}  // namespace leak_detector
+}  // namespace metrics
diff --git a/components/metrics/leak_detector/gnu_build_id_reader.h b/components/metrics/leak_detector/gnu_build_id_reader.h
new file mode 100644
index 0000000..5cda9f3
--- /dev/null
+++ b/components/metrics/leak_detector/gnu_build_id_reader.h
@@ -0,0 +1,24 @@
+// 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_METRICS_LEAK_DETECTOR_GNU_BUILD_ID_READER_H_
+#define COMPONENTS_METRICS_LEAK_DETECTOR_GNU_BUILD_ID_READER_H_
+
+#include <stdint.h>
+
+#include <vector>
+
+namespace metrics {
+namespace leak_detector {
+namespace gnu_build_id_reader {
+
+// Reads the build ID from the GNU build notes and stores it in |*build_id|.
+// Returns true if it was successfully read, or false otherwise.
+bool ReadBuildID(std::vector<uint8_t>* build_id);
+
+}  // namespace gnu_build_id_reader
+}  // namespace leak_detector
+}  // namespace metrics
+
+#endif  // COMPONENTS_METRICS_LEAK_DETECTOR_GNU_BUILD_ID_READER_H_
diff --git a/components/new_or_sad_tab_strings.grdp b/components/new_or_sad_tab_strings.grdp
index e756c86..b04b83d5 100644
--- a/components/new_or_sad_tab_strings.grdp
+++ b/components/new_or_sad_tab_strings.grdp
@@ -12,6 +12,16 @@
       <message name="IDS_SAD_TAB_MESSAGE" desc="The message displayed on the sad tab page." formatter_data="android_java">
         Something went wrong while displaying this webpage.
       </message>
+      <if expr="_google_chrome">
+        <message name="IDS_SAD_TAB_OOM_MESSAGE" desc="The message displayed on the sad tab page if the tab died due to being out of memory." formatter_data="android_java">
+          Google Chrome ran out of memory while trying to display this webpage.
+        </message>
+      </if>
+      <if expr="not _google_chrome">
+        <message name="IDS_SAD_TAB_OOM_MESSAGE" desc="The message displayed on the sad tab page if the tab died due to being out of memory." formatter_data="android_java">
+          Chromium ran out of memory while trying to display this webpage.
+        </message>
+      </if>
       <message name="IDS_SAD_TAB_HELP_MESSAGE" desc="The help message displayed on the sad tab page, with IDS_SAD_TAB_HELP_LINK embedded as a link to help.">
         If you're seeing this frequently, try these <ph name="HELP_LINK">$1<ex>suggestions</ex></ph>.
       </message>
diff --git a/components/os_crypt.gypi b/components/os_crypt.gypi
index 1d61f6b..35026814 100644
--- a/components/os_crypt.gypi
+++ b/components/os_crypt.gypi
@@ -79,6 +79,8 @@
             }],
             ['use_dbus==1', {
               'sources': [
+                'os_crypt/key_storage_kwallet.cc',
+                'os_crypt/key_storage_kwallet.h',
                 'os_crypt/kwallet_dbus.cc',
                 'os_crypt/kwallet_dbus.h',
               ],
diff --git a/components/os_crypt/BUILD.gn b/components/os_crypt/BUILD.gn
index ffb9d8b..7ae6930 100644
--- a/components/os_crypt/BUILD.gn
+++ b/components/os_crypt/BUILD.gn
@@ -66,6 +66,8 @@
     }
     if (use_dbus) {
       sources += [
+        "key_storage_kwallet.cc",
+        "key_storage_kwallet.h",
         "kwallet_dbus.cc",
         "kwallet_dbus.h",
       ]
@@ -91,8 +93,13 @@
       "os_crypt_mocker_linux.cc",
       "os_crypt_mocker_linux.h",
     ]
-    deps += [ "//third_party/libsecret" ]
-    defines = [ "USE_LIBSECRET" ]
+    defines = []
+    if (use_glib) {
+      defines += [ "USE_LIBSECRET" ]
+    }
+    if (use_dbus) {
+      defines += [ "USE_KWALLET" ]
+    }
   }
 }
 
@@ -122,7 +129,10 @@
       defines += [ "USE_LIBSECRET" ]
     }
     if (use_dbus) {
-      sources += [ "kwallet_dbus_unittest.cc" ]
+      sources += [
+        "key_storage_kwallet_unittest.cc",
+        "kwallet_dbus_unittest.cc",
+      ]
       deps += [ "//dbus:test_support" ]
       defines += [ "USE_KWALLET" ]
     }
diff --git a/components/os_crypt/key_storage_kwallet.cc b/components/os_crypt/key_storage_kwallet.cc
new file mode 100644
index 0000000..b1d34cc
--- /dev/null
+++ b/components/os_crypt/key_storage_kwallet.cc
@@ -0,0 +1,131 @@
+// 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/os_crypt/key_storage_kwallet.h"
+
+#include <utility>
+
+#include "base/base64.h"
+#include "base/rand_util.h"
+#include "components/os_crypt/kwallet_dbus.h"
+#include "dbus/bus.h"
+
+KeyStorageKWallet::KeyStorageKWallet(base::nix::DesktopEnvironment desktop_env,
+                                     std::string app_name)
+    : desktop_env_(desktop_env), handle_(-1), app_name_(std::move(app_name)) {}
+
+KeyStorageKWallet::~KeyStorageKWallet() {
+  // The handle is shared between programs that are using the same wallet.
+  // Closing the wallet is a nop in the typical case.
+  bool success = true;
+  ignore_result(kwallet_dbus_->Close(handle_, false, app_name_, &success));
+  kwallet_dbus_->GetSessionBus()->ShutdownAndBlock();
+}
+
+bool KeyStorageKWallet::Init() {
+  // Initialize using the production KWalletDBus.
+  return InitWithKWalletDBus(nullptr);
+}
+
+bool KeyStorageKWallet::InitWithKWalletDBus(
+    std::unique_ptr<KWalletDBus> optional_kwallet_dbus_ptr) {
+  if (optional_kwallet_dbus_ptr) {
+    kwallet_dbus_ = std::move(optional_kwallet_dbus_ptr);
+  } else {
+    // Initializing with production KWalletDBus
+    kwallet_dbus_.reset(new KWalletDBus(desktop_env_));
+    dbus::Bus::Options options;
+    options.bus_type = dbus::Bus::SESSION;
+    options.connection_type = dbus::Bus::PRIVATE;
+    kwallet_dbus_->SetSessionBus(new dbus::Bus(options));
+  }
+
+  InitResult result = InitWallet();
+  // If KWallet might not have started, attempt to start it and retry.
+  if (result == InitResult::TEMPORARY_FAIL && kwallet_dbus_->StartKWalletd())
+    result = InitWallet();
+
+  return result == InitResult::SUCCESS;
+}
+
+KeyStorageKWallet::InitResult KeyStorageKWallet::InitWallet() {
+  // Check that KWallet is enabled.
+  bool enabled = false;
+  KWalletDBus::Error error = kwallet_dbus_->IsEnabled(&enabled);
+  switch (error) {
+    case KWalletDBus::Error::CANNOT_CONTACT:
+      return InitResult::TEMPORARY_FAIL;
+    case KWalletDBus::Error::CANNOT_READ:
+      return InitResult::PERMANENT_FAIL;
+    case KWalletDBus::Error::SUCCESS:
+      break;
+  }
+  if (!enabled)
+    return InitResult::PERMANENT_FAIL;
+
+  // Get the wallet name.
+  error = kwallet_dbus_->NetworkWallet(&wallet_name_);
+  switch (error) {
+    case KWalletDBus::Error::CANNOT_CONTACT:
+      return InitResult::TEMPORARY_FAIL;
+    case KWalletDBus::Error::CANNOT_READ:
+      return InitResult::PERMANENT_FAIL;
+    case KWalletDBus::Error::SUCCESS:
+      return InitResult::SUCCESS;
+  }
+
+  NOTREACHED();
+  return InitResult::PERMANENT_FAIL;
+}
+
+std::string KeyStorageKWallet::GetKey() {
+  // Get handle
+  KWalletDBus::Error error =
+      kwallet_dbus_->Open(wallet_name_, app_name_, &handle_);
+  if (error || handle_ == -1)
+    return std::string();
+
+  // Create folder
+  if (!InitFolder())
+    return std::string();
+
+  // Read password
+  std::string password;
+  error =
+      kwallet_dbus_->ReadPassword(handle_, KeyStorageLinux::kFolderName,
+                                  KeyStorageLinux::kKey, app_name_, &password);
+  if (error)
+    return std::string();
+
+  // If there is no entry, generate and write a new password.
+  if (password.empty()) {
+    base::Base64Encode(base::RandBytesAsString(16), &password);
+    bool success;
+    error = kwallet_dbus_->WritePassword(handle_, KeyStorageLinux::kFolderName,
+                                         KeyStorageLinux::kKey, password,
+                                         app_name_, &success);
+    if (error || !success)
+      return std::string();
+  }
+
+  return password;
+}
+
+bool KeyStorageKWallet::InitFolder() {
+  bool has_folder = false;
+  KWalletDBus::Error error = kwallet_dbus_->HasFolder(
+      handle_, KeyStorageLinux::kFolderName, app_name_, &has_folder);
+  if (error)
+    return false;
+
+  if (!has_folder) {
+    bool success = false;
+    error = kwallet_dbus_->CreateFolder(handle_, KeyStorageLinux::kFolderName,
+                                        app_name_, &success);
+    if (error || !success)
+      return false;
+  }
+
+  return true;
+}
diff --git a/components/os_crypt/key_storage_kwallet.h b/components/os_crypt/key_storage_kwallet.h
new file mode 100644
index 0000000..35edcf2f
--- /dev/null
+++ b/components/os_crypt/key_storage_kwallet.h
@@ -0,0 +1,55 @@
+// 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_OS_CRYPT_KEY_STORAGE_KWALLET_H_
+#define COMPONENTS_OS_CRYPT_KEY_STORAGE_KWALLET_H_
+
+#include <memory>
+#include <string>
+
+#include "base/macros.h"
+#include "components/os_crypt/key_storage_linux.h"
+#include "components/os_crypt/kwallet_dbus.h"
+
+class KeyStorageKWallet : public KeyStorageLinux {
+ public:
+  KeyStorageKWallet(base::nix::DesktopEnvironment desktop_env,
+                    std::string app_name);
+  ~KeyStorageKWallet() override;
+
+  // KeyStorageLinux
+  std::string GetKey() override;
+
+  // Initialize using an optional KWalletDBus mock.
+  // A DBus session will not be created if a mock is provided.
+  bool InitWithKWalletDBus(
+      std::unique_ptr<KWalletDBus> optional_kwallet_dbus_ptr);
+
+ protected:
+  // KeyStorageLinux
+  bool Init() override;
+
+ private:
+  enum class InitResult {
+    SUCCESS,
+    TEMPORARY_FAIL,
+    PERMANENT_FAIL,
+  };
+
+  // Check whether KWallet is enabled and set |wallet_name_|
+  InitResult InitWallet();
+
+  // Create Chrome's folder in the wallet, if it doesn't exist.
+  bool InitFolder();
+
+  const base::nix::DesktopEnvironment desktop_env_;
+  int32_t handle_;
+  std::string wallet_name_;
+  const std::string app_name_;
+  std::unique_ptr<KWalletDBus> kwallet_dbus_;
+
+  DISALLOW_COPY_AND_ASSIGN(KeyStorageKWallet);
+};
+
+#endif  // COMPONENTS_OS_CRYPT_KEY_STORAGE_KWALLET_H_
diff --git a/components/os_crypt/key_storage_kwallet_unittest.cc b/components/os_crypt/key_storage_kwallet_unittest.cc
new file mode 100644
index 0000000..b9a157d
--- /dev/null
+++ b/components/os_crypt/key_storage_kwallet_unittest.cc
@@ -0,0 +1,319 @@
+// 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/os_crypt/key_storage_kwallet.h"
+
+#include "base/logging.h"
+#include "base/nix/xdg_util.h"
+#include "dbus/message.h"
+#include "dbus/mock_bus.h"
+#include "dbus/mock_object_proxy.h"
+#include "dbus/object_path.h"
+#include "dbus/object_proxy.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+using testing::_;
+using testing::DoAll;
+using testing::Return;
+using testing::SaveArg;
+using testing::SetArgPointee;
+using testing::StrictMock;
+
+constexpr KWalletDBus::Error SUCCESS = KWalletDBus::Error::SUCCESS;
+constexpr KWalletDBus::Error CANNOT_READ = KWalletDBus::Error::CANNOT_READ;
+constexpr KWalletDBus::Error CANNOT_CONTACT =
+    KWalletDBus::Error::CANNOT_CONTACT;
+
+// These names are not allowed to change in prod, unless we intentionally
+// migrate.
+#if defined(OFFICIAL_BUILD)
+const char kExpectedFolderName[] = "Chrome Keys";
+const char kExpectedEntryName[] = "Chrome Safe Storage";
+#else
+const char kExpectedFolderName[] = "Chromium Keys";
+const char kExpectedEntryName[] = "Chromium Safe Storage";
+#endif
+
+// Environment-specific behavior is handled and tested with KWalletDBus, not
+// here, but we still need a value to instantiate.
+const base::nix::DesktopEnvironment kDesktopEnv =
+    base::nix::DesktopEnvironment::DESKTOP_ENVIRONMENT_KDE5;
+
+class MockKWalletDBus : public KWalletDBus {
+ public:
+  MockKWalletDBus() : KWalletDBus(kDesktopEnv) {
+    // On destruction, GetSessionBus() is called to get the bus and shut it
+    // down. Here we create a mock to be returned by GetSessionBus().
+    mock_session_bus_ = new dbus::MockBus(dbus::Bus::Options());
+  }
+
+  dbus::MockBus* GetSessionBus() override { return mock_session_bus_.get(); }
+
+  MOCK_METHOD0(StartKWalletd, bool());
+
+  MOCK_METHOD1(IsEnabled, KWalletDBus::Error(bool*));
+
+  MOCK_METHOD1(NetworkWallet, KWalletDBus::Error(std::string*));
+
+  MOCK_METHOD3(Open,
+               KWalletDBus::Error(const std::string&,
+                                  const std::string&,
+                                  int*));
+
+  MOCK_METHOD4(
+      HasFolder,
+      KWalletDBus::Error(int, const std::string&, const std::string&, bool*));
+
+  MOCK_METHOD4(
+      CreateFolder,
+      KWalletDBus::Error(int, const std::string&, const std::string&, bool*));
+
+  MOCK_METHOD5(ReadPassword,
+               KWalletDBus::Error(int,
+                                  const std::string&,
+                                  const std::string&,
+                                  const std::string&,
+                                  std::string*));
+
+  MOCK_METHOD6(WritePassword,
+               KWalletDBus::Error(int,
+                                  const std::string&,
+                                  const std::string&,
+                                  const std::string&,
+                                  const std::string&,
+                                  bool*));
+
+  MOCK_METHOD4(Close, KWalletDBus::Error(int, bool, const std::string&, bool*));
+
+ private:
+  scoped_refptr<dbus::MockBus> mock_session_bus_;
+};
+
+class KeyStorageKWalletTest : public testing::Test {
+ public:
+  KeyStorageKWalletTest() : key_storage_kwallet_(kDesktopEnv, "test-app") {}
+
+  void SetUp() override {
+    kwallet_dbus_mock_ = new StrictMock<MockKWalletDBus>();
+
+    // Calls from |key_storage_kwallet_|'s destructor
+    EXPECT_CALL(*kwallet_dbus_mock_, Close(_, false, _, _))
+        .WillOnce(DoAll(SetArgPointee<3>(true), Return(SUCCESS)));
+    EXPECT_CALL(*kwallet_dbus_mock_->GetSessionBus(), ShutdownAndBlock())
+        .Times(1);
+  }
+
+  void SuccessfulInit() {
+    EXPECT_CALL(*kwallet_dbus_mock_, IsEnabled(_))
+        .WillOnce(DoAll(SetArgPointee<0>(true), Return(SUCCESS)));
+    EXPECT_CALL(*kwallet_dbus_mock_, NetworkWallet(_))
+        .WillOnce(
+            DoAll(SetArgPointee<0>(std::string("mollet")), Return(SUCCESS)));
+
+    EXPECT_TRUE(key_storage_kwallet_.InitWithKWalletDBus(
+        std::unique_ptr<MockKWalletDBus>(kwallet_dbus_mock_)));
+  }
+
+ protected:
+  StrictMock<MockKWalletDBus>* kwallet_dbus_mock_;
+  KeyStorageKWallet key_storage_kwallet_;
+  const std::string wallet_name_ = "mollet";
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(KeyStorageKWalletTest);
+};
+
+TEST_F(KeyStorageKWalletTest, InitializeFolder) {
+  SuccessfulInit();
+  EXPECT_CALL(*kwallet_dbus_mock_, Open(_, _, _))
+      .WillOnce(DoAll(SetArgPointee<2>(123), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_, HasFolder(123, kExpectedFolderName, _, _))
+      .WillOnce(DoAll(SetArgPointee<3>(false), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_, CreateFolder(123, kExpectedFolderName, _, _))
+      .WillOnce(DoAll(SetArgPointee<3>(true), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_,
+              ReadPassword(123, kExpectedFolderName, kExpectedEntryName, _, _))
+      .WillOnce(DoAll(SetArgPointee<4>("butter"), Return(SUCCESS)));
+
+  EXPECT_EQ("butter", key_storage_kwallet_.GetKey());
+}
+
+TEST_F(KeyStorageKWalletTest, ExistingPassword) {
+  SuccessfulInit();
+  EXPECT_CALL(*kwallet_dbus_mock_, Open(_, _, _))
+      .WillOnce(DoAll(SetArgPointee<2>(123), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_, HasFolder(123, kExpectedFolderName, _, _))
+      .WillOnce(DoAll(SetArgPointee<3>(true), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_,
+              ReadPassword(123, kExpectedFolderName, kExpectedEntryName, _, _))
+      .WillOnce(DoAll(SetArgPointee<4>("butter"), Return(SUCCESS)));
+
+  EXPECT_EQ("butter", key_storage_kwallet_.GetKey());
+}
+
+TEST_F(KeyStorageKWalletTest, GenerateNewPassword) {
+  SuccessfulInit();
+  std::string generated_password;
+  EXPECT_CALL(*kwallet_dbus_mock_, Open(_, _, _))
+      .WillOnce(DoAll(SetArgPointee<2>(123), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_, HasFolder(123, kExpectedFolderName, _, _))
+      .WillOnce(DoAll(SetArgPointee<3>(true), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_,
+              ReadPassword(123, kExpectedFolderName, kExpectedEntryName, _, _))
+      .WillOnce(DoAll(SetArgPointee<4>(""), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_, WritePassword(123, kExpectedFolderName,
+                                                 kExpectedEntryName, _, _, _))
+      .WillOnce(DoAll(SaveArg<3>(&generated_password), SetArgPointee<5>(true),
+                      Return(SUCCESS)));
+
+  EXPECT_EQ(generated_password, key_storage_kwallet_.GetKey());
+}
+
+TEST_F(KeyStorageKWalletTest, InitKWalletNotEnabled) {
+  EXPECT_CALL(*kwallet_dbus_mock_, IsEnabled(_))
+      .WillOnce(DoAll(SetArgPointee<0>(false), Return(SUCCESS)));
+
+  EXPECT_FALSE(key_storage_kwallet_.InitWithKWalletDBus(
+      std::unique_ptr<MockKWalletDBus>(kwallet_dbus_mock_)));
+}
+
+TEST_F(KeyStorageKWalletTest, InitCannotStart) {
+  EXPECT_CALL(*kwallet_dbus_mock_, IsEnabled(_))
+      .WillOnce(Return(CANNOT_CONTACT));
+  EXPECT_CALL(*kwallet_dbus_mock_, StartKWalletd()).WillOnce(Return(false));
+
+  EXPECT_FALSE(key_storage_kwallet_.InitWithKWalletDBus(
+      std::unique_ptr<MockKWalletDBus>(kwallet_dbus_mock_)));
+}
+
+TEST_F(KeyStorageKWalletTest, InitFailTwice) {
+  EXPECT_CALL(*kwallet_dbus_mock_, IsEnabled(_))
+      .WillOnce(Return(CANNOT_CONTACT))
+      .WillOnce(Return(CANNOT_CONTACT));
+  EXPECT_CALL(*kwallet_dbus_mock_, StartKWalletd()).WillOnce(Return(true));
+
+  EXPECT_FALSE(key_storage_kwallet_.InitWithKWalletDBus(
+      std::unique_ptr<MockKWalletDBus>(kwallet_dbus_mock_)));
+}
+
+TEST_F(KeyStorageKWalletTest, InitTryTwiceAndFail) {
+  EXPECT_CALL(*kwallet_dbus_mock_, IsEnabled(_))
+      .WillOnce(Return(CANNOT_CONTACT))
+      .WillOnce(DoAll(SetArgPointee<0>(true), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_, StartKWalletd()).WillOnce(Return(true));
+  EXPECT_CALL(*kwallet_dbus_mock_, NetworkWallet(_))
+      .WillOnce(Return(CANNOT_CONTACT));
+
+  EXPECT_FALSE(key_storage_kwallet_.InitWithKWalletDBus(
+      std::unique_ptr<MockKWalletDBus>(kwallet_dbus_mock_)));
+}
+
+TEST_F(KeyStorageKWalletTest, InitTryTwiceAndSuccess) {
+  EXPECT_CALL(*kwallet_dbus_mock_, IsEnabled(_))
+      .WillOnce(Return(CANNOT_CONTACT))
+      .WillOnce(DoAll(SetArgPointee<0>(true), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_, StartKWalletd()).WillOnce(Return(true));
+  EXPECT_CALL(*kwallet_dbus_mock_, NetworkWallet(_))
+      .WillOnce(DoAll(SetArgPointee<0>(wallet_name_), Return(SUCCESS)));
+
+  EXPECT_TRUE(key_storage_kwallet_.InitWithKWalletDBus(
+      std::unique_ptr<MockKWalletDBus>(kwallet_dbus_mock_)));
+}
+
+// Tests for a dbus connection that fails after initialization.
+// Any error is expected to return an empty password.
+class KeyStorageKWalletFailuresTest
+    : public testing::TestWithParam<KWalletDBus::Error> {
+ public:
+  KeyStorageKWalletFailuresTest()
+      : key_storage_kwallet_(kDesktopEnv, "test-app") {}
+
+  void SetUp() override {
+    // |key_storage_kwallet_| will take ownership of |kwallet_dbus_mock_|.
+    kwallet_dbus_mock_ = new StrictMock<MockKWalletDBus>();
+
+    // Successful initialization.
+    EXPECT_CALL(*kwallet_dbus_mock_, IsEnabled(_))
+        .WillOnce(DoAll(SetArgPointee<0>(true), Return(SUCCESS)));
+    EXPECT_CALL(*kwallet_dbus_mock_, NetworkWallet(_))
+        .WillOnce(
+            DoAll(SetArgPointee<0>(std::string("mollet")), Return(SUCCESS)));
+
+    EXPECT_TRUE(key_storage_kwallet_.InitWithKWalletDBus(
+        std::unique_ptr<MockKWalletDBus>(kwallet_dbus_mock_)));
+
+    // Calls from |key_storage_kwallet_|'s destructor.
+    EXPECT_CALL(*kwallet_dbus_mock_, Close(_, false, _, _))
+        .WillOnce(DoAll(SetArgPointee<3>(true), Return(SUCCESS)));
+    EXPECT_CALL(*kwallet_dbus_mock_->GetSessionBus(), ShutdownAndBlock())
+        .Times(1);
+  }
+
+ protected:
+  StrictMock<MockKWalletDBus>* kwallet_dbus_mock_;
+  KeyStorageKWallet key_storage_kwallet_;
+  const std::string wallet_name_ = "mollet";
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(KeyStorageKWalletFailuresTest);
+};
+
+INSTANTIATE_TEST_CASE_P(,
+                        KeyStorageKWalletFailuresTest,
+                        ::testing::Values(CANNOT_READ, CANNOT_CONTACT));
+
+TEST_P(KeyStorageKWalletFailuresTest, PostInitFailureOpen) {
+  EXPECT_CALL(*kwallet_dbus_mock_, Open(_, _, _)).WillOnce(Return(GetParam()));
+
+  EXPECT_EQ("", key_storage_kwallet_.GetKey());
+}
+
+TEST_P(KeyStorageKWalletFailuresTest, PostInitFailureHasFolder) {
+  EXPECT_CALL(*kwallet_dbus_mock_, Open(_, _, _))
+      .WillOnce(DoAll(SetArgPointee<2>(123), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_, HasFolder(123, _, _, _))
+      .WillOnce(Return(GetParam()));
+
+  EXPECT_EQ("", key_storage_kwallet_.GetKey());
+}
+
+TEST_P(KeyStorageKWalletFailuresTest, PostInitFailureCreateFolder) {
+  EXPECT_CALL(*kwallet_dbus_mock_, Open(_, _, _))
+      .WillOnce(DoAll(SetArgPointee<2>(123), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_, HasFolder(123, _, _, _))
+      .WillOnce(DoAll(SetArgPointee<3>(false), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_, CreateFolder(123, _, _, _))
+      .WillOnce(Return(GetParam()));
+
+  EXPECT_EQ("", key_storage_kwallet_.GetKey());
+}
+
+TEST_P(KeyStorageKWalletFailuresTest, PostInitFailureReadPassword) {
+  EXPECT_CALL(*kwallet_dbus_mock_, Open(_, _, _))
+      .WillOnce(DoAll(SetArgPointee<2>(123), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_, HasFolder(123, _, _, _))
+      .WillOnce(DoAll(SetArgPointee<3>(true), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_, ReadPassword(123, _, _, _, _))
+      .WillOnce(Return(GetParam()));
+
+  EXPECT_EQ("", key_storage_kwallet_.GetKey());
+}
+
+TEST_P(KeyStorageKWalletFailuresTest, PostInitFailureWritePassword) {
+  EXPECT_CALL(*kwallet_dbus_mock_, Open(_, _, _))
+      .WillOnce(DoAll(SetArgPointee<2>(123), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_, HasFolder(123, _, _, _))
+      .WillOnce(DoAll(SetArgPointee<3>(true), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_, ReadPassword(123, _, _, _, _))
+      .WillOnce(DoAll(SetArgPointee<4>(""), Return(SUCCESS)));
+  EXPECT_CALL(*kwallet_dbus_mock_, WritePassword(123, _, _, _, _, _))
+      .WillOnce(Return(GetParam()));
+
+  EXPECT_EQ("", key_storage_kwallet_.GetKey());
+}
+
+}  // namespace
diff --git a/components/os_crypt/key_storage_libsecret.cc b/components/os_crypt/key_storage_libsecret.cc
index 9c27ffc..2250775 100644
--- a/components/os_crypt/key_storage_libsecret.cc
+++ b/components/os_crypt/key_storage_libsecret.cc
@@ -11,12 +11,6 @@
 
 namespace {
 
-#if defined(OFFICIAL_BUILD)
-const char kKeyStorageEntryName[] = "Chrome Safe Storage";
-#else
-const char kKeyStorageEntryName[] = "Chromium Safe Storage";
-#endif
-
 const SecretSchema kKeystoreSchema = {
     "chrome_libsecret_os_crypt_password",
     SECRET_SCHEMA_NONE,
@@ -24,12 +18,14 @@
         {nullptr, SECRET_SCHEMA_ATTRIBUTE_STRING},
     }};
 
-std::string AddRandomPasswordInLibsecret() {
+}  // namespace
+
+std::string KeyStorageLibsecret::AddRandomPasswordInLibsecret() {
   std::string password;
   base::Base64Encode(base::RandBytesAsString(16), &password);
   GError* error = nullptr;
   LibsecretLoader::secret_password_store_sync(
-      &kKeystoreSchema, nullptr, kKeyStorageEntryName, password.c_str(),
+      &kKeystoreSchema, nullptr, KeyStorageLinux::kKey, password.c_str(),
       nullptr, &error, nullptr);
 
   if (error) {
@@ -39,8 +35,6 @@
   return password;
 }
 
-}  // namespace
-
 std::string KeyStorageLibsecret::GetKey() {
   GError* error = nullptr;
   LibsecretAttributesBuilder attrs;
diff --git a/components/os_crypt/key_storage_libsecret.h b/components/os_crypt/key_storage_libsecret.h
index 4899be8..2560b54 100644
--- a/components/os_crypt/key_storage_libsecret.h
+++ b/components/os_crypt/key_storage_libsecret.h
@@ -24,6 +24,8 @@
   bool Init() override;
 
  private:
+  std::string AddRandomPasswordInLibsecret();
+
   DISALLOW_COPY_AND_ASSIGN(KeyStorageLibsecret);
 };
 
diff --git a/components/os_crypt/key_storage_linux.cc b/components/os_crypt/key_storage_linux.cc
index e54bb9e..4feae11 100644
--- a/components/os_crypt/key_storage_linux.cc
+++ b/components/os_crypt/key_storage_linux.cc
@@ -4,8 +4,6 @@
 
 #include "components/os_crypt/key_storage_linux.h"
 
-#include <string.h>
-
 #include "base/environment.h"
 #include "base/lazy_instance.h"
 #include "base/logging.h"
@@ -15,24 +13,42 @@
 #include "components/os_crypt/key_storage_libsecret.h"
 #endif
 
-base::LazyInstance<std::string> g_store_ = LAZY_INSTANCE_INITIALIZER;
+#if defined(USE_KWALLET)
+#include "components/os_crypt/key_storage_kwallet.h"
+#endif
+
+#if defined(OFFICIAL_BUILD)
+const char KeyStorageLinux::kFolderName[] = "Chrome Keys";
+const char KeyStorageLinux::kKey[] = "Chrome Safe Storage";
+#else
+const char KeyStorageLinux::kFolderName[] = "Chromium Keys";
+const char KeyStorageLinux::kKey[] = "Chromium Safe Storage";
+#endif
+
+base::LazyInstance<std::string> g_store = LAZY_INSTANCE_INITIALIZER;
+base::LazyInstance<std::string> g_product_name = LAZY_INSTANCE_INITIALIZER;
 
 // static
 void KeyStorageLinux::SetStore(const std::string& store_type) {
-  g_store_.Get() = store_type;
+  g_store.Get() = store_type;
   VLOG(1) << "OSCrypt store set to " << store_type;
 }
 
 // static
+void KeyStorageLinux::SetProductName(const std::string& product_name) {
+  g_product_name.Get() = product_name;
+}
+
+// static
 std::unique_ptr<KeyStorageLinux> KeyStorageLinux::CreateService() {
   base::nix::DesktopEnvironment used_desktop_env;
-  if (g_store_.Get() == "kwallet") {
+  if (g_store.Get() == "kwallet") {
     used_desktop_env = base::nix::DESKTOP_ENVIRONMENT_KDE4;
-  } else if (g_store_.Get() == "kwallet5") {
+  } else if (g_store.Get() == "kwallet5") {
     used_desktop_env = base::nix::DESKTOP_ENVIRONMENT_KDE5;
-  } else if (g_store_.Get() == "gnome") {
+  } else if (g_store.Get() == "gnome") {
     used_desktop_env = base::nix::DESKTOP_ENVIRONMENT_GNOME;
-  } else if (g_store_.Get() == "basic") {
+  } else if (g_store.Get() == "basic") {
     used_desktop_env = base::nix::DESKTOP_ENVIRONMENT_OTHER;
   } else {
     std::unique_ptr<base::Environment> env(base::Environment::Create());
@@ -51,6 +67,17 @@
       return key_storage;
     }
 #endif
+  } else if (used_desktop_env == base::nix::DESKTOP_ENVIRONMENT_KDE4 ||
+             used_desktop_env == base::nix::DESKTOP_ENVIRONMENT_KDE5) {
+#if defined(USE_KWALLET)
+    DCHECK(!g_product_name.Get().empty());
+    key_storage.reset(
+        new KeyStorageKWallet(used_desktop_env, g_product_name.Get()));
+    if (key_storage->Init()) {
+      VLOG(1) << "OSCrypt using KWallet as backend.";
+      return key_storage;
+    }
+#endif
   }
 
   // The appropriate store was not available.
diff --git a/components/os_crypt/key_storage_linux.h b/components/os_crypt/key_storage_linux.h
index b8ef53b..2791d75 100644
--- a/components/os_crypt/key_storage_linux.h
+++ b/components/os_crypt/key_storage_linux.h
@@ -20,6 +20,9 @@
   // Force OSCrypt to use a specific linux password store.
   static void SetStore(const std::string& store_type);
 
+  // The product name to use for permission prompts.
+  static void SetProductName(const std::string& product_name);
+
   // Tries to load the appropriate key storage. Returns null if none succeed.
   static std::unique_ptr<KeyStorageLinux> CreateService();
 
@@ -31,6 +34,11 @@
   // Loads the key storage. Returns false if the service is not available.
   virtual bool Init() = 0;
 
+  // The name of the group, if any, containing the key.
+  static const char kFolderName[];
+  // The name of the entry with the encryption key.
+  static const char kKey[];
+
  private:
   DISALLOW_COPY_AND_ASSIGN(KeyStorageLinux);
 };
diff --git a/components/os_crypt/kwallet_dbus.cc b/components/os_crypt/kwallet_dbus.cc
index f6ec2a1..eb057e63 100644
--- a/components/os_crypt/kwallet_dbus.cc
+++ b/components/os_crypt/kwallet_dbus.cc
@@ -68,7 +68,7 @@
   builder.AppendBool(false);             // blind
   std::unique_ptr<dbus::Response> response(klauncher->CallMethodAndBlock(
       &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
-  if (!response.get()) {
+  if (!response) {
     LOG(ERROR) << "Error contacting klauncher to start " << kwalletd_name_;
     return false;
   }
@@ -96,7 +96,7 @@
   dbus::MethodCall method_call(kKWalletInterface, "isEnabled");
   std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock(
       &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
-  if (!response.get()) {
+  if (!response) {
     LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (isEnabled)";
     return CANNOT_CONTACT;
   }
@@ -119,7 +119,7 @@
   dbus::MethodCall method_call(kKWalletInterface, "networkWallet");
   std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock(
       &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
-  if (!response.get()) {
+  if (!response) {
     LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (networkWallet)";
     return CANNOT_CONTACT;
   }
@@ -143,7 +143,7 @@
   builder.AppendString(app_name);     // appid
   std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock(
       &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
-  if (!response.get()) {
+  if (!response) {
     LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (open)";
     return CANNOT_CONTACT;
   }
@@ -169,7 +169,7 @@
   builder.AppendString(app_name);      // appid
   std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock(
       &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
-  if (!response.get()) {
+  if (!response) {
     LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (hasEntry)";
     return CANNOT_CONTACT;
   }
@@ -195,7 +195,7 @@
   builder.AppendString(app_name);      // appid
   std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock(
       &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
-  if (!response.get()) {
+  if (!response) {
     LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (readEntry)";
     return CANNOT_CONTACT;
   }
@@ -227,7 +227,7 @@
   builder.AppendString(app_name);      // appid
   std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock(
       &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
-  if (!response.get()) {
+  if (!response) {
     LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (entryList)";
     return CANNOT_CONTACT;
   }
@@ -253,7 +253,7 @@
   builder.AppendString(app_name);      // appid
   std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock(
       &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
-  if (!response.get()) {
+  if (!response) {
     LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (removeEntry)";
     return CANNOT_CONTACT;
   }
@@ -282,7 +282,7 @@
   builder.AppendString(app_name);            // appid
   std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock(
       &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
-  if (!response.get()) {
+  if (!response) {
     LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (writeEntry)";
     return CANNOT_CONTACT;
   }
@@ -306,7 +306,7 @@
   builder.AppendString(app_name);     // appid
   std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock(
       &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
-  if (!response.get()) {
+  if (!response) {
     LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (hasFolder)";
     return CANNOT_CONTACT;
   }
@@ -330,8 +330,8 @@
   builder.AppendString(app_name);     // appid
   std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock(
       &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
-  if (!response.get()) {
-    LOG(ERROR) << "Error contacting << " << kwalletd_name_ << " (createFolder)";
+  if (!response) {
+    LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (createFolder)";
     return CANNOT_CONTACT;
   }
   dbus::MessageReader reader(response.get());
@@ -342,3 +342,85 @@
   }
   return SUCCESS;
 }
+
+KWalletDBus::Error KWalletDBus::WritePassword(const int handle,
+                                              const std::string& folder_name,
+                                              const std::string& key,
+                                              const std::string& password,
+                                              const std::string& app_name,
+                                              bool* const write_success_ptr) {
+  dbus::MethodCall method_call(kKWalletInterface, "writePassword");
+  dbus::MessageWriter builder(&method_call);
+  builder.AppendInt32(handle);
+  builder.AppendString(folder_name);
+  builder.AppendString(key);
+  builder.AppendString(password);
+  builder.AppendString(app_name);
+  std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock(
+      &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
+  if (!response) {
+    LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (writePassword)";
+    return CANNOT_CONTACT;
+  }
+  dbus::MessageReader reader(response.get());
+  int return_code;
+  if (!reader.PopInt32(&return_code)) {
+    LOG(ERROR) << "Error reading response from " << kwalletd_name_
+               << " (writePassword): " << response->ToString();
+    return CANNOT_READ;
+  }
+  *write_success_ptr = return_code == 0;
+  return SUCCESS;
+}
+
+KWalletDBus::Error KWalletDBus::ReadPassword(const int handle,
+                                             const std::string& folder_name,
+                                             const std::string& key,
+                                             const std::string& app_name,
+                                             std::string* const password_ptr) {
+  dbus::MethodCall method_call(kKWalletInterface, "readPassword");
+  dbus::MessageWriter builder(&method_call);
+  builder.AppendInt32(handle);
+  builder.AppendString(folder_name);
+  builder.AppendString(key);
+  builder.AppendString(app_name);
+  std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock(
+      &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
+  if (!response) {
+    LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (readPassword)";
+    return CANNOT_CONTACT;
+  }
+  dbus::MessageReader reader(response.get());
+  if (!reader.PopString(password_ptr)) {
+    LOG(ERROR) << "Error reading response from " << kwalletd_name_
+               << " (readPassword): " << response->ToString();
+    return CANNOT_READ;
+  }
+  return SUCCESS;
+}
+
+KWalletDBus::Error KWalletDBus::Close(const int handle,
+                                      const bool force,
+                                      const std::string& app_name,
+                                      bool* success_ptr) {
+  dbus::MethodCall method_call(kKWalletInterface, "close");
+  dbus::MessageWriter builder(&method_call);
+  builder.AppendInt32(handle);
+  builder.AppendBool(force);
+  builder.AppendString(app_name);
+  std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock(
+      &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
+  if (!response) {
+    LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (close)";
+    return CANNOT_CONTACT;
+  }
+  dbus::MessageReader reader(response.get());
+  int return_code = 1;
+  if (!reader.PopInt32(&return_code)) {
+    LOG(ERROR) << "Error reading response from " << kwalletd_name_
+               << " (close): " << response->ToString();
+    return CANNOT_READ;
+  }
+  *success_ptr = return_code == 0;
+  return SUCCESS;
+}
diff --git a/components/os_crypt/kwallet_dbus.h b/components/os_crypt/kwallet_dbus.h
index e0412c5..e5366ecb 100644
--- a/components/os_crypt/kwallet_dbus.h
+++ b/components/os_crypt/kwallet_dbus.h
@@ -24,17 +24,17 @@
   enum Error { SUCCESS = 0, CANNOT_CONTACT, CANNOT_READ };
 
   explicit KWalletDBus(base::nix::DesktopEnvironment desktop_env);
-  ~KWalletDBus();
+  virtual ~KWalletDBus();
 
   // Set the bus that we will use. Required before any other operation.
   // The owner of KWalletDBus is responsible for killing the bus.
-  void SetSessionBus(scoped_refptr<dbus::Bus> session_bus);
+  virtual void SetSessionBus(scoped_refptr<dbus::Bus> session_bus);
 
   // Expose the bus so that shutdown can be scheduled asynchronously.
-  dbus::Bus* GetSessionBus();
+  virtual dbus::Bus* GetSessionBus();
 
   // Use KLauncher to start the KWallet service. Returns true if successful.
-  bool StartKWalletd() WARN_UNUSED_RESULT;
+  virtual bool StartKWalletd() WARN_UNUSED_RESULT;
 
   // The functions below are wrappers for calling the eponymous KWallet dbus
   // methods. They take pointers to locations where the return values will be
@@ -42,65 +42,89 @@
   // https://api.kde.org/4.12-api/kdelibs-apidocs/kdeui/html/classKWallet_1_1Wallet.html
 
   // Determine if the KDE wallet is enabled.
-  Error IsEnabled(bool* enabled) WARN_UNUSED_RESULT;
+  virtual Error IsEnabled(bool* enabled) WARN_UNUSED_RESULT;
 
   // Get the name of the wallet used to store network passwords.
-  Error NetworkWallet(std::string* wallet_name_ptr) WARN_UNUSED_RESULT;
+  virtual Error NetworkWallet(std::string* wallet_name_ptr) WARN_UNUSED_RESULT;
 
   // Open the |wallet_name| wallet for use.
-  Error Open(const std::string& wallet_name,
-             const std::string& app_name,
-             int* handle_ptr) WARN_UNUSED_RESULT;
+  virtual Error Open(const std::string& wallet_name,
+                     const std::string& app_name,
+                     int* handle_ptr) WARN_UNUSED_RESULT;
 
   // Determine if the current folder has they entry key.
-  Error HasEntry(int wallet_handle,
-                 const std::string& folder_name,
-                 const std::string& signon_realm,
-                 const std::string& app_name,
-                 bool* has_entry_ptr) WARN_UNUSED_RESULT;
+  virtual Error HasEntry(int wallet_handle,
+                         const std::string& folder_name,
+                         const std::string& signon_realm,
+                         const std::string& app_name,
+                         bool* has_entry_ptr) WARN_UNUSED_RESULT;
 
   // Read the entry key from the current folder.
-  Error ReadEntry(int wallet_handle,
-                  const std::string& folder_name,
-                  const std::string& signon_realm,
-                  const std::string& app_name,
-                  std::vector<uint8_t>* bytes_ptr) WARN_UNUSED_RESULT;
+  virtual Error ReadEntry(int wallet_handle,
+                          const std::string& folder_name,
+                          const std::string& signon_realm,
+                          const std::string& app_name,
+                          std::vector<uint8_t>* bytes_ptr) WARN_UNUSED_RESULT;
 
   // Return the list of keys of all entries in this folder.
-  Error EntryList(int wallet_handle,
-                  const std::string& folder_name,
-                  const std::string& app_name,
-                  std::vector<std::string>* entry_list_ptr) WARN_UNUSED_RESULT;
+  virtual Error EntryList(int wallet_handle,
+                          const std::string& folder_name,
+                          const std::string& app_name,
+                          std::vector<std::string>* entry_list_ptr)
+      WARN_UNUSED_RESULT;
 
   // Remove the entry key from the current folder.
   // |*return_code_ptr| is 0 on success.
-  Error RemoveEntry(int wallet_handle,
-                    const std::string& folder_name,
-                    const std::string& signon_realm,
-                    const std::string& app_name,
-                    int* return_code_ptr) WARN_UNUSED_RESULT;
+  virtual Error RemoveEntry(int wallet_handle,
+                            const std::string& folder_name,
+                            const std::string& signon_realm,
+                            const std::string& app_name,
+                            int* return_code_ptr) WARN_UNUSED_RESULT;
 
   // Write a binary entry to the current folder.
   // |*return_code_ptr| is 0 on success.
-  Error WriteEntry(int wallet_handle,
-                   const std::string& folder_name,
-                   const std::string& signon_realm,
-                   const std::string& app_name,
-                   const uint8_t* data,
-                   size_t length,
-                   int* return_code_ptr) WARN_UNUSED_RESULT;
+  virtual Error WriteEntry(int wallet_handle,
+                           const std::string& folder_name,
+                           const std::string& signon_realm,
+                           const std::string& app_name,
+                           const uint8_t* data,
+                           size_t length,
+                           int* return_code_ptr) WARN_UNUSED_RESULT;
 
   // Determine if the folder |folder_name| exists in the wallet.
-  Error HasFolder(int handle,
-                  const std::string& folder_name,
-                  const std::string& app_name,
-                  bool* has_folder_ptr) WARN_UNUSED_RESULT;
+  virtual Error HasFolder(int handle,
+                          const std::string& folder_name,
+                          const std::string& app_name,
+                          bool* has_folder_ptr) WARN_UNUSED_RESULT;
 
-  // Created the folder |folder_name|.
-  Error CreateFolder(int handle,
-                     const std::string& folder_name,
-                     const std::string& app_name,
-                     bool* success_ptr) WARN_UNUSED_RESULT;
+  // Create the folder |folder_name|.
+  virtual Error CreateFolder(int handle,
+                             const std::string& folder_name,
+                             const std::string& app_name,
+                             bool* success_ptr) WARN_UNUSED_RESULT;
+
+  // Write a password to the current folder.
+  virtual Error WritePassword(int handle,
+                              const std::string& folder_name,
+                              const std::string& key,
+                              const std::string& password,
+                              const std::string& app_name,
+                              bool* write_success_ptr) WARN_UNUSED_RESULT;
+
+  // Read the password for |key| from |folder_name|.
+  // Clear |password_ptr| if no such password exists.
+  virtual Error ReadPassword(int handle,
+                             const std::string& folder_name,
+                             const std::string& key,
+                             const std::string& app_name,
+                             std::string* password_ptr) WARN_UNUSED_RESULT;
+
+  // Close the wallet. The wallet will only be closed if it is open but not in
+  // use (rare), or if it is forced closed.
+  virtual Error Close(int handle,
+                      bool force,
+                      const std::string& app_name,
+                      bool* success_ptr) WARN_UNUSED_RESULT;
 
  private:
   // DBus handle for communication with klauncher and kwalletd.
diff --git a/components/os_crypt/kwallet_dbus_unittest.cc b/components/os_crypt/kwallet_dbus_unittest.cc
index 24d6b8e8..bc494f1 100644
--- a/components/os_crypt/kwallet_dbus_unittest.cc
+++ b/components/os_crypt/kwallet_dbus_unittest.cc
@@ -272,6 +272,61 @@
   return true;
 }
 
+MATCHER_P5(ArgumentsAreIntStringStringStringString,
+           int_1,
+           str_2,
+           str_3,
+           str_4,
+           str_5,
+           "") {
+  dbus::MessageReader reader(arg);
+
+  int32_t i;
+  EXPECT_TRUE(reader.PopInt32(&i));
+  if (int_1 != i)
+    return false;
+
+  std::string str;
+  EXPECT_TRUE(reader.PopString(&str));
+  if (str_2 != str)
+    return false;
+
+  EXPECT_TRUE(reader.PopString(&str));
+  if (str_3 != str)
+    return false;
+
+  EXPECT_TRUE(reader.PopString(&str));
+  if (str_4 != str)
+    return false;
+
+  EXPECT_TRUE(reader.PopString(&str));
+  if (str_5 != str)
+    return false;
+
+  return true;
+}
+
+MATCHER_P3(ArgumentsAreIntBoolString, int_1, bool_2, str_3, "") {
+  dbus::MessageReader reader(arg);
+
+  int32_t i;
+  EXPECT_TRUE(reader.PopInt32(&i));
+  if (int_1 != i)
+    return false;
+
+  bool b;
+  EXPECT_TRUE(reader.PopBool(&b));
+  if (bool_2 != b)
+    return false;
+
+  std::string str;
+  EXPECT_TRUE(reader.PopString(&str));
+  if (str_3 != str)
+    return false;
+
+  return true;
+}
+
 TEST_P(KWalletDBusTest, StartWalletd) {
   // The receiver of the message takes ownership of the response object.
   dbus::Response* response_success = RespondEmpty();
@@ -693,4 +748,145 @@
             kwallet_dbus_.CreateFolder(123, "folder", "app", &created_folder));
 }
 
+TEST_P(KWalletDBusTest, WritePassword) {
+  EXPECT_CALL(*mock_kwallet_proxy_.get(),
+              MockCallMethodAndBlock(
+                  AllOf(Calls(kKWalletInterface, "writePassword"),
+                        ArgumentsAreIntStringStringStringString(
+                            123, "folder", "key", "password", "app")),
+                  _))
+      .WillOnce(Return(RespondInt32(0)));
+
+  bool write_success = false;
+  EXPECT_EQ(KWalletDBus::Error::SUCCESS,
+            kwallet_dbus_.WritePassword(123, "folder", "key", "password", "app",
+                                        &write_success));
+  EXPECT_TRUE(write_success);
+}
+
+TEST_P(KWalletDBusTest, WritePasswordRejected) {
+  EXPECT_CALL(*mock_kwallet_proxy_.get(),
+              MockCallMethodAndBlock(
+                  AllOf(Calls(kKWalletInterface, "writePassword"),
+                        ArgumentsAreIntStringStringStringString(
+                            123, "folder", "key", "password", "app")),
+                  _))
+      .WillOnce(Return(RespondInt32(-1)));
+
+  bool write_success = true;
+  EXPECT_EQ(KWalletDBus::Error::SUCCESS,
+            kwallet_dbus_.WritePassword(123, "folder", "key", "password", "app",
+                                        &write_success));
+  EXPECT_FALSE(write_success);
+}
+
+TEST_P(KWalletDBusTest, WritePasswordErrorRead) {
+  EXPECT_CALL(
+      *mock_kwallet_proxy_.get(),
+      MockCallMethodAndBlock(Calls(kKWalletInterface, "writePassword"), _))
+      .WillOnce(Return(RespondEmpty()));
+
+  bool write_success = false;
+  EXPECT_EQ(KWalletDBus::Error::CANNOT_READ,
+            kwallet_dbus_.WritePassword(123, "folder", "key", "password", "app",
+                                        &write_success));
+}
+
+TEST_P(KWalletDBusTest, WritePasswordErrorContact) {
+  EXPECT_CALL(
+      *mock_kwallet_proxy_.get(),
+      MockCallMethodAndBlock(Calls(kKWalletInterface, "writePassword"), _))
+      .WillOnce(Return(nullptr));
+
+  bool write_success = false;
+  EXPECT_EQ(KWalletDBus::Error::CANNOT_CONTACT,
+            kwallet_dbus_.WritePassword(123, "folder", "key", "password", "app",
+                                        &write_success));
+}
+
+TEST_P(KWalletDBusTest, ReadPassword) {
+  EXPECT_CALL(
+      *mock_kwallet_proxy_.get(),
+      MockCallMethodAndBlock(
+          AllOf(Calls(kKWalletInterface, "readPassword"),
+                ArgumentsAreIntStringStringString(123, "folder", "key", "app")),
+          _))
+      .WillOnce(Return(RespondString("password")));
+
+  std::string password;
+  EXPECT_EQ(KWalletDBus::Error::SUCCESS,
+            kwallet_dbus_.ReadPassword(123, "folder", "key", "app", &password));
+  EXPECT_EQ("password", password);
+}
+
+TEST_P(KWalletDBusTest, ReadPasswordErrorRead) {
+  EXPECT_CALL(
+      *mock_kwallet_proxy_.get(),
+      MockCallMethodAndBlock(Calls(kKWalletInterface, "readPassword"), _))
+      .WillOnce(Return(RespondEmpty()));
+
+  std::string password;
+  EXPECT_EQ(KWalletDBus::Error::CANNOT_READ,
+            kwallet_dbus_.ReadPassword(123, "folder", "key", "app", &password));
+}
+
+TEST_P(KWalletDBusTest, ReadPasswordErrorContact) {
+  EXPECT_CALL(
+      *mock_kwallet_proxy_.get(),
+      MockCallMethodAndBlock(Calls(kKWalletInterface, "readPassword"), _))
+      .WillOnce(Return(nullptr));
+
+  std::string password;
+  EXPECT_EQ(KWalletDBus::Error::CANNOT_CONTACT,
+            kwallet_dbus_.ReadPassword(123, "folder", "key", "app", &password));
+}
+
+TEST_P(KWalletDBusTest, CloseSuccess) {
+  EXPECT_CALL(*mock_kwallet_proxy_.get(),
+              MockCallMethodAndBlock(
+                  AllOf(Calls(kKWalletInterface, "close"),
+                        ArgumentsAreIntBoolString(123, false, "app")),
+                  _))
+      .WillOnce(Return(RespondInt32(0)));
+
+  bool success = false;
+  EXPECT_EQ(KWalletDBus::Error::SUCCESS,
+            kwallet_dbus_.Close(123, false, "app", &success));
+  EXPECT_TRUE(success);
+}
+
+TEST_P(KWalletDBusTest, CloseUnsuccessful) {
+  EXPECT_CALL(*mock_kwallet_proxy_.get(),
+              MockCallMethodAndBlock(
+                  AllOf(Calls(kKWalletInterface, "close"),
+                        ArgumentsAreIntBoolString(123, false, "app")),
+                  _))
+      .WillOnce(Return(RespondInt32(1)));
+
+  bool success = true;
+  EXPECT_EQ(KWalletDBus::Error::SUCCESS,
+            kwallet_dbus_.Close(123, false, "app", &success));
+  EXPECT_FALSE(success);
+}
+
+TEST_P(KWalletDBusTest, CloseErrorRead) {
+  EXPECT_CALL(*mock_kwallet_proxy_.get(),
+              MockCallMethodAndBlock(Calls(kKWalletInterface, "close"), _))
+      .WillOnce(Return(RespondEmpty()));
+
+  bool success = true;
+  EXPECT_EQ(KWalletDBus::Error::CANNOT_READ,
+            kwallet_dbus_.Close(123, false, "app", &success));
+}
+
+TEST_P(KWalletDBusTest, CloseErrorContact) {
+  EXPECT_CALL(*mock_kwallet_proxy_.get(),
+              MockCallMethodAndBlock(Calls(kKWalletInterface, "close"), _))
+      .WillOnce(Return(nullptr));
+
+  bool success = true;
+  EXPECT_EQ(KWalletDBus::Error::CANNOT_CONTACT,
+            kwallet_dbus_.Close(123, false, "app", &success));
+}
+
 }  // namespace
diff --git a/components/os_crypt/os_crypt.h b/components/os_crypt/os_crypt.h
index 287a28d..c3e04f7 100644
--- a/components/os_crypt/os_crypt.h
+++ b/components/os_crypt/os_crypt.h
@@ -26,6 +26,10 @@
   // In any other case, we default to auto-detecting the store.
   // This should not be changed after OSCrypt has been used.
   static void SetStore(const std::string& store_type);
+
+  // Some password stores may prompt the user for permission and show the
+  // application name.
+  static void SetProductName(const std::string& product_name);
 #endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
 
   // Encrypt a string16. The output (second argument) is really an array of
diff --git a/components/os_crypt/os_crypt_linux.cc b/components/os_crypt/os_crypt_linux.cc
index 2104d25..000bde4 100644
--- a/components/os_crypt/os_crypt_linux.cc
+++ b/components/os_crypt/os_crypt_linux.cc
@@ -218,6 +218,14 @@
   KeyStorageLinux::SetStore(store_type);
 }
 
+// static
+void OSCrypt::SetProductName(const std::string& product_name) {
+  // Setting the product name makes no sense after initializing.
+  DCHECK(!g_cache.Get().is_key_storage_cached);
+
+  KeyStorageLinux::SetProductName(product_name);
+}
+
 void UseMockKeyStorageForTesting(KeyStorageLinux* (*get_key_storage_mock)(),
                                  std::string* (*get_password_v11_mock)()) {
   // Save the real implementation to restore it later.
diff --git a/components/password_manager.gypi b/components/password_manager.gypi
index 20ef1f0b..8dd1277 100644
--- a/components/password_manager.gypi
+++ b/components/password_manager.gypi
@@ -337,9 +337,11 @@
             '../content/content.gyp:content_browser',
             '../content/content.gyp:content_common',
             '../ipc/ipc.gyp:ipc',
+            '../mojo/mojo_base.gyp:mojo_common_lib',
             '../net/net.gyp:net',
             'autofill_content_browser',
             'autofill_content_common',
+            'autofill_content_mojo_bindings',
             'autofill_core_common',
             'keyed_service_content',
             'password_manager_content_mojo_bindings',
diff --git a/components/password_manager/content/browser/BUILD.gn b/components/password_manager/content/browser/BUILD.gn
index bca6f3b..cf7c024 100644
--- a/components/password_manager/content/browser/BUILD.gn
+++ b/components/password_manager/content/browser/BUILD.gn
@@ -20,6 +20,7 @@
     "//base",
     "//components/autofill/content/browser",
     "//components/autofill/content/common",
+    "//components/autofill/content/public/interfaces",
     "//components/autofill/core/common",
     "//components/keyed_service/content",
     "//components/password_manager/content/public/cpp",
@@ -30,6 +31,7 @@
     "//content/public/browser",
     "//content/public/common",
     "//ipc",
+    "//mojo/common:common_base",
     "//net",
   ]
 }
diff --git a/components/password_manager/content/browser/DEPS b/components/password_manager/content/browser/DEPS
index 4bab70e2..c7e90b1 100644
--- a/components/password_manager/content/browser/DEPS
+++ b/components/password_manager/content/browser/DEPS
@@ -1,6 +1,7 @@
 include_rules = [
   "+components/autofill/core/browser",
   "+components/autofill/content/browser",
+  "+components/autofill/content/public/interfaces",
   "+components/keyed_service/content",
   "+content/public/browser",
   "+ipc",
diff --git a/components/password_manager/content/browser/content_password_manager_driver.cc b/components/password_manager/content/browser/content_password_manager_driver.cc
index 0a77694..26a0ea1 100644
--- a/components/password_manager/content/browser/content_password_manager_driver.cc
+++ b/components/password_manager/content/browser/content_password_manager_driver.cc
@@ -4,6 +4,7 @@
 
 #include "components/password_manager/content/browser/content_password_manager_driver.h"
 
+#include "components/autofill/content/browser/content_autofill_driver.h"
 #include "components/autofill/content/common/autofill_messages.h"
 #include "components/autofill/core/common/form_data.h"
 #include "components/autofill/core/common/password_form.h"
@@ -23,6 +24,7 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/ssl_status.h"
 #include "ipc/ipc_message_macros.h"
+#include "mojo/common/common_type_converters.h"
 #include "net/cert/cert_status_flags.h"
 
 namespace password_manager {
@@ -92,31 +94,26 @@
 void ContentPasswordManagerDriver::FillSuggestion(
     const base::string16& username,
     const base::string16& password) {
-  content::RenderFrameHost* host = render_frame_host_;
-  host->Send(new AutofillMsg_FillPasswordSuggestion(host->GetRoutingID(),
-                                                    username, password));
+  GetAutofillAgent()->FillPasswordSuggestion(mojo::String::From(username),
+                                             mojo::String::From(password));
 }
 
 void ContentPasswordManagerDriver::PreviewSuggestion(
     const base::string16& username,
     const base::string16& password) {
-  content::RenderFrameHost* host = render_frame_host_;
-  host->Send(new AutofillMsg_PreviewPasswordSuggestion(host->GetRoutingID(),
-                                                       username, password));
+  GetAutofillAgent()->PreviewPasswordSuggestion(mojo::String::From(username),
+                                                mojo::String::From(password));
 }
 
 void ContentPasswordManagerDriver::ShowInitialPasswordAccountSuggestions(
     const autofill::PasswordFormFillData& form_data) {
   const int key = next_free_key_++;
   password_autofill_manager_.OnAddPasswordFormMapping(key, form_data);
-  render_frame_host_->Send(
-      new AutofillMsg_ShowInitialPasswordAccountSuggestions(
-          render_frame_host_->GetRoutingID(), key, form_data));
+  GetAutofillAgent()->ShowInitialPasswordAccountSuggestions(key, form_data);
 }
 
 void ContentPasswordManagerDriver::ClearPreviewedForm() {
-  content::RenderFrameHost* host = render_frame_host_;
-  host->Send(new AutofillMsg_ClearPreviewedForm(host->GetRoutingID()));
+  GetAutofillAgent()->ClearPreviewedForm();
 }
 
 void ContentPasswordManagerDriver::ForceSavePassword() {
@@ -295,4 +292,13 @@
   return true;
 }
 
+const autofill::mojom::AutofillAgentPtr&
+ContentPasswordManagerDriver::GetAutofillAgent() {
+  autofill::ContentAutofillDriver* autofill_driver =
+      autofill::ContentAutofillDriver::GetForRenderFrameHost(
+          render_frame_host_);
+  DCHECK(autofill_driver);
+  return autofill_driver->GetAutofillAgent();
+}
+
 }  // namespace password_manager
diff --git a/components/password_manager/content/browser/content_password_manager_driver.h b/components/password_manager/content/browser/content_password_manager_driver.h
index 28678cb6..0660883 100644
--- a/components/password_manager/content/browser/content_password_manager_driver.h
+++ b/components/password_manager/content/browser/content_password_manager_driver.h
@@ -10,6 +10,7 @@
 
 #include "base/compiler_specific.h"
 #include "base/macros.h"
+#include "components/autofill/content/public/interfaces/autofill_agent.mojom.h"
 #include "components/autofill/core/common/password_form_field_prediction_map.h"
 #include "components/autofill/core/common/password_form_generation_data.h"
 #include "components/password_manager/core/browser/password_autofill_manager.h"
@@ -101,6 +102,8 @@
   bool CheckChildProcessSecurityPolicy(const GURL& url,
                                        BadMessageReason reason);
 
+  const autofill::mojom::AutofillAgentPtr& GetAutofillAgent();
+
   content::RenderFrameHost* render_frame_host_;
   PasswordManagerClient* client_;
   PasswordGenerationManager password_generation_manager_;
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb
index ddc310b..61082e9 100644
--- a/components/policy/resources/policy_templates_am.xtb
+++ b/components/policy/resources/policy_templates_am.xtb
@@ -22,13 +22,6 @@
       ወደ እውነት ከተዋቀረ ወይም እንዳልተዋቀረ ከተተወ ስታትስቲክሱ ሪፓርት ይደረጋል።</translation>
 <translation id="1046484220783400299">የተቋረጡ የድር መሣሪያ ስርዓት ባህሪያት ለተወሰነ ጊዜ ያንቁ</translation>
 <translation id="1047128214168693844">ማንኛውም ጣቢያ የተጠቃሚዎች አካላዊ አካባቢ እንዲከታተል አይፍቀዱ</translation>
-<translation id="1057535219415338480">የአውታረ መረብ መገመት በ<ph name="PRODUCT_NAME" /> ውስጥ የሚያነቃ እና ተጠቃሚዎች ይህንን ቅንብር እንዳይቀይሩ የሚያግድ ነው።
-
-      ይሄ የዲ ኤን ኤስ ቅድሚያ ማስመጣት ብቻ ሳይሆን የቲሲፒ እና ኤስ ኤስ ኤል ቅድሚያ ግንኙነት እና የድረ-ገጾች ቅድሚያ ማሳየትንም ጭምር ይቆጣጠራል። የመመሪያ ስሙ የዲ ኤን ኤስ ቅድሚያ ማስመጣት የሚባለው በታሪካዊ ምክንያት ነው።
-
-      ይህን ቅንብር ካነቁ ወይም ካሰናከሉ ተጠቃሚዎች ይህን ቅንብር በ<ph name="PRODUCT_NAME" /> ውስጥ መቀየር ወይም መሻር አይችሉም።
-
-      ይህ መመሪያ እንዳልተዋቀረ ከተተወ ይሄ ይነቃል ግን ተጠቃሚው ሊቀይረው ይችላል።</translation>
 <translation id="1062011392452772310">ለመሣሪያው በርቀት ማስረገጥን ያንቁ</translation>
 <translation id="1090892140761957285">ዩአርኤል ለርቀት መዳረሻ ደንበኛ ማረጋገጫ ማስመሰያ።
 
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb
index 16419f8..b4682981 100644
--- a/components/policy/resources/policy_templates_ar.xtb
+++ b/components/policy/resources/policy_templates_ar.xtb
@@ -22,13 +22,6 @@
       إذا تم تعيين هذه السياسة على "true"، أو لم يتم تعيينها، فسيتم الإبلاغ عن هذه الإحصاءات.</translation>
 <translation id="1046484220783400299">تمكين الميزات الموقوفة لوسيط عرض الإعلان عبر الإنترنت لفترة محدودة</translation>
 <translation id="1047128214168693844">عدم السماح لأي موقع ويب بتتبع الموقع الفعلي للمستخدم</translation>
-<translation id="1057535219415338480">‏تمكين تنبؤ الشبكة في <ph name="PRODUCT_NAME" /> ومنع المستخدمين من تغيير هذا الإعداد.
-
-      هذا لا يتحكم فقط في الجلب المسبق لنظام أسماء النطاقات لكن أيضًا في الاتصال المسبق عبر بروتوكول طبقة المنافذ الآمنة (SSL) وبروتوكول التحكم في الإرسال (TCP) والعرض المسبق لصفحات الويب. يشير اسم السياسة إلى الجلب المسبق لنظام أسماء النطاقات لأسباب سابقة.
-
-      في حالة تمكين أو تعطيل هذا الإعداد، لا يمكن للمستخدمين تغيير أو تجاوز هذا الإعداد في <ph name="PRODUCT_NAME" />.
-
-      في حالة ترك هذه السياسة بدون تعيين، سيتم تمكين الإعداد لكن سيكون بمقدور المستخدم تغييره.</translation>
 <translation id="1062011392452772310">تمكين التأكيد عن بُعد للجهاز</translation>
 <translation id="1090892140761957285">‏عنوان URL للتحقق من الرمز المميز لمصادقة عميل الوصول البعيد.
 
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb
index f5d3eb9a..c85b1f7 100644
--- a/components/policy/resources/policy_templates_bg.xtb
+++ b/components/policy/resources/policy_templates_bg.xtb
@@ -22,13 +22,6 @@
 и ще се изпращат, ако то е true или не е конфигурирано.</translation>
 <translation id="1046484220783400299">Активиране за ограничен период от време на оттеглени функции на уеб платформата</translation>
 <translation id="1047128214168693844">Без разрешаване на сайтовете да проследяват физическото местоположение на потребителите</translation>
-<translation id="1057535219415338480">Активира предвижданията за мрежата в <ph name="PRODUCT_NAME" /> и не разрешава на потребителите да променят тази настройка.
-
-Това контролира не само предварителното извличане на DNS, но също предварителното свързване през TCP и SSL и предварителното изобразяване на уеб страниците. Името на правилото се отнася до предварителното извличане на DNS поради исторически причини.
-
-Ако активирате или деактивирате тази настройка, потребителите не могат да я променят или отменят в <ph name="PRODUCT_NAME" />.
-
-В случай че това правило е оставено незададено, настройката ще бъде активирана, но потребителят ще може да я променя.</translation>
 <translation id="1062011392452772310">Активиране на отдалечено удостоверяване за устройството</translation>
 <translation id="1090892140761957285">URL адрес за проверка на означението за удостоверяване на клиентската програма за отдалечен достъп.
 
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb
index deda07e..8f3861e 100644
--- a/components/policy/resources/policy_templates_bn.xtb
+++ b/components/policy/resources/policy_templates_bn.xtb
@@ -22,13 +22,6 @@
      নীতিটি যদি সত্যতে সেট করা থাকে বা সেট না করে রাখা হয়, তাহলে পরিসংখ্যানের প্রতিবেদন করা হবে।</translation>
 <translation id="1046484220783400299">একটি সীমিত সময়ের জন্য ডেপ্রিকেটেড ওয়েব প্ল্যাটফর্ম বৈশিষ্ট্যগুলি সক্রিয় করে</translation>
 <translation id="1047128214168693844">ব্যবহারকারীর শারীরিক অবস্থান ট্র্যাক করতে কোনও সাইটকে মঞ্জুরি দেবেন না</translation>
-<translation id="1057535219415338480"><ph name="PRODUCT_NAME" /> এ নেটওয়ার্ক পূর্বানুমানটি সক্ষম করে এবং ব্যবহারকারীদের এই সেটিংটি পরিবর্তন করতে বাধা দেয়৷
-
-      এই নিয়ন্ত্রণগুলি শুধুমাত্র DNS পূর্বআনয়ন নয়, এটি এছাড়াও ওয়েব পৃষ্ঠাগুলির TCP এবং SSL প্রাক সংযোগ ও প্রাক রেন্ডারিং৷ নীতি নামটি ঐতিহাসিক কারণগুলির জন্য DNS পূর্বআনয়নকে চিহ্নিত করে৷
-
-      আপনি যদি এই সেটিংটি সক্ষম বা অক্ষম করেন, তাহলে ব্যবহারকারীরা <ph name="PRODUCT_NAME" /> এ এই সেটিংটি পরিবর্তন অথবা ওভাররাইড করতে পারবে না|
-
-      যদি নীতিটি সেট না করে ছেড়ে যাওয়া হয়, এটি সক্ষম করা হবে কিন্তু ব্যবহারকরী এটি পরিবর্তন করতে পারবে না৷</translation>
 <translation id="1062011392452772310">ডিভাইসটির জন্য দূরবর্তী প্রত্যায়ন সক্ষম করুন</translation>
 <translation id="1090892140761957285">দূরবর্তী অ্যাক্সেস ক্লায়েন্ট প্রমাণীকরণ টোকেনের বৈধতা যাচাই করার URL।
 
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb
index 986755a..3cd0bf5 100644
--- a/components/policy/resources/policy_templates_ca.xtb
+++ b/components/policy/resources/policy_templates_ca.xtb
@@ -22,13 +22,6 @@
       Si s'estableix en "true" o no s'estableix, s'informa de les estadístiques.</translation>
 <translation id="1046484220783400299">Activa les funcions obsoletes de la plataforma web durant un temps limitat</translation>
 <translation id="1047128214168693844">No permetis que cap lloc web faci el seguiment de la ubicació física dels usuaris</translation>
-<translation id="1057535219415338480">Permet la predicció de xarxa a <ph name="PRODUCT_NAME" /> i impedeix que els usuaris canviïn aquesta configuració.
-
-      No només controla l'obtenció prèvia de DNS, sinó també la connexió i la renderització prèvies de TCP i de SSL de les pàgines web. El nom de la política fa referència a l'obtenció prèvia de DNS per qüestions relacionades amb l'historial.
-
-      Si activeu o desactiveu aquesta opció, els usuaris no podran canviar-la ni anul·lar-la a <ph name="PRODUCT_NAME" />.
-
-      Si no es defineix aquesta política, l'opció s'activarà però l'usuari podrà canviar-la.</translation>
 <translation id="1062011392452772310">Activa el testimoni remot per al dispositiu.</translation>
 <translation id="1090892140761957285">URL per validar el testimoni d'autenticació del client d'accés remot.
 
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb
index bc7ee989..2a4ee377 100644
--- a/components/policy/resources/policy_templates_cs.xtb
+++ b/components/policy/resources/policy_templates_cs.xtb
@@ -22,13 +22,6 @@
 Pokud je nastavena na hodnotu true nebo nastavena není, statistiky hlášeny budou.</translation>
 <translation id="1046484220783400299">Na omezenou dobu povolit zastaralé funkce platformy Web Platform</translation>
 <translation id="1047128214168693844">Nepovolovat sledování fyzické polohy žádným webovým stránkám</translation>
-<translation id="1057535219415338480">Aktivuje předvídání síťových akcí v prohlížeči <ph name="PRODUCT_NAME" /> a zabraňuje uživatelům ve změně tohoto nastavení.
-
-      Kromě předběžného načítání záznamů DNS ovlivňuje tato zásada také předběžná připojení TCP a SSL a předběžné vykreslování webových stránek. Název této zásady odkazuje na předběžné načítání záznamů DNS pouze z historických důvodů.
-
-      Pokud toto nastavení aktivujete nebo deaktivujete, uživatelé jej v prohlížeči <ph name="PRODUCT_NAME" /> nebudou moci změnit.
-
-      Není-li tato zásada nastavena na konkrétní hodnotu, bude předvídání síťových akcí aktivováno, ale uživatelé budou moci nastavení změnit.</translation>
 <translation id="1062011392452772310">Povolit vzdálené ověření identity zařízení</translation>
 <translation id="1090892140761957285">Adresa URL k potvrzení ověřovacího tokenu klienta vzdáleného připojení.
 
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb
index cd36160..63139da 100644
--- a/components/policy/resources/policy_templates_da.xtb
+++ b/components/policy/resources/policy_templates_da.xtb
@@ -22,13 +22,6 @@
       Hvis den angives som Sand eller slet ikke indstilles, rapporteres statistikken.</translation>
 <translation id="1046484220783400299">Aktivér forældede funktioner på webplatformen i en begrænset periode</translation>
 <translation id="1047128214168693844">Tillad ikke, at websites sporer brugerens fysiske placering</translation>
-<translation id="1057535219415338480">Aktiverer netværksforudsigelse i <ph name="PRODUCT_NAME" /> og forhindrer brugerne i at ændre denne indstilling.
-
-      Dette styrer både forudhentning af DNS og forhåndstilslutning af TCP og SSL samt forhåndsgengivelse af websider. Navnet på politikken henviser til forudhentning af DNS af historiske årsager.
-
-      Hvis du aktiverer eller deaktiverer denne indstilling, kan brugerne ikke ændre eller tilsidesætte denne indstilling i <ph name="PRODUCT_NAME" />.
-
-      Hvis denne politik ikke angives, aktiveres dette, men brugeren vil kunne ændre det.</translation>
 <translation id="1062011392452772310">Aktivér fjernattestering for enheden</translation>
 <translation id="1090892140761957285">Webadresse til validering af token til klientgodkendelse for fjernadgang.
 
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 3546e9f..f2dbe76 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -22,13 +22,6 @@
       Ist die Richtlinie auf "true" eingestellt oder nicht konfiguriert, werden Statistiken ausgegeben.</translation>
 <translation id="1046484220783400299">Veraltete Webplattformfunktionen für einen begrenzten Zeitraum aktivieren</translation>
 <translation id="1047128214168693844">Verfolgung des physischen Standorts der Nutzer für keine Website zulassen</translation>
-<translation id="1057535219415338480">Aktiviert die Netzwerkvervollständigung in <ph name="PRODUCT_NAME" /> und verhindert, dass diese Einstellung von Nutzern geändert wird.
-
-      Hiermit wird nicht nur der DNS-Vorabruf gesteuert, sondern auch die TCP- und SSL-Vorverbindung und das Pre-Rendering von Webseiten. Der Richtlinienname bezieht sich aus historischen Gründen auf den DNS-Vorabruf.
-
-      Wenn Sie diese Einstellung aktivieren oder deaktivieren, können Nutzer diese Einstellung in <ph name="PRODUCT_NAME" /> nicht ändern oder überschreiben.
-
-      Bleibt diese Richtlinie unkonfiguriert, wird diese Einstellung aktiviert, kann jedoch vom Nutzer geändert werden.</translation>
 <translation id="1062011392452772310">Remote-Bescheinigung (Remote Attestation) für das Gerät aktivieren</translation>
 <translation id="1090892140761957285">URL zur Validierung der Authentifizierungstoken von Clients für den Remotezugriff
 
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb
index 1f0be96b..553b275 100644
--- a/components/policy/resources/policy_templates_el.xtb
+++ b/components/policy/resources/policy_templates_el.xtb
@@ -22,13 +22,6 @@
       Αν οριστεί ως αληθής ή δεν οριστεί, τα στατιστικά στοιχεία θα αναφέρονται.</translation>
 <translation id="1046484220783400299">Ενεργοποίηση καταργημένων λειτουργιών πλατφόρμας ιστού για περιορισμένο χρονικό διάστημα</translation>
 <translation id="1047128214168693844">Να μην επιτρέπεται σε κανέναν ιστότοπο η παρακολούθηση της φυσικής τοποθεσίας των χρηστών</translation>
-<translation id="1057535219415338480">Ενεργοποιεί την πρόβλεψη δικτύου στο <ph name="PRODUCT_NAME" /> και αποτρέπει τη δυνατότητα αλλαγής αυτής της ρύθμισης από τους χρήστες.
-
-      Αυτό ελέγχει την προαναζήτηση DNS, αλλά και την προσύνδεση και την προαπόδοση TCP και SSL των ιστοσελίδων. Το όνομα πολιτικής αναφέρεται στην προαναζήτηση DNS για λόγους ιστορικού.
-
-      Αν ενεργοποιήσετε ή απενεργοποιήσετε αυτήν τη ρύθμιση, οι χρήστες δεν θα μπορούν να αλλάξουν ή να παρακάμψουν αυτήν τη ρύθμιση στο <ph name="PRODUCT_NAME" />.
-
-      Αν αυτή η πολιτική δεν οριστεί, αυτή η ρύθμιση θα ενεργοποιηθεί, αλλά ο χρήστης θα έχει τη δυνατότητα να την αλλάξει.</translation>
 <translation id="1062011392452772310">Ενεργοποίηση απομακρυσμένης διαβεβαίωσης για τη συσκευή</translation>
 <translation id="1090892140761957285">URL για επικύρωση διακριτικού ελέγχου ταυτότητας εφαρμογής πελάτη απομακρυσμένης πρόσβασης.
 
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb
index 15117d07..35642638 100644
--- a/components/policy/resources/policy_templates_en-GB.xtb
+++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -22,13 +22,6 @@
       If set to true or left unset, statistics will be reported.</translation>
 <translation id="1046484220783400299">Enable deprecated web platform features for a limited time</translation>
 <translation id="1047128214168693844">Do not allow any site to track the users' physical location</translation>
-<translation id="1057535219415338480">Enables network prediction in <ph name="PRODUCT_NAME" /> and prevents users from changing this setting.
-
-      This controls not only DNS prefetching but also TCP and SSL preconnection and prerendering of web pages. The policy name refers to DNS prefetching for historical reasons.
-
-      If you enable or disable this setting, users cannot change or override this setting in <ph name="PRODUCT_NAME" />.
-
-      If this policy is left not set, this will be enabled but the user will be able to change it.</translation>
 <translation id="1062011392452772310">Enable remote attestation for the device</translation>
 <translation id="1090892140761957285">URL for validating remote access client authentication token.
 
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index f2b54e3..319645e 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -22,13 +22,6 @@
       Si se establece en true o se deja sin configurar, las estadísticas se informarán.</translation>
 <translation id="1046484220783400299">Habilitar funciones de Web Platform, que dejaron de estar disponibles, durante un período limitado</translation>
 <translation id="1047128214168693844">No permitir que ningún sitio rastree la ubicación física de los usuarios.</translation>
-<translation id="1057535219415338480">Habilita la predicción de red en <ph name="PRODUCT_NAME" /> y evita que los usuarios cambien esta configuración.
-
-      Esto controla no solo la precarga de DNS sino también la preconexión a TCP y SSL, y la representación previa de páginas web. El nombre de esta política se refiere a la precarga de DNS por razones históricas.
-
-      Si habilitas o inhabilitas esta configuración, los usuarios no podrán cambiar o anular esta configuración en <ph name="PRODUCT_NAME" />.
-
-      Si no se establece esta política, se habilitará pero el usuario podrá cambiarla.</translation>
 <translation id="1062011392452772310">Habilita la atestación remota para el dispositivo.</translation>
 <translation id="1090892140761957285">URL para la validación del token de autenticación del cliente de acceso remoto
 
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index 05e8724..65d2021 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -22,13 +22,6 @@
       Si se asigna el valor true o si la política no se configura, se informará sobre ellas.</translation>
 <translation id="1046484220783400299">Habilita funciones obsoletas de la plataforma web durante un período de tiempo limitado</translation>
 <translation id="1047128214168693844">No permitir que ningún sitio haga un seguimiento de la ubicación física de los usuarios</translation>
-<translation id="1057535219415338480">Permite habilitar la predicción de red en <ph name="PRODUCT_NAME" /> y evita que los usuarios modifiquen esta configuración.
-
-      Esta opción permite controlar tanto la obtención previa de DNS como la conexión previa de SSL y TCP, así como la carga previa de páginas web. El nombre de la política hace referencia a la obtención previa de DNS por cuestiones históricas.
-
-      Al habilitar o inhabilitar esta opción, los usuarios no podrán cambiar ni anular esta configuración en <ph name="PRODUCT_NAME" />.
-
-      Si no se establece esta política, se habilitará pero el usuario podrá modificarla.</translation>
 <translation id="1062011392452772310">Habilitar confirmación remota para el dispositivo</translation>
 <translation id="1090892140761957285">URL para validar el token de autenticación del cliente de acceso remoto.
 
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb
index 6edf15d..3949ec6 100644
--- a/components/policy/resources/policy_templates_et.xtb
+++ b/components/policy/resources/policy_templates_et.xtb
@@ -22,13 +22,6 @@
       Kui väärtuseks on määratud Tõene või seda ei määrata, saadetakse statistikat.</translation>
 <translation id="1046484220783400299">Iganenud veebiplatvormi funktsioonide lubamine piiratud ajaks</translation>
 <translation id="1047128214168693844">Keela kõigil saitidel kasutajate füüsilise asukoha jälgimine</translation>
-<translation id="1057535219415338480">Lubab tootes <ph name="PRODUCT_NAME" /> võrguprognoosid ja keelab kasutajatel selle seade muutmise.
-
-      See ei juhi mitte ainult DNS-i eeltoomist, vaid ka veebilehtede TCP ja SSL-i eelühendamist ning eelrenderdust. See reegli nimi viitab ajaloolistel põhjustel DNS-i eeltoomisele.
-
-      Kui selle seade lubate või keelate, ei saa kasutajad seda seadet tootes <ph name="PRODUCT_NAME" /> muuta ega alistada.
-
-      Kui see reegel jäetakse määramata, on see lubatud, kuid kasutaja saab seda muuta.</translation>
 <translation id="1062011392452772310">Seadme kaugatesteerimise lubamine</translation>
 <translation id="1090892140761957285">URL kaugjuurdepääsu kliendi autentimismärgi valideerimiseks.
 
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb
index 31e8982..65026b22 100644
--- a/components/policy/resources/policy_templates_fa.xtb
+++ b/components/policy/resources/policy_templates_fa.xtb
@@ -18,13 +18,6 @@
       اگر روی درست تنظیم شود یا کلاً تنظیم نشود، آمار گزارش می‌شود.</translation>
 <translation id="1046484220783400299">فعال کردن ویژگی‌های منسوخ پلتفورم وب برای مدت زمان محدود</translation>
 <translation id="1047128214168693844">به هیچ سایتی اجازه ردیابی مکان فیزیکی کاربرها داده نشود</translation>
-<translation id="1057535219415338480">‏پیش‌بینی شبکه را در <ph name="PRODUCT_NAME" /> فعال می‌کند و مانع از تغییر این تنظیمات توسط کاربران می‌شود.
-
-این قانون نه تنها واکشی اولیه DNS بلکه پیش‌ارتباط و پیش‌اجرای TCP و SSL از صفحات وب را کنترل می‌کند. نام قانون به دلایل تاریخی اشاره به واکشی اولیه DNS دارد.
-
-اگر شما این تنظیمات را فعال یا غیرفعال کنید، کاربران نمی‌توانند این تنظیمات را در <ph name="PRODUCT_NAME" /> تغییر دهند یا لغو کنند.
-
-اگر این قانون تنظیم نشده باقی بماند، فعال خواهد شد اما کاربر قادر خواهد بود آن را تغییر دهد.</translation>
 <translation id="1062011392452772310">فعال کردن اعطای گواهی راه دور برای دستگاه</translation>
 <translation id="1090892140761957285">‏نشانی وب برای ارزیابی کد احراز هویت کلاینت دسترسی راه دور.
 
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb
index a88c8f6..6d10327 100644
--- a/components/policy/resources/policy_templates_fi.xtb
+++ b/components/policy/resources/policy_templates_fi.xtb
@@ -22,13 +22,6 @@
       Jos käytännön arvo on Tosi tai sitä ei aseteta, tiedot raportoidaan.</translation>
 <translation id="1046484220783400299">Ota käytöstä poistettuja verkkokäyttöympäristöjä takaisin käyttöön rajoitetuksi ajaksi</translation>
 <translation id="1047128214168693844">Älä anna minkään sivuston seurata käyttäjien fyysistä sijaintia</translation>
-<translation id="1057535219415338480">Ottaa verkon ennakoinnin käyttöön tuotteessa <ph name="PRODUCT_NAME" /> ja estää käyttäjiä muuttamasta asetusta.
-
-      Tämä säätelee DNS-esilatauksen lisäksi myös TCP- ja SSL-esiyhteyksiä ja verkkosivujen esihahmonnusta. Käytännön nimi viittaa DNS-esilataukseen historiallisista syistä.
-
-      Jos otat tämän asetuksen käyttöön tai poistat sen käytöstä, käyttäjät eivät voi muuttaa tai ohittaa asetusta tuotteessa <ph name="PRODUCT_NAME" />.
-
-      Jos käytäntöä ei ole määritetty, asetus otetaan käyttöön, mutta käyttäjät voivat vaihtaa sitä.</translation>
 <translation id="1062011392452772310">Salli etätodennus laitteelle</translation>
 <translation id="1090892140761957285">URL-osoite, jota käytetään etäkäytön asiakkaan todennustunnuksen vahvistamiseen.
 
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb
index 5e2a132..a0bb9fe30 100644
--- a/components/policy/resources/policy_templates_fil.xtb
+++ b/components/policy/resources/policy_templates_fil.xtb
@@ -22,13 +22,6 @@
       Kung itatakda sa true o hindi naitakda, iuulat ang mga istatistika.</translation>
 <translation id="1046484220783400299">I-enable ang mga hindi na ginagamit na feature ng web platform sa loob ng limitadong panahon</translation>
 <translation id="1047128214168693844">Huwag payagan ang anumang site na subaybayan ang aktwal na lokasyon ng mga user</translation>
-<translation id="1057535219415338480">Binibigyang-daan ang paghuhula ng network sa <ph name="PRODUCT_NAME" /> at pinipigilan ang mga user na baguhin ang setting na ito.
-
-      Kinokontrol nito hindi lang ang paunang pag-fetch ng DNS ngunit pati rin ang paunang pagkonekta at pag-render na TCP at SSL ng mga web page. Ang pangalan ng patakaran ay tumutukoy sa paunang pag-fetch ng DNS para sa mga makasaysayang dahilan.
-
-      Kung papaganahin mo o hindi mo papaganahin ang setting na ito, hindi mababago o ma-o-override ng mga user ang setting na ito sa <ph name="PRODUCT_NAME" />.
-
-      Kung hahayaang hindi nakatakda ang patakarang ito, papaganahin ito ngunit mababago ito ng user.</translation>
 <translation id="1062011392452772310">I-enable ang malayuang pagpapatotoo para sa device</translation>
 <translation id="1090892140761957285">URL para sa pagpapatunay ng token ng pagpapatotoo ng client ng malayuang access.
 
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index b30d8a9..34734eb 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -22,13 +22,6 @@
       Si cette règle est définie sur "True" ou si elle n'est pas configurée, les statistiques seront envoyées.</translation>
 <translation id="1046484220783400299">Activer les fonctionnalités obsolètes de la plate-forme Web pour une durée limitée</translation>
 <translation id="1047128214168693844">Interdire à tous les sites de suivre la position géographique des utilisateurs</translation>
-<translation id="1057535219415338480">Active la prédiction de réseau dans <ph name="PRODUCT_NAME" /> et empêche les utilisateurs de modifier ce paramètre.
-
-      Cela contrôle non seulement la prélecture des DNS, mais également la préconnexion et le préchargement TCP et SSL des pages Web. Le nom de la règle fait référence à la prélecture des DNS pour des raisons historiques.
-
-      Que vous activiez ou désactiviez ce paramètre, les utilisateurs ne peuvent pas le modifier ni le remplacer dans <ph name="PRODUCT_NAME" />.
-
-      Si vous ne définissez pas cette règle, ce paramètres est activé, mais les utilisateurs sont en mesure de le modifier.</translation>
 <translation id="1062011392452772310">Activer l'attestation à distance pour l'appareil</translation>
 <translation id="1090892140761957285">URL de validation du jeton d'authentification du client distant.
 
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb
index e3a7d3d..ef4cef7dd 100644
--- a/components/policy/resources/policy_templates_gu.xtb
+++ b/components/policy/resources/policy_templates_gu.xtb
@@ -23,13 +23,6 @@
       કરવામાં આવશે.</translation>
 <translation id="1046484220783400299">મર્યાદિત સમય માટે દૂર કરેલ વેબ પ્લેટફોર્મ સુવિધાઓને સક્ષમ કરો</translation>
 <translation id="1047128214168693844">કોઈપણ સાઇટને વપરાશકર્તાઓના ભૌતિક સ્થાનને ટ્રૅક કરવાની મંજૂરી આપશો નહીં</translation>
-<translation id="1057535219415338480"><ph name="PRODUCT_NAME" /> માં નેટવર્ક અનુમાનોને સક્ષમ કરે છે અને વપરાશકર્તાઓને આ સેટિંગ બદલવાથી અટકાવે છે.
-
-      આ ફક્ત DNS પૂર્વઆનયનને જ નહીં પરંતુ TCP અને SSL પ્રીકનેક્શન અને વેબ પૃષ્ઠોનું પ્રીરેન્ડરિંગ પણ નિયંત્રિત કરે છે. નીતિનું નામ ઐતિહાસિક કારણો માટેના DNS પૂર્વઆનયનનો સંદર્ભ આપે છે.
-
-      જો તમે આ સેટિંગને સક્ષમ અથવા અક્ષમ કરો છો, તો વપરાશકર્તાઓ <ph name="PRODUCT_NAME" />  આ સેટિંગને બદલી કે ઓવરરાઇડ કરી શકતા નથી.
-
-      જો આ નીતિ સેટ કર્યા વગર છોડી હોય, તો આ સક્ષમ થશે પણ વપરાશકર્તાઓ તેને બદલવા સક્ષમ હશે.</translation>
 <translation id="1062011392452772310">આ ઉપકરણ માટેના રિમોટ પ્રમાણનને સક્ષમ કરો</translation>
 <translation id="1090892140761957285">રિમોટ ઍક્સેસ ક્લાઇન્ટ પ્રમાણીકરણ ટોકનને માન્ય કરવા માટેનો URL.
 
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb
index cb63630..d669054 100644
--- a/components/policy/resources/policy_templates_hi.xtb
+++ b/components/policy/resources/policy_templates_hi.xtb
@@ -22,13 +22,6 @@
       यदि सत्य पर सेट किया जाता है या सेट किए बिना छोड़ दिया जाता है, तो आंकड़ों की रिपोर्ट की जाएगी.</translation>
 <translation id="1046484220783400299">बहिष्कृत प्लेटफ़ॉर्म सुविधाओं को सीमित समय के लिए सक्षम करें</translation>
 <translation id="1047128214168693844">उपयोगकर्ताओं के वास्तविक स्थान पर नज़र रखने के लिए किसी भी साइट को अनुमति न दें</translation>
-<translation id="1057535219415338480"><ph name="PRODUCT_NAME" /> में नेटवर्क पूर्वानुमान सक्षम करती है और उपयोगकर्ताओं को इस सेटिंग को बदलने से रोकती है.
-
-      यह न केवल DNS प्रीफ़ेचिंग नियंत्रित करती है, बल्कि यह वेब पृष्ठों के TCP और SSL प्रीकनेक्शन और प्रीरेंडर को भी नियं‍त्रित करती है. नीति नाम, ऐतिहासिक कारणों से DNS प्रीफ़ेचिंग से संबंधित है.
-
-      यदि आप इस सेटिंग को सक्षम या अक्षम करते हैं, तो उपयोगकर्ता <ph name="PRODUCT_NAME" /> में इस सेटिंग को बदल या ओवरराइड नहीं कर सकते.
-
-      यदि यह नीति सेट किए बिना ही छोड़ दी जाती है, तो यह सक्षम हो जाएगी लेकिन उपयोगकर्ता इसे बदल सकेंगे.</translation>
 <translation id="1062011392452772310">डिवाइस के लिए दूरस्थ अनुप्रमाणन सक्षम करें</translation>
 <translation id="1090892140761957285">दूरस्‍थ ऐक्‍सेस क्‍लाइंट प्रमाणीकरण टोकन सत्‍यापित करने वाला URL.
 
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb
index 6d2f0661..4c6805c 100644
--- a/components/policy/resources/policy_templates_hr.xtb
+++ b/components/policy/resources/policy_templates_hr.xtb
@@ -22,13 +22,6 @@
       Ako se postavi na "istinito" ili se ne postavi, izvješćivat će se o statističkim podacima.</translation>
 <translation id="1046484220783400299">Omogući zastarjele značajke web-platforme na ograničeno vrijeme</translation>
 <translation id="1047128214168693844">Ne dopuštaj web-lokacijama praćenje fizičke lokacije korisnika</translation>
-<translation id="1057535219415338480">Omogućuje predviđanje mreže na usluzi <ph name="PRODUCT_NAME" /> i sprječava korisnike da promijene ovu postavku.
-
-      Ovime se ne nadzire samo pretpreuzimanje DNS-a, već i TCP i SSL pretpovezivanje i pretprikaz web-stranica. Naziv pravila odnosi se na pretpreuzimanje DNS-a iz povijesnih razloga.
-
-      Ako omogućite ili onemogućite ovu postavku, korisnici je ne mogu na usluzi <ph name="PRODUCT_NAME" /> promijeniti niti nadjačati.
-
-      Ako ovo pravilo nije postavljeno, bit će omogućeno, no korisnik će ga moći promijeniti.</translation>
 <translation id="1062011392452772310">Omogući daljinsku ovjeru za uređaj</translation>
 <translation id="1090892140761957285">URL za potvrđivanje autentifikacijske oznake klijenta daljinskog pristupa.
 
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb
index 82967c5..6f06d9e 100644
--- a/components/policy/resources/policy_templates_hu.xtb
+++ b/components/policy/resources/policy_templates_hu.xtb
@@ -22,13 +22,6 @@
       Ha a házirend értéke igaz, vagy ha nincs beállítva, a böngésző jelenti a statisztikákat.</translation>
 <translation id="1046484220783400299">Elavult Web Platform-funkciók engedélyezése korlátozott ideig</translation>
 <translation id="1047128214168693844">Minden oldal számára tiltja a felhasználók fizikai helyének követését</translation>
-<translation id="1057535219415338480">Engedélyezi a hálózati várható kifejezést a(z) <ph name="PRODUCT_NAME" /> termékben, és megakadályozza, hogy a felhasználók módosítsák ezt a beállítást.
-
-      Ez nem csak a DNS-előtöltést vezérli, hanem az előzetes TCP- és SSL-kapcsolatokat, valamint a weboldalak előzetes megjelenítését is. A házirend neve történeti okok miatt a DNS-előtöltésre utal.
-
-      Ha be- vagy kikapcsolja ezt a beállítást a(z) <ph name="PRODUCT_NAME" /> termékben, a felhasználók nem módosíthatják vagy írhatják felül.
-
-      Ha nem állítja be, akkor be lesz kapcsolva, ám a felhasználók módosíthatják.</translation>
 <translation id="1062011392452772310">Az eszköz távoli tanúsításának engedélyezése</translation>
 <translation id="1090892140761957285">A távoli elérésű ügyfél hitelesítőtokenjének ellenőrzésére szolgáló URL.
 
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 1f92ccf..8c43055 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -22,13 +22,6 @@
       Jika disetel ke True atau tidak disetel, statistik akan dilaporkan.</translation>
 <translation id="1046484220783400299">Aktifkan fitur platform web usang untuk waktu yang terbatas</translation>
 <translation id="1047128214168693844">Jangan izinkan situs mana pun melacak lokasi fisik pengguna</translation>
-<translation id="1057535219415338480">Mengaktifkan prediksi jaringan dalam <ph name="PRODUCT_NAME" /> dan cegah pengguna agar tidak mengubah setelan ini.
-
-      Tindakan ini tidak hanya mengontrol pengambilan DNS, tetapi juga TCP dan SSL pra-koneksi dan prapenguraian laman web. Nama kebijakan mengacu pada pra-pengambilan DNS untuk alasan historis.
-
-      Jika Anda mengaktifkan atau menonaktifkan setelan ini, pengguna tidak dapat mengubah atau menggantikan setelan ini untuk <ph name="PRODUCT_NAME" />.
-
-      Jika kebijakan ini dibiarkan tidak disetel, maka akan tetap diaktifkan, namun pengguna dapat mengubahnya.</translation>
 <translation id="1062011392452772310">Mengaktifkan pengesahan jarak jauh untuk perangkat tersebut</translation>
 <translation id="1090892140761957285">URL untuk memvalidasi token autentikasi klien akses jarak jauh.
 
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index d722891..52eb8f25 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -22,13 +22,6 @@
       Se viene impostata su true o non viene impostata, le statistiche vengono segnalate.</translation>
 <translation id="1046484220783400299">Consente di attivare le funzioni della piattaforma web obsolete per un periodo di tempo limitato</translation>
 <translation id="1047128214168693844">Non consentire ad alcun sito di monitorare la posizione fisica degli utenti</translation>
-<translation id="1057535219415338480">Consente la previsione della rete in <ph name="PRODUCT_NAME" /> e impedisce agli utenti di modificare questa impostazione.
-
-      Controlla non solo il precaricamento DNS, ma anche la preconnessione TCP ed SSL e il prerendering delle pagine web. Il nome della norma si riferisce al precaricamento DNS per motivi storici.
-
-      Se attivi o disattivi questa impostazione, gli utenti non potranno modificare o ignorare questa impostazione in <ph name="PRODUCT_NAME" />.
-
-      Se questa norma non viene definita, l'impostazione verrà attivata ma l'utente sarà in grado di modificarla.</translation>
 <translation id="1062011392452772310">Attivazione dell'attestazione da remoto per il dispositivo</translation>
 <translation id="1090892140761957285">URL per la convalida del token di autenticazione del client di accesso remoto.
 
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb
index cb66e6d..6fe2bae 100644
--- a/components/policy/resources/policy_templates_iw.xtb
+++ b/components/policy/resources/policy_templates_iw.xtb
@@ -21,13 +21,6 @@
 אם המדיניות מוגדרת כ-false, לא יתבצע דיווח סטטיסטיקה. אם היא מוגדרת כ-true או שאינה מוגדרת כלל, יתבצע דיווח סטטיסטיקה.</translation>
 <translation id="1046484220783400299">הפעל לזמן מוגבל תכונות פלטפורמת אינטרנט שהוצאו משימוש</translation>
 <translation id="1047128214168693844">אל תאפשר לאף אתר לעקוב אחר המיקום הפיזי של המשתמשים</translation>
-<translation id="1057535219415338480">‏מדיניות זו מאפשרת תחזית רשת ב-<ph name="PRODUCT_NAME" /> ומונעת מהמשתמשים לשנות הגדרה זו.
-
-      מדיניות זו שולטת לא רק בהבאה מראש של DNS אלא גם בחיבור מראש של TCP ו-SSL ובעיבוד מראש של דפי אינטרנט. שם המדיניות מתייחס להבאה מראש של DNS מסיבות היסטוריות.
-
-      אם תפעיל או תשבית הגדרה זו, המשתמשים לא יוכלו לשנות או לעקוף אותה ב-<ph name="PRODUCT_NAME" />.
-
-      אם לא תגדיר מדיניות זו כלל, היא תופעל, אך המשתמשים יוכלו לשנות אותה.</translation>
 <translation id="1062011392452772310">אפשר הזדהות מרחוק עבור המכשיר</translation>
 <translation id="1090892140761957285">‏כתובת האתר לאימות אסימון אימות של לקוח גישה מרחוק.
 
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index 2706fbf..77f4ef0 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -22,13 +22,6 @@
       true に設定した場合や未設定の場合、統計情報は報告されます。</translation>
 <translation id="1046484220783400299">サポートが終了しているウェブ プラットフォームの機能を一定の期間有効にする</translation>
 <translation id="1047128214168693844">すべてのサイトに対してユーザーの物理的な現在地の追跡を許可しない</translation>
-<translation id="1057535219415338480"><ph name="PRODUCT_NAME" /> でネットワーク予測を有効にして、ユーザーがこの設定を変更できないようにします。
-
-      これにより、DNS のプリフェッチだけでなく TCP と SSL の事前接続、ウェブページの事前レンダリングも制御されます。ポリシー名は DNS のプリフェッチを指していますが、これは慣例によるものです。
-
-      この設定を有効または無効にすると、ユーザーは <ph name="PRODUCT_NAME" /> でこの設定の変更やオーバーライドができなくなります。
-
-      このポリシーが未設定の場合、DNS のプリフェッチなどの設定は有効になりますが、ユーザーはこの設定を変更できます。</translation>
 <translation id="1062011392452772310">デバイスのリモート認証を有効にする</translation>
 <translation id="1090892140761957285">リモート アクセス クライアントの認証トークンを検証するための URL。
 
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb
index 351e501..e772766 100644
--- a/components/policy/resources/policy_templates_kn.xtb
+++ b/components/policy/resources/policy_templates_kn.xtb
@@ -22,13 +22,6 @@
       ಸರಿ ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸಿದರೆ ಅಥವಾ ಹೊಂದಿಸದೇ ಹಾಗೇ ಬಿಟ್ಟರೆ, ಅಂಕಿಅಂಶಗಳನ್ನು ವರದಿ ಮಾಡಲಾಗುತ್ತದೆ.</translation>
 <translation id="1046484220783400299">ಸೀಮಿತ ಸಮಯಕ್ಕೆ ಅಸಮ್ಮತಿಗೊಂಡ ವೆಬ್‌ ವೇದಿಕೆ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="1047128214168693844">ಬಳಕೆದಾರರ ಭೌತಿಕ ಸ್ಥಾನವನ್ನು ಹುಡುಕಲು ಯಾವ ಸೈಟ್‌ಗೂ ಅನುಮತಿಸಬೇಡಿ</translation>
-<translation id="1057535219415338480"><ph name="PRODUCT_NAME" /> ನಲ್ಲಿ ನೆಟ್‌ವರ್ಕ್ ಮುನ್ಸೂಚನೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಈ ಸೆಟ್ಟಿಂಗ್ ಬಳಕೆದಾರರು ಬದಲಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ.
-
-      ಇದು ಕೇವಲ DNS ಮುಂಚಿತವಾಗಿ ಪಡೆಯುವುದನ್ನು ಮಾತ್ರ ನಿಯಂತ್ರಿಸುವುದಲ್ಲದೆ ವೆಬ್ ಪುಟಗಳ TCP ಮತ್ತು SSL ಪೂರ್ವಸಂಪರ್ಕ ಮತ್ತು ಮುಂಚಿತವಾಗಿ ಸಲ್ಲಿಸುವುದನ್ನು ನಿಯಂತ್ರಿಸುತ್ತದೆ. ನೀತಿಯ ಹೆಸರು ಐತಿಹಾಸಿಕ ಕಾರಣಗಳಿಗಾಗಿ DNS ಮುಂಚಿತವಾಗಿ ಪಡೆಯುವುದನ್ನು ಉಲ್ಲೇಖಿಸುತ್ತದೆ.
-
-      ನೀವು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯ ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದಲ್ಲಿ, ಬಳಕೆದಾರರು <ph name="PRODUCT_NAME" /> ರಲ್ಲಿ ಸೆಟ್ಟಿಂಗ್ ಬದಲಾಯಿಸಲು ಅಥವಾ ಅತಿಕ್ರಮಿಸಲಾಗುವುದಿಲ್ಲ.
-
-      ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೆ ಬಿಟ್ಟರೆ, ಇದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ ಆದರೆ ಬಳಕೆದಾರರಿಗೆ ಅದನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ.</translation>
 <translation id="1062011392452772310">ಸಾಧನಕ್ಕಾಗಿ ರಿಮೋಟ್ ದೃಢೀಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="1090892140761957285">ರಿಮೋಟ್ ಪ್ರವೇಶ ಕ್ಲೈಂಟ್ ಪ್ರಮಾಣೀಕರಣ ಟೋಕನ್ ಮೌಲ್ಯೀಕರಿಸಲು URL.
 
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index 4054473..6ef86e1 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -22,13 +22,6 @@
       true로 설정되거나 설정되지 않으면 통계가 보고됩니다.</translation>
 <translation id="1046484220783400299">사용 중지된 웹 플랫폼 기능을 제한된 기간 동안 사용 설정</translation>
 <translation id="1047128214168693844">모든 사이트에서 사용자 실제 위치를 추적하도록 허용 안함</translation>
-<translation id="1057535219415338480"><ph name="PRODUCT_NAME" />에서 네트워크 예측을 사용하도록 설정하고 사용자가 해당 설정을 변경하지 못하게 합니다.
-
-      이는 DNS 미리 가져오기 뿐 아니라 웹 페이지의 TCP 및 SSL 사전 연결과 사전 렌더링을 제어합니다. 정책 이름은 여러 가지 이유로 인해 DNS 미리 가져오기가 사용되었습니다.
-
-      이 설정을 사용하도록 설정하거나 사용 중지하는 경우 사용자가 <ph name="PRODUCT_NAME" />에서 해당 설정을 변경하거나 재정의할 수 없습니다.
-
-      이 정책을 설정하지 않는 경우 해당 정책이 사용 설정되지만 사용자가 변경할 수 있습니다.</translation>
 <translation id="1062011392452772310">기기에 대한 원격 인증을 사용합니다.</translation>
 <translation id="1090892140761957285">원격 액세스 클라이언트 인증 토큰의 인증과 관련된 URL입니다.
 
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb
index 5adcd05f..8502c8db 100644
--- a/components/policy/resources/policy_templates_lt.xtb
+++ b/components/policy/resources/policy_templates_lt.xtb
@@ -22,13 +22,6 @@
       Jei ji nustatyta į „true“ arba yra nenustatyta, statistikos ataskaitos bus teikiamos.</translation>
 <translation id="1046484220783400299">Laikinai įgalinti nebenaudojamas žiniatinklio platformos funkcijas</translation>
 <translation id="1047128214168693844">Neleisti jokioje svetainėje stebėti naudotojo buvimo vietos</translation>
-<translation id="1057535219415338480">Įgalinamas tinklo numatymas „<ph name="PRODUCT_NAME" />“ ir naudotojams neleidžiama keisti šio nustatymo.
-
-      Pagal šią politiką valdomas ne tik išankstinis DNS pateikimas, bet ir išankstinis TCP ir SSL ryšys bei tinklalapių pateikimas. Politikos pavadinime išankstinis DNS pateikimas įtrauktas dėl ankstesnių priežasčių.
-
-      Jei įgalinsite ar išjungsite šį nustatymą, „<ph name="PRODUCT_NAME" />“ naudotojai negalės jo pakeisti ar nepaisyti.
-
-      Jei ši politika nenustatoma, ji bus įgalinta, bet naudotojas galės tai pakeisti.</translation>
 <translation id="1062011392452772310">Įgalinti nuotolinį įrenginio patvirtinimą</translation>
 <translation id="1090892140761957285">URL, skirtas nuotolinio prisijungimo kliento autentifikavimo prieigos raktui patvirtinti.
 
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb
index 8017434..ab6dd31 100644
--- a/components/policy/resources/policy_templates_lv.xtb
+++ b/components/policy/resources/policy_templates_lv.xtb
@@ -22,13 +22,6 @@
       Ja politikai ir iestatīta vērtība Patiesa vai nav iestatījuma, statistika tiks ziņota.</translation>
 <translation id="1046484220783400299">Iespējot novecojušu tīmekļa platformu funkcijas uz ierobežotu laiku</translation>
 <translation id="1047128214168693844">Neatļaut nevienai vietnei izsekot lietotāju fizisko atrašanās vietu</translation>
-<translation id="1057535219415338480">Pārlūkprogrammā <ph name="PRODUCT_NAME" /> tiek iespējota tīkla paredzēšana, un lietotājiem tiek liegta iespēja mainīt šo iestatījumu.
-
-      Šī politika nodrošina ne tikai DNS pirmsielādes, bet arī TCP un SSL iepriekšējas savienojuma izveides un tīmekļa lapu iepriekšējas atveidošanas vadību. Politikas nosaukuma saistībai ar DNS pirmsielādi ir vēsturisks iemesls.
-
-      Ja šis iestatījums tiek iespējots vai atspējots, lietotāji pārlūkprogrammā <ph name="PRODUCT_NAME" /> to nevar mainīt vai ignorēt.
-
-      Ja šī politika nav iestatīta, šis iestatījums tiek iespējots, taču lietotājs to var mainīt.</translation>
 <translation id="1062011392452772310">Iespējot ierīces attālu apstiprināšanu</translation>
 <translation id="1090892140761957285">Vietrādis URL attālās piekļuves klienta autentifikācijas pilnvaras apstiprināšanai.
 
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb
index 63f5ee65..b7624d4c 100644
--- a/components/policy/resources/policy_templates_ml.xtb
+++ b/components/policy/resources/policy_templates_ml.xtb
@@ -22,13 +22,6 @@
       "true" എന്ന് സജ്ജീകരിച്ചിരിക്കുന്നെങ്കിലോ സജ്ജീകരിക്കാതെ വിടുകയാണെങ്കിലോ സ്ഥിതിവിവരക്കണക്ക് റിപ്പോർട്ടുചെയ്യും.</translation>
 <translation id="1046484220783400299">ഒഴിവാക്കിയ വെബ് പ്ലാറ്റ്ഫോം സവിശേഷതകൾ ഒരു നിശ്ചിത സമയത്തേയ്ക്ക് പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="1047128214168693844">ഉപയോക്താക്കളുടെ ഭൌതിക സ്ഥാനം ട്രാക്കുചെയ്യുന്നതിന് ഒരു സൈറ്റിനെയും അനുവദിക്കരുത്</translation>
-<translation id="1057535219415338480"><ph name="PRODUCT_NAME" /> എന്നതിൽ നെറ്റ്‌വർക്ക് പ്രവചനങ്ങൾ പ്രാപ്‌തമാക്കുകയും ഈ ക്രമീകരണങ്ങൾ മാറ്റുന്നതിൽ നിന്നും ഉപയോക്താക്കളെ തടയുകയും ചെയ്യുക.
-      
-      ഇത് DNS പ്രീഫെച്ചിംഗിനെ മാത്രമല്ല, വെബ് പേജിന്റെ TCP, SSL പ്രീകണക്ഷനേയും പ്രീറെൻഡറിംഗിനേയും നിയന്ത്രിക്കുന്നു. നയത്തിന്റെ പേര് ചരിത്രപരമായ കാരണങ്ങൾക്കായുള്ള DNS പ്രീഫെച്ചിംഗിനെ റഫർ ചെയ്യുന്നു.
-
-      നിങ്ങൾ ഈ ക്രമീകരണം പ്രാപ്‌തമാക്കുകയോ അപ്രാപ്‌തമാക്കുകയോ ചെയ്യുകയാണെങ്കിൽ, ഉപയോക്താക്കൾക്ക് ഈ ക്രമീകരണം <ph name="PRODUCT_NAME" />-ൽ മാറ്റം വരുത്താനോ അസാധുവാക്കാനോ കഴിയില്ല.
-
-      ഈ നയം സജ്ജമാക്കാത്ത നിലയിലാണെങ്കിൽ, ഇത് പ്രാപ്‌തമാകുമെങ്കിലും ഉപയോക്താക്കൾക്ക് മാറ്റം വരുത്തുവാനാകും.</translation>
 <translation id="1062011392452772310">ഉപകരണത്തിനായി വിദൂര അറ്റസ്റ്റേഷൻ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="1090892140761957285">റിമോട്ട് ആക്‌സസ്സ് ക്ലയന്റ് പ്രാമാണീകരണ ടോക്കൺ നിർണ്ണയിക്കുന്നതിനുള്ള URL.
 
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb
index 73379a0..a5286b6 100644
--- a/components/policy/resources/policy_templates_mr.xtb
+++ b/components/policy/resources/policy_templates_mr.xtb
@@ -22,13 +22,6 @@
       सत्य वर सेट केल्‍यास किंवा सेट न केलेले ठेवल्‍यास, आकडेवारीचा अहवाल दिला जाईल.</translation>
 <translation id="1046484220783400299">मर्यादित वेळेसाठी नापसंत वेब प्लॅटफॉर्म वैशिष्ट्ये सक्षम करा</translation>
 <translation id="1047128214168693844">वापरकर्त्यांचे प्रत्यक्ष स्थान ट्रॅक करण्यास कोणत्याही साइटला परवानगी देऊ नका</translation>
-<translation id="1057535219415338480"><ph name="PRODUCT_NAME" /> मध्ये नेटवर्क पूर्वानुमान सक्षम करते आणि ही सेटिंग बदलण्यापासून वापरकर्त्यांना प्रतिबंधित करते.
-
-      ही नियंत्रणे केवळ DNS पूर्वप्राप्तीवरच नाही तर TCP आणि SSL पूर्वकनेक्शन आणि वेब पृष्ठे पूर्वप्रस्तुती देखील नियंत्रित करते. धोरण नाव ऐतिहासिक कारणांसाठी DNS पूर्वप्राप्तीचा संदर्भ घेते
-
-      आपण हे सेटिंग सक्षम किंवा अक्षम केल्यास,वापरकर्ते <ph name="PRODUCT_NAME" /> मध्ये ही सेटिंग बदलू किंवा अधिलिखित करू शकत नाहीत.
-
-      हे धोरण सेट न करता सोडल्यास, हे सक्षम होईल परंतु ते बदलण्यात वापरकर्ता सक्षम होईल.</translation>
 <translation id="1062011392452772310">डिव्हाइससाठी दूरस्थ अनुप्रमाणन सक्षम करा</translation>
 <translation id="1090892140761957285">दूरस्‍थ प्रवेश क्लायंट प्रमाणीकरण टोकनसाठी सत्यापित करण्यासाठी URL.
           हे धोरण सेट केले असल्यास, दूरस्थ प्रवेश होस्ट कनेक्शनचा स्वीकार करण्यासाठी दूरस्थ प्रवेश क्लायंटवरून प्रमाणीकरण टोकन सत्यापित करण्यासाठी या URL चा वापर करेल. RemoteAccessHostTokenUrl सह वापरणे आवश्यक आहे.
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb
index 4e47aa0..43f76225 100644
--- a/components/policy/resources/policy_templates_ms.xtb
+++ b/components/policy/resources/policy_templates_ms.xtb
@@ -22,13 +22,6 @@
       Jika ditetapkan kepada benar atau dibiarkan tanpa ditetapkan, statistik akan dilaporkan.</translation>
 <translation id="1046484220783400299">Dayakan ciri platform web untuk masa yang terhad</translation>
 <translation id="1047128214168693844">Jangan benarkan mana-mana tapak untuk menjejak lokasi fizikal pengguna</translation>
-<translation id="1057535219415338480">Mendayakan ramalan rangkaian dalam <ph name="PRODUCT_NAME" /> dan menghalang pengguna daripada mengubah tetapan ini.
-
-      Dasar ini bukan sahaja mengawal pra-pengambilan DNS tetapi juga pra-penyambungan TCP dan SSL serta pra-pemaparan halaman web. Nama dasar ini merujuk kepada pra-pengambilan DNS atas sebab-sebab sejarah.
-
-      Jika anda mendayakan atau melumpuhkan tetapan ini, pengguna tidak boleh mengubah atau menggantikan tetapan ini dalam <ph name="PRODUCT_NAME" />.
-
-      Jika dasar ini dibiarkan tanpa ditetapkan, dasar ini akan akan didayakan tetapi pengguna akan boleh mengubahnya.</translation>
 <translation id="1062011392452772310">Dayakan pembuktian jauh untuk peranti</translation>
 <translation id="1090892140761957285">URL untuk mengesahkan token pengesahan pelanggan akses jauh.
 
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index 529df37..f8c03f89 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -22,13 +22,6 @@
       Als het beleid is ingesteld op 'waar', worden de statistieken gemeld.</translation>
 <translation id="1046484220783400299">Verouderde webplatformfuncties beperkte tijd inschakelen</translation>
 <translation id="1047128214168693844">Niet toestaan dat sites de fysieke locatie van gebruikers bijhouden</translation>
-<translation id="1057535219415338480">Hiermee wordt netwerkvoorspelling in <ph name="PRODUCT_NAME" /> ingeschakeld en wordt voorkomen dat gebruikers deze instelling kunnen wijzigen.
-
-      Hiermee wordt niet alleen DNS-prefetching beheerd, maar ook het vooraf verbinden met TCP en SSL en het vooraf renderen van webpagina's. De beleidsnaam verwijst naar DNS-prefetching vanwege historische redenen.
-
-      Als je deze instelling in- of uitschakelt, kunnen gebruikers deze instelling niet wijzigen of overschrijven in <ph name="PRODUCT_NAME" />.
-
-      Als dit beleid niet wordt ingesteld, wordt het automatisch ingeschakeld, maar de gebruiker kan het wijzigen.</translation>
 <translation id="1062011392452772310">Externe bevestiging van apparaat inschakelen</translation>
 <translation id="1090892140761957285">URL voor het valideren van verificatietoken voor client voor externe toegang.
 
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb
index a434b446..f010827 100644
--- a/components/policy/resources/policy_templates_no.xtb
+++ b/components/policy/resources/policy_templates_no.xtb
@@ -22,12 +22,6 @@
       Hvis den settes til «true» (sann) eller ikke angis, rapporteres statistikken.</translation>
 <translation id="1046484220783400299">Slå på avviklede nettplattformfunksjoner for en begrenset periode</translation>
 <translation id="1047128214168693844">Ikke la noen nettsteder spore brukernes fysiske plassering</translation>
-<translation id="1057535219415338480">Slår på nettverksforutsigelse i <ph name="PRODUCT_NAME" /> og hindrer brukerne i å endre denne innstillingen.
-
-      Dette kontrollerer både DNS-forhåndshenting og TCP- samt SSl-forhåndstilkobling og forhåndsgjengivelse av nettsteder. Navnet på retningslinjene viser til DNS-forhåndshenting av historiske grunner.
-      Hvis du slår denne innstillingen på eller av, kan ikke brukerne endre eller overstyre den i <ph name="PRODUCT_NAME" />.
-
-      Hvis denne regelen ikke angis, kommer den til å være på, men brukeren kan velge å slå den av.</translation>
 <translation id="1062011392452772310">Slå på ekstern attestasjon for enheten</translation>
 <translation id="1090892140761957285">Nettadressen for validering av autentiseringstokenet til fjerntilgangsklienten.
 
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb
index 4dd40f8..6627cb54 100644
--- a/components/policy/resources/policy_templates_pl.xtb
+++ b/components/policy/resources/policy_templates_pl.xtb
@@ -22,13 +22,6 @@
       Jeśli jest włączona lub nieustawiona, statystyki będą raportowane.</translation>
 <translation id="1046484220783400299">Włącz wycofane funkcje platform internetowych na określony czas</translation>
 <translation id="1047128214168693844">Nie zezwalaj żadnej witrynie na śledzenie fizycznej lokalizacji użytkownika</translation>
-<translation id="1057535219415338480">Włącza przewidywanie działań sieciowych w <ph name="PRODUCT_NAME" /> i uniemożliwia użytkownikom zmianę tego ustawienia.
-
-      Ta zasada steruje nie tylko wstępnym pobieraniem DNS, ale też wstępnym łączeniem przez TCP i SSL oraz wstępnym renderowaniem. Nazwa zasady wiąże się ze wstępnym pobieraniem DNS z przyczyn historycznych.
-
-      Jeśli włączysz lub wyłączysz tę zasadę, użytkownicy nie będą mogli zmienić ani nadpisać tego ustawienia w <ph name="PRODUCT_NAME" />.
-
-      Jeśli ta zasada pozostanie nieustawiona, ustawienie zostanie włączone, ale użytkownicy będą mogli je zmienić.</translation>
 <translation id="1062011392452772310">Włącz zaświadczanie zdalne dla urządzenia</translation>
 <translation id="1090892140761957285">URL do weryfikowania tokena uwierzytelniania klienta dostępu zdalnego.
 
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index d0c3d8a1..46b2232 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -22,13 +22,6 @@
       Se for definida como "true" ou não for configurada, as estatísticas serão informadas.</translation>
 <translation id="1046484220783400299">Ativar por um tempo limitado recursos da plataforma Web cujo uso esteja suspenso</translation>
 <translation id="1047128214168693844">Não permitir que nenhum site rastreie a localização física dos usuários</translation>
-<translation id="1057535219415338480">Ativa as sugestões de rede no <ph name="PRODUCT_NAME" /> e impede que os usuários alterem essa configuração.
-
-      Controla não apenas a pré-busca de DNS, mas também a pré-conexão de SSL e o pré-processamento de páginas da Web. O nome da política se refere apenas à pré-busca de DNS por razões históricas.
-
-      Se você ativar ou desativar essa configuração, os usuários não poderão alterá-la ou substituí-la no <ph name="PRODUCT_NAME" />.
-
-      Se essa política não for definida, ela ficará ativada, e o usuário poderá alterá-la.</translation>
 <translation id="1062011392452772310">Ativar declaração remota para o dispositivo</translation>
 <translation id="1090892140761957285">URL para validação do token de autenticação de cliente de acesso remoto.
 
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb
index e298f159..c159631f 100644
--- a/components/policy/resources/policy_templates_pt-PT.xtb
+++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -22,13 +22,6 @@
       Se estiver definida como verdadeira ou não for definida, as estatísticas são comunicadas.</translation>
 <translation id="1046484220783400299">Ativar funcionalidades das plataformas Web desatualizadas por um tempo limitado</translation>
 <translation id="1047128214168693844">Não permitir que os site registem a localização física dos utilizadores</translation>
-<translation id="1057535219415338480">Ativa a previsão da rede no <ph name="PRODUCT_NAME" /> e impede que os utilizadores alterem esta definição.
-
-      Controla não só a obtenção prévia de DNS, mas também a ligação e a composição prévia TCP e SSL de páginas Web. Por razões históricas, o nome da política refere-se à obtenção prévia de DNS.
-
-      Se ativar ou desativar esta definição, os utilizadores não podem alterá-la nem substituí-la no <ph name="PRODUCT_NAME" />.
-
-      Se esta política permanecer por definir, será ativada, mas o utilizador será capaz de a alterar.</translation>
 <translation id="1062011392452772310">Ativar a comprovação remota para o dispositivo</translation>
 <translation id="1090892140761957285">URL para validar o símbolo de autenticação de cliente de acesso remoto.
 
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb
index fdea796..56a060d 100644
--- a/components/policy/resources/policy_templates_ro.xtb
+++ b/components/policy/resources/policy_templates_ro.xtb
@@ -22,13 +22,6 @@
       Dacă politica este activată sau nu este configurată, statisticile vor fi raportate.</translation>
 <translation id="1046484220783400299">Activează funcții învechite ale platformei web pentru o perioadă limitată</translation>
 <translation id="1047128214168693844">Nu permite niciunui site să urmărească locația fizică a utilizatorilor</translation>
-<translation id="1057535219415338480">Activează predicția rețelei în <ph name="PRODUCT_NAME" /> și împiedică modificarea acestei setări de către utilizatori.
-
-      Aceasta controlează atât preluarea anticipată a datelor DNS, cât și conectarea anticipată TCP și SSL și încărcarea anticipată a paginilor web. Numele politicii se referă la preluarea anticipată a datelor DNS din motive de consecvență.
-
-      Dacă activați sau dezactivați această setare, utilizatorii nu o pot modifica sau anula în <ph name="PRODUCT_NAME" />.
-
-      Dacă această politică nu este setată, această setare va fi activată, dar utilizatorul va putea să o schimbe.</translation>
 <translation id="1062011392452772310">Activați atestarea la distanță pentru dispozitiv</translation>
 <translation id="1090892140761957285">Adresă URL pentru validarea indicativului de autentificare a clientului cu acces la distanță.
 
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 4c859c6d..5125ed7 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -22,13 +22,6 @@
       Если правило включено (значение True), статистика будет показываться.</translation>
 <translation id="1046484220783400299">Включить устаревшие функции веб-платформы на ограниченное время</translation>
 <translation id="1047128214168693844">Запретить сайтам отслеживать местоположение пользователей</translation>
-<translation id="1057535219415338480">Включает предварительное определение сети в <ph name="PRODUCT_NAME" /> и запрещает пользователям менять эту настройку.
-
-      Это позволяет контролировать не только упреждающее чтение DNS, но и упреждающее подключение по протоколам TCP и SSL, а также предварительную визуализацию веб-страниц. Исторически сложилось, что в названии правила упоминается только одна из этих функций.
-
-      Если эта настройка была включена или выключена, никто кроме вас не сможет изменить ее в <ph name="PRODUCT_NAME" />.
-
-      Если не настраивать это правило, предварительное определение сети будет включено, но у пользователей будет возможность выключить его.</translation>
 <translation id="1062011392452772310">Включает удаленную проверку устройства</translation>
 <translation id="1090892140761957285">Позволяет задать URL для проверки токена аутентификации, принадлежащего клиенту удаленного доступа.
 
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb
index bb9fa34..53d6ec5 100644
--- a/components/policy/resources/policy_templates_sk.xtb
+++ b/components/policy/resources/policy_templates_sk.xtb
@@ -21,13 +21,6 @@
       Ak je nastavené na možnosť True alebo nie je nastavené, štatistiky budú hlásené.</translation>
 <translation id="1046484220783400299">Povoliť zastarané funkcie webovej platformy na obmedzený čas</translation>
 <translation id="1047128214168693844">Nepovoliť žiadnym stránkam sledovať fyzickú polohu používateľov</translation>
-<translation id="1057535219415338480">Povolí predvídanie siete v prehliadači <ph name="PRODUCT_NAME" /> a zabráni používateľom toto nastavenie zmeniť.
-
-      Toto pravidlo ovláda spoločne s predbežným načítaním servera DNS aj predbežné pripojenie pomocou protokolu TCP a technológie SSL a predbežné vykreslenie webových stránok. Názov pravidla je založený na predbežnom načítaní servera DNS z historických dôvodov.
-
-      Ak toto nastavenie povolíte alebo zakážete, používatelia ho v prehliadači <ph name="PRODUCT_NAME" /> nebudú môcť prepísať.
-
-      Ak toto pravidlo ponecháte nenastavené, nastavenie bude povolené, ale používateľ ho bude môcť zmeniť.</translation>
 <translation id="1062011392452772310">Povoliť pre zariadenie vzdialené overenie</translation>
 <translation id="1090892140761957285">Webová adresa na potvrdenie tokenu na overenie totožnosti klienta vzdialeného prístupu.
 
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb
index cace885..3025c5b 100644
--- a/components/policy/resources/policy_templates_sl.xtb
+++ b/components/policy/resources/policy_templates_sl.xtb
@@ -22,13 +22,6 @@
       Če je pravilnik omogočen ali ni nastavljen, se statistični podatki poročajo.</translation>
 <translation id="1046484220783400299">Začasno omogočanje zastarelih funkcij spletnega okolja</translation>
 <translation id="1047128214168693844">Nobenemu mestu ne dovoli spremljanja fizične lokacije uporabnika</translation>
-<translation id="1057535219415338480">Omogoča omrežno predvidevanje v brskalniku <ph name="PRODUCT_NAME" /> in preprečuje uporabnikom spreminjanje te nastavitve.
-
-      Ta pravilnik ne nadzira le vnaprejšnjega prenosa podatkov DNS, ampak tudi vnaprejšnje povezovanje TCP in SSL ter vnaprejšnje upodabljanje spletnih strani. Ime pravilnika se nanaša na vnaprejšnji prenos podatkov DNS iz zgodovinskih razlogov.
-
-       Če to nastavitev omogočite ali onemogočite, je uporabniki v brskalniku <ph name="PRODUCT_NAME" /> ne morejo spremeniti ali preglasiti.
-
-       Če ta pravilnik ni nastavljen, bo to omogočeno, vendar bo lahko uporabnik to spremenil.</translation>
 <translation id="1062011392452772310">Omogoči oddaljeno potrditev naprave</translation>
 <translation id="1090892140761957285">URL za preverjanje žetona za preverjanje pristnosti odjemalca za oddaljeni dostop.
 
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb
index a6adde7f..5bd0602 100644
--- a/components/policy/resources/policy_templates_sr.xtb
+++ b/components/policy/resources/policy_templates_sr.xtb
@@ -22,13 +22,6 @@
       Ако их подесите на Тачно или их не подесите, статистика ће да се шаље.</translation>
 <translation id="1046484220783400299">Омогући застареле функције веб-платформи на ограничено време</translation>
 <translation id="1047128214168693844">Не дозволи ниједном сајту да прати корисникову физичку локацију</translation>
-<translation id="1057535219415338480">Омогућава предвиђање мреже у <ph name="PRODUCT_NAME" />-у и спречава кориснике да мењају ово подешавање.
-
-      То контролише не само DNS предучитавање, већ и TCP и SSL повезивање унапред и приказивање веб-страница унапред. Назив смерница се односи на DNS предучитавање због ранијих верзија смерница.
-
-      Ако омогућите или онемогућите ово подешавање, корисници не могу да га промене или замене у <ph name="PRODUCT_NAME" />-у.
-
-      Ако ове смернице нису подешене, ово подешавање ће бити омогућено, али ће корисник моћи да га промени.</translation>
 <translation id="1062011392452772310">Омогућавање даљинске потврде за уређај</translation>
 <translation id="1090892140761957285">URL за проверу токена за потврду аутентичности клијента са даљинским приступом.
 
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb
index 266229e7..6eb0a6c1 100644
--- a/components/policy/resources/policy_templates_sv.xtb
+++ b/components/policy/resources/policy_templates_sv.xtb
@@ -22,13 +22,6 @@
       Om den är inställd på sant eller inte har angetts rapporteras statistik.</translation>
 <translation id="1046484220783400299">Aktivera föråldrade webbplattformsfunktioner under en begränsad tid</translation>
 <translation id="1047128214168693844">Tillåt inte att någon webbplats spårar användarnas fysiska plats</translation>
-<translation id="1057535219415338480">Aktiverar nätverksförutsägelse i <ph name="PRODUCT_NAME" /> och förhindrar att användarna ändrar inställningen.
-
-      Detta styr inte bara DNS-förhämtning utan också TCP- och SSL-föranslutning och förrendering av webbsidor. Policyns namn refererar till DNS-förhämtning av historiska skäl.
-
-      Om du aktiverar eller inaktiverar den här inställningen kan användarna inte ändra eller åsidosätta den i <ph name="PRODUCT_NAME" />.
-
-      Om policyn inte ställs in är funktionen aktiverad, men den kan ändras av användarna.</translation>
 <translation id="1062011392452772310">Aktivera fjärrattestering för enheten</translation>
 <translation id="1090892140761957285">Webbadress för att validera autentiseringstoken för fjärråtkomstklient.
 
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb
index 5a55224..1a55f1dfc 100644
--- a/components/policy/resources/policy_templates_sw.xtb
+++ b/components/policy/resources/policy_templates_sw.xtb
@@ -22,13 +22,6 @@
      Ikiwekwa kuwa sivyo au iachwe bila kuwekwa, takwimu zitaripotiwa.</translation>
 <translation id="1046484220783400299">Washa vipengele vilivyoacha kuendesha huduma vya mbinu ya wavuti kwa muda mfupi</translation>
 <translation id="1047128214168693844">Hairuhusu tovuti yoyote kufuatilia eneo halisi la mtumiaji</translation>
-<translation id="1057535219415338480">Inawezesha ubashiri wa mtandao kwenye <ph name="PRODUCT_NAME" /> na kuzuia watumiaji kubadilisha mpangilio huu.
-
-      Hii haidhibiti tu uletaji awali wa DNL lakini pia unganishaji awali na uonyeshaji awali wa kurasa za wavuti za TCP na SSL. Jina la sera linarejelea uletaji awali wa DNS kwa sababu za kihistoria.
-
-      Ukiwezesha au kulemaza mpangilio huu, watumiaji hawawezi kubadilisha au kufuta mpangilio huu kwenye <ph name="PRODUCT_NAME" />.
-
-      Iwapo sera hii itasalia kama haijawekwa, hii itawezeshwa lakini mtumiaji ataweza kuibadilisha.</translation>
 <translation id="1062011392452772310">Washa usahihishaji wa mbali wa kifaa</translation>
 <translation id="1090892140761957285">URL ya kuidhinisha tokeni ya uthibitishaji wa seva teja ya uwezo wa kufikia kwa mbali.
 
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb
index 11ad6788..fd1ea7c 100644
--- a/components/policy/resources/policy_templates_ta.xtb
+++ b/components/policy/resources/policy_templates_ta.xtb
@@ -22,13 +22,6 @@
       true என அமைக்கப்பட்டாலோ அல்லது அமைக்கப்படாமல் விடப்பட்டாலோ, புள்ளிவிவரங்கள் அறிவிக்கப்படும்.</translation>
 <translation id="1046484220783400299">குறிப்பிட்ட காலத்திற்கு மறுக்கப்பட்ட இணைய இயங்குதள அம்சங்களை இயக்கவும்</translation>
 <translation id="1047128214168693844">பயனரின் நிஜமான இருப்பிடத்தைத் தடமறிய எந்த தளத்தையும் அனுமதிக்காதே</translation>
-<translation id="1057535219415338480"><ph name="PRODUCT_NAME" /> இல் நெட்வொர்க் கணிப்பை இயக்கி, இந்த அமைப்பை மாற்றுவதிலிருந்து பயனர்களைத் தடுக்குகிறது.
-
-      இது DNS முன்பெறுதலை மட்டுமல்லாமல், TCP மற்றும் SSL முன்னிணைப்பையும் இணையப் பக்கங்களின் முன் ஒழுங்கமைத்தலையும் கட்டுப்படுத்துகிறது. வரலாற்றுக் காரணங்களுக்காக கொள்கைப் பெயர் முன்பெறுதலைக் குறிக்கிறது.
-
-      இந்த அமைப்பை இயக்கினால் அல்லது முடக்கினால், பயனர்கள் <ph name="PRODUCT_NAME" /> இல் இந்த அமைப்பை மாற்றவோ அல்லது மேலெழுதவோ முடியாது.
-
-      இந்தக் கொள்கையை அமைக்காமல் விட்டால், இது இயக்கப்படும். ஆனால் பயனர் இதை மாற்ற இயலும்.</translation>
 <translation id="1062011392452772310">சாதனத்திற்கான தொலைநிலைச் சான்றொப்பத்தை இயக்கு</translation>
 <translation id="1090892140761957285">தொலைநிலை அணுகல் க்ளையன்ட் அங்கீகரிப்பு டோக்கனைச் சரிபார்ப்பதற்கான URL.
 
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb
index 32015745..12299be 100644
--- a/components/policy/resources/policy_templates_te.xtb
+++ b/components/policy/resources/policy_templates_te.xtb
@@ -22,13 +22,6 @@
       ఒప్పుకు సెట్ చేస్తే లేదా సెట్ చేయకుంటే, గణాంకాలు నివేదించబడతాయి.</translation>
 <translation id="1046484220783400299">పరిమిత సమయం పాటు నిలిపివేయబడిన వెబ్ ప్లాట్‌ఫారమ్ లక్షణాలను ప్రారంభించండి</translation>
 <translation id="1047128214168693844">వినియోగదారుల యొక్క నిజ స్థానాన్ని ట్రాక్ చెయ్యడానికి ఏ సైట్‌ను అనుమతించవద్దు</translation>
-<translation id="1057535219415338480"><ph name="PRODUCT_NAME" />లో నెట్‌వర్క్ సూచనను ప్రారంభిస్తుంది మరియు ఈ సెట్టింగ్‌ను మార్చకుండా వినియోగదారులను నిరోధిస్తుంది.
-
-      ఇది వెబ్ పేజీల యొక్క DNS పూర్వ ప్రాప్తిని మాత్రమే కాకుండా TCP మరియు SSL పూర్వ కనెక్షన్ మరియు పూర్వ అమలును కూడా నియంత్రిస్తుంది. చారిత్రక కారణాల వల్ల విధానం పేరు DNS పూర్వ ప్రాప్తిగా సూచించబడింది.
-
-      మీరు ఈ సెట్టింగ్‌ను ప్రారంభించినా లేదా నిలిపివేసినా, వినియోగదారులు <ph name="PRODUCT_NAME" />లో ఈ సెట్టింగ్‌ను మార్చలేరు లేదా భర్తీ చేయలేరు.
-
-      ఈ విధానాన్ని సెట్ చేయకపోతే, ఇది ప్రారంభించబడుతుంది కానీ వినియోగదారు దీన్ని మార్చగలరు.</translation>
 <translation id="1062011392452772310">పరికరం కోసం రిమోట్ ధృవీకరణను ప్రారంభించండి</translation>
 <translation id="1090892140761957285">రిమోట్ ప్రాప్యత క్లయింట్ ప్రామాణీకరణ టోకెన్‌ను ధృవీకరించడానికి URL.
 
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index bc903b4..4ba21e74 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -22,13 +22,6 @@
       หากตั้งค่าเป็น True หรือไม่ตั้งค่า จะมีการรายงานสถิติ</translation>
 <translation id="1046484220783400299">เปิดใช้คุณลักษณะแพลตฟอร์มของเว็บที่เลิกใช้แล้วเป็นเวลาจำกัด</translation>
 <translation id="1047128214168693844">ไม่อนุญาตให้ไซต์ใดๆ ติดตามตำแหน่งทางกายภาพของผู้ใช้</translation>
-<translation id="1057535219415338480">เปิดใช้งานการคาดการณ์เครือข่ายใน <ph name="PRODUCT_NAME" /> และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่านี้
-
-      การตั้งค่านี้ไม่เพียงควบคุมการโหลด DNS ล่วงหน้า แต่ยังควบคุมการเชื่อมต่อ TCP และ SSL ล่วงหน้า และการแสดงผลหน้าเว็บล่วงหน้าด้วย ชื่อนโยบายอ้างอิงถึงการโหลด DNS ล่วงหน้าเพื่อจุดประสงค์ด้านประวัติ
-
-      หากคุณเปิดหรือปิดใช้งานการตั้งค่านี้ ผู้ใช้จะไม่สามารถเปลี่ยนหรือแทนที่การตั้งค่านี้ใน <ph name="PRODUCT_NAME" /> ได้
-
-      หากไม่มีการตั้งค่านโยบายนี้ จะมีการเปิดใช้งานแต่ผู้ใช้จะสามารถทำการเปลี่ยนแปลงได้</translation>
 <translation id="1062011392452772310">เปิดใช้งานการยืนยันระยะไกลสำหรับอุปกรณ์</translation>
 <translation id="1090892140761957285">URL สำหรับตรวจสอบความถูกต้องของโทเค็นการตรวจสอบสิทธิ์ไคลเอ็นต์การเข้าถึงระยะไกล
 
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index 8f7ade0..5c5ea014 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -23,13 +23,6 @@
       bırakılırsa istatistikler bildirilir.</translation>
 <translation id="1046484220783400299">Kullanımdan kaldırılan web platformu özelliklerini sınırlı bir süre için etkinleştir</translation>
 <translation id="1047128214168693844">Hiçbir sitenin, kullanıcının fiziksel konumunu izlemesine izin verme</translation>
-<translation id="1057535219415338480"><ph name="PRODUCT_NAME" /> ürününde ağ tahminini sağlar ve kullanıcıların bu ayarı değiştirmesini önler.
-
-      Bu, yalnızca DNS'nin önceden getirilmesini değil, aynı zamanda TCP ve SSL ön bağlantısını ve Web sayfalarının önceden oluşturulmasını da denetler. Politika adı, geçmişe dayanan nedenlerden dolayı DNS'nin önceden getirilmesine gönderme yapar.
-
-      Bu ayarı etkinleştirir veya devre dışı bırakırsanız, kullanıcılar bu ayarı <ph name="PRODUCT_NAME" /> içinden değiştiremez veya geçersiz kılamaz.
-
-      Bu politika ayarlanmadan bırakılırsa etkinleştirilir, ancak kullanıcı ayarda değişiklik yapabilir.</translation>
 <translation id="1062011392452772310">Cihaz için uzaktan doğrulamayı etkinleştir</translation>
 <translation id="1090892140761957285">Uzaktan erişim istemcisi kimlik doğrulama jetonunu doğrulama URL'si.
 
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index 21e030881..6d8900f5 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -22,13 +22,6 @@
       Якщо правило не налаштовано або має значення "true", статистика надсилатиметься.</translation>
 <translation id="1046484220783400299">Увімкнути на певний час функції веб-платформи, які більше не підтримуються</translation>
 <translation id="1047128214168693844">Забороняти всім сайтам відстежувати фізичне місцезнаходження користувача</translation>
-<translation id="1057535219415338480">Вмикає передбачення мережі в <ph name="PRODUCT_NAME" /> і не дозволяє користувачам змінювати це налаштування.
-
-      Контролює не лише попередній виклик DNS, а й попереднє з’єднання TCP й SSL і попереднє відтворення веб-сторінок. З історичних причин у назві правила згадується лише попередній виклик DNS.
-
-      Якщо ввімкнути чи вимкнути це налаштування, користувач не зможе змінити або замінити його в <ph name="PRODUCT_NAME" />.
-
-      Якщо це правило не встановлено, налаштування буде ввімкнено, але користувач зможе його змінити.</translation>
 <translation id="1062011392452772310">Вмикає віддалене підтвердження даних для пристрою</translation>
 <translation id="1090892140761957285">URL-адреса сторінки для підтвердження маркера автентифікації клієнта віддаленого доступу.
 
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index df4040d..f093d88 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -22,13 +22,6 @@
       Nếu được đặt thành true hoặc không được đặt thì thống kê sẽ được báo cáo.</translation>
 <translation id="1046484220783400299">Bật các tính năng nền tảng web không dùng nữa trong một khoảng thời gian giới hạn</translation>
 <translation id="1047128214168693844">Không cho phép bất kỳ trang web nào theo dõi vị trí thực của người dùng</translation>
-<translation id="1057535219415338480">Bật dự đoán mạng trong <ph name="PRODUCT_NAME" /> và ngăn người dùng thay đổi cài đặt này.
-
-      Cài đặt này không chỉ kiểm soát việc tìm nạp trước DNS mà còn cả kết nối trước TCP và SSL cũng như hiển thị trước các trang web. Tên chính sách đề cập đến tìm nạp trước DNS vì các lý do lịch sử.
-
-      Nếu bạn bật hoặc tắt cài đặt này, người dùng không thể thay đổi hoặc ghi đè cài đặt này trong <ph name="PRODUCT_NAME" />.
-
-      Nếu chính sách này không được thiết lập, cài đặt này sẽ được bật nhưng người dùng sẽ có thể thay đổi cài đặt đó.</translation>
 <translation id="1062011392452772310">Cho phép chứng thực từ xa cho thiết bị</translation>
 <translation id="1090892140761957285">URL để xác thực mã thông báo xác thực ứng dụng truy cập từ xa.
 
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 15d9a66..8b89810 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -22,13 +22,6 @@
       如果此政策设为 true 或未设置,系统将报告硬件统计数据。</translation>
 <translation id="1046484220783400299">让已弃用的网络平台功能在限定的时间内发挥功效</translation>
 <translation id="1047128214168693844">不允许任何网站跟踪用户的地理位置</translation>
-<translation id="1057535219415338480">在 <ph name="PRODUCT_NAME" />中启用网络预测功能,并禁止用户更改此设置。
-
-      这项设置不仅控制 DNS 预提取,还控制 TCP 和 SSL 预连接及网页预呈现。但由于历史原因,该策略名称提及的是 DNS 预提取。
-
-      如果您启用或停用此设置,则用户不能在 <ph name="PRODUCT_NAME" />中更改或替换此设置。
-
-      如果不设置此策略,则系统会启用此设置,不过,用户将能够更改此设置。</translation>
 <translation id="1062011392452772310">为设备启用远程认证</translation>
 <translation id="1090892140761957285">验证远程访问客户端身份验证令牌时使用的网址。
 
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index d9867f9..385bbc84 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -22,13 +22,6 @@
       如果設為 True 或未設定,則會回報統計資料。</translation>
 <translation id="1046484220783400299">暫時啟用已淘汰網路平台功能</translation>
 <translation id="1047128214168693844">不允許任何網站追蹤使用者的實際位置</translation>
-<translation id="1057535219415338480">啟用 <ph name="PRODUCT_NAME" /> 的網路預測功能,並且禁止使用者變更這項設定。
-
-      除了 DNS 預先擷取之外,這項設定還可控制 TCP 和 SSL 預先連線及網頁預先轉譯。政策名稱中出現「DNS Prefetching」是為了沿用過去的名稱。
-
-      不論您是否啟用或這個政策,使用者都無法在 <ph name="PRODUCT_NAME" /> 中變更或覆寫這項設定。
-
-      如未設定這項政策,系統會啟用這項功能,不過使用者可自行變更此一設定。</translation>
 <translation id="1062011392452772310">為裝置啟用遠端認證機制</translation>
 <translation id="1090892140761957285">用於驗證遠端存取用戶端驗證憑證的網址。   
 
diff --git a/components/proximity_auth.gypi b/components/proximity_auth.gypi
index f8f1a5ad..0b6d7b4 100644
--- a/components/proximity_auth.gypi
+++ b/components/proximity_auth.gypi
@@ -31,6 +31,8 @@
         "proximity_auth/ble/bluetooth_low_energy_connection_finder.h",
         "proximity_auth/ble/bluetooth_low_energy_device_whitelist.cc",
         "proximity_auth/ble/bluetooth_low_energy_device_whitelist.h",
+	"proximity_auth/ble/bluetooth_low_energy_weave_client_connection.cc",
+	"proximity_auth/ble/bluetooth_low_energy_weave_client_connection.h",
 	"proximity_auth/ble/bluetooth_low_energy_weave_defines.h",
 	"proximity_auth/ble/bluetooth_low_energy_weave_packet_generator.cc",
 	"proximity_auth/ble/bluetooth_low_energy_weave_packet_generator.h",
diff --git a/components/proximity_auth/ble/BUILD.gn b/components/proximity_auth/ble/BUILD.gn
index ca3b534..cb96bb9 100644
--- a/components/proximity_auth/ble/BUILD.gn
+++ b/components/proximity_auth/ble/BUILD.gn
@@ -14,6 +14,8 @@
     "bluetooth_low_energy_connection_finder.h",
     "bluetooth_low_energy_device_whitelist.cc",
     "bluetooth_low_energy_device_whitelist.h",
+    "bluetooth_low_energy_weave_client_connection.cc",
+    "bluetooth_low_energy_weave_client_connection.h",
     "bluetooth_low_energy_weave_defines.h",
     "bluetooth_low_energy_weave_packet_generator.cc",
     "bluetooth_low_energy_weave_packet_generator.h",
@@ -51,6 +53,7 @@
     "bluetooth_low_energy_connection_finder_unittest.cc",
     "bluetooth_low_energy_connection_unittest.cc",
     "bluetooth_low_energy_device_whitelist_unittest.cc",
+    "bluetooth_low_energy_weave_client_connection_unittest.cc",
     "bluetooth_low_energy_weave_packet_generator_unittest.cc",
     "bluetooth_low_energy_weave_packet_receiver_unittest.cc",
   ]
diff --git a/components/proximity_auth/ble/bluetooth_low_energy_weave_client_connection.cc b/components/proximity_auth/ble/bluetooth_low_energy_weave_client_connection.cc
new file mode 100644
index 0000000..3fde272
--- /dev/null
+++ b/components/proximity_auth/ble/bluetooth_low_energy_weave_client_connection.cc
@@ -0,0 +1,639 @@
+// 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/proximity_auth/ble/bluetooth_low_energy_weave_client_connection.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/location.h"
+#include "base/task_runner.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "components/proximity_auth/bluetooth_throttler.h"
+#include "components/proximity_auth/connection_finder.h"
+#include "components/proximity_auth/logging/logging.h"
+#include "components/proximity_auth/wire_message.h"
+#include "device/bluetooth/bluetooth_gatt_connection.h"
+
+using device::BluetoothAdapter;
+using device::BluetoothDevice;
+using device::BluetoothGattConnection;
+using device::BluetoothRemoteGattService;
+using device::BluetoothRemoteGattCharacteristic;
+using device::BluetoothGattNotifySession;
+using device::BluetoothUUID;
+
+namespace proximity_auth {
+namespace weave {
+namespace {
+
+typedef BluetoothLowEnergyWeavePacketReceiver::State ReceiverState;
+
+// The UUID of the TX characteristic used to transmit data to the server.
+const char kTXCharacteristicUUID[] = "00000100-0004-1000-8000-001A11000101";
+
+// The UUID of the RX characteristic used to receive data from the server.
+const char kRXCharacteristicUUID[] = "00000100-0004-1000-8000-001A11000102";
+
+}  // namespace
+
+BluetoothLowEnergyWeaveClientConnection::
+    BluetoothLowEnergyWeaveClientConnection(
+        const RemoteDevice& device,
+        scoped_refptr<device::BluetoothAdapter> adapter,
+        const BluetoothUUID remote_service_uuid,
+        BluetoothThrottler* bluetooth_throttler,
+        int max_number_of_write_attempts)
+    : Connection(device),
+      adapter_(adapter),
+      remote_service_({remote_service_uuid, ""}),
+      packet_generator_(
+          BluetoothLowEnergyWeavePacketGenerator::Factory::NewInstance()),
+      packet_receiver_(
+          BluetoothLowEnergyWeavePacketReceiver::Factory::NewInstance(
+              BluetoothLowEnergyWeavePacketReceiver::ReceiverType::CLIENT)),
+      tx_characteristic_({BluetoothUUID(kTXCharacteristicUUID), ""}),
+      rx_characteristic_({BluetoothUUID(kRXCharacteristicUUID), ""}),
+      bluetooth_throttler_(bluetooth_throttler),
+      task_runner_(base::ThreadTaskRunnerHandle::Get()),
+      sub_status_(SubStatus::DISCONNECTED),
+      write_remote_characteristic_pending_(false),
+      max_number_of_write_attempts_(max_number_of_write_attempts),
+      weak_ptr_factory_(this) {
+  DCHECK(adapter_);
+  DCHECK(adapter_->IsInitialized());
+
+  adapter_->AddObserver(this);
+}
+
+BluetoothLowEnergyWeaveClientConnection::
+    ~BluetoothLowEnergyWeaveClientConnection() {
+  // Since the destructor can be called at anytime, it would be unwise to send a
+  // connection close since we might not be connected at all.
+  DestroyConnection();
+
+  if (adapter_) {
+    adapter_->RemoveObserver(this);
+    adapter_ = NULL;
+  }
+}
+
+void BluetoothLowEnergyWeaveClientConnection::Connect() {
+  DCHECK(sub_status() == SubStatus::DISCONNECTED);
+
+  SetSubStatus(SubStatus::WAITING_GATT_CONNECTION);
+  base::TimeDelta throttler_delay = bluetooth_throttler_->GetDelay();
+  PA_LOG(INFO) << "Connecting in  " << throttler_delay;
+
+  start_time_ = base::TimeTicks::Now();
+
+  // If necessary, wait to create a new GATT connection.
+  //
+  // Avoid creating a new GATT connection immediately after a given device was
+  // disconnected. This is a workaround for crbug.com/508919.
+  if (!throttler_delay.is_zero()) {
+    task_runner_->PostDelayedTask(
+        FROM_HERE,
+        base::Bind(
+            &BluetoothLowEnergyWeaveClientConnection::CreateGattConnection,
+            weak_ptr_factory_.GetWeakPtr()),
+        throttler_delay);
+    return;
+  }
+
+  CreateGattConnection();
+}
+
+void BluetoothLowEnergyWeaveClientConnection::CreateGattConnection() {
+  DCHECK(sub_status() == SubStatus::WAITING_GATT_CONNECTION);
+
+  BluetoothDevice* remote_device = GetRemoteDevice();
+  if (remote_device) {
+    PA_LOG(INFO) << "Creating GATT connection with "
+                 << remote_device->GetAddress();
+
+    remote_device->CreateGattConnection(
+        base::Bind(
+            &BluetoothLowEnergyWeaveClientConnection::OnGattConnectionCreated,
+            weak_ptr_factory_.GetWeakPtr()),
+        base::Bind(&BluetoothLowEnergyWeaveClientConnection::
+                       OnCreateGattConnectionError,
+                   weak_ptr_factory_.GetWeakPtr()));
+  } else {
+    SetSubStatus(SubStatus::DISCONNECTED);
+  }
+}
+
+void BluetoothLowEnergyWeaveClientConnection::Disconnect() {
+  if (sub_status_ == SubStatus::CONNECTED) {
+    // Friendly disconnect by sending a connection close and then destroy the
+    // the connection once the connection close has been sent.
+    WriteRequest request(packet_generator_->CreateConnectionClose(
+                             ReasonForClose::CLOSE_WITHOUT_ERROR),
+                         WriteRequestType::CONNECTION_CLOSE);
+    WriteRemoteCharacteristic(request);
+  } else {
+    DestroyConnection();
+  }
+}
+
+void BluetoothLowEnergyWeaveClientConnection::DestroyConnection() {
+  if (sub_status() != SubStatus::DISCONNECTED) {
+    weak_ptr_factory_.InvalidateWeakPtrs();
+    StopNotifySession();
+    characteristic_finder_.reset();
+    if (gatt_connection_) {
+      PA_LOG(INFO) << "Disconnect from device "
+                   << gatt_connection_->GetDeviceAddress();
+
+      // Destroying BluetoothGattConnection also disconnects it.
+      gatt_connection_.reset();
+    }
+
+    // Only transition to the DISCONNECTED state after perfoming all necessary
+    // operations. Otherwise, it'll trigger observers that can pontentially
+    // destroy the current instance (causing a crash).
+    SetSubStatus(SubStatus::DISCONNECTED);
+  }
+}
+
+void BluetoothLowEnergyWeaveClientConnection::SetSubStatus(
+    SubStatus new_sub_status) {
+  sub_status_ = new_sub_status;
+
+  // Sets the status of parent class proximity_auth::Connection accordingly.
+  if (new_sub_status == SubStatus::CONNECTED) {
+    SetStatus(Status::CONNECTED);
+  } else if (new_sub_status == SubStatus::DISCONNECTED) {
+    SetStatus(Status::DISCONNECTED);
+  } else {
+    SetStatus(Status::IN_PROGRESS);
+  }
+}
+
+void BluetoothLowEnergyWeaveClientConnection::SetTaskRunnerForTesting(
+    scoped_refptr<base::TaskRunner> task_runner) {
+  task_runner_ = task_runner;
+}
+
+void BluetoothLowEnergyWeaveClientConnection::SendMessageImpl(
+    std::unique_ptr<WireMessage> message) {
+  PA_LOG(INFO) << "Sending message " << message->Serialize();
+  std::string serialized_msg = message->Serialize();
+
+  std::vector<Packet> packets =
+      packet_generator_->EncodeDataMessage(serialized_msg);
+
+  std::shared_ptr<WireMessage> request_message(message.release());
+
+  for (uint32_t i = 0; i < packets.size(); ++i) {
+    WriteRequestType request_type = (i == packets.size() - 1)
+                                        ? WriteRequestType::MESSAGE_COMPLETE
+                                        : WriteRequestType::REGULAR;
+    WriteRequest request(packets[i], request_type, request_message);
+    WriteRemoteCharacteristic(request);
+  }
+}
+
+// Changes in the GATT connection with the remote device should be observed
+// here. If the GATT connection is dropped, we should call DestroyConnection()
+// anyway, so the object can notify its observers.
+void BluetoothLowEnergyWeaveClientConnection::DeviceChanged(
+    BluetoothAdapter* adapter,
+    BluetoothDevice* device) {
+  DCHECK(device);
+  if (sub_status() == SubStatus::DISCONNECTED ||
+      device->GetAddress() != GetDeviceAddress())
+    return;
+
+  if (sub_status() != SubStatus::WAITING_GATT_CONNECTION &&
+      !device->IsConnected()) {
+    PA_LOG(INFO) << "GATT connection dropped " << GetDeviceAddress()
+                 << "\ndevice connected: " << device->IsConnected()
+                 << "\ngatt connection: "
+                 << (gatt_connection_ ? gatt_connection_->IsConnected()
+                                      : false);
+    DestroyConnection();
+  }
+}
+
+void BluetoothLowEnergyWeaveClientConnection::DeviceRemoved(
+    BluetoothAdapter* adapter,
+    BluetoothDevice* device) {
+  DCHECK(device);
+  if (sub_status_ == SubStatus::DISCONNECTED ||
+      device->GetAddress() != GetDeviceAddress())
+    return;
+
+  PA_LOG(INFO) << "Device removed " << GetDeviceAddress();
+  DestroyConnection();
+}
+
+void BluetoothLowEnergyWeaveClientConnection::GattCharacteristicValueChanged(
+    BluetoothAdapter* adapter,
+    BluetoothRemoteGattCharacteristic* characteristic,
+    const Packet& value) {
+  DCHECK_EQ(adapter, adapter_.get());
+  if (sub_status() != SubStatus::WAITING_CONNECTION_RESPONSE &&
+      sub_status() != SubStatus::CONNECTED)
+    return;
+
+  PA_LOG(INFO) << "Characteristic value changed: "
+               << characteristic->GetUUID().canonical_value();
+
+  if (characteristic->GetIdentifier() == rx_characteristic_.id) {
+    ReceiverState state = packet_receiver_->ReceivePacket(value);
+
+    PA_LOG(INFO) << "\nReceiver State: " << state;
+    switch (state) {
+      case ReceiverState::DATA_READY:
+        OnBytesReceived(packet_receiver_->GetDataMessage());
+        break;
+      case ReceiverState::CONNECTION_CLOSED:
+        PA_LOG(ERROR) << "Connection closed due to: " << GetReasonForClose();
+        DestroyConnection();
+        break;
+      case ReceiverState::ERROR_DETECTED:
+        OnPacketReceiverError();
+        break;
+      case ReceiverState::WAITING:
+        // Receiver state should have changed from CONNECTING to WAITING if
+        // a proper connection response had been received.
+        // The max packet size selected from the connection response will be
+        // used to generate future data packets.
+        packet_generator_->SetMaxPacketSize(
+            packet_receiver_->GetMaxPacketSize());
+        DCHECK(sub_status() == SubStatus::WAITING_CONNECTION_RESPONSE);
+        CompleteConnection();
+        break;
+      case ReceiverState::RECEIVING_DATA:
+        // Normal in between states, so do nothing.
+        break;
+      default:
+        NOTREACHED();
+    }
+  }
+}
+
+void BluetoothLowEnergyWeaveClientConnection::CompleteConnection() {
+  PA_LOG(INFO) << "Connection completed. Time elapsed: "
+               << base::TimeTicks::Now() - start_time_;
+  SetSubStatus(SubStatus::CONNECTED);
+}
+
+void BluetoothLowEnergyWeaveClientConnection::OnCreateGattConnectionError(
+    device::BluetoothDevice::ConnectErrorCode error_code) {
+  DCHECK(sub_status_ == SubStatus::WAITING_GATT_CONNECTION);
+  PA_LOG(WARNING) << "Error creating GATT connection to "
+                  << remote_device().bluetooth_address
+                  << " error code: " << error_code;
+  DestroyConnection();
+}
+
+void BluetoothLowEnergyWeaveClientConnection::OnGattConnectionCreated(
+    std::unique_ptr<device::BluetoothGattConnection> gatt_connection) {
+  DCHECK(sub_status() == SubStatus::WAITING_GATT_CONNECTION);
+  PA_LOG(INFO) << "GATT connection with " << gatt_connection->GetDeviceAddress()
+               << " created.";
+  PrintTimeElapsed();
+
+  // Informing |bluetooth_trottler_| a new connection was established.
+  bluetooth_throttler_->OnConnection(this);
+
+  gatt_connection_ = std::move(gatt_connection);
+  SetSubStatus(SubStatus::WAITING_CHARACTERISTICS);
+  characteristic_finder_.reset(CreateCharacteristicsFinder(
+      base::Bind(
+          &BluetoothLowEnergyWeaveClientConnection::OnCharacteristicsFound,
+          weak_ptr_factory_.GetWeakPtr()),
+      base::Bind(&BluetoothLowEnergyWeaveClientConnection::
+                     OnCharacteristicsFinderError,
+                 weak_ptr_factory_.GetWeakPtr())));
+}
+
+BluetoothLowEnergyCharacteristicsFinder*
+BluetoothLowEnergyWeaveClientConnection::CreateCharacteristicsFinder(
+    const BluetoothLowEnergyCharacteristicsFinder::SuccessCallback&
+        success_callback,
+    const BluetoothLowEnergyCharacteristicsFinder::ErrorCallback&
+        error_callback) {
+  return new BluetoothLowEnergyCharacteristicsFinder(
+      adapter_, GetRemoteDevice(), remote_service_, tx_characteristic_,
+      rx_characteristic_, success_callback, error_callback);
+}
+
+void BluetoothLowEnergyWeaveClientConnection::OnCharacteristicsFound(
+    const RemoteAttribute& service,
+    const RemoteAttribute& tx_characteristic,
+    const RemoteAttribute& rx_characteristic) {
+  PA_LOG(INFO) << "Remote chacteristics found.";
+  PrintTimeElapsed();
+
+  DCHECK(sub_status() == SubStatus::WAITING_CHARACTERISTICS);
+  remote_service_ = service;
+  tx_characteristic_ = tx_characteristic;
+  rx_characteristic_ = rx_characteristic;
+
+  SetSubStatus(SubStatus::CHARACTERISTICS_FOUND);
+  StartNotifySession();
+}
+
+void BluetoothLowEnergyWeaveClientConnection::OnCharacteristicsFinderError(
+    const RemoteAttribute& tx_characteristic,
+    const RemoteAttribute& rx_characteristic) {
+  DCHECK(sub_status() == SubStatus::WAITING_CHARACTERISTICS);
+  PA_LOG(WARNING) << "Connection error, missing characteristics for SmartLock "
+                     "service.\n"
+                  << (tx_characteristic.id.empty()
+                          ? tx_characteristic.uuid.canonical_value()
+                          : "")
+                  << ", "
+                  << (rx_characteristic.id.empty()
+                          ? ", " + rx_characteristic.uuid.canonical_value()
+                          : "")
+                  << " not found.";
+
+  DestroyConnection();
+}
+
+void BluetoothLowEnergyWeaveClientConnection::StartNotifySession() {
+  DCHECK(sub_status() == SubStatus::CHARACTERISTICS_FOUND);
+  BluetoothRemoteGattCharacteristic* characteristic =
+      GetGattCharacteristic(rx_characteristic_.id);
+  CHECK(characteristic);
+
+  // This is a workaround for crbug.com/507325. If |characteristic| is already
+  // notifying |characteristic->StartNotifySession()| will fail with
+  // GATT_ERROR_FAILED.
+  if (characteristic->IsNotifying()) {
+    PA_LOG(INFO) << characteristic->GetUUID().canonical_value()
+                 << " already notifying.";
+    SetSubStatus(SubStatus::NOTIFY_SESSION_READY);
+    SendConnectionRequest();
+    return;
+  }
+
+  SetSubStatus(SubStatus::WAITING_NOTIFY_SESSION);
+  characteristic->StartNotifySession(
+      base::Bind(
+          &BluetoothLowEnergyWeaveClientConnection::OnNotifySessionStarted,
+          weak_ptr_factory_.GetWeakPtr()),
+      base::Bind(&BluetoothLowEnergyWeaveClientConnection::OnNotifySessionError,
+                 weak_ptr_factory_.GetWeakPtr()));
+}
+
+void BluetoothLowEnergyWeaveClientConnection::OnNotifySessionStarted(
+    std::unique_ptr<BluetoothGattNotifySession> notify_session) {
+  DCHECK(sub_status() == SubStatus::WAITING_NOTIFY_SESSION);
+  PA_LOG(INFO) << "Notification session started "
+               << notify_session->GetCharacteristicIdentifier();
+  PrintTimeElapsed();
+
+  SetSubStatus(SubStatus::NOTIFY_SESSION_READY);
+  notify_session_ = std::move(notify_session);
+
+  SendConnectionRequest();
+}
+
+void BluetoothLowEnergyWeaveClientConnection::OnNotifySessionError(
+    BluetoothRemoteGattService::GattErrorCode error) {
+  DCHECK(sub_status() == SubStatus::WAITING_NOTIFY_SESSION);
+  PA_LOG(WARNING) << "Error starting notification session: " << error;
+  DestroyConnection();
+}
+
+void BluetoothLowEnergyWeaveClientConnection::StopNotifySession() {
+  if (notify_session_) {
+    notify_session_->Stop(base::Bind(&base::DoNothing));
+    notify_session_.reset();
+  }
+}
+
+void BluetoothLowEnergyWeaveClientConnection::SendConnectionRequest() {
+  if (sub_status() == SubStatus::NOTIFY_SESSION_READY) {
+    PA_LOG(INFO) << "Sending connection request to the server";
+    SetSubStatus(SubStatus::WAITING_CONNECTION_RESPONSE);
+
+    WriteRequest write_request(packet_generator_->CreateConnectionRequest(),
+                               WriteRequestType::CONNECTION_REQUEST);
+
+    WriteRemoteCharacteristic(write_request);
+  }
+}
+
+void BluetoothLowEnergyWeaveClientConnection::WriteRemoteCharacteristic(
+    const WriteRequest& request) {
+  write_requests_queue_.push(request);
+  PA_LOG(ERROR) << "you got " << request.message.get();
+  ProcessNextWriteRequest();
+}
+
+void BluetoothLowEnergyWeaveClientConnection::ProcessNextWriteRequest() {
+  BluetoothRemoteGattCharacteristic* characteristic =
+      GetGattCharacteristic(tx_characteristic_.id);
+  if (!write_requests_queue_.empty() && !write_remote_characteristic_pending_ &&
+      characteristic) {
+    write_remote_characteristic_pending_ = true;
+    const WriteRequest& next_request = write_requests_queue_.front();
+
+    PA_LOG(INFO) << "Writing to characteristic " << next_request.value.size()
+                 << " bytes";
+    characteristic->WriteRemoteCharacteristic(
+        next_request.value,
+        base::Bind(&BluetoothLowEnergyWeaveClientConnection::
+                       OnRemoteCharacteristicWritten,
+                   weak_ptr_factory_.GetWeakPtr()),
+        base::Bind(&BluetoothLowEnergyWeaveClientConnection::
+                       OnWriteRemoteCharacteristicError,
+                   weak_ptr_factory_.GetWeakPtr()));
+  }
+}
+
+void BluetoothLowEnergyWeaveClientConnection::OnRemoteCharacteristicWritten() {
+  PA_LOG(INFO) << "Characteristic written.";
+
+  DCHECK(!write_requests_queue_.empty());
+
+  const WriteRequest& request = write_requests_queue_.front();
+
+  switch (request.request_type) {
+    case WriteRequestType::REGULAR:
+    case WriteRequestType::CONNECTION_REQUEST:
+      break;
+    case WriteRequestType::MESSAGE_COMPLETE:
+      OnDidSendMessage(*request.message, true);
+      break;
+    case WriteRequestType::CONNECTION_CLOSE:
+      DestroyConnection();
+      break;
+    default:
+      NOTREACHED();
+  }
+
+  // Removes the top of queue (already processed) and process the next request.
+  write_requests_queue_.pop();
+  write_remote_characteristic_pending_ = false;
+  ProcessNextWriteRequest();
+}
+
+void BluetoothLowEnergyWeaveClientConnection::OnWriteRemoteCharacteristicError(
+    BluetoothRemoteGattService::GattErrorCode error) {
+  PA_LOG(WARNING) << "Error " << error << " writing characteristic: "
+                  << tx_characteristic_.uuid.canonical_value();
+
+  write_remote_characteristic_pending_ = false;
+
+  DCHECK(!write_requests_queue_.empty());
+  WriteRequest* request = &write_requests_queue_.front();
+
+  // Increases the number of failed attempts and retry.
+
+  if (++request->number_of_failed_attempts >= max_number_of_write_attempts_) {
+    switch (request->request_type) {
+      case WriteRequestType::REGULAR:
+      case WriteRequestType::MESSAGE_COMPLETE:
+        OnDidSendMessage(*request->message, false);
+        break;
+      case WriteRequestType::CONNECTION_CLOSE:
+      case WriteRequestType::CONNECTION_REQUEST:
+        break;
+      default:
+        NOTREACHED();
+    }
+
+    // If the previous write failed that many times, probably can't write a
+    // connection close either, so just destroy the connection.
+    DestroyConnection();
+  } else {
+    ProcessNextWriteRequest();
+  }
+}
+
+void BluetoothLowEnergyWeaveClientConnection::OnPacketReceiverError() {
+  PA_LOG(ERROR) << "Received erroneous packet. Closing connection.";
+
+  WriteRequest request(packet_generator_->CreateConnectionClose(
+                           packet_receiver_->GetReasonToClose()),
+                       WriteRequestType::CONNECTION_CLOSE);
+
+  // Skip all other writes that's not in progress.
+
+  // C++ queue does not have a clear method.
+  // According to stackoverflow
+  // "http://stackoverflow.com/questions/709146/how-do-i-clear-the-stdqueue-
+  //  efficiently"
+  std::queue<WriteRequest> empty;
+  std::swap(write_requests_queue_, empty);
+
+  if (write_remote_characteristic_pending_) {
+    // Add the in progress write back to the queue.
+    write_requests_queue_.push(empty.front());
+  }
+
+  WriteRemoteCharacteristic(request);
+}
+
+void BluetoothLowEnergyWeaveClientConnection::PrintTimeElapsed() {
+  PA_LOG(INFO) << "Time elapsed: " << base::TimeTicks::Now() - start_time_;
+}
+
+std::string BluetoothLowEnergyWeaveClientConnection::GetDeviceAddress() {
+  // When the remote device is connected we should rely on the address given by
+  // |gatt_connection_|. As the device address may change if the device is
+  // paired. The address in |gatt_connection_| is automatically updated in this
+  // case.
+  return gatt_connection_ ? gatt_connection_->GetDeviceAddress()
+                          : remote_device().bluetooth_address;
+}
+
+BluetoothDevice* BluetoothLowEnergyWeaveClientConnection::GetRemoteDevice() {
+  // It's not possible to simply use
+  // |adapter_->GetDevice(GetDeviceAddress())| to find the device with MAC
+  // address |GetDeviceAddress()|. For paired devices,
+  // BluetoothAdapter::GetDevice(XXX) searches for the temporary MAC address
+  // XXX, whereas |GetDeviceAddress()| is the real MAC address. This is a
+  // bug in the way device::BluetoothAdapter is storing the devices (see
+  // crbug.com/497841).
+  std::vector<BluetoothDevice*> devices = adapter_->GetDevices();
+  for (const auto& device : devices) {
+    if (device->GetAddress() == GetDeviceAddress())
+      return device;
+  }
+
+  return nullptr;
+}
+
+BluetoothRemoteGattService*
+BluetoothLowEnergyWeaveClientConnection::GetRemoteService() {
+  BluetoothDevice* remote_device = GetRemoteDevice();
+  if (!remote_device) {
+    PA_LOG(WARNING) << "Remote device not found.";
+    return NULL;
+  }
+  if (remote_service_.id.empty()) {
+    std::vector<BluetoothRemoteGattService*> services =
+        remote_device->GetGattServices();
+    for (const auto& service : services)
+      if (service->GetUUID() == remote_service_.uuid) {
+        remote_service_.id = service->GetIdentifier();
+        break;
+      }
+  }
+  return remote_device->GetGattService(remote_service_.id);
+}
+
+BluetoothRemoteGattCharacteristic*
+BluetoothLowEnergyWeaveClientConnection::GetGattCharacteristic(
+    const std::string& gatt_characteristic) {
+  BluetoothRemoteGattService* remote_service = GetRemoteService();
+  if (!remote_service) {
+    PA_LOG(WARNING) << "Remote service not found.";
+    return NULL;
+  }
+  return remote_service->GetCharacteristic(gatt_characteristic);
+}
+
+std::string BluetoothLowEnergyWeaveClientConnection::GetReasonForClose() {
+  switch (packet_receiver_->GetReasonForClose()) {
+    case ReasonForClose::CLOSE_WITHOUT_ERROR:
+      return "CLOSE_WITHOUT_ERROR";
+    case ReasonForClose::UNKNOWN_ERROR:
+      return "UNKNOWN_ERROR";
+    case ReasonForClose::NO_COMMON_VERSION_SUPPORTED:
+      return "NO_COMMON_VERSION_SUPPORTED";
+    case ReasonForClose::RECEIVED_PACKET_OUT_OF_SEQUENCE:
+      return "RECEIVED_PACKET_OUT_OF_SEQUENCE";
+    case ReasonForClose::APPLICATION_ERROR:
+      return "APPLICATION_ERROR";
+    default:
+      NOTREACHED();
+      return "";
+  }
+}
+
+BluetoothLowEnergyWeaveClientConnection::WriteRequest::WriteRequest(
+    const Packet& val,
+    WriteRequestType request_type,
+    std::shared_ptr<WireMessage> message)
+    : value(val),
+      request_type(request_type),
+      message(message),
+      number_of_failed_attempts(0) {}
+
+BluetoothLowEnergyWeaveClientConnection::WriteRequest::WriteRequest(
+    const Packet& val,
+    WriteRequestType request_type)
+    : value(val),
+      request_type(request_type),
+      message(nullptr),
+      number_of_failed_attempts(0) {}
+
+BluetoothLowEnergyWeaveClientConnection::WriteRequest::WriteRequest(
+    const WriteRequest& other) = default;
+
+BluetoothLowEnergyWeaveClientConnection::WriteRequest::~WriteRequest() {}
+
+}  // namespace weave
+
+}  // namespace proximity_auth
diff --git a/components/proximity_auth/ble/bluetooth_low_energy_weave_client_connection.h b/components/proximity_auth/ble/bluetooth_low_energy_weave_client_connection.h
new file mode 100644
index 0000000..bda1ee7
--- /dev/null
+++ b/components/proximity_auth/ble/bluetooth_low_energy_weave_client_connection.h
@@ -0,0 +1,316 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_PROXIMITY_AUTH_BLE_BLUETOOTH_LOW_ENERGY_WEAVE_CLIENT_CONNECTION_H_
+#define COMPONENTS_PROXIMITY_AUTH_BLE_BLUETOOTH_LOW_ENERGY_WEAVE_CLIENT_CONNECTION_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <map>
+#include <memory>
+#include <queue>
+#include <string>
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "base/time/time.h"
+#include "components/proximity_auth/ble/bluetooth_low_energy_characteristics_finder.h"
+#include "components/proximity_auth/ble/bluetooth_low_energy_weave_packet_generator.h"
+#include "components/proximity_auth/ble/bluetooth_low_energy_weave_packet_receiver.h"
+#include "components/proximity_auth/ble/fake_wire_message.h"
+#include "components/proximity_auth/ble/remote_attribute.h"
+#include "components/proximity_auth/connection.h"
+#include "device/bluetooth/bluetooth_adapter.h"
+#include "device/bluetooth/bluetooth_device.h"
+#include "device/bluetooth/bluetooth_gatt_notify_session.h"
+#include "device/bluetooth/bluetooth_remote_gatt_characteristic.h"
+#include "device/bluetooth/bluetooth_uuid.h"
+
+namespace base {
+class TaskRunner;
+}
+
+namespace proximity_auth {
+class BluetoothThrottler;
+
+namespace weave {
+// Creates GATT connection on top of the BLE connection and act as a Client.
+// uWeave communication follows the flow:
+// Client                           | Server
+// ---------------------------------|--------------------------------
+// send connection request          |
+//                                  | receive connection request
+//                                  | send connection response
+// receive connection response      |
+// opt: send data                   | opt: send data
+// receive data                     | receive data
+// opt: close connection            | opt: close connection
+class BluetoothLowEnergyWeaveClientConnection
+    : public Connection,
+      public device::BluetoothAdapter::Observer {
+ public:
+  class Factory {
+   public:
+    static std::unique_ptr<BluetoothLowEnergyWeaveClientConnection>
+    NewInstance();
+
+    // Exposed for testing.
+    static void SetInstanceForTesting(Factory* factory);
+
+   protected:
+    // Exposed for testing.
+    virtual std::unique_ptr<BluetoothLowEnergyWeaveClientConnection>
+    BuildInstance();
+
+   private:
+    static Factory* factory_instance_;
+  };
+
+  // The sub-state of a proximity_auth::BluetoothLowEnergyWeaveClientConnection
+  // extends the IN_PROGRESS state of proximity_auth::Connection::Status.
+  enum SubStatus {
+    DISCONNECTED,
+    WAITING_GATT_CONNECTION,
+    WAITING_CHARACTERISTICS,
+    CHARACTERISTICS_FOUND,
+    WAITING_NOTIFY_SESSION,
+    NOTIFY_SESSION_READY,
+    WAITING_CONNECTION_RESPONSE,
+    CONNECTED,
+  };
+
+  // Constructs a Bluetooth low energy connection to the service with
+  // |remote_service_| on the |remote_device|. The |adapter| must be already
+  // initialized and ready. The GATT connection may alreaady be established and
+  // pass through |gatt_connection|. A subsequent call to Connect() must be
+  // made.
+  BluetoothLowEnergyWeaveClientConnection(
+      const RemoteDevice& remote_device,
+      scoped_refptr<device::BluetoothAdapter> adapter,
+      const device::BluetoothUUID remote_service_uuid,
+      BluetoothThrottler* bluetooth_throttler,
+      int max_number_of_write_attempts);
+
+  ~BluetoothLowEnergyWeaveClientConnection() override;
+
+  // proximity_auth::Connection:
+  void Connect() override;
+  void Disconnect() override;
+  std::string GetDeviceAddress() override;
+
+ protected:
+  // Exposed for testing.
+  void DestroyConnection();
+
+  // Exposed for testing.
+  SubStatus sub_status() { return sub_status_; }
+
+  // Sets |task_runner_| for testing.
+  void SetTaskRunnerForTesting(scoped_refptr<base::TaskRunner> task_runner);
+
+  // Virtual for testing.
+  virtual BluetoothLowEnergyCharacteristicsFinder* CreateCharacteristicsFinder(
+      const BluetoothLowEnergyCharacteristicsFinder::SuccessCallback&
+          success_callback,
+      const BluetoothLowEnergyCharacteristicsFinder::ErrorCallback&
+          error_callback);
+
+  // proximity_auth::Connection:
+  void SendMessageImpl(std::unique_ptr<WireMessage> message) override;
+
+  // device::BluetoothAdapter::Observer:
+  void DeviceChanged(device::BluetoothAdapter* adapter,
+                     device::BluetoothDevice* device) override;
+  void DeviceRemoved(device::BluetoothAdapter* adapter,
+                     device::BluetoothDevice* device) override;
+  void GattCharacteristicValueChanged(
+      device::BluetoothAdapter* adapter,
+      device::BluetoothRemoteGattCharacteristic* characteristic,
+      const Packet& value) override;
+
+ private:
+  enum WriteRequestType {
+    REGULAR,
+    MESSAGE_COMPLETE,
+    CONNECTION_REQUEST,
+    CONNECTION_CLOSE
+  };
+
+  // Represents a request to write |value| to a some characteristic.
+  // |is_last_write_for_wire_messsage| indicates whether this request
+  // corresponds to the last write request for some wire message.
+  struct WriteRequest {
+    WriteRequest(const Packet& val,
+                 WriteRequestType request_type,
+                 std::shared_ptr<WireMessage> message);
+    WriteRequest(const Packet& val, WriteRequestType request_type);
+    WriteRequest(const WriteRequest& other);
+    ~WriteRequest();
+
+    Packet value;
+    WriteRequestType request_type;
+    std::shared_ptr<WireMessage> message;
+    int number_of_failed_attempts;
+  };
+
+  void SetSubStatus(SubStatus status);
+
+  // Creates the GATT connection with |remote_device|.
+  void CreateGattConnection();
+
+  // Called when a GATT connection is created.
+  void OnGattConnectionCreated(
+      std::unique_ptr<device::BluetoothGattConnection> gatt_connection);
+
+  // Callback called when there is an error creating the GATT connection.
+  void OnCreateGattConnectionError(
+      device::BluetoothDevice::ConnectErrorCode error_code);
+
+  // Callback called when |tx_characteristic_| and |rx_characteristic_| were
+  // found.
+  void OnCharacteristicsFound(const RemoteAttribute& service,
+                              const RemoteAttribute& tx_characteristic,
+                              const RemoteAttribute& rx_characteristic);
+
+  // Callback called there was an error finding the characteristics.
+  void OnCharacteristicsFinderError(const RemoteAttribute& tx_characteristic,
+                                    const RemoteAttribute& rx_characteristic);
+
+  // Starts a notify session for |rx_characteristic_| when ready
+  // (SubStatus::CHARACTERISTICS_FOUND).
+  void StartNotifySession();
+
+  // Called when a notification session is successfully started for
+  // |rx_characteristic_| characteristic.
+  void OnNotifySessionStarted(
+      std::unique_ptr<device::BluetoothGattNotifySession> notify_session);
+
+  // Called when there is an error starting a notification session for
+  // |rx_characteristic_| characteristic.
+  void OnNotifySessionError(device::BluetoothGattService::GattErrorCode);
+
+  // Stops |notify_session_|.
+  void StopNotifySession();
+
+  // Sends a connection request to server if ready
+  // (SubStatus::NOTIFY_SESSION_READY).
+  void SendConnectionRequest();
+
+  // Completes and updates the status accordingly.
+  void CompleteConnection();
+
+  // This is the only entry point for WriteRequests, which are processed
+  // accordingly the following flow:
+  // 1) |request| is enqueued;
+  // 2) |request| will be processed by ProcessNextWriteRequest() when there is
+  // no pending write request;
+  // 3) |request| will be dequeued when it's successfully processed
+  // (OnRemoteCharacteristicWritten());
+  // 4) |request| is not dequeued if it fails
+  // (OnWriteRemoteCharacteristicError()), it remains on the queue and will be
+  // retried. |request| will remain on the queue until it succeeds or it
+  // triggers a Disconnect() call (after |max_number_of_tries_|).
+  void WriteRemoteCharacteristic(const WriteRequest& request);
+
+  // Processes the next request in |write_requests_queue_|.
+  void ProcessNextWriteRequest();
+
+  // Called when the
+  // BluetoothRemoteGattCharacteristic::RemoteCharacteristicWrite() is
+  // successfully complete.
+  void OnRemoteCharacteristicWritten();
+
+  // Called when there is an error writing to the remote characteristic
+  // |tx_characteristic_|.
+  void OnWriteRemoteCharacteristicError(
+      device::BluetoothRemoteGattService::GattErrorCode error);
+
+  void OnPacketReceiverError();
+
+  // Prints the time elapsed since |Connect()| was called.
+  void PrintTimeElapsed();
+
+  // Returns the device corresponding to |remote_device_address_|.
+  device::BluetoothDevice* GetRemoteDevice();
+
+  // Returns the service corresponding to |remote_service_| in the current
+  // device.
+  device::BluetoothRemoteGattService* GetRemoteService();
+
+  // Returns the characteristic corresponding to |identifier| in the current
+  // service.
+  device::BluetoothRemoteGattCharacteristic* GetGattCharacteristic(
+      const std::string& identifier);
+
+  // Get the reason that the other side of the connection decided to close the
+  // connection.
+  // Will crash if the receiver is not in CONNECTION_CLOSED state.
+  std::string GetReasonForClose();
+
+  // The Bluetooth adapter over which the Bluetooth connection will be made.
+  scoped_refptr<device::BluetoothAdapter> adapter_;
+
+  // Remote service the |gatt_connection_| was established with.
+  RemoteAttribute remote_service_;
+
+  // uWeave packet generator.
+  std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator> packet_generator_;
+
+  // uWeave packet receiver.
+  std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> packet_receiver_;
+
+  // Characteristic used to send data to the remote device.
+  RemoteAttribute tx_characteristic_;
+
+  // Characteristic used to receive data from the remote device.
+  RemoteAttribute rx_characteristic_;
+
+  // Throttles repeated connection attempts to the same device. This is a
+  // workaround for crbug.com/508919. Not owned, must outlive this instance.
+  BluetoothThrottler* bluetooth_throttler_;
+
+  scoped_refptr<base::TaskRunner> task_runner_;
+
+  // The GATT connection with the remote device.
+  std::unique_ptr<device::BluetoothGattConnection> gatt_connection_;
+
+  // The characteristics finder for remote device.
+  std::unique_ptr<BluetoothLowEnergyCharacteristicsFinder>
+      characteristic_finder_;
+
+  // The notify session for |rx_characteristic|.
+  std::unique_ptr<device::BluetoothGattNotifySession> notify_session_;
+
+  // Internal connection status
+  SubStatus sub_status_;
+
+  // Bytes already received for the current receive operation.
+  std::string incoming_bytes_buffer_;
+
+  // Indicates there is a
+  // BluetoothRemoteGattCharacteristic::WriteRemoteCharacteristic
+  // operation pending.
+  bool write_remote_characteristic_pending_;
+
+  std::queue<WriteRequest> write_requests_queue_;
+
+  // Maximum number of tries to send any write request.
+  int max_number_of_write_attempts_;
+
+  // Stores when the instace was created.
+  base::TimeTicks start_time_;
+
+  base::WeakPtrFactory<BluetoothLowEnergyWeaveClientConnection>
+      weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(BluetoothLowEnergyWeaveClientConnection);
+};
+
+}  // namespace weave
+
+}  // namespace proximity_auth
+
+#endif  // COMPONENTS_PROXIMITY_AUTH_BLE_BLUETOOTH_LOW_ENERGY_WEAVE_CLIENT_CONNECTION_H_
diff --git a/components/proximity_auth/ble/bluetooth_low_energy_weave_client_connection_unittest.cc b/components/proximity_auth/ble/bluetooth_low_energy_weave_client_connection_unittest.cc
new file mode 100644
index 0000000..e83ade5d
--- /dev/null
+++ b/components/proximity_auth/ble/bluetooth_low_energy_weave_client_connection_unittest.cc
@@ -0,0 +1,1043 @@
+// 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/proximity_auth/ble/bluetooth_low_energy_weave_client_connection.h"
+
+#include <stdint.h>
+
+#include <memory>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/memory/ptr_util.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "base/test/test_simple_task_runner.h"
+#include "components/proximity_auth/bluetooth_throttler.h"
+#include "components/proximity_auth/connection_finder.h"
+#include "components/proximity_auth/connection_observer.h"
+#include "components/proximity_auth/proximity_auth_test_util.h"
+#include "components/proximity_auth/remote_device.h"
+#include "components/proximity_auth/wire_message.h"
+#include "device/bluetooth/bluetooth_adapter_factory.h"
+#include "device/bluetooth/test/mock_bluetooth_adapter.h"
+#include "device/bluetooth/test/mock_bluetooth_device.h"
+#include "device/bluetooth/test/mock_bluetooth_discovery_session.h"
+#include "device/bluetooth/test/mock_bluetooth_gatt_characteristic.h"
+#include "device/bluetooth/test/mock_bluetooth_gatt_connection.h"
+#include "device/bluetooth/test/mock_bluetooth_gatt_notify_session.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using testing::_;
+using testing::AtLeast;
+using testing::NiceMock;
+using testing::Return;
+using testing::StrictMock;
+using testing::SaveArg;
+
+namespace proximity_auth {
+namespace {
+
+class MockBluetoothThrottler : public BluetoothThrottler {
+ public:
+  MockBluetoothThrottler() {}
+  ~MockBluetoothThrottler() override {}
+
+  MOCK_CONST_METHOD0(GetDelay, base::TimeDelta());
+  MOCK_METHOD1(OnConnection, void(Connection* connection));
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MockBluetoothThrottler);
+};
+
+class MockBluetoothLowEnergyCharacteristicsFinder
+    : public BluetoothLowEnergyCharacteristicsFinder {
+ public:
+  MockBluetoothLowEnergyCharacteristicsFinder() {}
+  ~MockBluetoothLowEnergyCharacteristicsFinder() override {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MockBluetoothLowEnergyCharacteristicsFinder);
+};
+
+class MockConnectionObserver : public ConnectionObserver {
+ public:
+  MockConnectionObserver() : num_send_completed_(0) {}
+
+  void OnConnectionStatusChanged(Connection* connection,
+                                 Connection::Status old_status,
+                                 Connection::Status new_status) override {}
+
+  void OnMessageReceived(const Connection& connection,
+                         const WireMessage& message) override {}
+
+  void OnSendCompleted(const Connection& conenction,
+                       const WireMessage& message,
+                       bool success) override {
+    last_deserialized_message_ = message.payload();
+    last_send_success_ = success;
+    num_send_completed_++;
+  }
+
+  std::string GetLastDeserializedMessage() {
+    return last_deserialized_message_;
+  }
+
+  bool GetLastSendSuccess() { return last_send_success_; }
+
+  int GetNumSendCompleted() { return num_send_completed_; }
+
+ private:
+  std::string last_deserialized_message_;
+  bool last_send_success_;
+  int num_send_completed_;
+};
+
+}  // namespace
+
+namespace weave {
+namespace {
+
+typedef BluetoothLowEnergyWeaveClientConnection::SubStatus SubStatus;
+typedef BluetoothLowEnergyWeavePacketReceiver::State ReceiverState;
+typedef BluetoothLowEnergyWeavePacketReceiver::ReceiverError ReceiverError;
+typedef BluetoothLowEnergyWeavePacketReceiver::ReceiverType ReceiverType;
+
+const char kServiceUUID[] = "DEADBEEF-CAFE-FEED-FOOD-D15EA5EBEEEF";
+const char kTXCharacteristicUUID[] = "977c6674-1239-4e72-993b-502369b8bb5a";
+const char kRXCharacteristicUUID[] = "f4b904a2-a030-43b3-98a8-221c536c03cb";
+
+const char kServiceID[] = "service id";
+const char kTXCharacteristicID[] = "TX characteristic id";
+const char kRXCharacteristicID[] = "RX characteristic id";
+
+const device::BluetoothRemoteGattCharacteristic::Properties
+    kCharacteristicProperties =
+        device::BluetoothRemoteGattCharacteristic::PROPERTY_BROADCAST |
+        device::BluetoothRemoteGattCharacteristic::PROPERTY_READ |
+        device::BluetoothRemoteGattCharacteristic::
+            PROPERTY_WRITE_WITHOUT_RESPONSE |
+        device::BluetoothRemoteGattCharacteristic::PROPERTY_INDICATE;
+
+const int kMaxNumberOfTries = 3;
+const uint16_t kLargeMaxPacketSize = 30;
+
+const uint8_t kDataHeader = 0;
+const uint8_t kConnectionRequestHeader = 1;
+const uint8_t kSmallConnectionResponseHeader = 2;
+const uint8_t kLargeConnectionResponseHeader = 3;
+const uint8_t kConnectionCloseHeader = 4;
+const uint8_t kErroneousHeader = 5;
+
+const std::string kSmallMessage = "bb";
+const std::string kLargeMessage = "aaabbb";
+const std::string kLargeMessage0 = "aaa";
+const std::string kLargeMessage1 = "bbb";
+
+const Packet kConnectionRequest{kConnectionRequestHeader};
+const Packet kSmallConnectionResponse{kSmallConnectionResponseHeader};
+const Packet kLargeConnectionResponse{kLargeConnectionResponseHeader};
+const Packet kConnectionCloseSuccess{kConnectionCloseHeader,
+                                     ReasonForClose::CLOSE_WITHOUT_ERROR};
+const Packet kConnectionCloseUnknownError{kConnectionCloseHeader,
+                                          ReasonForClose::UNKNOWN_ERROR};
+const Packet kConnectionCloseApplicationError{
+    kConnectionCloseHeader, ReasonForClose::APPLICATION_ERROR};
+
+const Packet kSmallPackets0 = Packet{kDataHeader, 'b', 'b'};
+const Packet kLargePackets0 = Packet{kDataHeader, 'a', 'a', 'a'};
+const Packet kLargePackets1 = Packet{kDataHeader, 'b', 'b', 'b'};
+const Packet kErroneousPacket = Packet{kErroneousHeader};
+
+const std::vector<Packet> kSmallPackets{kSmallPackets0};
+const std::vector<Packet> kLargePackets{kLargePackets0, kLargePackets1};
+
+class MockBluetoothLowEnergyWeavePacketGenerator
+    : public BluetoothLowEnergyWeavePacketGenerator {
+ public:
+  MockBluetoothLowEnergyWeavePacketGenerator()
+      : max_packet_size_(kDefaultMaxPacketSize) {}
+
+  Packet CreateConnectionRequest() override { return kConnectionRequest; }
+
+  Packet CreateConnectionResponse() override {
+    NOTIMPLEMENTED();
+    return Packet();
+  }
+
+  Packet CreateConnectionClose(ReasonForClose reason_for_close) override {
+    return Packet{kConnectionCloseHeader,
+                  static_cast<uint8_t>(reason_for_close)};
+  }
+
+  void SetMaxPacketSize(uint16_t size) override { max_packet_size_ = size; }
+
+  std::vector<Packet> EncodeDataMessage(std::string message) override {
+    if (message == kSmallMessage && max_packet_size_ == kDefaultMaxPacketSize) {
+      return kSmallPackets;
+    } else if (message == kLargeMessage &&
+               max_packet_size_ == kLargeMaxPacketSize) {
+      return kLargePackets;
+    } else {
+      NOTREACHED();
+      return std::vector<Packet>();
+    }
+  }
+
+  uint16_t GetMaxPacketSize() { return max_packet_size_; }
+
+ private:
+  uint16_t max_packet_size_;
+};
+
+class MockBluetoothLowEnergyWeavePacketReceiver
+    : public BluetoothLowEnergyWeavePacketReceiver {
+ public:
+  MockBluetoothLowEnergyWeavePacketReceiver()
+      : BluetoothLowEnergyWeavePacketReceiver(ReceiverType::CLIENT),
+        state_(State::CONNECTING),
+        max_packet_size_(kDefaultMaxPacketSize),
+        reason_for_close_(ReasonForClose::CLOSE_WITHOUT_ERROR),
+        reason_to_close_(ReasonForClose::CLOSE_WITHOUT_ERROR) {}
+
+  ReceiverState GetState() override { return state_; }
+
+  uint16_t GetMaxPacketSize() override { return max_packet_size_; }
+
+  ReasonForClose GetReasonForClose() override { return reason_for_close_; }
+
+  ReasonForClose GetReasonToClose() override { return reason_to_close_; }
+
+  std::string GetDataMessage() override {
+    if (max_packet_size_ == kDefaultMaxPacketSize) {
+      return kSmallMessage;
+    } else {
+      return kLargeMessage;
+    }
+  }
+
+  ReceiverError GetReceiverError() override {
+    return ReceiverError::NO_ERROR_DETECTED;
+  }
+
+  ReceiverState ReceivePacket(const Packet& packet) override {
+    switch (packet[0]) {
+      case kSmallConnectionResponseHeader:
+        max_packet_size_ = kDefaultMaxPacketSize;
+        state_ = ReceiverState::WAITING;
+        break;
+      case kLargeConnectionResponseHeader:
+        max_packet_size_ = kLargeMaxPacketSize;
+        state_ = ReceiverState::WAITING;
+        break;
+      case kConnectionCloseHeader:
+        state_ = ReceiverState::CONNECTION_CLOSED;
+        reason_for_close_ = static_cast<ReasonForClose>(packet[1]);
+        break;
+      case kDataHeader:
+        if (packet == kSmallPackets0 || packet == kLargePackets1) {
+          state_ = ReceiverState::DATA_READY;
+        } else {
+          state_ = ReceiverState::RECEIVING_DATA;
+        }
+        break;
+      default:
+        reason_to_close_ = ReasonForClose::APPLICATION_ERROR;
+        state_ = ReceiverState::ERROR_DETECTED;
+    }
+    return state_;
+  }
+
+ private:
+  ReceiverState state_;
+  uint16_t max_packet_size_;
+  ReasonForClose reason_for_close_;
+  ReasonForClose reason_to_close_;
+};
+
+class MockBluetoothLowEnergyWeavePacketGeneratorFactory
+    : public BluetoothLowEnergyWeavePacketGenerator::Factory {
+ public:
+  // most_recent_instance_ will be obsolete after the connection class
+  // destructs. Do not use if that's the case.
+  MockBluetoothLowEnergyWeavePacketGenerator* GetMostRecentInstance() {
+    return most_recent_instance_;
+  }
+
+ private:
+  std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator> BuildInstance()
+      override {
+    most_recent_instance_ = new MockBluetoothLowEnergyWeavePacketGenerator();
+    return std::unique_ptr<BluetoothLowEnergyWeavePacketGenerator>(
+        most_recent_instance_);
+  }
+
+  MockBluetoothLowEnergyWeavePacketGenerator* most_recent_instance_;
+};
+
+class MockBluetoothLowEnergyWeavePacketReceiverFactory
+    : public BluetoothLowEnergyWeavePacketReceiver::Factory {
+ public:
+  // most_recent_instance_ will be obsolete after the connection class
+  // destructs. Do not use if that's the case.
+  MockBluetoothLowEnergyWeavePacketReceiver* GetMostRecentInstance() {
+    return most_recent_instance_;
+  }
+
+ private:
+  std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> BuildInstance(
+      ReceiverType receiver_type) override {
+    most_recent_instance_ = new MockBluetoothLowEnergyWeavePacketReceiver();
+    return std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver>(
+        most_recent_instance_);
+  }
+
+  MockBluetoothLowEnergyWeavePacketReceiver* most_recent_instance_;
+};
+
+class TestBluetoothLowEnergyWeaveClientConnection
+    : public BluetoothLowEnergyWeaveClientConnection {
+ public:
+  TestBluetoothLowEnergyWeaveClientConnection(
+      const RemoteDevice& remote_device,
+      scoped_refptr<device::BluetoothAdapter> adapter,
+      const device::BluetoothUUID remote_service_uuid,
+      BluetoothThrottler* bluetooth_throttler,
+      int max_number_of_write_attempts)
+      : BluetoothLowEnergyWeaveClientConnection(remote_device,
+                                                adapter,
+                                                remote_service_uuid,
+                                                bluetooth_throttler,
+                                                max_number_of_write_attempts) {}
+
+  ~TestBluetoothLowEnergyWeaveClientConnection() override {}
+
+  MOCK_METHOD2(
+      CreateCharacteristicsFinder,
+      BluetoothLowEnergyCharacteristicsFinder*(
+          const BluetoothLowEnergyCharacteristicsFinder::SuccessCallback&
+              success,
+          const BluetoothLowEnergyCharacteristicsFinder::ErrorCallback& error));
+
+  MOCK_METHOD1(OnBytesReceived, void(const std::string& bytes));
+
+  // Exposing inherited protected methods for testing.
+  using BluetoothLowEnergyWeaveClientConnection::GattCharacteristicValueChanged;
+  using BluetoothLowEnergyWeaveClientConnection::SetTaskRunnerForTesting;
+  using BluetoothLowEnergyWeaveClientConnection::DestroyConnection;
+
+  // Exposing inherited protected fields for testing.
+  using BluetoothLowEnergyWeaveClientConnection::status;
+  using BluetoothLowEnergyWeaveClientConnection::sub_status;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TestBluetoothLowEnergyWeaveClientConnection);
+};
+
+}  // namespace
+
+class ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest
+    : public testing::Test {
+ public:
+  ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest()
+      : adapter_(new NiceMock<device::MockBluetoothAdapter>),
+        remote_device_(CreateLERemoteDeviceForTest()),
+        service_uuid_(device::BluetoothUUID(kServiceUUID)),
+        tx_characteristic_uuid_(device::BluetoothUUID(kTXCharacteristicUUID)),
+        rx_characteristic_uuid_(device::BluetoothUUID(kRXCharacteristicUUID)),
+        notify_session_alias_(NULL),
+        bluetooth_throttler_(new NiceMock<MockBluetoothThrottler>),
+        task_runner_(new base::TestSimpleTaskRunner),
+        last_completed_wire_message_("") {
+    BluetoothLowEnergyWeavePacketGenerator::Factory::SetInstanceForTesting(
+        &generator_factory_);
+    BluetoothLowEnergyWeavePacketReceiver::Factory::SetInstanceForTesting(
+        &receiver_factory_);
+  }
+
+  void SetUp() override {
+    device_ = base::WrapUnique(new NiceMock<device::MockBluetoothDevice>(
+        adapter_.get(), 0, kTestRemoteDeviceName,
+        kTestRemoteDeviceBluetoothAddress, false, false));
+
+    service_ = base::WrapUnique(new NiceMock<device::MockBluetoothGattService>(
+        device_.get(), kServiceID, service_uuid_, true, false));
+    tx_characteristic_ =
+        base::WrapUnique(new NiceMock<device::MockBluetoothGattCharacteristic>(
+            service_.get(), kTXCharacteristicID, tx_characteristic_uuid_, false,
+            kCharacteristicProperties,
+            device::BluetoothRemoteGattCharacteristic::PERMISSION_NONE));
+
+    rx_characteristic_ =
+        base::WrapUnique(new NiceMock<device::MockBluetoothGattCharacteristic>(
+            service_.get(), kRXCharacteristicID, rx_characteristic_uuid_, false,
+            kCharacteristicProperties,
+            device::BluetoothRemoteGattCharacteristic::PERMISSION_NONE));
+
+    device::BluetoothAdapterFactory::SetAdapterForTesting(adapter_);
+
+    std::vector<const device::BluetoothDevice*> devices;
+    devices.push_back(device_.get());
+    ON_CALL(*adapter_, GetDevices()).WillByDefault(Return(devices));
+    ON_CALL(*adapter_, GetDevice(kTestRemoteDeviceBluetoothAddress))
+        .WillByDefault(Return(device_.get()));
+    ON_CALL(*device_, GetGattService(kServiceID))
+        .WillByDefault(Return(service_.get()));
+    ON_CALL(*service_, GetCharacteristic(kRXCharacteristicID))
+        .WillByDefault(Return(rx_characteristic_.get()));
+    ON_CALL(*service_, GetCharacteristic(kTXCharacteristicID))
+        .WillByDefault(Return(tx_characteristic_.get()));
+  }
+
+  // Creates a BluetoothLowEnergyWeaveClientConnection and verifies it's in
+  // DISCONNECTED state.
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection>
+  CreateConnection() {
+    EXPECT_CALL(*adapter_, AddObserver(_));
+    EXPECT_CALL(*adapter_, RemoveObserver(_));
+
+    std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+        new TestBluetoothLowEnergyWeaveClientConnection(
+            remote_device_, adapter_, service_uuid_, bluetooth_throttler_.get(),
+            kMaxNumberOfTries));
+
+    EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
+    EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+
+    // Add the mock observer to observe on OnDidMessageSend.
+    connection->AddObserver(&connection_observer_);
+
+    connection->SetTaskRunnerForTesting(task_runner_);
+
+    return connection;
+  }
+
+  // Transitions |connection| from DISCONNECTED to WAITING_CHARACTERISTICS
+  // state, without an existing GATT connection.
+  void ConnectGatt(TestBluetoothLowEnergyWeaveClientConnection* connection) {
+    // Preparing |connection| for a CreateGattConnection call.
+    EXPECT_CALL(*device_, CreateGattConnection(_, _))
+        .WillOnce(DoAll(SaveArg<0>(&create_gatt_connection_success_callback_),
+                        SaveArg<1>(&create_gatt_connection_error_callback_)));
+
+    // No throttling by default
+    EXPECT_CALL(*bluetooth_throttler_, GetDelay())
+        .WillOnce(Return(base::TimeDelta()));
+
+    connection->Connect();
+
+    EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_GATT_CONNECTION);
+    EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
+
+    // Preparing |connection| to run |create_gatt_connection_success_callback_|.
+    EXPECT_FALSE(create_gatt_connection_error_callback_.is_null());
+    ASSERT_FALSE(create_gatt_connection_success_callback_.is_null());
+    EXPECT_CALL(*connection, CreateCharacteristicsFinder(_, _))
+        .WillOnce(DoAll(
+            SaveArg<0>(&characteristics_finder_success_callback_),
+            SaveArg<1>(&characteristics_finder_error_callback_),
+            Return(new NiceMock<MockBluetoothLowEnergyCharacteristicsFinder>)));
+
+    create_gatt_connection_success_callback_.Run(
+        base::WrapUnique(new NiceMock<device::MockBluetoothGattConnection>(
+            adapter_, kTestRemoteDeviceBluetoothAddress)));
+
+    EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_CHARACTERISTICS);
+    EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
+  }
+
+  // Transitions |connection| from WAITING_CHARACTERISTICS to
+  // WAITING_NOTIFY_SESSION state.
+  void CharacteristicsFound(
+      TestBluetoothLowEnergyWeaveClientConnection* connection) {
+    EXPECT_CALL(*rx_characteristic_, StartNotifySession(_, _))
+        .WillOnce(DoAll(SaveArg<0>(&notify_session_success_callback_),
+                        SaveArg<1>(&notify_session_error_callback_)));
+    EXPECT_FALSE(characteristics_finder_error_callback_.is_null());
+    ASSERT_FALSE(characteristics_finder_success_callback_.is_null());
+
+    characteristics_finder_success_callback_.Run(
+        {service_uuid_, kServiceID},
+        {tx_characteristic_uuid_, kTXCharacteristicID},
+        {rx_characteristic_uuid_, kRXCharacteristicID});
+
+    EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_NOTIFY_SESSION);
+    EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
+  }
+
+  // Transitions |connection| from WAITING_NOTIFY_SESSION to
+  // WAITING_CONNECTION_RESPONSE state.
+  void NotifySessionStarted(
+      TestBluetoothLowEnergyWeaveClientConnection* connection) {
+    EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
+        .WillOnce(
+            DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
+                  SaveArg<1>(&write_remote_characteristic_success_callback_),
+                  SaveArg<2>(&write_remote_characteristic_error_callback_)));
+    EXPECT_FALSE(notify_session_error_callback_.is_null());
+    ASSERT_FALSE(notify_session_success_callback_.is_null());
+
+    // Store an alias for the notify session passed |connection|.
+    std::unique_ptr<device::MockBluetoothGattNotifySession> notify_session(
+        new NiceMock<device::MockBluetoothGattNotifySession>(
+            kTXCharacteristicID));
+    notify_session_alias_ = notify_session.get();
+
+    notify_session_success_callback_.Run(std::move(notify_session));
+    task_runner_->RunUntilIdle();
+
+    // Written value contains only the mock Connection Request.
+    EXPECT_EQ(last_value_written_on_tx_characteristic_, kConnectionRequest);
+
+    EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_CONNECTION_RESPONSE);
+    EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
+  }
+
+  // Transitions |connection| from WAITING_CONNECTION_RESPONSE to CONNECTED.
+  void ConnectionResponseReceived(
+      TestBluetoothLowEnergyWeaveClientConnection* connection,
+      uint16_t selected_packet_size) {
+    // Written value contains only the mock Connection Request.
+    EXPECT_EQ(last_value_written_on_tx_characteristic_, kConnectionRequest);
+
+    // OnDidSendMessage is not called.
+    EXPECT_EQ(0, connection_observer_.GetNumSendCompleted());
+
+    RunWriteCharacteristicSuccessCallback();
+
+    // Received Connection Response.
+    if (selected_packet_size == kDefaultMaxPacketSize) {
+      connection->GattCharacteristicValueChanged(
+          adapter_.get(), rx_characteristic_.get(), kSmallConnectionResponse);
+      EXPECT_EQ(receiver_factory_.GetMostRecentInstance()->GetMaxPacketSize(),
+                kDefaultMaxPacketSize);
+      EXPECT_EQ(generator_factory_.GetMostRecentInstance()->GetMaxPacketSize(),
+                kDefaultMaxPacketSize);
+    } else if (selected_packet_size == kLargeMaxPacketSize) {
+      connection->GattCharacteristicValueChanged(
+          adapter_.get(), rx_characteristic_.get(), kLargeConnectionResponse);
+      EXPECT_EQ(receiver_factory_.GetMostRecentInstance()->GetMaxPacketSize(),
+                kLargeMaxPacketSize);
+      EXPECT_EQ(generator_factory_.GetMostRecentInstance()->GetMaxPacketSize(),
+                kLargeMaxPacketSize);
+    } else {
+      NOTREACHED();
+    }
+
+    EXPECT_EQ(connection->sub_status(), SubStatus::CONNECTED);
+    EXPECT_EQ(connection->status(), Connection::CONNECTED);
+  }
+
+  // Transitions |connection| to a DISCONNECTED state regardless of its initial
+  // state.
+  void Disconnect(TestBluetoothLowEnergyWeaveClientConnection* connection) {
+    // A notify session was previously set.
+    if (notify_session_alias_)
+      EXPECT_CALL(*notify_session_alias_, Stop(_));
+
+    if (connection->sub_status() == SubStatus::CONNECTED) {
+      EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
+          .WillOnce(
+              DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
+                    SaveArg<1>(&write_remote_characteristic_success_callback_),
+                    SaveArg<2>(&write_remote_characteristic_error_callback_)));
+    }
+
+    connection->Disconnect();
+
+    if (connection->sub_status() == SubStatus::CONNECTED) {
+      connection->DestroyConnection();
+      EXPECT_EQ(last_value_written_on_tx_characteristic_,
+                kConnectionCloseSuccess);
+      RunWriteCharacteristicSuccessCallback();
+    }
+
+    EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
+    EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  }
+
+  void InitializeConnection(
+      TestBluetoothLowEnergyWeaveClientConnection* connection,
+      uint32_t selected_packet_size) {
+    ConnectGatt(connection);
+    CharacteristicsFound(connection);
+    NotifySessionStarted(connection);
+    ConnectionResponseReceived(connection, selected_packet_size);
+  }
+
+  void RunWriteCharacteristicSuccessCallback() {
+    EXPECT_FALSE(write_remote_characteristic_error_callback_.is_null());
+    ASSERT_FALSE(write_remote_characteristic_success_callback_.is_null());
+    write_remote_characteristic_success_callback_.Run();
+  }
+
+ protected:
+  scoped_refptr<device::MockBluetoothAdapter> adapter_;
+  RemoteDevice remote_device_;
+  device::BluetoothUUID service_uuid_;
+  device::BluetoothUUID tx_characteristic_uuid_;
+  device::BluetoothUUID rx_characteristic_uuid_;
+  std::unique_ptr<device::MockBluetoothDevice> device_;
+  std::unique_ptr<device::MockBluetoothGattService> service_;
+  std::unique_ptr<device::MockBluetoothGattCharacteristic> tx_characteristic_;
+  std::unique_ptr<device::MockBluetoothGattCharacteristic> rx_characteristic_;
+  std::vector<uint8_t> last_value_written_on_tx_characteristic_;
+  device::MockBluetoothGattNotifySession* notify_session_alias_;
+  std::unique_ptr<MockBluetoothThrottler> bluetooth_throttler_;
+  scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
+  base::MessageLoop message_loop_;
+  WireMessage last_completed_wire_message_;
+  bool last_wire_message_success_;
+  MockBluetoothLowEnergyWeavePacketGeneratorFactory generator_factory_;
+  MockBluetoothLowEnergyWeavePacketReceiverFactory receiver_factory_;
+  MockConnectionObserver connection_observer_;
+
+  // Callbacks
+  device::BluetoothDevice::GattConnectionCallback
+      create_gatt_connection_success_callback_;
+  device::BluetoothDevice::ConnectErrorCallback
+      create_gatt_connection_error_callback_;
+
+  BluetoothLowEnergyCharacteristicsFinder::SuccessCallback
+      characteristics_finder_success_callback_;
+  BluetoothLowEnergyCharacteristicsFinder::ErrorCallback
+      characteristics_finder_error_callback_;
+
+  device::BluetoothRemoteGattCharacteristic::NotifySessionCallback
+      notify_session_success_callback_;
+  device::BluetoothRemoteGattCharacteristic::ErrorCallback
+      notify_session_error_callback_;
+
+  base::Closure write_remote_characteristic_success_callback_;
+  device::BluetoothRemoteGattCharacteristic::ErrorCallback
+      write_remote_characteristic_error_callback_;
+};
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       CreateAndDestroyWithoutConnectCallDoesntCrash) {
+  BluetoothLowEnergyWeaveClientConnection connection(
+      remote_device_, adapter_, service_uuid_, bluetooth_throttler_.get(),
+      kMaxNumberOfTries);
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       DisconectWithoutConnectDoesntCrash) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+  Disconnect(connection.get());
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       ConnectSuccess) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+  ConnectGatt(connection.get());
+  CharacteristicsFound(connection.get());
+  NotifySessionStarted(connection.get());
+  ConnectionResponseReceived(connection.get(), kDefaultMaxPacketSize);
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       ConnectSuccessDisconnect) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+  InitializeConnection(connection.get(), kDefaultMaxPacketSize);
+  EXPECT_EQ(connection->sub_status(), SubStatus::CONNECTED);
+  Disconnect(connection.get());
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       ConnectIncompleteDisconnectFromWaitingCharacteristicsState) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+  ConnectGatt(connection.get());
+  Disconnect(connection.get());
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       ConnectIncompleteDisconnectFromWaitingNotifySessionState) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+  ConnectGatt(connection.get());
+  CharacteristicsFound(connection.get());
+  Disconnect(connection.get());
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       ConnectIncompleteDisconnectFromWaitingConnectionResponseState) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+  ConnectGatt(connection.get());
+  CharacteristicsFound(connection.get());
+  NotifySessionStarted(connection.get());
+  Disconnect(connection.get());
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       ConnectFailsCharacteristicsNotFound) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+  ConnectGatt(connection.get());
+
+  EXPECT_CALL(*rx_characteristic_, StartNotifySession(_, _)).Times(0);
+  EXPECT_FALSE(characteristics_finder_success_callback_.is_null());
+  ASSERT_FALSE(characteristics_finder_error_callback_.is_null());
+
+  characteristics_finder_error_callback_.Run(
+      {tx_characteristic_uuid_, kTXCharacteristicID},
+      {rx_characteristic_uuid_, kRXCharacteristicID});
+
+  EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       ConnectFailsNotifySessionError) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+  ConnectGatt(connection.get());
+  CharacteristicsFound(connection.get());
+
+  EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _)).Times(0);
+  EXPECT_FALSE(notify_session_success_callback_.is_null());
+  ASSERT_FALSE(notify_session_error_callback_.is_null());
+
+  notify_session_error_callback_.Run(
+      device::BluetoothRemoteGattService::GATT_ERROR_UNKNOWN);
+
+  EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       ConnectFailsErrorSendingConnectionRequest) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+  ConnectGatt(connection.get());
+  CharacteristicsFound(connection.get());
+  NotifySessionStarted(connection.get());
+
+  // |connection| will call WriteRemoteCharacteristics(_,_) to try to send the
+  // message |kMaxNumberOfTries| times. There is alredy one EXPECTA_CALL for
+  // WriteRemoteCharacteristic(_,_,_) in NotifySessionStated, that's why we use
+  // |kMaxNumberOfTries-1| in the EXPECT_CALL statement.
+  EXPECT_EQ(0, connection_observer_.GetNumSendCompleted());
+  EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
+      .Times(kMaxNumberOfTries - 1)
+      .WillRepeatedly(
+          DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
+                SaveArg<1>(&write_remote_characteristic_success_callback_),
+                SaveArg<2>(&write_remote_characteristic_error_callback_)));
+
+  for (int i = 0; i < kMaxNumberOfTries; i++) {
+    EXPECT_EQ(last_value_written_on_tx_characteristic_, kConnectionRequest);
+    ASSERT_FALSE(write_remote_characteristic_error_callback_.is_null());
+    EXPECT_FALSE(write_remote_characteristic_success_callback_.is_null());
+    write_remote_characteristic_error_callback_.Run(
+        device::BluetoothRemoteGattService::GATT_ERROR_UNKNOWN);
+  }
+
+  EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       ReceiveMessageSmallerThanCharacteristicSize) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+  InitializeConnection(connection.get(), kDefaultMaxPacketSize);
+
+  std::string received_bytes;
+  EXPECT_CALL(*connection, OnBytesReceived(_))
+      .WillOnce(SaveArg<0>(&received_bytes));
+
+  connection->GattCharacteristicValueChanged(
+      adapter_.get(), rx_characteristic_.get(), kSmallPackets0);
+
+  EXPECT_EQ(received_bytes, kSmallMessage);
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       ReceiveMessageLargerThanCharacteristicSize) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+
+  InitializeConnection(connection.get(), kLargeMaxPacketSize);
+
+  std::string received_bytes;
+  EXPECT_CALL(*connection, OnBytesReceived(_))
+      .WillOnce(SaveArg<0>(&received_bytes));
+
+  std::vector<Packet> packets = kLargePackets;
+
+  for (auto packet : packets) {
+    connection->GattCharacteristicValueChanged(
+        adapter_.get(), rx_characteristic_.get(), packet);
+  }
+  EXPECT_EQ(received_bytes, kLargeMessage);
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       SendMessageSmallerThanCharacteristicSize) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+  InitializeConnection(connection.get(), kDefaultMaxPacketSize);
+
+  // Expecting a first call of WriteRemoteCharacteristic, after SendMessage is
+  // called.
+  EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
+      .WillOnce(
+          DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
+                SaveArg<1>(&write_remote_characteristic_success_callback_),
+                SaveArg<2>(&write_remote_characteristic_error_callback_)));
+
+  connection->SendMessage(base::WrapUnique(new FakeWireMessage(kSmallMessage)));
+
+  EXPECT_EQ(last_value_written_on_tx_characteristic_, kSmallPackets0);
+
+  RunWriteCharacteristicSuccessCallback();
+
+  EXPECT_EQ(1, connection_observer_.GetNumSendCompleted());
+  EXPECT_EQ(kSmallMessage, connection_observer_.GetLastDeserializedMessage());
+  EXPECT_TRUE(connection_observer_.GetLastSendSuccess());
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       SendMessageLargerThanCharacteristicSize) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+
+  InitializeConnection(connection.get(), kLargeMaxPacketSize);
+
+  // Expecting a first call of WriteRemoteCharacteristic, after SendMessage is
+  // called.
+  EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
+      .WillOnce(
+          DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
+                SaveArg<1>(&write_remote_characteristic_success_callback_),
+                SaveArg<2>(&write_remote_characteristic_error_callback_)));
+
+  connection->SendMessage(base::WrapUnique(new FakeWireMessage(kLargeMessage)));
+
+  EXPECT_EQ(last_value_written_on_tx_characteristic_, kLargePackets0);
+  std::vector<uint8_t> bytes_received(
+      last_value_written_on_tx_characteristic_.begin() + 1,
+      last_value_written_on_tx_characteristic_.end());
+
+  EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
+      .WillOnce(
+          DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
+                SaveArg<1>(&write_remote_characteristic_success_callback_),
+                SaveArg<2>(&write_remote_characteristic_error_callback_)));
+
+  RunWriteCharacteristicSuccessCallback();
+  bytes_received.insert(bytes_received.end(),
+                        last_value_written_on_tx_characteristic_.begin() + 1,
+                        last_value_written_on_tx_characteristic_.end());
+
+  std::vector<uint8_t> expected(kLargeMessage.begin(), kLargeMessage.end());
+  EXPECT_EQ(expected, bytes_received);
+
+  RunWriteCharacteristicSuccessCallback();
+
+  EXPECT_EQ(1, connection_observer_.GetNumSendCompleted());
+  EXPECT_EQ(kLargeMessage, connection_observer_.GetLastDeserializedMessage());
+  EXPECT_TRUE(connection_observer_.GetLastSendSuccess());
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       SendMessageKeepsFailing) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+  InitializeConnection(connection.get(), kDefaultMaxPacketSize);
+
+  EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
+      .Times(kMaxNumberOfTries)
+      .WillRepeatedly(
+          DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
+                SaveArg<1>(&write_remote_characteristic_success_callback_),
+                SaveArg<2>(&write_remote_characteristic_error_callback_)));
+
+  connection->SendMessage(base::WrapUnique(new FakeWireMessage(kSmallMessage)));
+
+  for (int i = 0; i < kMaxNumberOfTries; i++) {
+    EXPECT_EQ(last_value_written_on_tx_characteristic_, kSmallPackets0);
+    ASSERT_FALSE(write_remote_characteristic_error_callback_.is_null());
+    EXPECT_FALSE(write_remote_characteristic_success_callback_.is_null());
+    write_remote_characteristic_error_callback_.Run(
+        device::BluetoothRemoteGattService::GATT_ERROR_UNKNOWN);
+    if (i == kMaxNumberOfTries - 1) {
+      EXPECT_EQ(1, connection_observer_.GetNumSendCompleted());
+      EXPECT_EQ(kSmallMessage,
+                connection_observer_.GetLastDeserializedMessage());
+      EXPECT_FALSE(connection_observer_.GetLastSendSuccess());
+    } else {
+      EXPECT_EQ(0, connection_observer_.GetNumSendCompleted());
+    }
+  }
+
+  EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       ReceiveCloseConnectionTest) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+  InitializeConnection(connection.get(), kDefaultMaxPacketSize);
+
+  connection->GattCharacteristicValueChanged(
+      adapter_.get(), rx_characteristic_.get(), kConnectionCloseUnknownError);
+
+  EXPECT_EQ(receiver_factory_.GetMostRecentInstance()->GetReasonForClose(),
+            ReasonForClose::UNKNOWN_ERROR);
+  EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       ReceiverErrorTest) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+
+  InitializeConnection(connection.get(), kDefaultMaxPacketSize);
+
+  EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
+      .WillOnce(
+          DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
+                SaveArg<1>(&write_remote_characteristic_success_callback_),
+                SaveArg<2>(&write_remote_characteristic_error_callback_)));
+
+  connection->GattCharacteristicValueChanged(
+      adapter_.get(), rx_characteristic_.get(), kErroneousPacket);
+
+  EXPECT_EQ(last_value_written_on_tx_characteristic_,
+            kConnectionCloseApplicationError);
+  EXPECT_EQ(receiver_factory_.GetMostRecentInstance()->GetReasonToClose(),
+            ReasonForClose::APPLICATION_ERROR);
+
+  RunWriteCharacteristicSuccessCallback();
+  EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       ReceiverErrorWithPendingWritesTest) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+
+  InitializeConnection(connection.get(), kLargeMaxPacketSize);
+
+  EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
+      .WillOnce(
+          DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
+                SaveArg<1>(&write_remote_characteristic_success_callback_),
+                SaveArg<2>(&write_remote_characteristic_error_callback_)));
+
+  connection->SendMessage(base::WrapUnique(new FakeWireMessage(kLargeMessage)));
+
+  connection->GattCharacteristicValueChanged(
+      adapter_.get(), rx_characteristic_.get(), kErroneousPacket);
+
+  EXPECT_EQ(last_value_written_on_tx_characteristic_, kLargePackets0);
+
+  EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
+      .WillOnce(
+          DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
+                SaveArg<1>(&write_remote_characteristic_success_callback_),
+                SaveArg<2>(&write_remote_characteristic_error_callback_)));
+
+  RunWriteCharacteristicSuccessCallback();
+
+  EXPECT_EQ(last_value_written_on_tx_characteristic_,
+            kConnectionCloseApplicationError);
+  EXPECT_EQ(receiver_factory_.GetMostRecentInstance()->GetReasonToClose(),
+            ReasonForClose::APPLICATION_ERROR);
+
+  RunWriteCharacteristicSuccessCallback();
+  EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       WriteConnectionCloseMaxNumberOfTimes) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+
+  InitializeConnection(connection.get(), kDefaultMaxPacketSize);
+  EXPECT_EQ(connection->sub_status(), SubStatus::CONNECTED);
+
+  EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
+      .WillOnce(
+          DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
+                SaveArg<1>(&write_remote_characteristic_success_callback_),
+                SaveArg<2>(&write_remote_characteristic_error_callback_)));
+  connection->Disconnect();
+  EXPECT_EQ(connection->sub_status(), SubStatus::CONNECTED);
+
+  for (int i = 0; i < kMaxNumberOfTries; i++) {
+    EXPECT_EQ(last_value_written_on_tx_characteristic_,
+              kConnectionCloseSuccess);
+    ASSERT_FALSE(write_remote_characteristic_error_callback_.is_null());
+    EXPECT_FALSE(write_remote_characteristic_success_callback_.is_null());
+
+    if (i != kMaxNumberOfTries - 1) {
+      EXPECT_CALL(*tx_characteristic_, WriteRemoteCharacteristic(_, _, _))
+          .WillOnce(
+              DoAll(SaveArg<0>(&last_value_written_on_tx_characteristic_),
+                    SaveArg<1>(&write_remote_characteristic_success_callback_),
+                    SaveArg<2>(&write_remote_characteristic_error_callback_)));
+    }
+
+    write_remote_characteristic_error_callback_.Run(
+        device::BluetoothRemoteGattService::GATT_ERROR_UNKNOWN);
+  }
+
+  EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+}
+
+TEST_F(ProximityAuthBluetoothLowEnergyWeaveClientConnectionTest,
+       ConnectAfterADelayWhenThrottled) {
+  std::unique_ptr<TestBluetoothLowEnergyWeaveClientConnection> connection(
+      CreateConnection());
+
+  EXPECT_CALL(*bluetooth_throttler_, GetDelay())
+      .WillOnce(Return(base::TimeDelta(base::TimeDelta::FromSeconds(1))));
+  EXPECT_CALL(*device_, CreateGattConnection(_, _))
+      .WillOnce(DoAll(SaveArg<0>(&create_gatt_connection_success_callback_),
+                      SaveArg<1>(&create_gatt_connection_error_callback_)));
+
+  // No GATT connection should be created before the delay.
+  connection->Connect();
+  EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_GATT_CONNECTION);
+  EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
+  EXPECT_TRUE(create_gatt_connection_error_callback_.is_null());
+  EXPECT_TRUE(create_gatt_connection_success_callback_.is_null());
+
+  // A GATT connection should be created after the delay.
+  task_runner_->RunUntilIdle();
+  EXPECT_FALSE(create_gatt_connection_error_callback_.is_null());
+  ASSERT_FALSE(create_gatt_connection_success_callback_.is_null());
+
+  // Preparing |connection| to run |create_gatt_connection_success_callback_|.
+  EXPECT_CALL(*connection, CreateCharacteristicsFinder(_, _))
+      .WillOnce(DoAll(
+          SaveArg<0>(&characteristics_finder_success_callback_),
+          SaveArg<1>(&characteristics_finder_error_callback_),
+          Return(new NiceMock<MockBluetoothLowEnergyCharacteristicsFinder>)));
+
+  create_gatt_connection_success_callback_.Run(
+      base::WrapUnique(new NiceMock<device::MockBluetoothGattConnection>(
+          adapter_, kTestRemoteDeviceBluetoothAddress)));
+
+  CharacteristicsFound(connection.get());
+  NotifySessionStarted(connection.get());
+  ConnectionResponseReceived(connection.get(), kDefaultMaxPacketSize);
+}
+
+}  // namespace weave
+
+}  // namespace proximity_auth
diff --git a/components/safe_browsing_db/v4_local_database_manager.cc b/components/safe_browsing_db/v4_local_database_manager.cc
index 3f6fb3c..8432b4b 100644
--- a/components/safe_browsing_db/v4_local_database_manager.cc
+++ b/components/safe_browsing_db/v4_local_database_manager.cc
@@ -261,8 +261,10 @@
 }
 
 void V4LocalDatabaseManager::DatabaseUpdated() {
-  v4_update_protocol_manager_->ScheduleNextUpdate(
-      v4_database_->GetStoreStateMap());
+  if (enabled_) {
+    v4_update_protocol_manager_->ScheduleNextUpdate(
+        v4_database_->GetStoreStateMap());
+  }
 }
 
 }  // namespace safe_browsing
diff --git a/content/browser/background_sync/background_sync_browsertest.cc b/content/browser/background_sync/background_sync_browsertest.cc
index 91450a6c..db7d12f 100644
--- a/content/browser/background_sync/background_sync_browsertest.cc
+++ b/content/browser/background_sync/background_sync_browsertest.cc
@@ -90,7 +90,7 @@
     const std::string& tag,
     const base::Callback<void(bool)>& callback,
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   ASSERT_EQ(SERVICE_WORKER_OK, status);
   int64_t service_worker_id = registration->id();
   BackgroundSyncManager* sync_manager = sync_context->background_sync_manager();
diff --git a/content/browser/background_sync/background_sync_manager.cc b/content/browser/background_sync/background_sync_manager.cc
index 390983c..859c530 100644
--- a/content/browser/background_sync/background_sync_manager.cc
+++ b/content/browser/background_sync/background_sync_manager.cc
@@ -974,7 +974,8 @@
     const base::Closure& event_fired_callback,
     const base::Closure& event_completed_callback,
     ServiceWorkerStatusCode service_worker_status,
-    scoped_refptr<ServiceWorkerRegistration> service_worker_registration) {
+    const scoped_refptr<ServiceWorkerRegistration>&
+        service_worker_registration) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   if (service_worker_status != SERVICE_WORKER_OK) {
     base::ThreadTaskRunnerHandle::Get()->PostTask(
diff --git a/content/browser/background_sync/background_sync_manager.h b/content/browser/background_sync/background_sync_manager.h
index f31a83a..52391a2 100644
--- a/content/browser/background_sync/background_sync_manager.h
+++ b/content/browser/background_sync/background_sync_manager.h
@@ -249,7 +249,8 @@
       const base::Closure& event_fired_callback,
       const base::Closure& event_completed_callback,
       ServiceWorkerStatusCode service_worker_status,
-      scoped_refptr<ServiceWorkerRegistration> service_worker_registration);
+      const scoped_refptr<ServiceWorkerRegistration>&
+          service_worker_registration);
   void FireReadyEventsAllEventsFiring(const base::Closure& callback);
 
   // Called when a sync event has completed.
diff --git a/content/browser/background_sync/background_sync_manager_unittest.cc b/content/browser/background_sync/background_sync_manager_unittest.cc
index a5c8b14..f4acfb7 100644
--- a/content/browser/background_sync/background_sync_manager_unittest.cc
+++ b/content/browser/background_sync/background_sync_manager_unittest.cc
@@ -66,9 +66,9 @@
 void FindServiceWorkerRegistrationCallback(
     scoped_refptr<ServiceWorkerRegistration>* out_registration,
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   EXPECT_EQ(SERVICE_WORKER_OK, status) << ServiceWorkerStatusToString(status);
-  *out_registration = std::move(registration);
+  *out_registration = registration;
 }
 
 void UnregisterServiceWorkerCallback(bool* called,
diff --git a/content/browser/background_sync/background_sync_service_impl_unittest.cc b/content/browser/background_sync/background_sync_service_impl_unittest.cc
index a7f1e46..64db7980 100644
--- a/content/browser/background_sync/background_sync_service_impl_unittest.cc
+++ b/content/browser/background_sync/background_sync_service_impl_unittest.cc
@@ -51,9 +51,9 @@
 void FindServiceWorkerRegistrationCallback(
     scoped_refptr<ServiceWorkerRegistration>* out_registration,
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   EXPECT_EQ(SERVICE_WORKER_OK, status) << ServiceWorkerStatusToString(status);
-  *out_registration = std::move(registration);
+  *out_registration = registration;
 }
 
 // Callbacks from BackgroundSyncServiceImpl methods
diff --git a/content/browser/browser_associated_interface_unittest.cc b/content/browser/browser_associated_interface_unittest.cc
new file mode 100644
index 0000000..0c73a71
--- /dev/null
+++ b/content/browser/browser_associated_interface_unittest.cc
@@ -0,0 +1,170 @@
+// 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 <memory>
+#include <string>
+
+#include "base/memory/ref_counted.h"
+#include "base/message_loop/message_loop.h"
+#include "base/pickle.h"
+#include "base/run_loop.h"
+#include "base/single_thread_task_runner.h"
+#include "base/strings/stringprintf.h"
+#include "base/threading/thread.h"
+#include "content/public/browser/browser_associated_interface.h"
+#include "content/public/browser/browser_message_filter.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "content/test/test_browser_associated_interfaces.mojom.h"
+#include "ipc/ipc_channel_factory.h"
+#include "ipc/ipc_channel_mojo.h"
+#include "ipc/ipc_channel_proxy.h"
+#include "ipc/ipc_listener.h"
+#include "ipc/ipc_message.h"
+#include "mojo/public/cpp/system/message_pipe.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace content {
+
+const int kNumTestMessages = 100;
+
+class BrowserAssociatedInterfaceTest : public testing::Test {
+ public:
+  static void AddFilterToChannel(BrowserMessageFilter* filter,
+                                 IPC::ChannelProxy* channel) {
+    filter->RegisterAssociatedInterfaces(channel);
+    channel->AddFilter(filter->GetFilter());
+  }
+};
+
+class ProxyRunner : public IPC::Listener {
+ public:
+  ProxyRunner(mojo::ScopedMessagePipeHandle pipe,
+              bool for_server,
+              scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner) {
+    std::unique_ptr<IPC::ChannelFactory> factory;
+    if (for_server) {
+      factory = IPC::ChannelMojo::CreateServerFactory(
+          std::move(pipe), ipc_task_runner);
+    } else {
+      factory = IPC::ChannelMojo::CreateClientFactory(
+          std::move(pipe), ipc_task_runner);
+    }
+    channel_ = IPC::ChannelProxy::Create(
+        std::move(factory), this, ipc_task_runner);
+  }
+
+  void ShutDown() { channel_.reset(); }
+
+  IPC::ChannelProxy* channel() { return channel_.get(); }
+
+ private:
+  // IPC::Listener:
+  bool OnMessageReceived(const IPC::Message& message) override { return false; }
+
+  std::unique_ptr<IPC::ChannelProxy> channel_;
+};
+
+class TestDriverMessageFilter
+    : public BrowserMessageFilter,
+      public BrowserAssociatedInterface<
+          mojom::BrowserAssociatedInterfaceTestDriver>,
+      public mojom::BrowserAssociatedInterfaceTestDriver {
+ public:
+  TestDriverMessageFilter()
+      : BrowserMessageFilter(0),
+        BrowserAssociatedInterface<mojom::BrowserAssociatedInterfaceTestDriver>(
+            this, this) {
+  }
+
+ private:
+  ~TestDriverMessageFilter() override {}
+
+  // BrowserMessageFilter:
+  bool OnMessageReceived(const IPC::Message& message) override {
+    std::string actual_string;
+    base::PickleIterator iter(message);
+    EXPECT_TRUE(iter.ReadString(&actual_string));
+    EXPECT_EQ(next_expected_string_, actual_string);
+    message_count_++;
+    return true;
+  }
+
+  // mojom::BrowserAssociatedInterfaceTestDriver:
+  void ExpectString(const std::string& expected) override {
+    next_expected_string_ = expected;
+  }
+
+  void RequestQuit(const RequestQuitCallback& callback) override {
+    EXPECT_EQ(kNumTestMessages, message_count_);
+    callback.Run();
+    base::MessageLoop::current()->QuitWhenIdle();
+  }
+
+  std::string next_expected_string_;
+  int message_count_ = 0;
+};
+
+class TestClientRunner {
+ public:
+  explicit TestClientRunner(mojo::ScopedMessagePipeHandle pipe)
+      : client_thread_("Test client") {
+    client_thread_.Start();
+    client_thread_.task_runner()->PostTask(
+        FROM_HERE, base::Bind(&RunTestClient, base::Passed(&pipe)));
+  }
+
+  ~TestClientRunner() {
+    client_thread_.Stop();
+    base::RunLoop().RunUntilIdle();
+  }
+
+ private:
+  static void RunTestClient(mojo::ScopedMessagePipeHandle pipe) {
+    base::Thread io_thread("Client IO thread");
+    io_thread.StartWithOptions(
+        base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
+    ProxyRunner proxy(std::move(pipe), false, io_thread.task_runner());
+
+    mojom::BrowserAssociatedInterfaceTestDriverAssociatedPtr driver;
+    proxy.channel()->GetRemoteAssociatedInterface(&driver);
+
+    for (int i = 0; i < kNumTestMessages; ++i) {
+      std::string next_message = base::StringPrintf("test %d", i);
+      driver->ExpectString(next_message);
+
+      std::unique_ptr<IPC::Message> message(new IPC::Message);
+      message->WriteString(next_message);
+      proxy.channel()->Send(message.release());
+    }
+
+    driver->RequestQuit(base::MessageLoop::QuitWhenIdleClosure());
+
+    base::MessageLoop::ScopedNestableTaskAllower allow_nested_loops(
+        base::MessageLoop::current());
+    base::RunLoop().Run();
+
+    proxy.ShutDown();
+    io_thread.Stop();
+    base::RunLoop().RunUntilIdle();
+  }
+
+  base::Thread client_thread_;
+};
+
+TEST_F(BrowserAssociatedInterfaceTest, Basic) {
+  TestBrowserThreadBundle browser_threads_;
+  mojo::MessagePipe pipe;
+  ProxyRunner proxy(std::move(pipe.handle0), true,
+                    BrowserThread::GetTaskRunnerForThread(BrowserThread::IO));
+  AddFilterToChannel(new TestDriverMessageFilter, proxy.channel());
+
+  TestClientRunner client(std::move(pipe.handle1));
+  base::RunLoop().Run();
+
+  proxy.ShutDown();
+  base::RunLoop().RunUntilIdle();
+}
+
+}  // namespace content
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc
index 1827ba8e..527ad4f 100644
--- a/content/browser/compositor/gpu_process_transport_factory.cc
+++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -730,6 +730,19 @@
     data->begin_frame_source->SetAuthoritativeVSyncInterval(interval);
 }
 
+void GpuProcessTransportFactory::SetDisplayVSyncParameters(
+    ui::Compositor* compositor,
+    base::TimeTicks timebase,
+    base::TimeDelta interval) {
+  PerCompositorDataMap::iterator it = per_compositor_data_.find(compositor);
+  if (it == per_compositor_data_.end())
+    return;
+  PerCompositorData* data = it->second;
+  DCHECK(data);
+  if (data->begin_frame_source)
+    data->begin_frame_source->OnUpdateVSyncParameters(timebase, interval);
+}
+
 void GpuProcessTransportFactory::SetOutputIsSecure(ui::Compositor* compositor,
                                                    bool secure) {
   PerCompositorDataMap::iterator it = per_compositor_data_.find(compositor);
diff --git a/content/browser/compositor/gpu_process_transport_factory.h b/content/browser/compositor/gpu_process_transport_factory.h
index 797d99e..de913bc 100644
--- a/content/browser/compositor/gpu_process_transport_factory.h
+++ b/content/browser/compositor/gpu_process_transport_factory.h
@@ -68,6 +68,9 @@
                             const gfx::ColorSpace& color_space) override;
   void SetAuthoritativeVSyncInterval(ui::Compositor* compositor,
                                      base::TimeDelta interval) override;
+  void SetDisplayVSyncParameters(ui::Compositor* compositor,
+                                 base::TimeTicks timebase,
+                                 base::TimeDelta interval) override;
   void SetOutputIsSecure(ui::Compositor* compositor, bool secure) override;
   void AddObserver(ui::ContextFactoryObserver* observer) override;
   void RemoveObserver(ui::ContextFactoryObserver* observer) override;
diff --git a/content/browser/devtools/protocol/service_worker_handler.cc b/content/browser/devtools/protocol/service_worker_handler.cc
index 127b0c0..b9f528fd 100644
--- a/content/browser/devtools/protocol/service_worker_handler.cc
+++ b/content/browser/devtools/protocol/service_worker_handler.cc
@@ -269,7 +269,7 @@
     const std::string& tag,
     bool last_chance,
     ServiceWorkerStatusCode status,
-    scoped_refptr<content::ServiceWorkerRegistration> registration) {
+    const scoped_refptr<content::ServiceWorkerRegistration>& registration) {
   if (status != SERVICE_WORKER_OK || !registration->active_version())
     return;
   BackgroundSyncManager* background_sync_manager =
@@ -279,7 +279,7 @@
   // Keep the registration while dispatching the sync event.
   background_sync_manager->EmulateDispatchSyncEvent(
       tag, std::move(version), last_chance,
-      base::Bind(&StatusNoOpKeepingRegistration, std::move(registration)));
+      base::Bind(&StatusNoOpKeepingRegistration, registration));
 }
 
 void DispatchSyncEventOnIO(scoped_refptr<ServiceWorkerContextWrapper> context,
diff --git a/content/browser/frame_host/interstitial_page_impl_browsertest.cc b/content/browser/frame_host/interstitial_page_impl_browsertest.cc
index b660e52..cc2ac14 100644
--- a/content/browser/frame_host/interstitial_page_impl_browsertest.cc
+++ b/content/browser/frame_host/interstitial_page_impl_browsertest.cc
@@ -240,7 +240,13 @@
   DISALLOW_COPY_AND_ASSIGN(InterstitialPageImplTest);
 };
 
-IN_PROC_BROWSER_TEST_F(InterstitialPageImplTest, Cut) {
+// Has errors on TSan. See https://crbug.com/631322.
+#if defined(THREAD_SANITIZER)
+#define MAYBE_Cut DISABLED_Cut
+#else
+#define MAYBE_Cut Cut
+#endif
+IN_PROC_BROWSER_TEST_F(InterstitialPageImplTest, MAYBE_Cut) {
   SetUpInterstitialPage();
 
   ASSERT_TRUE(CreateInputAndSetText("text-to-cut"));
diff --git a/content/browser/frame_host/navigation_controller_impl.h b/content/browser/frame_host/navigation_controller_impl.h
index 06d609c..7c6718e9 100644
--- a/content/browser/frame_host/navigation_controller_impl.h
+++ b/content/browser/frame_host/navigation_controller_impl.h
@@ -345,10 +345,6 @@
   // true before calling this.
   void PruneAllButLastCommittedInternal();
 
-  // Returns true if the navigation is likley to be automatic rather than
-  // user-initiated.
-  bool IsLikelyAutoNavigation(base::TimeTicks now);
-
   // Inserts up to |max_index| entries from |source| into this. This does NOT
   // adjust any of the members that reference entries_
   // (last_committed_entry_index_, pending_entry_index_ or
diff --git a/content/browser/frame_host/navigation_entry_impl.cc b/content/browser/frame_host/navigation_entry_impl.cc
index cecfb10..aafda050 100644
--- a/content/browser/frame_host/navigation_entry_impl.cc
+++ b/content/browser/frame_host/navigation_entry_impl.cc
@@ -51,8 +51,8 @@
   ExplodedPageState page_state;
   page_state.top = state;
   std::string data;
-  if (EncodePageState(page_state, &data))
-    node->frame_entry->set_page_state(PageState::CreateFromEncodedData(data));
+  EncodePageState(page_state, &data);
+  node->frame_entry->set_page_state(PageState::CreateFromEncodedData(data));
 
   for (const ExplodedFrameState& child_state : state.children) {
     NavigationEntryImpl::TreeNode* child_node =
@@ -317,9 +317,7 @@
                                 &exploded_state.referenced_files);
 
   std::string encoded_data;
-  if (!EncodePageState(exploded_state, &encoded_data))
-    return frame_tree_->frame_entry->page_state();
-
+  EncodePageState(exploded_state, &encoded_data);
   return PageState::CreateFromEncodedData(encoded_data);
 }
 
diff --git a/content/browser/loader/navigation_url_loader_impl_core.cc b/content/browser/loader/navigation_url_loader_impl_core.cc
index 935cf08..9ff2ada 100644
--- a/content/browser/loader/navigation_url_loader_impl_core.cc
+++ b/content/browser/loader/navigation_url_loader_impl_core.cc
@@ -147,8 +147,8 @@
 }
 
 void NavigationURLLoaderImplCore::OnServiceWorkerChecksPerformed(
-    ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+      ServiceWorkerStatusCode status,
+      const scoped_refptr<ServiceWorkerRegistration>& registration) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   // If the navigation has a ServiceWorker, bail out immediately.
   // TODO(clamy): only bail out when the ServiceWorker has a Fetch event
diff --git a/content/browser/loader/navigation_url_loader_impl_core.h b/content/browser/loader/navigation_url_loader_impl_core.h
index 495a0ef8..1a7a152c 100644
--- a/content/browser/loader/navigation_url_loader_impl_core.h
+++ b/content/browser/loader/navigation_url_loader_impl_core.h
@@ -74,7 +74,7 @@
   // registered for it.
   void OnServiceWorkerChecksPerformed(
       ServiceWorkerStatusCode status,
-      scoped_refptr<ServiceWorkerRegistration> registration);
+      const scoped_refptr<ServiceWorkerRegistration>& registration);
 
   base::WeakPtr<NavigationURLLoaderImpl> loader_;
   NavigationResourceHandler* resource_handler_;
diff --git a/content/browser/media/capture/cursor_renderer_mac.mm b/content/browser/media/capture/cursor_renderer_mac.mm
index b00394e..c7c85f6e 100644
--- a/content/browser/media/capture/cursor_renderer_mac.mm
+++ b/content/browser/media/capture/cursor_renderer_mac.mm
@@ -61,12 +61,15 @@
   // Mouse location in window co-ordinates.
   NSPoint mouse_window_location =
       [view_ window].mouseLocationOutsideOfEventStream;
+  // Mouse location with respect to the web contents.
+  NSPoint mouse_tab_location =
+      [view_ convertPoint:mouse_window_location fromView:nil];
 
   // Mouse co-ordinates directly comparable against frame co-ordinates
   // after translation.
-  if (mouse_window_location.x < 0 || mouse_window_location.y < 0 ||
-      mouse_window_location.x > region_in_frame.width() ||
-      mouse_window_location.y > region_in_frame.height()) {
+  if (mouse_tab_location.x < 0 || mouse_tab_location.y < 0 ||
+      mouse_tab_location.x > region_in_frame.width() ||
+      mouse_tab_location.y > region_in_frame.height()) {
     VLOG(2) << "Mouse outside content region";
     return false;
   }
@@ -78,9 +81,9 @@
 
   if ((base::TimeTicks::Now() - last_mouse_movement_timestamp_).InSeconds() >
           MAX_IDLE_TIME_SECONDS &&
-      std::abs(mouse_window_location.x - last_mouse_location_x_) <
+      std::abs(mouse_tab_location.x - last_mouse_location_x_) <
           MIN_MOVEMENT_PIXELS &&
-      std::abs(mouse_window_location.y - last_mouse_location_y_) <
+      std::abs(mouse_tab_location.y - last_mouse_location_y_) <
           MIN_MOVEMENT_PIXELS) {
     VLOG(2) << "No mouse movement in a while";
     return false;
@@ -88,8 +91,8 @@
 
   // Mouse cursor position within the frame.
   cursor_position_in_frame_ =
-      gfx::Point(region_in_frame.x() + mouse_window_location.x,
-                 region_in_frame.y() + mouse_window_location.y);
+      gfx::Point(region_in_frame.x() + mouse_tab_location.x,
+                 region_in_frame.y() + mouse_tab_location.y);
 
   // Grab system cursor.
   NSCursor* nscursor = [NSCursor currentSystemCursor];
@@ -123,13 +126,13 @@
     return false;
   last_cursor_data_.reset(image_data_ref, base::scoped_policy::ASSUME);
 
-  if (std::abs(mouse_window_location.x - last_mouse_location_x_) >
+  if (std::abs(mouse_tab_location.x - last_mouse_location_x_) >
           MIN_MOVEMENT_PIXELS ||
-      std::abs(mouse_window_location.y - last_mouse_location_y_) >
+      std::abs(mouse_tab_location.y - last_mouse_location_y_) >
           MIN_MOVEMENT_PIXELS) {
     last_mouse_movement_timestamp_ = base::TimeTicks::Now();
-    last_mouse_location_x_ = mouse_window_location.x;
-    last_mouse_location_y_ = mouse_window_location.y;
+    last_mouse_location_x_ = mouse_tab_location.x;
+    last_mouse_location_y_ = mouse_tab_location.y;
   }
   return true;
 }
diff --git a/content/browser/media/media_canplaytype_browsertest.cc b/content/browser/media/media_canplaytype_browsertest.cc
index 72b54be..79ab549 100644
--- a/content/browser/media/media_canplaytype_browsertest.cc
+++ b/content/browser/media/media_canplaytype_browsertest.cc
@@ -44,13 +44,8 @@
 const char* kHlsMaybe = kPropMaybe;
 #endif  // !OS_ANDROID
 
-#if BUILDFLAG(ENABLE_HEVC_DEMUXING)
-// TODO(servolk): Change this to kPropProbably after adding platform-level
-// checks for HEVC codec ids. crbug.com/601949
-const char* kHevcSupported = kPropMaybe;
-#else
+// Chrome doesn't support HEVC.
 const char* kHevcSupported = kNot;
-#endif
 
 #if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER)
 const char* kMp2tsMaybe = kPropMaybe;
diff --git a/content/browser/notifications/notification_event_dispatcher_impl.cc b/content/browser/notifications/notification_event_dispatcher_impl.cc
index 7c3c058..032d503 100644
--- a/content/browser/notifications/notification_event_dispatcher_impl.cc
+++ b/content/browser/notifications/notification_event_dispatcher_impl.cc
@@ -94,7 +94,8 @@
     const NotificationOperationCallback& dispatch_event_action,
     const NotificationDispatchCompleteCallback& dispatch_error_callback,
     ServiceWorkerStatusCode service_worker_status,
-    scoped_refptr<ServiceWorkerRegistration> service_worker_registration) {
+    const scoped_refptr<ServiceWorkerRegistration>&
+        service_worker_registration) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 #if defined(OS_ANDROID)
   // This LOG(INFO) deliberately exists to help track down the cause of
diff --git a/content/browser/notifications/notification_message_filter.cc b/content/browser/notifications/notification_message_filter.cc
index e37d21b..766bb4f 100644
--- a/content/browser/notifications/notification_message_filter.cc
+++ b/content/browser/notifications/notification_message_filter.cc
@@ -222,7 +222,7 @@
     const NotificationResources& notification_resources,
     int64_t persistent_notification_id,
     content::ServiceWorkerStatusCode service_worker_status,
-    scoped_refptr<content::ServiceWorkerRegistration> registration) {
+    const scoped_refptr<content::ServiceWorkerRegistration>& registration) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   if (service_worker_status != SERVICE_WORKER_OK) {
diff --git a/content/browser/notifications/notification_message_filter.h b/content/browser/notifications/notification_message_filter.h
index bc28879..5ebce0e 100644
--- a/content/browser/notifications/notification_message_filter.h
+++ b/content/browser/notifications/notification_message_filter.h
@@ -98,7 +98,7 @@
       const NotificationResources& notification_resources,
       int64_t persistent_notification_id,
       content::ServiceWorkerStatusCode service_worker_status,
-      scoped_refptr<ServiceWorkerRegistration> registration);
+      const scoped_refptr<content::ServiceWorkerRegistration>& registration);
 
   // Callback to be invoked when all notifications belonging to a Service Worker
   // registration have been read from the database. The |success| argument
diff --git a/content/browser/push_messaging/push_messaging_router.cc b/content/browser/push_messaging/push_messaging_router.cc
index 01a8574..8e93fe7 100644
--- a/content/browser/push_messaging/push_messaging_router.cc
+++ b/content/browser/push_messaging/push_messaging_router.cc
@@ -73,7 +73,8 @@
     const PushEventPayload& payload,
     const DeliverMessageCallback& deliver_message_callback,
     ServiceWorkerStatusCode service_worker_status,
-    scoped_refptr<ServiceWorkerRegistration> service_worker_registration) {
+    const scoped_refptr<ServiceWorkerRegistration>&
+        service_worker_registration) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   // TODO(mvanouwerkerk): UMA logging.
   if (service_worker_status != SERVICE_WORKER_OK) {
diff --git a/content/browser/push_messaging/push_messaging_router.h b/content/browser/push_messaging/push_messaging_router.h
index 517863989..64adb8a 100644
--- a/content/browser/push_messaging/push_messaging_router.h
+++ b/content/browser/push_messaging/push_messaging_router.h
@@ -54,7 +54,8 @@
       const PushEventPayload& payload,
       const DeliverMessageCallback& deliver_message_callback,
       ServiceWorkerStatusCode service_worker_status,
-      scoped_refptr<ServiceWorkerRegistration> service_worker_registration);
+      const scoped_refptr<ServiceWorkerRegistration>&
+          service_worker_registration);
 
   // Delivers a push message with |data| to a specific |service_worker|. Must be
   // called on the IO thread, with the the worker running.
diff --git a/content/browser/renderer_host/browser_compositor_view_mac.mm b/content/browser/renderer_host/browser_compositor_view_mac.mm
index 5b32fcf9..0df75aa0 100644
--- a/content/browser/renderer_host/browser_compositor_view_mac.mm
+++ b/content/browser/renderer_host/browser_compositor_view_mac.mm
@@ -303,6 +303,10 @@
     recyclable_compositor_->compositor()
         ->vsync_manager()
         ->UpdateVSyncParameters(timebase, interval);
+    recyclable_compositor_->compositor()
+        ->context_factory()
+        ->SetDisplayVSyncParameters(recyclable_compositor_->compositor(),
+                                    timebase, interval);
   }
 }
 
diff --git a/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc b/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc
index 6d572ab..d3c2568c 100644
--- a/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc
+++ b/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc
@@ -13,6 +13,7 @@
 #include <utility>
 
 #include "base/callback_helpers.h"
+#include "base/feature_list.h"
 #include "base/i18n/case_conversion.h"
 #include "base/logging.h"
 #include "base/macros.h"
@@ -110,11 +111,23 @@
 const wchar_t* kLastResortFontNames[] = {L"Sans", L"Arial", L"MS UI Gothic",
                                          L"Microsoft Sans Serif"};
 
+// Feature to enable loading font files from outside the system font directory.
+const base::Feature kEnableCustomFonts {
+  "DirectWriteCustomFonts", base::FEATURE_ENABLED_BY_DEFAULT
+};
+
+// Feature to force loading font files using the custom font file path. Has no
+// effect if kEnableCustomFonts is disabled.
+const base::Feature kForceCustomFonts {
+  "ForceDirectWriteCustomFonts", base::FEATURE_DISABLED_BY_DEFAULT
+};
+
 }  // namespace
 
 DWriteFontProxyMessageFilter::DWriteFontProxyMessageFilter()
     : BrowserMessageFilter(DWriteFontProxyMsgStart),
-      windows_fonts_path_(GetWindowsFontsPath()) {}
+      windows_fonts_path_(GetWindowsFontsPath()),
+      custom_font_file_loading_mode_(ENABLE) {}
 
 DWriteFontProxyMessageFilter::~DWriteFontProxyMessageFilter() = default;
 
@@ -139,6 +152,11 @@
     *thread = BrowserThread::FILE_USER_BLOCKING;
 }
 
+void DWriteFontProxyMessageFilter::SetWindowsFontsPathForTesting(
+    base::string16 path) {
+  windows_fonts_path_.swap(path);
+}
+
 void DWriteFontProxyMessageFilter::OnFindFamily(
     const base::string16& family_name,
     UINT32* family_index) {
@@ -228,7 +246,8 @@
 
 void DWriteFontProxyMessageFilter::OnGetFontFiles(
     uint32_t family_index,
-    std::vector<base::string16>* file_paths) {
+    std::vector<base::string16>* file_paths,
+    std::vector<IPC::PlatformFileForTransit>* file_handles) {
   InitializeDirectWrite();
   TRACE_EVENT0("dwrite", "FontProxyHost::OnGetFontFiles");
   DCHECK(collection_);
@@ -246,6 +265,7 @@
   UINT32 font_count = family->GetFontCount();
 
   std::set<base::string16> path_set;
+  std::set<base::string16> custom_font_path_set;
   // Iterate through all the fonts in the family, and all the files for those
   // fonts. If anything goes wrong, bail on the entire family to avoid having
   // a partially-loaded font family.
@@ -258,12 +278,28 @@
       return;
     }
 
-    if (!AddFilesForFont(&path_set, font.Get())) {
+    if (!AddFilesForFont(&path_set, &custom_font_path_set, font.Get())) {
       if (IsLastResortFallbackFont(family_index))
         LogMessageFilterError(LAST_RESORT_FONT_ADD_FILES_FAILED);
     }
   }
 
+  // For files outside the windows fonts directory we pass them to the renderer
+  // as file handles. The renderer would be unable to open the files directly
+  // due to sandbox policy (it would get ERROR_ACCESS_DENIED instead). Passing
+  // handles allows the renderer to bypass the restriction and use the fonts.
+  for (const base::string16& custom_font_path : custom_font_path_set) {
+    // Specify FLAG_EXCLUSIVE_WRITE to prevent base::File from opening the file
+    // with FILE_SHARE_WRITE access. FLAG_EXCLUSIVE_WRITE doesn't actually open
+    // the file for write access.
+    base::File file(base::FilePath(custom_font_path),
+                    base::File::FLAG_OPEN | base::File::FLAG_READ |
+                        base::File::FLAG_EXCLUSIVE_WRITE);
+    if (file.IsValid()) {
+      file_handles->push_back(IPC::TakePlatformFileForTransit(std::move(file)));
+    }
+  }
+
   file_paths->assign(path_set.begin(), path_set.end());
   LogLastResortFontFileCount(file_paths->size());
 }
@@ -392,6 +428,11 @@
     return;
   }
 
+  if (!base::FeatureList::IsEnabled(kEnableCustomFonts))
+    custom_font_file_loading_mode_ = DISABLE;
+  else if (base::FeatureList::IsEnabled(kForceCustomFonts))
+    custom_font_file_loading_mode_ = FORCE;
+
   // Temp code to help track down crbug.com/561873
   for (size_t font = 0; font < arraysize(kLastResortFontNames); font++) {
     uint32_t font_index = 0;
@@ -407,6 +448,7 @@
 
 bool DWriteFontProxyMessageFilter::AddFilesForFont(
     std::set<base::string16>* path_set,
+    std::set<base::string16>* custom_font_path_set,
     IDWriteFont* font) {
   mswr::ComPtr<IDWriteFontFace> font_face;
   HRESULT hr;
@@ -457,7 +499,7 @@
       return false;
     }
 
-    if (!AddLocalFile(path_set, local_loader.Get(),
+    if (!AddLocalFile(path_set, custom_font_path_set, local_loader.Get(),
                       font_files[file_index].Get())) {
       return false;
     }
@@ -467,6 +509,7 @@
 
 bool DWriteFontProxyMessageFilter::AddLocalFile(
     std::set<base::string16>* path_set,
+    std::set<base::string16>* custom_font_path_set,
     IDWriteLocalFontFileLoader* local_loader,
     IDWriteFontFile* font_file) {
   HRESULT hr;
@@ -492,23 +535,6 @@
   }
 
   base::string16 file_path = base::i18n::FoldCase(file_path_chars.data());
-  if (!base::StartsWith(file_path, windows_fonts_path_,
-                        base::CompareCase::SENSITIVE)) {
-    // Skip loading fonts from outside the system fonts directory, since
-    // these families will not be accessible to the renderer process. If
-    // this turns out to be a common case, we can either grant the renderer
-    // access to these files (not sure if this is actually possible), or
-    // load the file data ourselves and hand it to the renderer.
-
-    // Really, really, really want to know what families hit this. Current
-    // data indicates about 0.09% of families fall into this case. Nothing to
-    // worry about if it's random obscure fonts noone has ever heard of, but
-    // could be a problem if it's common fonts.
-
-    LogLoaderType(FILE_OUTSIDE_SANDBOX);
-    NOTREACHED();  // Not yet implemented.
-    return false;
-  }
 
   // Refer to comments in kFontsToIgnore for this block.
   for (const auto& file_to_ignore : kFontsToIgnore) {
@@ -525,8 +551,16 @@
     }
   }
 
-  LogLoaderType(FILE_SYSTEM_FONT_DIR);
-  path_set->insert(file_path);
+  if (!base::StartsWith(file_path, windows_fonts_path_,
+                        base::CompareCase::SENSITIVE) ||
+      custom_font_file_loading_mode_ == FORCE) {
+    LogLoaderType(FILE_OUTSIDE_SANDBOX);
+    if (custom_font_file_loading_mode_ != DISABLE)
+      custom_font_path_set->insert(file_path);
+  } else {
+    LogLoaderType(FILE_SYSTEM_FONT_DIR);
+    path_set->insert(file_path);
+  }
   return true;
 }
 
diff --git a/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.h b/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.h
index 7539ff16..0939c9f 100644
--- a/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.h
+++ b/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.h
@@ -18,6 +18,7 @@
 #include "content/common/content_export.h"
 #include "content/public/browser/browser_message_filter.h"
 #include "content/public/browser/browser_thread.h"
+#include "ipc/ipc_platform_file.h"
 
 struct DWriteFontStyle;
 struct MapCharactersResult;
@@ -37,6 +38,8 @@
   void OverrideThreadForMessage(const IPC::Message& message,
                                 content::BrowserThread::ID* thread) override;
 
+  void SetWindowsFontsPathForTesting(base::string16 path);
+
  protected:
   ~DWriteFontProxyMessageFilter() override;
 
@@ -46,7 +49,8 @@
       UINT32 family_index,
       std::vector<std::pair<base::string16, base::string16>>* family_names);
   void OnGetFontFiles(UINT32 family_index,
-                      std::vector<base::string16>* file_paths);
+                      std::vector<base::string16>* file_paths,
+                      std::vector<IPC::PlatformFileForTransit>* file_handles);
   void OnMapCharacters(const base::string16& text,
                        const DWriteFontStyle& font_style,
                        const base::string16& locale_name,
@@ -57,19 +61,25 @@
   void InitializeDirectWrite();
 
  private:
-  bool AddFilesForFont(std::set<base::string16>* path_set, IDWriteFont* font);
+  bool AddFilesForFont(std::set<base::string16>* path_set,
+                       std::set<base::string16>* custom_font_path_set,
+                       IDWriteFont* font);
   bool AddLocalFile(std::set<base::string16>* path_set,
+                    std::set<base::string16>* custom_font_path_set,
                     IDWriteLocalFontFileLoader* local_loader,
                     IDWriteFontFile* font_file);
 
   bool IsLastResortFallbackFont(uint32_t font_index);
 
  private:
+  enum CustomFontFileLoadingMode { ENABLE, DISABLE, FORCE };
+
   bool direct_write_initialized_ = false;
   Microsoft::WRL::ComPtr<IDWriteFontCollection> collection_;
   Microsoft::WRL::ComPtr<IDWriteFactory2> factory2_;
   Microsoft::WRL::ComPtr<IDWriteFontFallback> font_fallback_;
   base::string16 windows_fonts_path_;
+  CustomFontFileLoadingMode custom_font_file_loading_mode_;
 
   // Temp code to help track down crbug.com/561873
   std::vector<uint32_t> last_resort_fonts_;
diff --git a/content/browser/renderer_host/dwrite_font_proxy_message_filter_win_unittest.cc b/content/browser/renderer_host/dwrite_font_proxy_message_filter_win_unittest.cc
index ffbdb294..83832bf 100644
--- a/content/browser/renderer_host/dwrite_font_proxy_message_filter_win_unittest.cc
+++ b/content/browser/renderer_host/dwrite_font_proxy_message_filter_win_unittest.cc
@@ -7,6 +7,9 @@
 #include <dwrite.h>
 #include <dwrite_2.h>
 
+#include <memory>
+
+#include "base/files/file.h"
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "base/test/test_simple_task_runner.h"
@@ -127,7 +130,8 @@
   filter_->ResetReply();
 
   std::vector<base::string16> files;
-  Send(new DWriteFontProxyMsg_GetFontFiles(arial_index, &files));
+  std::vector<IPC::PlatformFileForTransit> handles;
+  Send(new DWriteFontProxyMsg_GetFontFiles(arial_index, &files, &handles));
 
   EXPECT_LT(0u, files.size());
   for (const base::string16& file : files) {
@@ -137,8 +141,9 @@
 
 TEST_F(DWriteFontProxyMessageFilterUnitTest, GetFontFilesIndexOutOfBounds) {
   std::vector<base::string16> files;
+  std::vector<IPC::PlatformFileForTransit> handles;
   UINT32 invalid_index = 1000000;
-  Send(new DWriteFontProxyMsg_GetFontFiles(invalid_index, &files));
+  Send(new DWriteFontProxyMsg_GetFontFiles(invalid_index, &files, &handles));
 
   EXPECT_EQ(0u, files.size());
 }
@@ -208,6 +213,30 @@
   EXPECT_NE(0, result.font_style.font_stretch);
 }
 
+TEST_F(DWriteFontProxyMessageFilterUnitTest, TestCustomFontFiles) {
+  // Override windows fonts path to force the custom font file codepath.
+  filter_->SetWindowsFontsPathForTesting(L"X:\\NotWindowsFonts");
+  // Set the peer process so the filter duplicates handles into the current
+  // process.
+  filter_->set_peer_process_for_testing(base::Process::Current());
+
+  UINT32 arial_index = 0;
+  Send(new DWriteFontProxyMsg_FindFamily(L"Arial", &arial_index));
+  filter_->ResetReply();
+
+  std::vector<base::string16> files;
+  std::vector<IPC::PlatformFileForTransit> handles;
+  Send(new DWriteFontProxyMsg_GetFontFiles(arial_index, &files, &handles));
+
+  EXPECT_TRUE(files.empty());
+  EXPECT_FALSE(handles.empty());
+  for (const IPC::PlatformFileForTransit& handle : handles) {
+    EXPECT_TRUE(handle.IsValid());
+    base::File file = IPC::PlatformFileForTransitToFile(handle);
+    EXPECT_LT(0, file.GetLength());  // Check the file exists
+  }
+}
+
 }  // namespace
 
 }  // namespace content
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 0de0be4..67d6c06 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -138,7 +138,6 @@
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_types.h"
-#include "content/public/browser/owned_interface.h"
 #include "content/public/browser/render_process_host_factory.h"
 #include "content/public/browser/render_process_host_observer.h"
 #include "content/public/browser/render_widget_host.h"
@@ -1700,9 +1699,6 @@
   if (run_renderer_in_process())
     return false;  // Single process mode never shuts down the renderer.
 
-  if (!GetContentClient()->browser()->IsFastShutdownPossible())
-    return false;
-
   if (!child_process_launcher_.get() || child_process_launcher_->IsStarting() ||
       !GetHandle())
     return false;  // Render process hasn't started or is probably crashed.
@@ -2098,14 +2094,10 @@
 }
 
 void RenderProcessHostImpl::AddFilter(BrowserMessageFilter* filter) {
+  filter->RegisterAssociatedInterfaces(channel_.get());
   channel_->AddFilter(filter->GetFilter());
 }
 
-void RenderProcessHostImpl::AddOwnedInterface(
-    std::unique_ptr<OwnedInterface> impl) {
-  owned_interface_impls_.push_back(std::move(impl));
-}
-
 bool RenderProcessHostImpl::FastShutdownForPageCount(size_t count) {
   if (GetActiveViewCount() == count)
     return FastShutdownIfPossible();
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index ecd008b..481fad9 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -55,7 +55,6 @@
 class MessagePortMessageFilter;
 class MojoChildConnection;
 class NotificationMessageFilter;
-class OwnedInterface;
 #if defined(ENABLE_WEBRTC)
 class P2PSocketDispatcherHost;
 #endif
@@ -137,7 +136,6 @@
   bool SuddenTerminationAllowed() const override;
   IPC::ChannelProxy* GetChannel() override;
   void AddFilter(BrowserMessageFilter* filter) override;
-  void AddOwnedInterface(std::unique_ptr<OwnedInterface> impl) override;
   bool FastShutdownForPageCount(size_t count) override;
   bool FastShutdownStarted() const override;
   base::TimeDelta GetChildProcessIdleTime() const override;
@@ -360,11 +358,6 @@
 
   std::string child_token_;
 
-  // Services owned by this host for the purpose of service impl lifetime
-  // management. These need to outlive |mojo_child_connection_|, as they are
-  // registered on the |InterfaceRegistry| indirectly owned by that object.
-  std::vector<std::unique_ptr<OwnedInterface>> owned_interface_impls_;
-
   std::unique_ptr<MojoChildConnection> mojo_child_connection_;
   shell::mojom::ServicePtr test_service_;
 
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index ca399535..c836b7a3 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -370,7 +370,7 @@
   params.min_size = GetWidget()->min_size_for_auto_resize();
   params.max_size = GetWidget()->max_size_for_auto_resize();
   params.page_zoom_level = delegate_->GetPendingPageZoomLevel();
-  params.image_decode_color_space = gfx::ColorSpace::FromBestMonitor();
+  params.image_decode_color_space = gfx::ICCProfile::FromBestMonitor();
   GetWidget()->GetResizeParams(&params.initial_size);
 
   if (!Send(new ViewMsg_New(params)))
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index 4c5569f..7054fdd7 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -221,10 +221,10 @@
 #if defined(OS_WIN)
   // Update the display color profile cache so that it is likely to be up to
   // date when the renderer process requests the color profile.
-  if (gfx::ColorSpace::CachedProfilesNeedUpdate()) {
+  if (gfx::ICCProfile::CachedProfilesNeedUpdate()) {
     BrowserThread::PostBlockingPoolTask(
         FROM_HERE,
-        base::Bind(&gfx::ColorSpace::UpdateCachedProfilesOnBackgroundThread));
+        base::Bind(&gfx::ICCProfile::UpdateCachedProfilesOnBackgroundThread));
   }
 #endif
 
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index 139d3b6..874a54f 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -3059,8 +3059,10 @@
 - (void)viewDidChangeBackingProperties {
   NSScreen* screen = [[self window] screen];
   if (screen) {
+    gfx::ICCProfile icc_profile =
+        gfx::ICCProfile::FromCGColorSpace([[screen colorSpace] CGColorSpace]);
     renderWidgetHostView_->browser_compositor_->SetDisplayColorSpace(
-        gfx::ColorSpace::FromCGColorSpace([[screen colorSpace] CGColorSpace]));
+        icc_profile.GetColorSpace());
   }
 }
 
diff --git a/content/browser/service_worker/foreign_fetch_request_handler.cc b/content/browser/service_worker/foreign_fetch_request_handler.cc
index ac99dffe..9b21310 100644
--- a/content/browser/service_worker/foreign_fetch_request_handler.cc
+++ b/content/browser/service_worker/foreign_fetch_request_handler.cc
@@ -174,7 +174,7 @@
 void ForeignFetchRequestHandler::DidFindRegistration(
     const base::WeakPtr<ServiceWorkerURLRequestJob>& job,
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   if (!job || job.get() != job_.get()) {
     // No more job to handle, or job changed somehow, so just return.
     return;
diff --git a/content/browser/service_worker/foreign_fetch_request_handler.h b/content/browser/service_worker/foreign_fetch_request_handler.h
index 47d0fde..c9c3026 100644
--- a/content/browser/service_worker/foreign_fetch_request_handler.h
+++ b/content/browser/service_worker/foreign_fetch_request_handler.h
@@ -96,7 +96,7 @@
   void DidFindRegistration(
       const base::WeakPtr<ServiceWorkerURLRequestJob>& job,
       ServiceWorkerStatusCode status,
-      scoped_refptr<ServiceWorkerRegistration> registration);
+      const scoped_refptr<ServiceWorkerRegistration>& registration);
 
   // ServiceWorkerURLRequestJob::Delegate implementation:
   void OnPrepareToRestart() override;
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index e10b3e2..5313177 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -134,7 +134,7 @@
     const base::Closure& quit,
     ServiceWorkerStatusCode* out_status,
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   *out_status = status;
   if (!quit.is_null())
     BrowserThread::PostTask(run_quit_thread, FROM_HERE, quit);
@@ -930,8 +930,16 @@
                     SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED);
 }
 
+// Has errors under TSan. See https://crbug.com/631323.
+#if defined(THREAD_SANITIZER)
+#define MAYBE_InstallWithWaitUntil_RejectConsoleMessage \
+  DISABLED_InstallWithWaitUntil_RejectConsoleMessage
+#else
+#define MAYBE_InstallWithWaitUntil_RejectConsoleMessage \
+  InstallWithWaitUntil_RejectConsoleMessage
+#endif
 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
-                       InstallWithWaitUntil_RejectConsoleMessage) {
+                       MAYBE_InstallWithWaitUntil_RejectConsoleMessage) {
   RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this,
                            "/service_worker/worker_install_rejected.js"));
 
@@ -968,7 +976,14 @@
   base::Closure quit_;
 };
 
-IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, TimeoutStartingWorker) {
+// Has errors under TSan. See https://crbug.com/631323.
+#if defined(THREAD_SANITIZER)
+#define MAYBE_TimeoutStartingWorker DISABLED_TimeoutStartingWorker
+#else
+#define MAYBE_TimeoutStartingWorker TimeoutStartingWorker
+#endif
+IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
+                       MAYBE_TimeoutStartingWorker) {
   RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this,
                            "/service_worker/while_true_worker.js"));
 
@@ -1079,8 +1094,15 @@
   EXPECT_EQ("cache_name", response2.cache_storage_cache_name);
 }
 
+// Has errors under TSan. See https://crbug.com/631323.
+#if defined(THREAD_SANITIZER)
+#define MAYBE_FetchEvent_respondWithRejection \
+  DISABLED_FetchEvent_respondWithRejection
+#else
+#define MAYBE_FetchEvent_respondWithRejection FetchEvent_respondWithRejection
+#endif
 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
-                       FetchEvent_respondWithRejection) {
+                       MAYBE_FetchEvent_respondWithRejection) {
   ServiceWorkerFetchEventResult result;
   ServiceWorkerResponse response;
   std::unique_ptr<storage::BlobDataHandle> blob_data_handle;
@@ -1426,7 +1448,7 @@
       ServiceWorkerStatusCode* out_status,
       const base::Closure& continuation,
       ServiceWorkerStatusCode status,
-      scoped_refptr<ServiceWorkerRegistration> registration) {
+      const scoped_refptr<ServiceWorkerRegistration>& registration) {
     *out_status = status;
     if (!registration.get())
       EXPECT_NE(SERVICE_WORKER_OK, status);
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc
index eff6187..2db34643 100644
--- a/content/browser/service_worker/service_worker_context_core.cc
+++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -823,7 +823,7 @@
     const GURL& other_url,
     const ServiceWorkerContext::CheckHasServiceWorkerCallback callback,
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   if (status != SERVICE_WORKER_OK) {
     callback.Run(false);
     return;
@@ -843,7 +843,7 @@
     registration->RegisterRegistrationFinishedCallback(
         base::Bind(&ServiceWorkerContextCore::
                        OnRegistrationFinishedForCheckHasServiceWorker,
-                   AsWeakPtr(), callback, std::move(registration)));
+                   AsWeakPtr(), callback, registration));
     return;
   }
 
@@ -852,7 +852,7 @@
 
 void ServiceWorkerContextCore::OnRegistrationFinishedForCheckHasServiceWorker(
     const ServiceWorkerContext::CheckHasServiceWorkerCallback callback,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   callback.Run(registration->active_version() ||
                registration->waiting_version());
 }
diff --git a/content/browser/service_worker/service_worker_context_core.h b/content/browser/service_worker/service_worker_context_core.h
index 472ebe2..71dcfe8d 100644
--- a/content/browser/service_worker/service_worker_context_core.h
+++ b/content/browser/service_worker/service_worker_context_core.h
@@ -333,10 +333,10 @@
       const GURL& other_url,
       const ServiceWorkerContext::CheckHasServiceWorkerCallback callback,
       ServiceWorkerStatusCode status,
-      scoped_refptr<ServiceWorkerRegistration> registration);
+      const scoped_refptr<ServiceWorkerRegistration>& registration);
   void OnRegistrationFinishedForCheckHasServiceWorker(
       const ServiceWorkerContext::CheckHasServiceWorkerCallback callback,
-      scoped_refptr<ServiceWorkerRegistration> registration);
+      const scoped_refptr<ServiceWorkerRegistration>& registration);
 
   // It's safe to store a raw pointer instead of a scoped_refptr to |wrapper_|
   // because the Wrapper::Shutdown call that hops threads to destroy |this| uses
diff --git a/content/browser/service_worker/service_worker_context_unittest.cc b/content/browser/service_worker/service_worker_context_unittest.cc
index fdfee7b..05409c8 100644
--- a/content/browser/service_worker/service_worker_context_unittest.cc
+++ b/content/browser/service_worker/service_worker_context_unittest.cc
@@ -59,7 +59,7 @@
     bool expect_waiting,
     bool expect_active,
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   ASSERT_EQ(expect_status, status);
   if (status != SERVICE_WORKER_OK) {
     EXPECT_FALSE(registration.get());
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc
index bb5d2de..0c32d716 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.cc
+++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -55,7 +55,7 @@
 void StartActiveWorkerOnIO(
     const ServiceWorkerContextWrapper::StatusCallback& callback,
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   if (status == SERVICE_WORKER_OK) {
     // Pass the reference of |registration| to WorkerStarted callback to prevent
@@ -72,7 +72,7 @@
 
 void SkipWaitingWorkerOnIO(
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   if (status != SERVICE_WORKER_OK || !registration->waiting_version())
     return;
@@ -400,7 +400,7 @@
 
 void ServiceWorkerContextWrapper::DidFindRegistrationForUpdate(
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   if (status != SERVICE_WORKER_OK)
@@ -564,7 +564,7 @@
 void ServiceWorkerContextWrapper::DidFindRegistrationForFindReady(
     const FindRegistrationCallback& callback,
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   if (status != SERVICE_WORKER_OK) {
     callback.Run(status, nullptr);
@@ -587,17 +587,17 @@
     // Wait until the version is activated.
     active_version->RegisterStatusChangeCallback(base::Bind(
         &ServiceWorkerContextWrapper::OnStatusChangedForFindReadyRegistration,
-        this, callback, std::move(registration)));
+        this, callback, registration));
     return;
   }
 
   DCHECK_EQ(ServiceWorkerVersion::ACTIVATED, active_version->status());
-  callback.Run(SERVICE_WORKER_OK, std::move(registration));
+  callback.Run(SERVICE_WORKER_OK, registration);
 }
 
 void ServiceWorkerContextWrapper::OnStatusChangedForFindReadyRegistration(
     const FindRegistrationCallback& callback,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   scoped_refptr<ServiceWorkerVersion> active_version =
       registration->active_version();
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h
index ab4c900b..02858028 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.h
+++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -212,10 +212,10 @@
   void DidFindRegistrationForFindReady(
       const FindRegistrationCallback& callback,
       ServiceWorkerStatusCode status,
-      scoped_refptr<ServiceWorkerRegistration> registration);
+      const scoped_refptr<ServiceWorkerRegistration>& registration);
   void OnStatusChangedForFindReadyRegistration(
       const FindRegistrationCallback& callback,
-      scoped_refptr<ServiceWorkerRegistration> registration);
+      const scoped_refptr<ServiceWorkerRegistration>& registration);
 
   void DidDeleteAndStartOver(ServiceWorkerStatusCode status);
 
@@ -229,7 +229,7 @@
 
   void DidFindRegistrationForUpdate(
       ServiceWorkerStatusCode status,
-      scoped_refptr<content::ServiceWorkerRegistration> registration);
+      const scoped_refptr<content::ServiceWorkerRegistration>& registration);
 
   // The core context is only for use on the IO thread.
   // Can be null before/during init, during/after shutdown, and after
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.cc b/content/browser/service_worker/service_worker_controllee_request_handler.cc
index 6312b57..2aedf74 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler.cc
+++ b/content/browser/service_worker/service_worker_controllee_request_handler.cc
@@ -176,10 +176,10 @@
                                 weak_factory_.GetWeakPtr()));
 }
 
-void ServiceWorkerControlleeRequestHandler::
-    DidLookupRegistrationForMainResource(
-        ServiceWorkerStatusCode status,
-        scoped_refptr<ServiceWorkerRegistration> registration) {
+void
+ServiceWorkerControlleeRequestHandler::DidLookupRegistrationForMainResource(
+    ServiceWorkerStatusCode status,
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   // The job may have been canceled and then destroyed before this was invoked.
   if (!job_)
     return;
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.h b/content/browser/service_worker/service_worker_controllee_request_handler.h
index a6e48b2..8da2a56a 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler.h
+++ b/content/browser/service_worker/service_worker_controllee_request_handler.h
@@ -66,7 +66,7 @@
   void PrepareForMainResource(const net::URLRequest* request);
   void DidLookupRegistrationForMainResource(
       ServiceWorkerStatusCode status,
-      scoped_refptr<ServiceWorkerRegistration> registration);
+      const scoped_refptr<ServiceWorkerRegistration>& registration);
   void OnVersionStatusChanged(
       ServiceWorkerRegistration* registration,
       ServiceWorkerVersion* version);
diff --git a/content/browser/service_worker/service_worker_dispatcher_host.cc b/content/browser/service_worker/service_worker_dispatcher_host.cc
index 577d660a..10b633b9 100644
--- a/content/browser/service_worker/service_worker_dispatcher_host.cc
+++ b/content/browser/service_worker/service_worker_dispatcher_host.cc
@@ -1285,7 +1285,7 @@
     int provider_id,
     int request_id,
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   TRACE_EVENT_ASYNC_END2(
       "ServiceWorker", "ServiceWorkerDispatcherHost::GetRegistration",
       request_id, "Status", status, "Registration ID",
diff --git a/content/browser/service_worker/service_worker_dispatcher_host.h b/content/browser/service_worker/service_worker_dispatcher_host.h
index 0f4bf5eec8ef..9e1c587c 100644
--- a/content/browser/service_worker/service_worker_dispatcher_host.h
+++ b/content/browser/service_worker/service_worker_dispatcher_host.h
@@ -213,7 +213,7 @@
       int provider_id,
       int request_id,
       ServiceWorkerStatusCode status,
-      scoped_refptr<ServiceWorkerRegistration> registration);
+      const scoped_refptr<ServiceWorkerRegistration>& registration);
   void GetRegistrationsComplete(
       int thread_id,
       int provider_id,
diff --git a/content/browser/service_worker/service_worker_job_unittest.cc b/content/browser/service_worker/service_worker_job_unittest.cc
index 14729cb..d06955f 100644
--- a/content/browser/service_worker/service_worker_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_job_unittest.cc
@@ -58,10 +58,10 @@
     bool* called,
     scoped_refptr<ServiceWorkerRegistration>* registration,
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> result) {
+    const scoped_refptr<ServiceWorkerRegistration>& result) {
   EXPECT_EQ(expected_status, status);
   *called = true;
-  *registration = std::move(result);
+  *registration = result;
 }
 
 // Creates a callback which both keeps track of if it's been called,
diff --git a/content/browser/service_worker/service_worker_read_from_cache_job_unittest.cc b/content/browser/service_worker/service_worker_read_from_cache_job_unittest.cc
index cc84e66..63e28ce 100644
--- a/content/browser/service_worker/service_worker_read_from_cache_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_read_from_cache_job_unittest.cc
@@ -47,7 +47,7 @@
     ServiceWorkerStatusCode* status_out,
     const base::Closure& quit_closure,
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   *status_out = status;
   quit_closure.Run();
 }
diff --git a/content/browser/service_worker/service_worker_register_job.cc b/content/browser/service_worker/service_worker_register_job.cc
index b6125ad..fbfb635 100644
--- a/content/browser/service_worker/service_worker_register_job.cc
+++ b/content/browser/service_worker/service_worker_register_job.cc
@@ -152,10 +152,10 @@
 ServiceWorkerRegisterJob::Internal::~Internal() {}
 
 void ServiceWorkerRegisterJob::set_registration(
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   DCHECK(phase_ == START || phase_ == REGISTER) << phase_;
   DCHECK(!internal_.registration.get());
-  internal_.registration = std::move(registration);
+  internal_.registration = registration;
 }
 
 ServiceWorkerRegistration* ServiceWorkerRegisterJob::registration() {
@@ -209,7 +209,7 @@
 // Throughout this file, comments in quotes are excerpts from the spec.
 void ServiceWorkerRegisterJob::ContinueWithRegistration(
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> existing_registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& existing_registration) {
   DCHECK_EQ(REGISTRATION_JOB, job_type_);
   if (status != SERVICE_WORKER_ERROR_NOT_FOUND && status != SERVICE_WORKER_OK) {
     Complete(status);
@@ -248,7 +248,7 @@
 
 void ServiceWorkerRegisterJob::ContinueWithUpdate(
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> existing_registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& existing_registration) {
   DCHECK_EQ(UPDATE_JOB, job_type_);
   if (status != SERVICE_WORKER_OK) {
     Complete(status);
@@ -294,7 +294,7 @@
 }
 
 void ServiceWorkerRegisterJob::ContinueWithUninstallingRegistration(
-    scoped_refptr<ServiceWorkerRegistration> existing_registration,
+    const scoped_refptr<ServiceWorkerRegistration>& existing_registration,
     ServiceWorkerStatusCode status) {
   if (status != SERVICE_WORKER_OK) {
     Complete(status);
@@ -306,7 +306,7 @@
 }
 
 void ServiceWorkerRegisterJob::ContinueWithRegistrationForSameScriptUrl(
-    scoped_refptr<ServiceWorkerRegistration> existing_registration,
+    const scoped_refptr<ServiceWorkerRegistration>& existing_registration,
     ServiceWorkerStatusCode status) {
   if (status != SERVICE_WORKER_OK) {
     Complete(status);
diff --git a/content/browser/service_worker/service_worker_register_job.h b/content/browser/service_worker/service_worker_register_job.h
index 7ec65a8..153203e 100644
--- a/content/browser/service_worker/service_worker_register_job.h
+++ b/content/browser/service_worker/service_worker_register_job.h
@@ -96,7 +96,8 @@
     scoped_refptr<ServiceWorkerVersion> new_version;
   };
 
-  void set_registration(scoped_refptr<ServiceWorkerRegistration> registration);
+  void set_registration(
+      const scoped_refptr<ServiceWorkerRegistration>& registration);
   ServiceWorkerRegistration* registration();
   void set_new_version(ServiceWorkerVersion* version);
   ServiceWorkerVersion* new_version();
@@ -106,16 +107,16 @@
   void StartImpl();
   void ContinueWithRegistration(
       ServiceWorkerStatusCode status,
-      scoped_refptr<ServiceWorkerRegistration> registration);
+      const scoped_refptr<ServiceWorkerRegistration>& registration);
   void ContinueWithUpdate(
       ServiceWorkerStatusCode status,
-      scoped_refptr<ServiceWorkerRegistration> registration);
+      const scoped_refptr<ServiceWorkerRegistration>& registration);
   void RegisterAndContinue();
   void ContinueWithUninstallingRegistration(
-      scoped_refptr<ServiceWorkerRegistration> existing_registration,
+      const scoped_refptr<ServiceWorkerRegistration>& existing_registration,
       ServiceWorkerStatusCode status);
   void ContinueWithRegistrationForSameScriptUrl(
-      scoped_refptr<ServiceWorkerRegistration> existing_registration,
+      const scoped_refptr<ServiceWorkerRegistration>& existing_registration,
       ServiceWorkerStatusCode status);
   void UpdateAndContinue();
   void OnStartWorkerFinished(ServiceWorkerStatusCode status);
diff --git a/content/browser/service_worker/service_worker_storage.cc b/content/browser/service_worker/service_worker_storage.cc
index 8cf5ce3..7fe9008 100644
--- a/content/browser/service_worker/service_worker_storage.cc
+++ b/content/browser/service_worker/service_worker_storage.cc
@@ -39,7 +39,7 @@
 }
 
 void CompleteFindNow(
-    scoped_refptr<ServiceWorkerRegistration> registration,
+    const scoped_refptr<ServiceWorkerRegistration>& registration,
     ServiceWorkerStatusCode status,
     const ServiceWorkerStorage::FindRegistrationCallback& callback) {
   if (registration && registration->is_deleted()) {
@@ -47,16 +47,16 @@
     callback.Run(SERVICE_WORKER_ERROR_NOT_FOUND, nullptr);
     return;
   }
-  callback.Run(status, std::move(registration));
+  callback.Run(status, registration);
 }
 
 void CompleteFindSoon(
     const tracked_objects::Location& from_here,
-    scoped_refptr<ServiceWorkerRegistration> registration,
+    const scoped_refptr<ServiceWorkerRegistration>& registration,
     ServiceWorkerStatusCode status,
     const ServiceWorkerStorage::FindRegistrationCallback& callback) {
-  RunSoon(from_here, base::Bind(&CompleteFindNow, std::move(registration),
-                                status, callback));
+  RunSoon(from_here,
+          base::Bind(&CompleteFindNow, registration, status, callback));
 }
 
 const base::FilePath::CharType kDatabaseName[] =
@@ -167,7 +167,9 @@
         TRACE_EVENT_SCOPE_THREAD,
         "URL", document_url.spec(),
         "Status", ServiceWorkerStatusToString(status));
-    CompleteFindNow(std::move(installing_registration), status, callback);
+    CompleteFindNow(installing_registration,
+                    status,
+                    callback);
     return;
   }
 
@@ -212,11 +214,10 @@
     // Look for something currently being installed.
     scoped_refptr<ServiceWorkerRegistration> installing_registration =
         FindInstallingRegistrationForPattern(scope);
-    ServiceWorkerStatusCode installing_status =
-        installing_registration ? SERVICE_WORKER_OK
-                                : SERVICE_WORKER_ERROR_NOT_FOUND;
-    CompleteFindSoon(FROM_HERE, std::move(installing_registration),
-                     installing_status, callback);
+    CompleteFindSoon(FROM_HERE, installing_registration,
+                     installing_registration ? SERVICE_WORKER_OK
+                                             : SERVICE_WORKER_ERROR_NOT_FOUND,
+                     callback);
     return;
   }
 
@@ -276,7 +277,7 @@
   scoped_refptr<ServiceWorkerRegistration> registration =
       context_->GetLiveRegistration(registration_id);
   if (registration) {
-    CompleteFindNow(std::move(registration), SERVICE_WORKER_OK, callback);
+    CompleteFindNow(registration, SERVICE_WORKER_OK, callback);
     return;
   }
 
@@ -895,7 +896,7 @@
     ServiceWorkerStatusCode installing_status =
         installing_registration ? SERVICE_WORKER_OK
                                 : SERVICE_WORKER_ERROR_NOT_FOUND;
-    callback.Run(installing_status, std::move(installing_registration));
+    callback.Run(installing_status, installing_registration);
     TRACE_EVENT_ASYNC_END2(
         "ServiceWorker",
         "ServiceWorkerStorage::FindRegistrationForDocument",
@@ -932,10 +933,9 @@
   if (status == ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) {
     scoped_refptr<ServiceWorkerRegistration> installing_registration =
         FindInstallingRegistrationForPattern(scope);
-    ServiceWorkerStatusCode installing_status =
-        installing_registration ? SERVICE_WORKER_OK
-                                : SERVICE_WORKER_ERROR_NOT_FOUND;
-    callback.Run(installing_status, std::move(installing_registration));
+    callback.Run(installing_registration ? SERVICE_WORKER_OK
+                                         : SERVICE_WORKER_ERROR_NOT_FOUND,
+                 installing_registration);
     return;
   }
 
@@ -973,7 +973,7 @@
   DCHECK(!resources.empty());
   scoped_refptr<ServiceWorkerRegistration> registration =
       GetOrCreateRegistration(data, resources);
-  CompleteFindNow(std::move(registration), SERVICE_WORKER_OK, callback);
+  CompleteFindNow(registration, SERVICE_WORKER_OK, callback);
 }
 
 void ServiceWorkerStorage::DidGetRegistrations(
@@ -1012,7 +1012,7 @@
     }
   }
 
-  callback.Run(SERVICE_WORKER_OK, std::move(registrations));
+  callback.Run(SERVICE_WORKER_OK, registrations);
 }
 
 void ServiceWorkerStorage::DidGetRegistrationsInfos(
diff --git a/content/browser/service_worker/service_worker_storage.h b/content/browser/service_worker/service_worker_storage.h
index 1667b54a..61ce44dc 100644
--- a/content/browser/service_worker/service_worker_storage.h
+++ b/content/browser/service_worker/service_worker_storage.h
@@ -57,10 +57,9 @@
  public:
   typedef std::vector<ServiceWorkerDatabase::ResourceRecord> ResourceList;
   typedef base::Callback<void(ServiceWorkerStatusCode status)> StatusCallback;
-  typedef base::Callback<void(
-      ServiceWorkerStatusCode status,
-      scoped_refptr<ServiceWorkerRegistration> registration)>
-      FindRegistrationCallback;
+  typedef base::Callback<void(ServiceWorkerStatusCode status,
+                              const scoped_refptr<ServiceWorkerRegistration>&
+                                  registration)> FindRegistrationCallback;
   typedef base::Callback<void(
       ServiceWorkerStatusCode status,
       const std::vector<scoped_refptr<ServiceWorkerRegistration>>&
diff --git a/content/browser/service_worker/service_worker_storage_unittest.cc b/content/browser/service_worker/service_worker_storage_unittest.cc
index fe64a67..478ace7 100644
--- a/content/browser/service_worker/service_worker_storage_unittest.cc
+++ b/content/browser/service_worker/service_worker_storage_unittest.cc
@@ -62,14 +62,15 @@
   return base::Bind(&StatusCallback, was_called, result);
 }
 
-void FindCallback(bool* was_called,
-                  ServiceWorkerStatusCode* result,
-                  scoped_refptr<ServiceWorkerRegistration>* found,
-                  ServiceWorkerStatusCode status,
-                  scoped_refptr<ServiceWorkerRegistration> registration) {
+void FindCallback(
+    bool* was_called,
+    ServiceWorkerStatusCode* result,
+    scoped_refptr<ServiceWorkerRegistration>* found,
+    ServiceWorkerStatusCode status,
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   *was_called = true;
   *result = status;
-  *found = std::move(registration);
+  *found = registration;
 }
 
 ServiceWorkerStorage::FindRegistrationCallback MakeFindCallback(
@@ -433,7 +434,7 @@
   }
 
   ServiceWorkerStatusCode UpdateToActiveState(
-      scoped_refptr<ServiceWorkerRegistration> registration) {
+      const scoped_refptr<ServiceWorkerRegistration>& registration) {
     bool was_called = false;
     ServiceWorkerStatusCode result = SERVICE_WORKER_ERROR_MAX_VALUE;
     storage()->UpdateToActiveState(registration.get(),
@@ -445,7 +446,7 @@
   }
 
   void UpdateLastUpdateCheckTime(
-      scoped_refptr<ServiceWorkerRegistration> registration) {
+      const scoped_refptr<ServiceWorkerRegistration>& registration) {
     storage()->UpdateLastUpdateCheckTime(registration.get());
     base::RunLoop().RunUntilIdle();
   }
diff --git a/content/browser/service_worker/service_worker_unregister_job.cc b/content/browser/service_worker/service_worker_unregister_job.cc
index 0ca2f7f0..c0fc9dc4 100644
--- a/content/browser/service_worker/service_worker_unregister_job.cc
+++ b/content/browser/service_worker/service_worker_unregister_job.cc
@@ -57,7 +57,7 @@
 
 void ServiceWorkerUnregisterJob::OnRegistrationFound(
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   if (status == SERVICE_WORKER_ERROR_NOT_FOUND) {
     DCHECK(!registration.get());
     Complete(kInvalidServiceWorkerRegistrationId,
diff --git a/content/browser/service_worker/service_worker_unregister_job.h b/content/browser/service_worker/service_worker_unregister_job.h
index 517bc27..a614253 100644
--- a/content/browser/service_worker/service_worker_unregister_job.h
+++ b/content/browser/service_worker/service_worker_unregister_job.h
@@ -51,7 +51,7 @@
  private:
   void OnRegistrationFound(
       ServiceWorkerStatusCode status,
-      scoped_refptr<ServiceWorkerRegistration> registration);
+      const scoped_refptr<ServiceWorkerRegistration>& registration);
   void Complete(int64_t registration_id, ServiceWorkerStatusCode status);
   void CompleteInternal(int64_t registration_id,
                         ServiceWorkerStatusCode status);
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
index c9f14e5..ed7ae82ea 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -1284,7 +1284,7 @@
     bool is_browser_startup_complete,
     const StatusCallback& callback,
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   scoped_refptr<ServiceWorkerRegistration> protect = registration;
   if (status == SERVICE_WORKER_ERROR_NOT_FOUND) {
     // When the registration has already been deleted from the storage but its
@@ -1654,7 +1654,7 @@
 
 void ServiceWorkerVersion::FoundRegistrationForUpdate(
     ServiceWorkerStatusCode status,
-    scoped_refptr<ServiceWorkerRegistration> registration) {
+    const scoped_refptr<ServiceWorkerRegistration>& registration) {
   if (!context_)
     return;
 
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h
index db5392c1..417b301e 100644
--- a/content/browser/service_worker/service_worker_version.h
+++ b/content/browser/service_worker/service_worker_version.h
@@ -591,7 +591,7 @@
       bool is_browser_startup_complete,
       const StatusCallback& callback,
       ServiceWorkerStatusCode status,
-      scoped_refptr<ServiceWorkerRegistration> registration);
+      const scoped_refptr<ServiceWorkerRegistration>& registration);
   void StartWorkerInternal();
 
   void DidSkipWaiting(int request_id);
@@ -639,7 +639,7 @@
 
   void FoundRegistrationForUpdate(
       ServiceWorkerStatusCode status,
-      scoped_refptr<ServiceWorkerRegistration> registration);
+      const scoped_refptr<ServiceWorkerRegistration>& registration);
 
   void OnStoppedInternal(EmbeddedWorkerStatus old_status);
 
diff --git a/content/browser/webui/url_data_manager_backend.cc b/content/browser/webui/url_data_manager_backend.cc
index 404e834..8a3e910 100644
--- a/content/browser/webui/url_data_manager_backend.cc
+++ b/content/browser/webui/url_data_manager_backend.cc
@@ -22,6 +22,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
+#include "base/threading/worker_pool.h"
 #include "base/trace_event/trace_event.h"
 #include "content/browser/blob_storage/chrome_blob_storage_context.h"
 #include "content/browser/histogram_internals_request_job.h"
@@ -104,6 +105,20 @@
   return result;
 }
 
+// Copy data from source buffer into IO buffer destination.
+// TODO(groby): Very similar to URLRequestSimpleJob, unify at some point.
+void CopyData(const scoped_refptr<net::IOBuffer>& buf,
+              int buf_size,
+              const scoped_refptr<base::RefCountedMemory>& data,
+              int64_t data_offset) {
+  // TODO(pkasting): Remove ScopedTracker below once crbug.com/455423 is
+  // fixed.
+  tracked_objects::ScopedTracker tracking_profile(
+      FROM_HERE_WITH_EXPLICIT_FUNCTION(
+          "455423 URLRequestChromeJob::CompleteRead memcpy"));
+  memcpy(buf->data(), data->front() + data_offset, buf_size);
+}
+
 }  // namespace
 
 // URLRequestChromeJob is a net::URLRequestJob that manages running
@@ -204,10 +219,9 @@
   static void DelayStartForDevTools(
       const base::WeakPtr<URLRequestChromeJob>& job);
 
-  // Do the actual copy from data_ (the data we're serving) into |buf|.
-  // Separate from ReadRawData so we can handle async I/O. Returns the number of
-  // bytes read.
-  int CompleteRead(net::IOBuffer* buf, int buf_size);
+  // Post a task to copy |data_| to |buf_| on a worker thread, to avoid browser
+  // jank. (|data_| might be mem-mapped, so a memcpy can trigger file ops).
+  int PostReadTask(net::IOBuffer* buf, int buf_size);
 
   // The actual data we're serving.  NULL until it's been fetched.
   scoped_refptr<base::RefCountedMemory> data_;
@@ -364,17 +378,22 @@
 
 void URLRequestChromeJob::DataAvailable(base::RefCountedMemory* bytes) {
   TRACE_EVENT_ASYNC_END0("browser", "DataManager:Request", this);
-  if (bytes) {
-    data_ = bytes;
-    if (pending_buf_.get()) {
-      CHECK(pending_buf_->data());
-      int result = CompleteRead(pending_buf_.get(), pending_buf_size_);
-      pending_buf_ = NULL;
-      ReadRawDataComplete(result);
-    }
-  } else {
-    // The request failed.
+  DCHECK(!data_);
+
+  // A passed-in nullptr signals an error.
+  if (!bytes) {
     ReadRawDataComplete(net::ERR_FAILED);
+    return;
+  }
+
+  // All further requests will be satisfied from the passed-in data.
+  data_ = bytes;
+
+  if (pending_buf_) {
+    int result = PostReadTask(pending_buf_.get(), pending_buf_size_);
+    if (result != net::ERR_IO_PENDING)
+      ReadRawDataComplete(result);
+    pending_buf_ = nullptr;
   }
 }
 
@@ -383,32 +402,38 @@
 }
 
 int URLRequestChromeJob::ReadRawData(net::IOBuffer* buf, int buf_size) {
+  DCHECK(!pending_buf_.get());
+
+  // If data isn't available yet, mark this as asynchronous.
   if (!data_.get()) {
-    DCHECK(!pending_buf_.get());
-    CHECK(buf->data());
     pending_buf_ = buf;
     pending_buf_size_ = buf_size;
     return net::ERR_IO_PENDING;
   }
 
-  // Otherwise, the data is available.
-  return CompleteRead(buf, buf_size);
+  return PostReadTask(buf, buf_size);
 }
 
-int URLRequestChromeJob::CompleteRead(net::IOBuffer* buf, int buf_size) {
+int URLRequestChromeJob::PostReadTask(net::IOBuffer* buf, int buf_size) {
+  DCHECK(buf);
+  DCHECK(data_);
+  CHECK(buf->data());
+
   int remaining = data_->size() - data_offset_;
   if (buf_size > remaining)
     buf_size = remaining;
-  if (buf_size > 0) {
-    // TODO(pkasting): Remove ScopedTracker below once crbug.com/455423 is
-    // fixed.
-    tracked_objects::ScopedTracker tracking_profile(
-        FROM_HERE_WITH_EXPLICIT_FUNCTION(
-            "455423 URLRequestChromeJob::CompleteRead memcpy"));
-    memcpy(buf->data(), data_->front() + data_offset_, buf_size);
-    data_offset_ += buf_size;
-  }
-  return buf_size;
+
+  if (buf_size == 0)
+    return 0;
+
+  base::WorkerPool::GetTaskRunner(false)->PostTaskAndReply(
+      FROM_HERE, base::Bind(&CopyData, base::RetainedRef(buf), buf_size, data_,
+                            data_offset_),
+      base::Bind(&URLRequestChromeJob::ReadRawDataComplete, AsWeakPtr(),
+                 buf_size));
+  data_offset_ += buf_size;
+
+  return net::ERR_IO_PENDING;
 }
 
 void URLRequestChromeJob::DelayStartForDevTools(
diff --git a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
index 887f9974..932393d 100644
--- a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
+++ b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
@@ -18,6 +18,7 @@
 #include "content/child/dwrite_font_proxy/dwrite_localized_strings_win.h"
 #include "content/common/dwrite_font_proxy_messages.h"
 #include "content/public/child/child_thread.h"
+#include "ipc/ipc_platform_file.h"
 #include "ipc/ipc_sender.h"
 
 namespace mswr = Microsoft::WRL;
@@ -51,6 +52,7 @@
   FAMILY_INDEX_OUT_OF_RANGE = 3,
   GET_FONT_FILES_SEND_FAILED = 4,
   MAPPED_FILE_FAILED = 5,
+  DUPLICATE_HANDLE_FAILED = 6,
 
   FONT_PROXY_ERROR_MAX_VALUE
 };
@@ -192,14 +194,32 @@
   DCHECK(!families_[*family_index]->IsLoaded());
 
   std::vector<base::string16> file_names;
-  if (!GetSender()->Send(
-          new DWriteFontProxyMsg_GetFontFiles(*family_index, &file_names))) {
+  std::vector<IPC::PlatformFileForTransit> file_handles;
+  if (!GetSender()->Send(new DWriteFontProxyMsg_GetFontFiles(
+          *family_index, &file_names, &file_handles))) {
     LogFontProxyError(GET_FONT_FILES_SEND_FAILED);
     return E_FAIL;
   }
 
+  std::vector<HANDLE> handles;
+  file_handles.reserve(file_names.size() + file_handles.size());
+  for (const base::string16& file_name : file_names) {
+    // This leaks the handles, since they are used as the reference key to
+    // CreateStreamFromKey, and DirectWrite requires the reference keys to
+    // remain valid for the lifetime of the loader. The loader is the font
+    // collection proxy, which remains alive for the lifetime of the renderer.
+    HANDLE handle =
+        CreateFile(file_name.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL,
+                   OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+    if (handle != INVALID_HANDLE_VALUE)
+      handles.push_back(handle);
+  }
+  for (const IPC::PlatformFileForTransit& file_handle : file_handles) {
+    handles.push_back(IPC::PlatformFileForTransitToPlatformFile(file_handle));
+  }
+
   HRESULT hr = mswr::MakeAndInitialize<FontFileEnumerator>(
-      font_file_enumerator, factory, this, &file_names);
+      font_file_enumerator, factory, this, &handles);
 
   if (!SUCCEEDED(hr)) {
     DCHECK(false);
@@ -213,24 +233,23 @@
     const void* font_file_reference_key,
     UINT32 font_file_reference_key_size,
     IDWriteFontFileStream** font_file_stream) {
-  if (!font_file_reference_key) {
-    return E_FAIL;
-  }
-
-  const base::char16* file_name =
-      reinterpret_cast<const base::char16*>(font_file_reference_key);
-  DCHECK_EQ(font_file_reference_key_size % sizeof(base::char16), 0u);
-  size_t file_name_size =
-      static_cast<size_t>(font_file_reference_key_size) / sizeof(base::char16);
-
-  if (file_name_size == 0 || file_name[file_name_size - 1] != L'\0') {
+  if (font_file_reference_key_size != sizeof(HANDLE)) {
     return E_FAIL;
   }
 
   TRACE_EVENT0("dwrite", "FontFileEnumerator::CreateStreamFromKey");
 
-  mswr::ComPtr<IDWriteFontFileStream> stream;
-  if (!SUCCEEDED(mswr::MakeAndInitialize<FontFileStream>(&stream, file_name))) {
+  HANDLE file_handle =
+      *reinterpret_cast<const HANDLE*>(font_file_reference_key);
+
+  if (file_handle == NULL || file_handle == INVALID_HANDLE_VALUE) {
+    DCHECK(false);
+    return E_FAIL;
+  }
+
+  mswr::ComPtr<FontFileStream> stream;
+  if (!SUCCEEDED(
+          mswr::MakeAndInitialize<FontFileStream>(&stream, file_handle))) {
     DCHECK(false);
     return E_FAIL;
   }
@@ -511,17 +530,18 @@
 
 HRESULT FontFileEnumerator::GetCurrentFontFile(IDWriteFontFile** file) {
   DCHECK(file);
-  if (current_file_ >= file_names_.size()) {
+  if (current_file_ >= files_.size()) {
     return E_FAIL;
   }
 
   TRACE_EVENT0("dwrite", "FontFileEnumerator::GetCurrentFontFile");
+
   // CreateCustomFontFileReference ends up calling
   // DWriteFontCollectionProxy::CreateStreamFromKey.
   HRESULT hr = factory_->CreateCustomFontFileReference(
-      reinterpret_cast<const void*>(file_names_[current_file_].c_str()),
-      (file_names_[current_file_].length() + 1) * sizeof(base::char16),
-      loader_.Get() /*IDWriteFontFileLoader*/, file);
+      reinterpret_cast<const void*>(&files_[current_file_]),
+      sizeof(files_[current_file_]), loader_.Get() /*IDWriteFontFileLoader*/,
+      file);
   DCHECK(SUCCEEDED(hr));
   return hr;
 }
@@ -530,7 +550,7 @@
   DCHECK(has_current_file);
 
   TRACE_EVENT0("dwrite", "FontFileEnumerator::MoveNext");
-  if (next_file_ >= file_names_.size()) {
+  if (next_file_ >= files_.size()) {
     *has_current_file = FALSE;
     current_file_ = UINT_MAX;
     return S_OK;
@@ -545,11 +565,10 @@
 HRESULT FontFileEnumerator::RuntimeClassInitialize(
     IDWriteFactory* factory,
     IDWriteFontFileLoader* loader,
-    std::vector<base::string16>* file_names) {
+    std::vector<HANDLE>* files) {
   factory_ = factory;
   loader_ = loader;
-  file_names_.swap(*file_names);
-  file_streams_.resize(file_names_.size());
+  files_.swap(*files);
   return S_OK;
 }
 
@@ -580,9 +599,18 @@
   return S_OK;
 }
 
-HRESULT FontFileStream::RuntimeClassInitialize(
-    const base::string16& file_name) {
-  data_.Initialize(base::FilePath(file_name));
+HRESULT FontFileStream::RuntimeClassInitialize(HANDLE handle) {
+  // Duplicate the original handle so we can reopen the file after the memory
+  // mapped section closes it.
+  HANDLE duplicate_handle;
+  if (!DuplicateHandle(GetCurrentProcess(), handle, GetCurrentProcess(),
+                       &duplicate_handle, 0 /* dwDesiredAccess */,
+                       false /* bInheritHandle */, DUPLICATE_SAME_ACCESS)) {
+    LogFontProxyError(DUPLICATE_HANDLE_FAILED);
+    return E_FAIL;
+  }
+
+  data_.Initialize(base::File(duplicate_handle));
   if (!data_.IsValid()) {
     LogFontProxyError(MAPPED_FILE_FAILED);
     return E_FAIL;
diff --git a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.h b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.h
index 5558760..d6115cda 100644
--- a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.h
+++ b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.h
@@ -164,13 +164,12 @@
   HRESULT STDMETHODCALLTYPE
   RuntimeClassInitialize(IDWriteFactory* factory,
                          IDWriteFontFileLoader* loader,
-                         std::vector<base::string16>* file_names);
+                         std::vector<HANDLE>* files);
 
  private:
   Microsoft::WRL::ComPtr<IDWriteFactory> factory_;
   Microsoft::WRL::ComPtr<IDWriteFontFileLoader> loader_;
-  std::vector<base::string16> file_names_;
-  std::vector<Microsoft::WRL::ComPtr<IDWriteFontFileStream>> file_streams_;
+  std::vector<HANDLE> files_;
   UINT32 next_file_ = 0;
   UINT32 current_file_ = UINT_MAX;
 
@@ -197,8 +196,7 @@
                                              void** fragment_context) override;
   void STDMETHODCALLTYPE ReleaseFileFragment(void* fragment_context) override {}
 
-  HRESULT STDMETHODCALLTYPE
-  RuntimeClassInitialize(const base::string16& file_name);
+  HRESULT STDMETHODCALLTYPE RuntimeClassInitialize(HANDLE handle);
 
  private:
   base::MemoryMappedFile data_;
diff --git a/content/child/dwrite_font_proxy/dwrite_font_proxy_win_unittest.cc b/content/child/dwrite_font_proxy/dwrite_font_proxy_win_unittest.cc
index 88c02ee..3e4bfc5c 100644
--- a/content/child/dwrite_font_proxy/dwrite_font_proxy_win_unittest.cc
+++ b/content/child/dwrite_font_proxy/dwrite_font_proxy_win_unittest.cc
@@ -373,6 +373,39 @@
   EXPECT_EQ(3u, fake_collection_->MessageCount());
 }
 
+TEST_F(DWriteFontProxyUnitTest, TestCustomFontFiles) {
+  scoped_refptr<FakeFontCollection> fonts = new FakeFontCollection();
+  FakeFont& arial = fonts->AddFont(L"Arial").AddFamilyName(L"en-us", L"Arial");
+  for (auto& path : arial_font_files) {
+    base::File file(base::FilePath(path), base::File::FLAG_OPEN |
+                                              base::File::FLAG_READ |
+                                              base::File::FLAG_EXCLUSIVE_WRITE);
+    arial.AddFileHandle(IPC::TakePlatformFileForTransit(std::move(file)));
+  }
+  mswr::ComPtr<DWriteFontCollectionProxy> collection;
+  mswr::MakeAndInitialize<DWriteFontCollectionProxy>(
+      &collection, factory.Get(), fonts->GetTrackingSender());
+
+  // Check that we can get the font family and match a font.
+  UINT32 index = UINT_MAX;
+  BOOL exists = FALSE;
+  collection->FindFamilyName(L"Arial", &index, &exists);
+  mswr::ComPtr<IDWriteFontFamily> family;
+  collection->GetFontFamily(index, &family);
+
+  mswr::ComPtr<IDWriteFont> font;
+  HRESULT hr = family->GetFirstMatchingFont(DWRITE_FONT_WEIGHT_NORMAL,
+                                            DWRITE_FONT_STRETCH_NORMAL,
+                                            DWRITE_FONT_STYLE_NORMAL, &font);
+
+  EXPECT_TRUE(SUCCEEDED(hr));
+  EXPECT_NE(nullptr, font.Get());
+
+  mswr::ComPtr<IDWriteFontFace> font_face;
+  hr = font->CreateFontFace(&font_face);
+  EXPECT_TRUE(SUCCEEDED(hr));
+}
+
 }  // namespace
 
 }  // namespace content
diff --git a/content/common/dwrite_font_proxy_messages.h b/content/common/dwrite_font_proxy_messages.h
index 288a3cf..027ce33 100644
--- a/content/common/dwrite_font_proxy_messages.h
+++ b/content/common/dwrite_font_proxy_messages.h
@@ -10,6 +10,7 @@
 #include "base/strings/string16.h"
 #include "content/common/content_export.h"
 #include "ipc/ipc_message_macros.h"
+#include "ipc/ipc_platform_file.h"
 
 #undef IPC_MESSAGE_EXPORT
 #define IPC_MESSAGE_EXPORT CONTENT_EXPORT
@@ -55,9 +56,11 @@
 
 // Returns the list of font file paths in the system font directory that contain
 // font data for the font family at the specified index.
-IPC_SYNC_MESSAGE_CONTROL1_1(DWriteFontProxyMsg_GetFontFiles,
-                            uint32_t /* family_index */,
-                            std::vector<base::string16> /* out file_paths */)
+IPC_SYNC_MESSAGE_CONTROL1_2(
+    DWriteFontProxyMsg_GetFontFiles,
+    uint32_t /* family_index */,
+    std::vector<base::string16> /* out file_paths */,
+    std::vector<IPC::PlatformFileForTransit> /* out file_handles*/)
 
 // Locates a font family that is able to render the specified text using the
 // specified style. If successful, the family_index and family_name will
diff --git a/content/common/page_state_serialization.cc b/content/common/page_state_serialization.cc
index 7a917d6..c081616 100644
--- a/content/common/page_state_serialization.cc
+++ b/content/common/page_state_serialization.cc
@@ -741,12 +741,11 @@
   return !obj.parse_error;
 }
 
-bool EncodePageState(const ExplodedPageState& exploded, std::string* encoded) {
+void EncodePageState(const ExplodedPageState& exploded, std::string* encoded) {
   SerializeObject obj;
   obj.version = kCurrentVersion;
   WritePageState(exploded, &obj);
   *encoded = obj.GetAsString();
-  return true;
 }
 
 #if defined(OS_ANDROID)
diff --git a/content/common/page_state_serialization.h b/content/common/page_state_serialization.h
index 90484c4..51ad47a4 100644
--- a/content/common/page_state_serialization.h
+++ b/content/common/page_state_serialization.h
@@ -71,7 +71,7 @@
 
 CONTENT_EXPORT bool DecodePageState(const std::string& encoded,
                                     ExplodedPageState* exploded);
-CONTENT_EXPORT bool EncodePageState(const ExplodedPageState& exploded,
+CONTENT_EXPORT void EncodePageState(const ExplodedPageState& exploded,
                                     std::string* encoded);
 
 #if defined(OS_ANDROID)
diff --git a/content/common/page_state_serialization_unittest.cc b/content/common/page_state_serialization_unittest.cc
index 99039f2..9ed9d33ed 100644
--- a/content/common/page_state_serialization_unittest.cc
+++ b/content/common/page_state_serialization_unittest.cc
@@ -241,7 +241,7 @@
   ExplodedPageState input;
 
   std::string encoded;
-  EXPECT_TRUE(EncodePageState(input, &encoded));
+  EncodePageState(input, &encoded);
 
   ExplodedPageState output;
   EXPECT_TRUE(DecodePageState(encoded, &output));
@@ -254,7 +254,7 @@
   PopulateFrameState(&input.top);
 
   std::string encoded;
-  EXPECT_TRUE(EncodePageState(input, &encoded));
+  EncodePageState(input, &encoded);
 
   ExplodedPageState output;
   EXPECT_TRUE(DecodePageState(encoded, &output));
@@ -268,7 +268,7 @@
   PopulateHttpBody(&input.top.http_body, &input.referenced_files);
 
   std::string encoded;
-  EXPECT_TRUE(EncodePageState(input, &encoded));
+  EncodePageState(input, &encoded);
 
   ExplodedPageState output;
   EXPECT_TRUE(DecodePageState(encoded, &output));
@@ -288,7 +288,7 @@
   }
 
   std::string encoded;
-  EXPECT_TRUE(EncodePageState(input, &encoded));
+  EncodePageState(input, &encoded);
 
   ExplodedPageState output;
   EXPECT_TRUE(DecodePageState(encoded, &output));
@@ -371,7 +371,7 @@
   PopulatePageStateForBackwardsCompatTest(&state);
 
   std::string encoded;
-  EXPECT_TRUE(EncodePageState(state, &encoded));
+  EncodePageState(state, &encoded);
 
   std::string base64;
   base::Base64Encode(encoded, &base64);
diff --git a/content/common/view_messages.h b/content/common/view_messages.h
index f81be7a4..562ec44 100644
--- a/content/common/view_messages.h
+++ b/content/common/view_messages.h
@@ -60,6 +60,7 @@
 #include "ui/gfx/geometry/rect_f.h"
 #include "ui/gfx/geometry/vector2d.h"
 #include "ui/gfx/geometry/vector2d_f.h"
+#include "ui/gfx/icc_profile.h"
 #include "ui/gfx/ipc/color/gfx_param_traits.h"
 #include "ui/gfx/ipc/gfx_param_traits.h"
 #include "ui/gfx/ipc/skia/gfx_skia_param_traits.h"
@@ -490,8 +491,8 @@
   // The page zoom level.
   IPC_STRUCT_MEMBER(double, page_zoom_level)
 
-  // The color space to use for image decode.
-  IPC_STRUCT_MEMBER(gfx::ColorSpace, image_decode_color_space)
+  // The ICC profile of the output color space to use for image decode.
+  IPC_STRUCT_MEMBER(gfx::ICCProfile, image_decode_color_space)
 IPC_STRUCT_END()
 
 #if defined(OS_MACOSX)
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index 0b8b49a5..fbe3381 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -131,6 +131,7 @@
       'public/browser/bluetooth_chooser.cc',
       'public/browser/bluetooth_chooser.h',
       'public/browser/browser_accessibility_state.h',
+      'public/browser/browser_associated_interface.h',
       'public/browser/browser_child_process_host.h',
       'public/browser/browser_child_process_host_delegate.cc',
       'public/browser/browser_child_process_host_delegate.h',
@@ -244,7 +245,6 @@
       'public/browser/notification_source.h',
       'public/browser/notification_types.h',
       'public/browser/overscroll_configuration.h',
-      'public/browser/owned_interface.h',
       'public/browser/page_navigator.cc',
       'public/browser/page_navigator.h',
       'public/browser/pepper_flash_settings_helper.h',
diff --git a/content/content_gpu.gypi b/content/content_gpu.gypi
index f2a21d9..512bbe60 100644
--- a/content/content_gpu.gypi
+++ b/content/content_gpu.gypi
@@ -29,8 +29,6 @@
     'gpu/in_process_gpu_thread.h',
     'public/gpu/content_gpu_client.cc',
     'public/gpu/content_gpu_client.h',
-    'public/gpu/gpu_video_decode_accelerator_factory.cc',
-    'public/gpu/gpu_video_decode_accelerator_factory.h',
   ],
   'include_dirs': [
     '..',
diff --git a/content/content_tests.gypi b/content/content_tests.gypi
index ea27333..5e9a6c1 100644
--- a/content/content_tests.gypi
+++ b/content/content_tests.gypi
@@ -394,6 +394,7 @@
       'browser/bluetooth/bluetooth_allowed_devices_map_unittest.cc',
       'browser/bluetooth/bluetooth_blacklist_unittest.cc',
       'browser/bluetooth/frame_connected_bluetooth_devices_unittest.cc',
+      'browser/browser_associated_interface_unittest.cc',
       'browser/browser_thread_unittest.cc',
       'browser/browser_url_handler_impl_unittest.cc',
       'browser/byte_stream_unittest.cc',
@@ -1366,10 +1367,8 @@
       'type': 'static_library',
       'sources': [
         'public/test/test_mojo_service.mojom',
+        'test/test_browser_associated_interfaces.mojom',
       ],
-      'variables': {
-        'use_new_wrapper_types': 'false',
-      },
       'includes': [ '../mojo/mojom_bindings_generator.gypi' ],
     },
     {
diff --git a/content/gpu/gpu_child_thread.cc b/content/gpu/gpu_child_thread.cc
index 5b8e22d..b3d9ba03 100644
--- a/content/gpu/gpu_child_thread.cc
+++ b/content/gpu/gpu_child_thread.cc
@@ -57,9 +57,6 @@
 namespace content {
 namespace {
 
-base::LazyInstance<base::ThreadLocalPointer<GpuChildThread>> g_lazy_tls =
-    LAZY_INSTANCE_INITIALIZER;
-
 static base::LazyInstance<scoped_refptr<ThreadSafeSender> >
     g_thread_safe_sender = LAZY_INSTANCE_INITIALIZER;
 
@@ -144,11 +141,6 @@
 
 }  // namespace
 
-// static
-GpuChildThread* GpuChildThread::current() {
-  return g_lazy_tls.Pointer()->Get();
-}
-
 GpuChildThread::GpuChildThread(
     GpuWatchdogThread* watchdog_thread,
     bool dead_on_arrival,
@@ -166,7 +158,6 @@
   target_services_ = NULL;
 #endif
   g_thread_safe_sender.Get() = thread_safe_sender();
-  g_lazy_tls.Pointer()->Set(this);
 }
 
 GpuChildThread::GpuChildThread(
@@ -195,7 +186,6 @@
     VLOG(1) << "gl::init::InitializeGLOneOff failed";
 
   g_thread_safe_sender.Get() = thread_safe_sender();
-  g_lazy_tls.Pointer()->Set(this);
 }
 
 GpuChildThread::~GpuChildThread() {
@@ -203,7 +193,6 @@
     delete deferred_messages_.front();
     deferred_messages_.pop();
   }
-  g_lazy_tls.Pointer()->Set(nullptr);
 }
 
 void GpuChildThread::Shutdown() {
@@ -403,7 +392,7 @@
 
   if (GetContentClient()->gpu()) {  // NULL in tests.
     GetContentClient()->gpu()->ExposeInterfacesToBrowser(
-        GetInterfaceRegistry());
+        GetInterfaceRegistry(), gpu_preferences_);
   }
 
   GetInterfaceRegistry()->ResumeBinding();
diff --git a/content/gpu/gpu_child_thread.h b/content/gpu/gpu_child_thread.h
index 7eb8c462..8d10a63 100644
--- a/content/gpu/gpu_child_thread.h
+++ b/content/gpu/gpu_child_thread.h
@@ -58,10 +58,6 @@
  public:
   typedef std::queue<IPC::Message*> DeferredMessages;
 
-  // Returns the one gpu thread for this process. Note that this can only
-  // be accessed when running on the gpu thread itself.
-  static GpuChildThread* current();
-
   GpuChildThread(GpuWatchdogThread* gpu_watchdog_thread,
                  bool dead_on_arrival,
                  const gpu::GPUInfo& gpu_info,
diff --git a/content/public/android/java/src/org/chromium/content/browser/crypto/CipherFactory.java b/content/public/android/java/src/org/chromium/content/browser/crypto/CipherFactory.java
index 5210d69..a57f44b 100644
--- a/content/public/android/java/src/org/chromium/content/browser/crypto/CipherFactory.java
+++ b/content/public/android/java/src/org/chromium/content/browser/crypto/CipherFactory.java
@@ -202,7 +202,7 @@
                 }
 
                 try {
-                    SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
+                    SecureRandom random = new SecureRandom();
                     SecureRandomInitializer.initialize(random);
 
                     KeyGenerator generator = KeyGenerator.getInstance("AES");
diff --git a/content/public/browser/browser_associated_interface.h b/content/public/browser/browser_associated_interface.h
new file mode 100644
index 0000000..ca12ff29
--- /dev/null
+++ b/content/public/browser/browser_associated_interface.h
@@ -0,0 +1,121 @@
+// 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 CONTENT_BROWSER_BROWSER_ASSOCIATED_INTERFACE_H_
+#define CONTENT_BROWSER_BROWSER_ASSOCIATED_INTERFACE_H_
+
+#include <memory>
+#include <string>
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "content/common/content_export.h"
+#include "content/public/browser/browser_message_filter.h"
+#include "content/public/browser/browser_thread.h"
+#include "ipc/ipc_channel_proxy.h"
+#include "mojo/public/cpp/bindings/associated_binding.h"
+#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
+
+namespace content {
+
+// A helper interface which owns an associated interface binding on the IO
+// thread. Subclassess of BrowserMessageFilter may use this to simplify
+// the transition to Mojo interfaces.
+//
+// In general the correct pattern for using this is as follows:
+//
+//   class FooMessageFilter : public BrowserMessageFilter,
+//                            public BrowserAssociatedInterface<mojom::Foo>,
+//                            public mojom::Foo {
+//    public:
+//     FooMessageFilter()
+//         : BrowserMessageFilter(FooMsgStart),
+//           BrowserAssociatedInterface<mojom::Foo>(this, this) {}
+//
+//     // BrowserMessageFilter implementation:
+//     bool OnMessageReceived(const IPC::Message& message) override {
+//       // ...
+//       return true;
+//     }
+//
+//     // mojom::Foo implementation:
+//     void DoStuff() override { /* ... */ }
+//   };
+//
+// The remote side of an IPC channel can request the |mojom::Foo| associated
+// interface and use it would use any other associated interface proxy. Messages
+// received for |mojom::Foo| on the local side of the channel will retain FIFO
+// with respect to classical IPC messages received via OnMessageReceived().
+//
+// See BrowserAssociatedInterfaceTest.Basic for a simple working example usage.
+template <typename Interface>
+class BrowserAssociatedInterface {
+ public:
+  // |filter| and |impl| must live at least as long as this object.
+  BrowserAssociatedInterface(BrowserMessageFilter* filter, Interface* impl)
+      : internal_state_(new InternalState(impl)) {
+    internal_state_->Initialize();
+    filter->AddAssociatedInterface(
+        Interface::Name_,
+        base::Bind(&InternalState::BindRequest, internal_state_));
+  }
+
+  ~BrowserAssociatedInterface() {
+    internal_state_->ShutDown();
+  }
+
+ private:
+  class InternalState : public base::RefCountedThreadSafe<InternalState> {
+   public:
+    explicit InternalState(Interface* impl) : impl_(impl) {}
+
+    void Initialize() {
+      if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
+        BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                                base::Bind(&InternalState::Initialize, this));
+        return;
+      }
+      binding_.reset(new mojo::AssociatedBinding<Interface>(impl_));
+    }
+
+    void ShutDown() {
+      if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
+        BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+                                base::Bind(&InternalState::ShutDown, this));
+        return;
+      }
+      binding_.reset();
+    }
+
+    void BindRequest(mojo::ScopedInterfaceEndpointHandle handle) {
+      DCHECK_CURRENTLY_ON(BrowserThread::IO);
+      // If this interface has already been shut down or is already bound, we
+      // drop the request.
+      if (!binding_ || binding_->is_bound())
+        return;
+
+      binding_->Bind(mojo::MakeAssociatedRequest<Interface>(std::move(handle)));
+      binding_->set_connection_error_handler(
+          base::Bind(&InternalState::ShutDown, base::Unretained(this)));
+    }
+
+   private:
+    friend class base::RefCountedThreadSafe<InternalState>;
+
+    ~InternalState() {}
+
+    Interface* impl_;
+    std::unique_ptr<mojo::AssociatedBinding<Interface>> binding_;
+
+    DISALLOW_COPY_AND_ASSIGN(InternalState);
+  };
+
+  scoped_refptr<InternalState> internal_state_;
+
+  DISALLOW_COPY_AND_ASSIGN(BrowserAssociatedInterface);
+};
+
+};
+
+#endif  // CONTENT_BROWSER_BROWSER_ASSOCIATED_INTERFACE_H_
diff --git a/content/public/browser/browser_message_filter.cc b/content/public/browser/browser_message_filter.cc
index 17416202..b6cb2ce0 100644
--- a/content/public/browser/browser_message_filter.cc
+++ b/content/public/browser/browser_message_filter.cc
@@ -114,6 +114,12 @@
   DCHECK(num_message_classes_to_filter);
 }
 
+void BrowserMessageFilter::AddAssociatedInterface(
+    const std::string& name,
+    const IPC::ChannelProxy::GenericAssociatedInterfaceFactory& factory) {
+  associated_interfaces_.emplace_back(name, factory);
+}
+
 base::ProcessHandle BrowserMessageFilter::PeerHandle() {
   return peer_process_.Handle();
 }
@@ -184,4 +190,11 @@
   return internal_;
 }
 
+void BrowserMessageFilter::RegisterAssociatedInterfaces(
+    IPC::ChannelProxy* proxy) {
+  for (const auto& entry : associated_interfaces_)
+    proxy->AddGenericAssociatedInterfaceForIOThread(entry.first, entry.second);
+  associated_interfaces_.clear();
+}
+
 }  // namespace content
diff --git a/content/public/browser/browser_message_filter.h b/content/public/browser/browser_message_filter.h
index 22b0e7d..96fcb4a 100644
--- a/content/public/browser/browser_message_filter.h
+++ b/content/public/browser/browser_message_filter.h
@@ -29,6 +29,7 @@
 }
 
 namespace content {
+class BrowserAssociatedInterfaceTest;
 struct BrowserMessageFilterTraits;
 
 // Base class for message filters in the browser process.  You can receive and
@@ -82,6 +83,12 @@
   // your function will be called on the requested thread.
   virtual bool OnMessageReceived(const IPC::Message& message) = 0;
 
+  // Adds an associated interface factory to this filter. Must be called before
+  // RegisterAssociatedInterfaces().
+  void AddAssociatedInterface(
+      const std::string& name,
+      const IPC::ChannelProxy::GenericAssociatedInterfaceFactory& factory);
+
   // Can be called on any thread, after OnChannelConnected is called.
   base::ProcessHandle PeerHandle();
 
@@ -109,14 +116,17 @@
                                           BrowserMessageFilterTraits>;
 
   class Internal;
+  friend class BrowserAssociatedInterfaceTest;
   friend class BrowserChildProcessHostImpl;
   friend class BrowserPpapiHost;
   friend class RenderProcessHostImpl;
 
-  // This is private because the only classes that need access to it are made
-  // friends above. This is only guaranteed to be valid on creation, after that
-  // this class could outlive the filter.
+  // These are private because the only classes that need access to them are
+  // made friends above. These are only guaranteed to be valid to call on
+  // creation. After that this class could outlive the filter and new interface
+  // registrations could race with incoming requests.
   IPC::MessageFilter* GetFilter();
+  void RegisterAssociatedInterfaces(IPC::ChannelProxy* proxy);
 
   // This implements IPC::MessageFilter so that we can hide that from child
   // classes. Internal keeps a reference to this class, which is why there's a
@@ -128,6 +138,10 @@
   base::Process peer_process_;
 
   std::vector<uint32_t> message_classes_to_filter_;
+
+  std::vector<std::pair<std::string,
+                        IPC::ChannelProxy::GenericAssociatedInterfaceFactory>>
+      associated_interfaces_;
 };
 
 struct BrowserMessageFilterTraits {
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index 8e1ccf6..e78e78a5 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -307,10 +307,6 @@
   return nullptr;
 }
 
-bool ContentBrowserClient::IsFastShutdownPossible() {
-  return true;
-}
-
 base::FilePath ContentBrowserClient::GetDefaultDownloadDirectory() {
   return base::FilePath();
 }
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index 049dcf51..6c7f8e6 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -534,9 +534,6 @@
   // Getters for common objects.
   virtual net::NetLog* GetNetLog();
 
-  // Returns true if fast shutdown is possible.
-  virtual bool IsFastShutdownPossible();
-
   // Called by WebContents to override the WebKit preferences that are used by
   // the renderer. The content layer will add its own settings, and then it's up
   // to the embedder to update it if it wants.
diff --git a/content/public/browser/owned_interface.h b/content/public/browser/owned_interface.h
deleted file mode 100644
index 84be1a3..0000000
--- a/content/public/browser/owned_interface.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (c) 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 CONTENT_BROWSER_OWNED_INTERFACE_H_
-#define CONTENT_BROWSER_OWNED_INTERFACE_H_
-
-#include <memory>
-
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-
-namespace content {
-
-// Common base class for interface impls, allowing them to be stored in a
-// type-erased container for ownership management.
-class OwnedInterface {
- public:
-  OwnedInterface() = default;
-  virtual ~OwnedInterface() = default;
-};
-
-template <typename InterfaceImpl>
-class DeleteOnTaskRunner {
- public:
-  DeleteOnTaskRunner(
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner = nullptr)
-      : task_runner_(task_runner) {}
-  void operator()(const InterfaceImpl* impl) {
-    if (task_runner_) {
-      if (!task_runner_->DeleteSoon(FROM_HERE, impl)) {
-#if defined(UNIT_TEST)
-        // Only logged under unit testing because leaks at shutdown
-        // are acceptable under normal circumstances.
-        LOG(ERROR) << "DeleteSoon failed on thread";
-#endif  // UNIT_TEST
-      }
-    } else {
-      delete impl;
-    }
-  }
-  ~DeleteOnTaskRunner() = default;
-
- private:
-  const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-};
-
-template <typename InterfaceImpl>
-class OwnedInterfaceImpl : public OwnedInterface {
- public:
-  OwnedInterfaceImpl(
-      std::unique_ptr<InterfaceImpl> impl,
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner = nullptr)
-      : impl_(impl.release(), DeleteOnTaskRunner<InterfaceImpl>(task_runner)) {}
-
-  ~OwnedInterfaceImpl() = default;
-
-  // The returned pointer is owned by this object, which must outlive it.
-  InterfaceImpl* get() { return impl_.get(); }
-
- private:
-  std::unique_ptr<InterfaceImpl, DeleteOnTaskRunner<InterfaceImpl>> impl_;
-
-  DISALLOW_COPY_AND_ASSIGN(OwnedInterfaceImpl);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_OWNED_INTERFACE_H_
diff --git a/content/public/browser/render_process_host.h b/content/public/browser/render_process_host.h
index 6b35bf2..fb3ee7d9 100644
--- a/content/public/browser/render_process_host.h
+++ b/content/public/browser/render_process_host.h
@@ -16,7 +16,6 @@
 #include "base/process/process_handle.h"
 #include "base/supports_user_data.h"
 #include "content/common/content_export.h"
-#include "content/public/browser/owned_interface.h"
 #include "ipc/ipc_channel_proxy.h"
 #include "ipc/ipc_sender.h"
 #include "services/shell/public/cpp/interface_registry.h"
@@ -42,7 +41,6 @@
 namespace content {
 class BrowserContext;
 class BrowserMessageFilter;
-class OwnedInterface;
 class RenderProcessHostObserver;
 class RenderWidgetHost;
 class StoragePartition;
@@ -185,36 +183,6 @@
   // Adds a message filter to the IPC channel.
   virtual void AddFilter(BrowserMessageFilter* filter) = 0;
 
-  // Adds an interface impl which will be owned by this host and registered in
-  // its interface registry. Requests to bind will be handled by calling
-  // |callback|, which must be a member function on |impl|. The method referred
-  // to by |Callback| must conform to the signature `void fun(MyInterfaceRequest
-  // request)`.
-  //
-  // New connections and incoming messages will be dispatched on |task_runner|
-  // (or on the current task runner if not specified). The impl will also be
-  // deleted on |task_runner|.
-  template <typename InterfaceImpl, typename Callback>
-  void AddOwnedInterface(std::unique_ptr<InterfaceImpl> impl,
-                         Callback callback,
-                         const scoped_refptr<base::SingleThreadTaskRunner>&
-                             task_runner = nullptr) {
-    auto owned = base::MakeUnique<content::OwnedInterfaceImpl<InterfaceImpl>>(
-        std::move(impl), task_runner);
-    GetInterfaceRegistry()->AddInterface(
-        base::Bind(callback, base::Unretained(owned->get())), task_runner);
-    AddOwnedInterface(std::move(owned));
-  }
-
-  // Adds the |impl| to the collection of interface impls owned by this
-  // host. The impl must be registered separately using
-  // |GetInterfaceRegistry()|. This function is useful if a single object is
-  // used to implement several interfaces.
-  //
-  // Implementation of |AddOwnedInterface()| must guarantee that the added impls
-  // outlive the |InterfaceRegistry| returned by |GetInterfaceRegistry()|.
-  virtual void AddOwnedInterface(std::unique_ptr<OwnedInterface> impl) = 0;
-
   // Try to shutdown the associated render process as fast as possible
   virtual bool FastShutdownForPageCount(size_t count) = 0;
 
diff --git a/content/public/common/page_state.cc b/content/public/common/page_state.cc
index b082d54c9..01cbedb 100644
--- a/content/public/common/page_state.cc
+++ b/content/public/common/page_state.cc
@@ -32,9 +32,7 @@
 
 PageState ToPageState(const ExplodedPageState& state) {
   std::string encoded_data;
-  if (!EncodePageState(state, &encoded_data))
-    return PageState();
-
+  EncodePageState(state, &encoded_data);
   return PageState::CreateFromEncodedData(encoded_data);
 }
 
diff --git a/content/public/gpu/BUILD.gn b/content/public/gpu/BUILD.gn
index 654b19a1..717fc4b 100644
--- a/content/public/gpu/BUILD.gn
+++ b/content/public/gpu/BUILD.gn
@@ -30,8 +30,6 @@
   sources = [
     "content_gpu_client.cc",
     "content_gpu_client.h",
-    "gpu_video_decode_accelerator_factory.cc",
-    "gpu_video_decode_accelerator_factory.h",
   ]
 
   deps = [
@@ -41,8 +39,6 @@
     "//content/public/common:common_sources",
     "//gpu/command_buffer/service",
     "//gpu/config",
-    "//media",
-    "//media/gpu",
   ]
 
   allow_circular_includes_from = [ "//content/gpu:gpu_sources" ]
diff --git a/content/public/gpu/DEPS b/content/public/gpu/DEPS
index 0995637..e581f60 100644
--- a/content/public/gpu/DEPS
+++ b/content/public/gpu/DEPS
@@ -3,7 +3,4 @@
     "+content/common",
     "+content/gpu",
   ],
-  "gpu_video_decode_accelerator_factory.h": [
-    "+gpu",
-  ],
 }
diff --git a/content/public/gpu/content_gpu_client.h b/content/public/gpu/content_gpu_client.h
index 25fee78..9746bba 100644
--- a/content/public/gpu/content_gpu_client.h
+++ b/content/public/gpu/content_gpu_client.h
@@ -10,6 +10,7 @@
 
 namespace gpu {
 class SyncPointManager;
+struct GpuPreferences;
 }
 
 namespace shell {
@@ -30,7 +31,9 @@
 
   // Allows the client to expose interfaces from the GPU process to the browser
   // process via |registry|.
-  virtual void ExposeInterfacesToBrowser(shell::InterfaceRegistry* registry) {}
+  virtual void ExposeInterfacesToBrowser(
+      shell::InterfaceRegistry* registry,
+      const gpu::GpuPreferences& gpu_preferences) {}
 
   // Allows client to supply a SyncPointManager instance instead of having
   // content internally create one.
diff --git a/content/public/gpu/gpu_video_decode_accelerator_factory.cc b/content/public/gpu/gpu_video_decode_accelerator_factory.cc
deleted file mode 100644
index bfcd4e6..0000000
--- a/content/public/gpu/gpu_video_decode_accelerator_factory.cc
+++ /dev/null
@@ -1,86 +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 "content/public/gpu/gpu_video_decode_accelerator_factory.h"
-
-#include "base/memory/ptr_util.h"
-#include "content/gpu/gpu_child_thread.h"
-#include "media/gpu/gpu_video_decode_accelerator_factory_impl.h"
-
-namespace content {
-
-GpuVideoDecodeAcceleratorFactory::~GpuVideoDecodeAcceleratorFactory() {}
-
-// static
-std::unique_ptr<GpuVideoDecodeAcceleratorFactory>
-GpuVideoDecodeAcceleratorFactory::Create(
-    const GetGLContextCallback& get_gl_context_cb,
-    const MakeGLContextCurrentCallback& make_context_current_cb,
-    const BindGLImageCallback& bind_image_cb) {
-  auto gvdafactory_impl = media::GpuVideoDecodeAcceleratorFactoryImpl::Create(
-      get_gl_context_cb, make_context_current_cb, bind_image_cb);
-  if (!gvdafactory_impl)
-    return nullptr;
-
-  return base::WrapUnique(
-      new GpuVideoDecodeAcceleratorFactory(std::move(gvdafactory_impl)));
-}
-
-// static
-std::unique_ptr<GpuVideoDecodeAcceleratorFactory>
-GpuVideoDecodeAcceleratorFactory::CreateWithGLES2Decoder(
-    const GetGLContextCallback& get_gl_context_cb,
-    const MakeGLContextCurrentCallback& make_context_current_cb,
-    const BindGLImageCallback& bind_image_cb,
-    const GetGLES2DecoderCallback& get_gles2_decoder_cb) {
-  auto gvdafactory_impl =
-      media::GpuVideoDecodeAcceleratorFactoryImpl::CreateWithGLES2Decoder(
-          get_gl_context_cb, make_context_current_cb, bind_image_cb,
-          get_gles2_decoder_cb);
-  if (!gvdafactory_impl)
-    return nullptr;
-
-  return base::WrapUnique(
-      new GpuVideoDecodeAcceleratorFactory(std::move(gvdafactory_impl)));
-}
-
-// static
-std::unique_ptr<GpuVideoDecodeAcceleratorFactory>
-GpuVideoDecodeAcceleratorFactory::CreateWithNoGL() {
-  auto gvdafactory_impl =
-      media::GpuVideoDecodeAcceleratorFactoryImpl::CreateWithNoGL();
-  if (!gvdafactory_impl)
-    return nullptr;
-
-  return base::WrapUnique(
-      new GpuVideoDecodeAcceleratorFactory(std::move(gvdafactory_impl)));
-}
-
-// static
-gpu::VideoDecodeAcceleratorCapabilities
-GpuVideoDecodeAcceleratorFactory::GetDecoderCapabilities() {
-  const gpu::GpuPreferences gpu_preferences =
-      GpuChildThread::current()->gpu_preferences();
-  return media::GpuVideoDecodeAcceleratorFactoryImpl::GetDecoderCapabilities(
-      gpu_preferences);
-}
-
-std::unique_ptr<media::VideoDecodeAccelerator>
-GpuVideoDecodeAcceleratorFactory::CreateVDA(
-    media::VideoDecodeAccelerator::Client* client,
-    const media::VideoDecodeAccelerator::Config& config) {
-  if (!gvdafactory_impl_)
-    return nullptr;
-
-  const gpu::GpuPreferences gpu_preferences =
-      GpuChildThread::current()->gpu_preferences();
-  return gvdafactory_impl_->CreateVDA(
-      client, config, gpu::GpuDriverBugWorkarounds(), gpu_preferences);
-}
-
-GpuVideoDecodeAcceleratorFactory::GpuVideoDecodeAcceleratorFactory(
-    std::unique_ptr<media::GpuVideoDecodeAcceleratorFactoryImpl>
-    gvdafactory_impl) : gvdafactory_impl_(std::move(gvdafactory_impl)) {}
-
-}  // namespace content
diff --git a/content/public/gpu/gpu_video_decode_accelerator_factory.h b/content/public/gpu/gpu_video_decode_accelerator_factory.h
deleted file mode 100644
index e45b8f4..0000000
--- a/content/public/gpu/gpu_video_decode_accelerator_factory.h
+++ /dev/null
@@ -1,104 +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 CONTENT_PUBLIC_GPU_GPU_VIDEO_DECODE_ACCELERATOR_FACTORY_H_
-#define CONTENT_PUBLIC_GPU_GPU_VIDEO_DECODE_ACCELERATOR_FACTORY_H_
-
-#include <memory>
-
-#include "base/callback.h"
-#include "base/memory/weak_ptr.h"
-#include "content/common/content_export.h"
-#include "gpu/config/gpu_info.h"
-#include "media/video/video_decode_accelerator.h"
-
-namespace gl {
-class GLContext;
-class GLImage;
-}
-
-namespace gpu {
-namespace gles2 {
-class GLES2Decoder;
-}
-}
-
-namespace media {
-class GpuVideoDecodeAcceleratorFactoryImpl;
-}
-
-namespace content {
-
-// This factory allows creation of VideoDecodeAccelerator implementations,
-// providing the most applicable VDA for current platform and given
-// configuration. To be used in GPU process only.
-class CONTENT_EXPORT GpuVideoDecodeAcceleratorFactory {
- public:
-  virtual ~GpuVideoDecodeAcceleratorFactory();
-
-  // Return current GLContext.
-  using GetGLContextCallback = base::Callback<gl::GLContext*(void)>;
-
-  // Make the applicable GL context current. To be called by VDAs before
-  // executing any GL calls. Return true on success, false otherwise.
-  using MakeGLContextCurrentCallback = base::Callback<bool(void)>;
-
-  // Bind |image| to |client_texture_id| given |texture_target|. If
-  // |can_bind_to_sampler| is true, then the image may be used as a sampler
-  // directly, otherwise a copy to a staging buffer is required.
-  // Return true on success, false otherwise.
-  using BindGLImageCallback =
-      base::Callback<bool(uint32_t client_texture_id,
-                          uint32_t texture_target,
-                          const scoped_refptr<gl::GLImage>& image,
-                          bool can_bind_to_sampler)>;
-
-  // Return a WeakPtr to a GLES2Decoder, if one is available.
-  using GetGLES2DecoderCallback =
-      base::Callback<base::WeakPtr<gpu::gles2::GLES2Decoder>(void)>;
-
-  // Create a factory capable of producing VDA instances for current platform.
-  static std::unique_ptr<GpuVideoDecodeAcceleratorFactory> Create(
-      const GetGLContextCallback& get_gl_context_cb,
-      const MakeGLContextCurrentCallback& make_context_current_cb,
-      const BindGLImageCallback& bind_image_cb);
-
-  static std::unique_ptr<GpuVideoDecodeAcceleratorFactory>
-  CreateWithGLES2Decoder(
-      const GetGLContextCallback& get_gl_context_cb,
-      const MakeGLContextCurrentCallback& make_context_current_cb,
-      const BindGLImageCallback& bind_image_cb,
-      const GetGLES2DecoderCallback& get_gles2_decoder_cb);
-
-  // Create a factory capable of producing VDA instances for current platform
-  // with no GL support.
-  // A factory created with this method will only be able to produce VDAs with
-  // no ability to call GL functions/access GL state. This also implies no
-  // ability to decode into textures provided by the client.
-  static std::unique_ptr<GpuVideoDecodeAcceleratorFactory> CreateWithNoGL();
-
-  // Return decoder capabilities supported on the current platform.
-  static gpu::VideoDecodeAcceleratorCapabilities GetDecoderCapabilities();
-
-  // Create a VDA for the current platform for |client| with the given |config|
-  // and for given |gpu_preferences|. Return nullptr on failure.
-  virtual std::unique_ptr<media::VideoDecodeAccelerator> CreateVDA(
-      media::VideoDecodeAccelerator::Client* client,
-      const media::VideoDecodeAccelerator::Config& config);
-
- private:
-  // TODO(posciak): This is temporary and will not be needed once
-  // media::GpuVideoDecodeAcceleratorFactoryImpl implements
-  // GpuVideoDecodeAcceleratorFactory, see crbug.com/597150 and related.
-  GpuVideoDecodeAcceleratorFactory(
-      std::unique_ptr<media::GpuVideoDecodeAcceleratorFactoryImpl>
-      gvdafactory_impl);
-
-  std::unique_ptr<media::GpuVideoDecodeAcceleratorFactoryImpl>
-      gvdafactory_impl_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_PUBLIC_GPU_GPU_VIDEO_DECODE_ACCELERATOR_FACTORY_H_
diff --git a/content/public/test/mock_render_process_host.cc b/content/public/test/mock_render_process_host.cc
index 913387d..8c955ee 100644
--- a/content/public/test/mock_render_process_host.cc
+++ b/content/public/test/mock_render_process_host.cc
@@ -104,6 +104,7 @@
 
 bool MockRenderProcessHost::Init() {
   has_connection_ = true;
+  remote_interfaces_.reset(new shell::InterfaceProvider);
   return true;
 }
 
@@ -248,9 +249,6 @@
 void MockRenderProcessHost::AddFilter(BrowserMessageFilter* filter) {
 }
 
-void MockRenderProcessHost::AddOwnedInterface(
-    std::unique_ptr<OwnedInterface> impl) {}
-
 bool MockRenderProcessHost::FastShutdownForPageCount(size_t count) {
   if (GetActiveViewCount() == count)
     return FastShutdownIfPossible();
diff --git a/content/public/test/mock_render_process_host.h b/content/public/test/mock_render_process_host.h
index 89863f5..170418d 100644
--- a/content/public/test/mock_render_process_host.h
+++ b/content/public/test/mock_render_process_host.h
@@ -25,7 +25,6 @@
 namespace content {
 
 class MockRenderProcessHostFactory;
-class OwnedInterface;
 
 // A mock render process host that has no corresponding renderer process.  All
 // IPC messages are sent into the message sink for inspection by tests.
@@ -78,7 +77,6 @@
   bool InSameStoragePartition(StoragePartition* partition) const override;
   IPC::ChannelProxy* GetChannel() override;
   void AddFilter(BrowserMessageFilter* filter) override;
-  void AddOwnedInterface(std::unique_ptr<OwnedInterface> impl) override;
   bool FastShutdownForPageCount(size_t count) override;
   base::TimeDelta GetChildProcessIdleTime() const override;
   void FilterURL(bool empty_allowed, GURL* url) override;
diff --git a/content/renderer/devtools/render_widget_screen_metrics_emulator.cc b/content/renderer/devtools/render_widget_screen_metrics_emulator.cc
index bad6fa72..d5f4983 100644
--- a/content/renderer/devtools/render_widget_screen_metrics_emulator.cc
+++ b/content/renderer/devtools/render_widget_screen_metrics_emulator.cc
@@ -25,10 +25,10 @@
 }
 
 RenderWidgetScreenMetricsEmulator::~RenderWidgetScreenMetricsEmulator() {
+  delegate_->Resize(original_resize_params_);
   delegate_->SetScreenMetricsEmulationParameters(false, emulation_params_);
   delegate_->SetScreenRects(original_view_screen_rect_,
                             original_window_screen_rect_);
-  delegate_->Resize(original_resize_params_);
 }
 
 void RenderWidgetScreenMetricsEmulator::ChangeEmulationParams(
diff --git a/content/renderer/history_serialization.cc b/content/renderer/history_serialization.cc
index ee5981af..45855c15 100644
--- a/content/renderer/history_serialization.cc
+++ b/content/renderer/history_serialization.cc
@@ -122,9 +122,7 @@
                                 &state.referenced_files);
 
   std::string encoded_data;
-  if (!EncodePageState(state, &encoded_data))
-    return PageState();
-
+  EncodePageState(state, &encoded_data);
   return PageState::CreateFromEncodedData(encoded_data);
 }
 
@@ -135,9 +133,7 @@
   GenerateFrameStateFromItem(item, &state.top);
 
   std::string encoded_data;
-  if (!EncodePageState(state, &encoded_data))
-    return PageState();
-
+  EncodePageState(state, &encoded_data);
   return PageState::CreateFromEncodedData(encoded_data);
 }
 
diff --git a/content/renderer/image_downloader/image_downloader_impl.cc b/content/renderer/image_downloader/image_downloader_impl.cc
index 3c67180f..945b4628 100644
--- a/content/renderer/image_downloader/image_downloader_impl.cc
+++ b/content/renderer/image_downloader/image_downloader_impl.cc
@@ -17,6 +17,7 @@
 #include "content/renderer/fetchers/multi_resolution_image_resource_fetcher.h"
 #include "net/base/data_url.h"
 #include "skia/ext/image_operations.h"
+#include "third_party/WebKit/public/platform/WebCachePolicy.h"
 #include "third_party/WebKit/public/platform/WebURLRequest.h"
 #include "third_party/WebKit/public/platform/WebVector.h"
 #include "third_party/WebKit/public/web/WebLocalFrame.h"
diff --git a/content/renderer/media/render_media_client.cc b/content/renderer/media/render_media_client.cc
index 76001a7..b01e7e1 100644
--- a/content/renderer/media/render_media_client.cc
+++ b/content/renderer/media/render_media_client.cc
@@ -93,6 +93,28 @@
   GetContentClient()->renderer()->RecordRapporURL(metric, url);
 }
 
+bool RenderMediaClient::IsSupportedVideoConfig(media::VideoCodec codec,
+                                               media::VideoCodecProfile profile,
+                                               int level) {
+  switch (codec) {
+    case media::kCodecH264:
+    case media::kCodecVP8:
+    case media::kCodecVP9:
+    case media::kCodecTheora:
+      return true;
+
+    case media::kUnknownVideoCodec:
+    case media::kCodecVC1:
+    case media::kCodecMPEG2:
+    case media::kCodecMPEG4:
+    case media::kCodecHEVC:
+      return false;
+  }
+
+  NOTREACHED();
+  return false;
+}
+
 void RenderMediaClient::SetTickClockForTesting(
     std::unique_ptr<base::TickClock> tick_clock) {
   tick_clock_.swap(tick_clock);
diff --git a/content/renderer/media/render_media_client.h b/content/renderer/media/render_media_client.h
index 1d5d345..8f793d9 100644
--- a/content/renderer/media/render_media_client.h
+++ b/content/renderer/media/render_media_client.h
@@ -32,6 +32,9 @@
       std::vector<std::unique_ptr<media::KeySystemProperties>>*
           key_systems_properties) final;
   void RecordRapporURL(const std::string& metric, const GURL& url) final;
+  bool IsSupportedVideoConfig(media::VideoCodec codec,
+                              media::VideoCodecProfile profile,
+                              int level) override;
 
   void SetTickClockForTesting(std::unique_ptr<base::TickClock> tick_clock);
 
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 4c0be2b..d799759 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -5602,7 +5602,11 @@
     }
 
     // A session history navigation should have been accompanied by state.
-    CHECK_EQ(request_params.page_id, -1);
+    // TODO(creis): This is known to be failing in UseSubframeNavigationEntries
+    // in https://crbug.com/568703, when the PageState on a FrameNavigationEntry
+    // is unexpectedly empty.  Until the cause is found, keep this as a DCHECK
+    // and load the URL without PageState.
+    DCHECK_EQ(request_params.page_id, -1);
 
     should_load_request = true;
   }
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 2511f67..35f5401 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -725,8 +725,7 @@
       command_line.HasSwitch(switches::kRootLayerScrolls));
   webview()->setShowFPSCounter(
       command_line.HasSwitch(cc::switches::kShowFPSCounter));
-  webview()->setDeviceColorProfile(
-      params.image_decode_color_space.GetICCProfile());
+  webview()->setDeviceColorProfile(params.image_decode_color_space.GetData());
 
   ApplyWebPreferencesInternal(webkit_preferences_, webview(), compositor_deps_);
 
diff --git a/content/shell/browser/layout_test/blink_test_controller.cc b/content/shell/browser/layout_test/blink_test_controller.cc
index dae32588..eb1a913 100644
--- a/content/shell/browser/layout_test/blink_test_controller.cc
+++ b/content/shell/browser/layout_test/blink_test_controller.cc
@@ -774,7 +774,7 @@
   StoragePartition* storage_partition =
       BrowserContext::GetStoragePartition(browser_context, NULL);
   storage_partition->GetDOMStorageContext()->DeleteLocalStorage(
-      content::LayoutTestDevToolsFrontend::GetDevToolsPathAsURL("", "")
+      content::LayoutTestDevToolsFrontend::GetDevToolsPathAsURL("")
           .GetOrigin());
 }
 
diff --git a/content/shell/browser/layout_test/layout_test_devtools_frontend.cc b/content/shell/browser/layout_test/layout_test_devtools_frontend.cc
index 7e5d006..daf127b 100644
--- a/content/shell/browser/layout_test/layout_test_devtools_frontend.cc
+++ b/content/shell/browser/layout_test/layout_test_devtools_frontend.cc
@@ -30,15 +30,13 @@
                                         gfx::Size());
   LayoutTestDevToolsFrontend* devtools_frontend =
       new LayoutTestDevToolsFrontend(shell, inspected_contents);
-
-  shell->LoadURL(GetDevToolsPathAsURL(settings, frontend_url));
-
+  devtools_frontend->SetPreferences(settings);
+  shell->LoadURL(GetDevToolsPathAsURL(frontend_url));
   return devtools_frontend;
 }
 
 // static.
 GURL LayoutTestDevToolsFrontend::GetDevToolsPathAsURL(
-    const std::string& settings,
     const std::string& frontend_url) {
   if (!frontend_url.empty())
     return GURL(frontend_url);
@@ -62,18 +60,16 @@
 #if defined(DEBUG_DEVTOOLS)
   url_string += "&debugFrontend=true";
 #endif  // defined(DEBUG_DEVTOOLS)
-  if (!settings.empty())
-    url_string += "&settings=" + settings;
   return GURL(url_string);
 }
 
 void LayoutTestDevToolsFrontend::ReuseFrontend(const std::string& settings,
                                                const std::string frontend_url) {
   DisconnectFromTarget();
-  preferences()->Clear();
+  SetPreferences(settings);
   ready_for_test_ = false;
   pending_evaluations_.clear();
-  frontend_shell()->LoadURL(GetDevToolsPathAsURL(settings, frontend_url));
+  frontend_shell()->LoadURL(GetDevToolsPathAsURL(frontend_url));
 }
 
 void LayoutTestDevToolsFrontend::EvaluateInFrontend(
diff --git a/content/shell/browser/layout_test/layout_test_devtools_frontend.h b/content/shell/browser/layout_test/layout_test_devtools_frontend.h
index ec6dd37..54b1386 100644
--- a/content/shell/browser/layout_test/layout_test_devtools_frontend.h
+++ b/content/shell/browser/layout_test/layout_test_devtools_frontend.h
@@ -21,8 +21,7 @@
                                           const std::string& settings,
                                           const std::string& frontend_url);
 
-  static GURL GetDevToolsPathAsURL(const std::string& settings,
-                                   const std::string& frontend_url);
+  static GURL GetDevToolsPathAsURL(const std::string& frontend_url);
 
   void ReuseFrontend(const std::string& settings,
                      const std::string frontend_url);
diff --git a/content/shell/browser/shell_devtools_frontend.cc b/content/shell/browser/shell_devtools_frontend.cc
index d4ffd09..9b597db 100644
--- a/content/shell/browser/shell_devtools_frontend.cc
+++ b/content/shell/browser/shell_devtools_frontend.cc
@@ -193,6 +193,21 @@
   delete this;
 }
 
+void ShellDevToolsFrontend::SetPreferences(const std::string& json) {
+  preferences_.Clear();
+  if (json.empty())
+    return;
+  base::DictionaryValue* dict = nullptr;
+  std::unique_ptr<base::Value> parsed = base::JSONReader::Read(json);
+  if (!parsed || !parsed->GetAsDictionary(&dict))
+    return;
+  for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) {
+    if (!it.value().IsType(base::Value::TYPE_STRING))
+      continue;
+    preferences_.SetWithoutPathExpansion(it.key(), it.value().CreateDeepCopy());
+  }
+}
+
 void ShellDevToolsFrontend::HandleMessageFromDevToolsFrontend(
     const std::string& message) {
   if (!agent_host_)
diff --git a/content/shell/browser/shell_devtools_frontend.h b/content/shell/browser/shell_devtools_frontend.h
index 6e67db74..cd4f3b5a 100644
--- a/content/shell/browser/shell_devtools_frontend.h
+++ b/content/shell/browser/shell_devtools_frontend.h
@@ -55,7 +55,7 @@
   void AgentHostClosed(DevToolsAgentHost* agent_host, bool replaced) override;
   void DispatchProtocolMessage(DevToolsAgentHost* agent_host,
                                const std::string& message) override;
-  base::DictionaryValue* preferences() { return &preferences_; }
+  void SetPreferences(const std::string& json);
   virtual void HandleMessageFromDevToolsFrontend(const std::string& message);
 
  private:
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 947faed..d5434bde 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -264,9 +264,8 @@
 mojom("content_test_mojo_bindings") {
   sources = [
     "../public/test/test_mojo_service.mojom",
+    "test_browser_associated_interfaces.mojom",
   ]
-
-  use_new_wrapper_types = false
 }
 
 mojom("web_ui_test_mojo_bindings") {
diff --git a/content/test/OWNERS b/content/test/OWNERS
index ec643dcd..728ae2c 100644
--- a/content/test/OWNERS
+++ b/content/test/OWNERS
@@ -12,3 +12,9 @@
 per-file fake_renderer_scheduler.*=alexclarke@chromium.org
 per-file fake_renderer_scheduler.*=rmcilroy@chromium.org
 per-file fake_renderer_scheduler.*=skyostil@chromium.org
+
+# Make the mojom security presubmit happy with the following lines, despite also
+# allowing wildcard ownership for any test mojom here.
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
+per-file *.mojom=*
diff --git a/content/test/dwrite_font_fake_sender_win.cc b/content/test/dwrite_font_fake_sender_win.cc
index a525ee6..97e8588d 100644
--- a/content/test/dwrite_font_fake_sender_win.cc
+++ b/content/test/dwrite_font_fake_sender_win.cc
@@ -109,8 +109,9 @@
 
 void FakeFontCollection::ReplySender::OnGetFontFiles(
     uint32_t family_index,
-    std::vector<base::string16>* file_paths) {
-  collection_->OnGetFontFiles(family_index, file_paths);
+    std::vector<base::string16>* file_paths,
+    std::vector<IPC::PlatformFileForTransit>* file_handles) {
+  collection_->OnGetFontFiles(family_index, file_paths, file_handles);
 }
 
 void FakeFontCollection::ReplySender::OnMapCharacters(
@@ -172,10 +173,12 @@
 
 void FakeFontCollection::OnGetFontFiles(
     uint32_t family_index,
-    std::vector<base::string16>* file_paths) {
+    std::vector<base::string16>* file_paths,
+    std::vector<IPC::PlatformFileForTransit>* file_handles) {
   if (family_index >= fonts_.size())
     return;
   *file_paths = fonts_[family_index].file_paths_;
+  *file_handles = fonts_[family_index].file_handles_;
 }
 
 void FakeFontCollection::OnMapCharacters(const base::string16& text,
diff --git a/content/test/dwrite_font_fake_sender_win.h b/content/test/dwrite_font_fake_sender_win.h
index 84363cb..6dd9390c 100644
--- a/content/test/dwrite_font_fake_sender_win.h
+++ b/content/test/dwrite_font_fake_sender_win.h
@@ -17,6 +17,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/strings/string16.h"
 #include "ipc/ipc_message.h"
+#include "ipc/ipc_platform_file.h"
 #include "ipc/ipc_sender.h"
 
 struct DWriteFontStyle;
@@ -44,6 +45,11 @@
     return *this;
   }
 
+  FakeFont& AddFileHandle(IPC::PlatformFileForTransit handle) {
+    file_handles_.push_back(handle);
+    return *this;
+  }
+
   FakeFont& AddFamilyName(const base::string16& locale,
                           const base::string16& family_name) {
     family_names_.emplace_back(locale, family_name);
@@ -56,6 +62,7 @@
   friend FakeFontCollection;
   base::string16 font_name_;
   std::vector<base::string16> file_paths_;
+  std::vector<IPC::PlatformFileForTransit> file_handles_;
   std::vector<std::pair<base::string16, base::string16>> family_names_;
 
   DISALLOW_ASSIGN(FakeFont);
@@ -117,7 +124,8 @@
         uint32_t family_index,
         std::vector<std::pair<base::string16, base::string16>>* family_names);
     void OnGetFontFiles(uint32_t family_index,
-                        std::vector<base::string16>* file_paths_);
+                        std::vector<base::string16>* file_paths,
+                        std::vector<IPC::PlatformFileForTransit>* file_handles);
 
     void OnMapCharacters(const base::string16& text,
                          const DWriteFontStyle& font_style,
@@ -158,7 +166,8 @@
       std::vector<std::pair<base::string16, base::string16>>* family_names);
 
   void OnGetFontFiles(uint32_t family_index,
-                      std::vector<base::string16>* file_paths);
+                      std::vector<base::string16>* file_paths,
+                      std::vector<IPC::PlatformFileForTransit>* file_handles);
 
   void OnMapCharacters(const base::string16& text,
                        const DWriteFontStyle& font_style,
diff --git a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
index e6e878d..5ebfbc5dc 100644
--- a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
+++ b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
@@ -593,10 +593,6 @@
     # Linux Intel without ANGLE only
     self.Fail('conformance2/reading/read-pixels-from-fbo-test.html',
         ['linux', 'intel', 'no_angle'], bug=598902)
-    self.Fail('conformance2/renderbuffers/framebuffer-object-attachment.html',
-        ['linux', 'intel', 'no_angle'], bug=598902)
-    self.Fail('deqp/functional/gles3/fbocompleteness.html',
-        ['linux', 'intel', 'no_angle'], bug=598902)
 
     # Linux AMD only.
     # It looks like AMD shader compiler rejects many valid ES3 semantics.
@@ -616,8 +612,6 @@
         ['linux', 'amd'], bug=483282)
     self.Fail('deqp/functional/gles3/texturefiltering/3d*',
         ['linux', 'amd'], bug=606114)
-    self.Fail('deqp/functional/gles3/fbocompleteness.html',
-        ['linux', 'amd'], bug=483282)
     self.Fail('deqp/functional/gles3/lifetime.html',
         ['linux', 'amd'], bug=483282)
     self.Fail('deqp/functional/gles3/shadertexturefunction/texture.html',
diff --git a/content/test/gpu/page_sets/gpu_process_tests.py b/content/test/gpu/page_sets/gpu_process_tests.py
index f147cba9..87fa7e5 100644
--- a/content/test/gpu/page_sets/gpu_process_tests.py
+++ b/content/test/gpu/page_sets/gpu_process_tests.py
@@ -317,7 +317,7 @@
       self.expected_workaround = "texsubimage_faster_than_teximage"
       self.unexpected_workaround = "disable_d3d11"
     elif sys.platform.startswith('linux'):
-      self.expected_workaround = "disable_multisampled_render_to_texture"
+      self.expected_workaround = "disable_transparent_visuals"
     elif sys.platform == 'darwin':
       pass
     super(DriverBugWorkaroundsUponGLRendererPage, self).__init__(
diff --git a/content/test/test_browser_associated_interfaces.mojom b/content/test/test_browser_associated_interfaces.mojom
new file mode 100644
index 0000000..cc18873
--- /dev/null
+++ b/content/test/test_browser_associated_interfaces.mojom
@@ -0,0 +1,10 @@
+// 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.
+
+module content.mojom;
+
+interface BrowserAssociatedInterfaceTestDriver {
+  ExpectString(string expected);
+  RequestQuit() => ();
+};
diff --git a/extensions/BUILD.gn b/extensions/BUILD.gn
index 172bf461..f3f1333 100644
--- a/extensions/BUILD.gn
+++ b/extensions/BUILD.gn
@@ -91,6 +91,7 @@
     "//extensions/common",
     "//extensions/common/api",
     "//extensions/common/api:api_registration",
+    "//extensions/test:extensions_features",
     "//net:test_support",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/extensions/browser/guest_view/web_view/web_view_guest.cc b/extensions/browser/guest_view/web_view/web_view_guest.cc
index 6e9751d5..5424db9 100644
--- a/extensions/browser/guest_view/web_view/web_view_guest.cc
+++ b/extensions/browser/guest_view/web_view/web_view_guest.cc
@@ -134,6 +134,8 @@
     case base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM:
       return "oom killed";
 #endif
+    case base::TERMINATION_STATUS_OOM:
+      return "oom";
     case base::TERMINATION_STATUS_PROCESS_WAS_KILLED:
       return "killed";
     case base::TERMINATION_STATUS_PROCESS_CRASHED:
diff --git a/extensions/common/api/networking_private.idl b/extensions/common/api/networking_private.idl
index 1df8ec7..5b325137 100644
--- a/extensions/common/api/networking_private.idl
+++ b/extensions/common/api/networking_private.idl
@@ -276,7 +276,7 @@
   dictionary ManagedIPConfigProperties {
     ManagedDOMString? Gateway;
     ManagedDOMString? IPAddress;
-    ManagedDOMString[]? NameServers;
+    ManagedDOMStringList? NameServers;
     ManagedLong? RoutingPrefix;
     ManagedDOMString? Type;
     ManagedDOMString? WebProxyAutoDiscoveryUrl;
@@ -446,11 +446,11 @@
     ManagedDOMString? Proto;
     ManagedDOMString? PushPeerInfo;
     ManagedDOMString? RemoteCertEKU;
-    ManagedDOMString[]? RemoteCertKU;
+    ManagedDOMStringList? RemoteCertKU;
     ManagedDOMString? RemoteCertTLS;
     ManagedLong? RenegSec;
     ManagedBoolean? SaveCredentials;
-    ManagedDOMString[]? ServerCARefs;
+    ManagedDOMStringList? ServerCARefs;
     ManagedDOMString? ServerCertRef;
     ManagedLong? ServerPollTimeout;
     ManagedLong? Shaper;
diff --git a/extensions/common/extensions_client.h b/extensions/common/extensions_client.h
index b897fb88..f1c9a27e 100644
--- a/extensions/common/extensions_client.h
+++ b/extensions/common/extensions_client.h
@@ -57,12 +57,10 @@
   virtual std::unique_ptr<FeatureProvider> CreateFeatureProvider(
       const std::string& name) const = 0;
 
-  // Create a JSONFeatureProviderSource for a specific feature type,
-  // e.g. "permission". Currently, all features are loaded from
-  // JSONFeatureProviderSources.
-  // This is used primarily in CreateFeatureProvider, above.
-  virtual std::unique_ptr<JSONFeatureProviderSource>
-  CreateFeatureProviderSource(const std::string& name) const = 0;
+  // Returns the dictionary of the API features json file.
+  // TODO(devlin): We should find a way to remove this.
+  virtual std::unique_ptr<JSONFeatureProviderSource> CreateAPIFeatureSource()
+      const = 0;
 
   // Takes the list of all hosts and filters out those with special
   // permission strings. Adds the regular hosts to |new_hosts|,
diff --git a/extensions/common/features/simple_feature.h b/extensions/common/features/simple_feature.h
index b427582..7dba312 100644
--- a/extensions/common/features/simple_feature.h
+++ b/extensions/common/features/simple_feature.h
@@ -127,6 +127,7 @@
   void set_min_manifest_version(int min_manifest_version) {
     min_manifest_version_ = min_manifest_version;
   }
+  void set_noparent(bool no_parent) { no_parent_ = no_parent; }
   void set_platforms(std::vector<Platform>&& platforms);
   void set_whitelist(std::vector<std::string>&& whitelist);
 
diff --git a/extensions/extensions.gyp b/extensions/extensions.gyp
index f02fb543..d812267 100644
--- a/extensions/extensions.gyp
+++ b/extensions/extensions.gyp
@@ -276,6 +276,7 @@
         'extensions_browser',
         'extensions_common',
         'extensions_resources.gyp:extensions_resources',
+        'test/test_api.gyp:extensions_features',
       ],
       'include_dirs': [
         '..',
diff --git a/extensions/extensions_resources.grd b/extensions/extensions_resources.grd
index bc595f5..7c42eb3 100644
--- a/extensions/extensions_resources.grd
+++ b/extensions/extensions_resources.grd
@@ -11,9 +11,6 @@
       <include name="IDR_EXTENSION_API_FEATURES" file="common\api\_api_features.json" type="BINDATA" />
       <include name="IDR_EXTENSION_API_JSON_DECLARATIVE_WEBREQUEST" file="common\api\declarative_web_request.json" type="BINDATA" />
       <include name="IDR_EXTENSION_API_JSON_WEB_VIEW_REQUEST" file="common\api\web_view_request.json" type="BINDATA" />
-      <include name="IDR_EXTENSION_MANIFEST_FEATURES" file="common\api\_manifest_features.json" type="BINDATA" />
-      <include name="IDR_EXTENSION_PERMISSION_FEATURES" file="common\api\_permission_features.json" type="BINDATA" />
-      <include name="IDR_EXTENSION_BEHAVIOR_FEATURES" file="common\api\_behavior_features.json" type="BINDATA" />
     </includes>
   </release>
 </grit>
diff --git a/extensions/renderer/script_context.cc b/extensions/renderer/script_context.cc
index d20d21d..2e9bd38 100644
--- a/extensions/renderer/script_context.cc
+++ b/extensions/renderer/script_context.cc
@@ -28,6 +28,7 @@
 #include "extensions/renderer/v8_helpers.h"
 #include "gin/per_context_data.h"
 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h"
+#include "third_party/WebKit/public/platform/WebURLRequest.h"
 #include "third_party/WebKit/public/web/WebDataSource.h"
 #include "third_party/WebKit/public/web/WebDocument.h"
 #include "third_party/WebKit/public/web/WebFrame.h"
diff --git a/extensions/renderer/test_features_native_handler.cc b/extensions/renderer/test_features_native_handler.cc
index 3ecde95..45c0244 100644
--- a/extensions/renderer/test_features_native_handler.cc
+++ b/extensions/renderer/test_features_native_handler.cc
@@ -22,7 +22,7 @@
 void TestFeaturesNativeHandler::GetAPIFeatures(
     const v8::FunctionCallbackInfo<v8::Value>& args) {
   std::unique_ptr<JSONFeatureProviderSource> source(
-      ExtensionsClient::Get()->CreateFeatureProviderSource("api"));
+      ExtensionsClient::Get()->CreateAPIFeatureSource());
   std::unique_ptr<content::V8ValueConverter> converter(
       content::V8ValueConverter::create());
   args.GetReturnValue().Set(
diff --git a/extensions/shell/BUILD.gn b/extensions/shell/BUILD.gn
index 8bfe9eb..0d31a068 100644
--- a/extensions/shell/BUILD.gn
+++ b/extensions/shell/BUILD.gn
@@ -53,6 +53,7 @@
     "//extensions/renderer",
     "//extensions/shell/common/api",
     "//extensions/shell/common/api:api_registration",
+    "//extensions/shell/common/api:extensions_features",
     "//extensions/utility",
     "//skia",
     "//third_party/WebKit/public:blink",
diff --git a/extensions/shell/app_shell.gyp b/extensions/shell/app_shell.gyp
index de66e9e..d96f7d9 100644
--- a/extensions/shell/app_shell.gyp
+++ b/extensions/shell/app_shell.gyp
@@ -46,6 +46,7 @@
         '<(DEPTH)/extensions/extensions_resources.gyp:extensions_resources',
         '<(DEPTH)/extensions/shell/browser/api/api_registration.gyp:shell_api_registration',
         '<(DEPTH)/extensions/shell/common/api/api.gyp:shell_api',
+        '<(DEPTH)/extensions/shell/common/api/api.gyp:extensions_features',
         '<(DEPTH)/mojo/mojo_edk.gyp:mojo_system_impl',
         '<(DEPTH)/skia/skia.gyp:skia',
         '<(DEPTH)/third_party/WebKit/public/blink.gyp:blink',
diff --git a/extensions/shell/common/api/BUILD.gn b/extensions/shell/common/api/BUILD.gn
index 35ed47e..f2a30d7 100644
--- a/extensions/shell/common/api/BUILD.gn
+++ b/extensions/shell/common/api/BUILD.gn
@@ -3,10 +3,12 @@
 # found in the LICENSE file.
 
 import("//build/json_schema_api.gni")
+import("//tools/json_schema_compiler/json_features.gni")
 import("schemas.gni")
 
 # GYP version: extensions/shell/common/api/api.gyp:shell_api
 json_schema_api("api") {
+  sources = schema_sources
   schemas = true
   bundle = true
   bundle_name = "Shell"
@@ -14,6 +16,7 @@
 
 # GYP version: extensions/shell/browser/api/api_registration.gyp:shell_api_registration
 json_schema_api("api_registration") {
+  sources = schema_sources
   impl_dir = "//extensions/shell/browser/api"
   bundle_registration = true
   bundle_name = "Shell"
@@ -22,3 +25,45 @@
     ":api",
   ]
 }
+
+json_features("shell_api_features") {
+  feature_class = "APIFeature"
+  provider_class = "ShellAPIFeatureProvider"
+  sources = [
+    "../../../common/api/_api_features.json",
+    "_api_features.json",
+  ]
+}
+
+json_features("shell_permission_features") {
+  feature_class = "PermissionFeature"
+  provider_class = "ShellPermissionFeatureProvider"
+  sources = [
+    "../../../common/api/_permission_features.json",
+  ]
+}
+
+json_features("shell_manifest_features") {
+  feature_class = "ManifestFeature"
+  provider_class = "ShellManifestFeatureProvider"
+  sources = [
+    "../../../common/api/_manifest_features.json",
+  ]
+}
+
+json_features("shell_behavior_features") {
+  feature_class = "BehaviorFeature"
+  provider_class = "ShellBehaviorFeatureProvider"
+  sources = [
+    "../../../common/api/_behavior_features.json",
+  ]
+}
+
+group("extensions_features") {
+  public_deps = [
+    ":shell_api_features",
+    ":shell_behavior_features",
+    ":shell_manifest_features",
+    ":shell_permission_features",
+  ]
+}
diff --git a/extensions/shell/common/api/api.gyp b/extensions/shell/common/api/api.gyp
index 9445dbb..4a3f9eec 100644
--- a/extensions/shell/common/api/api.gyp
+++ b/extensions/shell/common/api/api.gyp
@@ -16,5 +16,85 @@
         'schemas.gypi',
       ],
     },
+    {
+      # GN version: //extensions/shell/common/api:extensions_features:shell_api_features
+      'target_name': 'shell_api_features',
+      'type': 'static_library',
+      'variables': {
+        'feature_class': 'APIFeature',
+        'provider_class': 'ShellAPIFeatureProvider',
+        'out_dir': 'extensions/shell/common/api',
+        'out_base_filename': 'shell_api_features',
+        'in_files': [
+          'extensions/common/api/_api_features.json',
+          'extensions/shell/common/api/_api_features.json',
+        ],
+      },
+      'inputs': ['<@(in_files)'],
+      'sources': ['<@(in_files)'],
+      'includes': ['../../../../tools/json_schema_compiler/json_features.gypi'],
+    },
+    {
+      # GN version: //extensions/shell/common/api:extensions_features:shell_behavior_features
+      'target_name': 'shell_behavior_features',
+      'type': 'static_library',
+      'variables': {
+        'feature_class': 'BehaviorFeature',
+        'provider_class': 'ShellBehaviorFeatureProvider',
+        'out_dir': 'extensions/shell/common/api',
+        'out_base_filename': 'shell_behavior_features',
+        'in_files': [
+          'extensions/common/api/_behavior_features.json',
+        ],
+      },
+      'inputs': ['<@(in_files)'],
+      'sources': ['<@(in_files)'],
+      'includes': ['../../../../tools/json_schema_compiler/json_features.gypi'],
+    },
+    {
+      # GN version: //extensions/shell/common/api:extensions_features:shell_manifest_features
+      'target_name': 'shell_manifest_features',
+      'type': 'static_library',
+      'variables': {
+        'feature_class': 'ManifestFeature',
+        'provider_class': 'ShellManifestFeatureProvider',
+        'out_dir': 'extensions/shell/common/api',
+        'out_base_filename': 'shell_manifest_features',
+        'in_files': [
+          'extensions/common/api/_manifest_features.json',
+        ],
+      },
+      'inputs': ['<@(in_files)'],
+      'sources': ['<@(in_files)'],
+      'includes': ['../../../../tools/json_schema_compiler/json_features.gypi'],
+    },
+    {
+      # GN version: //extensions/shell/common/api:extensions_features:shell_permission_features
+      'target_name': 'shell_permission_features',
+      'type': 'static_library',
+      'variables': {
+        'feature_class': 'PermissionFeature',
+        'provider_class': 'ShellPermissionFeatureProvider',
+        'out_dir': 'extensions/shell/common/api',
+        'out_base_filename': 'shell_permission_features',
+        'in_files': [
+          'extensions/common/api/_permission_features.json',
+        ],
+      },
+      'inputs': ['<@(in_files)'],
+      'sources': ['<@(in_files)'],
+      'includes': ['../../../../tools/json_schema_compiler/json_features.gypi'],
+    },
+    {
+      # GN version: //extensions/shell/common/api:extensions_features
+      'target_name': 'extensions_features',
+      'type': 'none',
+      'dependencies': [
+        'shell_api_features',
+        'shell_behavior_features',
+        'shell_manifest_features',
+        'shell_permission_features',
+      ],
+    },
   ],
 }
diff --git a/extensions/shell/common/api/schemas.gni b/extensions/shell/common/api/schemas.gni
index 3f14cfc..fd842da 100644
--- a/extensions/shell/common/api/schemas.gni
+++ b/extensions/shell/common/api/schemas.gni
@@ -7,9 +7,9 @@
                           "scope",
                           [ "schemas.gypi" ])
 
-sources = gypi_values.schema_files
+schema_sources = gypi_values.schema_files
 if (is_chromeos) {
-  sources += gypi_values.chromeos_schema_files
+  schema_sources += gypi_values.chromeos_schema_files
 }
 
 uncompiled_sources = gypi_values.non_compiled_schema_files
diff --git a/extensions/shell/common/shell_extensions_client.cc b/extensions/shell/common/shell_extensions_client.cc
index 338f312..0bce5f533 100644
--- a/extensions/shell/common/shell_extensions_client.cc
+++ b/extensions/shell/common/shell_extensions_client.cc
@@ -23,6 +23,10 @@
 #include "extensions/common/permissions/permissions_provider.h"
 #include "extensions/common/url_pattern_set.h"
 #include "extensions/shell/common/api/generated_schemas.h"
+#include "extensions/shell/common/api/shell_api_features.h"
+#include "extensions/shell/common/api/shell_behavior_features.h"
+#include "extensions/shell/common/api/shell_manifest_features.h"
+#include "extensions/shell/common/api/shell_permission_features.h"
 #include "grit/app_shell_resources.h"
 #include "grit/extensions_resources.h"
 
@@ -99,20 +103,14 @@
 std::unique_ptr<FeatureProvider> ShellExtensionsClient::CreateFeatureProvider(
     const std::string& name) const {
   std::unique_ptr<FeatureProvider> provider;
-  std::unique_ptr<JSONFeatureProviderSource> source(
-      CreateFeatureProviderSource(name));
   if (name == "api") {
-    provider.reset(new JSONFeatureProvider(source->dictionary(),
-                                           CreateFeature<APIFeature>));
+    provider.reset(new ShellAPIFeatureProvider());
   } else if (name == "manifest") {
-    provider.reset(new JSONFeatureProvider(source->dictionary(),
-                                           CreateFeature<ManifestFeature>));
+    provider.reset(new ShellManifestFeatureProvider());
   } else if (name == "permission") {
-    provider.reset(new JSONFeatureProvider(source->dictionary(),
-                                           CreateFeature<PermissionFeature>));
+    provider.reset(new ShellPermissionFeatureProvider());
   } else if (name == "behavior") {
-    provider.reset(new JSONFeatureProvider(source->dictionary(),
-                                           CreateFeature<BehaviorFeature>));
+    provider.reset(new ShellBehaviorFeatureProvider());
   } else {
     NOTREACHED();
   }
@@ -120,23 +118,11 @@
 }
 
 std::unique_ptr<JSONFeatureProviderSource>
-ShellExtensionsClient::CreateFeatureProviderSource(
-    const std::string& name) const {
+ShellExtensionsClient::CreateAPIFeatureSource() const {
   std::unique_ptr<JSONFeatureProviderSource> source(
-      new JSONFeatureProviderSource(name));
-  if (name == "api") {
-    source->LoadJSON(IDR_EXTENSION_API_FEATURES);
-    source->LoadJSON(IDR_SHELL_EXTENSION_API_FEATURES);
-  } else if (name == "manifest") {
-    source->LoadJSON(IDR_EXTENSION_MANIFEST_FEATURES);
-  } else if (name == "permission") {
-    source->LoadJSON(IDR_EXTENSION_PERMISSION_FEATURES);
-  } else if (name == "behavior") {
-    source->LoadJSON(IDR_EXTENSION_BEHAVIOR_FEATURES);
-  } else {
-    NOTREACHED();
-    source.reset();
-  }
+      new JSONFeatureProviderSource("api"));
+  source->LoadJSON(IDR_EXTENSION_API_FEATURES);
+  source->LoadJSON(IDR_SHELL_EXTENSION_API_FEATURES);
   return source;
 }
 
diff --git a/extensions/shell/common/shell_extensions_client.h b/extensions/shell/common/shell_extensions_client.h
index 9f062495..ed07ad2 100644
--- a/extensions/shell/common/shell_extensions_client.h
+++ b/extensions/shell/common/shell_extensions_client.h
@@ -25,8 +25,8 @@
   const std::string GetProductName() override;
   std::unique_ptr<FeatureProvider> CreateFeatureProvider(
       const std::string& name) const override;
-  std::unique_ptr<JSONFeatureProviderSource> CreateFeatureProviderSource(
-      const std::string& name) const override;
+  std::unique_ptr<JSONFeatureProviderSource> CreateAPIFeatureSource()
+      const override;
   void FilterHostPermissions(const URLPatternSet& hosts,
                              URLPatternSet* new_hosts,
                              PermissionIDSet* permissions) const override;
diff --git a/extensions/test/BUILD.gn b/extensions/test/BUILD.gn
new file mode 100644
index 0000000..76924c6
--- /dev/null
+++ b/extensions/test/BUILD.gn
@@ -0,0 +1,46 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//tools/json_schema_compiler/json_features.gni")
+
+json_features("test_api_features") {
+  feature_class = "APIFeature"
+  provider_class = "TestAPIFeatureProvider"
+  sources = [
+    "../common/api/_api_features.json",
+  ]
+}
+
+json_features("test_permission_features") {
+  feature_class = "PermissionFeature"
+  provider_class = "TestPermissionFeatureProvider"
+  sources = [
+    "../common/api/_permission_features.json",
+  ]
+}
+
+json_features("test_manifest_features") {
+  feature_class = "ManifestFeature"
+  provider_class = "TestManifestFeatureProvider"
+  sources = [
+    "../common/api/_manifest_features.json",
+  ]
+}
+
+json_features("test_behavior_features") {
+  feature_class = "BehaviorFeature"
+  provider_class = "TestBehaviorFeatureProvider"
+  sources = [
+    "../common/api/_behavior_features.json",
+  ]
+}
+
+group("extensions_features") {
+  public_deps = [
+    ":test_api_features",
+    ":test_behavior_features",
+    ":test_manifest_features",
+    ":test_permission_features",
+  ]
+}
diff --git a/extensions/test/test_api.gyp b/extensions/test/test_api.gyp
new file mode 100644
index 0000000..3abcfbc
--- /dev/null
+++ b/extensions/test/test_api.gyp
@@ -0,0 +1,87 @@
+# 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.
+
+{
+  'targets': [
+    {
+      # GN version: //extensions/test:extensions_features:test_api_features
+      'target_name': 'test_api_features',
+      'type': 'static_library',
+      'variables': {
+        'feature_class': 'APIFeature',
+        'provider_class': 'TestAPIFeatureProvider',
+        'out_dir': 'extensions/test',
+        'out_base_filename': 'test_api_features',
+        'in_files': [
+          'extensions/common/api/_api_features.json',
+        ],
+      },
+      'inputs': ['<@(in_files)'],
+      'sources': ['<@(in_files)'],
+      'includes': ['../../tools/json_schema_compiler/json_features.gypi'],
+    },
+    {
+      # GN version: //extensions/test:extensions_features:test_behavior_features
+      'target_name': 'test_behavior_features',
+      'type': 'static_library',
+      'variables': {
+        'feature_class': 'BehaviorFeature',
+        'provider_class': 'TestBehaviorFeatureProvider',
+        'out_dir': 'extensions/test',
+        'out_base_filename': 'test_behavior_features',
+        'in_files': [
+          'extensions/common/api/_behavior_features.json',
+        ],
+      },
+      'inputs': ['<@(in_files)'],
+      'sources': ['<@(in_files)'],
+      'includes': ['../../tools/json_schema_compiler/json_features.gypi'],
+    },
+    {
+      # GN version: //extensions/test:extensions_features:test_manifest_features
+      'target_name': 'test_manifest_features',
+      'type': 'static_library',
+      'variables': {
+        'feature_class': 'ManifestFeature',
+        'provider_class': 'TestManifestFeatureProvider',
+        'out_dir': 'extensions/test',
+        'out_base_filename': 'test_manifest_features',
+        'in_files': [
+          'extensions/common/api/_manifest_features.json',
+        ],
+      },
+      'inputs': ['<@(in_files)'],
+      'sources': ['<@(in_files)'],
+      'includes': ['../../tools/json_schema_compiler/json_features.gypi'],
+    },
+    {
+      # GN version: //extensions/test:extensions_features:test_permission_features
+      'target_name': 'test_permission_features',
+      'type': 'static_library',
+      'variables': {
+        'feature_class': 'PermissionFeature',
+        'provider_class': 'TestPermissionFeatureProvider',
+        'out_dir': 'extensions/test',
+        'out_base_filename': 'test_permission_features',
+        'in_files': [
+          'extensions/common/api/_permission_features.json',
+        ],
+      },
+      'inputs': ['<@(in_files)'],
+      'sources': ['<@(in_files)'],
+      'includes': ['../../tools/json_schema_compiler/json_features.gypi'],
+    },
+    {
+      # GN version: //extensions/test:extensions_features
+      'target_name': 'extensions_features',
+      'type': 'none',
+      'dependencies': [
+        'test_api_features',
+        'test_behavior_features',
+        'test_manifest_features',
+        'test_permission_features',
+      ],
+    },
+  ],
+}
diff --git a/extensions/test/test_extensions_client.cc b/extensions/test/test_extensions_client.cc
index 025e1cd..e7c6d7c 100644
--- a/extensions/test/test_extensions_client.cc
+++ b/extensions/test/test_extensions_client.cc
@@ -19,6 +19,10 @@
 #include "extensions/common/permissions/extensions_api_permissions.h"
 #include "extensions/common/permissions/permissions_info.h"
 #include "extensions/common/url_pattern_set.h"
+#include "extensions/test/test_api_features.h"
+#include "extensions/test/test_behavior_features.h"
+#include "extensions/test/test_manifest_features.h"
+#include "extensions/test/test_permission_features.h"
 #include "extensions/test/test_permission_message_provider.h"
 #include "grit/extensions_resources.h"
 
@@ -75,20 +79,14 @@
 std::unique_ptr<FeatureProvider> TestExtensionsClient::CreateFeatureProvider(
     const std::string& name) const {
   std::unique_ptr<FeatureProvider> provider;
-  std::unique_ptr<JSONFeatureProviderSource> source(
-      CreateFeatureProviderSource(name));
   if (name == "api") {
-    provider.reset(new JSONFeatureProvider(source->dictionary(),
-                                           CreateFeature<APIFeature>));
+    provider.reset(new TestAPIFeatureProvider());
   } else if (name == "manifest") {
-    provider.reset(new JSONFeatureProvider(source->dictionary(),
-                                           CreateFeature<ManifestFeature>));
+    provider.reset(new TestManifestFeatureProvider());
   } else if (name == "permission") {
-    provider.reset(new JSONFeatureProvider(source->dictionary(),
-                                           CreateFeature<PermissionFeature>));
+    provider.reset(new TestPermissionFeatureProvider());
   } else if (name == "behavior") {
-    provider.reset(new JSONFeatureProvider(source->dictionary(),
-                                           CreateFeature<BehaviorFeature>));
+    provider.reset(new TestBehaviorFeatureProvider());
   } else {
     NOTREACHED();
   }
@@ -96,22 +94,10 @@
 }
 
 std::unique_ptr<JSONFeatureProviderSource>
-TestExtensionsClient::CreateFeatureProviderSource(
-    const std::string& name) const {
+TestExtensionsClient::CreateAPIFeatureSource() const {
   std::unique_ptr<JSONFeatureProviderSource> source(
-      new JSONFeatureProviderSource(name));
-  if (name == "api") {
-    source->LoadJSON(IDR_EXTENSION_API_FEATURES);
-  } else if (name == "manifest") {
-    source->LoadJSON(IDR_EXTENSION_MANIFEST_FEATURES);
-  } else if (name == "permission") {
-    source->LoadJSON(IDR_EXTENSION_PERMISSION_FEATURES);
-  } else if (name == "behavior") {
-    source->LoadJSON(IDR_EXTENSION_BEHAVIOR_FEATURES);
-  } else {
-    NOTREACHED();
-    source.reset();
-  }
+      new JSONFeatureProviderSource("api"));
+  source->LoadJSON(IDR_EXTENSION_API_FEATURES);
   return source;
 }
 
diff --git a/extensions/test/test_extensions_client.h b/extensions/test/test_extensions_client.h
index e12f0a9..0dfd716c 100644
--- a/extensions/test/test_extensions_client.h
+++ b/extensions/test/test_extensions_client.h
@@ -33,8 +33,8 @@
   const std::string GetProductName() override;
   std::unique_ptr<FeatureProvider> CreateFeatureProvider(
       const std::string& name) const override;
-  std::unique_ptr<JSONFeatureProviderSource> CreateFeatureProviderSource(
-      const std::string& name) const override;
+  std::unique_ptr<JSONFeatureProviderSource> CreateAPIFeatureSource()
+      const override;
   void FilterHostPermissions(const URLPatternSet& hosts,
                              URLPatternSet* new_hosts,
                              PermissionIDSet* permissions) const override;
diff --git a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_schedule_ca_layer.txt b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_schedule_ca_layer.txt
index 5b87c93..f5c82db 100644
--- a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_schedule_ca_layer.txt
+++ b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_schedule_ca_layer.txt
@@ -35,6 +35,19 @@
     GL_CA_LAYER_EDGE_BOTTOM_CHROMIUM                  0x04
     GL_CA_LAYER_EDGE_TOP_CHROMIUM                     0x08
 
+    Accepted by the <filter_effects> parameter of
+    glScheduleCALayerFilterEffectsCHROMIUM:
+    struct GLCALayerFilterEffect {
+      GLint type;
+      GLfloat amount;
+      GLint drop_shadow_offset_x;
+      GLint drop_shadow_offset_y;
+      GLuint drop_shadow_color;
+    };
+    The valid values for type are in the range [0, 9] inclusive. Clients should
+    convert them from ui::CARendererLayerParams::FilterEffectType, as the
+    service will convert them back to that enum.
+
 New Procedures and Functions
 
     The command
@@ -87,6 +100,15 @@
 
     The command
 
+        glScheduleCALayerFilterEffectsCHROMIUM(
+            GLsizei count,
+            GLCALayerFilterEffect* filter_effects)
+
+    applies the <filter_effects> to the next CALayer to be scheduled. A
+    consecutive call to glScheduleCALayerFilterEffectsCHROMIUM overrides the
+    previously saved <filter_effects>. A call to glSwapBuffers clears any saved
+    <filter_effects>
+
        glScheduleCALayerInUseQueryCHROMIUM(GLsizei count, GLuint* textures);
 
     schedules a query at the time of the next call to swap buffers. If the given
diff --git a/gpu/GLES2/gl2chromium_autogen.h b/gpu/GLES2/gl2chromium_autogen.h
index 210aa91..636b4844 100644
--- a/gpu/GLES2/gl2chromium_autogen.h
+++ b/gpu/GLES2/gl2chromium_autogen.h
@@ -328,6 +328,8 @@
   GLES2_GET_FUN(ScheduleOverlayPlaneCHROMIUM)
 #define glScheduleCALayerSharedStateCHROMIUM \
   GLES2_GET_FUN(ScheduleCALayerSharedStateCHROMIUM)
+#define glScheduleCALayerFilterEffectsCHROMIUM \
+  GLES2_GET_FUN(ScheduleCALayerFilterEffectsCHROMIUM)
 #define glScheduleCALayerCHROMIUM GLES2_GET_FUN(ScheduleCALayerCHROMIUM)
 #define glScheduleCALayerInUseQueryCHROMIUM \
   GLES2_GET_FUN(ScheduleCALayerInUseQueryCHROMIUM)
diff --git a/gpu/GLES2/gl2extchromium.h b/gpu/GLES2/gl2extchromium.h
index 67142b1d..78392eb 100644
--- a/gpu/GLES2/gl2extchromium.h
+++ b/gpu/GLES2/gl2extchromium.h
@@ -767,6 +767,7 @@
 #define GL_CA_LAYER_EDGE_TOP_CHROMIUM 0x8
 #endif
 
+extern "C" struct GLCALayerFilterEffect;
 #ifdef GL_GLEXT_PROTOTYPES
 GL_APICALL void GL_APIENTRY
 glScheduleCALayerSharedStateCHROMIUM(GLfloat opacity,
@@ -775,6 +776,9 @@
                                      GLint sorting_context_id,
                                      const GLfloat* transform);
 GL_APICALL void GL_APIENTRY
+glScheduleCALayerFilterEffectsCHROMIUM(GLsizei count,
+                                       const GLCALayerFilterEffect* effects);
+GL_APICALL void GL_APIENTRY
 glScheduleCALayerCHROMIUM(GLuint contents_texture_id,
                           const GLfloat* contents_rect,
                           GLuint background_color,
@@ -790,6 +794,9 @@
     const GLfloat* clip_rect,
     GLint sorting_context_id,
     const GLfloat* transform);
+typedef void(GL_APIENTRYP PFNGLSCHEDULECALAYERFILTEREFFECTSCHROMIUM)(
+    GLsizei count,
+    const GLCALayerFilterEffect* effects);
 typedef void(GL_APIENTRYP PFNGLSCHEDULECALAYERCHROMIUMPROC)(
     GLuint contents_texture_id,
     const GLfloat* contents_rect,
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py
index d12671c..95f589be 100755
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -4425,6 +4425,17 @@
     'extension': 'CHROMIUM_schedule_ca_layer',
     'chromium': True,
   },
+  'ScheduleCALayerFilterEffectsCHROMIUM': {
+    'type': 'PUTn',
+    'count': 1,
+    'impl_func': False,
+    'client_test': False,
+    'decoder_func': 'DoScheduleCALayerFilterEffectsCHROMIUM',
+    'cmd_args': 'GLsizei count, const GLCALayerFilterEffect* effects',
+    'extension': 'CHROMIUM_schedule_ca_layer',
+    'chromium': True,
+    'unit_test': False,
+  },
   'ScheduleCALayerCHROMIUM': {
     'type': 'Custom',
     'impl_func': False,
@@ -7633,32 +7644,37 @@
 
   def WriteGLES2Implementation(self, func, f):
     """Overrriden from TypeHandler."""
-    f.write("%s GLES2Implementation::%s(%s) {\n" %
-               (func.return_type, func.original_name,
-                func.MakeTypedOriginalArgString("")))
-    f.write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
-    func.WriteDestinationInitalizationValidation(f)
-    self.WriteClientGLCallLog(func, f)
-    last_pointer_name = func.GetLastOriginalPointerArg().name
-    f.write("""  GPU_CLIENT_LOG_CODE_BLOCK({
-    for (GLsizei i = 0; i < count; ++i) {
-""")
-    values_str = ' << ", " << '.join(
-        ["%s[%d + i * %d]" % (
-            last_pointer_name, ndx, self.GetArrayCount(func)) for ndx in range(
-                0, self.GetArrayCount(func))])
-    f.write('       GPU_CLIENT_LOG("  " << i << ": " << %s);\n' % values_str)
-    f.write("    }\n  });\n")
-    for arg in func.GetOriginalArgs():
-      arg.WriteClientSideValidationCode(f, func)
-    f.write("  helper_->%sImmediate(%s);\n" %
-               (func.name, func.MakeInitString("")))
-    f.write("  CheckGLError();\n")
-    f.write("}\n")
-    f.write("\n")
+    impl_func = func.GetInfo('impl_func')
+    if impl_func == None or impl_func == True:
+      f.write("%s GLES2Implementation::%s(%s) {\n" %
+                 (func.return_type, func.original_name,
+                  func.MakeTypedOriginalArgString("")))
+      f.write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
+      func.WriteDestinationInitalizationValidation(f)
+      self.WriteClientGLCallLog(func, f)
+      last_pointer_name = func.GetLastOriginalPointerArg().name
+      f.write("""  GPU_CLIENT_LOG_CODE_BLOCK({
+      for (GLsizei i = 0; i < count; ++i) {
+  """)
+      values_str = ' << ", " << '.join(
+          ["%s[%d + i * %d]" % (
+              last_pointer_name, ndx, self.GetArrayCount(func)) for ndx in
+                  range(0, self.GetArrayCount(func))])
+      f.write('       GPU_CLIENT_LOG("  " << i << ": " << %s);\n' % values_str)
+      f.write("    }\n  });\n")
+      for arg in func.GetOriginalArgs():
+        arg.WriteClientSideValidationCode(f, func)
+      f.write("  helper_->%sImmediate(%s);\n" %
+                 (func.name, func.MakeInitString("")))
+      f.write("  CheckGLError();\n")
+      f.write("}\n")
+      f.write("\n")
 
   def WriteGLES2ImplementationUnitTest(self, func, f):
     """Writes the GLES2 Implemention unit test."""
+    client_test = func.GetInfo('client_test')
+    if client_test is not None and client_test == False:
+      return
     code = """
 TEST_F(GLES2ImplementationTest, %(name)s) {
   %(type)s data[%(count_param)d][%(count)d] = {{0}};
@@ -7827,14 +7843,13 @@
         count_param = int(arg.GetValidClientSideCmdArg(func))
     f.write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
     f.write("  const int kSomeBaseValueToTestWith = 51;\n")
-    f.write("  static %s data[] = {\n" % self.GetArrayType(func))
-    for v in range(0, self.GetArrayCount(func) * count_param):
-      f.write("    static_cast<%s>(kSomeBaseValueToTestWith + %d),\n" %
-                 (self.GetArrayType(func), v))
-    f.write("  };\n")
+    f.write("  const GLsizei kNumElements = %d;\n" % count_param)
+    f.write("  std::vector<%s> vec;\n" % self.GetArrayType(func))
+    f.write("  vec.resize(kNumElements * %d);\n" % self.GetArrayCount(func))
+    f.write("  memset(vec.data(), kSomeBaseValueToTestWith, \n")
+    f.write("      sizeof(%s) * vec.size());\n" % self.GetArrayType(func))
     f.write("  cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" %
                (func.name, func.name))
-    f.write("  const GLsizei kNumElements = %d;\n" % count_param)
     f.write("  const size_t kExpectedCmdSize =\n")
     f.write("      sizeof(cmd) + kNumElements * sizeof(%s) * %d;\n" %
                (self.GetArrayType(func), self.GetArrayCount(func)))
@@ -7842,7 +7857,7 @@
     f.write("      &cmd")
     for value, arg in enumerate(args):
       if arg.IsPointer():
-        f.write(",\n      data")
+        f.write(",\n      vec.data()")
       elif arg.IsConstant():
         continue
       else:
@@ -7859,7 +7874,8 @@
                  (arg.type, value + 1, arg.name))
     f.write("  CheckBytesWrittenMatchesExpectedSize(\n")
     f.write("      next_cmd, sizeof(cmd) +\n")
-    f.write("      RoundSizeToMultipleOfEntries(sizeof(data)));\n")
+    f.write("      RoundSizeToMultipleOfEntries(sizeof(\n")
+    f.write("          %s) * vec.size()));\n" % self.GetArrayType(func))
     # TODO: Check that data was inserted
     f.write("}\n")
     f.write("\n")
diff --git a/gpu/command_buffer/client/gles2_c_lib_autogen.h b/gpu/command_buffer/client/gles2_c_lib_autogen.h
index f263bf67..52bf1216 100644
--- a/gpu/command_buffer/client/gles2_c_lib_autogen.h
+++ b/gpu/command_buffer/client/gles2_c_lib_autogen.h
@@ -1476,6 +1476,11 @@
   gles2::GetGLContext()->ScheduleCALayerSharedStateCHROMIUM(
       opacity, is_clipped, clip_rect, sorting_context_id, transform);
 }
+void GL_APIENTRY GLES2ScheduleCALayerFilterEffectsCHROMIUM(
+    GLsizei count,
+    const GLCALayerFilterEffect* effects) {
+  gles2::GetGLContext()->ScheduleCALayerFilterEffectsCHROMIUM(count, effects);
+}
 void GL_APIENTRY GLES2ScheduleCALayerCHROMIUM(GLuint contents_texture_id,
                                               const GLfloat* contents_rect,
                                               GLuint background_color,
@@ -2828,6 +2833,11 @@
             glScheduleCALayerSharedStateCHROMIUM),
     },
     {
+        "glScheduleCALayerFilterEffectsCHROMIUM",
+        reinterpret_cast<GLES2FunctionPointer>(
+            glScheduleCALayerFilterEffectsCHROMIUM),
+    },
+    {
         "glScheduleCALayerCHROMIUM",
         reinterpret_cast<GLES2FunctionPointer>(glScheduleCALayerCHROMIUM),
     },
diff --git a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
index 28cfd80..b27a622 100644
--- a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
+++ b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
@@ -2765,6 +2765,20 @@
   }
 }
 
+void ScheduleCALayerFilterEffectsCHROMIUMImmediate(
+    GLsizei count,
+    const GLCALayerFilterEffect* effects) {
+  const uint32_t size =
+      gles2::cmds::ScheduleCALayerFilterEffectsCHROMIUMImmediate::ComputeSize(
+          count);
+  gles2::cmds::ScheduleCALayerFilterEffectsCHROMIUMImmediate* c =
+      GetImmediateCmdSpaceTotalSize<
+          gles2::cmds::ScheduleCALayerFilterEffectsCHROMIUMImmediate>(size);
+  if (c) {
+    c->Init(count, effects);
+  }
+}
+
 void ScheduleCALayerCHROMIUM(GLuint contents_texture_id,
                              GLuint background_color,
                              GLuint edge_aa_mask,
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
index 2ba0f86..b2458b4d 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -6142,6 +6142,26 @@
   return image_id;
 }
 
+void GLES2Implementation::ScheduleCALayerFilterEffectsCHROMIUM(
+      GLsizei count,
+      const GLCALayerFilterEffect* effects) {
+  GPU_CLIENT_SINGLE_THREAD_CHECK();
+  GPU_CLIENT_LOG("[" << GetLogPrefix()
+                     << "] ScheduleCALayerFilterEffectsCHROMIUM(" << count
+                     << ", " << static_cast<const void*>(effects) << ")");
+  GPU_CLIENT_LOG_CODE_BLOCK({
+    for (GLsizei i = 0; i < count; ++i) {
+      const GLCALayerFilterEffect& effect = effects[i];
+      GPU_CLIENT_LOG("  " << i << ": " << effect.type << " " << effect.amount
+                          << " " << effect.drop_shadow_offset_x << " "
+                          << effect.drop_shadow_offset_y << " "
+                          << effect.drop_shadow_color);
+    }
+  });
+  helper_->ScheduleCALayerFilterEffectsCHROMIUMImmediate(count, effects);
+  CheckGLError();
+}
+
 bool GLES2Implementation::ValidateSize(const char* func, GLsizeiptr size) {
   if (size < 0) {
     SetGLError(GL_INVALID_VALUE, func, "size < 0");
diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h
index f1e4cb3..639f807 100644
--- a/gpu/command_buffer/client/gles2_implementation_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_autogen.h
@@ -1025,6 +1025,10 @@
                                         GLint sorting_context_id,
                                         const GLfloat* transform) override;
 
+void ScheduleCALayerFilterEffectsCHROMIUM(
+    GLsizei count,
+    const GLCALayerFilterEffect* effects) override;
+
 void ScheduleCALayerCHROMIUM(GLuint contents_texture_id,
                              const GLfloat* contents_rect,
                              GLuint background_color,
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
index 8507032..28f76b12 100644
--- a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
@@ -1138,42 +1138,6 @@
   EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
 }
 
-TEST_F(GLES2ImplementationTest, InvalidateFramebuffer) {
-  GLenum data[2][1] = {{0}};
-  struct Cmds {
-    cmds::InvalidateFramebufferImmediate cmd;
-    GLenum data[2][1];
-  };
-
-  Cmds expected;
-  for (int ii = 0; ii < 2; ++ii) {
-    for (int jj = 0; jj < 1; ++jj) {
-      data[ii][jj] = static_cast<GLenum>(ii * 1 + jj);
-    }
-  }
-  expected.cmd.Init(GL_FRAMEBUFFER, 2, &data[0][0]);
-  gl_->InvalidateFramebuffer(GL_FRAMEBUFFER, 2, &data[0][0]);
-  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
-}
-
-TEST_F(GLES2ImplementationTest, InvalidateSubFramebuffer) {
-  GLenum data[2][1] = {{0}};
-  struct Cmds {
-    cmds::InvalidateSubFramebufferImmediate cmd;
-    GLenum data[2][1];
-  };
-
-  Cmds expected;
-  for (int ii = 0; ii < 2; ++ii) {
-    for (int jj = 0; jj < 1; ++jj) {
-      data[ii][jj] = static_cast<GLenum>(ii * 1 + jj);
-    }
-  }
-  expected.cmd.Init(GL_FRAMEBUFFER, 2, &data[0][0], 4, 5, 6, 7);
-  gl_->InvalidateSubFramebuffer(GL_FRAMEBUFFER, 2, &data[0][0], 4, 5, 6, 7);
-  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
-}
-
 TEST_F(GLES2ImplementationTest, IsBuffer) {
   struct Cmds {
     cmds::IsBuffer cmd;
@@ -2778,24 +2742,6 @@
   EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
 }
 
-TEST_F(GLES2ImplementationTest, DiscardFramebufferEXT) {
-  GLenum data[2][1] = {{0}};
-  struct Cmds {
-    cmds::DiscardFramebufferEXTImmediate cmd;
-    GLenum data[2][1];
-  };
-
-  Cmds expected;
-  for (int ii = 0; ii < 2; ++ii) {
-    for (int jj = 0; jj < 1; ++jj) {
-      data[ii][jj] = static_cast<GLenum>(ii * 1 + jj);
-    }
-  }
-  expected.cmd.Init(1, 2, &data[0][0]);
-  gl_->DiscardFramebufferEXT(1, 2, &data[0][0]);
-  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
-}
-
 TEST_F(GLES2ImplementationTest, LoseContextCHROMIUM) {
   struct Cmds {
     cmds::LoseContextCHROMIUM cmd;
@@ -2808,24 +2754,6 @@
   EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
 }
 
-TEST_F(GLES2ImplementationTest, DrawBuffersEXT) {
-  GLenum data[1][1] = {{0}};
-  struct Cmds {
-    cmds::DrawBuffersEXTImmediate cmd;
-    GLenum data[1][1];
-  };
-
-  Cmds expected;
-  for (int ii = 0; ii < 1; ++ii) {
-    for (int jj = 0; jj < 1; ++jj) {
-      data[ii][jj] = static_cast<GLenum>(ii * 1 + jj);
-    }
-  }
-  expected.cmd.Init(1, &data[0][0]);
-  gl_->DrawBuffersEXT(1, &data[0][0]);
-  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
-}
-
 TEST_F(GLES2ImplementationTest, DiscardBackbufferCHROMIUM) {
   struct Cmds {
     cmds::DiscardBackbufferCHROMIUM cmd;
diff --git a/gpu/command_buffer/client/gles2_interface.h b/gpu/command_buffer/client/gles2_interface.h
index 0b0bc514..3385197d 100644
--- a/gpu/command_buffer/client/gles2_interface.h
+++ b/gpu/command_buffer/client/gles2_interface.h
@@ -10,6 +10,7 @@
 #include "base/compiler_specific.h"
 
 extern "C" typedef struct _ClientBuffer* ClientBuffer;
+extern "C" struct GLCALayerFilterEffect;
 
 namespace gpu {
 namespace gles2 {
diff --git a/gpu/command_buffer/client/gles2_interface_autogen.h b/gpu/command_buffer/client/gles2_interface_autogen.h
index f363388..b81f7268 100644
--- a/gpu/command_buffer/client/gles2_interface_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_autogen.h
@@ -759,6 +759,9 @@
                                                 const GLfloat* clip_rect,
                                                 GLint sorting_context_id,
                                                 const GLfloat* transform) = 0;
+virtual void ScheduleCALayerFilterEffectsCHROMIUM(
+    GLsizei count,
+    const GLCALayerFilterEffect* effects) = 0;
 virtual void ScheduleCALayerCHROMIUM(GLuint contents_texture_id,
                                      const GLfloat* contents_rect,
                                      GLuint background_color,
diff --git a/gpu/command_buffer/client/gles2_interface_stub_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
index 0df4cb3b..df20aa3e 100644
--- a/gpu/command_buffer/client/gles2_interface_stub_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
@@ -737,6 +737,9 @@
                                         const GLfloat* clip_rect,
                                         GLint sorting_context_id,
                                         const GLfloat* transform) override;
+void ScheduleCALayerFilterEffectsCHROMIUM(
+    GLsizei count,
+    const GLCALayerFilterEffect* effects) override;
 void ScheduleCALayerCHROMIUM(GLuint contents_texture_id,
                              const GLfloat* contents_rect,
                              GLuint background_color,
diff --git a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
index c7122dc..ed4b76a9 100644
--- a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
@@ -1007,6 +1007,9 @@
     const GLfloat* /* clip_rect */,
     GLint /* sorting_context_id */,
     const GLfloat* /* transform */) {}
+void GLES2InterfaceStub::ScheduleCALayerFilterEffectsCHROMIUM(
+    GLsizei /* count */,
+    const GLCALayerFilterEffect* /* effects */) {}
 void GLES2InterfaceStub::ScheduleCALayerCHROMIUM(
     GLuint /* contents_texture_id */,
     const GLfloat* /* contents_rect */,
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
index 3192f24..4419eaf 100644
--- a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
+++ b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
@@ -737,6 +737,9 @@
                                         const GLfloat* clip_rect,
                                         GLint sorting_context_id,
                                         const GLfloat* transform) override;
+void ScheduleCALayerFilterEffectsCHROMIUM(
+    GLsizei count,
+    const GLCALayerFilterEffect* effects) override;
 void ScheduleCALayerCHROMIUM(GLuint contents_texture_id,
                              const GLfloat* contents_rect,
                              GLuint background_color,
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
index fc5efe0..3c1861fd 100644
--- a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
@@ -2154,6 +2154,14 @@
                                           sorting_context_id, transform);
 }
 
+void GLES2TraceImplementation::ScheduleCALayerFilterEffectsCHROMIUM(
+    GLsizei count,
+    const GLCALayerFilterEffect* effects) {
+  TRACE_EVENT_BINARY_EFFICIENT0(
+      "gpu", "GLES2Trace::ScheduleCALayerFilterEffectsCHROMIUM");
+  gl_->ScheduleCALayerFilterEffectsCHROMIUM(count, effects);
+}
+
 void GLES2TraceImplementation::ScheduleCALayerCHROMIUM(
     GLuint contents_texture_id,
     const GLfloat* contents_rect,
diff --git a/gpu/command_buffer/cmd_buffer_functions.txt b/gpu/command_buffer/cmd_buffer_functions.txt
index 509de75..18e9150 100644
--- a/gpu/command_buffer/cmd_buffer_functions.txt
+++ b/gpu/command_buffer/cmd_buffer_functions.txt
@@ -306,6 +306,7 @@
 GL_APICALL void         GL_APIENTRY glDiscardBackbufferCHROMIUM (void);
 GL_APICALL void         GL_APIENTRY glScheduleOverlayPlaneCHROMIUM (GLint plane_z_order, GLenum plane_transform, GLuint overlay_texture_id, GLint bounds_x, GLint bounds_y, GLint bounds_width, GLint bounds_height, GLfloat uv_x, GLfloat uv_y, GLfloat uv_width, GLfloat uv_height);
 GL_APICALL void         GL_APIENTRY glScheduleCALayerSharedStateCHROMIUM (GLfloat opacity, GLboolean is_clipped, const GLfloat* clip_rect, GLint sorting_context_id, const GLfloat* transform);
+GL_APICALL void         GL_APIENTRY glScheduleCALayerFilterEffectsCHROMIUM (GLsizei count, const GLCALayerFilterEffect* effects);
 GL_APICALL void         GL_APIENTRY glScheduleCALayerCHROMIUM (GLuint contents_texture_id, const GLfloat* contents_rect, GLuint background_color, GLuint edge_aa_mask, const GLfloat* bounds_rect, GLuint filter);
 GL_APICALL void         GL_APIENTRY glScheduleCALayerInUseQueryCHROMIUM (GLsizei count, const GLuint* textures);
 GL_APICALL void         GL_APIENTRY glCommitOverlayPlanesCHROMIUM (void);
diff --git a/gpu/command_buffer/common/gles2_cmd_format.h b/gpu/command_buffer/common/gles2_cmd_format.h
index 1ac1d89..f8b8f5c 100644
--- a/gpu/command_buffer/common/gles2_cmd_format.h
+++ b/gpu/command_buffer/common/gles2_cmd_format.h
@@ -48,6 +48,14 @@
 typedef int64_t GLint64;
 typedef uint64_t GLuint64;
 
+struct GLCALayerFilterEffect {
+  GLint type;
+  GLfloat amount;
+  GLint drop_shadow_offset_x;
+  GLint drop_shadow_offset_y;
+  GLuint drop_shadow_color;
+};
+
 namespace gpu {
 namespace gles2 {
 
diff --git a/gpu/command_buffer/common/gles2_cmd_format_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
index b44d8a44..97bbb547 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
@@ -13628,6 +13628,55 @@
     offsetof(ScheduleCALayerSharedStateCHROMIUM, shm_offset) == 20,
     "offset of ScheduleCALayerSharedStateCHROMIUM shm_offset should be 20");
 
+struct ScheduleCALayerFilterEffectsCHROMIUMImmediate {
+  typedef ScheduleCALayerFilterEffectsCHROMIUMImmediate ValueType;
+  static const CommandId kCmdId =
+      kScheduleCALayerFilterEffectsCHROMIUMImmediate;
+  static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
+  static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+  static uint32_t ComputeDataSize(GLsizei count) {
+    return static_cast<uint32_t>(sizeof(GLCALayerFilterEffect) * 1 *
+                                 count);  // NOLINT
+  }
+
+  static uint32_t ComputeSize(GLsizei count) {
+    return static_cast<uint32_t>(sizeof(ValueType) +
+                                 ComputeDataSize(count));  // NOLINT
+  }
+
+  void SetHeader(GLsizei count) {
+    header.SetCmdByTotalSize<ValueType>(ComputeSize(count));
+  }
+
+  void Init(GLsizei _count, const GLCALayerFilterEffect* _effects) {
+    SetHeader(_count);
+    count = _count;
+    memcpy(ImmediateDataAddress(this), _effects, ComputeDataSize(_count));
+  }
+
+  void* Set(void* cmd, GLsizei _count, const GLCALayerFilterEffect* _effects) {
+    static_cast<ValueType*>(cmd)->Init(_count, _effects);
+    const uint32_t size = ComputeSize(_count);
+    return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size);
+  }
+
+  gpu::CommandHeader header;
+  int32_t count;
+};
+
+static_assert(
+    sizeof(ScheduleCALayerFilterEffectsCHROMIUMImmediate) == 8,
+    "size of ScheduleCALayerFilterEffectsCHROMIUMImmediate should be 8");
+static_assert(offsetof(ScheduleCALayerFilterEffectsCHROMIUMImmediate, header) ==
+                  0,
+              "offset of ScheduleCALayerFilterEffectsCHROMIUMImmediate header "
+              "should be 0");
+static_assert(offsetof(ScheduleCALayerFilterEffectsCHROMIUMImmediate, count) ==
+                  4,
+              "offset of ScheduleCALayerFilterEffectsCHROMIUMImmediate count "
+              "should be 4");
+
 struct ScheduleCALayerCHROMIUM {
   typedef ScheduleCALayerCHROMIUM ValueType;
   static const CommandId kCmdId = kScheduleCALayerCHROMIUM;
diff --git a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
index b2c167128..ba08803 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
@@ -1849,39 +1849,38 @@
 
 TEST_F(GLES2FormatTest, InvalidateFramebufferImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLenum data[] = {
-      static_cast<GLenum>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLenum>(kSomeBaseValueToTestWith + 1),
-  };
+  const GLsizei kNumElements = 2;
+  std::vector<GLenum> vec;
+  vec.resize(kNumElements * 1);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLenum) * vec.size());
   cmds::InvalidateFramebufferImmediate& cmd =
       *GetBufferAs<cmds::InvalidateFramebufferImmediate>();
-  const GLsizei kNumElements = 2;
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLenum) * 1;
-  void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLenum>(1), static_cast<GLsizei>(2), data);
+  void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(1),
+                           static_cast<GLsizei>(2), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::InvalidateFramebufferImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
   EXPECT_EQ(static_cast<GLenum>(1), cmd.target);
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLenum) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, InvalidateSubFramebufferImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLenum data[] = {
-      static_cast<GLenum>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLenum>(kSomeBaseValueToTestWith + 1),
-  };
+  const GLsizei kNumElements = 2;
+  std::vector<GLenum> vec;
+  vec.resize(kNumElements * 1);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLenum) * vec.size());
   cmds::InvalidateSubFramebufferImmediate& cmd =
       *GetBufferAs<cmds::InvalidateSubFramebufferImmediate>();
-  const GLsizei kNumElements = 2;
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLenum) * 1;
   void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLenum>(1), static_cast<GLsizei>(2), data,
+      cmd.Set(&cmd, static_cast<GLenum>(1), static_cast<GLsizei>(2), vec.data(),
               static_cast<GLint>(4), static_cast<GLint>(5),
               static_cast<GLsizei>(6), static_cast<GLsizei>(7));
   EXPECT_EQ(
@@ -1895,7 +1894,8 @@
   EXPECT_EQ(static_cast<GLsizei>(6), cmd.width);
   EXPECT_EQ(static_cast<GLsizei>(7), cmd.height);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLenum) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, IsBuffer) {
@@ -2561,23 +2561,23 @@
 
 TEST_F(GLES2FormatTest, Uniform1fvImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLfloat data[] = {
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
-  };
-  cmds::Uniform1fvImmediate& cmd = *GetBufferAs<cmds::Uniform1fvImmediate>();
   const GLsizei kNumElements = 2;
+  std::vector<GLfloat> vec;
+  vec.resize(kNumElements * 1);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLfloat) * vec.size());
+  cmds::Uniform1fvImmediate& cmd = *GetBufferAs<cmds::Uniform1fvImmediate>();
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLfloat) * 1;
   void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform1fvImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
   EXPECT_EQ(static_cast<GLint>(1), cmd.location);
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLfloat) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, Uniform1i) {
@@ -2593,23 +2593,23 @@
 
 TEST_F(GLES2FormatTest, Uniform1ivImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLint data[] = {
-      static_cast<GLint>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLint>(kSomeBaseValueToTestWith + 1),
-  };
-  cmds::Uniform1ivImmediate& cmd = *GetBufferAs<cmds::Uniform1ivImmediate>();
   const GLsizei kNumElements = 2;
+  std::vector<GLint> vec;
+  vec.resize(kNumElements * 1);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLint) * vec.size());
+  cmds::Uniform1ivImmediate& cmd = *GetBufferAs<cmds::Uniform1ivImmediate>();
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLint) * 1;
   void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform1ivImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
   EXPECT_EQ(static_cast<GLint>(1), cmd.location);
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLint) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, Uniform1ui) {
@@ -2626,23 +2626,23 @@
 
 TEST_F(GLES2FormatTest, Uniform1uivImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLuint data[] = {
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 1),
-  };
-  cmds::Uniform1uivImmediate& cmd = *GetBufferAs<cmds::Uniform1uivImmediate>();
   const GLsizei kNumElements = 2;
+  std::vector<GLuint> vec;
+  vec.resize(kNumElements * 1);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLuint) * vec.size());
+  cmds::Uniform1uivImmediate& cmd = *GetBufferAs<cmds::Uniform1uivImmediate>();
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLuint) * 1;
   void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform1uivImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
   EXPECT_EQ(static_cast<GLint>(1), cmd.location);
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLuint) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, Uniform2f) {
@@ -2659,25 +2659,23 @@
 
 TEST_F(GLES2FormatTest, Uniform2fvImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLfloat data[] = {
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
-  };
-  cmds::Uniform2fvImmediate& cmd = *GetBufferAs<cmds::Uniform2fvImmediate>();
   const GLsizei kNumElements = 2;
+  std::vector<GLfloat> vec;
+  vec.resize(kNumElements * 2);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLfloat) * vec.size());
+  cmds::Uniform2fvImmediate& cmd = *GetBufferAs<cmds::Uniform2fvImmediate>();
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLfloat) * 2;
   void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform2fvImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
   EXPECT_EQ(static_cast<GLint>(1), cmd.location);
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLfloat) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, Uniform2i) {
@@ -2694,25 +2692,23 @@
 
 TEST_F(GLES2FormatTest, Uniform2ivImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLint data[] = {
-      static_cast<GLint>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLint>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLint>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLint>(kSomeBaseValueToTestWith + 3),
-  };
-  cmds::Uniform2ivImmediate& cmd = *GetBufferAs<cmds::Uniform2ivImmediate>();
   const GLsizei kNumElements = 2;
+  std::vector<GLint> vec;
+  vec.resize(kNumElements * 2);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLint) * vec.size());
+  cmds::Uniform2ivImmediate& cmd = *GetBufferAs<cmds::Uniform2ivImmediate>();
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLint) * 2;
   void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform2ivImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
   EXPECT_EQ(static_cast<GLint>(1), cmd.location);
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLint) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, Uniform2ui) {
@@ -2730,25 +2726,23 @@
 
 TEST_F(GLES2FormatTest, Uniform2uivImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLuint data[] = {
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 3),
-  };
-  cmds::Uniform2uivImmediate& cmd = *GetBufferAs<cmds::Uniform2uivImmediate>();
   const GLsizei kNumElements = 2;
+  std::vector<GLuint> vec;
+  vec.resize(kNumElements * 2);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLuint) * vec.size());
+  cmds::Uniform2uivImmediate& cmd = *GetBufferAs<cmds::Uniform2uivImmediate>();
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLuint) * 2;
   void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform2uivImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
   EXPECT_EQ(static_cast<GLint>(1), cmd.location);
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLuint) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, Uniform3f) {
@@ -2767,27 +2761,23 @@
 
 TEST_F(GLES2FormatTest, Uniform3fvImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLfloat data[] = {
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
-  };
-  cmds::Uniform3fvImmediate& cmd = *GetBufferAs<cmds::Uniform3fvImmediate>();
   const GLsizei kNumElements = 2;
+  std::vector<GLfloat> vec;
+  vec.resize(kNumElements * 3);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLfloat) * vec.size());
+  cmds::Uniform3fvImmediate& cmd = *GetBufferAs<cmds::Uniform3fvImmediate>();
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLfloat) * 3;
   void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform3fvImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
   EXPECT_EQ(static_cast<GLint>(1), cmd.location);
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLfloat) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, Uniform3i) {
@@ -2805,27 +2795,23 @@
 
 TEST_F(GLES2FormatTest, Uniform3ivImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLint data[] = {
-      static_cast<GLint>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLint>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLint>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLint>(kSomeBaseValueToTestWith + 3),
-      static_cast<GLint>(kSomeBaseValueToTestWith + 4),
-      static_cast<GLint>(kSomeBaseValueToTestWith + 5),
-  };
-  cmds::Uniform3ivImmediate& cmd = *GetBufferAs<cmds::Uniform3ivImmediate>();
   const GLsizei kNumElements = 2;
+  std::vector<GLint> vec;
+  vec.resize(kNumElements * 3);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLint) * vec.size());
+  cmds::Uniform3ivImmediate& cmd = *GetBufferAs<cmds::Uniform3ivImmediate>();
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLint) * 3;
   void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform3ivImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
   EXPECT_EQ(static_cast<GLint>(1), cmd.location);
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLint) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, Uniform3ui) {
@@ -2845,27 +2831,23 @@
 
 TEST_F(GLES2FormatTest, Uniform3uivImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLuint data[] = {
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 3),
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 4),
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 5),
-  };
-  cmds::Uniform3uivImmediate& cmd = *GetBufferAs<cmds::Uniform3uivImmediate>();
   const GLsizei kNumElements = 2;
+  std::vector<GLuint> vec;
+  vec.resize(kNumElements * 3);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLuint) * vec.size());
+  cmds::Uniform3uivImmediate& cmd = *GetBufferAs<cmds::Uniform3uivImmediate>();
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLuint) * 3;
   void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform3uivImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
   EXPECT_EQ(static_cast<GLint>(1), cmd.location);
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLuint) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, Uniform4f) {
@@ -2885,29 +2867,23 @@
 
 TEST_F(GLES2FormatTest, Uniform4fvImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLfloat data[] = {
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 6),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 7),
-  };
-  cmds::Uniform4fvImmediate& cmd = *GetBufferAs<cmds::Uniform4fvImmediate>();
   const GLsizei kNumElements = 2;
+  std::vector<GLfloat> vec;
+  vec.resize(kNumElements * 4);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLfloat) * vec.size());
+  cmds::Uniform4fvImmediate& cmd = *GetBufferAs<cmds::Uniform4fvImmediate>();
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLfloat) * 4;
   void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform4fvImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
   EXPECT_EQ(static_cast<GLint>(1), cmd.location);
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLfloat) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, Uniform4i) {
@@ -2927,29 +2903,23 @@
 
 TEST_F(GLES2FormatTest, Uniform4ivImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLint data[] = {
-      static_cast<GLint>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLint>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLint>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLint>(kSomeBaseValueToTestWith + 3),
-      static_cast<GLint>(kSomeBaseValueToTestWith + 4),
-      static_cast<GLint>(kSomeBaseValueToTestWith + 5),
-      static_cast<GLint>(kSomeBaseValueToTestWith + 6),
-      static_cast<GLint>(kSomeBaseValueToTestWith + 7),
-  };
-  cmds::Uniform4ivImmediate& cmd = *GetBufferAs<cmds::Uniform4ivImmediate>();
   const GLsizei kNumElements = 2;
+  std::vector<GLint> vec;
+  vec.resize(kNumElements * 4);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLint) * vec.size());
+  cmds::Uniform4ivImmediate& cmd = *GetBufferAs<cmds::Uniform4ivImmediate>();
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLint) * 4;
   void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform4ivImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
   EXPECT_EQ(static_cast<GLint>(1), cmd.location);
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLint) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, Uniform4ui) {
@@ -2970,29 +2940,23 @@
 
 TEST_F(GLES2FormatTest, Uniform4uivImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLuint data[] = {
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 3),
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 4),
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 5),
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 6),
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 7),
-  };
-  cmds::Uniform4uivImmediate& cmd = *GetBufferAs<cmds::Uniform4uivImmediate>();
   const GLsizei kNumElements = 2;
+  std::vector<GLuint> vec;
+  vec.resize(kNumElements * 4);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLuint) * vec.size());
+  cmds::Uniform4uivImmediate& cmd = *GetBufferAs<cmds::Uniform4uivImmediate>();
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLuint) * 4;
   void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data);
+      cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform4uivImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
   EXPECT_EQ(static_cast<GLint>(1), cmd.location);
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLuint) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, UniformBlockBinding) {
@@ -3010,23 +2974,16 @@
 
 TEST_F(GLES2FormatTest, UniformMatrix2fvImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLfloat data[] = {
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 6),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 7),
-  };
+  const GLsizei kNumElements = 2;
+  std::vector<GLfloat> vec;
+  vec.resize(kNumElements * 4);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLfloat) * vec.size());
   cmds::UniformMatrix2fvImmediate& cmd =
       *GetBufferAs<cmds::UniformMatrix2fvImmediate>();
-  const GLsizei kNumElements = 2;
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLfloat) * 4;
   void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2),
-                           static_cast<GLboolean>(3), data);
+                           static_cast<GLboolean>(3), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix2fvImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
@@ -3034,32 +2991,22 @@
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   EXPECT_EQ(static_cast<GLboolean>(3), cmd.transpose);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLfloat) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, UniformMatrix2x3fvImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLfloat data[] = {
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 6),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 7),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 8),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 9),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 10),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 11),
-  };
+  const GLsizei kNumElements = 2;
+  std::vector<GLfloat> vec;
+  vec.resize(kNumElements * 6);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLfloat) * vec.size());
   cmds::UniformMatrix2x3fvImmediate& cmd =
       *GetBufferAs<cmds::UniformMatrix2x3fvImmediate>();
-  const GLsizei kNumElements = 2;
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLfloat) * 6;
   void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2),
-                           static_cast<GLboolean>(3), data);
+                           static_cast<GLboolean>(3), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix2x3fvImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
@@ -3067,36 +3014,22 @@
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   EXPECT_EQ(static_cast<GLboolean>(3), cmd.transpose);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLfloat) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, UniformMatrix2x4fvImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLfloat data[] = {
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 6),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 7),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 8),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 9),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 10),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 11),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 12),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 13),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 14),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 15),
-  };
+  const GLsizei kNumElements = 2;
+  std::vector<GLfloat> vec;
+  vec.resize(kNumElements * 8);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLfloat) * vec.size());
   cmds::UniformMatrix2x4fvImmediate& cmd =
       *GetBufferAs<cmds::UniformMatrix2x4fvImmediate>();
-  const GLsizei kNumElements = 2;
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLfloat) * 8;
   void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2),
-                           static_cast<GLboolean>(3), data);
+                           static_cast<GLboolean>(3), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix2x4fvImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
@@ -3104,38 +3037,22 @@
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   EXPECT_EQ(static_cast<GLboolean>(3), cmd.transpose);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLfloat) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, UniformMatrix3fvImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLfloat data[] = {
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 6),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 7),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 8),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 9),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 10),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 11),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 12),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 13),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 14),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 15),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 16),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 17),
-  };
+  const GLsizei kNumElements = 2;
+  std::vector<GLfloat> vec;
+  vec.resize(kNumElements * 9);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLfloat) * vec.size());
   cmds::UniformMatrix3fvImmediate& cmd =
       *GetBufferAs<cmds::UniformMatrix3fvImmediate>();
-  const GLsizei kNumElements = 2;
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLfloat) * 9;
   void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2),
-                           static_cast<GLboolean>(3), data);
+                           static_cast<GLboolean>(3), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix3fvImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
@@ -3143,32 +3060,22 @@
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   EXPECT_EQ(static_cast<GLboolean>(3), cmd.transpose);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLfloat) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, UniformMatrix3x2fvImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLfloat data[] = {
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 6),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 7),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 8),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 9),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 10),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 11),
-  };
+  const GLsizei kNumElements = 2;
+  std::vector<GLfloat> vec;
+  vec.resize(kNumElements * 6);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLfloat) * vec.size());
   cmds::UniformMatrix3x2fvImmediate& cmd =
       *GetBufferAs<cmds::UniformMatrix3x2fvImmediate>();
-  const GLsizei kNumElements = 2;
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLfloat) * 6;
   void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2),
-                           static_cast<GLboolean>(3), data);
+                           static_cast<GLboolean>(3), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix3x2fvImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
@@ -3176,44 +3083,22 @@
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   EXPECT_EQ(static_cast<GLboolean>(3), cmd.transpose);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLfloat) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, UniformMatrix3x4fvImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLfloat data[] = {
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 6),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 7),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 8),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 9),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 10),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 11),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 12),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 13),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 14),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 15),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 16),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 17),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 18),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 19),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 20),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 21),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 22),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 23),
-  };
+  const GLsizei kNumElements = 2;
+  std::vector<GLfloat> vec;
+  vec.resize(kNumElements * 12);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLfloat) * vec.size());
   cmds::UniformMatrix3x4fvImmediate& cmd =
       *GetBufferAs<cmds::UniformMatrix3x4fvImmediate>();
-  const GLsizei kNumElements = 2;
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLfloat) * 12;
   void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2),
-                           static_cast<GLboolean>(3), data);
+                           static_cast<GLboolean>(3), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix3x4fvImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
@@ -3221,52 +3106,22 @@
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   EXPECT_EQ(static_cast<GLboolean>(3), cmd.transpose);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLfloat) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, UniformMatrix4fvImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLfloat data[] = {
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 6),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 7),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 8),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 9),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 10),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 11),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 12),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 13),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 14),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 15),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 16),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 17),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 18),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 19),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 20),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 21),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 22),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 23),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 24),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 25),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 26),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 27),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 28),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 29),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 30),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 31),
-  };
+  const GLsizei kNumElements = 2;
+  std::vector<GLfloat> vec;
+  vec.resize(kNumElements * 16);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLfloat) * vec.size());
   cmds::UniformMatrix4fvImmediate& cmd =
       *GetBufferAs<cmds::UniformMatrix4fvImmediate>();
-  const GLsizei kNumElements = 2;
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLfloat) * 16;
   void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2),
-                           static_cast<GLboolean>(3), data);
+                           static_cast<GLboolean>(3), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix4fvImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
@@ -3274,36 +3129,22 @@
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   EXPECT_EQ(static_cast<GLboolean>(3), cmd.transpose);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLfloat) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, UniformMatrix4x2fvImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLfloat data[] = {
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 6),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 7),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 8),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 9),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 10),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 11),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 12),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 13),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 14),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 15),
-  };
+  const GLsizei kNumElements = 2;
+  std::vector<GLfloat> vec;
+  vec.resize(kNumElements * 8);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLfloat) * vec.size());
   cmds::UniformMatrix4x2fvImmediate& cmd =
       *GetBufferAs<cmds::UniformMatrix4x2fvImmediate>();
-  const GLsizei kNumElements = 2;
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLfloat) * 8;
   void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2),
-                           static_cast<GLboolean>(3), data);
+                           static_cast<GLboolean>(3), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix4x2fvImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
@@ -3311,44 +3152,22 @@
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   EXPECT_EQ(static_cast<GLboolean>(3), cmd.transpose);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLfloat) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, UniformMatrix4x3fvImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLfloat data[] = {
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 1),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 2),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 3),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 4),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 5),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 6),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 7),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 8),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 9),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 10),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 11),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 12),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 13),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 14),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 15),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 16),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 17),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 18),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 19),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 20),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 21),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 22),
-      static_cast<GLfloat>(kSomeBaseValueToTestWith + 23),
-  };
+  const GLsizei kNumElements = 2;
+  std::vector<GLfloat> vec;
+  vec.resize(kNumElements * 12);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLfloat) * vec.size());
   cmds::UniformMatrix4x3fvImmediate& cmd =
       *GetBufferAs<cmds::UniformMatrix4x3fvImmediate>();
-  const GLsizei kNumElements = 2;
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLfloat) * 12;
   void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2),
-                           static_cast<GLboolean>(3), data);
+                           static_cast<GLboolean>(3), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix4x3fvImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
@@ -3356,7 +3175,8 @@
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   EXPECT_EQ(static_cast<GLboolean>(3), cmd.transpose);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLfloat) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, UseProgram) {
@@ -4556,24 +4376,24 @@
 
 TEST_F(GLES2FormatTest, DiscardFramebufferEXTImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLenum data[] = {
-      static_cast<GLenum>(kSomeBaseValueToTestWith + 0),
-      static_cast<GLenum>(kSomeBaseValueToTestWith + 1),
-  };
+  const GLsizei kNumElements = 2;
+  std::vector<GLenum> vec;
+  vec.resize(kNumElements * 1);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLenum) * vec.size());
   cmds::DiscardFramebufferEXTImmediate& cmd =
       *GetBufferAs<cmds::DiscardFramebufferEXTImmediate>();
-  const GLsizei kNumElements = 2;
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLenum) * 1;
-  void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLenum>(1), static_cast<GLsizei>(2), data);
+  void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(1),
+                           static_cast<GLsizei>(2), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::DiscardFramebufferEXTImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
   EXPECT_EQ(static_cast<GLenum>(1), cmd.target);
   EXPECT_EQ(static_cast<GLsizei>(2), cmd.count);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLenum) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, LoseContextCHROMIUM) {
@@ -4616,21 +4436,22 @@
 
 TEST_F(GLES2FormatTest, DrawBuffersEXTImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLenum data[] = {
-      static_cast<GLenum>(kSomeBaseValueToTestWith + 0),
-  };
+  const GLsizei kNumElements = 1;
+  std::vector<GLenum> vec;
+  vec.resize(kNumElements * 1);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLenum) * vec.size());
   cmds::DrawBuffersEXTImmediate& cmd =
       *GetBufferAs<cmds::DrawBuffersEXTImmediate>();
-  const GLsizei kNumElements = 1;
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLenum) * 1;
-  void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(1), data);
+  void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(1), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(cmds::DrawBuffersEXTImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
   EXPECT_EQ(static_cast<GLsizei>(1), cmd.count);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLenum) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, DiscardBackbufferCHROMIUM) {
@@ -4687,6 +4508,28 @@
   CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
 }
 
+TEST_F(GLES2FormatTest, ScheduleCALayerFilterEffectsCHROMIUMImmediate) {
+  const int kSomeBaseValueToTestWith = 51;
+  const GLsizei kNumElements = 1;
+  std::vector<GLCALayerFilterEffect> vec;
+  vec.resize(kNumElements * 1);
+  memset(vec.data(), kSomeBaseValueToTestWith,
+         sizeof(GLCALayerFilterEffect) * vec.size());
+  cmds::ScheduleCALayerFilterEffectsCHROMIUMImmediate& cmd =
+      *GetBufferAs<cmds::ScheduleCALayerFilterEffectsCHROMIUMImmediate>();
+  const size_t kExpectedCmdSize =
+      sizeof(cmd) + kNumElements * sizeof(GLCALayerFilterEffect) * 1;
+  void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(1), vec.data());
+  EXPECT_EQ(static_cast<uint32_t>(
+                cmds::ScheduleCALayerFilterEffectsCHROMIUMImmediate::kCmdId),
+            cmd.header.command);
+  EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
+  EXPECT_EQ(static_cast<GLsizei>(1), cmd.count);
+  CheckBytesWrittenMatchesExpectedSize(
+      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(
+                                  sizeof(GLCALayerFilterEffect) * vec.size()));
+}
+
 TEST_F(GLES2FormatTest, ScheduleCALayerCHROMIUM) {
   cmds::ScheduleCALayerCHROMIUM& cmd =
       *GetBufferAs<cmds::ScheduleCALayerCHROMIUM>();
@@ -4708,22 +4551,23 @@
 
 TEST_F(GLES2FormatTest, ScheduleCALayerInUseQueryCHROMIUMImmediate) {
   const int kSomeBaseValueToTestWith = 51;
-  static GLuint data[] = {
-      static_cast<GLuint>(kSomeBaseValueToTestWith + 0),
-  };
+  const GLsizei kNumElements = 1;
+  std::vector<GLuint> vec;
+  vec.resize(kNumElements * 1);
+  memset(vec.data(), kSomeBaseValueToTestWith, sizeof(GLuint) * vec.size());
   cmds::ScheduleCALayerInUseQueryCHROMIUMImmediate& cmd =
       *GetBufferAs<cmds::ScheduleCALayerInUseQueryCHROMIUMImmediate>();
-  const GLsizei kNumElements = 1;
   const size_t kExpectedCmdSize =
       sizeof(cmd) + kNumElements * sizeof(GLuint) * 1;
-  void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(1), data);
+  void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(1), vec.data());
   EXPECT_EQ(static_cast<uint32_t>(
                 cmds::ScheduleCALayerInUseQueryCHROMIUMImmediate::kCmdId),
             cmd.header.command);
   EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);
   EXPECT_EQ(static_cast<GLsizei>(1), cmd.count);
   CheckBytesWrittenMatchesExpectedSize(
-      next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)));
+      next_cmd,
+      sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(GLuint) * vec.size()));
 }
 
 TEST_F(GLES2FormatTest, CommitOverlayPlanesCHROMIUM) {
diff --git a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
index f7e554d3..995c103 100644
--- a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
@@ -295,41 +295,42 @@
   OP(DiscardBackbufferCHROMIUM)                            /* 536 */ \
   OP(ScheduleOverlayPlaneCHROMIUM)                         /* 537 */ \
   OP(ScheduleCALayerSharedStateCHROMIUM)                   /* 538 */ \
-  OP(ScheduleCALayerCHROMIUM)                              /* 539 */ \
-  OP(ScheduleCALayerInUseQueryCHROMIUMImmediate)           /* 540 */ \
-  OP(CommitOverlayPlanesCHROMIUM)                          /* 541 */ \
-  OP(SwapInterval)                                         /* 542 */ \
-  OP(FlushDriverCachesCHROMIUM)                            /* 543 */ \
-  OP(MatrixLoadfCHROMIUMImmediate)                         /* 544 */ \
-  OP(MatrixLoadIdentityCHROMIUM)                           /* 545 */ \
-  OP(GenPathsCHROMIUM)                                     /* 546 */ \
-  OP(DeletePathsCHROMIUM)                                  /* 547 */ \
-  OP(IsPathCHROMIUM)                                       /* 548 */ \
-  OP(PathCommandsCHROMIUM)                                 /* 549 */ \
-  OP(PathParameterfCHROMIUM)                               /* 550 */ \
-  OP(PathParameteriCHROMIUM)                               /* 551 */ \
-  OP(PathStencilFuncCHROMIUM)                              /* 552 */ \
-  OP(StencilFillPathCHROMIUM)                              /* 553 */ \
-  OP(StencilStrokePathCHROMIUM)                            /* 554 */ \
-  OP(CoverFillPathCHROMIUM)                                /* 555 */ \
-  OP(CoverStrokePathCHROMIUM)                              /* 556 */ \
-  OP(StencilThenCoverFillPathCHROMIUM)                     /* 557 */ \
-  OP(StencilThenCoverStrokePathCHROMIUM)                   /* 558 */ \
-  OP(StencilFillPathInstancedCHROMIUM)                     /* 559 */ \
-  OP(StencilStrokePathInstancedCHROMIUM)                   /* 560 */ \
-  OP(CoverFillPathInstancedCHROMIUM)                       /* 561 */ \
-  OP(CoverStrokePathInstancedCHROMIUM)                     /* 562 */ \
-  OP(StencilThenCoverFillPathInstancedCHROMIUM)            /* 563 */ \
-  OP(StencilThenCoverStrokePathInstancedCHROMIUM)          /* 564 */ \
-  OP(BindFragmentInputLocationCHROMIUMBucket)              /* 565 */ \
-  OP(ProgramPathFragmentInputGenCHROMIUM)                  /* 566 */ \
-  OP(CoverageModulationCHROMIUM)                           /* 567 */ \
-  OP(BlendBarrierKHR)                                      /* 568 */ \
-  OP(ApplyScreenSpaceAntialiasingCHROMIUM)                 /* 569 */ \
-  OP(BindFragDataLocationIndexedEXTBucket)                 /* 570 */ \
-  OP(BindFragDataLocationEXTBucket)                        /* 571 */ \
-  OP(GetFragDataIndexEXT)                                  /* 572 */ \
-  OP(UniformMatrix4fvStreamTextureMatrixCHROMIUMImmediate) /* 573 */
+  OP(ScheduleCALayerFilterEffectsCHROMIUMImmediate)        /* 539 */ \
+  OP(ScheduleCALayerCHROMIUM)                              /* 540 */ \
+  OP(ScheduleCALayerInUseQueryCHROMIUMImmediate)           /* 541 */ \
+  OP(CommitOverlayPlanesCHROMIUM)                          /* 542 */ \
+  OP(SwapInterval)                                         /* 543 */ \
+  OP(FlushDriverCachesCHROMIUM)                            /* 544 */ \
+  OP(MatrixLoadfCHROMIUMImmediate)                         /* 545 */ \
+  OP(MatrixLoadIdentityCHROMIUM)                           /* 546 */ \
+  OP(GenPathsCHROMIUM)                                     /* 547 */ \
+  OP(DeletePathsCHROMIUM)                                  /* 548 */ \
+  OP(IsPathCHROMIUM)                                       /* 549 */ \
+  OP(PathCommandsCHROMIUM)                                 /* 550 */ \
+  OP(PathParameterfCHROMIUM)                               /* 551 */ \
+  OP(PathParameteriCHROMIUM)                               /* 552 */ \
+  OP(PathStencilFuncCHROMIUM)                              /* 553 */ \
+  OP(StencilFillPathCHROMIUM)                              /* 554 */ \
+  OP(StencilStrokePathCHROMIUM)                            /* 555 */ \
+  OP(CoverFillPathCHROMIUM)                                /* 556 */ \
+  OP(CoverStrokePathCHROMIUM)                              /* 557 */ \
+  OP(StencilThenCoverFillPathCHROMIUM)                     /* 558 */ \
+  OP(StencilThenCoverStrokePathCHROMIUM)                   /* 559 */ \
+  OP(StencilFillPathInstancedCHROMIUM)                     /* 560 */ \
+  OP(StencilStrokePathInstancedCHROMIUM)                   /* 561 */ \
+  OP(CoverFillPathInstancedCHROMIUM)                       /* 562 */ \
+  OP(CoverStrokePathInstancedCHROMIUM)                     /* 563 */ \
+  OP(StencilThenCoverFillPathInstancedCHROMIUM)            /* 564 */ \
+  OP(StencilThenCoverStrokePathInstancedCHROMIUM)          /* 565 */ \
+  OP(BindFragmentInputLocationCHROMIUMBucket)              /* 566 */ \
+  OP(ProgramPathFragmentInputGenCHROMIUM)                  /* 567 */ \
+  OP(CoverageModulationCHROMIUM)                           /* 568 */ \
+  OP(BlendBarrierKHR)                                      /* 569 */ \
+  OP(ApplyScreenSpaceAntialiasingCHROMIUM)                 /* 570 */ \
+  OP(BindFragDataLocationIndexedEXTBucket)                 /* 571 */ \
+  OP(BindFragDataLocationEXTBucket)                        /* 572 */ \
+  OP(GetFragDataIndexEXT)                                  /* 573 */ \
+  OP(UniformMatrix4fvStreamTextureMatrixCHROMIUMImmediate) /* 574 */
 
 enum CommandId {
   kOneBeforeStartPoint =
diff --git a/gpu/command_buffer/service/context_state.cc b/gpu/command_buffer/service/context_state.cc
index ce03cbd..c19ffa52 100644
--- a/gpu/command_buffer/service/context_state.cc
+++ b/gpu/command_buffer/service/context_state.cc
@@ -222,7 +222,6 @@
       ignore_cached_state(false),
       fbo_binding_for_scissor_workaround_dirty(false),
       framebuffer_srgb_(false),
-      max_vertex_attribs_(0),
       feature_info_(feature_info),
       error_state_(ErrorState::Create(error_state_client, logger)) {
   Initialize();
diff --git a/gpu/command_buffer/service/context_state.h b/gpu/command_buffer/service/context_state.h
index 6e2d293..2378eeb3 100644
--- a/gpu/command_buffer/service/context_state.h
+++ b/gpu/command_buffer/service/context_state.h
@@ -243,30 +243,27 @@
   void SetBoundBuffer(GLenum target, Buffer* buffer);
   void RemoveBoundBuffer(Buffer* buffer);
 
-  void InitGenericAttribBaseType(GLuint max_vertex_attribs) {
-      max_vertex_attribs_ = max_vertex_attribs;
+  void InitGenericAttribs(GLuint max_vertex_attribs) {
+    attrib_values.resize(max_vertex_attribs);
 
-      uint32_t packed_size = max_vertex_attribs_ / 16;
-      packed_size += (max_vertex_attribs_ % 16 == 0) ? 0 : 1;
-      generic_attrib_base_type_mask_.resize(packed_size);
-      for (uint32_t i = 0; i < packed_size; ++i) {
-        // All generic attribs are float type by default.
-        generic_attrib_base_type_mask_[i] = 0x55555555u * SHADER_VARIABLE_FLOAT;
-      }
+    uint32_t packed_size = max_vertex_attribs / 16;
+    packed_size += (max_vertex_attribs % 16 == 0) ? 0 : 1;
+    generic_attrib_base_type_mask_.resize(packed_size);
+    for (uint32_t i = 0; i < packed_size; ++i) {
+      // All generic attribs are float type by default.
+      generic_attrib_base_type_mask_[i] = 0x55555555u * SHADER_VARIABLE_FLOAT;
+    }
   }
 
   void SetGenericVertexAttribBaseType(GLuint index, GLenum base_type) {
-    DCHECK(index < max_vertex_attribs_);
+    DCHECK_LT(index, attrib_values.size());
     int shift_bits = (index % 16) * 2;
     generic_attrib_base_type_mask_[index / 16] &= ~(0x3 << shift_bits);
     generic_attrib_base_type_mask_[index / 16] |= (base_type << shift_bits);
   }
 
-  // Return 16 attributes' base types, in which the generic attribute
-  // specified by argument 'index' located.
-  uint32_t GetGenericVertexAttribBaseTypeMask(GLuint index) {
-    DCHECK(index < max_vertex_attribs_);
-    return generic_attrib_base_type_mask_[index / 16];
+  const std::vector<uint32_t>& generic_attrib_base_type_mask() const {
+    return generic_attrib_base_type_mask_;
   }
 
   void UnbindTexture(TextureRef* texture);
@@ -346,10 +343,9 @@
 
   bool framebuffer_srgb_;
 
-  uint32_t max_vertex_attribs_;
   // Generic vertex attrib base types: FLOAT, INT, or UINT.
   // Each base type is encoded into 2 bits, the lowest 2 bits for location 0,
-  // the highest 2 bits for location (max_vertex_attribs_ - 1).
+  // the highest 2 bits for location (max_vertex_attribs - 1).
   std::vector<uint32_t> generic_attrib_base_type_mask_;
 
   FeatureInfo* feature_info_;
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc
index 4eae5f8..4563242 100644
--- a/gpu/command_buffer/service/feature_info.cc
+++ b/gpu/command_buffer/service/feature_info.cc
@@ -873,21 +873,19 @@
     }
   }
 
-  if (!workarounds_.disable_multisampled_render_to_texture) {
-    if (extensions.Contains("GL_EXT_multisampled_render_to_texture")) {
-      feature_flags_.multisampled_render_to_texture = true;
-    } else if (extensions.Contains("GL_IMG_multisampled_render_to_texture")) {
-      feature_flags_.multisampled_render_to_texture = true;
-      feature_flags_.use_img_for_multisampled_render_to_texture = true;
-    }
-    if (feature_flags_.multisampled_render_to_texture) {
-      validators_.render_buffer_parameter.AddValue(
-          GL_RENDERBUFFER_SAMPLES_EXT);
-      validators_.g_l_state.AddValue(GL_MAX_SAMPLES_EXT);
-      validators_.frame_buffer_parameter.AddValue(
-          GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT);
-      AddExtensionString("GL_EXT_multisampled_render_to_texture");
-    }
+  if (extensions.Contains("GL_EXT_multisampled_render_to_texture")) {
+    feature_flags_.multisampled_render_to_texture = true;
+  } else if (extensions.Contains("GL_IMG_multisampled_render_to_texture")) {
+    feature_flags_.multisampled_render_to_texture = true;
+    feature_flags_.use_img_for_multisampled_render_to_texture = true;
+  }
+  if (feature_flags_.multisampled_render_to_texture) {
+    validators_.render_buffer_parameter.AddValue(
+        GL_RENDERBUFFER_SAMPLES_EXT);
+    validators_.g_l_state.AddValue(GL_MAX_SAMPLES_EXT);
+    validators_.frame_buffer_parameter.AddValue(
+        GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT);
+    AddExtensionString("GL_EXT_multisampled_render_to_texture");
   }
 
   if (!gl_version_info_->is_es ||
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 542d377..849edbb 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -1085,6 +1085,9 @@
 
   void DoMatrixLoadfCHROMIUM(GLenum matrix_mode, const GLfloat* matrix);
   void DoMatrixLoadIdentityCHROMIUM(GLenum matrix_mode);
+  void DoScheduleCALayerFilterEffectsCHROMIUM(
+      GLsizei count,
+      const GLCALayerFilterEffect* filter_effects);
   void DoScheduleCALayerInUseQueryCHROMIUM(GLsizei count,
                                            const GLuint* textures);
 
@@ -2051,6 +2054,10 @@
   // using GL_RGBA and glColorMask.
   bool ChromiumImageNeedsRGBEmulation();
 
+  // The GL_CHROMIUM_schedule_ca_layer extension requires that SwapBuffers and
+  // equivalent functions reset shared state.
+  void ClearScheduleCALayerState();
+
   bool InitializeCopyTexImageBlitter(const char* function_name);
   bool InitializeCopyTextureCHROMIUM(const char* function_name);
   // Generate a member function prototype for each command in an automated and
@@ -2311,6 +2318,7 @@
   };
 
   std::unique_ptr<CALayerSharedState> ca_layer_shared_state_;
+  std::vector<ui::CARendererLayerParams::FilterEffect> ca_layer_filter_effects_;
 
   DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl);
 };
@@ -3078,8 +3086,7 @@
   state_.indexed_uniform_buffer_bindings = new IndexedBufferBindingHost(
       group_->max_uniform_buffer_bindings(), needs_emulation);
 
-  state_.InitGenericAttribBaseType(group_->max_vertex_attribs());
-  state_.attrib_values.resize(group_->max_vertex_attribs());
+  state_.InitGenericAttribs(group_->max_vertex_attribs());
   vertex_array_manager_.reset(new VertexArrayManager());
 
   GLuint default_vertex_attrib_service_id = 0;
@@ -9137,21 +9144,34 @@
 }
 
 bool GLES2DecoderImpl::AttribsTypeMatch() {
-  for (uint32_t index = 0; index < group_->max_vertex_attribs(); index += 16) {
-    uint32_t shader_attrib_written_mask =
-        state_.current_program->vertex_input_type_written_mask(index);
-    uint32_t vao_attrib_enabled_mask =
-        state_.vertex_attrib_manager->attrib_enabled_mask(index);
-
-    uint32_t vertex_attrib_base_type_mask =
-        (~vao_attrib_enabled_mask &
-         state_.GetGenericVertexAttribBaseTypeMask(index)) |
-        (vao_attrib_enabled_mask &
-         state_.vertex_attrib_manager->attrib_base_type_mask(index));
-
-    if ((state_.current_program->vertex_input_base_type_mask(index)
-         & shader_attrib_written_mask) !=
-         (vertex_attrib_base_type_mask & shader_attrib_written_mask)) {
+  if (!state_.current_program.get())
+    return true;
+  const std::vector<uint32_t>& shader_attrib_active_mask =
+      state_.current_program->vertex_input_active_mask();
+  const std::vector<uint32_t>& shader_attrib_type_mask =
+      state_.current_program->vertex_input_base_type_mask();
+  const std::vector<uint32_t>& generic_vertex_attrib_type_mask =
+      state_.generic_attrib_base_type_mask();
+  const std::vector<uint32_t>& vertex_attrib_array_enabled_mask =
+      state_.vertex_attrib_manager->attrib_enabled_mask();
+  const std::vector<uint32_t>& vertex_attrib_array_type_mask =
+      state_.vertex_attrib_manager->attrib_base_type_mask();
+  DCHECK_EQ(shader_attrib_active_mask.size(),
+            shader_attrib_type_mask.size());
+  DCHECK_EQ(shader_attrib_active_mask.size(),
+            generic_vertex_attrib_type_mask.size());
+  DCHECK_EQ(shader_attrib_active_mask.size(),
+            vertex_attrib_array_enabled_mask.size());
+  DCHECK_EQ(shader_attrib_active_mask.size(),
+            vertex_attrib_array_type_mask.size());
+  for (size_t ii = 0; ii < shader_attrib_active_mask.size(); ++ii) {
+    uint32_t vertex_attrib_source_type_mask =
+        (~vertex_attrib_array_enabled_mask[ii] &
+         generic_vertex_attrib_type_mask[ii]) |
+        (vertex_attrib_array_enabled_mask[ii] &
+         vertex_attrib_array_type_mask[ii]);
+    if ((shader_attrib_type_mask[ii] & shader_attrib_active_mask[ii]) !=
+        (vertex_attrib_source_type_mask & shader_attrib_active_mask[ii])) {
       return false;
     }
   }
@@ -10850,9 +10870,7 @@
         is_offscreen ? offscreen_size_ : surface_->GetSize());
   }
 
-  // The GL_CHROMIUM_schedule_ca_layer extension requires that SwapBuffers and
-  // equivalent functions reset shared state.
-  ca_layer_shared_state_.reset();
+  ClearScheduleCALayerState();
 
   if (supports_async_swap_) {
     TRACE_EVENT_ASYNC_BEGIN0("cc", "GLES2DecoderImpl::AsyncSwapBuffers", this);
@@ -10980,6 +10998,8 @@
   gfx::RectF contents_rect(mem[0], mem[1], mem[2], mem[3]);
   gfx::RectF bounds_rect(mem[4], mem[5], mem[6], mem[7]);
 
+  // TODO(erikchen): Pass through filter effects. https://crbug.com/581526.
+  ca_layer_filter_effects_.clear();
   ui::CARendererLayerParams params = ui::CARendererLayerParams(
       ca_layer_shared_state_->is_clipped, ca_layer_shared_state_->clip_rect,
       ca_layer_shared_state_->sorting_context_id,
@@ -10993,6 +11013,42 @@
   return error::kNoError;
 }
 
+void GLES2DecoderImpl::DoScheduleCALayerFilterEffectsCHROMIUM(
+    GLsizei count,
+    const GLCALayerFilterEffect* filter_effects) {
+  std::vector<ui::CARendererLayerParams::FilterEffect> effects;
+  effects.reserve(count);
+  for (GLsizei i = 0; i < count; ++i) {
+    const GLCALayerFilterEffect& filter_effect = filter_effects[i];
+    GLint min =
+        static_cast<GLint>(ui::CARendererLayerParams::FilterEffectType::MIN);
+    GLint max =
+        static_cast<GLint>(ui::CARendererLayerParams::FilterEffectType::MAX);
+    if (filter_effect.type < min || filter_effect.type > max) {
+      LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
+                         "glScheduleCALayerFilterEffectsCHROMIUM",
+                         "Invalid filter type.");
+      return;
+    }
+    ui::CARendererLayerParams::FilterEffectType filter_type =
+        static_cast<ui::CARendererLayerParams::FilterEffectType>(
+            filter_effect.type);
+
+    ui::CARendererLayerParams::FilterEffect& effect = effects[i];
+    effect.type = filter_type;
+    effect.amount = filter_effect.amount;
+    effect.drop_shadow_offset = gfx::Point(filter_effect.drop_shadow_offset_x,
+                                           filter_effect.drop_shadow_offset_y);
+
+    static_assert(sizeof(GLuint) == sizeof(SkColor),
+                  "GLuint and SkColor must have the same size.");
+    effect.drop_shadow_color =
+        static_cast<SkColor>(filter_effect.drop_shadow_color);
+  }
+
+  ca_layer_filter_effects_.swap(effects);
+}
+
 void GLES2DecoderImpl::DoScheduleCALayerInUseQueryCHROMIUM(
     GLsizei count,
     const GLuint* textures) {
@@ -13916,9 +13972,7 @@
         is_offscreen ? offscreen_size_ : surface_->GetSize());
   }
 
-  // The GL_CHROMIUM_schedule_ca_layer extension requires that SwapBuffers and
-  // equivalent functions reset shared state.
-  ca_layer_shared_state_.reset();
+  ClearScheduleCALayerState();
 
   // If offscreen then don't actually SwapBuffers to the display. Just copy
   // the rendered frame to another frame buffer.
@@ -14038,9 +14092,7 @@
                        "command not supported by surface");
     return;
   }
-  // The GL_CHROMIUM_schedule_ca_layer extension requires that SwapBuffers and
-  // equivalent functions reset shared state.
-  ca_layer_shared_state_.reset();
+  ClearScheduleCALayerState();
   if (supports_async_swap_) {
     surface_->CommitOverlayPlanesAsync(base::Bind(
         &GLES2DecoderImpl::FinishSwapBuffers, base::AsWeakPtr(this)));
@@ -17475,6 +17527,11 @@
   return factory ? !factory->SupportsFormatRGB() : false;
 }
 
+void GLES2DecoderImpl::ClearScheduleCALayerState() {
+  ca_layer_shared_state_.reset();
+  ca_layer_filter_effects_.clear();
+}
+
 error::Error GLES2DecoderImpl::HandleBindFragmentInputLocationCHROMIUMBucket(
     uint32_t immediate_data_size,
     const void* cmd_data) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
index 5222f5d..3704abd 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -5281,6 +5281,40 @@
   return error::kNoError;
 }
 
+error::Error
+GLES2DecoderImpl::HandleScheduleCALayerFilterEffectsCHROMIUMImmediate(
+    uint32_t immediate_data_size,
+    const void* cmd_data) {
+  const gles2::cmds::ScheduleCALayerFilterEffectsCHROMIUMImmediate& c =
+      *static_cast<
+          const gles2::cmds::ScheduleCALayerFilterEffectsCHROMIUMImmediate*>(
+          cmd_data);
+  (void)c;
+  GLsizei count = static_cast<GLsizei>(c.count);
+  uint32_t data_size = 0;
+  if (count >= 0 &&
+      !GLES2Util::ComputeDataSize(count, sizeof(GLCALayerFilterEffect), 1,
+                                  &data_size)) {
+    return error::kOutOfBounds;
+  }
+  if (data_size > immediate_data_size) {
+    return error::kOutOfBounds;
+  }
+  const GLCALayerFilterEffect* effects =
+      GetImmediateDataAs<const GLCALayerFilterEffect*>(c, data_size,
+                                                       immediate_data_size);
+  if (count < 0) {
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
+                       "glScheduleCALayerFilterEffectsCHROMIUM", "count < 0");
+    return error::kNoError;
+  }
+  if (effects == NULL) {
+    return error::kOutOfBounds;
+  }
+  DoScheduleCALayerFilterEffectsCHROMIUM(count, effects);
+  return error::kNoError;
+}
+
 error::Error GLES2DecoderImpl::HandleScheduleCALayerInUseQueryCHROMIUMImmediate(
     uint32_t immediate_data_size,
     const void* cmd_data) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h
index 4d08c50d..399d542 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h
@@ -764,6 +764,9 @@
                                                   const GLfloat* clip_rect,
                                                   GLint sorting_context_id,
                                                   const GLfloat* transform);
+error::Error DoScheduleCALayerFilterEffectsCHROMIUM(
+    GLuint n,
+    const GLCALayerFilterEffect* effects);
 error::Error DoScheduleCALayerCHROMIUM(GLuint contents_texture_id,
                                        const GLfloat* contents_rect,
                                        GLuint background_color,
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
index 72c8ded..c58836b 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
@@ -1867,6 +1867,13 @@
   return error::kNoError;
 }
 
+error::Error
+GLES2DecoderPassthroughImpl::DoScheduleCALayerFilterEffectsCHROMIUM(
+    GLuint n,
+    const GLCALayerFilterEffect* effects) {
+  return error::kNoError;
+}
+
 error::Error GLES2DecoderPassthroughImpl::DoScheduleCALayerCHROMIUM(
     GLuint contents_texture_id,
     const GLfloat* contents_rect,
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
index e049c99..a49a87b7 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
@@ -4273,6 +4273,35 @@
   return error::kNoError;
 }
 
+error::Error GLES2DecoderPassthroughImpl::
+    HandleScheduleCALayerFilterEffectsCHROMIUMImmediate(
+        uint32_t immediate_data_size,
+        const void* cmd_data) {
+  const gles2::cmds::ScheduleCALayerFilterEffectsCHROMIUMImmediate& c =
+      *static_cast<
+          const gles2::cmds::ScheduleCALayerFilterEffectsCHROMIUMImmediate*>(
+          cmd_data);
+  (void)c;
+  GLsizei count = static_cast<GLsizei>(c.count);
+  uint32_t data_size = 0;
+  if (count >= 0 &&
+      !GLES2Util::ComputeDataSize(count, sizeof(GLCALayerFilterEffect), 1,
+                                  &data_size)) {
+    return error::kOutOfBounds;
+  }
+  if (data_size > immediate_data_size) {
+    return error::kOutOfBounds;
+  }
+  const GLCALayerFilterEffect* effects =
+      GetImmediateDataAs<const GLCALayerFilterEffect*>(c, data_size,
+                                                       immediate_data_size);
+  error::Error error = DoScheduleCALayerFilterEffectsCHROMIUM(count, effects);
+  if (error != error::kNoError) {
+    return error;
+  }
+  return error::kNoError;
+}
+
 error::Error
 GLES2DecoderPassthroughImpl::HandleScheduleCALayerInUseQueryCHROMIUMImmediate(
     uint32_t immediate_data_size,
diff --git a/gpu/command_buffer/service/program_manager.cc b/gpu/command_buffer/service/program_manager.cc
index ca07255..7adbbdf 100644
--- a/gpu/command_buffer/service/program_manager.cc
+++ b/gpu/command_buffer/service/program_manager.cc
@@ -310,6 +310,10 @@
       fragment_output_written_mask_(0u) {
   DCHECK(manager_);
   manager_->StartTracking(this);
+  uint32_t packed_size = (manager_->max_vertex_attribs() + 15) / 16;
+  vertex_input_base_type_mask_.resize(packed_size);
+  vertex_input_active_mask_.resize(packed_size);
+  ClearVertexInputMasks();
 }
 
 void Program::Reset() {
@@ -327,8 +331,14 @@
   attrib_location_to_index_map_.clear();
   fragment_output_type_mask_ = 0u;
   fragment_output_written_mask_ = 0u;
-  vertex_input_base_type_mask_.clear();
-  vertex_input_type_written_mask_.clear();
+  ClearVertexInputMasks();
+}
+
+void Program::ClearVertexInputMasks() {
+  for (uint32_t ii = 0; ii < vertex_input_base_type_mask_.size(); ++ii) {
+    vertex_input_base_type_mask_[ii] = 0u;
+    vertex_input_active_mask_[ii] = 0u;
+  }
 }
 
 void Program::UpdateFragmentOutputBaseTypes() {
@@ -370,27 +380,17 @@
 }
 
 void Program::UpdateVertexInputBaseTypes() {
-  max_vertex_attribs_ = manager_->max_vertex_attribs();
-  uint32_t packed_size = max_vertex_attribs_ / 16;
-  packed_size += (max_vertex_attribs_ % 16 == 0) ? 0 : 1;
-  vertex_input_base_type_mask_.resize(packed_size);
-  vertex_input_type_written_mask_.resize(packed_size);
-
-  for (uint32_t ii = 0; ii < packed_size; ++ii) {
-    vertex_input_type_written_mask_[ii] = 0u;
-    vertex_input_base_type_mask_[ii] = 0u;
-  }
-
+  ClearVertexInputMasks();
+  DCHECK_LE(attrib_infos_.size(), manager_->max_vertex_attribs());
   for (size_t ii = 0; ii < attrib_infos_.size(); ++ii) {
-    DCHECK(ii < max_vertex_attribs_);
     const VertexAttrib& input = attrib_infos_[ii];
     if (ProgramManager::HasBuiltInPrefix(input.name)) {
       continue;
     }
     int shift_bits = (input.location % 16) * 2;
-      vertex_input_type_written_mask_[ii / 16] |= 0x3 << shift_bits;
-      vertex_input_base_type_mask_[ii / 16] |=
-          InputOutputTypeToBaseType(true, input.type) << shift_bits;
+    vertex_input_active_mask_[ii / 16] |= 0x3 << shift_bits;
+    vertex_input_base_type_mask_[ii / 16] |=
+        InputOutputTypeToBaseType(true, input.type) << shift_bits;
   }
 }
 
diff --git a/gpu/command_buffer/service/program_manager.h b/gpu/command_buffer/service/program_manager.h
index a3fd9f2..36bc94e 100644
--- a/gpu/command_buffer/service/program_manager.h
+++ b/gpu/command_buffer/service/program_manager.h
@@ -397,24 +397,18 @@
   // See member declaration for details.
   // The data are only valid after a successful link.
   uint32_t fragment_output_type_mask() const {
-      return fragment_output_type_mask_;
+    return fragment_output_type_mask_;
   }
   uint32_t fragment_output_written_mask() const {
-      return fragment_output_written_mask_;
+    return fragment_output_written_mask_;
   }
 
   // The data are only valid after a successful link.
-  // Return 16 attributes' base types, in which the attribute
-  // specified by argument 'loc' located.
-  uint32_t vertex_input_base_type_mask(GLuint loc) const {
-      DCHECK(loc < max_vertex_attribs_);
-      return vertex_input_base_type_mask_[loc / 16];
+  const std::vector<uint32_t>& vertex_input_base_type_mask() const {
+    return vertex_input_base_type_mask_;
   }
-  // Return 16 attributes' type written masks, in which the
-  // attribute specified by argument 'loc' located.
-  uint32_t vertex_input_type_written_mask(GLuint loc) const {
-      DCHECK(loc < max_vertex_attribs_);
-      return vertex_input_type_written_mask_[loc / 16];
+  const std::vector<uint32_t>& vertex_input_active_mask() const {
+    return vertex_input_active_mask_;
   }
 
   // Update uniform block binding after a successful glUniformBlockBinding().
@@ -504,6 +498,8 @@
 
   const FeatureInfo& feature_info() const;
 
+  void ClearVertexInputMasks();
+
   ProgramManager* manager_;
 
   int use_count_;
@@ -581,14 +577,13 @@
   // by an output variable, 0x00 if not.
   uint32_t fragment_output_written_mask_;
 
-  uint32_t max_vertex_attribs_;
   // Vertex input attrib base types: FLOAT, INT, or UINT.
   // Each base type is encoded into 2 bits, the lowest 2 bits for location 0,
-  // the highest 2 bits for location (max_vertex_attribs_ - 1).
+  // the highest 2 bits for location (max_vertex_attribs - 1).
   std::vector<uint32_t> vertex_input_base_type_mask_;
   // Same layout as above, 2 bits per location, 0x03 if a location is set
   // by vertexAttrib API, 0x00 if not.
-  std::vector<uint32_t> vertex_input_type_written_mask_;
+  std::vector<uint32_t> vertex_input_active_mask_;
 };
 
 // Tracks the Programs.
diff --git a/gpu/command_buffer/service/vertex_attrib_manager.cc b/gpu/command_buffer/service/vertex_attrib_manager.cc
index 2e18356..6336c546 100644
--- a/gpu/command_buffer/service/vertex_attrib_manager.cc
+++ b/gpu/command_buffer/service/vertex_attrib_manager.cc
@@ -127,9 +127,7 @@
 void VertexAttribManager::Initialize(uint32_t max_vertex_attribs,
                                      bool init_attribs) {
   vertex_attribs_.resize(max_vertex_attribs);
-  max_vertex_attribs_ = max_vertex_attribs;
-  uint32_t packed_size = max_vertex_attribs_ / 16;
-  packed_size += (max_vertex_attribs_ % 16 == 0) ? 0 : 1;
+  uint32_t packed_size = (max_vertex_attribs + 15) / 16;
   attrib_base_type_mask_.resize(packed_size);
   attrib_enabled_mask_.resize(packed_size);
 
@@ -157,18 +155,16 @@
     return false;
   }
 
-  DCHECK(index < max_vertex_attribs_);
-  GLuint shift_bits = (index % 16) * 2;
-  if (enable) {
-    attrib_enabled_mask_[index / 16] |= (0x3 << shift_bits);
-  } else {
-    attrib_enabled_mask_[index / 16] &= ~(0x3 << shift_bits);
-  }
-
   VertexAttrib& info = vertex_attribs_[index];
   if (info.enabled() != enable) {
     info.set_enabled(enable);
     info.SetList(enable ? &enabled_vertex_attribs_ : &disabled_vertex_attribs_);
+    GLuint shift_bits = (index % 16) * 2;
+    if (enable) {
+      attrib_enabled_mask_[index / 16] |= (0x3 << shift_bits);
+    } else {
+      attrib_enabled_mask_[index / 16] &= ~(0x3 << shift_bits);
+    }
   }
   return true;
 }
diff --git a/gpu/command_buffer/service/vertex_attrib_manager.h b/gpu/command_buffer/service/vertex_attrib_manager.h
index 40c6794..363e5c9 100644
--- a/gpu/command_buffer/service/vertex_attrib_manager.h
+++ b/gpu/command_buffer/service/vertex_attrib_manager.h
@@ -201,25 +201,18 @@
   }
 
   void UpdateAttribBaseTypeAndMask(GLuint loc, GLenum base_type) {
-    DCHECK(loc < max_vertex_attribs_);
+    DCHECK(loc < vertex_attribs_.size());
     int shift_bits = (loc % 16) * 2;
     attrib_enabled_mask_[loc / 16] |= (0x3 << shift_bits);
     attrib_base_type_mask_[loc / 16] &= ~(0x3 << shift_bits);
     attrib_base_type_mask_[loc / 16] |= base_type << shift_bits;
   }
 
-  // Return 16 attributes' base types, in which the attribute
-  // specified by argument 'loc' located.
-  uint32_t attrib_base_type_mask(GLuint loc) const {
-    DCHECK(loc < max_vertex_attribs_);
-    return attrib_base_type_mask_[loc / 16];
+  const std::vector<uint32_t>& attrib_base_type_mask() const {
+    return attrib_base_type_mask_;
   }
-
-  // Return 16 attributes' type written masks, in which the
-  // attribute specified by argument 'loc' located.
-  uint32_t attrib_enabled_mask(GLuint loc) const {
-    DCHECK(loc < max_vertex_attribs_);
-    return attrib_enabled_mask_[loc / 16];
+  const std::vector<uint32_t>& attrib_enabled_mask() const {
+    return attrib_enabled_mask_;
   }
 
   void SetAttribInfo(
@@ -306,10 +299,9 @@
   // if it is safe to draw.
   std::vector<VertexAttrib> vertex_attribs_;
 
-  uint32_t max_vertex_attribs_;
   // Vertex attrib base types: FLOAT, INT, or UINT.
   // Each base type is encoded into 2 bits, the lowest 2 bits for location 0,
-  // the highest 2 bits for location (max_vertex_attribs_ - 1).
+  // the highest 2 bits for location (max_vertex_attribs - 1).
   std::vector<uint32_t> attrib_base_type_mask_;
   // Same layout as above, 2 bits per location, 0x03 if a location for an
   // vertex attrib is enabled by enabbleVertexAttribArray, 0x00 if it is
diff --git a/gpu/config/gpu_driver_bug_list_json.cc b/gpu/config/gpu_driver_bug_list_json.cc
index c2231886..ea220ff 100644
--- a/gpu/config/gpu_driver_bug_list_json.cc
+++ b/gpu/config/gpu_driver_bug_list_json.cc
@@ -19,7 +19,7 @@
 {
   "name": "gpu driver bug list",
   // Please update the version number whenever you change this file.
-  "version": "8.78",
+  "version": "8.80",
   "entries": [
     {
       "id": 1,
@@ -634,8 +634,8 @@
       },
       "gl_vendor": "ARM.*",
       "gl_renderer": ".*Mali-4.*",
-      "features": [
-        "disable_multisampled_render_to_texture"
+      "disabled_extensions": [
+        "GL_EXT_multisampled_render_to_texture"
       ]
     },
     {
@@ -1124,8 +1124,8 @@
         }
       },
       "gl_renderer": "Adreno \\(TM\\) 4.*",
-      "features": [
-        "disable_multisampled_render_to_texture"
+      "disabled_extensions": [
+        "GL_EXT_multisampled_render_to_texture"
       ]
     },
     {
@@ -1598,8 +1598,8 @@
       },
       "gl_vendor": "Vivante Corporation",
       "gl_renderer": "Vivante GC1000",
-      "features": [
-        "disable_multisampled_render_to_texture"
+      "disabled_extensions": [
+        "GL_EXT_multisampled_render_to_texture"
       ]
     },
     {
@@ -1756,18 +1756,6 @@
       ]
     },
     {
-      "id": 166,
-      "cr_bugs": [612474],
-      "description": "Crash reports for glDiscardFramebuffer on Adreno 530",
-      "gl_renderer": "Adreno \\(TM\\) 5.*",
-      "os": {
-        "type": "android"
-      },
-      "features": [
-        "disable_discard_framebuffer"
-      ]
-    },
-    {
       "id": 167,
       "cr_bugs": [610516],
       "description": "glEGLImageTargetTexture2DOES crashes on Mali-400",
diff --git a/gpu/config/gpu_driver_bug_workaround_type.h b/gpu/config/gpu_driver_bug_workaround_type.h
index 2c1d08d..b8b3c5d 100644
--- a/gpu/config/gpu_driver_bug_workaround_type.h
+++ b/gpu/config/gpu_driver_bug_workaround_type.h
@@ -51,8 +51,6 @@
          disable_gl_rgb_format)                              \
   GPU_OP(DISABLE_MULTIMONITOR_MULTISAMPLING,                 \
          disable_multimonitor_multisampling)                 \
-  GPU_OP(DISABLE_MULTISAMPLED_RENDER_TO_TEXTURE,             \
-         disable_multisampled_render_to_texture)             \
   GPU_OP(DISABLE_OVERLAY_CA_LAYERS,                          \
          disable_overlay_ca_layers)                          \
   GPU_OP(DISABLE_POST_SUB_BUFFERS_FOR_ONSCREEN_SURFACES,     \
diff --git a/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc b/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc
index f77895c0..9c19bab 100644
--- a/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc
+++ b/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc
@@ -8,7 +8,7 @@
 #include "base/memory/ptr_util.h"
 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
 #include "ui/gfx/buffer_format_util.h"
-#include "ui/gfx/color_space.h"
+#include "ui/gfx/icc_profile.h"
 #include "ui/gfx/mac/io_surface.h"
 
 namespace gpu {
@@ -112,7 +112,11 @@
 
 void GpuMemoryBufferImplIOSurface::SetColorSpaceForScanout(
     const gfx::ColorSpace& color_space) {
-  const std::vector<char>& icc_profile = color_space.GetICCProfile();
+  if (color_space == color_space_)
+    return;
+  color_space_ = color_space;
+  std::vector<char> icc_profile =
+      gfx::ICCProfile::FromColorSpace(color_space).GetData();
   if (icc_profile.size()) {
     base::ScopedCFTypeRef<CFDataRef> cf_data_icc_profile(CFDataCreate(
         nullptr, reinterpret_cast<const UInt8*>(icc_profile.data()),
diff --git a/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.h b/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.h
index abd093e..810cf65 100644
--- a/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.h
+++ b/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.h
@@ -15,6 +15,7 @@
 #include "base/macros.h"
 #include "gpu/gpu_export.h"
 #include "gpu/ipc/client/gpu_memory_buffer_impl.h"
+#include "ui/gfx/color_space.h"
 
 namespace gpu {
 
@@ -56,6 +57,9 @@
 
   base::ScopedCFTypeRef<IOSurfaceRef> io_surface_;
   uint32_t lock_flags_;
+  // Cache the color space, because re-assigning the same value can be
+  // expensive.
+  gfx::ColorSpace color_space_;
 
   DISALLOW_COPY_AND_ASSIGN(GpuMemoryBufferImplIOSurface);
 };
diff --git a/ios/chrome/browser/app_startup_parameters.mm b/ios/chrome/browser/app_startup_parameters.mm
index 8cac49b5..dd43c24 100644
--- a/ios/chrome/browser/app_startup_parameters.mm
+++ b/ios/chrome/browser/app_startup_parameters.mm
@@ -6,6 +6,7 @@
 
 #include "base/logging.h"
 #import "base/mac/scoped_nsobject.h"
+#include "ios/chrome/browser/experimental_flags.h"
 #import "ios/chrome/browser/xcallback_parameters.h"
 #include "url/gurl.h"
 
@@ -19,7 +20,6 @@
 
 @synthesize launchVoiceSearch = _launchVoiceSearch;
 @synthesize launchInIncognito = _launchInIncognito;
-@synthesize launchQRScanner = _launchQRScanner;
 
 - (const GURL&)externalURL {
   return _externalURL;
@@ -54,4 +54,14 @@
                                     _xCallbackParameters.get()];
 }
 
+#pragma mark Property implementation.
+
+- (BOOL)launchQRScanner {
+  return _launchQRScanner && experimental_flags::IsQRCodeReaderEnabled();
+}
+
+- (void)setLaunchQRScanner:(BOOL)launch {
+  _launchQRScanner = launch;
+}
+
 @end
diff --git a/ios/chrome/browser/storekit_launcher.h b/ios/chrome/browser/storekit_launcher.h
index 2e416727..c3365f29 100644
--- a/ios/chrome/browser/storekit_launcher.h
+++ b/ios/chrome/browser/storekit_launcher.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_STOREKIT_LAUNCHER_H_
 #define IOS_CHROME_BROWSER_STOREKIT_LAUNCHER_H_
 
+@class NSString;
+
 // Protocol to be implemented by a class that provides an access to the app
 // store with StoreKit.
 @protocol StoreKitLauncher
diff --git a/ios/chrome/browser/ui/alert_coordinator/alert_coordinator_unittest.mm b/ios/chrome/browser/ui/alert_coordinator/alert_coordinator_unittest.mm
index 93ddae3a..43d73fdb 100644
--- a/ios/chrome/browser/ui/alert_coordinator/alert_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/alert_coordinator/alert_coordinator_unittest.mm
@@ -149,7 +149,8 @@
 }
 
 // Tests the alert coordinator dismissal when the object is destroyed.
-TEST_F(AlertCoordinatorTest, ValidateDismissalOnDestroy) {
+// TODO(crbug.com/631049): This test is failing on Xcode 8 bot.
+TEST_F(AlertCoordinatorTest, DISABLED_ValidateDismissalOnDestroy) {
   // Setup.
   UIViewController* viewController = getViewController();
   AlertCoordinator* alertCoordinator = getAlertCoordinator(viewController);
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index f45749e6..0cb8ab0 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -325,8 +325,6 @@
   // TODO(droger): Remove |_observerBridges| when all CRWWebControllerObservers
   // are converted to WebStateObservers.
   ScopedVector<web::WebControllerObserverBridge> _observerBridges;
-  // |windowId| that is saved when a page changes. Used to detect refreshes.
-  base::scoped_nsobject<NSString> _lastSeenWindowID;
   // YES if a user interaction has been registered at any time once the page has
   // loaded.
   BOOL _userInteractionRegistered;
@@ -1040,7 +1038,6 @@
         [[CRWJSInjectionReceiver alloc] initWithEvaluator:self]);
     _windowIDJSManager.reset([(CRWJSWindowIdManager*)[_jsInjectionReceiver
         instanceOfClass:[CRWJSWindowIdManager class]] retain]);
-    _lastSeenWindowID.reset();
     _webViewProxy.reset(
         [[CRWWebViewProxyImpl alloc] initWithWebController:self]);
     [[_webViewProxy scrollViewProxy] addObserver:self];
@@ -3204,7 +3201,6 @@
 - (void)resetDocumentSpecificState {
   _lastUserInteraction.reset();
   _clickInProgress = NO;
-  _lastSeenWindowID.reset([[_windowIDJSManager windowId] copy]);
 }
 
 - (void)didStartLoadingURL:(const GURL&)url updateHistory:(BOOL)updateHistory {
@@ -5323,10 +5319,13 @@
     [self webPageChanged];
   }
 
-  // Fast back forward navigation does not call |didFinishNavigation:|, so
-  // signal did finish navigation explicitly.
   [self updateSSLStatusForCurrentNavigationItem];
-  [self didFinishNavigation];
+
+  // Fast back forward navigation may not call |didFinishNavigation:|, so
+  // signal did finish navigation explicitly.
+  if (_lastRegisteredRequestURL == _documentURL) {
+    [self didFinishNavigation];
+  }
 }
 
 - (void)webViewTitleDidChange {
diff --git a/ipc/BUILD.gn b/ipc/BUILD.gn
index d9998db..a7621bdd 100644
--- a/ipc/BUILD.gn
+++ b/ipc/BUILD.gn
@@ -55,8 +55,6 @@
     "ipc_endpoint.cc",
     "ipc_endpoint.h",
     "ipc_export.h",
-    "ipc_handle_win.cc",
-    "ipc_handle_win.h",
     "ipc_listener.h",
     "ipc_logging.cc",
     "ipc_logging.h",
diff --git a/ipc/ipc.gypi b/ipc/ipc.gypi
index fbfa62f8..6f4db6c 100644
--- a/ipc/ipc.gypi
+++ b/ipc/ipc.gypi
@@ -57,8 +57,6 @@
           'ipc_endpoint.cc',
           'ipc_endpoint.h',
           'ipc_export.h',
-          'ipc_handle_win.cc',
-          'ipc_handle_win.h',
           'ipc_listener.h',
           'ipc_logging.cc',
           'ipc_logging.h',
diff --git a/ipc/ipc_handle_win.cc b/ipc/ipc_handle_win.cc
deleted file mode 100644
index da3b9bb..0000000
--- a/ipc/ipc_handle_win.cc
+++ /dev/null
@@ -1,15 +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.
-
-#include "ipc/ipc_handle_win.h"
-
-namespace IPC {
-
-HandleForTransit CreateHandleForTransit(HANDLE handle) {
-  HandleForTransit hft;
-  hft.handle = handle;
-  return hft;
-}
-
-}  // namespace IPC
diff --git a/ipc/ipc_handle_win.h b/ipc/ipc_handle_win.h
deleted file mode 100644
index 47779bd..0000000
--- a/ipc/ipc_handle_win.h
+++ /dev/null
@@ -1,22 +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.
-
-#ifndef IPC_HANDLE_WIN_H_
-#define IPC_HANDLE_WIN_H_
-
-#include <windows.h>
-
-namespace IPC {
-
-// This class is a wrapper around HANDLE. It can be passed between Chrome
-// processes via Chrome IPC.
-struct HandleForTransit {
-  HANDLE handle;
-};
-
-HandleForTransit CreateHandleForTransit(HANDLE handle);
-
-}  // namespace IPC
-
-#endif  // IPC_HANDLE_WIN_H_
diff --git a/media/base/key_systems_unittest.cc b/media/base/key_systems_unittest.cc
index 6bf2c6e..b8dac94 100644
--- a/media/base/key_systems_unittest.cc
+++ b/media/base/key_systems_unittest.cc
@@ -179,6 +179,9 @@
   void AddSupportedKeySystems(std::vector<std::unique_ptr<KeySystemProperties>>*
                                   key_systems_properties) override;
   void RecordRapporURL(const std::string& metric, const GURL& url) final;
+  bool IsSupportedVideoConfig(media::VideoCodec codec,
+                              media::VideoCodecProfile profile,
+                              int level) final;
 
   // Helper function to test the case where IsKeySystemsUpdateNeeded() is true
   // after AddSupportedKeySystems() is called.
@@ -229,6 +232,12 @@
   NOTIMPLEMENTED();
 }
 
+bool TestMediaClient::IsSupportedVideoConfig(media::VideoCodec codec,
+                                             media::VideoCodecProfile profile,
+                                             int level) {
+  return true;
+}
+
 void TestMediaClient::SetKeySystemsUpdateNeeded() {
   is_update_needed_ = true;
 }
diff --git a/media/base/mac/videotoolbox_helpers.cc b/media/base/mac/videotoolbox_helpers.cc
index 20a39504..593a185 100644
--- a/media/base/mac/videotoolbox_helpers.cc
+++ b/media/base/mac/videotoolbox_helpers.cc
@@ -35,7 +35,7 @@
   base::ScopedCFTypeRef<CFArrayRef> array(CFArrayCreate(
       kCFAllocatorDefault, reinterpret_cast<const void**>(&numbers[0]),
       numbers.size(), &kCFTypeArrayCallBacks));
-  for (auto& number : numbers) {
+  for (auto* number : numbers) {
     CFRelease(number);
   }
   return array;
@@ -49,7 +49,7 @@
   base::ScopedCFTypeRef<CFArrayRef> array(CFArrayCreate(
       kCFAllocatorDefault, reinterpret_cast<const void**>(numbers.data()),
       numbers.size(), &kCFTypeArrayCallBacks));
-  for (auto& number : numbers)
+  for (auto* number : numbers)
     CFRelease(number);
   return array;
 }
@@ -142,9 +142,9 @@
   OSStatus status;
 
   // Get the sample buffer's block buffer and format description.
-  auto bb = CoreMediaGlue::CMSampleBufferGetDataBuffer(sbuf);
+  auto* bb = CoreMediaGlue::CMSampleBufferGetDataBuffer(sbuf);
   DCHECK(bb);
-  auto fdesc = CoreMediaGlue::CMSampleBufferGetFormatDescription(sbuf);
+  auto* fdesc = CoreMediaGlue::CMSampleBufferGetFormatDescription(sbuf);
   DCHECK(fdesc);
 
   size_t bb_size = CoreMediaGlue::CMBlockBufferGetDataLength(bb);
diff --git a/media/base/media_client.h b/media/base/media_client.h
index a075ebe79..e3bb095 100644
--- a/media/base/media_client.h
+++ b/media/base/media_client.h
@@ -10,6 +10,7 @@
 
 #include "media/base/key_system_properties.h"
 #include "media/base/media_export.h"
+#include "media/base/video_codecs.h"
 #include "url/gurl.h"
 
 namespace media {
@@ -64,6 +65,12 @@
   // Records a domain and registry of a url to a Rappor privacy-preserving
   // metric. See: https://www.chromium.org/developers/design-documents/rappor
   virtual void RecordRapporURL(const std::string& metric, const GURL& url) = 0;
+
+  // Returns true if the given combination of video codec, profile and level is
+  // supported. The |level| value is codec-specific.
+  virtual bool IsSupportedVideoConfig(VideoCodec codec,
+                                      VideoCodecProfile profile,
+                                      int level) = 0;
 };
 
 }  // namespace media
diff --git a/media/base/mime_util_internal.cc b/media/base/mime_util_internal.cc
index 5bd7c7f0..4ab737e 100644
--- a/media/base/mime_util_internal.cc
+++ b/media/base/mime_util_internal.cc
@@ -10,6 +10,7 @@
 #include "base/strings/string_util.h"
 #include "build/build_config.h"
 #include "media/base/media.h"
+#include "media/base/media_client.h"
 #include "media/base/media_switches.h"
 #include "media/base/video_codecs.h"
 
@@ -262,6 +263,24 @@
 
 MimeUtil::~MimeUtil() {}
 
+VideoCodec MimeUtilToVideoCodec(MimeUtil::Codec codec) {
+  switch (codec) {
+    case MimeUtil::H264:
+      return kCodecH264;
+    case MimeUtil::HEVC:
+      return kCodecHEVC;
+    case MimeUtil::VP8:
+      return kCodecVP8;
+    case MimeUtil::VP9:
+      return kCodecVP9;
+    case MimeUtil::THEORA:
+      return kCodecTheora;
+    default:
+      break;
+  }
+  return kUnknownVideoCodec;
+}
+
 SupportsType MimeUtil::AreSupportedCodecs(
     const CodecSet& supported_codecs,
     const std::vector<std::string>& codecs,
@@ -274,8 +293,18 @@
   for (size_t i = 0; i < codecs.size(); ++i) {
     bool is_ambiguous = true;
     Codec codec = INVALID_CODEC;
+    VideoCodecProfile video_profile = VIDEO_CODEC_PROFILE_UNKNOWN;
+    uint8_t video_level = 0;
     if (!StringToCodec(mime_type_lower_case, codecs[i], &codec, &is_ambiguous,
-                       is_encrypted)) {
+                       &video_profile, &video_level, is_encrypted)) {
+      return IsNotSupported;
+    }
+
+    VideoCodec video_codec = MimeUtilToVideoCodec(codec);
+
+    if (GetMediaClient() && video_codec != kUnknownVideoCodec &&
+        !GetMediaClient()->IsSupportedVideoConfig(video_codec, video_profile,
+                                                  video_level)) {
       return IsNotSupported;
     }
 
@@ -639,7 +668,14 @@
                              const std::string& codec_id,
                              Codec* codec,
                              bool* is_ambiguous,
+                             VideoCodecProfile* out_profile,
+                             uint8_t* out_level,
                              bool is_encrypted) const {
+  DCHECK(out_profile);
+  DCHECK(out_level);
+  *out_profile = VIDEO_CODEC_PROFILE_UNKNOWN;
+  *out_level = 0;
+
   StringToCodecMappings::const_iterator itr =
       string_to_codec_map_.find(codec_id);
   if (itr != string_to_codec_map_.end()) {
@@ -651,12 +687,9 @@
 // If |codec_id| is not in |string_to_codec_map_|, then we assume that it is
 // either H.264 or HEVC/H.265 codec ID because currently those are the only
 // ones that are not added to the |string_to_codec_map_| and require parsing.
-  VideoCodecProfile profile = VIDEO_CODEC_PROFILE_UNKNOWN;
-  uint8_t level_idc = 0;
-
-  if (ParseAVCCodecId(codec_id, &profile, &level_idc)) {
+  if (ParseAVCCodecId(codec_id, out_profile, out_level)) {
     *codec = MimeUtil::H264;
-    switch (profile) {
+    switch (*out_profile) {
 // HIGH10PROFILE is supported through fallback to the ffmpeg decoder
 // which is not available on Android, or if FFMPEG is not used.
 #if !defined(MEDIA_DISABLE_FFMPEG) && !defined(OS_ANDROID)
@@ -673,7 +706,7 @@
       case H264PROFILE_BASELINE:
       case H264PROFILE_MAIN:
       case H264PROFILE_HIGH:
-        *is_ambiguous = !IsValidH264Level(level_idc);
+        *is_ambiguous = !IsValidH264Level(*out_level);
         break;
       default:
         *is_ambiguous = true;
@@ -681,9 +714,10 @@
     return true;
   }
 
-  if (ParseVp9CodecID(mime_type_lower_case, codec_id, &profile)) {
+  if (ParseVp9CodecID(mime_type_lower_case, codec_id, out_profile)) {
     *codec = MimeUtil::VP9;
-    switch (profile) {
+    *out_level = 1;
+    switch (*out_profile) {
       case VP9PROFILE_PROFILE0:
         // Profile 0 should always be supported if VP9 is supported.
         *is_ambiguous = false;
@@ -698,13 +732,9 @@
   }
 
 #if BUILDFLAG(ENABLE_HEVC_DEMUXING)
-  if (ParseHEVCCodecId(codec_id, &profile, &level_idc)) {
-    // TODO(servolk): Set |is_ambiguous| to true for now to make CanPlayType
-    // return 'maybe' for HEVC codec ids, instead of probably. This needs to be
-    // changed to false after adding platform-level HEVC profile and level
-    // checks, see crbug.com/601949.
-    *is_ambiguous = true;
+  if (ParseHEVCCodecId(codec_id, out_profile, out_level)) {
     *codec = MimeUtil::HEVC;
+    *is_ambiguous = false;
     return true;
   }
 #endif
diff --git a/media/base/mime_util_internal.h b/media/base/mime_util_internal.h
index 6d180c8..0bd1a3d 100644
--- a/media/base/mime_util_internal.h
+++ b/media/base/mime_util_internal.h
@@ -13,6 +13,7 @@
 #include "base/macros.h"
 #include "media/base/media_export.h"
 #include "media/base/mime_util.h"
+#include "media/base/video_codecs.h"
 
 namespace media {
 namespace internal {
@@ -118,11 +119,15 @@
   // |is_ambiguous| is true if |codec_id| did not have enough information to
   // unambiguously determine the proper Codec enum value. If |is_ambiguous|
   // is true |codec| contains the best guess for the intended Codec enum value.
+  // |profile| and |level| indicate video codec profile and level (unused for
+  // audio codecs).
   // |is_encrypted| means the codec will be used with encrypted blocks.
   bool StringToCodec(const std::string& mime_type_lower_case,
                      const std::string& codec_id,
                      Codec* codec,
                      bool* is_ambiguous,
+                     VideoCodecProfile* out_profile,
+                     uint8_t* out_level,
                      bool is_encrypted) const;
 
   // Returns true if |codec| is supported when contained in
diff --git a/media/cast/sender/audio_encoder.cc b/media/cast/sender/audio_encoder.cc
index 6d93d17..37410a68 100644
--- a/media/cast/sender/audio_encoder.cc
+++ b/media/cast/sender/audio_encoder.cc
@@ -542,7 +542,7 @@
         source_offset * sizeof(float) % AudioBus::kChannelAlignment == 0) {
       DCHECK_EQ(buffer_fill_offset, 0);
       for (int ch = 0; ch < audio_bus->channels(); ++ch) {
-        auto samples = const_cast<float*>(audio_bus->channel(ch));
+        auto* samples = const_cast<float*>(audio_bus->channel(ch));
         input_bus_->SetChannelData(ch, samples + source_offset);
       }
       return;
@@ -605,9 +605,9 @@
       AudioStreamPacketDescription** out_packet_desc,
       void* in_encoder) {
     DCHECK(in_encoder);
-    auto encoder = reinterpret_cast<AppleAacImpl*>(in_encoder);
-    auto input_buffer = encoder->input_buffer_.get();
-    auto input_bus = encoder->input_bus_.get();
+    auto* encoder = reinterpret_cast<AppleAacImpl*>(in_encoder);
+    auto* input_buffer = encoder->input_buffer_.get();
+    auto* input_bus = encoder->input_bus_.get();
 
     DCHECK_EQ(static_cast<int>(*io_num_packets), kAccessUnitSamples);
     DCHECK_EQ(io_data->mNumberBuffers,
@@ -644,8 +644,8 @@
                                     UInt32* out_size) {
     DCHECK(in_encoder);
     DCHECK(in_buffer);
-    auto encoder = reinterpret_cast<const AppleAacImpl*>(in_encoder);
-    auto buffer = reinterpret_cast<const std::string::value_type*>(in_buffer);
+    auto* encoder = reinterpret_cast<const AppleAacImpl*>(in_encoder);
+    auto* buffer = reinterpret_cast<const std::string::value_type*>(in_buffer);
 
     std::string* const output_buffer = encoder->output_buffer_;
     DCHECK(output_buffer);
diff --git a/media/cast/sender/h264_vt_encoder.cc b/media/cast/sender/h264_vt_encoder.cc
index c11f6db..d3ce3aa 100644
--- a/media/cast/sender/h264_vt_encoder.cc
+++ b/media/cast/sender/h264_vt_encoder.cc
@@ -183,7 +183,7 @@
             weak_factory_.GetWeakPtr(), cast_environment_));
 
     // Register for power state changes.
-    auto power_monitor = base::PowerMonitor::Get();
+    auto* power_monitor = base::PowerMonitor::Get();
     if (power_monitor) {
       power_monitor->AddObserver(this);
       VLOG(1) << "Registered for power state changes.";
@@ -200,7 +200,7 @@
   // If video_frame_factory_ is not null, the encoder registered for power state
   // changes in the ctor and it must now unregister.
   if (video_frame_factory_) {
-    auto power_monitor = base::PowerMonitor::Get();
+    auto* power_monitor = base::PowerMonitor::Get();
     if (power_monitor)
       power_monitor->RemoveObserver(this);
   }
@@ -253,7 +253,7 @@
       video_toolbox::DictionaryWithKeysAndValues(
           buffer_attributes_keys, buffer_attributes_values,
           arraysize(buffer_attributes_keys));
-  for (auto& v : buffer_attributes_values)
+  for (auto* v : buffer_attributes_values)
     CFRelease(v);
 
   // Create the compression session.
@@ -515,7 +515,7 @@
                                                   OSStatus status,
                                                   VTEncodeInfoFlags info,
                                                   CMSampleBufferRef sbuf) {
-  auto encoder = reinterpret_cast<H264VideoToolboxEncoder*>(encoder_opaque);
+  auto* encoder = reinterpret_cast<H264VideoToolboxEncoder*>(encoder_opaque);
   const std::unique_ptr<InProgressFrameEncode> request(
       reinterpret_cast<InProgressFrameEncode*>(request_opaque));
   bool keyframe = false;
@@ -529,7 +529,7 @@
   } else if ((info & VideoToolboxGlue::kVTEncodeInfo_FrameDropped)) {
     DVLOG(2) << " frame dropped";
   } else {
-    auto sample_attachments =
+    auto* sample_attachments =
         static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(
             CoreMediaGlue::CMSampleBufferGetSampleAttachmentsArray(sbuf, true),
             0));
diff --git a/media/cast/sender/h264_vt_encoder_unittest.cc b/media/cast/sender/h264_vt_encoder_unittest.cc
index efe4ade..90ee21f 100644
--- a/media/cast/sender/h264_vt_encoder_unittest.cc
+++ b/media/cast/sender/h264_vt_encoder_unittest.cc
@@ -177,10 +177,10 @@
       video_frame_factory->MaybeCreateFrame(
           gfx::Size(kVideoWidth, kVideoHeight), base::TimeDelta());
   ASSERT_TRUE(video_frame.get());
-  auto cv_pixel_buffer = video_frame->cv_pixel_buffer();
+  auto* cv_pixel_buffer = video_frame->cv_pixel_buffer();
   ASSERT_TRUE(cv_pixel_buffer);
   CVPixelBufferLockBaseAddress(cv_pixel_buffer, 0);
-  auto ptr = CVPixelBufferGetBaseAddressOfPlane(cv_pixel_buffer, 0);
+  auto* ptr = CVPixelBufferGetBaseAddressOfPlane(cv_pixel_buffer, 0);
   ASSERT_TRUE(ptr);
   memset(ptr, 0xfe, CVPixelBufferGetBytesPerRowOfPlane(cv_pixel_buffer, 0) *
                         CVPixelBufferGetHeightOfPlane(cv_pixel_buffer, 0));
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn
index e8c2644..2017e23 100644
--- a/media/gpu/BUILD.gn
+++ b/media/gpu/BUILD.gn
@@ -142,8 +142,8 @@
   # Only local test code, GPU-related IPC code in the media layer, and
   # media-related content code should access //media/gpu.
   visibility = [
+    "//chrome/gpu:*",
     "//content/gpu:*",
-    "//content/public/gpu:*",
     "//content/renderer:*",
     "//media/gpu/ipc/*",
     ":*",
diff --git a/media/gpu/dxva_video_decode_accelerator_win.cc b/media/gpu/dxva_video_decode_accelerator_win.cc
index 8f3f257..fc58a29 100644
--- a/media/gpu/dxva_video_decode_accelerator_win.cc
+++ b/media/gpu/dxva_video_decode_accelerator_win.cc
@@ -1437,7 +1437,7 @@
     DVLOG(1) << "Failed to set Low latency mode on decoder. Error: " << hr;
   }
 
-  auto gl_context = get_gl_context_cb_.Run();
+  auto* gl_context = get_gl_context_cb_.Run();
   RETURN_ON_FAILURE(gl_context, "Couldn't get GL context", false);
 
   // The decoder should use DX11 iff
diff --git a/media/gpu/gpu_video_decode_accelerator_factory_impl.h b/media/gpu/gpu_video_decode_accelerator_factory_impl.h
index faa01d3..998e888 100644
--- a/media/gpu/gpu_video_decode_accelerator_factory_impl.h
+++ b/media/gpu/gpu_video_decode_accelerator_factory_impl.h
@@ -30,9 +30,6 @@
 
 namespace media {
 
-// TODO(posciak): this class should be an implementation of
-// content::GpuVideoDecodeAcceleratorFactory, however that can only be achieved
-// once this is moved out of content/common, see crbug.com/597150 and related.
 class MEDIA_GPU_EXPORT GpuVideoDecodeAcceleratorFactoryImpl {
  public:
   ~GpuVideoDecodeAcceleratorFactoryImpl();
diff --git a/media/gpu/vt_video_encode_accelerator_mac.cc b/media/gpu/vt_video_encode_accelerator_mac.cc
index 32d1b8ab..3842948 100644
--- a/media/gpu/vt_video_encode_accelerator_mac.cc
+++ b/media/gpu/vt_video_encode_accelerator_mac.cc
@@ -382,7 +382,7 @@
   // one that calls VTCompressionSessionEncodeFrame.
   DVLOG(3) << __FUNCTION__;
 
-  auto encoder = reinterpret_cast<VTVideoEncodeAccelerator*>(encoder_opaque);
+  auto* encoder = reinterpret_cast<VTVideoEncodeAccelerator*>(encoder_opaque);
   DCHECK(encoder);
 
   // InProgressFrameEncode holds timestamp information of the encoded frame.
@@ -441,10 +441,11 @@
     return;
   }
 
-  auto sample_attachments = static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(
-      CoreMediaGlue::CMSampleBufferGetSampleAttachmentsArray(
-          encode_output->sample_buffer.get(), true),
-      0));
+  auto* sample_attachments =
+      static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(
+          CoreMediaGlue::CMSampleBufferGetSampleAttachmentsArray(
+              encode_output->sample_buffer.get(), true),
+          0));
   const bool keyframe = !CFDictionaryContainsKey(
       sample_attachments, CoreMediaGlue::kCMSampleAttachmentKey_NotSync());
 
@@ -481,7 +482,7 @@
   const base::ScopedCFTypeRef<CFDictionaryRef> attributes =
       video_toolbox::DictionaryWithKeysAndValues(
           attributes_keys, attributes_values, arraysize(attributes_keys));
-  for (auto& v : attributes_values)
+  for (auto* v : attributes_values)
     CFRelease(v);
 
   bool session_rv =
diff --git a/media/midi/midi_manager_android.cc b/media/midi/midi_manager_android.cc
index 2bd4d80..617daeb 100644
--- a/media/midi/midi_manager_android.cc
+++ b/media/midi/midi_manager_android.cc
@@ -106,14 +106,14 @@
 void MidiManagerAndroid::OnDetached(JNIEnv* env,
                                     const JavaParamRef<jobject>& caller,
                                     const JavaParamRef<jobject>& raw_device) {
-  for (const auto& device : devices_) {
+  for (auto* device : devices_) {
     if (device->HasRawDevice(env, raw_device)) {
-      for (const auto& port : device->input_ports()) {
+      for (auto* port : device->input_ports()) {
         DCHECK(input_port_to_index_.end() != input_port_to_index_.find(port));
         size_t index = input_port_to_index_[port];
         SetInputPortState(index, MIDI_PORT_DISCONNECTED);
       }
-      for (const auto& port : device->output_ports()) {
+      for (auto* port : device->output_ports()) {
         DCHECK(output_port_to_index_.end() != output_port_to_index_.find(port));
         size_t index = output_port_to_index_[port];
         SetOutputPortState(index, MIDI_PORT_DISCONNECTED);
@@ -123,7 +123,7 @@
 }
 
 void MidiManagerAndroid::AddDevice(std::unique_ptr<MidiDeviceAndroid> device) {
-  for (auto& port : device->input_ports()) {
+  for (auto* port : device->input_ports()) {
     // We implicitly open input ports here, because there are no signal
     // from the renderer when to open.
     // TODO(yhirano): Implement open operation in Blink.
@@ -142,7 +142,7 @@
                               device->GetProductName(),
                               device->GetDeviceVersion(), state));
   }
-  for (const auto& port : device->output_ports()) {
+  for (auto* port : device->output_ports()) {
     const size_t index = all_output_ports_.size();
     all_output_ports_.push_back(port);
 
diff --git a/media/midi/midi_manager_win.cc b/media/midi/midi_manager_win.cc
index 610aa4f..ebf41398 100644
--- a/media/midi/midi_manager_win.cc
+++ b/media/midi/midi_manager_win.cc
@@ -445,7 +445,7 @@
           input_devices.push_back(it.first);
       }
       {
-        for (const auto handle : input_devices) {
+        for (auto* handle : input_devices) {
           MMRESULT result = midiInClose(handle);
           if (result == MIDIERR_STILLPLAYING) {
             result = midiInReset(handle);
@@ -466,7 +466,7 @@
           output_devices.push_back(it.first);
       }
       {
-        for (const auto handle : output_devices) {
+        for (auto* handle : output_devices) {
           MMRESULT result = midiOutClose(handle);
           if (result == MIDIERR_STILLPLAYING) {
             result = midiOutReset(handle);
diff --git a/net/base/url_util.cc b/net/base/url_util.cc
index 879c746..8d47bd3 100644
--- a/net/base/url_util.cc
+++ b/net/base/url_util.cc
@@ -74,8 +74,7 @@
       replaced = true;
       key_value_pair = (param_name + "=" + param_value);
     } else {
-      key_value_pair.assign(input.data(),
-                            key_range.begin,
+      key_value_pair.assign(input, key_range.begin,
                             value_range.end() - key_range.begin);
     }
     if (!output.empty())
diff --git a/net/cert/ct_known_logs.cc b/net/cert/ct_known_logs.cc
index da086c7..a6598897 100644
--- a/net/cert/ct_known_logs.cc
+++ b/net/cert/ct_known_logs.cc
@@ -37,7 +37,8 @@
   // Add all qualified logs.
   for (const auto& log : kCTLogList) {
     base::StringPiece key(log.log_key, log.log_key_length);
-    verifiers.push_back(CTLogVerifier::Create(key, log.log_name, log.log_url));
+    verifiers.push_back(CTLogVerifier::Create(key, log.log_name, log.log_url,
+                                              log.log_dns_domain));
     // Make sure no null logs enter verifiers. Parsing of all known logs should
     // succeed.
     CHECK(verifiers.back().get());
@@ -48,7 +49,8 @@
   for (const auto& disqualified_log : kDisqualifiedCTLogList) {
     const CTLogInfo& log = disqualified_log.log_info;
     base::StringPiece key(log.log_key, log.log_key_length);
-    verifiers.push_back(CTLogVerifier::Create(key, log.log_name, log.log_url));
+    verifiers.push_back(CTLogVerifier::Create(key, log.log_name, log.log_url,
+                                              log.log_dns_domain));
     // Make sure no null logs enter verifiers. Parsing of all known logs should
     // succeed.
     CHECK(verifiers.back().get());
diff --git a/net/cert/ct_known_logs_static-inc.h b/net/cert/ct_known_logs_static-inc.h
index 783db76..a45de2f 100644
--- a/net/cert/ct_known_logs_static-inc.h
+++ b/net/cert/ct_known_logs_static-inc.h
@@ -10,12 +10,19 @@
   // The user-friendly log name.
   // Note: This will not be translated.
   const char* const log_name;
-  // The API endpoint for the log.
+  // The HTTPS API endpoint for the log.
   // Note: Trailing slashes should be included.
   const char* const log_url;
+  // The DNS API endpoint for the log.
+  // This is used as the parent domain for all queries about the log.
+  // If empty, CT DNS queries are not supported for the log. This will prevent
+  // retrieval of inclusion proofs over DNS for SCTs from the log.
+  // https://github.com/google/certificate-transparency-rfcs/blob/master/dns/draft-ct-over-dns.md.
+  const char* const log_dns_domain;
 };
 
 // The set of all presently-qualifying CT logs.
+// Google provides DNS frontends for all of the logs.
 const CTLogInfo kCTLogList[] = {
     {"\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86"
      "\x48\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x7d\xa8\x4b\x12\x29\x80\xa3"
@@ -23,35 +30,40 @@
      "\x0c\xe8\x41\x46\xe8\x81\x01\x1b\x15\xe1\x4b\xf1\x1b\x62\xdd\x36\x0a"
      "\x08\x18\xba\xed\x0b\x35\x84\xd0\x9e\x40\x3c\x2d\x9e\x9b\x82\x65\xbd"
      "\x1f\x04\x10\x41\x4c\xa0",
-     91, "Google 'Pilot' log", "https://ct.googleapis.com/pilot/"},
+     91, "Google 'Pilot' log", "https://ct.googleapis.com/pilot/",
+     "pilot.ct.googleapis.com"},
     {"\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86"
      "\x48\xce\x3d\x03\x01\x07\x03\x42\x00\x04\xd7\xf4\xcc\x69\xb2\xe4\x0e"
      "\x90\xa3\x8a\xea\x5a\x70\x09\x4f\xef\x13\x62\xd0\x8d\x49\x60\xff\x1b"
      "\x40\x50\x07\x0c\x6d\x71\x86\xda\x25\x49\x8d\x65\xe1\x08\x0d\x47\x34"
      "\x6b\xbd\x27\xbc\x96\x21\x3e\x34\xf5\x87\x76\x31\xb1\x7f\x1d\xc9\x85"
      "\x3b\x0d\xf7\x1f\x3f\xe9",
-     91, "Google 'Aviator' log", "https://ct.googleapis.com/aviator/"},
+     91, "Google 'Aviator' log", "https://ct.googleapis.com/aviator/",
+     "aviator.ct.googleapis.com"},
     {"\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86"
      "\x48\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x02\x46\xc5\xbe\x1b\xbb\x82"
      "\x40\x16\xe8\xc1\xd2\xac\x19\x69\x13\x59\xf8\xf8\x70\x85\x46\x40\xb9"
      "\x38\xb0\x23\x82\xa8\x64\x4c\x7f\xbf\xbb\x34\x9f\x4a\x5f\x28\x8a\xcf"
      "\x19\xc4\x00\xf6\x36\x06\x93\x65\xed\x4c\xf5\xa9\x21\x62\x5a\xd8\x91"
      "\xeb\x38\x24\x40\xac\xe8",
-     91, "DigiCert Log Server", "https://ct1.digicert-ct.com/log/"},
+     91, "DigiCert Log Server", "https://ct1.digicert-ct.com/log/",
+     "digicert.ct.googleapis.com"},
     {"\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86"
      "\x48\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x20\x5b\x18\xc8\x3c\xc1\x8b"
      "\xb3\x31\x08\x00\xbf\xa0\x90\x57\x2b\xb7\x47\x8c\x6f\xb5\x68\xb0\x8e"
      "\x90\x78\xe9\xa0\x73\xea\x4f\x28\x21\x2e\x9c\xc0\xf4\x16\x1b\xaa\xf9"
      "\xd5\xd7\xa9\x80\xc3\x4e\x2f\x52\x3c\x98\x01\x25\x46\x24\x25\x28\x23"
      "\x77\x2d\x05\xc2\x40\x7a",
-     91, "Google 'Rocketeer' log", "https://ct.googleapis.com/rocketeer/"},
+     91, "Google 'Rocketeer' log", "https://ct.googleapis.com/rocketeer/",
+     "rocketeer.ct.googleapis.com"},
     {"\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86"
      "\x48\xce\x3d\x03\x01\x07\x03\x42\x00\x04\x96\xea\xac\x1c\x46\x0c\x1b"
      "\x55\xdc\x0d\xfc\xb5\x94\x27\x46\x57\x42\x70\x3a\x69\x18\xe2\xbf\x3b"
      "\xc4\xdb\xab\xa0\xf4\xb6\x6c\xc0\x53\x3f\x4d\x42\x10\x33\xf0\x58\x97"
      "\x8f\x6b\xbe\x72\xf4\x2a\xec\x1c\x42\xaa\x03\x2f\x1a\x7e\x28\x35\x76"
      "\x99\x08\x3d\x21\x14\x86",
-     91, "Symantec log", "https://ct.ws.symantec.com/"},
+     91, "Symantec log", "https://ct.ws.symantec.com/",
+     "symantec.ct.googleapis.com"},
     {"\x30\x82\x01\x22\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01"
      "\x05\x00\x03\x82\x01\x0f\x00\x30\x82\x01\x0a\x02\x82\x01\x01\x00\xa2"
      "\x5a\x48\x1f\x17\x52\x95\x35\xcb\xa3\x5b\x3a\x1f\x53\x82\x76\x94\xa3"
@@ -70,14 +82,16 @@
      "\x05\xbf\x5f\xae\x94\x97\xdb\x5f\x64\xd4\xee\x16\x8b\xa3\x84\x6c\x71"
      "\x2b\xf1\xab\x7f\x5d\x0d\x32\xee\x04\xe2\x90\xec\x41\x9f\xfb\x39\xc1"
      "\x02\x03\x01\x00\x01",
-     294, "Venafi log", "https://ctlog.api.venafi.com/"},
+     294, "Venafi log", "https://ctlog.api.venafi.com/",
+     "venafi.ct.googleapis.com"},
     {"\x30\x59\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86"
      "\x48\xce\x3d\x03\x01\x07\x03\x42\x00\x04\xea\x95\x9e\x02\xff\xee\xf1"
      "\x33\x6d\x4b\x87\xbc\xcd\xfd\x19\x17\x62\xff\x94\xd3\xd0\x59\x07\x3f"
      "\x02\x2d\x1c\x90\xfe\xc8\x47\x30\x3b\xf1\xdd\x0d\xb8\x11\x0c\x5d\x1d"
      "\x86\xdd\xab\xd3\x2b\x46\x66\xfb\x6e\x65\xb7\x3b\xfd\x59\x68\xac\xdf"
      "\xa6\xf8\xce\xd2\x18\x4d",
-     91, "Symantec 'Vega' log", "https://vega.ws.symantec.com/"},
+     91, "Symantec 'Vega' log", "https://vega.ws.symantec.com/",
+     "symantec-vega.ct.googleapis.com"},
     {"\x30\x82\x01\x22\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01"
      "\x05\x00\x03\x82\x01\x0f\x00\x30\x82\x01\x0a\x02\x82\x01\x01\x00\xbf"
      "\xb5\x08\x61\x9a\x29\x32\x04\xd3\x25\x63\xe9\xd8\x85\xe1\x86\xe0\x1f"
@@ -96,7 +110,8 @@
      "\x6f\xdf\x3c\x2c\x43\x57\xa1\x47\x0c\x91\x04\xf4\x75\x4d\xda\x89\x81"
      "\xa4\x14\x06\x34\xb9\x98\xc3\xda\xf1\xfd\xed\x33\x36\xd3\x16\x2d\x35"
      "\x02\x03\x01\x00\x01",
-     294, "CNNIC CT log", "https://ctserver.cnnic.cn/"}};
+     294, "CNNIC CT log", "https://ctserver.cnnic.cn/",
+     "cnnic.ct.googleapis.com"}};
 
 // Information related to previously-qualified, but now disqualified, CT
 // logs.
@@ -123,7 +138,8 @@
          "\x11\xc4\x11\x17\xab\x5c\xcf\x0f\x74\xac\xb5\x97\x90\x93\x00\x5b\xb8"
          "\xeb\xf7\x27\x3d\xd9\xb2\x0a\x81\x5f\x2f\x0d\x75\x38\x94\x37\x99\x1e"
          "\xf6\x07\x76\xe0\xee\xbe",
-         91, "Izenpe log", "https://ct.izenpe.com/"},
+         91, "Izenpe log", "https://ct.izenpe.com/",
+         "izenpe1.ct.googleapis.com"},
         // 2016-05-30 00:00:00 UTC
         base::TimeDelta::FromSeconds(1464566400),
     },
@@ -136,7 +152,8 @@
          "\x8f\x01\x42\x0a\x7c\x98\x26\x27\xc1\xb5\xdd\x92\x93\xb0\xae\xf8\x9b"
          "\x3d\x0c\xd8\x4c\x4e\x1d\xf9\x15\xfb\x47\x68\x7b\xba\x66\xb7\x25\x9c"
          "\xd0\x4a\xc2\x66\xdb\x48",
-         91, "Certly.IO log", "https://log.certly.io/"},
+         91, "Certly.IO log", "https://log.certly.io/",
+         "certly.ct.googleapis.com"},
         // 2016-04-15 00:00:00 UTC
         base::TimeDelta::FromSeconds(1460678400),
     },
diff --git a/net/cert/ct_log_verifier.cc b/net/cert/ct_log_verifier.cc
index 45adabe..0626baa9 100644
--- a/net/cert/ct_log_verifier.cc
+++ b/net/cert/ct_log_verifier.cc
@@ -58,20 +58,24 @@
 scoped_refptr<const CTLogVerifier> CTLogVerifier::Create(
     const base::StringPiece& public_key,
     const base::StringPiece& description,
-    const base::StringPiece& url) {
+    const base::StringPiece& url,
+    const base::StringPiece& dns_domain) {
   GURL log_url(url.as_string());
   if (!log_url.is_valid())
     return nullptr;
-  scoped_refptr<CTLogVerifier> result(new CTLogVerifier(description, log_url));
+  scoped_refptr<CTLogVerifier> result(
+      new CTLogVerifier(description, log_url, dns_domain));
   if (!result->Init(public_key))
     return nullptr;
   return result;
 }
 
 CTLogVerifier::CTLogVerifier(const base::StringPiece& description,
-                             const GURL& url)
+                             const GURL& url,
+                             const base::StringPiece& dns_domain)
     : description_(description.as_string()),
       url_(url),
+      dns_domain_(dns_domain.as_string()),
       hash_algorithm_(ct::DigitallySigned::HASH_ALGO_NONE),
       signature_algorithm_(ct::DigitallySigned::SIG_ALGO_ANONYMOUS),
       public_key_(NULL) {
diff --git a/net/cert/ct_log_verifier.h b/net/cert/ct_log_verifier.h
index fa5ba24..e9ba307c 100644
--- a/net/cert/ct_log_verifier.h
+++ b/net/cert/ct_log_verifier.h
@@ -40,10 +40,13 @@
   // using |public_key|, which is a DER-encoded SubjectPublicKeyInfo.
   // If |public_key| refers to an unsupported public key, returns NULL.
   // |description| is a textual description of the log.
+  // |url| is the URL of the log's HTTPS API endpoint.
+  // |dns_domain| is the DNS name of the log's DNS API endpoint, if one exists.
   static scoped_refptr<const CTLogVerifier> Create(
       const base::StringPiece& public_key,
       const base::StringPiece& description,
-      const base::StringPiece& url);
+      const base::StringPiece& url,
+      const base::StringPiece& dns_domain);
 
   // Returns the log's key ID (RFC6962, Section 3.2)
   const std::string& key_id() const { return key_id_; }
@@ -52,6 +55,11 @@
   // Returns the log's URL
   const GURL& url() const { return url_; }
 
+  // Returns the log's DNS domain for CT over DNS queries, as described in
+  // https://github.com/google/certificate-transparency-rfcs/blob/master/dns/draft-ct-over-dns.md.
+  // This will be empty if the log has no DNS API endpoint.
+  const std::string& dns_domain() const { return dns_domain_; }
+
   // Verifies that |sct| is valid for |entry| and was signed by this log.
   bool Verify(const ct::LogEntry& entry,
               const ct::SignedCertificateTimestamp& sct) const;
@@ -72,7 +80,9 @@
   FRIEND_TEST_ALL_PREFIXES(CTLogVerifierTest, VerifySignature);
   friend class base::RefCountedThreadSafe<CTLogVerifier>;
 
-  CTLogVerifier(const base::StringPiece& description, const GURL& url);
+  CTLogVerifier(const base::StringPiece& description,
+                const GURL& url,
+                const base::StringPiece& dns_domain);
   ~CTLogVerifier();
 
   // Performs crypto-library specific initialization.
@@ -91,6 +101,7 @@
   std::string key_id_;
   std::string description_;
   GURL url_;
+  std::string dns_domain_;
   ct::DigitallySigned::HashAlgorithm hash_algorithm_;
   ct::DigitallySigned::SignatureAlgorithm signature_algorithm_;
 
diff --git a/net/cert/ct_log_verifier_unittest.cc b/net/cert/ct_log_verifier_unittest.cc
index 9221f06..754d3e39 100644
--- a/net/cert/ct_log_verifier_unittest.cc
+++ b/net/cert/ct_log_verifier_unittest.cc
@@ -140,10 +140,11 @@
 
   void SetUp() override {
     log_ = CTLogVerifier::Create(ct::GetTestPublicKey(), "testlog",
-                                 "https://ct.example.com");
+                                 "https://ct.example.com", "ct.example.com");
 
     ASSERT_TRUE(log_);
-    ASSERT_EQ(log_->key_id(), ct::GetTestPublicKeyId());
+    ASSERT_EQ(ct::GetTestPublicKeyId(), log_->key_id());
+    ASSERT_EQ("ct.example.com", log_->dns_domain());
   }
 
   // Given a consistency proof between two snapshots of the tree, asserts that
@@ -317,8 +318,8 @@
   std::string key = ct::GetTestPublicKey();
   key += "extra";
 
-  scoped_refptr<const CTLogVerifier> log =
-      CTLogVerifier::Create(key, "testlog", "https://ct.example.com");
+  scoped_refptr<const CTLogVerifier> log = CTLogVerifier::Create(
+      key, "testlog", "https://ct.example.com", "ct.example.com");
   EXPECT_FALSE(log);
 }
 
diff --git a/net/cert/ct_objects_extractor_unittest.cc b/net/cert/ct_objects_extractor_unittest.cc
index e8718bd..389fd66 100644
--- a/net/cert/ct_objects_extractor_unittest.cc
+++ b/net/cert/ct_objects_extractor_unittest.cc
@@ -32,7 +32,7 @@
                                                   der_test_cert.length());
 
     log_ = CTLogVerifier::Create(ct::GetTestPublicKey(), "testlog",
-                                 "https://ct.example.com");
+                                 "https://ct.example.com", "");
     ASSERT_TRUE(log_);
   }
 
diff --git a/net/cert/internal/path_builder_unittest.cc b/net/cert/internal/path_builder_unittest.cc
index dfdf25b..24d58e1 100644
--- a/net/cert/internal/path_builder_unittest.cc
+++ b/net/cert/internal/path_builder_unittest.cc
@@ -586,8 +586,6 @@
 TEST_F(PathBuilderKeyRolloverTest, TestMultipleRootMatchesOnlyOneWorks) {
   // Both newroot and oldroot are trusted.
   TrustStore trust_store;
-  // Note: The test assumes newroot will be tried before oldroot.
-  // Currently this depends on the order the roots are added.
   trust_store.AddTrustedCertificate(newroot_);
   trust_store.AddTrustedCertificate(oldroot_);
 
@@ -604,24 +602,31 @@
   EXPECT_EQ(CompletionStatus::SYNC, RunPathBuilder(&path_builder));
 
   EXPECT_EQ(OK, result.error());
-  ASSERT_EQ(2U, result.paths.size());
+  // There may be one or two paths attempted depending if the path builder tried
+  // using newroot first.
+  // TODO(mattm): Once TrustStore is an interface, this could be fixed with a
+  // mock version of TrustStore that returns roots in a deterministic order.
+  ASSERT_LE(1U, result.paths.size());
+  ASSERT_GE(2U, result.paths.size());
 
-  // Path builder will first attempt: target <- oldintermediate <- newroot
-  // but it will fail since oldintermediate is signed by oldroot.
-  EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.paths[0]->error);
-  ASSERT_EQ(3U, result.paths[0]->path.size());
-  EXPECT_EQ(target_, result.paths[0]->path[0]);
-  EXPECT_EQ(oldintermediate_, result.paths[0]->path[1]);
-  EXPECT_EQ(newroot_, result.paths[0]->path[2]);
+  if (result.paths.size() == 2) {
+    // Path builder may first attempt: target <- oldintermediate <- newroot
+    // but it will fail since oldintermediate is signed by oldroot.
+    EXPECT_EQ(ERR_CERT_AUTHORITY_INVALID, result.paths[0]->error);
+    ASSERT_EQ(3U, result.paths[0]->path.size());
+    EXPECT_EQ(target_, result.paths[0]->path[0]);
+    EXPECT_EQ(oldintermediate_, result.paths[0]->path[1]);
+    EXPECT_EQ(newroot_, result.paths[0]->path[2]);
+  }
 
   // Path builder will next attempt:
   // target <- old intermediate <- oldroot
   // which should succeed.
-  EXPECT_EQ(OK, result.paths[1]->error);
-  ASSERT_EQ(3U, result.paths[1]->path.size());
-  EXPECT_EQ(target_, result.paths[1]->path[0]);
-  EXPECT_EQ(oldintermediate_, result.paths[1]->path[1]);
-  EXPECT_EQ(oldroot_, result.paths[1]->path[2]);
+  EXPECT_EQ(OK, result.paths[result.best_result_index]->error);
+  ASSERT_EQ(3U, result.paths[result.best_result_index]->path.size());
+  EXPECT_EQ(target_, result.paths[result.best_result_index]->path[0]);
+  EXPECT_EQ(oldintermediate_, result.paths[result.best_result_index]->path[1]);
+  EXPECT_EQ(oldroot_, result.paths[result.best_result_index]->path[2]);
 }
 
 // Tests that the path builder doesn't build longer than necessary paths.
diff --git a/net/cert/multi_log_ct_verifier_unittest.cc b/net/cert/multi_log_ct_verifier_unittest.cc
index 36dbdc6..613218c 100644
--- a/net/cert/multi_log_ct_verifier_unittest.cc
+++ b/net/cert/multi_log_ct_verifier_unittest.cc
@@ -52,7 +52,7 @@
  public:
   void SetUp() override {
     scoped_refptr<const CTLogVerifier> log(CTLogVerifier::Create(
-        ct::GetTestPublicKey(), kLogDescription, "https://ct.example.com"));
+        ct::GetTestPublicKey(), kLogDescription, "https://ct.example.com", ""));
     ASSERT_TRUE(log);
     log_verifiers_.push_back(log);
 
diff --git a/net/data/ssl/symantec/excluded/a4fe7c7f15155f3f0aef7aaa83cf6e06deb97ca3f909df920ac1490882d488ed.pem b/net/data/ssl/symantec/excluded/a4fe7c7f15155f3f0aef7aaa83cf6e06deb97ca3f909df920ac1490882d488ed.pem
new file mode 100644
index 0000000..1e36826
--- /dev/null
+++ b/net/data/ssl/symantec/excluded/a4fe7c7f15155f3f0aef7aaa83cf6e06deb97ca3f909df920ac1490882d488ed.pem
@@ -0,0 +1,72 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            13:52:2e:bf:c1:dd:5c:e1:1e:f2:76:40:75:1f:e7:df
+    Signature Algorithm: ecdsa-with-SHA384
+        Issuer: C=US, O=GeoTrust Inc., OU=(c) 2007 GeoTrust Inc. - For authorized use only, CN=GeoTrust Primary Certification Authority - G2
+        Validity
+            Not Before: Jun  9 00:00:00 2016 GMT
+            Not After : Jun  8 23:59:59 2031 GMT
+        Subject: CN=Apple IST CA 8 - G1, OU=Certification Authority, O=Apple Inc., C=US
+        Subject Public Key Info:
+            Public Key Algorithm: id-ecPublicKey
+                Public-Key: (256 bit)
+                pub: 
+                    04:2d:54:8e:68:b0:10:13:ef:f4:2d:db:d8:09:b2:
+                    43:e8:9d:65:99:6e:34:b8:d4:97:c9:8e:c9:d6:a8:
+                    22:37:32:c8:71:60:ee:b0:f1:f2:c5:64:f6:ba:47:
+                    5f:fc:e6:07:78:32:2d:f6:ca:80:20:c9:fd:70:f8:
+                    72:93:21:88:45
+                ASN1 OID: prime256v1
+        X509v3 extensions:
+            X509v3 Basic Constraints: critical
+                CA:TRUE, pathlen:0
+            X509v3 CRL Distribution Points: 
+
+                Full Name:
+                  URI:http://g.symcb.com/GeoTrustPCA-G2.crl
+
+            X509v3 Key Usage: critical
+                Certificate Sign, CRL Sign
+            Authority Information Access: 
+                OCSP - URI:http://g.symcd.com
+
+            X509v3 Certificate Policies: 
+                Policy: 2.23.140.1.2.2
+                  CPS: https://www.geotrust.com/resources/cps
+
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, TLS Web Client Authentication
+            X509v3 Subject Key Identifier: 
+                C3:C4:A4:58:05:63:D7:83:06:BA:96:8D:DC:B2:8F:32:F6:BB:B7:41
+            X509v3 Authority Key Identifier: 
+                keyid:15:5F:35:57:51:55:FB:25:B2:AD:03:69:FC:01:A3:FA:BE:11:55:D5
+
+    Signature Algorithm: ecdsa-with-SHA384
+         30:64:02:30:47:da:33:0d:c9:b8:c2:93:74:ec:3a:27:57:c4:
+         95:fd:60:33:cc:77:94:b7:28:30:af:f2:fc:93:74:91:a1:b6:
+         89:72:ed:f4:09:44:db:f9:ae:75:73:fb:a6:06:7e:c3:02:30:
+         4a:7a:c3:28:5e:2f:b3:4a:9a:a6:af:b1:db:a2:c7:64:7e:8f:
+         50:77:c1:18:de:97:32:58:81:7c:e0:33:79:f0:85:02:8a:94:
+         95:b1:a4:5e:c8:18:7b:af:6b:5b:5a:c6
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAtugAwIBAgIQE1Iuv8HdXOEe8nZAdR/n3zAKBggqhkjOPQQDAzCBmDEL
+MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
+KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
+MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eSAtIEcyMB4XDTE2MDYwOTAwMDAwMFoXDTMxMDYwODIzNTk1OVowYjEcMBoGA1UE
+AwwTQXBwbGUgSVNUIENBIDggLSBHMTEgMB4GA1UECwwXQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkxEzARBgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTMFkwEwYH
+KoZIzj0CAQYIKoZIzj0DAQcDQgAELVSOaLAQE+/0LdvYCbJD6J1lmW40uNSXyY7J
+1qgiNzLIcWDusPHyxWT2ukdf/OYHeDIt9sqAIMn9cPhykyGIRaOCATowggE2MBIG
+A1UdEwEB/wQIMAYBAf8CAQAwNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2cuc3lt
+Y2IuY29tL0dlb1RydXN0UENBLUcyLmNybDAOBgNVHQ8BAf8EBAMCAQYwLgYIKwYB
+BQUHAQEEIjAgMB4GCCsGAQUFBzABhhJodHRwOi8vZy5zeW1jZC5jb20wSQYDVR0g
+BEIwQDA+BgZngQwBAgIwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2VvdHJ1
+c3QuY29tL3Jlc291cmNlcy9jcHMwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
+BwMCMB0GA1UdDgQWBBTDxKRYBWPXgwa6lo3cso8y9ru3QTAfBgNVHSMEGDAWgBQV
+XzVXUVX7JbKtA2n8AaP6vhFV1TAKBggqhkjOPQQDAwNnADBkAjBH2jMNybjCk3Ts
+OidXxJX9YDPMd5S3KDCv8vyTdJGhtoly7fQJRNv5rnVz+6YGfsMCMEp6wyheL7NK
+mqavsduix2R+j1B3wRjelzJYgXzgM3nwhQKKlJWxpF7IGHuva1taxg==
+-----END CERTIFICATE-----
diff --git a/net/http/http_chunked_decoder.cc b/net/http/http_chunked_decoder.cc
index 7aa4a96..fab9434 100644
--- a/net/http/http_chunked_decoder.cc
+++ b/net/http/http_chunked_decoder.cc
@@ -69,9 +69,12 @@
 int HttpChunkedDecoder::FilterBuf(char* buf, int buf_len) {
   int result = 0;
 
-  while (buf_len) {
-    if (chunk_remaining_) {
-      int num = std::min(chunk_remaining_, buf_len);
+  while (buf_len > 0) {
+    if (chunk_remaining_ > 0) {
+      // Since |chunk_remaining_| is positive and |buf_len| an int, the minimum
+      // of the two must be an int.
+      int num = static_cast<int>(
+          std::min(chunk_remaining_, static_cast<int64_t>(buf_len)));
 
       buf_len -= num;
       chunk_remaining_ -= num;
@@ -79,8 +82,8 @@
       result += num;
       buf += num;
 
-      // After each chunk's data there should be a CRLF
-      if (!chunk_remaining_)
+      // After each chunk's data there should be a CRLF.
+      if (chunk_remaining_ == 0)
         chunk_terminator_remaining_ = true;
       continue;
     } else if (reached_eof_) {
@@ -93,7 +96,7 @@
       return bytes_consumed; // Error
 
     buf_len -= bytes_consumed;
-    if (buf_len)
+    if (buf_len > 0)
       memmove(buf, buf + bytes_consumed, buf_len);
   }
 
@@ -121,17 +124,17 @@
     }
 
     if (reached_last_chunk_) {
-      if (buf_len)
+      if (buf_len > 0)
         DVLOG(1) << "ignoring http trailer";
       else
         reached_eof_ = true;
     } else if (chunk_terminator_remaining_) {
-      if (buf_len) {
+      if (buf_len > 0) {
         DLOG(ERROR) << "chunk data not terminated properly";
         return ERR_INVALID_CHUNKED_ENCODING;
       }
       chunk_terminator_remaining_ = false;
-    } else if (buf_len) {
+    } else if (buf_len > 0) {
       // Ignore any chunk-extensions.
       size_t index_of_semicolon = base::StringPiece(buf, buf_len).find(';');
       if (index_of_semicolon != base::StringPiece::npos)
@@ -189,14 +192,16 @@
 // known sites.
 //
 //         Us: ^\X+[ ]*$
-bool HttpChunkedDecoder::ParseChunkSize(const char* start, int len, int* out) {
+bool HttpChunkedDecoder::ParseChunkSize(const char* start,
+                                        int len,
+                                        int64_t* out) {
   DCHECK_GE(len, 0);
 
   // Strip trailing spaces
-  while (len && start[len - 1] == ' ')
+  while (len > 0 && start[len - 1] == ' ')
     len--;
 
-  // Be more restrictive than HexStringToInt;
+  // Be more restrictive than HexStringToInt64;
   // don't allow inputs with leading "-", "+", "0x", "0X"
   base::StringPiece chunk_size(start, len);
   if (chunk_size.find_first_not_of("0123456789abcdefABCDEF")
@@ -204,8 +209,8 @@
     return false;
   }
 
-  int parsed_number;
-  bool ok = base::HexStringToInt(chunk_size, &parsed_number);
+  int64_t parsed_number;
+  bool ok = base::HexStringToInt64(chunk_size, &parsed_number);
   if (ok && parsed_number >= 0) {
     *out = parsed_number;
     return true;
diff --git a/net/http/http_chunked_decoder.h b/net/http/http_chunked_decoder.h
index 87412de..2ff55f9 100644
--- a/net/http/http_chunked_decoder.h
+++ b/net/http/http_chunked_decoder.h
@@ -46,6 +46,7 @@
 #define NET_HTTP_HTTP_CHUNKED_DECODER_H_
 
 #include <stddef.h>
+#include <stdint.h>
 
 #include <string>
 
@@ -107,10 +108,10 @@
   // Converts string |start| of length |len| to a numeric value.
   // |start| is a string of type "chunk-size" (hex string).
   // If the conversion succeeds, returns true and places the result in |out|.
-  static bool ParseChunkSize(const char* start, int len, int* out);
+  static bool ParseChunkSize(const char* start, int len, int64_t* out);
 
   // Indicates the number of bytes remaining for the current chunk.
-  int chunk_remaining_;
+  int64_t chunk_remaining_;
 
   // A small buffer used to store a partial chunk marker.
   std::string line_buf_;
diff --git a/net/http/http_chunked_decoder_unittest.cc b/net/http/http_chunked_decoder_unittest.cc
index dd901a9..2d2898c 100644
--- a/net/http/http_chunked_decoder_unittest.cc
+++ b/net/http/http_chunked_decoder_unittest.cc
@@ -5,7 +5,11 @@
 #include "net/http/http_chunked_decoder.h"
 
 #include <memory>
+#include <string>
+#include <vector>
 
+#include "base/format_macros.h"
+#include "base/strings/stringprintf.h"
 #include "net/base/net_errors.h"
 #include "net/test/gtest_util.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -291,10 +295,70 @@
   RunTestUntilFailure(inputs, arraysize(inputs), 1);
 }
 
-TEST(HttpChunkedDecoderTest, ExcessiveChunkLen) {
-  const char* const inputs[] = {
-    "c0000000\r\nhello\r\n"
+TEST(HttpChunkedDecoderTest, ReallyBigChunks) {
+  // Number of bytes sent through the chunked decoder per loop iteration. To
+  // minimize runtime, should be the square root of the chunk lengths, below.
+  const int64_t kWrittenBytesPerIteration = 0x10000;
+
+  // Length of chunks to test. Must be multiples of kWrittenBytesPerIteration.
+  int64_t kChunkLengths[] = {
+      // Overflows when cast to a signed int32.
+      0x0c0000000,
+      // Overflows when cast to an unsigned int32.
+      0x100000000,
   };
+
+  for (int64_t chunk_length : kChunkLengths) {
+    HttpChunkedDecoder decoder;
+    EXPECT_FALSE(decoder.reached_eof());
+
+    // Feed just the header to the decode.
+    std::string chunk_header =
+        base::StringPrintf("%" PRIx64 "\r\n", chunk_length);
+    std::vector<char> data(chunk_header.begin(), chunk_header.end());
+    EXPECT_EQ(OK, decoder.FilterBuf(data.data(), data.size()));
+    EXPECT_FALSE(decoder.reached_eof());
+
+    // Set |data| to be kWrittenBytesPerIteration long, and have a repeating
+    // pattern.
+    data.clear();
+    data.reserve(kWrittenBytesPerIteration);
+    for (size_t i = 0; i < kWrittenBytesPerIteration; i++) {
+      data.push_back(static_cast<char>(i));
+    }
+
+    // Repeatedly feed the data to the chunked decoder. Since the data doesn't
+    // include any chunk lengths, the decode will never have to move the data,
+    // and should run fairly quickly.
+    for (int64_t total_written = 0; total_written < chunk_length;
+         total_written += kWrittenBytesPerIteration) {
+      EXPECT_EQ(kWrittenBytesPerIteration,
+                decoder.FilterBuf(data.data(), kWrittenBytesPerIteration));
+      EXPECT_FALSE(decoder.reached_eof());
+    }
+
+    // Chunk terminator and the final chunk.
+    char final_chunk[] = "\r\n0\r\n\r\n";
+    EXPECT_EQ(OK, decoder.FilterBuf(final_chunk, arraysize(final_chunk)));
+    EXPECT_TRUE(decoder.reached_eof());
+
+    // Since |data| never included any chunk headers, it should not have been
+    // modified.
+    for (size_t i = 0; i < kWrittenBytesPerIteration; i++) {
+      EXPECT_EQ(static_cast<char>(i), data[i]);
+    }
+  }
+}
+
+TEST(HttpChunkedDecoderTest, ExcessiveChunkLen) {
+  // Smallest number that can't be represented as a signed int64.
+  const char* const inputs[] = {"8000000000000000\r\nhello\r\n"};
+  RunTestUntilFailure(inputs, arraysize(inputs), 0);
+}
+
+TEST(HttpChunkedDecoderTest, ExcessiveChunkLen2) {
+  // Smallest number that can't be represented as an unsigned int64.
+  const char* const inputs[] = {"10000000000000000\r\nhello\r\n"};
   RunTestUntilFailure(inputs, arraysize(inputs), 0);
 }
 
diff --git a/net/http/transport_security_state_ct_policies.inc b/net/http/transport_security_state_ct_policies.inc
index af76103..82998af 100644
--- a/net/http/transport_security_state_ct_policies.inc
+++ b/net/http/transport_security_state_ct_policies.inc
@@ -215,15 +215,9 @@
     {{0x0b, 0x2a, 0xc7, 0xee, 0x53, 0xe1, 0xb3, 0xb2, 0x12, 0xcf, 0xd1,
       0x95, 0xfb, 0xe4, 0x29, 0xc3, 0x7b, 0x0a, 0xc4, 0xb1, 0x6e, 0xa0,
       0xb8, 0xf6, 0xcf, 0xe4, 0xfe, 0xd9, 0x9b, 0x2e, 0x19, 0xb6}},
-    {{0x31, 0x74, 0xd9, 0x09, 0x2f, 0x95, 0x31, 0xc0, 0x60, 0x26, 0xba,
-      0x48, 0x98, 0x91, 0x01, 0x6b, 0x43, 0x6d, 0x5e, 0xc0, 0x26, 0x23,
-      0xf9, 0xaa, 0xfe, 0x20, 0x09, 0xec, 0xc3, 0xe4, 0xd5, 0x57}},
     {{0x56, 0xe9, 0x8d, 0xea, 0xc0, 0x06, 0xa7, 0x29, 0xaf, 0xa2, 0xed,
       0x79, 0xf9, 0xe4, 0x19, 0xdf, 0x69, 0xf4, 0x51, 0x24, 0x25, 0x96,
       0xd2, 0xaa, 0xf2, 0x84, 0xc7, 0x4a, 0x85, 0x5e, 0x35, 0x2e}},
-    {{0x5c, 0x02, 0xa0, 0xb5, 0x8f, 0x60, 0xf8, 0x0b, 0xa1, 0x37, 0xfd,
-      0x6e, 0xc1, 0x35, 0x29, 0x81, 0x18, 0xce, 0x60, 0xde, 0x6f, 0x25,
-      0x66, 0xa7, 0xf6, 0x3c, 0xd6, 0x0a, 0x78, 0x5e, 0x6e, 0x3c}},
     {{0x72, 0x89, 0xc0, 0x6d, 0xed, 0xd1, 0x6b, 0x71, 0xa7, 0xdc, 0xca,
       0x66, 0x57, 0x85, 0x72, 0xe2, 0xe1, 0x09, 0xb1, 0x1d, 0x70, 0xad,
       0x04, 0xc2, 0x60, 0x1b, 0x67, 0x43, 0xbc, 0x66, 0xd0, 0x7b}},
@@ -236,9 +230,9 @@
     {{0xc0, 0x55, 0x4b, 0xde, 0x87, 0xa0, 0x75, 0xec, 0x13, 0xa6, 0x1f,
       0x27, 0x59, 0x83, 0xae, 0x02, 0x39, 0x57, 0x29, 0x4b, 0x45, 0x4c,
       0xaf, 0x0a, 0x97, 0x24, 0xe3, 0xb2, 0x1b, 0x79, 0x35, 0xbc}},
-    {{0xd9, 0xcb, 0x0b, 0x83, 0x5e, 0xe9, 0x7b, 0x0a, 0x58, 0x5a, 0x93,
-      0x28, 0x1a, 0x52, 0xfd, 0xb6, 0x9a, 0x99, 0x35, 0xf2, 0xb4, 0x5e,
-      0x2c, 0x9b, 0xf3, 0xe6, 0x5d, 0xa3, 0x14, 0x09, 0x0d, 0xfc}},
+    {{0xe2, 0x4f, 0x8e, 0x8c, 0x21, 0x85, 0xda, 0x2f, 0x5e, 0x88, 0xd4,
+      0x57, 0x9e, 0x81, 0x7c, 0x47, 0xbf, 0x6e, 0xaf, 0xbc, 0x85, 0x05,
+      0xf0, 0xf9, 0x60, 0xfd, 0x5a, 0x0d, 0xf4, 0x47, 0x3a, 0xd3}},
     {{0xec, 0x72, 0x29, 0x69, 0xcb, 0x64, 0x20, 0x0a, 0xb6, 0x63, 0x8f,
       0x68, 0xac, 0x53, 0x8e, 0x40, 0xab, 0xab, 0x5b, 0x19, 0xa6, 0x48,
       0x56, 0x61, 0x04, 0x2a, 0x10, 0x61, 0xc4, 0x61, 0x27, 0x76}},
diff --git a/net/net.gypi b/net/net.gypi
index f2fadb4..10d9eb5 100644
--- a/net/net.gypi
+++ b/net/net.gypi
@@ -747,12 +747,15 @@
       'nqe/cached_network_quality.cc',
       'nqe/cached_network_quality.h',
       'nqe/external_estimate_provider.h',
+      'nqe/network_id.h',
       'nqe/network_quality.cc',
       'nqe/network_quality.h',
       'nqe/network_quality_estimator.cc',
       'nqe/network_quality_estimator.h',
       'nqe/network_quality_observation.h',
       'nqe/network_quality_observation_source.h',
+      'nqe/network_quality_store.cc',
+      'nqe/network_quality_store.h',
       'nqe/observation_buffer.h',
       'nqe/socket_watcher.cc',
       'nqe/socket_watcher.h',
@@ -1558,6 +1561,7 @@
       'log/write_to_file_net_log_observer_unittest.cc',
       'nqe/network_quality_estimator_unittest.cc',
       'nqe/network_quality_observation_unittest.cc',
+      'nqe/network_quality_store_unittest.cc',
       'nqe/throughput_analyzer_unittest.cc',
       'proxy/dhcp_proxy_script_adapter_fetcher_win_unittest.cc',
       'proxy/dhcp_proxy_script_fetcher_factory_unittest.cc',
diff --git a/net/nqe/cached_network_quality.cc b/net/nqe/cached_network_quality.cc
index 5902f75a..d4e454d 100644
--- a/net/nqe/cached_network_quality.cc
+++ b/net/nqe/cached_network_quality.cc
@@ -10,10 +10,12 @@
 
 namespace internal {
 
+CachedNetworkQuality::CachedNetworkQuality() {}
+
 CachedNetworkQuality::CachedNetworkQuality(
+    base::TimeTicks last_update_time,
     const NetworkQuality& network_quality)
-    : last_update_time_(base::TimeTicks::Now()),
-      network_quality_(network_quality) {}
+    : last_update_time_(last_update_time), network_quality_(network_quality) {}
 
 CachedNetworkQuality::CachedNetworkQuality(const CachedNetworkQuality& other)
     : last_update_time_(other.last_update_time_),
@@ -21,6 +23,13 @@
 
 CachedNetworkQuality::~CachedNetworkQuality() {}
 
+CachedNetworkQuality& CachedNetworkQuality::operator=(
+    const CachedNetworkQuality& other) {
+  last_update_time_ = other.last_update_time_;
+  network_quality_ = other.network_quality_;
+  return *this;
+}
+
 bool CachedNetworkQuality::OlderThan(
     const CachedNetworkQuality& cached_network_quality) const {
   return last_update_time_ < cached_network_quality.last_update_time_;
diff --git a/net/nqe/cached_network_quality.h b/net/nqe/cached_network_quality.h
index cc0af2f..a8fae2f7 100644
--- a/net/nqe/cached_network_quality.h
+++ b/net/nqe/cached_network_quality.h
@@ -19,25 +19,33 @@
 // CachedNetworkQuality stores the quality of a previously seen network.
 class NET_EXPORT_PRIVATE CachedNetworkQuality {
  public:
-  explicit CachedNetworkQuality(const NetworkQuality& network_quality);
+  CachedNetworkQuality();
+
+  // |last_update_time| is the time when the |network_quality| was computed.
+  CachedNetworkQuality(base::TimeTicks last_update_time,
+                       const NetworkQuality& network_quality);
   CachedNetworkQuality(const CachedNetworkQuality& other);
   ~CachedNetworkQuality();
 
   // Returns the network quality associated with this cached entry.
   const NetworkQuality& network_quality() const { return network_quality_; }
 
+  CachedNetworkQuality& operator=(const CachedNetworkQuality& other);
+
   // Returns true if this cache entry was updated before
   // |cached_network_quality|.
   bool OlderThan(const CachedNetworkQuality& cached_network_quality) const;
 
-  // Time when this cache entry was last updated.
-  const base::TimeTicks last_update_time_;
+  base::TimeTicks last_update_time() { return last_update_time_; }
 
-  // Quality of this cached network.
-  const NetworkQuality network_quality_;
+  const NetworkQuality& network_quality() { return network_quality_; }
 
  private:
-  DISALLOW_ASSIGN(CachedNetworkQuality);
+  // Time when this cache entry was last updated.
+  base::TimeTicks last_update_time_;
+
+  // Quality of this cached network.
+  NetworkQuality network_quality_;
 };
 
 }  // namespace internal
diff --git a/net/nqe/network_id.h b/net/nqe/network_id.h
new file mode 100644
index 0000000..cf8ceac9
--- /dev/null
+++ b/net/nqe/network_id.h
@@ -0,0 +1,59 @@
+// 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 NET_NQE_NETWORK_ID_H_
+#define NET_NQE_NETWORK_ID_H_
+
+#include <string>
+#include <tuple>
+
+#include "net/base/net_export.h"
+#include "net/base/network_change_notifier.h"
+
+namespace net {
+namespace nqe {
+namespace internal {
+
+// NetworkID is used to uniquely identify a network.
+// For the purpose of network quality estimation and caching, a network is
+// uniquely identified by a combination of |type| and
+// |id|. This approach is unable to distinguish networks with
+// same name (e.g., different Wi-Fi networks with same SSID).
+// This is a protected member to expose it to tests.
+struct NET_EXPORT_PRIVATE NetworkID {
+  NetworkID(NetworkChangeNotifier::ConnectionType type, const std::string& id)
+      : type(type), id(id) {}
+  NetworkID(const NetworkID& other) : type(other.type), id(other.id) {}
+  ~NetworkID() {}
+
+  NetworkID& operator=(const NetworkID& other) {
+    type = other.type;
+    id = other.id;
+    return *this;
+  }
+
+  // Overloaded to support ordered collections.
+  bool operator<(const NetworkID& other) const {
+    return std::tie(type, id) < std::tie(other.type, other.id);
+  }
+
+  // Connection type of the network.
+  NetworkChangeNotifier::ConnectionType type;
+
+  // Name of this network. This is set to:
+  // - Wi-Fi SSID if the device is connected to a Wi-Fi access point and the
+  //   SSID name is available, or
+  // - MCC/MNC code of the cellular carrier if the device is connected to a
+  //   cellular network, or
+  // - "Ethernet" in case the device is connected to ethernet.
+  // - An empty string in all other cases or if the network name is not
+  //   exposed by platform APIs.
+  std::string id;
+};
+
+}  // namespace internal
+}  // namespace nqe
+}  // namespace net
+
+#endif  // NET_NQE_NETWORK_QUALITY_ESTIMATOR_H_
\ No newline at end of file
diff --git a/net/nqe/network_quality.cc b/net/nqe/network_quality.cc
index 94bcc803..1132b0eb 100644
--- a/net/nqe/network_quality.cc
+++ b/net/nqe/network_quality.cc
@@ -5,9 +5,7 @@
 #include "net/nqe/network_quality.h"
 
 namespace net {
-
 namespace nqe {
-
 namespace internal {
 
 base::TimeDelta InvalidRTT() {
@@ -40,8 +38,12 @@
   return *this;
 }
 
+bool NetworkQuality::operator==(const NetworkQuality& other) const {
+  return http_rtt_ == other.http_rtt_ &&
+         transport_rtt_ == other.transport_rtt_ &&
+         downstream_throughput_kbps_ == other.downstream_throughput_kbps_;
+}
+
 }  // namespace internal
-
 }  // namespace nqe
-
 }  // namespace net
\ No newline at end of file
diff --git a/net/nqe/network_quality.h b/net/nqe/network_quality.h
index bc1ec77..dc32ef4e 100644
--- a/net/nqe/network_quality.h
+++ b/net/nqe/network_quality.h
@@ -13,9 +13,7 @@
 #include "net/base/net_export.h"
 
 namespace net {
-
 namespace nqe {
-
 namespace internal {
 
 // Returns the RTT value to be used when the valid RTT is unavailable. Readers
@@ -43,6 +41,8 @@
 
   NetworkQuality& operator=(const NetworkQuality& other);
 
+  bool operator==(const NetworkQuality& other) const;
+
   // Returns the estimate of the round trip time at the HTTP layer.
   const base::TimeDelta& http_rtt() const { return http_rtt_; }
 
@@ -77,9 +77,7 @@
 };
 
 }  // namespace internal
-
 }  // namespace nqe
-
 }  // namespace net
 
 #endif  // NET_NQE_NETWORK_QUALITY_H_
\ No newline at end of file
diff --git a/net/nqe/network_quality_estimator.cc b/net/nqe/network_quality_estimator.cc
index 8e37d46..7cfca26 100644
--- a/net/nqe/network_quality_estimator.cc
+++ b/net/nqe/network_quality_estimator.cc
@@ -19,6 +19,7 @@
 #include "base/rand_util.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/strings/stringprintf.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_tick_clock.h"
 #include "base/trace_event/trace_event.h"
@@ -200,7 +201,7 @@
 // Returns the suffix of the histogram that should be used for recording the
 // accuracy when the observed RTT is |observed_rtt|. The width of the intervals
 // are in exponentially increasing order.
-std::string GetHistogramSuffixObservedRTT(const base::TimeDelta& observed_rtt) {
+const char* GetHistogramSuffixObservedRTT(const base::TimeDelta& observed_rtt) {
   const float rtt_milliseconds = observed_rtt.InMillisecondsF();
   DCHECK_GE(rtt_milliseconds, 0);
 
@@ -220,7 +221,7 @@
 // accuracy when the observed throughput in kilobits per second is
 // |observed_throughput_kbps|. The width of the intervals are in exponentially
 // increasing order.
-std::string GetHistogramSuffixObservedThroughput(
+const char* GetHistogramSuffixObservedThroughput(
     const int32_t& observed_throughput_kbps) {
   DCHECK_GE(observed_throughput_kbps, 0);
 
@@ -269,6 +270,60 @@
   return metric;
 }
 
+void RecordRTTAccuracy(const char* prefix,
+                       int32_t metric,
+                       base::TimeDelta measuring_duration,
+                       base::TimeDelta observed_rtt) {
+  const std::string histogram_name =
+      base::StringPrintf("%s.EstimatedObservedDiff.%s.%d.%s", prefix,
+                         metric >= 0 ? "Positive" : "Negative",
+                         static_cast<int32_t>(measuring_duration.InSeconds()),
+                         GetHistogramSuffixObservedRTT(observed_rtt));
+
+  base::HistogramBase* histogram = base::Histogram::FactoryGet(
+      histogram_name, 1, 10 * 1000 /* 10 seconds */, 50 /* Number of buckets */,
+      base::HistogramBase::kUmaTargetedHistogramFlag);
+  histogram->Add(std::abs(metric));
+}
+
+void RecordThroughputAccuracy(const char* prefix,
+                              int32_t metric,
+                              base::TimeDelta measuring_duration,
+                              int32_t observed_throughput_kbps) {
+  const std::string histogram_name = base::StringPrintf(
+      "%s.EstimatedObservedDiff.%s.%d.%s", prefix,
+      metric >= 0 ? "Positive" : "Negative",
+      static_cast<int32_t>(measuring_duration.InSeconds()),
+      GetHistogramSuffixObservedThroughput(observed_throughput_kbps));
+
+  base::HistogramBase* histogram = base::Histogram::FactoryGet(
+      histogram_name, 1, 1000 * 1000 /* 1 Gbps */, 50 /* Number of buckets */,
+      base::HistogramBase::kUmaTargetedHistogramFlag);
+  histogram->Add(std::abs(metric));
+}
+
+void RecordEffectiveConnectionTypeAccuracy(
+    const char* prefix,
+    int32_t metric,
+    base::TimeDelta measuring_duration,
+    net::NetworkQualityEstimator::EffectiveConnectionType
+        observed_effective_connection_type) {
+  const std::string histogram_name = base::StringPrintf(
+      "%s.EstimatedObservedDiff.%s.%d.%s", prefix,
+      metric >= 0 ? "Positive" : "Negative",
+      static_cast<int32_t>(measuring_duration.InSeconds()),
+      net::NetworkQualityEstimator::GetNameForEffectiveConnectionType(
+          observed_effective_connection_type));
+
+  base::HistogramBase* histogram = base::Histogram::FactoryGet(
+      histogram_name, 0,
+      net::NetworkQualityEstimator::EFFECTIVE_CONNECTION_TYPE_LAST,
+      net::NetworkQualityEstimator::
+          EFFECTIVE_CONNECTION_TYPE_LAST /* Number of buckets */,
+      base::HistogramBase::kUmaTargetedHistogramFlag);
+  histogram->Add(std::abs(metric));
+}
+
 }  // namespace
 
 namespace net {
@@ -307,9 +362,9 @@
       effective_connection_type_recomputation_interval_(
           base::TimeDelta::FromSeconds(15)),
       last_connection_change_(tick_clock_->NowTicks()),
-      current_network_id_(
-          NetworkID(NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN,
-                    std::string())),
+      current_network_id_(nqe::internal::NetworkID(
+          NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN,
+          std::string())),
       downstream_throughput_kbps_observations_(weight_multiplier_per_second_),
       rtt_observations_(weight_multiplier_per_second_),
       effective_connection_type_at_last_main_frame_(
@@ -326,12 +381,6 @@
       weak_ptr_factory_(this) {
   static_assert(kDefaultHalfLifeSeconds > 0,
                 "Default half life duration must be > 0");
-  static_assert(kMaximumNetworkQualityCacheSize > 0,
-                "Size of the network quality cache must be > 0");
-  // This limit should not be increased unless the logic for removing the
-  // oldest cache entry is rewritten to use a doubly-linked-list LRU queue.
-  static_assert(kMaximumNetworkQualityCacheSize <= 10,
-                "Size of the network quality cache must <= 10");
   // None of the algorithms can have an empty name.
   DCHECK(algorithm_name_to_enum_.end() ==
          algorithm_name_to_enum_.find(std::string()));
@@ -577,6 +626,7 @@
         GetEffectiveConnectionType();
 
     RecordMetricsOnMainFrameRequest();
+    MaybeQueryExternalEstimateProvider();
 
     // Post the tasks which will run in the future and record the estimation
     // accuracy based on the observations received between now and the time of
@@ -656,16 +706,9 @@
         estimated_quality_at_last_main_frame_.http_rtt().InMilliseconds() -
         recent_http_rtt.InMilliseconds();
 
-    const std::string sign_suffix =
-        estimated_observed_diff_milliseconds >= 0 ? "Positive." : "Negative.";
-
-    base::HistogramBase* histogram = base::Histogram::FactoryGet(
-        "NQE.Accuracy.HttpRTT.EstimatedObservedDiff." + sign_suffix +
-            base::IntToString(measuring_duration.InSeconds()) + "." +
-            GetHistogramSuffixObservedRTT(recent_http_rtt),
-        1, 10 * 1000 /* 10 seconds */, 50 /* Number of buckets */,
-        base::HistogramBase::kUmaTargetedHistogramFlag);
-    histogram->Add(std::abs(estimated_observed_diff_milliseconds));
+    RecordRTTAccuracy("NQE.Accuracy.HttpRTT",
+                      estimated_observed_diff_milliseconds, measuring_duration,
+                      recent_http_rtt);
   }
 
   base::TimeDelta recent_transport_rtt;
@@ -677,16 +720,9 @@
         estimated_quality_at_last_main_frame_.transport_rtt().InMilliseconds() -
         recent_transport_rtt.InMilliseconds();
 
-    const std::string sign_suffix =
-        estimated_observed_diff_milliseconds >= 0 ? "Positive." : "Negative.";
-
-    base::HistogramBase* histogram = base::Histogram::FactoryGet(
-        "NQE.Accuracy.TransportRTT.EstimatedObservedDiff." + sign_suffix +
-            base::IntToString(measuring_duration.InSeconds()) + "." +
-            GetHistogramSuffixObservedRTT(recent_transport_rtt),
-        1, 10 * 1000 /* 10 seconds */, 50 /* Number of buckets */,
-        base::HistogramBase::kUmaTargetedHistogramFlag);
-    histogram->Add(std::abs(estimated_observed_diff_milliseconds));
+    RecordRTTAccuracy("NQE.Accuracy.TransportRTT",
+                      estimated_observed_diff_milliseconds, measuring_duration,
+                      recent_transport_rtt);
   }
 
   int32_t recent_downstream_throughput_kbps;
@@ -698,17 +734,9 @@
         estimated_quality_at_last_main_frame_.downstream_throughput_kbps() -
         recent_downstream_throughput_kbps;
 
-    const std::string sign_suffix =
-        estimated_observed_diff >= 0 ? "Positive." : "Negative.";
-
-    base::HistogramBase* histogram = base::Histogram::FactoryGet(
-        "NQE.Accuracy.DownstreamThroughputKbps.EstimatedObservedDiff." +
-            sign_suffix + base::IntToString(measuring_duration.InSeconds()) +
-            "." + GetHistogramSuffixObservedThroughput(
-                      recent_downstream_throughput_kbps),
-        1, 1000 * 1000 /* 1 Gbps */, 50 /* Number of buckets */,
-        base::HistogramBase::kUmaTargetedHistogramFlag);
-    histogram->Add(std::abs(estimated_observed_diff));
+    RecordThroughputAccuracy("NQE.Accuracy.DownstreamThroughputKbps",
+                             estimated_observed_diff, measuring_duration,
+                             recent_downstream_throughput_kbps);
   }
 
   EffectiveConnectionType recent_effective_connection_type =
@@ -720,18 +748,22 @@
         static_cast<int>(effective_connection_type_at_last_main_frame_) -
         static_cast<int>(recent_effective_connection_type);
 
-    const std::string sign_suffix =
-        estimated_observed_diff >= 0 ? "Positive." : "Negative.";
+    RecordEffectiveConnectionTypeAccuracy(
+        "NQE.Accuracy.EffectiveConnectionType", estimated_observed_diff,
+        measuring_duration, recent_effective_connection_type);
+  }
 
-    base::HistogramBase* histogram = base::Histogram::FactoryGet(
-        "NQE.Accuracy.EffectiveConnectionType.EstimatedObservedDiff." +
-            sign_suffix + base::IntToString(measuring_duration.InSeconds()) +
-            "." +
-            GetNameForEffectiveConnectionType(recent_effective_connection_type),
-        0, EFFECTIVE_CONNECTION_TYPE_LAST,
-        EFFECTIVE_CONNECTION_TYPE_LAST /* Number of buckets */,
-        base::HistogramBase::kUmaTargetedHistogramFlag);
-    histogram->Add(std::abs(estimated_observed_diff));
+  // Add histogram to evaluate the accuracy of the external estimate provider.
+  if (external_estimate_provider_quality_.http_rtt() !=
+          nqe::internal::InvalidRTT() &&
+      recent_http_rtt != nqe::internal::InvalidRTT()) {
+    const int estimated_observed_diff_milliseconds =
+        external_estimate_provider_quality_.http_rtt().InMilliseconds() -
+        recent_http_rtt.InMilliseconds();
+
+    RecordRTTAccuracy("NQE.ExternalEstimateProvider.RTT.Accuracy",
+                      estimated_observed_diff_milliseconds, measuring_duration,
+                      recent_http_rtt);
   }
 }
 
@@ -923,7 +955,10 @@
   RecordMetricsOnConnectionTypeChanged();
 
   // Write the estimates of the previous network to the cache.
-  CacheNetworkQualityEstimate();
+  network_quality_store_.Add(current_network_id_,
+                             nqe::internal::CachedNetworkQuality(
+                                 last_effective_connection_type_computation_,
+                                 estimated_quality_at_last_main_frame_));
 
   // Clear the local state.
   last_connection_change_ = tick_clock_->NowTicks();
@@ -946,6 +981,19 @@
   current_network_id_ = GetCurrentNetworkID();
   RecordNetworkIDAvailability();
 
+  MaybeQueryExternalEstimateProvider();
+
+  // Read any cached estimates for the new network. If cached estimates are
+  // unavailable, add the default estimates.
+  if (!ReadCachedNetworkQualityEstimate())
+    AddDefaultEstimates();
+  estimated_quality_at_last_main_frame_ = nqe::internal::NetworkQuality();
+  throughput_analyzer_->OnConnectionTypeChanged();
+  MaybeRecomputeEffectiveConnectionType();
+  UpdateSignalStrength();
+}
+
+void NetworkQualityEstimator::MaybeQueryExternalEstimateProvider() const {
   // Query the external estimate provider on certain connection types. Once the
   // updated estimates are available, OnUpdatedEstimateAvailable will be called
   // by |external_estimate_provider_| with updated estimates.
@@ -958,15 +1006,6 @@
         EXTERNAL_ESTIMATE_PROVIDER_STATUS_QUERIED);
     external_estimate_provider_->Update();
   }
-
-  // Read any cached estimates for the new network. If cached estimates are
-  // unavailable, add the default estimates.
-  if (!ReadCachedNetworkQualityEstimate())
-    AddDefaultEstimates();
-  estimated_quality_at_last_main_frame_ = nqe::internal::NetworkQuality();
-  throughput_analyzer_->OnConnectionTypeChanged();
-  MaybeRecomputeEffectiveConnectionType();
-  UpdateSignalStrength();
 }
 
 void NetworkQualityEstimator::UpdateSignalStrength() {
@@ -1170,7 +1209,7 @@
 
   // If the device is currently offline, then return
   // EFFECTIVE_CONNECTION_TYPE_OFFLINE.
-  if (GetCurrentNetworkID().type == NetworkChangeNotifier::CONNECTION_NONE)
+  if (current_network_id_.type == NetworkChangeNotifier::CONNECTION_NONE)
     return EFFECTIVE_CONNECTION_TYPE_OFFLINE;
 
   base::TimeDelta http_rtt = nqe::internal::InvalidRTT();
@@ -1355,8 +1394,7 @@
   return kbps;
 }
 
-NetworkQualityEstimator::NetworkID
-NetworkQualityEstimator::GetCurrentNetworkID() const {
+nqe::internal::NetworkID NetworkQualityEstimator::GetCurrentNetworkID() const {
   DCHECK(thread_checker_.CalledOnValidThread());
 
   // TODO(tbansal): crbug.com/498068 Add NetworkQualityEstimatorAndroid class
@@ -1369,7 +1407,7 @@
   // capture majority of cases, and should not significantly affect estimates
   // (that are approximate to begin with).
   while (true) {
-    NetworkQualityEstimator::NetworkID network_id(
+    nqe::internal::NetworkID network_id(
         NetworkChangeNotifier::GetConnectionType(), std::string());
 
     switch (network_id.type) {
@@ -1405,42 +1443,37 @@
 bool NetworkQualityEstimator::ReadCachedNetworkQualityEstimate() {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  // If the network name is unavailable, caching should not be performed.
-  if (current_network_id_.id.empty())
+  nqe::internal::CachedNetworkQuality cached_network_quality;
+
+  const bool cached_estimate_available = network_quality_store_.GetById(
+      current_network_id_, &cached_network_quality);
+  UMA_HISTOGRAM_BOOLEAN("NQE.CachedNetworkQualityAvailable",
+                        cached_estimate_available);
+
+  if (!cached_estimate_available)
     return false;
 
-  CachedNetworkQualities::const_iterator it =
-      cached_network_qualities_.find(current_network_id_);
-
-  if (it == cached_network_qualities_.end())
-    return false;
-
-  nqe::internal::NetworkQuality network_quality(it->second.network_quality());
-
   const base::TimeTicks now = tick_clock_->NowTicks();
-  bool read_cached_estimate = false;
 
-  if (network_quality.downstream_throughput_kbps() !=
+  if (cached_network_quality.network_quality().downstream_throughput_kbps() !=
       nqe::internal::kInvalidThroughput) {
-    read_cached_estimate = true;
     ThroughputObservation througphput_observation(
-        network_quality.downstream_throughput_kbps(), now,
-        NETWORK_QUALITY_OBSERVATION_SOURCE_CACHED_ESTIMATE);
+        cached_network_quality.network_quality().downstream_throughput_kbps(),
+        now, NETWORK_QUALITY_OBSERVATION_SOURCE_CACHED_ESTIMATE);
     downstream_throughput_kbps_observations_.AddObservation(
         througphput_observation);
     NotifyObserversOfThroughput(througphput_observation);
   }
 
-  if (network_quality.http_rtt() != nqe::internal::InvalidRTT()) {
-    read_cached_estimate = true;
+  if (cached_network_quality.network_quality().http_rtt() !=
+      nqe::internal::InvalidRTT()) {
     RttObservation rtt_observation(
-        network_quality.http_rtt(), now,
+        cached_network_quality.network_quality().http_rtt(), now,
         NETWORK_QUALITY_OBSERVATION_SOURCE_CACHED_ESTIMATE);
     rtt_observations_.AddObservation(rtt_observation);
     NotifyObserversOfRTT(rtt_observation);
   }
-
-  return read_cached_estimate;
+  return true;
 }
 
 void NetworkQualityEstimator::OnUpdatedEstimateAvailable(
@@ -1453,6 +1486,8 @@
   RecordExternalEstimateProviderMetrics(
       EXTERNAL_ESTIMATE_PROVIDER_STATUS_CALLBACK);
 
+  external_estimate_provider_quality_ = nqe::internal::NetworkQuality();
+
   if (rtt > base::TimeDelta()) {
     RecordExternalEstimateProviderMetrics(
         EXTERNAL_ESTIMATE_PROVIDER_STATUS_RTT_AVAILABLE);
@@ -1460,6 +1495,7 @@
     rtt_observations_.AddObservation(
         RttObservation(rtt, tick_clock_->NowTicks(),
                        NETWORK_QUALITY_OBSERVATION_SOURCE_EXTERNAL_ESTIMATE));
+    external_estimate_provider_quality_.set_http_rtt(rtt);
   }
 
   if (downstream_throughput_kbps > 0) {
@@ -1471,6 +1507,8 @@
         ThroughputObservation(
             downstream_throughput_kbps, tick_clock_->NowTicks(),
             NETWORK_QUALITY_OBSERVATION_SOURCE_EXTERNAL_ESTIMATE));
+    external_estimate_provider_quality_.set_downstream_throughput_kbps(
+        downstream_throughput_kbps);
   }
 }
 
@@ -1531,51 +1569,6 @@
   return base::RandDouble();
 }
 
-void NetworkQualityEstimator::CacheNetworkQualityEstimate() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK_LE(cached_network_qualities_.size(),
-            static_cast<size_t>(kMaximumNetworkQualityCacheSize));
-
-  // If the network name is unavailable, caching should not be performed.
-  if (current_network_id_.id.empty())
-    return;
-
-  base::TimeDelta http_rtt = nqe::internal::InvalidRTT();
-  int32_t downlink_throughput_kbps = nqe::internal::kInvalidThroughput;
-
-  if (!GetHttpRTTEstimate(&http_rtt) ||
-      !GetDownlinkThroughputKbpsEstimate(&downlink_throughput_kbps)) {
-    return;
-  }
-
-  // |transport_rtt| is currently not cached.
-  nqe::internal::NetworkQuality network_quality = nqe::internal::NetworkQuality(
-      http_rtt, nqe::internal::InvalidRTT() /* transport_rtt */,
-      downlink_throughput_kbps);
-
-  if (cached_network_qualities_.size() == kMaximumNetworkQualityCacheSize) {
-    // Remove the oldest entry.
-    CachedNetworkQualities::iterator oldest_entry_iterator =
-        cached_network_qualities_.begin();
-
-    for (CachedNetworkQualities::iterator it =
-             cached_network_qualities_.begin();
-         it != cached_network_qualities_.end(); ++it) {
-      if ((it->second).OlderThan(oldest_entry_iterator->second))
-        oldest_entry_iterator = it;
-    }
-    cached_network_qualities_.erase(oldest_entry_iterator);
-  }
-  DCHECK_LT(cached_network_qualities_.size(),
-            static_cast<size_t>(kMaximumNetworkQualityCacheSize));
-
-  cached_network_qualities_.insert(
-      std::make_pair(current_network_id_,
-                     nqe::internal::CachedNetworkQuality(network_quality)));
-  DCHECK_LE(cached_network_qualities_.size(),
-            static_cast<size_t>(kMaximumNetworkQualityCacheSize));
-}
-
 void NetworkQualityEstimator::OnUpdatedRTTAvailable(
     SocketPerformanceWatcherFactory::Protocol protocol,
     const base::TimeDelta& rtt) {
diff --git a/net/nqe/network_quality_estimator.h b/net/nqe/network_quality_estimator.h
index 44fb303..f065a77 100644
--- a/net/nqe/network_quality_estimator.h
+++ b/net/nqe/network_quality_estimator.h
@@ -10,7 +10,6 @@
 #include <map>
 #include <memory>
 #include <string>
-#include <tuple>
 
 #include "base/compiler_specific.h"
 #include "base/gtest_prod_util.h"
@@ -24,9 +23,11 @@
 #include "net/base/network_change_notifier.h"
 #include "net/nqe/cached_network_quality.h"
 #include "net/nqe/external_estimate_provider.h"
+#include "net/nqe/network_id.h"
 #include "net/nqe/network_quality.h"
 #include "net/nqe/network_quality_observation.h"
 #include "net/nqe/network_quality_observation_source.h"
+#include "net/nqe/network_quality_store.h"
 #include "net/nqe/observation_buffer.h"
 #include "net/socket/socket_performance_watcher_factory.h"
 
@@ -243,46 +244,6 @@
       EffectiveConnectionType effective_connection_type);
 
  protected:
-  // NetworkID is used to uniquely identify a network.
-  // For the purpose of network quality estimation and caching, a network is
-  // uniquely identified by a combination of |type| and
-  // |id|. This approach is unable to distinguish networks with
-  // same name (e.g., different Wi-Fi networks with same SSID).
-  // This is a protected member to expose it to tests.
-  struct NET_EXPORT_PRIVATE NetworkID {
-    NetworkID(NetworkChangeNotifier::ConnectionType type, const std::string& id)
-        : type(type), id(id) {}
-    NetworkID(const NetworkID& other) : type(other.type), id(other.id) {}
-    ~NetworkID() {}
-
-    NetworkID& operator=(const NetworkID& other) {
-      type = other.type;
-      id = other.id;
-      return *this;
-    }
-
-    // Overloaded because NetworkID is used as key in a map.
-    bool operator<(const NetworkID& other) const {
-      return std::tie(type, id) < std::tie(other.type, other.id);
-    }
-
-    // Connection type of the network.
-    NetworkChangeNotifier::ConnectionType type;
-
-    // Name of this network. This is set to:
-    // - Wi-Fi SSID if the device is connected to a Wi-Fi access point and the
-    //   SSID name is available, or
-    // - MCC/MNC code of the cellular carrier if the device is connected to a
-    //   cellular network, or
-    // - "Ethernet" in case the device is connected to ethernet.
-    // - An empty string in all other cases or if the network name is not
-    //   exposed by platform APIs.
-    std::string id;
-  };
-
-  // Returns true if the cached network quality estimate was successfully read.
-  bool ReadCachedNetworkQualityEstimate();
-
   // NetworkChangeNotifier::ConnectionTypeObserver implementation:
   void OnConnectionTypeChanged(
       NetworkChangeNotifier::ConnectionType type) override;
@@ -360,9 +321,6 @@
                            ObtainAlgorithmToUseFromParams);
   FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, HalfLifeParam);
   FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, ComputedPercentiles);
-  FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, TestCaching);
-  FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest,
-                           TestLRUCacheMaximumSize);
   FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, TestGetMetricsSince);
   FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest,
                            TestExternalEstimateProviderMergeEstimates);
@@ -376,12 +334,6 @@
   typedef nqe::internal::Observation<int32_t> ThroughputObservation;
   typedef nqe::internal::ObservationBuffer<int32_t> ThroughputObservationBuffer;
 
-  // This does not use a unordered_map or hash_map for code simplicity (key just
-  // implements operator<, rather than hash and equality) and because the map is
-  // tiny.
-  typedef std::map<NetworkID, nqe::internal::CachedNetworkQuality>
-      CachedNetworkQualities;
-
   // Algorithms supported by network quality estimator for computing effective
   // connection type.
   enum class EffectiveConnectionTypeAlgorithm {
@@ -424,15 +376,14 @@
   // kilobits per second) values.
   static const int kMinimumThroughputVariationParameterKbps = 1;
 
-  // Maximum size of the cache that holds network quality estimates.
-  // Smaller size may reduce the cache hit rate due to frequent evictions.
-  // Larger size may affect performance.
-  static const size_t kMaximumNetworkQualityCacheSize = 10;
-
   // Returns the RTT value to be used when the valid RTT is unavailable. Readers
   // should discard RTT if it is set to the value returned by |InvalidRTT()|.
   static const base::TimeDelta InvalidRTT();
 
+  // Queries external estimate provider for network quality. When the network
+  // quality is available, OnUpdatedEstimateAvailable() is called.
+  void MaybeQueryExternalEstimateProvider() const;
+
   // Records UMA when there is a change in connection type.
   void RecordMetricsOnConnectionTypeChanged() const;
 
@@ -487,10 +438,7 @@
 
   // Returns the current network ID checking by calling the platform APIs.
   // Virtualized for testing.
-  virtual NetworkID GetCurrentNetworkID() const;
-
-  // Writes the estimated quality of the current network to the cache.
-  void CacheNetworkQualityEstimate();
+  virtual nqe::internal::NetworkID GetCurrentNetworkID() const;
 
   void NotifyObserversOfRTT(const RttObservation& observation);
 
@@ -546,6 +494,9 @@
   void RecordExternalEstimateProviderMetrics(
       NQEExternalEstimateProviderStatus status) const;
 
+  // Returns true if the cached network quality estimate was successfully read.
+  bool ReadCachedNetworkQualityEstimate();
+
   // Records a correlation metric that can be used for computing the correlation
   // between HTTP-layer RTT, transport-layer RTT, throughput and the time
   // taken to complete |request|.
@@ -591,7 +542,7 @@
   base::TimeTicks last_connection_change_;
 
   // ID of the current network.
-  NetworkID current_network_id_;
+  nqe::internal::NetworkID current_network_id_;
 
   // Peak network quality (fastest round-trip-time (RTT) and highest
   // downstream throughput) measured since last connectivity change. RTT is
@@ -601,9 +552,6 @@
   // 2) Includes server processing time.
   nqe::internal::NetworkQuality peak_network_quality_;
 
-  // Cache that stores quality of previously seen networks.
-  CachedNetworkQualities cached_network_qualities_;
-
   // Buffer that holds throughput observations (in kilobits per second) sorted
   // by timestamp.
   ThroughputObservationBuffer downstream_throughput_kbps_observations_;
@@ -632,6 +580,10 @@
   nqe::internal::NetworkQuality estimated_quality_at_last_main_frame_;
   EffectiveConnectionType effective_connection_type_at_last_main_frame_;
 
+  // Estimated network quality obtained from external estimate provider when the
+  // external estimate provider was last queried.
+  nqe::internal::NetworkQuality external_estimate_provider_quality_;
+
   // ExternalEstimateProvider that provides network quality using operating
   // system APIs. May be NULL.
   const std::unique_ptr<ExternalEstimateProvider> external_estimate_provider_;
@@ -670,6 +622,9 @@
   // if it is 1.0, then it will be recorded for all valid HTTP requests.
   const double correlation_uma_logging_probability_;
 
+  // Stores the qualities of different networks.
+  nqe::internal::NetworkQualityStore network_quality_store_;
+
   base::ThreadChecker thread_checker_;
 
   base::WeakPtrFactory<NetworkQualityEstimator> weak_ptr_factory_;
diff --git a/net/nqe/network_quality_estimator_unittest.cc b/net/nqe/network_quality_estimator_unittest.cc
index 643dff52..b381ce8 100644
--- a/net/nqe/network_quality_estimator_unittest.cc
+++ b/net/nqe/network_quality_estimator_unittest.cc
@@ -269,16 +269,14 @@
   double RandDouble() const override { return rand_double_; }
 
   using NetworkQualityEstimator::SetTickClockForTesting;
-  using NetworkQualityEstimator::ReadCachedNetworkQualityEstimate;
   using NetworkQualityEstimator::OnConnectionTypeChanged;
 
  private:
   // NetworkQualityEstimator implementation that returns the overridden
   // network
   // id (instead of invoking platform APIs).
-  NetworkQualityEstimator::NetworkID GetCurrentNetworkID() const override {
-    return NetworkQualityEstimator::NetworkID(current_network_type_,
-                                              current_network_id_);
+  nqe::internal::NetworkID GetCurrentNetworkID() const override {
+    return nqe::internal::NetworkID(current_network_type_, current_network_id_);
   }
 
   bool effective_connection_type_set_;
@@ -398,6 +396,11 @@
   std::map<std::string, std::string> variation_params;
   TestNetworkQualityEstimator estimator(variation_params);
 
+  estimator.SimulateNetworkChangeTo(
+      NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN, "test");
+  histogram_tester.ExpectUniqueSample("NQE.CachedNetworkQualityAvailable",
+                                      false, 1);
+
   base::TimeDelta rtt;
   int32_t kbps;
   EXPECT_FALSE(estimator.GetHttpRTTEstimate(&rtt));
@@ -438,6 +441,8 @@
 
   estimator.SimulateNetworkChangeTo(
       NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI, "test-1");
+  histogram_tester.ExpectUniqueSample("NQE.CachedNetworkQualityAvailable",
+                                      false, 2);
   histogram_tester.ExpectTotalCount("NQE.PeakKbps.Unknown", 1);
   histogram_tester.ExpectTotalCount("NQE.FastestRTT.Unknown", 1);
 
@@ -464,6 +469,8 @@
 
   estimator.SimulateNetworkChangeTo(
       NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI, std::string());
+  histogram_tester.ExpectUniqueSample("NQE.CachedNetworkQualityAvailable",
+                                      false, 3);
   histogram_tester.ExpectTotalCount("NQE.PeakKbps.Unknown", 1);
   histogram_tester.ExpectTotalCount("NQE.FastestRTT.Unknown", 1);
 
@@ -480,6 +487,13 @@
       NetworkQualityEstimator::EffectiveConnectionType::
           EFFECTIVE_CONNECTION_TYPE_UNKNOWN,
       1);
+
+  estimator.SimulateNetworkChangeTo(
+      NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN, "test");
+  histogram_tester.ExpectBucketCount("NQE.CachedNetworkQualityAvailable", false,
+                                     3);
+  histogram_tester.ExpectBucketCount("NQE.CachedNetworkQualityAvailable", true,
+                                     1);
 }
 
 TEST(NetworkQualityEstimatorTest, StoreObservations) {
@@ -986,164 +1000,6 @@
   }
 }
 
-// Test if the network estimates are cached when network change notification
-// is invoked.
-TEST(NetworkQualityEstimatorTest, TestCaching) {
-  std::map<std::string, std::string> variation_params;
-  TestNetworkQualityEstimator estimator(variation_params);
-  size_t expected_cache_size = 0;
-  EXPECT_EQ(expected_cache_size, estimator.cached_network_qualities_.size());
-
-  // Cache entry will not be added for (NONE, "").
-  estimator.downstream_throughput_kbps_observations_.AddObservation(
-      NetworkQualityEstimator::ThroughputObservation(
-          1, base::TimeTicks::Now(),
-          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
-  estimator.rtt_observations_.AddObservation(
-      NetworkQualityEstimator::RttObservation(
-          base::TimeDelta::FromMilliseconds(1000), base::TimeTicks::Now(),
-          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
-  estimator.SimulateNetworkChangeTo(
-      NetworkChangeNotifier::ConnectionType::CONNECTION_2G, "test-1");
-  EXPECT_EQ(expected_cache_size, estimator.cached_network_qualities_.size());
-
-  // Entry will be added for (2G, "test1").
-  // Also, set the network quality for (2G, "test1") so that it is stored in
-  // the cache.
-  estimator.downstream_throughput_kbps_observations_.AddObservation(
-      NetworkQualityEstimator::ThroughputObservation(
-          1, base::TimeTicks::Now(),
-          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
-  estimator.rtt_observations_.AddObservation(
-      NetworkQualityEstimator::RttObservation(
-          base::TimeDelta::FromMilliseconds(1000), base::TimeTicks::Now(),
-          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
-
-  estimator.SimulateNetworkChangeTo(
-      NetworkChangeNotifier::ConnectionType::CONNECTION_3G, "test-1");
-  ++expected_cache_size;
-  EXPECT_EQ(expected_cache_size, estimator.cached_network_qualities_.size());
-
-  // Entry will be added for (3G, "test1").
-  // Also, set the network quality for (3G, "test1") so that it is stored in
-  // the cache.
-  estimator.downstream_throughput_kbps_observations_.AddObservation(
-      NetworkQualityEstimator::ThroughputObservation(
-          2, base::TimeTicks::Now(),
-          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
-  estimator.rtt_observations_.AddObservation(
-      NetworkQualityEstimator::RttObservation(
-          base::TimeDelta::FromMilliseconds(500), base::TimeTicks::Now(),
-          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
-  estimator.SimulateNetworkChangeTo(
-      NetworkChangeNotifier::ConnectionType::CONNECTION_3G, "test-2");
-  ++expected_cache_size;
-  EXPECT_EQ(expected_cache_size, estimator.cached_network_qualities_.size());
-
-  // Entry will not be added for (3G, "test2").
-  estimator.SimulateNetworkChangeTo(
-      NetworkChangeNotifier::ConnectionType::CONNECTION_2G, "test-1");
-  EXPECT_EQ(expected_cache_size, estimator.cached_network_qualities_.size());
-
-  // Read the network quality for (2G, "test-1").
-  EXPECT_TRUE(estimator.ReadCachedNetworkQualityEstimate());
-
-  base::TimeDelta rtt;
-  int32_t kbps;
-  EXPECT_TRUE(estimator.GetHttpRTTEstimate(&rtt));
-  EXPECT_TRUE(estimator.GetDownlinkThroughputKbpsEstimate(&kbps));
-  EXPECT_EQ(1, kbps);
-  EXPECT_EQ(base::TimeDelta::FromMilliseconds(1000), rtt);
-  EXPECT_FALSE(estimator.GetTransportRTTEstimate(&rtt));
-
-  // No new entry should be added for (2G, "test-1") since it already exists
-  // in the cache.
-  estimator.SimulateNetworkChangeTo(
-      NetworkChangeNotifier::ConnectionType::CONNECTION_3G, "test-1");
-  EXPECT_EQ(expected_cache_size, estimator.cached_network_qualities_.size());
-
-  // Read the network quality for (3G, "test-1").
-  EXPECT_TRUE(estimator.ReadCachedNetworkQualityEstimate());
-  EXPECT_TRUE(estimator.GetHttpRTTEstimate(&rtt));
-  EXPECT_TRUE(estimator.GetDownlinkThroughputKbpsEstimate(&kbps));
-  EXPECT_EQ(2, kbps);
-  EXPECT_EQ(base::TimeDelta::FromMilliseconds(500), rtt);
-  // No new entry should be added for (3G, "test1") since it already exists
-  // in the cache.
-  estimator.SimulateNetworkChangeTo(
-      NetworkChangeNotifier::ConnectionType::CONNECTION_3G, "test-2");
-  EXPECT_EQ(expected_cache_size, estimator.cached_network_qualities_.size());
-
-  // Reading quality of (3G, "test-2") should return false.
-  EXPECT_FALSE(estimator.ReadCachedNetworkQualityEstimate());
-
-  // Reading quality of (2G, "test-3") should return false.
-  estimator.SimulateNetworkChangeTo(
-      NetworkChangeNotifier::ConnectionType::CONNECTION_2G, "test-3");
-  EXPECT_FALSE(estimator.ReadCachedNetworkQualityEstimate());
-}
-
-// Tests if the cache size remains bounded. Also, ensure that the cache is
-// LRU.
-TEST(NetworkQualityEstimatorTest, TestLRUCacheMaximumSize) {
-  std::map<std::string, std::string> variation_params;
-  TestNetworkQualityEstimator estimator(variation_params);
-  estimator.SimulateNetworkChangeTo(
-      NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI, std::string());
-  EXPECT_EQ(0U, estimator.cached_network_qualities_.size());
-
-  // Add 100 more networks than the maximum size of the cache.
-  size_t network_count =
-      NetworkQualityEstimator::kMaximumNetworkQualityCacheSize + 100;
-
-  base::TimeTicks update_time_of_network_100;
-  for (size_t i = 0; i < network_count; ++i) {
-    estimator.downstream_throughput_kbps_observations_.AddObservation(
-        NetworkQualityEstimator::ThroughputObservation(
-            2, base::TimeTicks::Now(),
-            NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
-    estimator.rtt_observations_.AddObservation(
-        NetworkQualityEstimator::RttObservation(
-            base::TimeDelta::FromMilliseconds(500), base::TimeTicks::Now(),
-            NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
-
-    if (i == 100)
-      update_time_of_network_100 = base::TimeTicks::Now();
-
-    estimator.SimulateNetworkChangeTo(
-        NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI,
-        base::SizeTToString(i));
-    if (i < NetworkQualityEstimator::kMaximumNetworkQualityCacheSize)
-      EXPECT_EQ(i, estimator.cached_network_qualities_.size());
-    EXPECT_LE(estimator.cached_network_qualities_.size(),
-              static_cast<size_t>(
-                  NetworkQualityEstimator::kMaximumNetworkQualityCacheSize));
-  }
-  // One more call so that the last network is also written to cache.
-  estimator.downstream_throughput_kbps_observations_.AddObservation(
-      NetworkQualityEstimator::ThroughputObservation(
-          2, base::TimeTicks::Now(),
-          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
-  estimator.rtt_observations_.AddObservation(
-      NetworkQualityEstimator::RttObservation(
-          base::TimeDelta::FromMilliseconds(500), base::TimeTicks::Now(),
-          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
-  estimator.SimulateNetworkChangeTo(
-      NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI,
-      base::SizeTToString(network_count - 1));
-  EXPECT_EQ(static_cast<size_t>(
-                NetworkQualityEstimator::kMaximumNetworkQualityCacheSize),
-            estimator.cached_network_qualities_.size());
-
-  // Test that the cache is LRU by examining its contents. Networks in cache
-  // must all be newer than the 100th network.
-  for (NetworkQualityEstimator::CachedNetworkQualities::iterator it =
-           estimator.cached_network_qualities_.begin();
-       it != estimator.cached_network_qualities_.end(); ++it) {
-    EXPECT_GE((it->second).last_update_time_, update_time_of_network_100);
-  }
-}
-
 TEST(NetworkQualityEstimatorTest, TestGetMetricsSince) {
   std::map<std::string, std::string> variation_params;
 
@@ -1840,8 +1696,13 @@
       base::SimpleTestTickClock* tick_clock_ptr = tick_clock.get();
       tick_clock_ptr->Advance(base::TimeDelta::FromSeconds(1));
 
+      std::unique_ptr<ExternalEstimateProvider> external_estimate_provider(
+          new TestExternalEstimateProvider(test.rtt, 0));
+
       std::map<std::string, std::string> variation_params;
-      TestNetworkQualityEstimator estimator(variation_params);
+      TestNetworkQualityEstimator estimator(
+          variation_params, std::move(external_estimate_provider));
+
       estimator.SetTickClockForTesting(std::move(tick_clock));
       estimator.SimulateNetworkChangeTo(
           NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI, "test-1");
@@ -1934,6 +1795,15 @@
           "NQE.Accuracy.TransportRTT.EstimatedObservedDiff." +
               sign_suffix_with_zero_samples + "." + interval_value + ".60_140",
           0);
+
+      histogram_tester.ExpectUniqueSample(
+          "NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff." +
+              sign_suffix_with_one_sample + "." + interval_value + ".60_140",
+          diff, 1);
+      histogram_tester.ExpectTotalCount(
+          "NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff." +
+              sign_suffix_with_zero_samples + "." + interval_value + ".60_140",
+          0);
     }
   }
 }
diff --git a/net/nqe/network_quality_observation_source.h b/net/nqe/network_quality_observation_source.h
index da64c67..c1614027 100644
--- a/net/nqe/network_quality_observation_source.h
+++ b/net/nqe/network_quality_observation_source.h
@@ -32,7 +32,9 @@
   NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_FROM_PLATFORM,
 
   // The observation came from a Chromium-external source.
-  NETWORK_QUALITY_OBSERVATION_SOURCE_EXTERNAL_ESTIMATE
+  NETWORK_QUALITY_OBSERVATION_SOURCE_EXTERNAL_ESTIMATE,
+
+  NETWORK_QUALITY_OBSERVATION_SOURCE_MAX,
 };
 
 }  // namespace net
diff --git a/net/nqe/network_quality_store.cc b/net/nqe/network_quality_store.cc
new file mode 100644
index 0000000..4f74491
--- /dev/null
+++ b/net/nqe/network_quality_store.cc
@@ -0,0 +1,83 @@
+// 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 "net/nqe/network_quality_store.h"
+
+#include "net/base/network_change_notifier.h"
+
+namespace net {
+
+namespace nqe {
+
+namespace internal {
+
+NetworkQualityStore::NetworkQualityStore() {
+  static_assert(kMaximumNetworkQualityCacheSize > 0,
+                "Size of the network quality cache must be > 0");
+  // This limit should not be increased unless the logic for removing the
+  // oldest cache entry is rewritten to use a doubly-linked-list LRU queue.
+  static_assert(kMaximumNetworkQualityCacheSize <= 10,
+                "Size of the network quality cache must <= 10");
+}
+
+NetworkQualityStore::~NetworkQualityStore() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+}
+
+void NetworkQualityStore::Add(
+    const nqe::internal::NetworkID& network_id,
+    const nqe::internal::CachedNetworkQuality& cached_network_quality) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK_LE(cached_network_qualities_.size(),
+            static_cast<size_t>(kMaximumNetworkQualityCacheSize));
+
+  // If the network name is unavailable, caching should not be performed.
+  if (network_id.type != net::NetworkChangeNotifier::CONNECTION_ETHERNET &&
+      network_id.id.empty()) {
+    return;
+  }
+
+  // Remove the entry from the map, if it is already present.
+  cached_network_qualities_.erase(network_id);
+
+  if (cached_network_qualities_.size() == kMaximumNetworkQualityCacheSize) {
+    // Remove the oldest entry.
+    CachedNetworkQualities::iterator oldest_entry_iterator =
+        cached_network_qualities_.begin();
+
+    for (CachedNetworkQualities::iterator it =
+             cached_network_qualities_.begin();
+         it != cached_network_qualities_.end(); ++it) {
+      if ((it->second).OlderThan(oldest_entry_iterator->second))
+        oldest_entry_iterator = it;
+    }
+    cached_network_qualities_.erase(oldest_entry_iterator);
+  }
+
+  cached_network_qualities_.insert(
+      std::make_pair(network_id, cached_network_quality));
+  DCHECK_LE(cached_network_qualities_.size(),
+            static_cast<size_t>(kMaximumNetworkQualityCacheSize));
+}
+
+bool NetworkQualityStore::GetById(
+    const nqe::internal::NetworkID& network_id,
+    nqe::internal::CachedNetworkQuality* cached_network_quality) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+
+  CachedNetworkQualities::const_iterator it =
+      cached_network_qualities_.find(network_id);
+
+  if (it == cached_network_qualities_.end())
+    return false;
+
+  *cached_network_quality = it->second;
+  return true;
+}
+
+}  // namespace internal
+
+}  // namespace nqe
+
+}  // namespace net
diff --git a/net/nqe/network_quality_store.h b/net/nqe/network_quality_store.h
new file mode 100644
index 0000000..8ac78e9
--- /dev/null
+++ b/net/nqe/network_quality_store.h
@@ -0,0 +1,67 @@
+// 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 NET_NQE_NETWORK_QUALITY_STORE_H_
+#define NET_NQE_NETWORK_QUALITY_STORE_H_
+
+#include <map>
+
+#include "base/macros.h"
+#include "base/threading/thread_checker.h"
+#include "net/base/net_export.h"
+#include "net/nqe/cached_network_quality.h"
+#include "net/nqe/network_id.h"
+
+namespace net {
+
+namespace nqe {
+
+namespace internal {
+
+// NetworkQualityStore holds the network qualities of different networks in
+// memory. Entries are stored in LRU order, and older entries may be evicted.
+class NET_EXPORT_PRIVATE NetworkQualityStore {
+ public:
+  NetworkQualityStore();
+  ~NetworkQualityStore();
+
+  // Stores the network quality |cached_network_quality| of network with ID
+  // |network_id|.
+  void Add(const nqe::internal::NetworkID& network_id,
+           const nqe::internal::CachedNetworkQuality& cached_network_quality);
+
+  // Returns true if the network quality estimate was successfully read
+  // for a network with ID |network_id|, and sets |cached_network_quality| to
+  // the estimate read.
+  bool GetById(const nqe::internal::NetworkID& network_id,
+               nqe::internal::CachedNetworkQuality* cached_network_quality);
+
+ private:
+  // Maximum size of the store that holds network quality estimates.
+  // A smaller size may reduce the cache hit rate due to frequent evictions.
+  // A larger size may affect performance.
+  static const size_t kMaximumNetworkQualityCacheSize = 10;
+
+  // This does not use an unordered_map or hash_map for code simplicity (the key
+  // just implements operator<, rather than hash and equality) and because the
+  // map is tiny.
+  typedef std::map<nqe::internal::NetworkID,
+                   nqe::internal::CachedNetworkQuality>
+      CachedNetworkQualities;
+
+  // Data structure that stores the qualities of networks.
+  CachedNetworkQualities cached_network_qualities_;
+
+  base::ThreadChecker thread_checker_;
+
+  DISALLOW_COPY_AND_ASSIGN(NetworkQualityStore);
+};
+
+}  // namespace internal
+
+}  // namespace nqe
+
+}  // namespace net
+
+#endif  // NET_NQE_NETWORK_QUALITY_STORE_H_
diff --git a/net/nqe/network_quality_store_unittest.cc b/net/nqe/network_quality_store_unittest.cc
new file mode 100644
index 0000000..d880720
--- /dev/null
+++ b/net/nqe/network_quality_store_unittest.cc
@@ -0,0 +1,201 @@
+// 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 "net/nqe/network_quality_store.h"
+
+#include "base/strings/string_number_conversions.h"
+#include "base/test/simple_test_tick_clock.h"
+#include "base/time/time.h"
+#include "net/base/network_change_notifier.h"
+#include "net/nqe/cached_network_quality.h"
+#include "net/nqe/network_id.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace net {
+
+namespace {
+
+TEST(NetworkQualityStoreTest, TestCaching) {
+  nqe::internal::NetworkQualityStore network_quality_store;
+  base::SimpleTestTickClock tick_clock;
+
+  // Cached network quality for network with NetworkID (2G, "test1").
+  const nqe::internal::CachedNetworkQuality cached_network_quality_2g_test1(
+      tick_clock.NowTicks(),
+      nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(1),
+                                    base::TimeDelta::FromSeconds(1), 1));
+
+  {
+    // Entry will be added for (2G, "test1").
+    nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
+                                        "test1");
+    nqe::internal::CachedNetworkQuality read_network_quality(
+        tick_clock.NowTicks(),
+        nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0),
+                                      base::TimeDelta::FromSeconds(0), 0));
+    network_quality_store.Add(network_id, cached_network_quality_2g_test1);
+    EXPECT_TRUE(
+        network_quality_store.GetById(network_id, &read_network_quality));
+    EXPECT_EQ(cached_network_quality_2g_test1.network_quality(),
+              read_network_quality.network_quality());
+  }
+
+  {
+    // Entry will be added for (2G, "test2").
+    nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
+                                        "test2");
+    nqe::internal::CachedNetworkQuality read_network_quality(
+        tick_clock.NowTicks(),
+        nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0),
+                                      base::TimeDelta::FromSeconds(0), 0));
+    nqe::internal::CachedNetworkQuality cached_network_quality(
+        tick_clock.NowTicks(),
+        nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(2),
+                                      base::TimeDelta::FromSeconds(2), 2));
+    network_quality_store.Add(network_id, cached_network_quality);
+    EXPECT_TRUE(
+        network_quality_store.GetById(network_id, &read_network_quality));
+    EXPECT_EQ(read_network_quality.network_quality(),
+              cached_network_quality.network_quality());
+  }
+
+  {
+    // Entry will be added for (3G, "test3").
+    nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_3G,
+                                        "test3");
+    nqe::internal::CachedNetworkQuality read_network_quality(
+        tick_clock.NowTicks(),
+        nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0),
+                                      base::TimeDelta::FromSeconds(0), 0));
+    nqe::internal::CachedNetworkQuality cached_network_quality(
+        tick_clock.NowTicks(),
+        nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(3),
+                                      base::TimeDelta::FromSeconds(3), 3));
+    network_quality_store.Add(network_id, cached_network_quality);
+    EXPECT_TRUE(
+        network_quality_store.GetById(network_id, &read_network_quality));
+    EXPECT_EQ(read_network_quality.network_quality(),
+              cached_network_quality.network_quality());
+  }
+
+  {
+    // Entry will not be added for (Unknown, "").
+    nqe::internal::NetworkID network_id(
+        NetworkChangeNotifier::CONNECTION_UNKNOWN, "");
+    nqe::internal::CachedNetworkQuality read_network_quality(
+        tick_clock.NowTicks(),
+        nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0),
+                                      base::TimeDelta::FromSeconds(0), 0));
+    nqe::internal::CachedNetworkQuality set_network_quality(
+        tick_clock.NowTicks(),
+        nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(4),
+                                      base::TimeDelta::FromSeconds(4), 4));
+    network_quality_store.Add(network_id, set_network_quality);
+    EXPECT_FALSE(
+        network_quality_store.GetById(network_id, &read_network_quality));
+  }
+
+  {
+    // Existing entry will be read for (2G, "test1").
+    nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
+                                        "test1");
+    nqe::internal::CachedNetworkQuality read_network_quality(
+        tick_clock.NowTicks(),
+        nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0),
+                                      base::TimeDelta::FromSeconds(0), 0));
+    EXPECT_TRUE(
+        network_quality_store.GetById(network_id, &read_network_quality));
+    EXPECT_EQ(cached_network_quality_2g_test1.network_quality(),
+              read_network_quality.network_quality());
+  }
+
+  {
+    // Existing entry will be overwritten for (2G, "test1").
+    nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
+                                        "test1");
+    nqe::internal::CachedNetworkQuality read_network_quality(
+        tick_clock.NowTicks(),
+        nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0),
+                                      base::TimeDelta::FromSeconds(0), 0));
+    const nqe::internal::CachedNetworkQuality cached_network_quality(
+        tick_clock.NowTicks(),
+        nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(5),
+                                      base::TimeDelta::FromSeconds(5), 5));
+    network_quality_store.Add(network_id, cached_network_quality);
+    EXPECT_TRUE(
+        network_quality_store.GetById(network_id, &read_network_quality));
+    EXPECT_EQ(cached_network_quality.network_quality(),
+              read_network_quality.network_quality());
+  }
+
+  {
+    // No entry should exist for (2G, "test4").
+    nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
+                                        "test4");
+    nqe::internal::CachedNetworkQuality read_network_quality(
+        tick_clock.NowTicks(),
+        nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0),
+                                      base::TimeDelta::FromSeconds(0), 0));
+    EXPECT_FALSE(
+        network_quality_store.GetById(network_id, &read_network_quality));
+  }
+}
+
+// Tests if the cache size remains bounded. Also, ensure that the cache is
+// LRU.
+TEST(NetworkQualityStoreTest, TestLRUCacheMaximumSize) {
+  nqe::internal::NetworkQualityStore network_quality_store;
+  base::SimpleTestTickClock tick_clock;
+
+  // Add more networks than the maximum size of the cache.
+  const size_t network_count = 11;
+
+  nqe::internal::CachedNetworkQuality read_network_quality(
+      tick_clock.NowTicks(),
+      nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0),
+                                    base::TimeDelta::FromSeconds(0), 0));
+
+  for (size_t i = 0; i < network_count; ++i) {
+    nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
+                                        "test" + base::IntToString(i));
+
+    const nqe::internal::CachedNetworkQuality network_quality(
+        tick_clock.NowTicks(),
+        nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(1),
+                                      base::TimeDelta::FromSeconds(1), 1));
+    network_quality_store.Add(network_id, network_quality);
+    tick_clock.Advance(base::TimeDelta::FromSeconds(1));
+  }
+
+  base::TimeTicks earliest_last_update_time = tick_clock.NowTicks();
+  size_t cache_match_count = 0;
+  for (size_t i = 0; i < network_count; ++i) {
+    nqe::internal::NetworkID network_id(NetworkChangeNotifier::CONNECTION_2G,
+                                        "test" + base::IntToString(i));
+
+    nqe::internal::CachedNetworkQuality read_network_quality(
+        tick_clock.NowTicks(),
+        nqe::internal::NetworkQuality(base::TimeDelta::FromSeconds(0),
+                                      base::TimeDelta::FromSeconds(0), 0));
+    if (network_quality_store.GetById(network_id, &read_network_quality)) {
+      cache_match_count++;
+      earliest_last_update_time = std::min(
+          earliest_last_update_time, read_network_quality.last_update_time());
+    }
+  }
+
+  // Ensure that the number of entries in cache are fewer than |network_count|.
+  EXPECT_LT(cache_match_count, network_count);
+  EXPECT_GT(cache_match_count, 0u);
+
+  // Ensure that only LRU entries are cached by comparing the
+  // |earliest_last_update_time|.
+  EXPECT_EQ(
+      tick_clock.NowTicks() - base::TimeDelta::FromSeconds(cache_match_count),
+      earliest_last_update_time);
+}
+
+}  // namespace
+
+}  // namespace net
\ No newline at end of file
diff --git a/net/quic/crypto/proof_verifier_chromium_test.cc b/net/quic/crypto/proof_verifier_chromium_test.cc
index fff1bf6d..81a37102 100644
--- a/net/quic/crypto/proof_verifier_chromium_test.cc
+++ b/net/quic/crypto/proof_verifier_chromium_test.cc
@@ -118,8 +118,9 @@
         .WillRepeatedly(
             Return(ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY));
 
-    scoped_refptr<const CTLogVerifier> log(CTLogVerifier::Create(
-        ct::GetTestPublicKey(), kLogDescription, "https://test.example.com"));
+    scoped_refptr<const CTLogVerifier> log(
+        CTLogVerifier::Create(ct::GetTestPublicKey(), kLogDescription,
+                              "https://test.example.com", ""));
     ASSERT_TRUE(log);
     log_verifiers_.push_back(log);
 
diff --git a/net/quic/quic_connection_logger.cc b/net/quic/quic_connection_logger.cc
index 232b0e3..f27ba08 100644
--- a/net/quic/quic_connection_logger.cc
+++ b/net/quic/quic_connection_logger.cc
@@ -93,8 +93,6 @@
   dict->SetInteger("reset_flag", header->public_header.reset_flag);
   dict->SetInteger("version_flag", header->public_header.version_flag);
   dict->SetString("packet_number", base::Uint64ToString(header->packet_number));
-  dict->SetInteger("entropy_flag", header->entropy_flag);
-  dict->SetInteger("fec_flag", header->fec_flag);
   return std::move(dict);
 }
 
diff --git a/net/spdy/buffered_spdy_framer.cc b/net/spdy/buffered_spdy_framer.cc
index 3eed708..7a06d41e 100644
--- a/net/spdy/buffered_spdy_framer.cc
+++ b/net/spdy/buffered_spdy_framer.cc
@@ -114,12 +114,12 @@
                             control_frame_fields_->weight,
                             control_frame_fields_->parent_stream_id,
                             control_frame_fields_->exclusive,
-                            control_frame_fields_->fin, headers);
+                            control_frame_fields_->fin, std::move(headers));
         break;
       case PUSH_PROMISE:
         visitor_->OnPushPromise(control_frame_fields_->stream_id,
                                 control_frame_fields_->promised_stream_id,
-                                headers);
+                                std::move(headers));
         break;
       default:
         DCHECK(false) << "Unexpect control frame type: "
@@ -193,17 +193,17 @@
       NOTREACHED();
       break;
     case HEADERS:
-      visitor_->OnHeaders(control_frame_fields_->stream_id,
-                          control_frame_fields_->has_priority,
-                          control_frame_fields_->weight,
-                          control_frame_fields_->parent_stream_id,
-                          control_frame_fields_->exclusive,
-                          control_frame_fields_->fin, coalescer_->headers());
+      visitor_->OnHeaders(
+          control_frame_fields_->stream_id, control_frame_fields_->has_priority,
+          control_frame_fields_->weight,
+          control_frame_fields_->parent_stream_id,
+          control_frame_fields_->exclusive, control_frame_fields_->fin,
+          coalescer_->release_headers());
       break;
     case PUSH_PROMISE:
       visitor_->OnPushPromise(control_frame_fields_->stream_id,
                               control_frame_fields_->promised_stream_id,
-                              coalescer_->headers());
+                              coalescer_->release_headers());
       break;
     default:
       DCHECK(false) << "Unexpect control frame type: "
diff --git a/net/spdy/buffered_spdy_framer.h b/net/spdy/buffered_spdy_framer.h
index 20d71f1..094e27f0 100644
--- a/net/spdy/buffered_spdy_framer.h
+++ b/net/spdy/buffered_spdy_framer.h
@@ -39,7 +39,7 @@
                          SpdyStreamId parent_stream_id,
                          bool exclusive,
                          bool fin,
-                         const SpdyHeaderBlock& headers) = 0;
+                         SpdyHeaderBlock headers) = 0;
 
   // Called when a data frame header is received.
   virtual void OnDataFrameHeader(SpdyStreamId stream_id,
@@ -97,7 +97,7 @@
   // Called when a PUSH_PROMISE frame has been parsed.
   virtual void OnPushPromise(SpdyStreamId stream_id,
                              SpdyStreamId promised_stream_id,
-                             const SpdyHeaderBlock& headers) = 0;
+                             SpdyHeaderBlock headers) = 0;
 
   // Called when an ALTSVC frame has been parsed.
   virtual void OnAltSvc(
diff --git a/net/spdy/buffered_spdy_framer_unittest.cc b/net/spdy/buffered_spdy_framer_unittest.cc
index 32790591..0a851fe 100644
--- a/net/spdy/buffered_spdy_framer_unittest.cc
+++ b/net/spdy/buffered_spdy_framer_unittest.cc
@@ -45,11 +45,11 @@
                  SpdyStreamId parent_stream_id,
                  bool exclusive,
                  bool fin,
-                 const SpdyHeaderBlock& headers) override {
+                 SpdyHeaderBlock headers) override {
     header_stream_id_ = stream_id;
     EXPECT_NE(header_stream_id_, SpdyFramer::kInvalidStream);
     headers_frame_count_++;
-    headers_ = headers.Clone();
+    headers_ = std::move(headers);
   }
 
   void OnDataFrameHeader(SpdyStreamId stream_id,
@@ -103,13 +103,13 @@
 
   void OnPushPromise(SpdyStreamId stream_id,
                      SpdyStreamId promised_stream_id,
-                     const SpdyHeaderBlock& headers) override {
+                     SpdyHeaderBlock headers) override {
     header_stream_id_ = stream_id;
     EXPECT_NE(header_stream_id_, SpdyFramer::kInvalidStream);
     push_promise_frame_count_++;
     promised_stream_id_ = promised_stream_id;
     EXPECT_NE(promised_stream_id_, SpdyFramer::kInvalidStream);
-    headers_ = headers.Clone();
+    headers_ = std::move(headers);
   }
 
   void OnAltSvc(SpdyStreamId stream_id,
diff --git a/net/spdy/header_coalescer.cc b/net/spdy/header_coalescer.cc
index eb8d381..1c88fbab 100644
--- a/net/spdy/header_coalescer.cc
+++ b/net/spdy/header_coalescer.cc
@@ -4,6 +4,8 @@
 
 #include "net/spdy/header_coalescer.h"
 
+#include <utility>
+
 #include "base/strings/string_util.h"
 
 namespace net {
@@ -55,4 +57,10 @@
   }
 }
 
+SpdyHeaderBlock HeaderCoalescer::release_headers() {
+  DCHECK(headers_valid_);
+  headers_valid_ = false;
+  return std::move(headers_);
+}
+
 }  // namespace net
diff --git a/net/spdy/header_coalescer.h b/net/spdy/header_coalescer.h
index 8d393ff5..adbdc66 100644
--- a/net/spdy/header_coalescer.h
+++ b/net/spdy/header_coalescer.h
@@ -21,11 +21,12 @@
 
   void OnHeaderBlockEnd(size_t uncompressed_header_bytes) override {}
 
-  const SpdyHeaderBlock& headers() const { return headers_; }
+  SpdyHeaderBlock release_headers();
   bool error_seen() const { return error_seen_; }
 
  private:
   SpdyHeaderBlock headers_;
+  bool headers_valid_ = true;
   size_t header_list_size_ = 0;
   bool error_seen_ = false;
   bool regular_header_seen_ = false;
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc
index 37a466b..9daed1c 100644
--- a/net/spdy/spdy_session.cc
+++ b/net/spdy/spdy_session.cc
@@ -2232,7 +2232,7 @@
                             SpdyStreamId parent_stream_id,
                             bool exclusive,
                             bool fin,
-                            const SpdyHeaderBlock& headers) {
+                            SpdyHeaderBlock headers) {
   CHECK(in_io_loop_);
 
   if (net_log().IsCapturing()) {
@@ -2486,7 +2486,7 @@
 bool SpdySession::TryCreatePushStream(SpdyStreamId stream_id,
                                       SpdyStreamId associated_stream_id,
                                       SpdyPriority priority,
-                                      const SpdyHeaderBlock& headers) {
+                                      SpdyHeaderBlock headers) {
   // Server-initiated streams should have even sequence numbers.
   if ((stream_id & 0x1) != 0) {
     LOG(WARNING) << "Received invalid push stream id " << stream_id;
@@ -2661,7 +2661,7 @@
     return false;
   }
 
-  active_it->second.stream->OnPushPromiseHeadersReceived(headers);
+  active_it->second.stream->OnPushPromiseHeadersReceived(std::move(headers));
   DCHECK(active_it->second.stream->IsReservedRemote());
   num_pushed_streams_++;
   return true;
@@ -2669,7 +2669,7 @@
 
 void SpdySession::OnPushPromise(SpdyStreamId stream_id,
                                 SpdyStreamId promised_stream_id,
-                                const SpdyHeaderBlock& headers) {
+                                SpdyHeaderBlock headers) {
   CHECK(in_io_loop_);
 
   if (net_log_.IsCapturing()) {
@@ -2680,7 +2680,8 @@
 
   // Any priority will do.
   // TODO(baranovich): pass parent stream id priority?
-  if (!TryCreatePushStream(promised_stream_id, stream_id, 0, headers))
+  if (!TryCreatePushStream(promised_stream_id, stream_id, 0,
+                           std::move(headers)))
     return;
 }
 
diff --git a/net/spdy/spdy_session.h b/net/spdy/spdy_session.h
index 20652c55c..5c59115 100644
--- a/net/spdy/spdy_session.h
+++ b/net/spdy/spdy_session.h
@@ -673,7 +673,7 @@
   bool TryCreatePushStream(SpdyStreamId stream_id,
                            SpdyStreamId associated_stream_id,
                            SpdyPriority priority,
-                           const SpdyHeaderBlock& headers);
+                           SpdyHeaderBlock headers);
 
   // Close the stream pointed to by the given iterator. Note that that
   // stream may hold the last reference to the session.
@@ -874,14 +874,14 @@
   void OnWindowUpdate(SpdyStreamId stream_id, int delta_window_size) override;
   void OnPushPromise(SpdyStreamId stream_id,
                      SpdyStreamId promised_stream_id,
-                     const SpdyHeaderBlock& headers) override;
+                     SpdyHeaderBlock headers) override;
   void OnHeaders(SpdyStreamId stream_id,
                  bool has_priority,
                  int weight,
                  SpdyStreamId parent_stream_id,
                  bool exclusive,
                  bool fin,
-                 const SpdyHeaderBlock& headers) override;
+                 SpdyHeaderBlock headers) override;
   void OnAltSvc(SpdyStreamId stream_id,
                 base::StringPiece origin,
                 const SpdyAltSvcWireFormat::AlternativeServiceVector&
diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc
index fd0e31d..e4148134 100644
--- a/net/spdy/spdy_stream.cc
+++ b/net/spdy/spdy_stream.cc
@@ -465,14 +465,14 @@
   return MergeWithResponseHeaders(additional_response_headers);
 }
 
-void SpdyStream::OnPushPromiseHeadersReceived(const SpdyHeaderBlock& headers) {
+void SpdyStream::OnPushPromiseHeadersReceived(SpdyHeaderBlock headers) {
   CHECK(!request_headers_valid_);
   CHECK_EQ(io_state_, STATE_IDLE);
   CHECK_EQ(type_, SPDY_PUSH_STREAM);
   DCHECK(!delegate_);
 
   io_state_ = STATE_RESERVED_REMOTE;
-  request_headers_ = headers.Clone();
+  request_headers_ = std::move(headers);
   request_headers_valid_ = true;
   url_from_header_block_ = GetUrlFromHeaderBlock(request_headers_);
 }
diff --git a/net/spdy/spdy_stream.h b/net/spdy/spdy_stream.h
index 912def1..ce30a0a 100644
--- a/net/spdy/spdy_stream.h
+++ b/net/spdy/spdy_stream.h
@@ -307,7 +307,7 @@
 
   // Called by the SpdySession when a frame carrying request headers opening a
   // push stream is received. Stream transits to STATE_RESERVED_REMOTE state.
-  void OnPushPromiseHeadersReceived(const SpdyHeaderBlock& headers);
+  void OnPushPromiseHeadersReceived(SpdyHeaderBlock headers);
 
   // Called by the SpdySession when response data has been received
   // for this stream.  This callback may be called multiple times as
diff --git a/net/spdy/spdy_stream_unittest.cc b/net/spdy/spdy_stream_unittest.cc
index 0776b62..798d79a8 100644
--- a/net/spdy/spdy_stream_unittest.cc
+++ b/net/spdy/spdy_stream_unittest.cc
@@ -293,7 +293,7 @@
   // Set required request headers.
   SpdyHeaderBlock request_headers;
   spdy_util_.AddUrlToHeaderBlock(kStreamUrl, &request_headers);
-  stream->OnPushPromiseHeadersReceived(request_headers);
+  stream->OnPushPromiseHeadersReceived(std::move(request_headers));
 
   base::Time response_time = base::Time::Now();
   base::TimeTicks first_byte_time = base::TimeTicks::Now();
diff --git a/net/spdy/spdy_test_util_common.cc b/net/spdy/spdy_test_util_common.cc
index 757dc066..bda9c83 100644
--- a/net/spdy/spdy_test_util_common.cc
+++ b/net/spdy/spdy_test_util_common.cc
@@ -194,7 +194,7 @@
                  SpdyStreamId parent_stream_id,
                  bool exclusive,
                  bool fin,
-                 const SpdyHeaderBlock& headers) override {
+                 SpdyHeaderBlock headers) override {
     if (has_priority) {
       priority_ = Http2WeightToSpdy3Priority(weight);
     }
@@ -218,7 +218,7 @@
   void OnWindowUpdate(SpdyStreamId stream_id, int delta_window_size) override {}
   void OnPushPromise(SpdyStreamId stream_id,
                      SpdyStreamId promised_stream_id,
-                     const SpdyHeaderBlock& headers) override {}
+                     SpdyHeaderBlock headers) override {}
   void OnAltSvc(SpdyStreamId stream_id,
                 base::StringPiece origin,
                 const SpdyAltSvcWireFormat::AlternativeServiceVector&
diff --git a/remoting/client/jni/egl_thread_context.cc b/remoting/client/jni/egl_thread_context.cc
index 53bf9c9b..928d79005 100644
--- a/remoting/client/jni/egl_thread_context.cc
+++ b/remoting/client/jni/egl_thread_context.cc
@@ -14,29 +14,18 @@
   CHECK(eglGetCurrentContext() == EGL_NO_CONTEXT);
   display_ = eglGetDisplay(EGL_DEFAULT_DISPLAY);
   if (!display_ || !eglInitialize(display_, NULL, NULL)) {
-    LOG(FATAL) << "Failed to initialize EGL display.";
+    LOG(FATAL) << "Failed to initialize EGL display: " << eglGetError();
   }
 
-  const EGLint config_attribs[] = {
-    EGL_RED_SIZE, 8,
-    EGL_GREEN_SIZE, 8,
-    EGL_BLUE_SIZE, 8,
-    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
-    EGL_NONE
-  };
-
-  EGLint numConfigs;
-  if (!eglChooseConfig(display_, config_attribs, &config_, 1, &numConfigs)) {
-    LOG(FATAL) << "Failed to choose config.";
-  }
-  const EGLint context_attribs[] = {
-    EGL_CONTEXT_CLIENT_VERSION, 2,
-    EGL_NONE
-  };
-  context_ = eglCreateContext(display_, config_, EGL_NO_CONTEXT,
-                              context_attribs);
-  if (!context_) {
-    LOG(FATAL) << "Failed to create context.";
+  if (CreateContextWithClientVersion(EGL_OPENGL_ES3_BIT, GlVersion::ES_3)) {
+    client_version_ = GlVersion::ES_3;
+  } else if (CreateContextWithClientVersion(EGL_OPENGL_ES2_BIT,
+                                            GlVersion::ES_2)) {
+    LOG(WARNING) << "OpenGL ES 3 context not supported."
+                 << "Falled back to OpenGL ES 2";
+    client_version_ = GlVersion::ES_2;
+  } else {
+    LOG(FATAL) << "Failed to create context: " << eglGetError();
   }
 }
 
@@ -59,13 +48,13 @@
   if (window) {
     surface_ = eglCreateWindowSurface(display_, config_, window, NULL);
     if (!surface_) {
-      LOG(FATAL) << "Failed to create window surface.";
+      LOG(FATAL) << "Failed to create window surface: " << eglGetError();
     }
   } else {
     surface_ = EGL_NO_SURFACE;
   }
   if (!eglMakeCurrent(display_, surface_, surface_, context_)) {
-    LOG(FATAL) << "Failed to make current.";
+    LOG(FATAL) << "Failed to make current: " << eglGetError();
   }
 }
 
@@ -74,12 +63,46 @@
   return surface_ != EGL_NO_SURFACE;
 }
 
-void EglThreadContext::SwapBuffers() {
+bool EglThreadContext::SwapBuffers() {
   DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(IsWindowBound());
-  if (!eglSwapBuffers(display_, surface_)) {
-    LOG(FATAL) << "Failed to swap buffer.";
+  if (!IsWindowBound()) {
+    return false;
   }
+  if (!eglSwapBuffers(display_, surface_)) {
+    // Not fatal since the surface may be destroyed on a different thread
+    // earlier than the window is unbound. The context can still be reused
+    // after rebinding to the right window.
+    LOG(WARNING) << "Failed to swap buffer: " << eglGetError();
+    return false;
+  }
+  return true;
+}
+
+bool EglThreadContext::CreateContextWithClientVersion(
+    int renderable_type,
+    GlVersion client_version) {
+  DCHECK(client_version != GlVersion::UNKNOWN);
+  EGLint config_attribs[] = {
+     EGL_RED_SIZE, 8,
+     EGL_GREEN_SIZE, 8,
+     EGL_BLUE_SIZE, 8,
+     EGL_RENDERABLE_TYPE, renderable_type,
+     EGL_NONE
+   };
+
+   EGLint num_configs;
+   if (!eglChooseConfig(display_, config_attribs, &config_, 1, &num_configs)) {
+     LOG(WARNING) << "Failed to choose config: " << eglGetError();
+     return false;
+   }
+
+  EGLint context_attribs[] = {
+    EGL_CONTEXT_CLIENT_VERSION, static_cast<int>(client_version),
+    EGL_NONE
+  };
+  context_ = eglCreateContext(display_, config_, EGL_NO_CONTEXT,
+                              context_attribs);
+  return context_ != EGL_NO_CONTEXT;
 }
 
 }  // namespace remoting
diff --git a/remoting/client/jni/egl_thread_context.h b/remoting/client/jni/egl_thread_context.h
index f8f2b8e..aa5645c 100644
--- a/remoting/client/jni/egl_thread_context.h
+++ b/remoting/client/jni/egl_thread_context.h
@@ -12,22 +12,18 @@
 
 namespace remoting {
 
-// Establishes an EGL-OpenGL|ES2 context on current thread. Must be constructed,
-// used, and deleted on single thread (i.e. the display thread). Each thread can
-// have no more than one EglThreadContext.
-//
-// An example use case:
-// class DisplayHandler {
-//   void OnSurfaceCreated(ANativeWindow* surface) {
-//     context_.BindToWindow(surface);
-//   }
-//   void OnSurfaceDestroyed() {
-//     context_.BindToWindow(nullptr);
-//   }
-//   EglThreadContext context_;
-// };
+// Establishes an EGL-OpenGL|ES 2 (if 3 is not supported) or 3 (backward
+// compatible with 2) context on current thread. Must be constructed, used, and
+// deleted on single thread (i.e. the display thread). Each thread can have no
+// more than one EglThreadContext.
 class EglThreadContext {
  public:
+  enum class GlVersion {
+    UNKNOWN = 0,
+    ES_2 = 2,
+    ES_3 = 3
+  };
+
   EglThreadContext();
   ~EglThreadContext();
 
@@ -36,19 +32,32 @@
   // EGLNativeWindowType is platform specific. E.g. ANativeWindow* on Android.
   void BindToWindow(EGLNativeWindowType window);
 
-  // Returns true IFF the context is bound to a window (i.e. current surface is
+  // Returns true if the context is bound to a window (i.e. current surface is
   // not NULL).
   bool IsWindowBound() const;
 
-  // Posts EGL surface buffer to the window being bound. Window must be bound
-  // before calling this function.
-  void SwapBuffers();
+  // Posts EGL surface buffer to the window being bound.
+  // Returns true if the buffer is successfully swapped.
+  bool SwapBuffers();
+
+  // Returns the current OpenGL ES client version of the EGL context.
+  GlVersion client_version() const {
+    return client_version_;
+  }
 
  private:
+  // Creates an EGLContext with given |renderable_type| and |client_version|.
+  // |renderable_type| and |client_version| must match with each other.
+  // E.g. renderable_type = EGL_OPENGL_ES3_BIT,
+  //      client_version = CLIENT_VERSION_ES_3.
+  bool CreateContextWithClientVersion(int renderable_type,
+                                      GlVersion client_version);
+
   EGLDisplay display_ = EGL_NO_DISPLAY;
   EGLConfig config_ = nullptr;
   EGLSurface surface_ = EGL_NO_SURFACE;
   EGLContext context_ = EGL_NO_CONTEXT;
+  GlVersion client_version_ = GlVersion::UNKNOWN;
 
   base::ThreadChecker thread_checker_;
 
diff --git a/remoting/host/chromoting_host.cc b/remoting/host/chromoting_host.cc
index dc509fe..4cc6606 100644
--- a/remoting/host/chromoting_host.cc
+++ b/remoting/host/chromoting_host.cc
@@ -13,11 +13,11 @@
 #include "base/callback.h"
 #include "base/command_line.h"
 #include "base/memory/ptr_util.h"
+#include "base/single_thread_task_runner.h"
 #include "build/build_config.h"
 #include "jingle/glue/thread_wrapper.h"
 #include "remoting/base/constants.h"
 #include "remoting/base/logging.h"
-#include "remoting/host/chromoting_host_context.h"
 #include "remoting/host/desktop_environment.h"
 #include "remoting/host/host_config.h"
 #include "remoting/host/input_injector.h"
diff --git a/remoting/host/remoting_me2me_host.cc b/remoting/host/remoting_me2me_host.cc
index 322ff25..d214fd13 100644
--- a/remoting/host/remoting_me2me_host.cc
+++ b/remoting/host/remoting_me2me_host.cc
@@ -5,8 +5,8 @@
 // This file implements a standalone host process for Me2Me.
 
 #include <stddef.h>
-#include <stdint.h>
 
+#include <cstdint>
 #include <memory>
 #include <string>
 #include <utility>
@@ -1461,7 +1461,8 @@
                                  context_->video_encode_task_runner()));
 
   if (security_key_auth_policy_enabled_ && security_key_extension_supported_) {
-    host_->AddExtension(base::WrapUnique(new SecurityKeyExtension()));
+    host_->AddExtension(base::WrapUnique(
+        new SecurityKeyExtension(context_->file_task_runner())));
   }
 
   // TODO(simonmorris): Get the maximum session duration from a policy.
diff --git a/remoting/host/security_key/security_key_auth_handler.h b/remoting/host/security_key/security_key_auth_handler.h
index f43e1aa..fcae2db 100644
--- a/remoting/host/security_key/security_key_auth_handler.h
+++ b/remoting/host/security_key/security_key_auth_handler.h
@@ -9,10 +9,12 @@
 #include <string>
 
 #include "base/callback.h"
+#include "base/memory/ref_counted.h"
 #include "base/time/time.h"
 
 namespace base {
 class FilePath;
+class SingleThreadTaskRunner;
 }  // namespace base
 
 namespace remoting {
@@ -36,7 +38,8 @@
   // |client_session_details| will be valid until this instance is destroyed.
   static std::unique_ptr<SecurityKeyAuthHandler> Create(
       ClientSessionDetails* client_session_details,
-      const SendMessageCallback& send_message_callback);
+      const SendMessageCallback& send_message_callback,
+      scoped_refptr<base::SingleThreadTaskRunner> file_task_runner);
 
 #if defined(OS_LINUX)
   // Specify the name of the socket to listen to security key requests on.
diff --git a/remoting/host/security_key/security_key_auth_handler_android.cc b/remoting/host/security_key/security_key_auth_handler_android.cc
index d968b5f75..86c6fe9b 100644
--- a/remoting/host/security_key/security_key_auth_handler_android.cc
+++ b/remoting/host/security_key/security_key_auth_handler_android.cc
@@ -8,7 +8,8 @@
 
 std::unique_ptr<SecurityKeyAuthHandler> SecurityKeyAuthHandler::Create(
     ClientSessionDetails* client_session_details,
-    const SendMessageCallback& send_message_callback) {
+    const SendMessageCallback& send_message_callback,
+    scoped_refptr<base::SingleThreadTaskRunner> file_task_runner) {
   return nullptr;
 }
 
diff --git a/remoting/host/security_key/security_key_auth_handler_linux.cc b/remoting/host/security_key/security_key_auth_handler_linux.cc
index 346a2fe..8a29112 100644
--- a/remoting/host/security_key/security_key_auth_handler_linux.cc
+++ b/remoting/host/security_key/security_key_auth_handler_linux.cc
@@ -4,19 +4,26 @@
 
 #include "remoting/host/security_key/security_key_auth_handler.h"
 
-#include <stdint.h>
 #include <unistd.h>
 
+#include <cstdint>
+#include <map>
 #include <memory>
+#include <string>
+#include <utility>
 
 #include "base/bind.h"
+#include "base/callback.h"
+#include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/lazy_instance.h"
+#include "base/location.h"
 #include "base/logging.h"
-#include "base/stl_util.h"
+#include "base/memory/ptr_util.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "base/single_thread_task_runner.h"
 #include "base/threading/thread_checker.h"
-#include "base/threading/thread_restrictions.h"
-#include "base/values.h"
 #include "net/base/completion_callback.h"
 #include "net/base/net_errors.h"
 #include "net/socket/stream_socket.h"
@@ -53,11 +60,12 @@
 
 class SecurityKeyAuthHandlerLinux : public SecurityKeyAuthHandler {
  public:
-  SecurityKeyAuthHandlerLinux();
+  explicit SecurityKeyAuthHandlerLinux(
+      scoped_refptr<base::SingleThreadTaskRunner> file_task_runner);
   ~SecurityKeyAuthHandlerLinux() override;
 
  private:
-  typedef std::map<int, SecurityKeySocket*> ActiveSockets;
+  typedef std::map<int, std::unique_ptr<SecurityKeySocket>> ActiveSockets;
 
   // SecurityKeyAuthHandler interface.
   void CreateSecurityKeyConnection() override;
@@ -69,6 +77,9 @@
   size_t GetActiveConnectionCountForTest() const override;
   void SetRequestTimeoutForTest(base::TimeDelta timeout) override;
 
+  // Sets up the socket used for accepting new connections.
+  void CreateSocket();
+
   // Starts listening for connection.
   void DoAccept();
 
@@ -101,22 +112,28 @@
   SendMessageCallback send_message_callback_;
 
   // The last assigned security key connection id.
-  int last_connection_id_;
+  int last_connection_id_ = 0;
 
   // Sockets by connection id used to process gnubbyd requests.
   ActiveSockets active_sockets_;
 
+  // Used to perform blocking File IO.
+  scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
+
   // Timeout used for a request.
   base::TimeDelta request_timeout_;
 
+  base::WeakPtrFactory<SecurityKeyAuthHandlerLinux> weak_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(SecurityKeyAuthHandlerLinux);
 };
 
 std::unique_ptr<SecurityKeyAuthHandler> SecurityKeyAuthHandler::Create(
     ClientSessionDetails* client_session_details,
-    const SendMessageCallback& send_message_callback) {
+    const SendMessageCallback& send_message_callback,
+    scoped_refptr<base::SingleThreadTaskRunner> file_task_runner) {
   std::unique_ptr<SecurityKeyAuthHandler> auth_handler(
-      new SecurityKeyAuthHandlerLinux());
+      new SecurityKeyAuthHandlerLinux(file_task_runner));
   auth_handler->SetSendMessageCallback(send_message_callback);
   return auth_handler;
 }
@@ -126,31 +143,32 @@
   g_security_key_socket_name.Get() = security_key_socket_name;
 }
 
-SecurityKeyAuthHandlerLinux::SecurityKeyAuthHandlerLinux()
-    : last_connection_id_(0),
+SecurityKeyAuthHandlerLinux::SecurityKeyAuthHandlerLinux(
+    scoped_refptr<base::SingleThreadTaskRunner> file_task_runner)
+    : file_task_runner_(file_task_runner),
       request_timeout_(
-          base::TimeDelta::FromSeconds(kDefaultRequestTimeoutSeconds)) {}
+          base::TimeDelta::FromSeconds(kDefaultRequestTimeoutSeconds)),
+      weak_factory_(this) {}
 
-SecurityKeyAuthHandlerLinux::~SecurityKeyAuthHandlerLinux() {
-  STLDeleteValues(&active_sockets_);
-}
+SecurityKeyAuthHandlerLinux::~SecurityKeyAuthHandlerLinux() {}
 
 void SecurityKeyAuthHandlerLinux::CreateSecurityKeyConnection() {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(!g_security_key_socket_name.Get().empty());
 
-  {
-    // DeleteFile() is a blocking operation, but so is creation of the unix
-    // socket below. Consider moving this class to a different thread if this
-    // causes any problems. See crbug.com/509807.
-    // TODO(joedow): Since this code now runs as a host extension, we should
-    //               perform our IO on a separate thread: crbug.com/591739
-    base::ThreadRestrictions::ScopedAllowIO allow_io;
+  // We need to run the DeleteFile method on |file_task_runner_| as it is a
+  // blocking function call which cannot be run on the main thread.  Once
+  // that task has completed, the main thread will be called back and we will
+  // resume setting up our security key auth socket there.
+  file_task_runner_->PostTaskAndReply(
+      FROM_HERE, base::Bind(base::IgnoreResult(&base::DeleteFile),
+                            g_security_key_socket_name.Get(), false),
+      base::Bind(&SecurityKeyAuthHandlerLinux::CreateSocket,
+                 weak_factory_.GetWeakPtr()));
+}
 
-    // If the file already exists, a socket in use error is returned.
-    base::DeleteFile(g_security_key_socket_name.Get(), false);
-  }
-
+void SecurityKeyAuthHandlerLinux::CreateSocket() {
+  DCHECK(thread_checker_.CalledOnValidThread());
   HOST_LOG << "Listening for security key requests on "
            << g_security_key_socket_name.Get().value();
 
@@ -212,6 +230,7 @@
 }
 
 void SecurityKeyAuthHandlerLinux::DoAccept() {
+  DCHECK(thread_checker_.CalledOnValidThread());
   int result = auth_socket_->Accept(
       &accept_socket_, base::Bind(&SecurityKeyAuthHandlerLinux::OnAccepted,
                                   base::Unretained(this)));
@@ -233,7 +252,7 @@
       std::move(accept_socket_), request_timeout_,
       base::Bind(&SecurityKeyAuthHandlerLinux::RequestTimedOut,
                  base::Unretained(this), security_key_connection_id));
-  active_sockets_[security_key_connection_id] = socket;
+  active_sockets_[security_key_connection_id] = base::WrapUnique(socket);
   socket->StartReadingRequest(
       base::Bind(&SecurityKeyAuthHandlerLinux::OnReadComplete,
                  base::Unretained(this), security_key_connection_id));
@@ -272,7 +291,6 @@
 void SecurityKeyAuthHandlerLinux::SendErrorAndCloseActiveSocket(
     const ActiveSockets::const_iterator& iter) {
   iter->second->SendSshError();
-  delete iter->second;
   active_sockets_.erase(iter);
 }
 
diff --git a/remoting/host/security_key/security_key_auth_handler_linux_unittest.cc b/remoting/host/security_key/security_key_auth_handler_linux_unittest.cc
index 1d36b28..d9c43284 100644
--- a/remoting/host/security_key/security_key_auth_handler_linux_unittest.cc
+++ b/remoting/host/security_key/security_key_auth_handler_linux_unittest.cc
@@ -4,21 +4,22 @@
 
 #include <stddef.h>
 
+#include <memory>
+#include <string>
+
+#include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/macros.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
-#include "base/strings/stringprintf.h"
-#include "base/timer/mock_timer.h"
-#include "base/values.h"
+#include "base/threading/thread.h"
 #include "net/base/io_buffer.h"
 #include "net/base/net_errors.h"
 #include "net/base/test_completion_callback.h"
 #include "net/socket/unix_domain_client_socket_posix.h"
 #include "remoting/host/security_key/security_key_auth_handler.h"
 #include "remoting/host/security_key/security_key_socket.h"
-#include "remoting/proto/internal.pb.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace remoting {
@@ -44,26 +45,45 @@
     0x5e, 0xa3, 0xbc, 0x02, 0x5b, 0xec, 0xe4, 0x4b, 0xae, 0x0e, 0xf2, 0xbd,
     0xc8, 0xaa};
 
+void RunUntilIdle() {
+  base::RunLoop run_loop;
+  run_loop.RunUntilIdle();
+}
+
 }  // namespace
 
 class SecurityKeyAuthHandlerLinuxTest : public testing::Test {
  public:
   SecurityKeyAuthHandlerLinuxTest()
-      : run_loop_(new base::RunLoop()), last_connection_id_received_(-1) {
+      : run_loop_(new base::RunLoop()),
+        file_thread_("SecurityKeyAuthHandlerLinuxTest_FileThread") {
     EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
     socket_path_ = temp_dir_.path().Append(kSocketFilename);
     remoting::SecurityKeyAuthHandler::SetSecurityKeySocketName(socket_path_);
 
+    EXPECT_TRUE(file_thread_.StartWithOptions(
+        base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
+
     send_message_callback_ =
         base::Bind(&SecurityKeyAuthHandlerLinuxTest::SendMessageToClient,
                    base::Unretained(this));
+
     auth_handler_ = remoting::SecurityKeyAuthHandler::Create(
-        nullptr, send_message_callback_);
+        /*client_session_details=*/nullptr, send_message_callback_,
+        file_thread_.task_runner());
+    EXPECT_NE(auth_handler_.get(), nullptr);
   }
 
-  void WaitForSendMessageToClient() {
+  void CreateSocketAndWait() {
+    ASSERT_EQ(0u, auth_handler_->GetActiveConnectionCountForTest());
+    auth_handler_->CreateSecurityKeyConnection();
+
+    ASSERT_TRUE(file_thread_.task_runner()->PostTaskAndReply(
+        FROM_HERE, base::Bind(&RunUntilIdle), run_loop_->QuitClosure()));
     run_loop_->Run();
     run_loop_.reset(new base::RunLoop);
+
+    ASSERT_EQ(0u, auth_handler_->GetActiveConnectionCountForTest());
   }
 
   void SendMessageToClient(int connection_id, const std::string& data) {
@@ -72,6 +92,11 @@
     run_loop_->Quit();
   }
 
+  void WaitForSendMessageToClient() {
+    run_loop_->Run();
+    run_loop_.reset(new base::RunLoop);
+  }
+
   void CheckHostDataMessage(int id, const std::string& expected_data) {
     ASSERT_EQ(id, last_connection_id_received_);
     ASSERT_EQ(expected_data.length(), last_message_received_.length());
@@ -117,12 +142,14 @@
   base::MessageLoopForIO message_loop_;
   std::unique_ptr<base::RunLoop> run_loop_;
 
+  base::Thread file_thread_;
+
   // Object under test.
   std::unique_ptr<SecurityKeyAuthHandler> auth_handler_;
 
   SecurityKeyAuthHandler::SendMessageCallback send_message_callback_;
 
-  int last_connection_id_received_;
+  int last_connection_id_received_ = -1;
   std::string last_message_received_;
 
   base::ScopedTempDir temp_dir_;
@@ -134,9 +161,7 @@
 };
 
 TEST_F(SecurityKeyAuthHandlerLinuxTest, NotClosedAfterRequest) {
-  ASSERT_EQ(0u, auth_handler_->GetActiveConnectionCountForTest());
-
-  auth_handler_->CreateSecurityKeyConnection();
+  CreateSocketAndWait();
 
   net::UnixDomainClientSocket client_socket(socket_path_.value(), false);
   net::TestCompletionCallback connect_callback;
@@ -156,9 +181,7 @@
 }
 
 TEST_F(SecurityKeyAuthHandlerLinuxTest, HandleTwoRequests) {
-  ASSERT_EQ(0u, auth_handler_->GetActiveConnectionCountForTest());
-
-  auth_handler_->CreateSecurityKeyConnection();
+  CreateSocketAndWait();
 
   net::UnixDomainClientSocket client_socket(socket_path_.value(), false);
   net::TestCompletionCallback connect_callback;
@@ -186,9 +209,7 @@
 }
 
 TEST_F(SecurityKeyAuthHandlerLinuxTest, HandleTwoIndependentRequests) {
-  ASSERT_EQ(0u, auth_handler_->GetActiveConnectionCountForTest());
-
-  auth_handler_->CreateSecurityKeyConnection();
+  CreateSocketAndWait();
 
   net::UnixDomainClientSocket client_socket(socket_path_.value(), false);
   net::TestCompletionCallback connect_callback;
@@ -221,8 +242,7 @@
 }
 
 TEST_F(SecurityKeyAuthHandlerLinuxTest, DidReadTimeout) {
-  ASSERT_EQ(0u, auth_handler_->GetActiveConnectionCountForTest());
-  auth_handler_->CreateSecurityKeyConnection();
+  CreateSocketAndWait();
 
   net::UnixDomainClientSocket client_socket(socket_path_.value(), false);
   net::TestCompletionCallback connect_callback;
@@ -233,8 +253,7 @@
 }
 
 TEST_F(SecurityKeyAuthHandlerLinuxTest, ClientErrorMessageDelivered) {
-  ASSERT_EQ(0u, auth_handler_->GetActiveConnectionCountForTest());
-  auth_handler_->CreateSecurityKeyConnection();
+  CreateSocketAndWait();
 
   net::UnixDomainClientSocket client_socket(socket_path_.value(), false);
   net::TestCompletionCallback connect_callback;
diff --git a/remoting/host/security_key/security_key_auth_handler_mac.cc b/remoting/host/security_key/security_key_auth_handler_mac.cc
index ac5a15df..5bff344 100644
--- a/remoting/host/security_key/security_key_auth_handler_mac.cc
+++ b/remoting/host/security_key/security_key_auth_handler_mac.cc
@@ -10,7 +10,8 @@
 
 std::unique_ptr<SecurityKeyAuthHandler> SecurityKeyAuthHandler::Create(
     ClientSessionDetails* client_session_details,
-    const SendMessageCallback& send_message_callback) {
+    const SendMessageCallback& send_message_callback,
+    scoped_refptr<base::SingleThreadTaskRunner> file_task_runner) {
   return nullptr;
 }
 
diff --git a/remoting/host/security_key/security_key_auth_handler_win.cc b/remoting/host/security_key/security_key_auth_handler_win.cc
index bf023b8e..8496227 100644
--- a/remoting/host/security_key/security_key_auth_handler_win.cc
+++ b/remoting/host/security_key/security_key_auth_handler_win.cc
@@ -133,7 +133,8 @@
 
 std::unique_ptr<SecurityKeyAuthHandler> SecurityKeyAuthHandler::Create(
     ClientSessionDetails* client_session_details,
-    const SendMessageCallback& send_message_callback) {
+    const SendMessageCallback& send_message_callback,
+    scoped_refptr<base::SingleThreadTaskRunner> file_task_runner) {
   std::unique_ptr<SecurityKeyAuthHandler> auth_handler(
       new SecurityKeyAuthHandlerWin(client_session_details));
   auth_handler->SetSendMessageCallback(send_message_callback);
diff --git a/remoting/host/security_key/security_key_auth_handler_win_unittest.cc b/remoting/host/security_key/security_key_auth_handler_win_unittest.cc
index 8f52476..af5c5b8 100644
--- a/remoting/host/security_key/security_key_auth_handler_win_unittest.cc
+++ b/remoting/host/security_key/security_key_auth_handler_win_unittest.cc
@@ -122,7 +122,8 @@
   auth_handler_ = remoting::SecurityKeyAuthHandler::Create(
       &mock_client_session_details_,
       base::Bind(&SecurityKeyAuthHandlerWinTest::SendMessageToClient,
-                 base::Unretained(this)));
+                 base::Unretained(this)),
+      /*file_task_runner=*/nullptr);
 }
 
 SecurityKeyAuthHandlerWinTest::~SecurityKeyAuthHandlerWinTest() {}
diff --git a/remoting/host/security_key/security_key_extension.cc b/remoting/host/security_key/security_key_extension.cc
index 0ab94033..4007ec4 100644
--- a/remoting/host/security_key/security_key_extension.cc
+++ b/remoting/host/security_key/security_key_extension.cc
@@ -5,6 +5,8 @@
 #include "remoting/host/security_key/security_key_extension.h"
 
 #include "base/memory/ptr_util.h"
+#include "base/memory/ref_counted.h"
+#include "base/single_thread_task_runner.h"
 #include "remoting/host/security_key/security_key_extension_session.h"
 
 namespace {
@@ -15,7 +17,9 @@
 
 namespace remoting {
 
-SecurityKeyExtension::SecurityKeyExtension() {}
+SecurityKeyExtension::SecurityKeyExtension(
+    scoped_refptr<base::SingleThreadTaskRunner> file_task_runner)
+    : file_task_runner_(file_task_runner) {}
 
 SecurityKeyExtension::~SecurityKeyExtension() {}
 
@@ -31,7 +35,7 @@
   //               extension will only send messages through the initial
   //               |client_stub| and |details| with the current design.
   return base::WrapUnique(
-      new SecurityKeyExtensionSession(details, client_stub));
+      new SecurityKeyExtensionSession(details, client_stub, file_task_runner_));
 }
 
 }  // namespace remoting
diff --git a/remoting/host/security_key/security_key_extension.h b/remoting/host/security_key/security_key_extension.h
index 4f4fc4c2..e5f8b32 100644
--- a/remoting/host/security_key/security_key_extension.h
+++ b/remoting/host/security_key/security_key_extension.h
@@ -9,8 +9,13 @@
 #include <string>
 
 #include "base/macros.h"
+#include "base/memory/ref_counted.h"
 #include "remoting/host/host_extension.h"
 
+namespace base {
+class SingleThreadTaskRunner;
+}  // namespace base
+
 namespace remoting {
 
 class ClientSessionDetails;
@@ -19,7 +24,8 @@
 // SecurityKeyExtension extends HostExtension to enable Security Key support.
 class SecurityKeyExtension : public HostExtension {
  public:
-  SecurityKeyExtension();
+  explicit SecurityKeyExtension(
+      scoped_refptr<base::SingleThreadTaskRunner> file_task_runner);
   ~SecurityKeyExtension() override;
 
   // HostExtension interface.
@@ -29,6 +35,9 @@
       protocol::ClientStub* client_stub) override;
 
  private:
+  // Allows underlying auth handler to perform blocking file IO.
+  scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
+
   DISALLOW_COPY_AND_ASSIGN(SecurityKeyExtension);
 };
 
diff --git a/remoting/host/security_key/security_key_extension_session.cc b/remoting/host/security_key/security_key_extension_session.cc
index a1e1287..8bac891 100644
--- a/remoting/host/security_key/security_key_extension_session.cc
+++ b/remoting/host/security_key/security_key_extension_session.cc
@@ -9,6 +9,7 @@
 #include "base/json/json_writer.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/single_thread_task_runner.h"
 #include "base/values.h"
 #include "remoting/base/logging.h"
 #include "remoting/host/client_session_details.h"
@@ -62,14 +63,16 @@
 
 SecurityKeyExtensionSession::SecurityKeyExtensionSession(
     ClientSessionDetails* client_session_details,
-    protocol::ClientStub* client_stub)
+    protocol::ClientStub* client_stub,
+    scoped_refptr<base::SingleThreadTaskRunner> file_task_runner)
     : client_stub_(client_stub) {
   DCHECK(client_stub_);
 
   security_key_auth_handler_ = remoting::SecurityKeyAuthHandler::Create(
       client_session_details,
       base::Bind(&SecurityKeyExtensionSession::SendMessageToClient,
-                 base::Unretained(this)));
+                 base::Unretained(this)),
+      file_task_runner);
 }
 
 SecurityKeyExtensionSession::~SecurityKeyExtensionSession() {}
diff --git a/remoting/host/security_key/security_key_extension_session.h b/remoting/host/security_key/security_key_extension_session.h
index ee46789..f0365a5 100644
--- a/remoting/host/security_key/security_key_extension_session.h
+++ b/remoting/host/security_key/security_key_extension_session.h
@@ -10,12 +10,14 @@
 
 #include "base/callback.h"
 #include "base/macros.h"
+#include "base/memory/ref_counted.h"
 #include "base/threading/thread_checker.h"
 #include "remoting/host/host_extension_session.h"
 
 namespace base {
 class DictionaryValue;
-}
+class SingleThreadTaskRunner;
+}  // namespace base
 
 namespace remoting {
 
@@ -29,8 +31,10 @@
 // A HostExtensionSession implementation that enables Security Key support.
 class SecurityKeyExtensionSession : public HostExtensionSession {
  public:
-  SecurityKeyExtensionSession(ClientSessionDetails* client_session_details,
-                              protocol::ClientStub* client_stub);
+  SecurityKeyExtensionSession(
+      ClientSessionDetails* client_session_details,
+      protocol::ClientStub* client_stub,
+      scoped_refptr<base::SingleThreadTaskRunner> file_task_runner);
   ~SecurityKeyExtensionSession() override;
 
   // HostExtensionSession interface.
diff --git a/remoting/host/security_key/security_key_extension_session_unittest.cc b/remoting/host/security_key/security_key_extension_session_unittest.cc
index 229f7447..115a9e2 100644
--- a/remoting/host/security_key/security_key_extension_session_unittest.cc
+++ b/remoting/host/security_key/security_key_extension_session_unittest.cc
@@ -169,7 +169,9 @@
 
 SecurityKeyExtensionSessionTest::SecurityKeyExtensionSessionTest()
     : security_key_extension_session_(
-          new SecurityKeyExtensionSession(&client_details_, &client_stub_)) {
+          new SecurityKeyExtensionSession(&client_details_,
+                                          &client_stub_,
+                                          /*file_task_runner=*/nullptr)) {
   // We want to retain ownership of mock object so we can use it to inject
   // events into the extension session.  The mock object should not be used
   // once |security_key_extension_session_| is destroyed.
diff --git a/remoting/protocol/connection_unittest.cc b/remoting/protocol/connection_unittest.cc
index aba7ba3..4f7b362 100644
--- a/remoting/protocol/connection_unittest.cc
+++ b/remoting/protocol/connection_unittest.cc
@@ -348,5 +348,26 @@
   WaitFirstVideoFrame();
 }
 
+TEST_P(ConnectionTest, DestroyOnIncomingMessage) {
+  Connect();
+
+  KeyEvent event;
+  event.set_usb_keycode(3);
+  event.set_pressed(true);
+
+  base::RunLoop run_loop;
+
+  EXPECT_CALL(host_event_handler_,
+              OnInputEventReceived(host_connection_.get(), _));
+  EXPECT_CALL(host_input_stub_, InjectKeyEvent(EqualsKeyEvent(event)))
+      .WillOnce(DoAll(InvokeWithoutArgs(this, &ConnectionTest::DestroyHost),
+                      QuitRunLoop(&run_loop)));
+
+  // Send key event from the client.
+  client_connection_->input_stub()->InjectKeyEvent(event);
+
+  run_loop.Run();
+}
+
 }  // namespace protocol
 }  // namespace remoting
diff --git a/remoting/protocol/webrtc_data_stream_adapter.cc b/remoting/protocol/webrtc_data_stream_adapter.cc
index 85009b6..b92f2d37 100644
--- a/remoting/protocol/webrtc_data_stream_adapter.cc
+++ b/remoting/protocol/webrtc_data_stream_adapter.cc
@@ -15,71 +15,39 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "net/base/net_errors.h"
 #include "remoting/base/compound_buffer.h"
-#include "remoting/protocol/message_pipe.h"
 #include "remoting/protocol/message_serialization.h"
 
 namespace remoting {
 namespace protocol {
 
-namespace {
-
-class WebrtcDataChannel : public MessagePipe,
-                          public webrtc::DataChannelObserver {
- public:
-  explicit WebrtcDataChannel(
-      rtc::scoped_refptr<webrtc::DataChannelInterface> channel);
-  ~WebrtcDataChannel() override;
-
-  std::string name() { return channel_->label(); }
-
-  // MessagePipe interface.
-  void Start(EventHandler* event_handler) override;
-  void Send(google::protobuf::MessageLite* message,
-            const base::Closure& done) override;
-
- private:
-  enum class State { CONNECTING, OPEN, CLOSED };
-
-  // webrtc::DataChannelObserver interface.
-  void OnStateChange() override;
-  void OnMessage(const webrtc::DataBuffer& buffer) override;
-
-  void OnConnected();
-
-  void OnClosed();
-
-  rtc::scoped_refptr<webrtc::DataChannelInterface> channel_;
-
-  EventHandler* event_handler_ = nullptr;
-
-  State state_ = State::CONNECTING;
-
-  DISALLOW_COPY_AND_ASSIGN(WebrtcDataChannel);
-};
-
-WebrtcDataChannel::WebrtcDataChannel(
+WebrtcDataStreamAdapter::WebrtcDataStreamAdapter(
     rtc::scoped_refptr<webrtc::DataChannelInterface> channel)
-    : channel_(channel) {
+    : channel_(channel.get()) {
   channel_->RegisterObserver(this);
   DCHECK_EQ(channel_->state(), webrtc::DataChannelInterface::kConnecting);
 }
 
-WebrtcDataChannel::~WebrtcDataChannel() {
+WebrtcDataStreamAdapter::~WebrtcDataStreamAdapter() {
   if (channel_) {
     channel_->UnregisterObserver();
     channel_->Close();
+
+    // Destroy |channel_| asynchronously as it may be on stack.
+    channel_->AddRef();
+    base::ThreadTaskRunnerHandle::Get()->ReleaseSoon(FROM_HERE, channel_.get());
+    channel_ = nullptr;
   }
 }
 
-void WebrtcDataChannel::Start(EventHandler* event_handler) {
+void WebrtcDataStreamAdapter::Start(EventHandler* event_handler) {
   DCHECK(!event_handler_);
   DCHECK(event_handler);
 
   event_handler_ = event_handler;
 }
 
-void WebrtcDataChannel::Send(google::protobuf::MessageLite* message,
-                             const base::Closure& done) {
+void WebrtcDataStreamAdapter::Send(google::protobuf::MessageLite* message,
+                                   const base::Closure& done) {
   DCHECK(state_ == State::OPEN);
 
   rtc::CopyOnWriteBuffer buffer;
@@ -97,7 +65,7 @@
     done.Run();
 }
 
-void WebrtcDataChannel::OnStateChange() {
+void WebrtcDataStreamAdapter::OnStateChange() {
   switch (channel_->state()) {
     case webrtc::DataChannelInterface::kOpen:
       DCHECK(state_ == State::CONNECTING);
@@ -118,7 +86,7 @@
   }
 }
 
-void WebrtcDataChannel::OnMessage(const webrtc::DataBuffer& rtc_buffer) {
+void WebrtcDataStreamAdapter::OnMessage(const webrtc::DataBuffer& rtc_buffer) {
   if (state_ != State::OPEN) {
     LOG(ERROR) << "Dropping a message received when the channel is not open.";
     return;
@@ -131,25 +99,5 @@
   event_handler_->OnMessageReceived(std::move(buffer));
 }
 
-}  // namespace
-
-WebrtcDataStreamAdapter::WebrtcDataStreamAdapter(
-    rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection)
-    : peer_connection_(peer_connection) {}
-WebrtcDataStreamAdapter::~WebrtcDataStreamAdapter() {}
-
-std::unique_ptr<MessagePipe> WebrtcDataStreamAdapter::CreateOutgoingChannel(
-    const std::string& name) {
-  webrtc::DataChannelInit config;
-  config.reliable = true;
-  return base::WrapUnique(new WebrtcDataChannel(
-      peer_connection_->CreateDataChannel(name, &config)));
-}
-
-std::unique_ptr<MessagePipe> WebrtcDataStreamAdapter::WrapIncomingDataChannel(
-    rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel) {
-  return base::WrapUnique(new WebrtcDataChannel(data_channel));
-}
-
 }  // namespace protocol
 }  // namespace remoting
diff --git a/remoting/protocol/webrtc_data_stream_adapter.h b/remoting/protocol/webrtc_data_stream_adapter.h
index ad1c1b4..bb2a227 100644
--- a/remoting/protocol/webrtc_data_stream_adapter.h
+++ b/remoting/protocol/webrtc_data_stream_adapter.h
@@ -10,36 +10,44 @@
 
 #include "base/callback.h"
 #include "base/macros.h"
-#include "remoting/protocol/errors.h"
-#include "remoting/protocol/message_channel_factory.h"
+#include "remoting/protocol/message_pipe.h"
 #include "third_party/webrtc/api/peerconnectioninterface.h"
 #include "third_party/webrtc/base/refcount.h"
 
-namespace rtc {
-class PeerConnectionInterface;
-}  // namespace rtc
-
 namespace remoting {
 namespace protocol {
 
-// WebrtcDataStreamAdapter wraps MessagePipe for WebRTC data channels.
-class WebrtcDataStreamAdapter {
+// WebrtcDataStreamAdapter implements MessagePipe for WebRTC data channels.
+class WebrtcDataStreamAdapter : public MessagePipe,
+                                public webrtc::DataChannelObserver {
  public:
-  typedef base::Callback<void(ErrorCode)> ErrorCallback;
-
   explicit WebrtcDataStreamAdapter(
-      rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection);
-  ~WebrtcDataStreamAdapter();
+      rtc::scoped_refptr<webrtc::DataChannelInterface> channel);
+  ~WebrtcDataStreamAdapter() override;
 
-  // Creates outgoing data channel.
-  std::unique_ptr<MessagePipe> CreateOutgoingChannel(const std::string& name);
+  std::string name() { return channel_->label(); }
 
-  // Creates incoming data channel.
-  std::unique_ptr<MessagePipe> WrapIncomingDataChannel(
-      rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel);
+  // MessagePipe interface.
+  void Start(EventHandler* event_handler) override;
+  void Send(google::protobuf::MessageLite* message,
+            const base::Closure& done) override;
 
  private:
-  rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;
+  enum class State { CONNECTING, OPEN, CLOSED };
+
+  // webrtc::DataChannelObserver interface.
+  void OnStateChange() override;
+  void OnMessage(const webrtc::DataBuffer& buffer) override;
+
+  void OnConnected();
+
+  void OnClosed();
+
+  rtc::scoped_refptr<webrtc::DataChannelInterface> channel_;
+
+  EventHandler* event_handler_ = nullptr;
+
+  State state_ = State::CONNECTING;
 
   DISALLOW_COPY_AND_ASSIGN(WebrtcDataStreamAdapter);
 };
diff --git a/remoting/protocol/webrtc_transport.cc b/remoting/protocol/webrtc_transport.cc
index ac3b6b3..c813e6e 100644
--- a/remoting/protocol/webrtc_transport.cc
+++ b/remoting/protocol/webrtc_transport.cc
@@ -135,9 +135,89 @@
   DISALLOW_COPY_AND_ASSIGN(SetSessionDescriptionObserver);
 };
 
-
 }  // namespace
 
+class WebrtcTransport::PeerConnectionWrapper
+    : public webrtc::PeerConnectionObserver {
+ public:
+  PeerConnectionWrapper(
+      rtc::Thread* worker_thread,
+      std::unique_ptr<cricket::WebRtcVideoEncoderFactory> encoder_factory,
+      std::unique_ptr<cricket::PortAllocator> port_allocator,
+      base::WeakPtr<WebrtcTransport> transport)
+      : transport_(transport) {
+    peer_connection_factory_ = webrtc::CreatePeerConnectionFactory(
+        worker_thread, rtc::Thread::Current(), &fake_audio_device_module_,
+        encoder_factory.release(), nullptr);
+
+    webrtc::FakeConstraints constraints;
+    constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
+                             webrtc::MediaConstraintsInterface::kValueTrue);
+    peer_connection_ = peer_connection_factory_->CreatePeerConnection(
+        webrtc::PeerConnectionInterface::RTCConfiguration(), &constraints,
+        std::move(port_allocator), nullptr, this);
+  }
+  virtual ~PeerConnectionWrapper() { peer_connection_->Close(); }
+
+  webrtc::PeerConnectionInterface* peer_connection() {
+    return peer_connection_.get();
+  }
+
+  webrtc::PeerConnectionFactoryInterface* peer_connection_factory() {
+    return peer_connection_factory_.get();
+  }
+
+  // webrtc::PeerConnectionObserver interface.
+  void OnSignalingChange(
+      webrtc::PeerConnectionInterface::SignalingState new_state) override {
+    if (transport_)
+      transport_->OnSignalingChange(new_state);
+  }
+  void OnAddStream(
+      rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override {
+    if (transport_)
+      transport_->OnAddStream(stream);
+  }
+  void OnRemoveStream(
+      rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override {
+    if (transport_)
+      transport_->OnRemoveStream(stream);
+  }
+  void OnDataChannel(
+      rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel) override {
+    if (transport_)
+      transport_->OnDataChannel(data_channel);
+  }
+  void OnRenegotiationNeeded() override {
+    if (transport_)
+      transport_->OnRenegotiationNeeded();
+  }
+  void OnIceConnectionChange(
+      webrtc::PeerConnectionInterface::IceConnectionState new_state) override {
+    if (transport_)
+      transport_->OnIceConnectionChange(new_state);
+  }
+  void OnIceGatheringChange(
+      webrtc::PeerConnectionInterface::IceGatheringState new_state) override {
+    if (transport_)
+      transport_->OnIceGatheringChange(new_state);
+  }
+  void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override {
+    if (transport_)
+      transport_->OnIceCandidate(candidate);
+  }
+
+ private:
+  webrtc::FakeAudioDeviceModule fake_audio_device_module_;
+  scoped_refptr<webrtc::PeerConnectionFactoryInterface>
+      peer_connection_factory_;
+  scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;
+
+  base::WeakPtr<WebrtcTransport> transport_;
+
+  DISALLOW_COPY_AND_ASSIGN(PeerConnectionWrapper);
+};
+
 WebrtcTransport::WebrtcTransport(
     rtc::Thread* worker_thread,
     scoped_refptr<TransportContext> transport_context,
@@ -150,11 +230,28 @@
   transport_context_->set_relay_mode(TransportContext::RelayMode::TURN);
 }
 
-WebrtcTransport::~WebrtcTransport() {}
+WebrtcTransport::~WebrtcTransport() {
+  Close(OK);
+}
+
+webrtc::PeerConnectionInterface* WebrtcTransport::peer_connection() {
+  return peer_connection_wrapper_ ? peer_connection_wrapper_->peer_connection()
+                                  : nullptr;
+}
+
+webrtc::PeerConnectionFactoryInterface*
+WebrtcTransport::peer_connection_factory() {
+  return peer_connection_wrapper_
+             ? peer_connection_wrapper_->peer_connection_factory()
+             : nullptr;
+}
 
 std::unique_ptr<MessagePipe> WebrtcTransport::CreateOutgoingChannel(
     const std::string& name) {
-  return data_stream_adapter_->CreateOutgoingChannel(name);
+  webrtc::DataChannelInit config;
+  config.reliable = true;
+  return base::WrapUnique(new WebrtcDataStreamAdapter(
+      peer_connection()->CreateDataChannel(name, &config)));
 }
 
 void WebrtcTransport::Start(
@@ -174,30 +271,15 @@
     LOG(FATAL) << "HMAC::Init() failed.";
   }
 
-  fake_audio_device_module_.reset(new webrtc::FakeAudioDeviceModule());
   video_encoder_factory_ = new remoting::WebrtcVideoEncoderFactory();
-
-  // Takes ownership of video_encoder_factory_
-  peer_connection_factory_ = webrtc::CreatePeerConnectionFactory(
-      worker_thread_, rtc::Thread::Current(), fake_audio_device_module_.get(),
-      video_encoder_factory_, nullptr);
-
-  webrtc::PeerConnectionInterface::IceServer stun_server;
-  stun_server.urls.push_back("stun:stun.l.google.com:19302");
-  webrtc::PeerConnectionInterface::RTCConfiguration rtc_config;
-  rtc_config.servers.push_back(stun_server);
-
-  webrtc::FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           webrtc::MediaConstraintsInterface::kValueTrue);
-
   std::unique_ptr<cricket::PortAllocator> port_allocator =
       transport_context_->port_allocator_factory()->CreatePortAllocator(
           transport_context_);
-  peer_connection_ = peer_connection_factory_->CreatePeerConnection(
-      rtc_config, &constraints, std::move(port_allocator), nullptr, this);
 
-  data_stream_adapter_.reset(new WebrtcDataStreamAdapter(peer_connection_));
+  // Takes ownership of video_encoder_factory_.
+  peer_connection_wrapper_.reset(new PeerConnectionWrapper(
+      worker_thread_, base::WrapUnique(video_encoder_factory_),
+      std::move(port_allocator), weak_factory_.GetWeakPtr()));
 
   event_handler_->OnWebrtcTransportConnecting();
 
@@ -211,7 +293,7 @@
   if (transport_info->Name() != QName(kTransportNamespace, "transport"))
     return false;
 
-  if (!peer_connection_)
+  if (!peer_connection())
     return false;
 
   XmlElement* session_description = transport_info->FirstNamed(
@@ -221,7 +303,7 @@
         transport_context_->role() == TransportRole::CLIENT
             ? webrtc::PeerConnectionInterface::kStable
             : webrtc::PeerConnectionInterface::kHaveLocalOffer;
-    if (peer_connection_->signaling_state() != expected_state) {
+    if (peer_connection()->signaling_state() != expected_state) {
       LOG(ERROR) << "Received unexpected WebRTC session_description.";
       return false;
     }
@@ -278,7 +360,7 @@
       return false;
     }
 
-    peer_connection_->SetRemoteDescription(
+    peer_connection()->SetRemoteDescription(
         SetSessionDescriptionObserver::Create(
             base::Bind(&WebrtcTransport::OnRemoteDescriptionSet,
                        weak_factory_.GetWeakPtr(),
@@ -313,9 +395,9 @@
       return false;
     }
 
-    if (peer_connection_->signaling_state() ==
+    if (peer_connection()->signaling_state() ==
         webrtc::PeerConnectionInterface::kStable) {
-      if (!peer_connection_->AddIceCandidate(candidate.get())) {
+      if (!peer_connection()->AddIceCandidate(candidate.get())) {
         LOG(ERROR) << "Failed to add incoming ICE candidate.";
         return false;
       }
@@ -332,7 +414,7 @@
     const std::string& error) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  if (!peer_connection_)
+  if (!peer_connection())
     return;
 
   if (!description) {
@@ -369,7 +451,7 @@
 
   send_transport_info_callback_.Run(std::move(transport_info));
 
-  peer_connection_->SetLocalDescription(
+  peer_connection()->SetLocalDescription(
       SetSessionDescriptionObserver::Create(base::Bind(
           &WebrtcTransport::OnLocalDescriptionSet, weak_factory_.GetWeakPtr())),
       description.release());
@@ -379,7 +461,7 @@
                                             const std::string& error) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  if (!peer_connection_)
+  if (!peer_connection())
     return;
 
   if (!success) {
@@ -396,7 +478,7 @@
                                              const std::string& error) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  if (!peer_connection_)
+  if (!peer_connection())
     return;
 
   if (!success) {
@@ -407,7 +489,7 @@
 
   // Create and send answer on the server.
   if (send_answer) {
-    peer_connection_->CreateAnswer(
+    peer_connection()->CreateAnswer(
         CreateSessionDescriptionObserver::Create(
             base::Bind(&WebrtcTransport::OnLocalSessionDescriptionCreated,
                        weak_factory_.GetWeakPtr())),
@@ -439,7 +521,7 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   event_handler_->OnWebrtcTransportIncomingDataChannel(
       data_channel->label(),
-      data_stream_adapter_->WrapIncomingDataChannel(data_channel));
+      base::WrapUnique(new WebrtcDataStreamAdapter(data_channel)));
 }
 
 void WebrtcTransport::OnRenegotiationNeeded() {
@@ -537,7 +619,7 @@
       webrtc::MediaConstraintsInterface::kValueFalse);
   offer_config.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
                             webrtc::MediaConstraintsInterface::kValueTrue);
-  peer_connection_->CreateOffer(
+  peer_connection()->CreateOffer(
       CreateSessionDescriptionObserver::Create(
           base::Bind(&WebrtcTransport::OnLocalSessionDescriptionCreated,
                      weak_factory_.GetWeakPtr())),
@@ -554,10 +636,10 @@
 void WebrtcTransport::AddPendingCandidatesIfPossible() {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  if (peer_connection_->signaling_state() ==
+  if (peer_connection()->signaling_state() ==
       webrtc::PeerConnectionInterface::kStable) {
     for (auto* candidate : pending_incoming_candidates_) {
-      if (!peer_connection_->AddIceCandidate(candidate)) {
+      if (!peer_connection()->AddIceCandidate(candidate)) {
         LOG(ERROR) << "Failed to add incoming candidate";
         Close(INCOMPATIBLE_PROTOCOL);
         return;
@@ -569,16 +651,15 @@
 
 void WebrtcTransport::Close(ErrorCode error) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  if (!peer_connection_)
+  if (!peer_connection_wrapper_)
     return;
 
   weak_factory_.InvalidateWeakPtrs();
 
-  data_stream_adapter_.reset();
-
-  peer_connection_->Close();
-  peer_connection_ = nullptr;
-  peer_connection_factory_ = nullptr;
+  // Close and delete PeerConnection asynchronously. PeerConnection may be on
+  // the stack and so it must be destroyed later.
+  base::ThreadTaskRunnerHandle::Get()->DeleteSoon(
+      FROM_HERE, peer_connection_wrapper_.release());
 
   if (error != OK)
     event_handler_->OnWebrtcTransportError(error);
diff --git a/remoting/protocol/webrtc_transport.h b/remoting/protocol/webrtc_transport.h
index ebc5dc51..ad1cf0c 100644
--- a/remoting/protocol/webrtc_transport.h
+++ b/remoting/protocol/webrtc_transport.h
@@ -21,18 +21,13 @@
 #include "remoting/signaling/signal_strategy.h"
 #include "third_party/webrtc/api/peerconnectioninterface.h"
 
-namespace webrtc {
-class FakeAudioDeviceModule;
-}  // namespace webrtc
-
 namespace remoting {
 namespace protocol {
 
 class TransportContext;
 class MessagePipe;
 
-class WebrtcTransport : public Transport,
-                        public webrtc::PeerConnectionObserver {
+class WebrtcTransport : public Transport {
  public:
   class EventHandler {
    public:
@@ -70,12 +65,8 @@
                   EventHandler* event_handler);
   ~WebrtcTransport() override;
 
-  webrtc::PeerConnectionInterface* peer_connection() {
-    return peer_connection_;
-  }
-  webrtc::PeerConnectionFactoryInterface* peer_connection_factory() {
-    return peer_connection_factory_;
-  }
+  webrtc::PeerConnectionInterface* peer_connection();
+  webrtc::PeerConnectionFactoryInterface* peer_connection_factory();
   remoting::WebrtcVideoEncoderFactory* video_encoder_factory() {
     return video_encoder_factory_;
   }
@@ -92,6 +83,13 @@
   void Close(ErrorCode error);
 
  private:
+  // PeerConnectionWrapper is responsible for PeerConnection creation,
+  // ownership. It passes all events to the corresponding methods below. This is
+  // necessary to make it possible to close and destroy PeerConnection
+  // asynchronously, as it may be on stack when the transport is destroyed.
+  class PeerConnectionWrapper;
+  friend class PeerConnectionWrapper;
+
   void OnLocalSessionDescriptionCreated(
       std::unique_ptr<webrtc::SessionDescriptionInterface> description,
       const std::string& error);
@@ -100,21 +98,21 @@
                               bool success,
                               const std::string& error);
 
-  // webrtc::PeerConnectionObserver interface.
+  // PeerConnection event handlers, called by PeerConnectionWrapper.
   void OnSignalingChange(
-      webrtc::PeerConnectionInterface::SignalingState new_state) override;
+      webrtc::PeerConnectionInterface::SignalingState new_state);
   void OnAddStream(
-      rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override;
+      rtc::scoped_refptr<webrtc::MediaStreamInterface> stream);
   void OnRemoveStream(
-      rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override;
+      rtc::scoped_refptr<webrtc::MediaStreamInterface> stream);
   void OnDataChannel(
-      rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel) override;
-  void OnRenegotiationNeeded() override;
+      rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel);
+  void OnRenegotiationNeeded();
   void OnIceConnectionChange(
-      webrtc::PeerConnectionInterface::IceConnectionState new_state) override;
+      webrtc::PeerConnectionInterface::IceConnectionState new_state);
   void OnIceGatheringChange(
-      webrtc::PeerConnectionInterface::IceGatheringState new_state) override;
-  void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override;
+      webrtc::PeerConnectionInterface::IceGatheringState new_state);
+  void OnIceCandidate(const webrtc::IceCandidateInterface* candidate);
 
   void RequestNegotiation();
   void SendOffer();
@@ -131,11 +129,7 @@
 
   crypto::HMAC handshake_hmac_;
 
-  std::unique_ptr<webrtc::FakeAudioDeviceModule> fake_audio_device_module_;
-
-  rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface>
-      peer_connection_factory_;
-  rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;
+  std::unique_ptr<PeerConnectionWrapper> peer_connection_wrapper_;
 
   remoting::WebrtcVideoEncoderFactory* video_encoder_factory_;
 
@@ -148,8 +142,6 @@
 
   ScopedVector<webrtc::IceCandidateInterface> pending_incoming_candidates_;
 
-  std::unique_ptr<WebrtcDataStreamAdapter> data_stream_adapter_;
-
   base::WeakPtrFactory<WebrtcTransport> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(WebrtcTransport);
diff --git a/remoting/resources/remoting_strings_am.xtb b/remoting/resources/remoting_strings_am.xtb
index 16bcab2..7977039 100644
--- a/remoting/resources/remoting_strings_am.xtb
+++ b/remoting/resources/remoting_strings_am.xtb
@@ -235,6 +235,7 @@
 <translation id="6930242544192836755">ጊዜ</translation>
 <translation id="6939719207673461467">የቁልፍ ሰሌዳን አሳይ/ደብቅ።</translation>
 <translation id="6944854424004126054">መስኮት ወደነበረበት ይመልሱ</translation>
+<translation id="6963936880795878952">የሆነ ሰው ልክ ባልሆነ ፒን ከርቀት ኮምፒውተሩ ጋር ለመገናኘት ስለሞከረ ከእሱ ጋር ያሉ ግንኙነቶች ለጊዜው ታግደዋል። እባክዎ ቆይተው እንደገና ይሞክሩ።</translation>
 <translation id="6965382102122355670">ይሁን</translation>
 <translation id="6985691951107243942">እርግጠኛ ነዎት ከ<ph name="HOSTNAME" /> ጋር ያሉትን የርቀት ግንኙነቶች ማሰናከል ይፈልጋሉ? ሐሳብዎን ከቀየሩ ግንኙነቶችን ዳግም ለማንቃት ያንን ኮምፒውተር መጎብኘት ይኖርብዎታል።</translation>
 <translation id="6998989275928107238">ለ</translation>
diff --git a/remoting/resources/remoting_strings_ar.xtb b/remoting/resources/remoting_strings_ar.xtb
index 843e7a6c..f6a971d 100644
--- a/remoting/resources/remoting_strings_ar.xtb
+++ b/remoting/resources/remoting_strings_ar.xtb
@@ -236,6 +236,7 @@
 <translation id="6930242544192836755">المدة</translation>
 <translation id="6939719207673461467">عرض/إخفاء لوحة المفاتيح</translation>
 <translation id="6944854424004126054">استعادة النافذة</translation>
+<translation id="6963936880795878952">تم حظر الاتصالات بجهاز الكمبيوتر البعيد مؤقتًا نظرًا لأن شخصًا ما كان يحاول الاتصال به باستخدام رقم تعريف شخصي غير صالح. يُرجى إعادة المحاولة لاحقًا.</translation>
 <translation id="6965382102122355670">موافق</translation>
 <translation id="6985691951107243942">هل تريد بالتأكيد تعطيل الاتصالات عن بُعد بـ <ph name="HOSTNAME" />؟ إذا عدلت عن هذا القرار، فسيلزمك الانتقال إلى جهاز الكمبيوتر لإعادة تمكين الاتصالات.</translation>
 <translation id="6998989275928107238">إلى</translation>
diff --git a/remoting/resources/remoting_strings_bg.xtb b/remoting/resources/remoting_strings_bg.xtb
index 3f8d17e..7f44ad0 100644
--- a/remoting/resources/remoting_strings_bg.xtb
+++ b/remoting/resources/remoting_strings_bg.xtb
@@ -235,6 +235,7 @@
 <translation id="6930242544192836755">Продължителност</translation>
 <translation id="6939719207673461467">Показване/скриване на клавиатурата.</translation>
 <translation id="6944854424004126054">Възстановяване на прозореца</translation>
+<translation id="6963936880795878952">Връзките с отдалечения компютър са временно блокирани, защото някой опита да се свърже с него посредством невалиден ПИН код. Моля, пробвайте отново по-късно.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Наистина ли искате да деактивирате отдалечените връзки с/ъс <ph name="HOSTNAME" />? Ако промените решението си, ще трябва да посетите този компютър, за да ги активирате отново.</translation>
 <translation id="6998989275928107238">До</translation>
diff --git a/remoting/resources/remoting_strings_en-GB.xtb b/remoting/resources/remoting_strings_en-GB.xtb
index b17626713..8e144bfd 100644
--- a/remoting/resources/remoting_strings_en-GB.xtb
+++ b/remoting/resources/remoting_strings_en-GB.xtb
@@ -235,6 +235,7 @@
 <translation id="6930242544192836755">Duration</translation>
 <translation id="6939719207673461467">Show/hide keyboard.</translation>
 <translation id="6944854424004126054">Restore window</translation>
+<translation id="6963936880795878952">Connections to the remote computer are temporarily blocked because somebody was trying to connect to it with an invalid PIN. Please try again later.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Are you sure you want to disable remote connections to <ph name="HOSTNAME" />? If you change your mind, you'll need to visit that computer to re-enable connections.</translation>
 <translation id="6998989275928107238">To</translation>
diff --git a/remoting/resources/remoting_strings_ko.xtb b/remoting/resources/remoting_strings_ko.xtb
index 0840e139..d8a59b5 100644
--- a/remoting/resources/remoting_strings_ko.xtb
+++ b/remoting/resources/remoting_strings_ko.xtb
@@ -235,6 +235,7 @@
 <translation id="6930242544192836755">기간</translation>
 <translation id="6939719207673461467">키보드 표시/숨기기</translation>
 <translation id="6944854424004126054">복원 창</translation>
+<translation id="6963936880795878952">누군가 잘못된 PIN으로 연결을 시도하여 원격 컴퓨터 연결이 일시적으로 차단되었습니다. 나중에 다시 시도해 주세요.</translation>
 <translation id="6965382102122355670">확인</translation>
 <translation id="6985691951107243942"><ph name="HOSTNAME" />와(과)의 원격 연결을 사용중지하시겠습니까? 생각이 바뀌면 해당 컴퓨터에서 연결을 다시 사용하도록 설정해야 합니다.</translation>
 <translation id="6998989275928107238">호스트</translation>
diff --git a/remoting/resources/remoting_strings_ms.xtb b/remoting/resources/remoting_strings_ms.xtb
index 677d2694..a3da8ec 100644
--- a/remoting/resources/remoting_strings_ms.xtb
+++ b/remoting/resources/remoting_strings_ms.xtb
@@ -235,6 +235,7 @@
 <translation id="6930242544192836755">Tempoh</translation>
 <translation id="6939719207673461467">Paparkan/Sembunyikan papan kekunci.</translation>
 <translation id="6944854424004126054">Pulihkan tetingkap</translation>
+<translation id="6963936880795878952">Sambungan kepada komputer jauh disekat buat sementara waktu kerana seseorang sedang cuba untuk menyambung kepadanya dengan PIN yang tidak sah. Sila cuba sebentar lagi.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Adakah anda pasti mahu melumpuhkan sambungan jauh ke <ph name="HOSTNAME" />? Jika anda berubah fikiran, anda perlu pergi ke komputer tersebut untuk mendayakan semula sambungan.</translation>
 <translation id="6998989275928107238">Kepada</translation>
diff --git a/remoting/resources/remoting_strings_sv.xtb b/remoting/resources/remoting_strings_sv.xtb
index 4b63e0be..f749a6c 100644
--- a/remoting/resources/remoting_strings_sv.xtb
+++ b/remoting/resources/remoting_strings_sv.xtb
@@ -235,6 +235,7 @@
 <translation id="6930242544192836755">Varaktighet</translation>
 <translation id="6939719207673461467">Visa/dölj tangentbordet.</translation>
 <translation id="6944854424004126054">Återställ fönstret</translation>
+<translation id="6963936880795878952">Anslutningar till fjärrdatorn är tillfälligt blockerade eftersom någon har försökt ansluta till fjärrdatorn med en ogiltig pinkod. Försök igen senare.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Är du säker på att du vill inaktivera fjärranslutningar till <ph name="HOSTNAME" />? Om du ångrar dig måste du besöka datorn för att kunna aktivera anslutningar igen.</translation>
 <translation id="6998989275928107238">Till</translation>
diff --git a/remoting/resources/remoting_strings_sw.xtb b/remoting/resources/remoting_strings_sw.xtb
index 4c23ce1..8c62f4f9 100644
--- a/remoting/resources/remoting_strings_sw.xtb
+++ b/remoting/resources/remoting_strings_sw.xtb
@@ -235,6 +235,7 @@
 <translation id="6930242544192836755">Muda</translation>
 <translation id="6939719207673461467">Onyesha/ficha kibodi.</translation>
 <translation id="6944854424004126054">Rejesha dirisha</translation>
+<translation id="6963936880795878952">Miunganisho ya kompyuta ya mbali imezuiwa kwa muda kwa sababu mtu alikuwa akijaribu kuunganisha kwake kwa kutumia PIN isiyo sahihi. Tafadhali jaribu tena baadaye.</translation>
 <translation id="6965382102122355670">Sawa</translation>
 <translation id="6985691951107243942">Una uhakika kuwa unataka kufunga miunganisho ya mbali kwa <ph name="HOSTNAME" />? Ukibadilisha nia, utahitajika kutembelea kompyuta hiyo ili uwashe miunganisho upya.</translation>
 <translation id="6998989275928107238">Kwa</translation>
diff --git a/remoting/resources/remoting_strings_vi.xtb b/remoting/resources/remoting_strings_vi.xtb
index a81a27cf..1781e06 100644
--- a/remoting/resources/remoting_strings_vi.xtb
+++ b/remoting/resources/remoting_strings_vi.xtb
@@ -235,6 +235,7 @@
 <translation id="6930242544192836755">Thời lượng</translation>
 <translation id="6939719207673461467">Hiển thị / ẩn bàn phím.</translation>
 <translation id="6944854424004126054">Khôi phục cửa sổ</translation>
+<translation id="6963936880795878952">Kết nối với máy tính từ xa tạm thời bị chặn vì ai đó đang cố gắng kết nối với máy tính đó bằng mã PIN không hợp lệ. Vui lòng thử lại sau.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Bạn có chắc chắn muốn tắt kết nối từ xa với <ph name="HOSTNAME" /> không? Nếu bạn thay đổi ý định, bạn cần truy cập vào máy tính đó để bật lại kết nối.</translation>
 <translation id="6998989275928107238">Đến</translation>
diff --git a/services/shell/runner/host/child_process_base.cc b/services/shell/runner/host/child_process_base.cc
index d01aa23..d263a03e 100644
--- a/services/shell/runner/host/child_process_base.cc
+++ b/services/shell/runner/host/child_process_base.cc
@@ -18,7 +18,7 @@
 #include "services/shell/runner/common/client_util.h"
 #include "services/shell/runner/common/switches.h"
 
-#if defined(OS_LINUX) && !defined(OS_ANDROID)
+#if defined(OS_LINUX)
 #include "base/rand_util.h"
 #include "base/sys_info.h"
 #include "services/shell/runner/host/linux_sandbox.h"
@@ -32,7 +32,7 @@
 
 namespace {
 
-#if defined(OS_LINUX) && !defined(OS_ANDROID)
+#if defined(OS_LINUX)
 std::unique_ptr<LinuxSandbox> InitializeSandbox() {
   using sandbox::syscall_broker::BrokerFilePermission;
   // Warm parts of base in the copy of base in the mojo runner.
@@ -113,7 +113,7 @@
   // sure symbol names in all loaded libraries will be cached.
   base::debug::EnableInProcessStackDumping();
 #endif
-#if defined(OS_LINUX) && !defined(OS_ANDROID)
+#if defined(OS_LINUX)
   std::unique_ptr<LinuxSandbox> sandbox;
   const base::CommandLine& command_line =
       *base::CommandLine::ForCurrentProcess();
diff --git a/services/shell/runner/host/child_process_host.cc b/services/shell/runner/host/child_process_host.cc
index f24fdcdd..30195b5 100644
--- a/services/shell/runner/host/child_process_host.cc
+++ b/services/shell/runner/host/child_process_host.cc
@@ -26,7 +26,7 @@
 #include "services/shell/runner/common/client_util.h"
 #include "services/shell/runner/common/switches.h"
 
-#if defined(OS_LINUX) && !defined(OS_ANDROID)
+#if defined(OS_LINUX)
 #include "sandbox/linux/services/namespace_sandbox.h"
 #endif
 
@@ -177,7 +177,7 @@
 #endif
   DVLOG(2) << "Launching child with command line: "
            << child_command_line->GetCommandLineString();
-#if defined(OS_LINUX) && !defined(OS_ANDROID)
+#if defined(OS_LINUX)
   if (start_sandboxed_) {
     child_process_ =
         sandbox::NamespaceSandbox::LaunchProcess(*child_command_line, options);
diff --git a/styleguide/c++/c++11.html b/styleguide/c++/c++11.html
index 123ecd8..168f53d 100644
--- a/styleguide/c++/c++11.html
+++ b/styleguide/c++/c++11.html
@@ -866,10 +866,10 @@
 </tr>
 
 <tr>
-<td>String to Number Functions</td>
+<td>String-Number Conversion Functions</td>
 <td><code>std::stoi()</code>, <code>std::stol()</code>, <code>std::stoul()</code>, <code>std::stoll</code>, <code>std::stoull()</code>, <code>std::stof()</code>, <code>std::stod()</code>, <code>std::stold()</code>, <code>std::to_string()</code></td>
-<td>Converts strings to numbers</td>
-<td><a href="http://en.cppreference.com/w/cpp/string/basic_string/stol">std::stoi, std::stol, std::stoll</a>, <a href="http://en.cppreference.com/w/cpp/string/basic_string/stoul">std::stoul, std::stoull</a>, <a href="http://en.cppreference.com/w/cpp/string/basic_string/stof">std::stof, std::stod, std::stold</a></td>
+<td>Converts strings to/from numbers</td>
+<td><a href="http://en.cppreference.com/w/cpp/string/basic_string/stol">std::stoi, std::stol, std::stoll</a>, <a href="http://en.cppreference.com/w/cpp/string/basic_string/stoul">std::stoul, std::stoull</a>, <a href="http://en.cppreference.com/w/cpp/string/basic_string/stof">std::stof, std::stod, std::stold</a>, <a href="http://en.cppreference.com/w/cpp/string/basic_string/to_string">std::to_string</a></td>
 <td></td>
 </tr>
 
diff --git a/sync/syncable/parent_child_index.cc b/sync/syncable/parent_child_index.cc
index bf6e03f..6d1be8b 100644
--- a/sync/syncable/parent_child_index.cc
+++ b/sync/syncable/parent_child_index.cc
@@ -4,8 +4,9 @@
 
 #include "sync/syncable/parent_child_index.h"
 
-#include "base/stl_util.h"
+#include <memory>
 
+#include "base/stl_util.h"
 #include "sync/syncable/entry_kernel.h"
 #include "sync/syncable/syncable_id.h"
 
@@ -45,21 +46,7 @@
   type_root_child_sets_.resize(MODEL_TYPE_COUNT);
 }
 
-ParentChildIndex::~ParentChildIndex() {
-  for (int i = 0; i < MODEL_TYPE_COUNT; i++) {
-    // Normally all OrderedChildSet instances in |type_root_child_sets_|
-    // are shared with |parent_children_map_|. Null out shared instances and
-    // ScopedVector will take care of the ones that are not shared (if any).
-    if (!model_type_root_ids_[i].IsNull()) {
-      DCHECK_EQ(type_root_child_sets_[i],
-                parent_children_map_.find(model_type_root_ids_[i])->second);
-      type_root_child_sets_[i] = nullptr;
-    }
-  }
-
-  STLDeleteContainerPairSecondPointers(parent_children_map_.begin(),
-                                       parent_children_map_.end());
-}
+ParentChildIndex::~ParentChildIndex() {}
 
 bool ParentChildIndex::ShouldInclude(const EntryKernel* entry) {
   // This index excludes deleted items and the root item.  The root
@@ -70,7 +57,7 @@
 bool ParentChildIndex::Insert(EntryKernel* entry) {
   DCHECK(ShouldInclude(entry));
 
-  OrderedChildSet* siblings = nullptr;
+  OrderedChildSetRef siblings = nullptr;
   const Id& parent_id = entry->ref(PARENT_ID);
   ModelType model_type = entry->GetModelType();
 
@@ -81,7 +68,7 @@
     if (it != parent_children_map_.end()) {
       siblings = it->second;
     } else {
-      siblings = new OrderedChildSet();
+      siblings = OrderedChildSetRef(new OrderedChildSet());
       parent_children_map_.insert(std::make_pair(parent_id, siblings));
     }
   } else {
@@ -100,25 +87,15 @@
       syncer::IsRealDataType(model_type) &&
       !TypeSupportsHierarchy(model_type)) {
     const Id& type_root_id = entry->ref(ID);
-    // Disassociate the type root child set with the previous ID if any.
-    const Id& prev_type_root_id = model_type_root_ids_[model_type];
-    if (!prev_type_root_id.IsNull()) {
-      ParentChildrenMap::iterator it =
-          parent_children_map_.find(prev_type_root_id);
-      if (it != parent_children_map_.end()) {
-        // If the entry exists in the map it must already have the same
-        // model type specific child set. This child set will be re-inserted
-        // in the map under the new ID below so it is safe to simply erase
-        // the entry here.
-        DCHECK_EQ(it->second, GetModelTypeChildSet(model_type));
-        parent_children_map_.erase(it);
-      }
-    }
-    // Store the new type root ID and associate the child set.
-    // Note that the child set isn't owned by the map in this case.
+
+    // If the entry exists in the map it must already have the same
+    // model type specific child set. It's possible another type root exists
+    // in parent_children_map_, but that's okay as the new type root will
+    // point to the same OrderedChildSet. As such, we just blindly store the
+    // new type root ID and associate it to the (possibly existing) child set.
     model_type_root_ids_[model_type] = type_root_id;
-    parent_children_map_.insert(
-        std::make_pair(type_root_id, GetOrCreateModelTypeChildSet(model_type)));
+    parent_children_map_.insert(std::make_pair(
+        type_root_id, GetOrCreateModelTypeChildSet(model_type)));
   }
 
   // Finally, insert the entry in the child set.
@@ -129,18 +106,18 @@
 // one does not own any EntryKernels.  This function removes references to the
 // given EntryKernel but does not delete it.
 void ParentChildIndex::Remove(EntryKernel* e) {
-  OrderedChildSet* siblings = nullptr;
+  OrderedChildSetRef siblings = nullptr;
   ModelType model_type = e->GetModelType();
   const Id& parent_id = e->ref(PARENT_ID);
   bool should_erase = false;
-  ParentChildrenMap::iterator it;
+  ParentChildrenMap::iterator sibling_iterator;
 
   if (ShouldUseParentId(parent_id, model_type)) {
     // Hierarchical type, lookup child set in the map.
     DCHECK(!parent_id.IsNull());
-    it = parent_children_map_.find(parent_id);
-    DCHECK(it != parent_children_map_.end());
-    siblings = it->second;
+    sibling_iterator = parent_children_map_.find(parent_id);
+    DCHECK(sibling_iterator != parent_children_map_.end());
+    siblings = sibling_iterator->second;
     should_erase = true;
   } else {
     // Non-hierarchical type, return a pre-defined child set by type.
@@ -155,13 +132,12 @@
   // If the set is now empty and isn't shareable with |type_root_child_sets_|,
   // erase it from the map.
   if (siblings->empty() && should_erase) {
-    delete siblings;
-    parent_children_map_.erase(it);
+    parent_children_map_.erase(sibling_iterator);
   }
 }
 
 bool ParentChildIndex::Contains(EntryKernel *e) const {
-  const OrderedChildSet* siblings = GetChildSet(e);
+  const OrderedChildSetRef siblings = GetChildSet(e);
   return siblings && siblings->count(e) > 0;
 }
 
@@ -173,12 +149,12 @@
     return nullptr;
   }
 
-  OrderedChildSet* children = parent->second;
+  OrderedChildSetRef children = parent->second;
   // The expectation is that the function returns nullptr instead of an empty
   // child set
   if (children && children->empty())
     children = nullptr;
-  return children;
+  return children.get();
 }
 
 const OrderedChildSet* ParentChildIndex::GetChildren(EntryKernel* e) const {
@@ -188,9 +164,9 @@
 const OrderedChildSet* ParentChildIndex::GetSiblings(EntryKernel* e) const {
   // This implies the entry is in the index.
   DCHECK(Contains(e));
-  const OrderedChildSet* siblings = GetChildSet(e);
+  const OrderedChildSetRef siblings = GetChildSet(e);
   DCHECK(siblings && !siblings->empty());
-  return siblings;
+  return siblings.get();
 }
 
 /* static */
@@ -203,7 +179,7 @@
          !syncer::IsRealDataType(model_type);
 }
 
-const OrderedChildSet* ParentChildIndex::GetChildSet(EntryKernel* e) const {
+const OrderedChildSetRef ParentChildIndex::GetChildSet(EntryKernel* e) const {
   ModelType model_type = e->GetModelType();
 
   const Id& parent_id = e->ref(PARENT_ID);
@@ -219,15 +195,16 @@
   return GetModelTypeChildSet(model_type);
 }
 
-const OrderedChildSet* ParentChildIndex::GetModelTypeChildSet(
+const OrderedChildSetRef ParentChildIndex::GetModelTypeChildSet(
     ModelType model_type) const {
   return type_root_child_sets_[model_type];
 }
 
-OrderedChildSet* ParentChildIndex::GetOrCreateModelTypeChildSet(
+OrderedChildSetRef ParentChildIndex::GetOrCreateModelTypeChildSet(
     ModelType model_type) {
   if (!type_root_child_sets_[model_type])
-    type_root_child_sets_[model_type] = new OrderedChildSet();
+    type_root_child_sets_[model_type] =
+        OrderedChildSetRef(new OrderedChildSet());
   return type_root_child_sets_[model_type];
 }
 
diff --git a/sync/syncable/parent_child_index.h b/sync/syncable/parent_child_index.h
index 540234c6..0488c04 100644
--- a/sync/syncable/parent_child_index.h
+++ b/sync/syncable/parent_child_index.h
@@ -6,11 +6,11 @@
 #define SYNC_SYNCABLE_PARENT_CHILD_INDEX_H_
 
 #include <map>
+#include <memory>
 #include <set>
 #include <vector>
 
 #include "base/macros.h"
-#include "base/memory/scoped_vector.h"
 #include "sync/base/sync_export.h"
 #include "sync/internal_api/public/base/model_type.h"
 #include "sync/syncable/syncable_id.h"
@@ -28,6 +28,7 @@
 
 // An ordered set of nodes.
 typedef std::set<EntryKernel*, ChildComparator> OrderedChildSet;
+typedef std::shared_ptr<OrderedChildSet> OrderedChildSetRef;
 
 // Container that tracks parent-child relationships.
 // Provides fast lookup of all items under a given parent.
@@ -63,22 +64,22 @@
  private:
   friend class ParentChildIndexTest;
 
-  typedef std::map<Id, OrderedChildSet*> ParentChildrenMap;
+  typedef std::map<Id, OrderedChildSetRef> ParentChildrenMap;
   typedef std::vector<Id> TypeRootIds;
-  typedef ScopedVector<OrderedChildSet> TypeRootChildSets;
+  typedef std::vector<OrderedChildSetRef> TypeRootChildSets;
 
   static bool ShouldUseParentId(const Id& parent_id, ModelType model_type);
 
   // Returns OrderedChildSet that should contain the specified entry
   // based on the entry's Parent ID or model type.
-  const OrderedChildSet* GetChildSet(EntryKernel* e) const;
+  const OrderedChildSetRef GetChildSet(EntryKernel* e) const;
 
   // Returns OrderedChildSet that contain entries of the |model_type| type.
-  const OrderedChildSet* GetModelTypeChildSet(ModelType model_type) const;
+  const OrderedChildSetRef GetModelTypeChildSet(ModelType model_type) const;
 
   // Returns mutable OrderedChildSet that contain entries of the |model_type|
   // type. Create one as necessary.
-  OrderedChildSet* GetOrCreateModelTypeChildSet(ModelType model_type);
+  OrderedChildSetRef GetOrCreateModelTypeChildSet(ModelType model_type);
 
   // Returns previously cached model type root ID for the given |model_type|.
   const Id& GetModelTypeRootId(ModelType model_type) const;
diff --git a/sync/syncable/parent_child_index_unittest.cc b/sync/syncable/parent_child_index_unittest.cc
index 50aeca1..1ef9832 100644
--- a/sync/syncable/parent_child_index_unittest.cc
+++ b/sync/syncable/parent_child_index_unittest.cc
@@ -470,6 +470,57 @@
   EXPECT_EQ(2UL, children->size());
 }
 
+// Test that if for some reason we wind up with multiple type roots, we
+// gracefully handle it and don't allow any new entities to become invisible.
+TEST_F(ParentChildIndexTest, MultipleTypeRoots) {
+  // Create the good Preferences type root.
+  syncable::Id type_root_id = syncable::Id::CreateFromClientString("type_root");
+  index_.Insert(MakeTypeRoot(PREFERENCES, type_root_id));
+
+  // Then insert the bad Preferences type root
+  syncable::Id bad_type_root_id = syncable::Id::CreateFromServerId("bad");
+  index_.Insert(MakeTypeRoot(PREFERENCES, bad_type_root_id));
+
+  // Insert two Preferences entries with implicit parent.
+  index_.Insert(MakeUniqueClientItem(PREFERENCES, 1));
+  index_.Insert(MakeUniqueClientItem(PREFERENCES, 2));
+
+  // The index should still be able to associate Preferences entries
+  // with the good and bad roots.
+  const OrderedChildSet* children = index_.GetChildren(type_root_id);
+  ASSERT_TRUE(children);
+  EXPECT_EQ(2UL, children->size());
+  const OrderedChildSet* children_bad = index_.GetChildren(bad_type_root_id);
+  ASSERT_TRUE(children_bad);
+  EXPECT_EQ(2UL, children_bad->size());
+}
+
+// Test that if for some reason we wind up with multiple type roots, we
+// gracefully handle it and don't allow any new entities to become invisible.
+// Same as above but with the roots created in inverse order.
+TEST_F(ParentChildIndexTest, MultipleTypeRootsInverse) {
+  // Create the bad Preferences type root
+  syncable::Id bad_type_root_id = syncable::Id::CreateFromServerId("bad");
+  index_.Insert(MakeTypeRoot(PREFERENCES, bad_type_root_id));
+
+  // Then insert the good Preferences type root.
+  syncable::Id type_root_id = syncable::Id::CreateFromClientString("type_root");
+  index_.Insert(MakeTypeRoot(PREFERENCES, type_root_id));
+
+  // Insert two Preferences entries with implicit parent.
+  index_.Insert(MakeUniqueClientItem(PREFERENCES, 1));
+  index_.Insert(MakeUniqueClientItem(PREFERENCES, 2));
+
+  // The index should still be able to associate Preferences entries
+  // with the good root and bad roots.
+  const OrderedChildSet* children = index_.GetChildren(type_root_id);
+  ASSERT_TRUE(children);
+  EXPECT_EQ(2UL, children->size());
+  const OrderedChildSet* children_bad = index_.GetChildren(bad_type_root_id);
+  ASSERT_TRUE(children_bad);
+  EXPECT_EQ(2UL, children_bad->size());
+}
+
 }  // namespace syncable
 }  // namespace syncer
 
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index 6deb600..f8fe3c0b 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -809,10 +809,6 @@
       {
         "name": "webview_licenses",
         "script": "webview_licenses.py"
-      },
-      {
-        "name": "telemetry_perf_unittests",
-        "script": "telemetry_perf_unittests.py"
       }
     ]
   },
@@ -1880,21 +1876,6 @@
         }
       },
       {
-        "args": [
-          "--xvfb"
-        ],
-        "isolate_name": "telemetry_perf_unittests",
-        "name": "telemetry_perf_unittests",
-        "override_compile_targets": [
-          "telemetry_perf_unittests_run"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "hard_timeout": 960,
-          "shards": 12
-        }
-      },
-      {
         "isolate_name": "telemetry_unittests",
         "name": "telemetry_unittests",
         "override_compile_targets": [
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index e8f25507..e24c3187 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -1013,18 +1013,6 @@
         }
       },
       {
-        "isolate_name": "telemetry_perf_unittests",
-        "name": "telemetry_perf_unittests",
-        "override_compile_targets": [
-          "telemetry_perf_unittests_run"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "hard_timeout": 960,
-          "shards": 12
-        }
-      },
-      {
         "isolate_name": "telemetry_unittests",
         "name": "telemetry_unittests",
         "override_compile_targets": [
@@ -1353,18 +1341,6 @@
         }
       },
       {
-        "isolate_name": "telemetry_perf_unittests",
-        "name": "telemetry_perf_unittests",
-        "override_compile_targets": [
-          "telemetry_perf_unittests_run"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "hard_timeout": 960,
-          "shards": 12
-        }
-      },
-      {
         "isolate_name": "telemetry_unittests",
         "name": "telemetry_unittests",
         "override_compile_targets": [
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index 80c61b9..961bfeb 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -1789,18 +1789,6 @@
         }
       },
       {
-        "isolate_name": "telemetry_perf_unittests",
-        "name": "telemetry_perf_unittests",
-        "override_compile_targets": [
-          "telemetry_perf_unittests_run"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "hard_timeout": 960,
-          "shards": 12
-        }
-      },
-      {
         "isolate_name": "telemetry_unittests",
         "name": "telemetry_unittests",
         "override_compile_targets": [
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index df12b86..8d6a73d 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -59,6 +59,11 @@
 crbug.com/593514 virtual/gpu/fast/canvas/OffscreenCanvas-2d-drawImage-in-worker.html [ Failure ]
 crbug.com/593514 virtual/gpu/fast/canvas/OffscreenCanvas-2d-drawImage.html [ Failure ]
 
+crbug.com/355305 fast/canvas/DrawImageSinglePixelStretch.html [ Failure ]
+crbug.com/355305 virtual/gpu/fast/canvas/DrawImageSinglePixelStretch.html [ Failure ]
+crbug.com/355305 fast/images/paint-subrect-grid.html [ Failure ]
+crbug.com/355305 virtual/gpu-rasterization/fast/images/paint-subrect-grid.html [ Failure ]
+
 crbug.com/417782 [ Linux Win ] virtual/rootlayerscrolls/fast/scrolling/fractional-scroll-offset-fixed-position-non-composited.html [ Failure ]
 crbug.com/492664 [ Linux ] imported/csswg-test/css-writing-modes-3/box-offsets-rel-pos-vlr-005.xht [ Failure ]
 crbug.com/492664 [ Linux ] imported/csswg-test/css-writing-modes-3/box-offsets-rel-pos-vrl-004.xht [ Failure ]
@@ -419,6 +424,397 @@
 crbug.com/587970 virtual/spv2/compositing/plugins/webplugin-alpha.html [ Pass ]
 crbug.com/587970 virtual/spv2/compositing/plugins/webplugin-no-alpha.html [ Pass ]
 
+crbug.com/610313 compositing/squashing/selection-repaint-with-gaps.html [ NeedsRebaseline ]
+crbug.com/610313 css3/flexbox/repaint.html [ NeedsRebaseline ]
+crbug.com/610313 fast/block/float/002.html [ NeedsRebaseline ]
+crbug.com/610313 fast/encoding/utf-16-big-endian.html [ NeedsRebaseline ]
+crbug.com/610313 fast/encoding/utf-16-little-endian.html [ NeedsRebaseline ]
+crbug.com/610313 fast/forms/select-popup/popup-menu-appearance-fractional-width.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/block-layout-inline-children-float-positioned.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/bugzilla-6278.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/invalidation-after-opacity-change-subtree.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/japanese-rl-selection-clear.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/line-flow-with-floats-1.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/line-flow-with-floats-10.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/line-flow-with-floats-2.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/line-flow-with-floats-3.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/line-flow-with-floats-4.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/line-flow-with-floats-5.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/line-flow-with-floats-6.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/line-flow-with-floats-7.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/line-flow-with-floats-8.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/line-overflow.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/make-children-non-inline.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/outline-clip-change.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/selection-after-remove.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/selection-partial-invalidation-between-blocks.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/stacked-diacritics.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/table-collapsed-border.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/text-append-dirty-lines.html [ NeedsRebaseline ]
+crbug.com/610313 fast/repaint/window-resize-vertical-writing-mode.html [ NeedsRebaseline ]
+crbug.com/610313 fast/text/bidi-img-alt-text.html [ NeedsRebaseline ]
+crbug.com/610313 fast/text/decorations-with-text-combine.html [ NeedsRebaseline ]
+crbug.com/610313 fast/text/emphasis-vertical.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win10 Android Mac Linux ] fast/text/emphasis.html [ NeedsRebaseline ]
+
+crbug.com/610313 svg/W3C-I18N/text-anchor-dirLTR-anchorEnd.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-I18N/text-anchor-dirLTR-anchorMiddle.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-I18N/text-anchor-dirLTR-anchorStart.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-I18N/text-anchor-dirNone-anchorEnd.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-I18N/text-anchor-dirNone-anchorMiddle.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-I18N/text-anchor-dirNone-anchorStart.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-I18N/text-anchor-dirRTL-anchorEnd.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-I18N/text-anchor-dirRTL-anchorMiddle.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-I18N/text-anchor-dirRTL-anchorStart.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorEnd.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorMiddle.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorStart.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorEnd.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorMiddle.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorStart.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-I18N/text-anchor-no-markup.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1-SE/coords-units-03-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1-SE/filters-image-05-f.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1-SE/painting-marker-05-f.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1-SE/painting-marker-06-f.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1-SE/styling-pres-02-f.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1-SE/svgdom-over-01-f.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1-SE/text-intro-02-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1-SE/text-intro-05-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1-SE/text-intro-09-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1-SE/types-dom-03-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1-SE/types-dom-05-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-13-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-31-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-32-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-33-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-39-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-40-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-41-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-46-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-52-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-60-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-61-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-65-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-66-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-77-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-78-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-80-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-81-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-82-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-83-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/animate-elem-84-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/color-prop-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/coords-units-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win10 Linux Android Mac ] svg/W3C-SVG-1.1/coords-units-02-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/coords-viewattr-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/coords-viewattr-02-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/coords-viewattr-03-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/filters-blend-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/filters-light-01-f.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/fonts-elem-03-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/fonts-elem-04-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/fonts-elem-07-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/interact-order-03-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/linking-a-05-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/linking-uri-02-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/linking-uri-03-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/metadata-example-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/painting-marker-01-f.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/painting-marker-02-f.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/paths-data-01-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/paths-data-03-f.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/paths-data-06-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/paths-data-07-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/paths-data-10-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/pservers-grad-08-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/pservers-grad-09-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/pservers-grad-12-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/render-elems-06-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/script-handle-02-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/script-handle-03-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/shapes-intro-01-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/struct-dom-02-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/struct-dom-03-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/struct-dom-05-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/struct-group-03-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/struct-image-06-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/struct-use-01-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/text-align-04-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/text-align-08-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/text-deco-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/text-fonts-01-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/text-spacing-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/text-text-03-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/text-text-04-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/text-text-06-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/text-tselect-02-f.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/text-ws-01-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/W3C-SVG-1.1/text-ws-02-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/filters/feTile.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/paints/patternPreserveAspectRatioA.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/paints/patternRegions-positioned-objects.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/paints/patternRegions.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/longTextOnPath.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/textAnchor2.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/textDecoration.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/textEffect3.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/textFeatures.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/textLayout.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/textLayout2.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/textLength.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/textOnPath.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/textOnPath2.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/textOnPath3.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/textOnPathSpaces.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/textPCDATA.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/textProperties.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/textProperties2.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/textStyles.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/verticalText.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/verticalTextOnPath.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/batik/text/xmlSpace.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/carto.net/button.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/carto.net/colourpicker.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/carto.net/tabgroup.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/carto.net/window.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/clip-path/deep-nested-clip-in-mask-different-unitTypes.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/clip-path/deep-nested-clip-in-mask-panning.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/clip-path/deep-nested-clip-in-mask.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/alignment-baseline-modes.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/coords-relative-units-transforms.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/feComponentTransfer-Discrete.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/feComponentTransfer-Gamma.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/feComponentTransfer-Linear.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/feComponentTransfer-Table.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/gradient-deep-referencing.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/path-textPath-simulation.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/pattern-deep-referencing.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/pattern-userSpaceOnUse-userToBaseTransform.xhtml [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/pointer-events-image-css-transform.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/pointer-events-image.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/pointer-events-path.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/pointer-events-text-css-transform.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/pointer-events-text.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/recursive-clippath.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/recursive-filter.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/recursive-gradient.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/recursive-mask.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/recursive-pattern.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/shape-rendering.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/stroke-width-large.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/svg-overflow-types.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/text-linking.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/text-rotated-gradient.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/text-rotation.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/text-whitespace-handling.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/text-x-dy-lists.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/use-clipped-hit.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/custom/use-referencing-nonexisting-symbol.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/filters/feComposite.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/foreignObject/svg-document-as-direct-child.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/repaint/filter-repaint.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/text/bbox-with-glyph-overflow-on-path.html [ NeedsRebaseline ]
+crbug.com/610313 svg/text/bbox-with-glyph-overflow-zoomed.html [ NeedsRebaseline ]
+crbug.com/610313 svg/text/bbox-with-glyph-overflow.html [ NeedsRebaseline ]
+crbug.com/610313 svg/text/bidi-embedded-direction.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/text/bidi-text-query.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/text/ligature-queries.html [ NeedsRebaseline ]
+crbug.com/610313 svg/text/scaled-font.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/text/scaling-font-with-geometric-precision.html [ NeedsRebaseline ]
+crbug.com/610313 svg/text/text-decorations-in-scaled-pattern.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/text/text-fill-opacity.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/text/text-repaint-rects.xhtml [ NeedsRebaseline ]
+crbug.com/610313 svg/text/text-rescale.html [ NeedsRebaseline ]
+crbug.com/610313 svg/text/text-selection-align-04-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/text/text-selection-deco-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/text/text-selection-fonts-01-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/text/text-selection-intro-05-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/text/text-selection-spacing-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/text/text-selection-text-04-t.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/text/text-selection-text-06-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Linux Android Mac ] svg/text/text-viewbox-rescale.html [ NeedsRebaseline ]
+crbug.com/610313 svg/text/text-with-geometric-precision.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/transforms/text-with-mask-with-svg-transform.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/transforms/text-with-pattern-inside-transformed-html.xhtml [ NeedsRebaseline ]
+crbug.com/610313 svg/transforms/text-with-pattern-with-svg-transform.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/zoom/page/zoom-mask-with-percentages.svg [ NeedsRebaseline ]
+crbug.com/610313 svg/zoom/page/zoom-zoom-coords.xhtml [ NeedsRebaseline ]
+
+crbug.com/610313 [ Win ] compositing/geometry/layer-due-to-layer-children-deep-switch.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] compositing/geometry/layer-due-to-layer-children-switch.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] compositing/overflow/text-match-highlight.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/dynamic/text-combine.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/float-overflow-right.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/float-overflow.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/inline-focus.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/japanese-rl-selection-repaint.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/overflow-delete-line.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/overflow-scroll-body-appear.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/positioned-document-element.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/positioned-great-grandparent-change-location.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/quotes.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/reflection-redraw.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/relative-inline-positioned-movement-repaint.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/remove-block-after-layout.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/remove-inline-after-layout.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/remove-inline-layer-after-layout.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/repaint-across-writing-mode-boundary.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/repaint-descandant-on-ancestor-layer-move.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/text-selection-rect-in-overflow.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/repaint/transform-inline-layered-child.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/ruby/base-shorter-than-text.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/text/emphasis-complex.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/text/international/text-spliced-font.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/text/vertical-surrogate-pair.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/writing-mode/border-vertical-lr.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/writing-mode/japanese-lr-selection.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/writing-mode/japanese-lr-text.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/writing-mode/japanese-rl-selection.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/writing-mode/japanese-rl-text.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/writing-mode/japanese-ruby-vertical-lr.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/writing-mode/japanese-ruby-vertical-rl.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/writing-mode/text-combine-various-fonts.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/writing-mode/vertical-align-table-baseline.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/writing-mode/vertical-baseline-alignment.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] fast/writing-mode/vertical-font-fallback.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] media/track/track-cue-rendering-vertical.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] paint/invalidation/non-text-link-invalidation-optimization.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] paint/selection/invalidation-rect-includes-newline-for-rtl.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] paint/selection/invalidation-rect-includes-newline-for-vertical-lr.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] paint/selection/invalidation-rect-includes-newline-for-vertical-rl.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] paint/selection/invalidation-rect-includes-newline.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-I18N/tspan-dirRTL-ubOverride-in-default-context.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-I18N/tspan-dirRTL-ubOverride-in-ltr-context.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1-SE/filters-felem-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/animate-elem-14-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/animate-elem-15-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/animate-elem-16-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/animate-elem-17-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/animate-elem-18-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/animate-elem-19-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/animate-elem-27-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/animate-elem-36-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/animate-elem-37-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/animate-elem-63-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/animate-elem-68-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/animate-elem-69-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/coords-trans-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/extend-namespace-01-f.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/filters-comptran-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/filters-conv-01-f.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/filters-diffuse-01-f.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/filters-light-04-f.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/filters-morph-01-f.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/filters-specular-01-f.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/interact-cursor-01-f.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/interact-order-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/interact-order-02-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/masking-intro-01-f.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/masking-opacity-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/masking-path-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/masking-path-02-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/painting-marker-03-f.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/painting-render-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/painting-stroke-02-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/painting-stroke-04-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/paths-data-02-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/pservers-grad-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/pservers-grad-02-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/pservers-grad-03-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/pservers-grad-04-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/pservers-grad-06-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/pservers-grad-07-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/pservers-grad-13-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/pservers-grad-14-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/script-handle-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/script-handle-04-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/struct-cond-02-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/struct-cond-03-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/struct-dom-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/struct-dom-04-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/struct-dom-06-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/struct-frag-06-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/struct-use-05-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/styling-css-05-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/text-align-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/text-align-02-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/text-align-03-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/text-align-05-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/text-align-06-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/text-intro-01-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/text-intro-03-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/text-text-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/text-text-05-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/text-tselect-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/W3C-SVG-1.1/text-tspan-01-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/batik/filters/filterRegions.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/batik/masking/maskRegions.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/batik/paints/gradientLimit.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/batik/paints/patternRegionA.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/batik/text/textAnchor.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/batik/text/textAnchor3.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/batik/text/textDecoration2.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/batik/text/textEffect.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/batik/text/textEffect2.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/batik/text/textPosition2.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/clip-path/clip-path-pixelation.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/SVGMatrix-interface.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/clip-path-referencing-use.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/clip-path-referencing-use2.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/container-opacity-clip-viewBox.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/dominant-baseline-hanging.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/empty-clip-path.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/fill-fallback.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/font-face-cascade-order.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/getscreenctm-in-scrollable-div-area-nested.xhtml [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/getscreenctm-in-scrollable-div-area.xhtml [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/getscreenctm-in-scrollable-svg-area.xhtml [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/gradient-cycle-detection.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/gradient-with-1d-boundingbox.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/image-with-transform-clip-filter.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/invalid-fill-hex.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/invalid-lengthlist.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/invalid-stroke-hex.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/invisible-text-after-scrolling.xhtml [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/marker-overflow-clip.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/mouse-move-on-svg-container-standalone.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/mouse-move-on-svg-container.xhtml [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/pattern-cycle-detection.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/pattern-incorrect-tiling.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/scrolling-embedded-svg-file-image-repaint-problem.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/stroke-fallback.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/text-decoration-visibility.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/text-image-opacity.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/text-match-highlight.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/text-repaint-including-stroke.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/text-xy-updates.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/use-font-face-crash.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/use-modify-container-in-target.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/use-modify-target-container.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/use-modify-target-symbol.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/use-on-symbol-inside-pattern.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/use-property-changes-through-dom.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/custom/use-property-changes-through-svg-dom.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/filters/filter-on-filter-for-text.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/filters/filter-on-tspan.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/foreignObject/svg-document-in-html-document.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/hixie/error/010.xml [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/hixie/error/011.xml [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/hixie/links/002.xml [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/hixie/viewbox/preserveAspectRatio/002.xml [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/repaint/image-with-clip-path.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/repaint/inner-svg-change-viewPort-relative.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/repaint/modify-transferred-listitem-different-attr.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/text/combining-character-queries.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/text/selection-background-color.xhtml [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/text/selection-styles.xhtml [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/text/surrogate-pair-queries.html [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/text/text-selection-text-03-b.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/text/text-selection-text-07-t.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] svg/text/text-selection-tselect-02-f.svg [ NeedsRebaseline ]
+crbug.com/610313 [ Win ] virtual/prefer_compositing_to_lcd_text/compositing/overflow/text-match-highlight.html [ NeedsRebaseline ]
+
 # These failures have been manually verified to be only paint invalidation text differences.
 crbug.com/596780 virtual/spv2/compositing/geometry/bounds-clipped-composited-child.html [ Failure ]
 crbug.com/596780 virtual/spv2/compositing/geometry/bounds-ignores-hidden-dynamic-negzindex.html [ Failure ]
@@ -1353,36 +1749,17 @@
 crbug.com/627798 fast/repaint/text-match-document-change.html [ Pass Failure ]
 
 # Very slight rendering changes caused by Skia rect clipping change.
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-background-image-space.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/png-with-color-profile.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-image-profile-match.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/exif-orientation-height-image-document.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-reflection.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-png.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-background-image-repeat.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-image.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-border-image-source.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-image-canvas-pattern.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-border-image.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-mask-image-svg.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-group.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-image-canvas.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/jpeg-with-color-profile.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-svg.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-background-image-cover.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/color-profile-object.html [ NeedsRebaseline ]
-crbug.com/627844 virtual/gpu-rasterization/fast/images/ycbcr-with-cmyk-color-profile.html [ NeedsRebaseline ]
 crbug.com/627844 virtual/gpu/fast/canvas/canvas-createImageBitmap-colorClamping.html [ Pass Failure ]
 
 crbug.com/629711 [ Linux Debug ] fast/workers/shared-worker-exception.html [ Crash Pass ]
 crbug.com/629711 [ Linux Debug ] virtual/sharedarraybuffer/fast/workers/shared-worker-exception.html [ Crash Pass ]
 
+crbug.com/630967 [ Linux Debug ] svg/parser/whitespace-length-invalid-1.html [ Skip ]
 crbug.com/630967 [ Linux Debug ] svg/parser/whitespace-length-invalid-2.html [ Skip ]
+crbug.com/630967 [ Linux Debug ] svg/parser/whitespace-angle.html [ Skip ]
+
 crbug.com/630615 [ Win7 ] fast/images/color-profile-background-image-space.html [ Skip ]
-crbug.com/399507 [ Mac10.9 Mac10.10 ] virtual/threaded/inspector/tracing/timeline-paint/layer-tree.html [ Skip ]
+crbug.com/399507 [ Mac10.9 Mac10.10 Linux ] virtual/threaded/inspector/tracing/timeline-paint/layer-tree.html [ Skip ]
 
 crbug.com/631039 [ Win7 ] virtual/threaded/fast/scroll-behavior/subframe-scrollBy.html [ Pass Failure ]
 crbug.com/631039 [ Win7 ] virtual/threaded/fast/scroll-behavior/main-frame-element-scroll.html [ Pass Failure ]
@@ -1390,3 +1767,5 @@
 crbug.com/631039 [ Win7 ] virtual/threaded/fast/scroll-behavior/main-frame-element-scrollTo.html [ Pass Failure ]
 crbug.com/631039 [ Win7 ] virtual/threaded/fast/scroll-behavior/main-frame-scroll.html [ Pass Failure ]
 crbug.com/631039 [ Win7 ] virtual/threaded/fast/scroll-behavior/overflow-scroll-scroll.html [ Pass Failure ]
+
+crbug.com/630996 [ Win7 Win10 Linux ] http/tests/fetch/referrer/serviceworker-echo-referrer-from-default-document.html [ Skip ]
diff --git a/third_party/WebKit/LayoutTests/WPTServeExpectations b/third_party/WebKit/LayoutTests/WPTServeExpectations
index 474a6c4..766b9e7 100644
--- a/third_party/WebKit/LayoutTests/WPTServeExpectations
+++ b/third_party/WebKit/LayoutTests/WPTServeExpectations
@@ -38,6 +38,7 @@
 crbug.com/508725 imported/wpt/html/browsers/history/the-history-interface/history_replacestate_err.html [ Failure ]
 crbug.com/508725 imported/wpt/html/browsers/offline/application-cache-api/api_status_idle.html [ Failure ]
 crbug.com/508725 imported/wpt/html/dom/elements/global-attributes/the-lang-attribute-003.html [ Failure ]
+crbug.com/508725 imported/wpt/html/semantics/document-metadata/the-link-element/document-without-browsing-context.html [ Failure ]
 crbug.com/508725 imported/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol.html [ Failure ]
 
 # Pass when run with --enable-wptserve: (crbug.com/508725)
@@ -54,29 +55,30 @@
 crbug.com/619746 imported/wpt/dom/nodes/Document-contentType/contentType/contenttype_datauri_02.html [ Failure ]
 
 # Pointer events test timeout with --enable-wptserve.
-crbug.com/627008 imported/wpt/pointerevents/pointerevent_button_attribute_mouse-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_capture_mouse-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_capture_suppressing_mouse-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_gotpointercapture_before_first_pointerevent-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerdown-manual.html [ Timeout ]
-crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerenter-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerenter_does_not_bubble-manual.html [ Timeout ]
+crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerenter-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerleave_descendant_over-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerleave_descendants-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerleave_does_not_bubble-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerleave_mouse-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerleave_pen-manual.html [ Timeout ]
-crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointermove-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointermove_isprimary_same_as_pointerdown-manual.html [ Timeout ]
+crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointermove-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointermove_pointertype-manual.html [ Timeout ]
+crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerout_after_pointerup_nohover-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerout-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerout_pen-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerout_received_once-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerover-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointertype_mouse-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointertype_pen-manual.html [ Timeout ]
-crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerup-manual.html [ Timeout ]
+crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointertype_touch-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerup_isprimary_same_as_pointerdown-manual.html [ Timeout ]
+crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerup-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_pointerup_pointertype-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_releasepointercapture_events_to_original_target-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_releasepointercapture_invalid_pointerid-manual.html [ Timeout ]
@@ -86,3 +88,4 @@
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_setpointercapture_invalid_pointerid-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_setpointercapture_relatedtarget-manual.html [ Timeout ]
 crbug.com/627008 imported/wpt/pointerevents/pointerevent_touch-action-mouse-manual.html [ Timeout ]
+
diff --git a/third_party/WebKit/LayoutTests/compositing/canvas-with-object-fit-contain-in-composited-layer-expected.html b/third_party/WebKit/LayoutTests/compositing/canvas-with-object-fit-contain-in-composited-layer-expected.html
index fc70a98..887f693 100644
--- a/third_party/WebKit/LayoutTests/compositing/canvas-with-object-fit-contain-in-composited-layer-expected.html
+++ b/third_party/WebKit/LayoutTests/compositing/canvas-with-object-fit-contain-in-composited-layer-expected.html
@@ -2,29 +2,20 @@
 <style>
 canvas {
   background-color: gray;
-  width: 200px;
-  height: 200px;
+  width: 100px;
+  height: 100px;
 }
 </style>
-<p>Test passes if a green square inside an orange rectanlge is shown up without a distortion.
+<p>Test passes if a green square inside a gray square is shown without distortion.</p>
 <div>
-  <canvas width='200' height='200'></canvas>
+  <canvas width='100' height='100'></canvas>
 </div>
 <script>
 function paintCanvas(canvas)
 {
   var ctx = canvas.getContext('2d');
-  ctx.fillStyle = 'orange';
-
-  ctx.save();
-  ctx.beginPath();
-  ctx.rect(50, 0, 100, 200);
-  ctx.clip();
-  ctx.fillRect(0, 0, 200, 200);
-  ctx.restore();
-
   ctx.fillStyle = 'green';
-  ctx.fillRect(75, 75, 50, 50);
+  ctx.fillRect(35, 35, 30, 30);
 }
 
 paintCanvas(document.querySelector('canvas'));
diff --git a/third_party/WebKit/LayoutTests/compositing/canvas-with-object-fit-contain-in-composited-layer.html b/third_party/WebKit/LayoutTests/compositing/canvas-with-object-fit-contain-in-composited-layer.html
index 364fd982..108e7732 100644
--- a/third_party/WebKit/LayoutTests/compositing/canvas-with-object-fit-contain-in-composited-layer.html
+++ b/third_party/WebKit/LayoutTests/compositing/canvas-with-object-fit-contain-in-composited-layer.html
@@ -2,25 +2,21 @@
 <style>
 canvas {
   background-color: gray;
-  width: 200px;
-  height: 200px;
+  width: 100px;
+  height: 100px;
   object-fit: contain;
 }
 </style>
-<p>Test passes if a green square inside an orange rectanlge is shown up without a distortion.
+<p>Test passes if a green square inside a gray square is shown without distortion.</p>
 <div>
-  <canvas width="200" height="400"></canvas>
+  <canvas width="50" height="100"></canvas>
 </div>
 <script>
 function paintCanvas(canvas)
 {
   var ctx = canvas.getContext('2d');
-  ctx.fillStyle = 'orange';
-  ctx.fillRect(0, 0, canvas.width, canvas.height);
-
   ctx.fillStyle = 'green';
-  var squarWidth = canvas.width / 2;
-  ctx.fillRect(50, 150, squarWidth, squarWidth);
+  ctx.fillRect(10, 35, 30, 30);
 }
 
 paintCanvas(document.querySelector('canvas'));
diff --git a/third_party/WebKit/LayoutTests/custom-elements/spec/resources/custom-elements-helpers.js b/third_party/WebKit/LayoutTests/custom-elements/spec/resources/custom-elements-helpers.js
index c4a9e6c..d5030f0 100644
--- a/third_party/WebKit/LayoutTests/custom-elements/spec/resources/custom-elements-helpers.js
+++ b/third_party/WebKit/LayoutTests/custom-elements/spec/resources/custom-elements-helpers.js
@@ -1,7 +1,7 @@
-function create_window_in_test(t) {
+function create_window_in_test(t, srcdoc) {
   let p = new Promise((resolve) => {
     let f = document.createElement('iframe');
-    f.srcdoc = '';
+    f.srcdoc = srcdoc ? srcdoc : '';
     f.onload = (event) => {
       let w = f.contentWindow;
       t.add_cleanup(() => f.remove());
@@ -12,9 +12,9 @@
   return p;
 }
 
-function test_with_window(f, name) {
+function test_with_window(f, name, srcdoc) {
   promise_test((t) => {
-    return create_window_in_test(t)
+    return create_window_in_test(t, srcdoc)
     .then((w) => {
       f(w);
     });
diff --git a/third_party/WebKit/LayoutTests/custom-elements/spec/state-failed-create.html b/third_party/WebKit/LayoutTests/custom-elements/spec/state-failed-create.html
new file mode 100644
index 0000000..2c56c248
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/custom-elements/spec/state-failed-create.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<title>Custom Elements: Custom Element State "Failed" in document parser</title>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="resources/custom-elements-helpers.js"></script>
+<body>
+<template id="test-content">
+  <script>
+'use strict';
+window.logs = [];
+customElements.define('a-a', class extends HTMLElement {
+  constructor() {
+    super();
+    logs.push('constructor');
+    throw new Error();
+  }
+  connectedCallback() {
+    logs.push('connected');
+  }
+});
+  </script>
+  <a-a></a-a>
+</template>
+<script>
+'use strict';
+
+// Custom Element State
+// https://dom.spec.whatwg.org/#concept-element-custom-element-state
+// Set to "failed" in step 7 of "create an element for a token"
+// https://html.spec.whatwg.org/multipage/syntax.html#create-an-element-for-the-token
+
+// This test loads the template content into iframe.srcdoc because "create an
+// element for a token" with synchronous custom elements flag set to true is
+// used only in document parser.
+
+test_with_window(w => {
+  let logs = w.logs;
+  assert_equals(logs.length, 1, 'Only constructor should be invoked');
+  assert_equals(logs[0], 'constructor', 'The 1st action should be constructor');
+}, undefined, document.getElementById('test-content').innerHTML);
+</script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/custom-elements/spec/state-failed-upgrade.html b/third_party/WebKit/LayoutTests/custom-elements/spec/state-failed-upgrade.html
new file mode 100644
index 0000000..995ee272
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/custom-elements/spec/state-failed-upgrade.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<title>Custom Elements: Custom Element State "Failed" in Upgrades</title>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="resources/custom-elements-helpers.js"></script>
+<body>
+<script>
+'use strict';
+
+// Custom Element State
+// https://dom.spec.whatwg.org/#concept-element-custom-element-state
+
+test_with_window(w => {
+  let document = w.document;
+  let element = document.createElement('a-a');
+
+  let constructorCount = 0;
+  w.customElements.define('a-a', class extends w.HTMLElement {
+    constructor() {
+      constructorCount++;
+      throw new Error();
+    }
+    connectedCallback() {
+      assert_unreached('connectedCallback should not be invoked if constructor threw');
+    }
+  });
+
+  // Upgrade calls the constructor.
+  // 9. If constructResult is an abrupt completion, then
+  // Set element's custom element state to "failed".
+  // https://html.spec.whatwg.org/multipage/scripting.html#upgrades
+  let container = document.body;
+  container.appendChild(element);
+  assert_equals(constructorCount, 1, 'constructor should be invoked once');
+
+  // "failed" is not "defined"
+  // https://dom.spec.whatwg.org/#concept-element-defined
+  assert_false(element.matches(':defined'));
+});
+</script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-div-022.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-div-022.html
index aa8e89a..83c826e 100644
--- a/third_party/WebKit/LayoutTests/editing/inserting/insert-div-022.html
+++ b/third_party/WebKit/LayoutTests/editing/inserting/insert-div-022.html
@@ -1,50 +1,23 @@
-<html> 
-<head>
-
-<style>
-body {
-    font-size: 24px; 
-}
-.editing { 
-    border: 2px solid red; 
-    padding: 12px; 
-}
-p {
-    border: 2px solid blue; 
-    padding: 12px; 
-}
-br {
-    background-color: green; 
-}
-
-</style>
-<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
-
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
 <script>
-
-function editingTest() {
-    for (i = 0; i < 3; i++)
-        moveSelectionForwardByCharacterCommand();
-    insertParagraphCommand();
-    typeCharacterCommand();
-}
-
+test(() => assert_selection(
+    [
+        '<div contenteditable>',
+            '<p id="test"><b>foo|</b><br>bar</p>',
+        '</div>',
+    ].join(''),
+    selection => {
+        selection.document.execCommand('insertParagraph');
+        selection.document.execCommand('insertText', false, 'x');
+    },
+    [
+        '<div contenteditable>',
+            '<p id="test"><b>foo</b></p>',
+            '<p id="test"><b>x|<br></b>bar</p>',
+        '</div>',
+    ].join('')),
+    'Insert "x" before BR, since insertParagraph puts caret before BR');
 </script>
-
-<title>Editing Test</title> 
-</head> 
-<body contenteditable id="root" style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space;">
-
-Test inserting paragraphs: should see "foo" in a blue box, then a blue box with with two lines in it: First line a bold "x"; second line a non-bold "bar". Fix for this bug:
-<a href="rdar://problem/3924579">&lt;rdar://problem/3927554&gt;</a> Style info applied to remainder of document after a newline is entered
-
-<div style="height: 12px"></div>
-
-<p id="test"><b>foo</b><br>bar</p>
-
-<script>
-runEditingTest();
-</script>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-paragraph-01.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-paragraph-01.html
deleted file mode 100644
index b0eb953..0000000
--- a/third_party/WebKit/LayoutTests/editing/inserting/insert-paragraph-01.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<script>
-if (window.testRunner)
-     testRunner.dumpEditingCallbacks();
-</script>
-<p>This tests inserting a paragraph separator before a table.  There should be an empty paragraph before the table and the caret should be just before the table.</p>
-<div contenteditable="true" id="div"><table border="1"><tr><td>foo</td></tr></table></div>
-
-<script>
-var sel = window.getSelection();
-var div = document.getElementById("div");
-sel.collapse(div, 0);
-document.execCommand("InsertParagraph");
-</script>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-paragraph-02.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-paragraph-02.html
deleted file mode 100644
index a26eeb2..0000000
--- a/third_party/WebKit/LayoutTests/editing/inserting/insert-paragraph-02.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<script>
-if (window.testRunner)
-     testRunner.dumpEditingCallbacks();
-</script>
-<p>This tests inserting a paragraph separator after a table.  There should be an empty paragraph between the table and 'bar' and the caret should be in the empty paragraph.</p>
-<div contenteditable="true" id="div"><table border="1"><tr><td>foo</td></tr></table>bar</div>
-
-<script>
-if (window.internals)
-    internals.settings.setEditingBehavior('mac');
-var sel = window.getSelection();
-var div = document.getElementById("div");
-sel.collapse(div, 0);
-sel.modify("move", "forward", "character");
-sel.modify("move", "forward", "character");
-sel.modify("move", "forward", "character");
-sel.modify("move", "forward", "character");
-sel.modify("move", "forward", "character");
-document.execCommand("InsertParagraph");
-</script>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-paragraph-03.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-paragraph-03.html
deleted file mode 100644
index 76ae6f1..0000000
--- a/third_party/WebKit/LayoutTests/editing/inserting/insert-paragraph-03.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<script>
-if (window.testRunner)
-     testRunner.dumpEditingCallbacks();
-</script>
-<p>This tests inserting a paragraph separator before a horizontal rule.  You should see 'foo', empty paragraph, horizontal rule, 'bar', and the caret should be just before the horizontal rule.</p>
-<div contenteditable="true" id="div">foo<hr>bar</div>
-
-<script>
-if (window.internals)
-    internals.settings.setEditingBehavior("mac");
-var sel = window.getSelection();
-var div = document.getElementById("div");
-sel.collapse(div, 0);
-sel.modify("move", "forward", "word");
-sel.modify("move", "forward", "character");
-document.execCommand("InsertParagraph");
-</script>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-paragraph-04.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-paragraph-04.html
deleted file mode 100644
index 41c00c3e8..0000000
--- a/third_party/WebKit/LayoutTests/editing/inserting/insert-paragraph-04.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<p>This tests inserting a paragraph separator after a horizontal rule.  You should see 'foo', empty paragraph, horizontal rule, 'bar', and the caret should be just after the horizontal rule. <b>This demonstrates 8345.  The caret after a horizontal rule is drawn in the same location as the caret before a horizontal rule.</p>
-<div contenteditable="true" id="div">foo<hr>bar</div>
-<div id="log"></div>
-<script>
-test(function() {
-    if (window.internals)
-        internals.settings.setEditingBehavior('mac');
-    var selection = window.getSelection();
-    var div = document.getElementById('div');
-    selection.collapse(div, 0);
-    selection.modify('move', 'forward', 'word');
-    selection.modify('move', 'forward', 'character');
-    selection.modify('move', 'forward', 'character');
-    document.execCommand('insertParagraph');
-
-    assert_equals(div.innerHTML, 'foo<hr><br>bar');
-});
-</script>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-paragraph-05.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-paragraph-05.html
deleted file mode 100644
index dd37d59..0000000
--- a/third_party/WebKit/LayoutTests/editing/inserting/insert-paragraph-05.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<script>
-if (window.testRunner)
-     testRunner.dumpEditingCallbacks();
-</script>
-<p>This tests inserting a paragraph separator before a special element at the start of an editable root.</p>
-<p>Visually, it should leave a blank line before the link, and the caret selection at the start of the link.</p>
-<p>Structurally, the empty paragraph element should go before the anchor element, rather than inside of it. See Radar #5452675.</p>
-<div contenteditable="true"><a id="anchor" href="http://www.apple.com">applesite</a></div>
-<script>
-var sel = window.getSelection();
-sel.collapse(document.getElementById("anchor"), 0);
-document.execCommand("InsertParagraph");
-</script>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-tab-001.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-tab-001.html
deleted file mode 100644
index b0a9004..0000000
--- a/third_party/WebKit/LayoutTests/editing/inserting/insert-tab-001.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<html> 
-<head>
-
-<style>
-.editing { 
-    border: 2px solid red; 
-    padding: 12px; 
-    font-size: 24px; 
-}
-</style>
-<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
-
-<script>
-
-function editingTest() {
-    typeCharacterCommand('\t');
-}
-
-</script>
-
-<title>Editing Test</title> 
-</head> 
-<body>
-<div contenteditable id="root" class="editing">
-<span id="test">foo</span>
-</div>
-
-<script>
-runEditingTest();
-</script>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-tab-002.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-tab-002.html
deleted file mode 100644
index 814bee2..0000000
--- a/third_party/WebKit/LayoutTests/editing/inserting/insert-tab-002.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<html> 
-<head>
-
-<style>
-.editing { 
-    border: 2px solid red; 
-    padding: 12px; 
-    font-size: 24px; 
-}
-</style>
-<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
-
-<script>
-
-function editingTest() {
-    for (i = 0; i < 3; i++)
-        moveSelectionForwardByCharacterCommand();
-    typeCharacterCommand('\t');
-}
-
-</script>
-
-<title>Editing Test</title> 
-</head> 
-<body>
-<div contenteditable id="root" class="editing">
-<span id="test">foo</span>
-</div>
-
-<script>
-runEditingTest();
-</script>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-tab-003.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-tab-003.html
deleted file mode 100644
index fca4585d6..0000000
--- a/third_party/WebKit/LayoutTests/editing/inserting/insert-tab-003.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<html> 
-<head>
-
-<style>
-.editing { 
-    border: 2px solid red; 
-    padding: 12px; 
-    font-size: 24px; 
-}
-</style>
-<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
-
-<script>
-
-function editingTest() {
-    for (i = 0; i < 2; i++)
-        moveSelectionForwardByCharacterCommand();
-    typeCharacterCommand('\t');
-}
-
-</script>
-
-<title>Editing Test</title> 
-</head> 
-<body>
-<div contenteditable id="root" class="editing">
-<span id="test">foo</span>
-</div>
-
-<script>
-runEditingTest();
-</script>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-tab-004.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-tab-004.html
deleted file mode 100644
index 9f67055..0000000
--- a/third_party/WebKit/LayoutTests/editing/inserting/insert-tab-004.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<html> 
-<head>
-
-<style>
-.editing { 
-    border: 2px solid red; 
-    padding: 12px; 
-    font-size: 24px; 
-}
-</style>
-<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
-
-<script>
-
-function editingTest() {
-    insertLineBreakCommand();
-    typeCharacterCommand('\t');
-}
-
-</script>
-
-<title>Editing Test</title> 
-</head> 
-<body>
-<div contenteditable id="root" class="editing">
-<span id="test">foo</span>
-</div>
-
-<script>
-runEditingTest();
-</script>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-text-with-newlines.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-text-with-newlines.html
index 0cb607db..be5627386 100644
--- a/third_party/WebKit/LayoutTests/editing/inserting/insert-text-with-newlines.html
+++ b/third_party/WebKit/LayoutTests/editing/inserting/insert-text-with-newlines.html
@@ -1,50 +1,34 @@
-
-<html> 
-<head>
-
-<style>
-.editing { 
-    border: 2px solid red; 
-    padding: 12px; 
-    font-size: 24px; 
-}
-</style>
-<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
-
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
 <script>
+test(() => assert_selection(
+    '<div contenteditable>Foo | <i> bar</i></div>',
+    selection => {
+        selection.document.execCommand('insertText', false, 'x');
+        selection.document.execCommand('insertText', false, 'x');
+        selection.document.execCommand('insertText', false, 'x');
+    },
+    '<div contenteditable>Foo xxx|<i>bar</i></div>'),
+    'Collapse spaces');
 
-function moveNSpacesAndType(n) {
-    for (i = 0; i < n; i++) {
-        moveSelectionForwardByCharacterCommand();
-    }
-    for (i = 0; i < 3; i++) {
-        typeCharacterCommand();
-    }
-}
+test(() => assert_selection(
+    '<div contenteditable>Foo  <i> bar</i>\n\n|baz</div>',
+    selection => {
+        selection.document.execCommand('insertText', false, 'x');
+        selection.document.execCommand('insertText', false, 'x');
+        selection.document.execCommand('insertText', false, 'x');
+    },
+    '<div contenteditable>Foo  <i> bar</i>\u{00A0}xxx|baz</div>'),
+    'Replace newlines into nbsp');
 
-function editingTest() {
-    moveNSpacesAndType(4);
-    insertLineBreakCommand();
-    moveNSpacesAndType(4);
-    insertLineBreakCommand();
-    insertLineBreakCommand();
-    moveNSpacesAndType(4);
-}
-
+test(() => assert_selection(
+    '<div contenteditable>foo|bar</div>',
+    selection => {
+        selection.document.execCommand('insertLineBreak');
+        selection.document.execCommand('insertLineBreak');
+    },
+    '<div contenteditable>foo<br><br>|bar</div>'),
+    'Insert BRs');
 </script>
-
-<title>Editing Test</title> 
-</head> 
-<body>
-<div contenteditable id="root" class="editing">
-<span id="test">Foo    <i>  bar</i>
-
-baz</span>
-</div>
-
-<script>
-runEditingTest();
-</script>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert_html_as_plain_text.html b/third_party/WebKit/LayoutTests/editing/inserting/insert_html_as_plain_text.html
new file mode 100644
index 0000000..d63da169
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/editing/inserting/insert_html_as_plain_text.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
+<script>
+// See detail in http://wkb.ug/8145
+test(() => assert_selection(
+    '<div contenteditable="plaintext-only">|</div>',
+    'insertHTML <p style="margin: 0; font: 12px Helvetica">foo <b>bar</b> baz</p>',
+    '<div contenteditable="plaintext-only">foo bar baz|</div>'),
+    'insert HTML as plain text.');
+
+// Regression by 8145 fix
+test(() => assert_selection(
+    '<div contenteditable>foo<br>|bar<br>baz</div>',
+    'insertHTML <div>FOO</div>BAR',
+    '<div contenteditable>foo<br><div>FOO</div>BAR|bar<br>baz</div>'),
+    'insert HTML at start of paragraph.');
+
+// Regression by 8145 fix
+test(() => assert_selection(
+    '<div contenteditable><div>f|oo</div></div>',
+    'insertHTML <div>bar</div>baz<br class="Apple-interchange-newline">',
+    '<div contenteditable><div>fbar</div>baz<div>|oo</div></div>'),
+    'interchange-newline is not inserted before DIV');
+</script>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert_paragraph.html b/third_party/WebKit/LayoutTests/editing/inserting/insert_paragraph.html
new file mode 100644
index 0000000..2b1cdf1e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/editing/inserting/insert_paragraph.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
+<script>
+test(() => assert_selection(
+    [
+        '<div contenteditable>',
+            '|<table><tr><td>foo</td></tr></table>',
+        '</div>',
+    ].join(''),
+    'insertParagraph',
+    [
+        '<div contenteditable>',
+            '<br>',
+            '|<table><tbody><tr><td>foo</td></tr></tbody></table>',
+        '</div>',
+    ].join('')),
+    'Insert BR before table');
+
+test(() => assert_selection(
+    [
+        '<div contenteditable>',
+            '<table><tr><td>foo</td></tr></table>',
+            '|bar',
+        '</div>',
+    ].join(''),
+    'insertParagraph',
+    [
+        '<div contenteditable>',
+            '<table><tbody><tr><td>foo</td></tr></tbody></table>',
+            '<br>',
+            '<div>|bar</div>',
+        '</div>',
+    ].join('')),
+    'Insert BR and enclose with DIV');
+
+test(() => assert_selection(
+    [
+        '<div contenteditable>',
+            'foo|<hr>bar',
+        '</div>',
+    ].join(''),
+    'insertParagraph',
+    [
+        '<div contenteditable>',
+            'foo',
+            '<div>|<br><hr>bar</div>',
+        '</div>',
+    ].join('')),
+    'Insert BR before HR');
+
+test(() => assert_selection(
+    [
+        '<div contenteditable>',
+            'foo<hr>|bar',
+        '</div>',
+    ].join(''),
+    selection => {
+        // Set selection to afterNode(HR)
+        selection.modify('move', 'backward', 'character');
+        selection.document.execCommand('insertParagraph');
+    },
+    [
+        '<div contenteditable>',
+            'foo<hr>|<br>bar',
+        '</div>',
+    ].join('')),
+    'Insert BR after HR');
+
+test(() => assert_selection(
+    [
+        '<div contenteditable>',
+            '<a href="http://example.com">|example</a>',
+        '</div>',
+    ].join(''),
+    'insertParagraph',
+    [
+        '<div contenteditable>',
+            '<div><br></div>',
+            '<a href="http://example.com">|example</a>',
+        '</div>',
+    ].join('')),
+    'Insert DIV+BR before A');
+</script>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert_tab.html b/third_party/WebKit/LayoutTests/editing/inserting/insert_tab.html
new file mode 100644
index 0000000..5aff7a3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/editing/inserting/insert_tab.html
@@ -0,0 +1,78 @@
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
+<script>
+test(() => assert_selection(
+    [
+        '<div contenteditable>',
+            '<span>|foo</span>',
+        '</div>',
+    ].join(''),
+    'insertText \t',
+    [
+        '<div contenteditable>',
+            '<span>',
+                '<span class="Apple-tab-span" style="white-space:pre">\t|</span>',
+                'foo',
+             '</span>',
+        '</div>'
+    ].join('')),
+    'Insert a tab character before text');
+
+test(() => assert_selection(
+    [
+        '<div contenteditable>',
+            '<span>foo|</span>',
+        '</div>',
+    ].join(''),
+    'insertText \t',
+    [
+        '<div contenteditable>',
+            '<span>',
+                'foo',
+                '<span class="Apple-tab-span" style="white-space:pre">\t|</span>',
+             '</span>',
+        '</div>'
+    ].join('')),
+    'Insert a tab character after text');
+
+test(() => assert_selection(
+    [
+        '<div contenteditable>',
+            '<span>fo|o</span>',
+        '</div>',
+    ].join(''),
+    'insertText \t',
+    [
+        '<div contenteditable>',
+            '<span>',
+                'fo',
+                '<span class="Apple-tab-span" style="white-space:pre">\t|</span>',
+                'o',
+             '</span>',
+        '</div>'
+    ].join('')),
+    'Insert a tab character in text');
+
+test(() => assert_selection(
+    [
+        '<div contenteditable>',
+            '<span>|foo</span>',
+        '</div>',
+    ].join(''),
+    selection => {
+        selection.document.execCommand('insertLineBreak');
+        selection.document.execCommand('insertText', false, '\t');
+    },
+    [
+        '<div contenteditable>',
+            '<span>',
+                '<br>',
+                '<span class="Apple-tab-span" style="white-space:pre">\t|</span>',
+                'foo',
+             '</span>',
+        '</div>'
+    ].join('')),
+    'Insert BR and a tab character before text');
+</script>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/typing-001.html b/third_party/WebKit/LayoutTests/editing/inserting/typing-001.html
deleted file mode 100644
index a56ea044b..0000000
--- a/third_party/WebKit/LayoutTests/editing/inserting/typing-001.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<html> 
-<head>
-
-<style>
-.editing { 
-    border: 2px solid red; 
-    padding: 12px; 
-    font-size: 24px; 
-}
-</style>
-<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
-
-<script>
-
-function editingTest() {
-    for (i = 0; i < 3; i++) {
-        typeCharacterCommand();
-    }
-    for (i = 0; i < 2; i++) {
-        moveSelectionForwardByCharacterCommand();
-    }
-    for (i = 0; i < 3; i++) {
-        typeCharacterCommand();
-    }
-    for (i = 0; i < 2; i++) {
-        moveSelectionForwardByCharacterCommand();
-    }
-    for (i = 0; i < 3; i++) {
-        typeCharacterCommand();
-    }
-}
-
-</script>
-
-<title>Editing Test</title> 
-</head> 
-<body>
-<div contenteditable id="root" class="editing">
-<span id="test">XXXX</span>
-</div>
-
-<script>
-runEditingTest();
-</script>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/typing-002.html b/third_party/WebKit/LayoutTests/editing/inserting/typing-002.html
deleted file mode 100644
index 94af2a5..0000000
--- a/third_party/WebKit/LayoutTests/editing/inserting/typing-002.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<html> 
-<head>
-
-<style>
-.editing { 
-    border: 2px solid red; 
-    padding: 12px; 
-    font-size: 24px; 
-}
-</style>
-<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
-
-<script>
-
-function moveNSpacesAndType(n) {
-    for (i = 0; i < n; i++) {
-        moveSelectionForwardByCharacterCommand();
-    }
-    for (i = 0; i < 3; i++) {
-        typeCharacterCommand();
-    }
-}
-
-function editingTest() {
-    moveNSpacesAndType(4);
-}
-
-</script>
-
-<title>Editing Test</title> 
-</head> 
-<body>
-<div contenteditable id="root" class="editing">
-<span id="test">Foo    <i>  bar</i></span>
-</div>
-
-<script>
-runEditingTest();
-</script>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/typing-003.html b/third_party/WebKit/LayoutTests/editing/inserting/typing-003.html
deleted file mode 100644
index 8cd0422..0000000
--- a/third_party/WebKit/LayoutTests/editing/inserting/typing-003.html
+++ /dev/null
@@ -1,84 +0,0 @@
-<html> 
-<head>
-
-<style>
-.editing { 
-    border: 2px solid red; 
-    padding: 12px; 
-    font-size: 24px; 
-}
-</style>
-<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
-
-<script>
-
-function typeWord(n) {
-    for (i = 0; i < n; i++)
-        typeCharacterCommand();
-    typeCharacterCommand(' ');
-}
-
-function editingTest() {
-    typeWord(4);
-    typeWord(1);
-    typeWord(2);
-    typeWord(4);
-    typeWord(6);
-    typeWord(5);
-    typeWord(6);
-    typeWord(3);
-    typeWord(2);
-    typeWord(4);
-    typeWord(3);
-    typeWord(3);
-    typeWord(2);
-    typeWord(1);
-    typeWord(5);
-    typeWord(12);
-    typeWord(8);
-    typeWord(3);
-    typeWord(4);
-    typeWord(5);
-    typeWord(2);
-    typeWord(3);
-    typeWord(4);
-    typeWord(4);
-    typeWord(5);
-    typeWord(6);
-    typeWord(3);
-    typeWord(2);
-    typeWord(4);
-    typeWord(3);
-    typeWord(3);
-    typeWord(2);
-    typeWord(6);
-    typeWord(5);
-    typeWord(6);
-    typeWord(3);
-    typeWord(2);
-    typeWord(4);
-    typeWord(3);
-    typeWord(3);
-    typeWord(2);
-    typeWord(1);
-    typeWord(5);
-    typeWord(12);
-    typeWord(8);
-    typeWord(3);
-}
-
-</script>
-
-<title>Editing Test</title> 
-</head> 
-<body>
-<div contenteditable id="root" class="editing">
-<span id="test"></span>
-</div>
-
-<script>
-runEditingTest();
-</script>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/typing-around-br-001.html b/third_party/WebKit/LayoutTests/editing/inserting/typing-around-br-001.html
index bba7f54..3515986 100644
--- a/third_party/WebKit/LayoutTests/editing/inserting/typing-around-br-001.html
+++ b/third_party/WebKit/LayoutTests/editing/inserting/typing-around-br-001.html
@@ -1,49 +1,34 @@
-<html> 
-<head>
-
-<style>
-.editing { 
-    border: 2px solid red; 
-    padding: 12px; 
-    font-size: 24px; 
-}
-</style>
-<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
-
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
 <script>
-
-function moveNSpacesAndType(n) {
-    for (i = 0; i < n; i++) {
-        moveSelectionForwardByCharacterCommand();
-    }
-    for (i = 0; i < 3; i++) {
-        typeCharacterCommand();
-    }
-}
-
-function editingTest() {
-    moveNSpacesAndType(2);
-    moveNSpacesAndType(3);
-    moveNSpacesAndType(1);
-    moveNSpacesAndType(3);
-    moveNSpacesAndType(1);
-    moveNSpacesAndType(1);
-    moveNSpacesAndType(1);
-    moveNSpacesAndType(3);
-}
-
+test(() => assert_selection(
+    [
+        '<div contenteditable>',
+            '<span>|XX<br>XX<br><br>XX<br><br><br><br>XX</span>',
+        '</div>',
+    ].join(''),
+    selection => {
+        function moveNSpacesAndType(n) {
+            for (var i = 0; i < n; ++i)
+                selection.modify('move', 'forward', 'character');
+            for (var i = 0; i < 3; ++i)
+                selection.document.execCommand('insertText', false, 'a');
+        }
+        moveNSpacesAndType(2);
+        moveNSpacesAndType(3);
+        moveNSpacesAndType(1);
+        moveNSpacesAndType(3);
+        moveNSpacesAndType(1);
+        moveNSpacesAndType(1);
+        moveNSpacesAndType(1);
+        moveNSpacesAndType(3);
+    },
+    [
+        '<div contenteditable>',
+            '<span>XXaaa<br>XXaaa<br>aaa<br>XXaaa<br>aaa<br>aaa<br>aaa<br>XXaaa|</span>',
+        '</div>',
+    ].join('')),
+    'Typing around BR');
 </script>
-
-<title>Editing Test</title> 
-</head> 
-<body>
-<div contenteditable id="root" class="editing">
-<span id="test">XX<br>XX<br><br>XX<br><br><br><br>XX</span>
-</div>
-
-<script>
-runEditingTest();
-</script>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/typing.html b/third_party/WebKit/LayoutTests/editing/inserting/typing.html
new file mode 100644
index 0000000..25303626
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/editing/inserting/typing.html
@@ -0,0 +1,48 @@
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
+<script>
+test(() => assert_selection(
+    '<div contenteditable><span>|XXXX</span></div>',
+    selection => {
+        for (var i = 0; i < 3; ++i)
+            selection.document.execCommand('insertText', false, 'a');
+        for (var i = 0; i < 2; ++i)
+            selection.modify('move', 'forward', 'character');
+        for (var i = 0; i < 3; ++i)
+            selection.document.execCommand('insertText', false, 'b');
+        for (var i = 0; i < 2; ++i)
+            selection.modify('move', 'forward', 'character');
+        for (var i = 0; i < 3; ++i)
+            selection.document.execCommand('insertText', false, 'c');
+    },
+    '<div contenteditable><span>aaaXXbbbXXccc|</span></div>'),
+    'Typing simulation 1');
+
+test(() => assert_selection(
+    '<div contenteditable>|Foo    <i>  bar</i></div>',
+    selection => {
+        for (var i = 0; i < 4; ++i)
+            selection.modify('move', 'forward', 'character');
+        for (var i = 0; i < 3; ++i)
+            selection.document.execCommand('insertText', false, 'x');
+    },
+    '<div contenteditable>Foo xxx|<i>bar</i></div>'),
+    'Typing simulation 2');
+
+test(() => assert_selection(
+    '<div contenteditable><span>|</span></div>',
+    selection => {
+        function typeWord(n) {
+            for (var i = 0; i < n; ++i)
+                selection.document.execCommand('insertText', false, 'x');
+            selection.document.execCommand('insertText', false, ' ');
+        }
+        typeWord(4);
+        typeWord(1);
+        typeWord(2);
+    },
+    '<div contenteditable>xxxx x xx\u{00A0}|<span></span></div>'),
+    'Typing simulation 3');
+</script>
diff --git a/third_party/WebKit/LayoutTests/editing/pasteboard/8145-1.html b/third_party/WebKit/LayoutTests/editing/pasteboard/8145-1.html
deleted file mode 100644
index e4f3b84..0000000
--- a/third_party/WebKit/LayoutTests/editing/pasteboard/8145-1.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<script>
-if (window.testRunner)
-     testRunner.dumpEditingCallbacks();
-</script>
-<p>This is a replica of the paste that caused the crash covered by 8145.</p>
-<div id="test" style="border: 1px solid black;" contenteditable="plaintext-only"></div>
-
-<script>
-var s = window.getSelection();
-var p = document.getElementById("test");
-p.innerHTML = "";
-s.collapse(p, 0);
-var html = "<p style='margin: 0; font: 12px Helvetica'>foo <b>bar</b> baz</p>" + '\n';
-document.execCommand("InsertHTML", false, html);
-</script>
diff --git a/third_party/WebKit/LayoutTests/editing/pasteboard/8145-2.html b/third_party/WebKit/LayoutTests/editing/pasteboard/8145-2.html
deleted file mode 100644
index 0b2b8093..0000000
--- a/third_party/WebKit/LayoutTests/editing/pasteboard/8145-2.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<script>
-if (window.testRunner)
-     testRunner.dumpEditingCallbacks();
-</script>
-<p>This tests a change made with the fix for 8145.  The paragraph separator inserted to prevent nesting blocks from the fragment to paste inside the block where the paste occured was incorrectly inserted when the paste occured at the start of a paragraph.</p>
-<div id="test" style="border: 1px solid black;" contenteditable="true"></div>
-
-<script>
-if (window.internals)
-    internals.settings.setEditingBehavior('mac');
-var s = window.getSelection();
-var p = document.getElementById("test");
-p.innerHTML = "foo<br>bar<br>baz";
-s.collapse(p, 0);
-s.modify("move", "forward", "word");
-s.modify("move", "forward", "character");
-var html = "<div>foo</div>bar";
-document.execCommand("InsertHTML", false, html);
-</script>
diff --git a/third_party/WebKit/LayoutTests/editing/pasteboard/8145-3.html b/third_party/WebKit/LayoutTests/editing/pasteboard/8145-3.html
deleted file mode 100644
index 85a19ce..0000000
--- a/third_party/WebKit/LayoutTests/editing/pasteboard/8145-3.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<script>
-if (window.testRunner)
-     testRunner.dumpEditingCallbacks();
-</script>
-<p>This tests a change made with the fix for 8145.  The paragraph separator inserted to prevent nesting blocks from the fragment to paste inside the block where the paste occured was not being inserted when the fragment had an interchange newline at the end.</p>
-<div id="test" style="border: 1px solid black;" contenteditable="true"></div>
-
-<script>
-var s = window.getSelection();
-var p = document.getElementById("test");
-p.innerHTML = "<div>foo</div>";
-s.collapse(p, 0);
-s.modify("move", "forward", "character");
-var html = "<div>bar</div>baz<br class='Apple-interchange-newline'>";
-document.execCommand("InsertHTML", false, html);
-</script>
diff --git a/third_party/WebKit/LayoutTests/fast/block/collapse-nested-anonymous-block-expected.html b/third_party/WebKit/LayoutTests/fast/block/collapse-nested-anonymous-block-expected.html
new file mode 100644
index 0000000..1960b42
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/block/collapse-nested-anonymous-block-expected.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<style>
+#container {
+    text-indent: -300px;
+    width: 300px;
+}
+
+</style>
+<p>crbug.com/627149: Collapse away nested anonymous blocks. There should be no text below.</p>
+<button id="container">
+    <span id="span">Text.</span>
+</button>
diff --git a/third_party/WebKit/LayoutTests/fast/block/collapse-nested-anonymous-block.html b/third_party/WebKit/LayoutTests/fast/block/collapse-nested-anonymous-block.html
new file mode 100644
index 0000000..2fe35d2b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/block/collapse-nested-anonymous-block.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<style>
+#container {
+    text-indent: -300px;
+    width: 300px;
+}
+
+</style>
+<p>crbug.com/627149: Collapse away nested anonymous blocks. There should be no text below.</p>
+<button id="container">
+    <span id="span">Text.</span>
+</button>
+<script>
+    var container = document.getElementById('container');
+    var div = document.createElement('div');
+    container.insertBefore(div, document.getElementById('span'));
+    document.body.offsetTop;
+    container.removeChild(div);
+</script>
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-drawImage-out-of-bounds-src.html b/third_party/WebKit/LayoutTests/fast/canvas/canvas-drawImage-out-of-bounds-src.html
index 85173363..e2afad9 100644
--- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-drawImage-out-of-bounds-src.html
+++ b/third_party/WebKit/LayoutTests/fast/canvas/canvas-drawImage-out-of-bounds-src.html
@@ -36,15 +36,17 @@
 ctx1.drawImage(bgcanvas, 0,    0,    100, 200, 75,  175, 100, 100);
 ctx1.drawImage(bgcanvas, 0,    0,    200, 200, 175, 175, 100, 100);
 
-ctx2.drawImage(img, -100, -100, 300, 300, -25, -25, 300, 300);
-ctx2.drawImage(img, -100, -100, 200, 200, -25, -25, 100, 100);
-ctx2.drawImage(img, 0,    -100, 100, 200, 75,  -25, 100, 100);
-ctx2.drawImage(img, 0,    -100, 200, 200, 175, -25, 100, 100);
-ctx2.drawImage(img, -100, 0,    200, 100, -25, 75,  100, 100);
-ctx2.drawImage(img, 0,  0,      200, 100, 175, 75,  100, 100);
-ctx2.drawImage(img, -100, 0,    200, 200, -25, 175, 100, 100);
-ctx2.drawImage(img, 0,    0,    100, 200, 75,  175, 100, 100);
-ctx2.drawImage(img, 0,    0,    200, 200, 175, 175, 100, 100);
+img.onload = function() {
+    ctx2.drawImage(img, -100, -100, 300, 300, -25, -25, 300, 300);
+    ctx2.drawImage(img, -100, -100, 200, 200, -25, -25, 100, 100);
+    ctx2.drawImage(img, 0,    -100, 100, 200, 75,  -25, 100, 100);
+    ctx2.drawImage(img, 0,    -100, 200, 200, 175, -25, 100, 100);
+    ctx2.drawImage(img, -100, 0,    200, 100, -25, 75,  100, 100);
+    ctx2.drawImage(img, 0,  0,      200, 100, 175, 75,  100, 100);
+    ctx2.drawImage(img, -100, 0,    200, 200, -25, 175, 100, 100);
+    ctx2.drawImage(img, 0,    0,    100, 200, 75,  175, 100, 100);
+    ctx2.drawImage(img, 0,    0,    200, 200, 175, 175, 100, 100);
+}
 
 if (window.testRunner) {
     testRunner.waitUntilDone();
@@ -96,4 +98,4 @@
 }
 
 </script>
-</body></html>
\ No newline at end of file
+</body></html>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLImageElement/image-async-loading-data-uris.html b/third_party/WebKit/LayoutTests/fast/dom/HTMLImageElement/image-async-loading-data-uris.html
new file mode 100644
index 0000000..458b84930b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/dom/HTMLImageElement/image-async-loading-data-uris.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script>
+    test(function() {
+        var img = new Image();
+        img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=";
+        assert_equals(img.width, 0);
+    }, "Test that a data URI resource doesn't get loaded synchronously");
+</script>
diff --git a/third_party/WebKit/LayoutTests/fast/forms/basic-buttons.html b/third_party/WebKit/LayoutTests/fast/forms/basic-buttons.html
index 1ff9824..47fbe97 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/basic-buttons.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/basic-buttons.html
@@ -48,8 +48,10 @@
     }
 }
 
-printSize('button');
-printSize('input');
+window.onload = function() {
+    printSize('button');
+    printSize('input');
+};
 </script>
 
 </body> 
diff --git a/third_party/WebKit/LayoutTests/fast/text/emphasis-vertical.html b/third_party/WebKit/LayoutTests/fast/text/emphasis-vertical.html
index 1e57bd93..e7f0609 100644
--- a/third_party/WebKit/LayoutTests/fast/text/emphasis-vertical.html
+++ b/third_party/WebKit/LayoutTests/fast/text/emphasis-vertical.html
@@ -5,7 +5,7 @@
     body {
         -webkit-writing-mode: vertical-rl;
         font-size: 18px;
-        font-family: "HiraMinPro-W3", "Yu Gothic", "MS Gothic";
+        font-family: "HiraMinPro-W3", "MS Gothic";
         overflow: hidden;
     }
 
diff --git a/third_party/WebKit/LayoutTests/fast/writing-mode/japanese-lr-selection.html b/third_party/WebKit/LayoutTests/fast/writing-mode/japanese-lr-selection.html
index 1adffa9..3cec723 100644
--- a/third_party/WebKit/LayoutTests/fast/writing-mode/japanese-lr-selection.html
+++ b/third_party/WebKit/LayoutTests/fast/writing-mode/japanese-lr-selection.html
@@ -4,7 +4,7 @@
 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
 <style>
 body {
-    font-family: "HiraMinPro-W3", "Yu Gothic", "MS Gothic";
+    font-family: "HiraMinPro-W3", "MS Gothic";
     font-size: 16pt;
 }
 </style>
diff --git a/third_party/WebKit/LayoutTests/fast/writing-mode/japanese-rl-selection.html b/third_party/WebKit/LayoutTests/fast/writing-mode/japanese-rl-selection.html
index 2759ed3..9a7c071 100644
--- a/third_party/WebKit/LayoutTests/fast/writing-mode/japanese-rl-selection.html
+++ b/third_party/WebKit/LayoutTests/fast/writing-mode/japanese-rl-selection.html
@@ -4,7 +4,7 @@
 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
 <style>
 body {
-    font-family: "HiraMinPro-W3", "Yu Gothic", "MS Gothic";
+    font-family: "HiraMinPro-W3", "MS Gothic";
     font-size: 16pt;
 }
 </style>
diff --git a/third_party/WebKit/LayoutTests/fast/writing-mode/text-combine-various-fonts.html b/third_party/WebKit/LayoutTests/fast/writing-mode/text-combine-various-fonts.html
index 0eabfc41..0e27d4a 100644
--- a/third_party/WebKit/LayoutTests/fast/writing-mode/text-combine-various-fonts.html
+++ b/third_party/WebKit/LayoutTests/fast/writing-mode/text-combine-various-fonts.html
@@ -10,7 +10,7 @@
 .msgothic { font-family: 'MS Gothic'; }
 .msmincho { font-family: 'MS Mincho'; }
 .meiryo { font-family: Meiryo; }
-.yugothic { font-family: 'Yu Gothic', YuGothic; }
+.yugothic { font-family: /*'Yu Gothic',*/ YuGothic; }
 .yumincho { font-family: 'Yu Mincho', YuMincho; }
 .hirag { font-family: 'Hiragino Kaku Gothic ProN', 'Hiragino Kaku Gothic Pro'; }
 .hiram { font-family: 'Hiragino Mincho ProN', 'Hiragino Mincho Pro'; }
diff --git a/third_party/WebKit/LayoutTests/fullscreen/full-screen-orientation-change.html b/third_party/WebKit/LayoutTests/fullscreen/full-screen-orientation-change.html
new file mode 100644
index 0000000..9b44ef6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fullscreen/full-screen-orientation-change.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<title>Test that full screen requests are allowed when inside an orientation change handler.</title>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<span></span>
+<script>
+
+var element = document.querySelector('span');
+
+async_test(function(t) {
+  window.screen.orientation.onchange = t.step_func(function() {
+    element.webkitRequestFullScreen();
+  });
+
+  document.onwebkitfullscreenerror = t.unreached_func("fullscreen is not accepted when orientation is changed");
+  document.onwebkitfullscreenchange = t.step_func_done();
+
+  window.testRunner.setMockScreenOrientation('landscape-primary');
+});
+
+</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/console-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/console-test.js
index 294f51c..fd341208 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/console-test.js
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/console-test.js
@@ -368,6 +368,14 @@
     InspectorTest.addSniffer(InspectorTest.consoleModel, "addMessage", callback, false);
 }
 
+InspectorTest.waitUntilMessageReceivedPromise = function()
+{
+    var callback;
+    var promise = new Promise((fullfill) => callback = fullfill);
+    InspectorTest.waitUntilMessageReceived(callback);
+    return promise;
+}
+
 InspectorTest.waitUntilNthMessageReceived = function(count, callback)
 {
     function override()
@@ -380,6 +388,14 @@
     InspectorTest.addSniffer(InspectorTest.consoleModel, "addMessage", override, false);
 }
 
+InspectorTest.waitUntilNthMessageReceivedPromise = function(count)
+{
+    var callback;
+    var promise = new Promise((fullfill) => callback = fullfill);
+    InspectorTest.waitUntilNthMessageReceived(count, callback);
+    return promise;
+}
+
 InspectorTest.changeExecutionContext = function(namePrefix)
 {
     var selector = WebInspector.ConsoleView.instance()._executionContextModel._selectElement;
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/debugger-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/debugger-test.js
index c79c9121..2192ed4 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/debugger-test.js
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/debugger-test.js
@@ -19,6 +19,14 @@
     InspectorTest.safeWrap(callback)();
 };
 
+InspectorTest.startDebuggerTestPromise = function(quiet)
+{
+    var cb;
+    var p = new Promise(fullfill => cb = fullfill);
+    InspectorTest.startDebuggerTest(cb, quiet);
+    return p;
+}
+
 InspectorTest.completeDebuggerTest = function()
 {
     WebInspector.breakpointManager.setBreakpointsActive(true);
@@ -86,6 +94,14 @@
     InspectorTest.waitUntilPaused(callback);
 };
 
+InspectorTest.runTestFunctionAndWaitUntilPausedPromise = function()
+{
+    var cb;
+    var p = new Promise(fullfill => cb = fullfill);
+    InspectorTest.runTestFunctionAndWaitUntilPaused(cb);
+    return p;
+}
+
 InspectorTest.runAsyncCallStacksTest = function(totalDebuggerStatements, maxAsyncCallStackDepth)
 {
     InspectorTest.setQuiet(true);
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/elements-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/elements-test.js
index 25db6a9..ab1fb06d 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/elements-test.js
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/elements-test.js
@@ -437,7 +437,7 @@
 InspectorTest.eventListenersWidget = function()
 {
     var sidebarPane = WebInspector.panels.elements.sidebarPanes.eventListeners;
-    sidebarPane.requestReveal();
+    sidebarPane.revealWidget();
     return sidebarPane;
 }
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/elements/event-listeners-framework-with-service-worker.html b/third_party/WebKit/LayoutTests/http/tests/inspector/elements/event-listeners-framework-with-service-worker.html
index 4f561c12..c2863505 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/elements/event-listeners-framework-with-service-worker.html
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/elements/event-listeners-framework-with-service-worker.html
@@ -24,7 +24,7 @@
 
     function forceUpdate()
     {
-        objectEventListenersPane.requestReveal();
+        objectEventListenersPane.revealWidget();
         objectEventListenersPane.update();
     }
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-data-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-data-expected.txt
index ab7be0c..c77fa42 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-data-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-data-expected.txt
@@ -1,15 +1,15 @@
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback1
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback2
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback3
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback4
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback5
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback6
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback7
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback8
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback9
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback10
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback11
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback12
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback1
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback2
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback3
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback4
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback5
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback6
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback7
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback8
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback9
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback10
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback11
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback12
 Tests that data is correctly loaded by IndexedDBModel from IndexedDB object store and index.
 
 Dumping values, fromIndex = false, skipCount = 0, pageSize = 2, idbKeyRange = null
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-data.html b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-data.html
index 45052cb..e4e03fe 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-data.html
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-data.html
@@ -5,8 +5,7 @@
 <script>
 function test()
 {
-    var indexedDBModel = new WebInspector.IndexedDBModel(WebInspector.targetManager.mainTarget());
-    indexedDBModel.enable();
+    var indexedDBModel = InspectorTest.createIndexedDBModel();
     var mainFrameId = InspectorTest.resourceTreeModel.mainFrame.id;
     var securityOrigin = "http://127.0.0.1:8000";
     var databaseName = "testDatabase";
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-names-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-names-expected.txt
index 9565fbc..8b19b03755 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-names-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-names-expected.txt
@@ -1,7 +1,7 @@
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback1
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback2
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback3
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback4
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback1
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback2
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback3
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback4
 Tests that database names are correctly loaded and saved in IndexedDBModel.
 
 Dumping database names:
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-names.html b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-names.html
index a3760a4..94b1e59 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-names.html
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-names.html
@@ -5,14 +5,13 @@
 <script>
 function test()
 {
-    var indexedDBModel = new WebInspector.IndexedDBModel(WebInspector.targetManager.mainTarget());
-    indexedDBModel.enable();
+    var indexedDBModel = InspectorTest.createIndexedDBModel();
     var mainFrameId = InspectorTest.resourceTreeModel.mainFrame.id;
 
     function dumpDatabaseNames()
     {
         InspectorTest.addResult("Dumping database names:");
-        var securityOrigins = InspectorTest.resourceTreeModel.securityOrigins();
+        var securityOrigins = InspectorTest.securityOriginManager.securityOrigins();
         var securityOrigin = securityOrigins[0];
         var names = indexedDBModel._databaseNamesBySecurityOrigin[securityOrigin];
         for (var i = 0; i < names.length; ++i)
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-structure-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-structure-expected.txt
index 3266884..e3eb3df2 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-structure-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-structure-expected.txt
@@ -1,13 +1,13 @@
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback1
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback2
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback3
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback4
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback5
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback6
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback7
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback8
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback9
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback10
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback1
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback2
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback3
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback4
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback5
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback6
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback7
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback8
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback9
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback10
 Tests that database names are correctly loaded and saved in IndexedDBModel.
 
 Dumping database:
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-structure.html b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-structure.html
index 200887b..068e81b 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-structure.html
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/database-structure.html
@@ -5,8 +5,7 @@
 <script>
 function test()
 {
-    var indexedDBModel = new WebInspector.IndexedDBModel(WebInspector.targetManager.mainTarget());
-    indexedDBModel.enable();
+    var indexedDBModel = InspectorTest.createIndexedDBModel();
     var mainFrameId = InspectorTest.resourceTreeModel.mainFrame.id;
     var databaseName = "testDatabase1";
     var securityOrigin = "http://127.0.0.1:8000";
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/indexeddb-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/indexeddb-test.js
index 828bcf45..19f74ec 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/indexeddb-test.js
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/indexeddb-test.js
@@ -98,6 +98,13 @@
 {
     InspectorTest.evaluateWithCallback(frameId, "addIDBValue", [databaseName, objectStoreName, value, key], callback)
 };
+
+InspectorTest.createIndexedDBModel = function()
+{
+    var indexedDBModel = new WebInspector.IndexedDBModel(WebInspector.targetManager.mainTarget(), InspectorTest.securityOriginManager);
+    indexedDBModel.enable();
+    return indexedDBModel;
+};
 };
 
 function dispatchCallback(callbackId)
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/resources-panel-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/resources-panel-expected.txt
index b020c4b..f85d717 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/resources-panel-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/resources-panel-expected.txt
@@ -1,9 +1,9 @@
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback1
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback2
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback3
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback4
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback5
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback6
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback1
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback2
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback3
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback4
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback5
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback6
 Tests IndexedDB tree element on resources panel.
 
 Expanded IndexedDB tree element.
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/upgrade-events-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/upgrade-events-expected.txt
index 7a5a8a08..3151189 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/upgrade-events-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/upgrade-events-expected.txt
@@ -1,13 +1,13 @@
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback1
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback2
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback3
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback4
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback5
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback6
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback7
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback8
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback9
-CONSOLE MESSAGE: line 105: InspectorTest.IndexedDB_callback10
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback1
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback2
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback3
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback4
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback5
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback6
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback7
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback8
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback9
+CONSOLE MESSAGE: line 112: InspectorTest.IndexedDB_callback10
 Tests that deleted databases do not get recreated.
 
 Preparing database
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/upgrade-events.html b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/upgrade-events.html
index c94f4208..425f097d 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/upgrade-events.html
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/indexeddb/upgrade-events.html
@@ -5,8 +5,7 @@
 <script>
 function test()
 {
-    var indexedDBModel = new WebInspector.IndexedDBModel(WebInspector.targetManager.mainTarget());
-    indexedDBModel.enable();
+    var indexedDBModel = InspectorTest.createIndexedDBModel();
     var mainFrameId = InspectorTest.resourceTreeModel.mainFrame.id;
     var securityOrigin = "http://127.0.0.1:8000";
     var databaseName = "testDatabase - " + self.location;
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js
index 4b75bf3b..f0f43e8 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js
@@ -962,6 +962,7 @@
 
         InspectorTest.consoleModel = target.consoleModel;
         InspectorTest.networkManager = WebInspector.NetworkManager.fromTarget(target);
+        InspectorTest.securityOriginManager = WebInspector.SecurityOriginManager.fromTarget(target);
         InspectorTest.resourceTreeModel = target.resourceTreeModel;
         InspectorTest.networkLog = WebInspector.NetworkLog.fromTarget(target);
         InspectorTest.debuggerModel = WebInspector.DebuggerModel.fromTarget(target);
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-choose-preview-view-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-choose-preview-view-expected.txt
index df7d72d..5378aea 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-choose-preview-view-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-choose-preview-view-expected.txt
@@ -24,7 +24,7 @@
 Running: testXMLWithUnknownMime
 Creating a NetworkRequest with mimeType: text/foobar
 Content: <bar><foo/></bar>
-Its previewer type: SearchableView > widget vbox view
+Its previewer type: SearchableView > widget vbox
 
 Running: testXMLWithError500
 Creating a NetworkRequest with mimeType: text/xml
@@ -34,12 +34,12 @@
 Running: testUnknownMimeTextWithError500
 Creating a NetworkRequest with mimeType: text/foobar
 Content: Foo Bar
-Its previewer type: SearchableView > widget vbox view
+Its previewer type: SearchableView > widget vbox
 
 Running: testBinaryImageFile
 Creating a NetworkRequest with mimeType: image/png
 Content: Bin**NULL**ary File**NULL****NULL**
-Its previewer type: SearchableView > widget vbox view
+Its previewer type: SearchableView > widget vbox
 
 Running: testBinaryBlankImageFile
 Creating a NetworkRequest with mimeType: image/png
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/resource-tree/resource-tree-events.html b/third_party/WebKit/LayoutTests/http/tests/inspector/resource-tree/resource-tree-events.html
index 15351adc..f0d5e130 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/resource-tree/resource-tree-events.html
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/resource-tree/resource-tree-events.html
@@ -17,6 +17,8 @@
 
         for (var eventName in WebInspector.ResourceTreeModel.EventTypes)
             InspectorTest.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes[eventName], eventHandler.bind(this, eventName));
+        for (var eventName in WebInspector.SecurityOriginManager.EventTypes)
+            InspectorTest.securityOriginManager.addEventListener(WebInspector.SecurityOriginManager.EventTypes[eventName], eventHandler.bind(this, eventName));
 
         function eventHandler(eventName, event)
         {
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/workspace-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/workspace-test.js
index 6b7c24c..0f7f0db 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/workspace-test.js
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/workspace-test.js
@@ -44,7 +44,8 @@
         this.consoleModel = new WebInspector.ConsoleModel(this);
         this.networkManager = new WebInspector.NetworkManager(this);
         this.runtimeModel = new WebInspector.RuntimeModel(this);
-        this.resourceTreeModel = new WebInspector.ResourceTreeModel(this);
+        this.securityOriginManager = WebInspector.SecurityOriginManager.fromTarget(this);
+        this.resourceTreeModel = new WebInspector.ResourceTreeModel(this, this.networkManager, this.securityOriginManager);
         this.resourceTreeModel._inspectedPageURL = InspectorTest.resourceTreeModel._inspectedPageURL;
         this.resourceTreeModel._cachedResourcesProcessed = true;
         this.resourceTreeModel._frameAttached("42", 0);
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/report-blocked-data-uri-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/report-blocked-data-uri-expected.txt
index 2d69c423..a5dcef4 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/report-blocked-data-uri-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/report-blocked-data-uri-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE ERROR: line 7: Refused to load the image 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==' because it violates the following Content Security Policy directive: "img-src 'none'".
+CONSOLE ERROR: line 8: Refused to load the image 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==' because it violates the following Content Security Policy directive: "img-src 'none'".
 
 PingLoader dispatched to 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/save-report.php?test=report-blocked-data-uri.php'.
 CSP report received:
@@ -6,4 +6,4 @@
 HTTP_REFERER: http://127.0.0.1:8000/security/contentSecurityPolicy/report-blocked-data-uri.php
 REQUEST_METHOD: POST
 === POST DATA ===
-{"csp-report":{"document-uri":"http://127.0.0.1:8000/security/contentSecurityPolicy/report-blocked-data-uri.php","referrer":"","violated-directive":"img-src 'none'","effective-directive":"img-src","original-policy":"img-src 'none'; report-uri resources/save-report.php?test=report-blocked-data-uri.php","blocked-uri":"data","line-number":7,"source-file":"http://127.0.0.1:8000/security/contentSecurityPolicy/report-blocked-data-uri.php","status-code":200}}
+{"csp-report":{"document-uri":"http://127.0.0.1:8000/security/contentSecurityPolicy/report-blocked-data-uri.php","referrer":"","violated-directive":"img-src 'none'","effective-directive":"img-src","original-policy":"img-src 'none'; report-uri resources/save-report.php?test=report-blocked-data-uri.php","blocked-uri":"data","line-number":8,"source-file":"http://127.0.0.1:8000/security/contentSecurityPolicy/report-blocked-data-uri.php","status-code":200}}
diff --git a/third_party/WebKit/LayoutTests/imported/wpt/web-animations/interfaces/AnimationEffectTiming/getComputedStyle-expected.txt b/third_party/WebKit/LayoutTests/imported/wpt/web-animations/interfaces/AnimationEffectTiming/getComputedStyle-expected.txt
new file mode 100644
index 0000000..cce72c5d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/imported/wpt/web-animations/interfaces/AnimationEffectTiming/getComputedStyle-expected.txt
@@ -0,0 +1,13 @@
+This is a testharness.js-based test.
+PASS changed duration immediately updates its computed styles 
+PASS changed iterations immediately updates its computed styles 
+PASS change currentTime when fill is none and endDelay is positive 
+PASS change currentTime when fill forwards and endDelay is positive 
+PASS change currentTime when fill none and endDelay is negative 
+FAIL change currentTime when fill forwards and endDelay is negative assert_equals: set currentTime same as endTime expected "0" but got "0.5"
+PASS change direction from "normal" to "reverse" 
+PASS change direction from "normal" to "alternate" 
+PASS change direction from "normal" to "alternate-reverse" 
+PASS change direction from "normal" to "reverse" 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/inspector/audits/audits-empty-stylesheet-expected.txt b/third_party/WebKit/LayoutTests/inspector/audits/audits-empty-stylesheet-expected.txt
index e92d7e5..d8c10129 100644
--- a/third_party/WebKit/LayoutTests/inspector/audits/audits-empty-stylesheet-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/audits/audits-empty-stylesheet-expected.txt
@@ -1,6 +1,6 @@
 Tests running audits with a single empty stylesheet.
 
 Page reloaded.
- Network Utilization
- Web Page Performance
+    Network Utilization
+    Web Page Performance
 
diff --git a/third_party/WebKit/LayoutTests/inspector/audits/audits-panel-functional-expected.txt b/third_party/WebKit/LayoutTests/inspector/audits/audits-panel-functional-expected.txt
index a01edc98..3cbc65a 100644
--- a/third_party/WebKit/LayoutTests/inspector/audits/audits-panel-functional-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/audits/audits-panel-functional-expected.txt
@@ -2,44 +2,44 @@
 
    Text Link
 Page reloaded.
- Network Utilization
-      [severity severe] Combine external JavaScript (4)
-       There are multiple resources served from same domain. Consider combining them into as few files as possible.
-        4 JavaScript resources served from [domain].
-      [severity warning] Specify image dimensions (2)
-       A width and height should be specified for all images in order to speed up page display. The following image(s) are missing a width and/or height:
-         foo1.jpg
-         foo2.jpg
- Web Page Performance
-      [severity severe] Optimize the order of styles and scripts (2)
-       The following external CSS files were included after an external JavaScript file in the document head. To ensure CSS files are downloaded in parallel, always include external CSS before external JavaScript.
-         audits-style1.css
-        1 inline script block was found in the head between an external CSS file and another resource. To allow parallel downloading, move the inline script before the external CSS file, or after the next resource.
-      [severity severe] Put CSS in the document head (2)
-       CSS in the document body adversely impacts rendering performance.
-       1 style block(s) in the 
-        audits-panel-functional.html
-        body should be moved to the document head.
-       Link node 
-        audits-style1.css
-        should be moved to the document head in 
-        audits-panel-functional.html
-      [severity warning] Remove unused CSS rules (10)
-       10 rules (50%) of CSS not used by the current page.
-        Inline block #1: 41% is not used by the current page.
-         .unused
-         x:before
-         x:nth-child(1):hover:after
-         x:after
-         x:hover
-         x:first-letter
-         x:nth-child(2n + 1)
-        Inline block #2: 100% is not used by the current page.
-         .violation
-         audits-style1.css
-        : 100% is not used by the current page.
-         .some-style
-         audits-style1.css
-        : 100% is not used by the current page.
-         .some-style
+    Network Utilization
+        [severity severe] Combine external JavaScript (4)
+         There are multiple resources served from same domain. Consider combining them into as few files as possible.
+          4 JavaScript resources served from [domain].
+        [severity warning] Specify image dimensions (2)
+         A width and height should be specified for all images in order to speed up page display. The following image(s) are missing a width and/or height:
+           foo1.jpg
+           foo2.jpg
+    Web Page Performance
+        [severity severe] Optimize the order of styles and scripts (2)
+         The following external CSS files were included after an external JavaScript file in the document head. To ensure CSS files are downloaded in parallel, always include external CSS before external JavaScript.
+           audits-style1.css
+          1 inline script block was found in the head between an external CSS file and another resource. To allow parallel downloading, move the inline script before the external CSS file, or after the next resource.
+        [severity severe] Put CSS in the document head (2)
+         CSS in the document body adversely impacts rendering performance.
+         1 style block(s) in the 
+          audits-panel-functional.html
+          body should be moved to the document head.
+         Link node 
+          audits-style1.css
+          should be moved to the document head in 
+          audits-panel-functional.html
+        [severity warning] Remove unused CSS rules (10)
+         10 rules (50%) of CSS not used by the current page.
+          Inline block #1: 41% is not used by the current page.
+           .unused
+           x:before
+           x:nth-child(1):hover:after
+           x:after
+           x:hover
+           x:first-letter
+           x:nth-child(2n + 1)
+          Inline block #2: 100% is not used by the current page.
+           .violation
+           audits-style1.css
+          : 100% is not used by the current page.
+           .some-style
+           audits-style1.css
+          : 100% is not used by the current page.
+           .some-style
 
diff --git a/third_party/WebKit/LayoutTests/inspector/audits/audits-panel-noimages-functional-expected.txt b/third_party/WebKit/LayoutTests/inspector/audits/audits-panel-noimages-functional-expected.txt
index 46b11aa..701cc599 100644
--- a/third_party/WebKit/LayoutTests/inspector/audits/audits-panel-noimages-functional-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/audits/audits-panel-noimages-functional-expected.txt
@@ -1,34 +1,34 @@
 Tests audit rules on a page without images.
 Page reloaded.
- Network Utilization
-      [severity severe] Combine external JavaScript (4)
-       There are multiple resources served from same domain. Consider combining them into as few files as possible.
-        4 JavaScript resources served from [domain].
- Web Page Performance
-      [severity severe] Optimize the order of styles and scripts (3)
-        3 inline script blocks were found in the head between an external CSS file and another resource. To allow parallel downloading, move the inline script before the external CSS file, or after the next resource.
-      [severity severe] Put CSS in the document head (2)
-       CSS in the document body adversely impacts rendering performance.
-       1 style block(s) in the 
-        audits-panel-noimages-functional.html
-        body should be moved to the document head.
-       Link node 
-        audits-style1.css
-        should be moved to the document head in 
-        audits-panel-noimages-functional.html
-      [severity warning] Remove unused CSS rules (5)
-       5 rules (100%) of CSS not used by the current page.
-        Inline block #1: 100% is not used by the current page.
-         .unused
-        Inline block #2: 100% is not used by the current page.
-         .violation
-         audits-style1.css
-        : 100% is not used by the current page.
-         .some-style
-         audits-style1.css
-        : 100% is not used by the current page.
-         .some-style
-         audits-style1.css
-        : 100% is not used by the current page.
-         .some-style
+    Network Utilization
+        [severity severe] Combine external JavaScript (4)
+         There are multiple resources served from same domain. Consider combining them into as few files as possible.
+          4 JavaScript resources served from [domain].
+    Web Page Performance
+        [severity severe] Optimize the order of styles and scripts (3)
+          3 inline script blocks were found in the head between an external CSS file and another resource. To allow parallel downloading, move the inline script before the external CSS file, or after the next resource.
+        [severity severe] Put CSS in the document head (2)
+         CSS in the document body adversely impacts rendering performance.
+         1 style block(s) in the 
+          audits-panel-noimages-functional.html
+          body should be moved to the document head.
+         Link node 
+          audits-style1.css
+          should be moved to the document head in 
+          audits-panel-noimages-functional.html
+        [severity warning] Remove unused CSS rules (5)
+         5 rules (100%) of CSS not used by the current page.
+          Inline block #1: 100% is not used by the current page.
+           .unused
+          Inline block #2: 100% is not used by the current page.
+           .violation
+           audits-style1.css
+          : 100% is not used by the current page.
+           .some-style
+           audits-style1.css
+          : 100% is not used by the current page.
+           .some-style
+           audits-style1.css
+          : 100% is not used by the current page.
+           .some-style
 
diff --git a/third_party/WebKit/LayoutTests/inspector/components/widget-events-expected.txt b/third_party/WebKit/LayoutTests/inspector/components/widget-events-expected.txt
index f1e9cb3..ef05f0f 100644
--- a/third_party/WebKit/LayoutTests/inspector/components/widget-events-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/components/widget-events-expected.txt
@@ -244,3 +244,15 @@
 Child()
 Error: Attempt to show under node belonging to alien widget
 
+Running: testReparentWithinWidget
+Parent()
+Parent.show()
+  Parent.wasShown()
+  Parent.onResize()
+Child()
+Child.show()
+  Child.wasShown()
+  Child.onResize()
+Child.show()
+  Child.onResize()
+
diff --git a/third_party/WebKit/LayoutTests/inspector/components/widget-events.html b/third_party/WebKit/LayoutTests/inspector/components/widget-events.html
index e4cbc78c..82582f5c 100644
--- a/third_party/WebKit/LayoutTests/inspector/components/widget-events.html
+++ b/third_party/WebKit/LayoutTests/inspector/components/widget-events.html
@@ -355,6 +355,18 @@
                 InspectorTest.addResult(e);
             }
             next();
+        },
+
+        function testReparentWithinWidget(next)
+        {
+            var parentWidget = new TestWidget("Parent");
+            parentWidget.show(WebInspector.inspectorView.element);
+            var childWidget = new TestWidget("Child");
+            var container1 = parentWidget.element.createChild("div");
+            var container2 = parentWidget.element.createChild("div");
+            childWidget.show(container1);
+            childWidget.show(container2);
+            next();
         }
     ]);
 }
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-link-to-snippet-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-link-to-snippet-expected.txt
new file mode 100644
index 0000000..82470d07
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector/console/console-link-to-snippet-expected.txt
@@ -0,0 +1,17 @@
+CONSOLE MESSAGE: line 1: 239
+CONSOLE ERROR: line 2: 42
+Test that link to snippet works.
+
+
+Running: testConsoleLogAndReturnMessageLocation
+name1:1 239
+name1:1 42
+
+Running: testSnippetSyntaxError
+Line Message was added: name2 Error 'Uncaught SyntaxError: Unexpected token }':1:1
+name2:2 Uncaught SyntaxError: Unexpected token }
+
+Running: testConsoleErrorHighlight
+Line Message was added: name3 Error '42':1:10
+name3:2 42(anonymous function) @ name3:2
+
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-link-to-snippet.html b/third_party/WebKit/LayoutTests/inspector/console/console-link-to-snippet.html
new file mode 100644
index 0000000..ae95b7bc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector/console/console-link-to-snippet.html
@@ -0,0 +1,90 @@
+<html>
+<head>
+<script src="../../http/tests/inspector/inspector-test.js"></script>
+<script src="../../http/tests/inspector/sources-test.js"></script>
+<script src="../../http/tests/inspector/console-test.js"></script>
+<script>
+
+function test()
+{
+    InspectorTest.addSniffer(WebInspector.UISourceCode.prototype, "addLineMessage", dumpLineMessage, true);
+
+    InspectorTest.runTestSuite([
+        function testConsoleLogAndReturnMessageLocation(next)
+        {
+            InspectorTest.waitUntilNthMessageReceivedPromise(2)
+                .then(() => InspectorTest.dumpConsoleMessages())
+                .then(() => WebInspector.ConsoleView.clearConsole())
+                .then(() => next());
+
+            createSnippetPromise("console.log(239);42")
+                .then(uiSourceCode => selectSourceCode(uiSourceCode))
+                .then(uiSourceCode => renameSourceCodePromise("name1", uiSourceCode))
+                .then(() => runSelectedSnippet());
+        },
+
+        function testSnippetSyntaxError(next)
+        {
+            InspectorTest.waitUntilNthMessageReceivedPromise(1)
+                .then(() => InspectorTest.dumpConsoleMessages())
+                .then(() => WebInspector.ConsoleView.clearConsole())
+                .then(() => next());
+
+            createSnippetPromise("\n }")
+                .then(uiSourceCode => selectSourceCode(uiSourceCode))
+                .then(uiSourceCode => renameSourceCodePromise("name2", uiSourceCode))
+                .then(() => runSelectedSnippet());
+        },
+
+        function testConsoleErrorHighlight(next)
+        {
+            InspectorTest.waitUntilNthMessageReceivedPromise(1)
+                .then(() => InspectorTest.dumpConsoleMessages())
+                .then(() => WebInspector.ConsoleView.clearConsole())
+                .then(() => next());
+
+            createSnippetPromise("\n  console.error(42);")
+                .then(uiSourceCode => selectSourceCode(uiSourceCode))
+                .then(uiSourceCode => renameSourceCodePromise("name3", uiSourceCode))
+                .then(() => runSelectedSnippet());
+        }
+    ]);
+
+    function createSnippetPromise(content)
+    {
+        var callback;
+        var promise = new Promise(fullfill => callback = fullfill);
+        WebInspector.scriptSnippetModel._project.createFile("", null, content, callback);
+        return promise;
+    }
+
+    function renameSourceCodePromise(newName, uiSourceCode)
+    {
+        var callback;
+        var promise = new Promise(fullfill => callback = fullfill);
+        uiSourceCode.rename(newName, () => callback(uiSourceCode));
+        return promise;
+    }
+
+    function selectSourceCode(uiSourceCode)
+    {
+        WebInspector.SourcesPanel.instance()._sourceSelected({ data: { uiSourceCode: uiSourceCode }});
+        return uiSourceCode;
+    }
+
+    function dumpLineMessage(level, text, lineNumber, columnNumber)
+    {
+        InspectorTest.addResult(`Line Message was added: ${this.url()} ${level} '${text}':${lineNumber}:${columnNumber}`);
+    }
+
+    function runSelectedSnippet()
+    {
+        WebInspector.SourcesPanel.instance()._runSnippet();
+    }
+}
+</script>
+</head>
+<body onload="runTest()">
+<p>Test that link to snippet works.</p>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/extensions/extensions-audits-api-expected.txt b/third_party/WebKit/LayoutTests/inspector/extensions/extensions-audits-api-expected.txt
index 1729562..3e31d2b 100644
--- a/third_party/WebKit/LayoutTests/inspector/extensions/extensions-audits-api-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/extensions/extensions-audits-api-expected.txt
@@ -37,6 +37,6 @@
     }
     expanded : false
 }
- Extension audits
+    Extension audits
 All tests done.
 
diff --git a/third_party/WebKit/LayoutTests/inspector/extensions/extensions-audits-content-script-expected.txt b/third_party/WebKit/LayoutTests/inspector/extensions/extensions-audits-content-script-expected.txt
index df18edc..e24d6aa 100644
--- a/third_party/WebKit/LayoutTests/inspector/extensions/extensions-audits-content-script-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/extensions/extensions-audits-content-script-expected.txt
@@ -3,47 +3,47 @@
  Started extension.
 Running tests...
 RUNNING TEST: extension_testAudits
- Extension audits
-      [severity warning] Rule with details subtree (1)
-        Test Formatters
-               main world object
-                 whereAmI
-                 : 
-                 "main world"
-                 __proto__
-                 : 
-                 Object
-                 <
-                  span
-                  
-                   id
-                  ="
-                   test-element
-                  "
-                 >
-                 …
-                 <
-                  /span
-                 >
-               content script object
-                 whereAmI
-                 : 
-                 "brave new world"
-                 __proto__
-                 : 
-                 Object
-                 <
-                  span
-                  
-                   id
-                  ="
-                   test-element
-                  "
-                 >
-                 …
-                 <
-                  /span
-                 >
+    Extension audits
+        [severity warning] Rule with details subtree (1)
+          Test Formatters
+                 main world object
+                   whereAmI
+                   : 
+                   "main world"
+                   __proto__
+                   : 
+                   Object
+                   <
+                    span
+                    
+                     id
+                    ="
+                     test-element
+                    "
+                   >
+                   …
+                   <
+                    /span
+                   >
+                 content script object
+                   whereAmI
+                   : 
+                   "brave new world"
+                   __proto__
+                   : 
+                   Object
+                   <
+                    span
+                    
+                     id
+                    ="
+                     test-element
+                    "
+                   >
+                   …
+                   <
+                    /span
+                   >
 category.onAuditStarted fired
 All tests done.
 
diff --git a/third_party/WebKit/LayoutTests/inspector/extensions/extensions-audits-expected.txt b/third_party/WebKit/LayoutTests/inspector/extensions/extensions-audits-expected.txt
index 5b5f047..a4ab193 100644
--- a/third_party/WebKit/LayoutTests/inspector/extensions/extensions-audits-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/extensions/extensions-audits-expected.txt
@@ -5,48 +5,48 @@
 RUNNING TEST: extension_testAudits
 Progress: 50%
 Progress: 75%
- Extension audits
-      [severity severe] Failed rule (42)
-       this rule always fails
-      [severity warning] Rule with details subtree (1)
-       This rule has a lot of details
-        Subtree
-         Some url: 
-          WebKit
-          more text 
-          http://www.google.com
-         ... and a snippet
-           function rand()
+    Extension audits
+        [severity severe] Failed rule (42)
+         this rule always fails
+        [severity warning] Rule with details subtree (1)
+         This rule has a lot of details
+          Subtree
+           Some url: 
+            WebKit
+            more text 
+            http://www.google.com
+           ... and a snippet
+             function rand()
 {
     return 4;
 }
-           /path/to/error.html:10
-                object details
-                  a
-                  : 
-                  42
-                  b
-                  : 
-                  "foo"
-                  __proto__
-                  : 
-                  Object
-                  <
-                   span
-                   
-                    id
-                   ="
-                    test-element
-                   "
-                  >
-                  …
-                  <
-                   /span
-                  >
-           extensions-audits.html:20
-      [severity info] Passed rule
-       this rule always passes ok
- Extension audits that fail
+             /path/to/error.html:10
+                  object details
+                    a
+                    : 
+                    42
+                    b
+                    : 
+                    "foo"
+                    __proto__
+                    : 
+                    Object
+                    <
+                     span
+                     
+                      id
+                     ="
+                      test-element
+                     "
+                    >
+                    …
+                    <
+                     /span
+                    >
+             extensions-audits.html:20
+        [severity info] Passed rule
+         this rule always passes ok
+    Extension audits that fail
 category.onAuditStarted fired
 failedCategory.onAuditStarted fired, throwing exception
 All tests done.
diff --git a/third_party/WebKit/LayoutTests/inspector/extensions/extensions-events.html b/third_party/WebKit/LayoutTests/inspector/extensions/extensions-events.html
index 5a5a12a..2d9f8c53 100644
--- a/third_party/WebKit/LayoutTests/inspector/extensions/extensions-events.html
+++ b/third_party/WebKit/LayoutTests/inspector/extensions/extensions-events.html
@@ -12,7 +12,7 @@
     {
         var sidebar = InspectorTest._extensionSidebar();
         InspectorTest.deprecatedRunAfterPendingDispatches(function() {
-            sidebar.requestReveal();
+            sidebar.revealWidget();
             callback();
         });
     }
diff --git a/third_party/WebKit/LayoutTests/inspector/extensions/extensions-sidebar.html b/third_party/WebKit/LayoutTests/inspector/extensions/extensions-sidebar.html
index 6f1f92e..0f93226 100644
--- a/third_party/WebKit/LayoutTests/inspector/extensions/extensions-sidebar.html
+++ b/third_party/WebKit/LayoutTests/inspector/extensions/extensions-sidebar.html
@@ -19,7 +19,7 @@
     {
         var sidebar = InspectorTest._extensionSidebar(panelName);
         InspectorTest.deprecatedRunAfterPendingDispatches(function() {
-            sidebar.requestReveal();
+            sidebar.revealWidget();
             callback();
         });
     }
diff --git a/third_party/WebKit/LayoutTests/inspector/reveal-objects.html b/third_party/WebKit/LayoutTests/inspector/reveal-objects.html
index c5a7dad..52617f7 100644
--- a/third_party/WebKit/LayoutTests/inspector/reveal-objects.html
+++ b/third_party/WebKit/LayoutTests/inspector/reveal-objects.html
@@ -100,7 +100,7 @@
         InspectorTest.addSniffer(WebInspector.ElementsPanel.prototype, "revealAndSelectNode", nodeRevealed, true);
         InspectorTest.addSniffer(WebInspector.SourcesPanel.prototype, "showUILocation", uiLocationRevealed, true);
         InspectorTest.addSniffer(WebInspector.ResourcesPanel.prototype, "showResource", resourceRevealed, true);
-        InspectorTest.addSniffer(WebInspector.NetworkPanel.prototype, "revealAndHighlightRequest", requestRevealed, true);
+        InspectorTest.addSniffer(WebInspector.NetworkPanel.prototype, "revealAndHighlightRequest", revealWidgeted, true);
     }
 
     function nodeRevealed(node)
@@ -118,7 +118,7 @@
         InspectorTest.addResult("Resource " + resource.displayName + " revealed in the Resources panel");
     }
 
-    function requestRevealed(request)
+    function revealWidgeted(request)
     {
         InspectorTest.addResult("Request " + new WebInspector.ParsedURL(request.url).lastPathComponent + " revealed in the Network panel");
     }
diff --git a/third_party/WebKit/LayoutTests/inspector/screen-orientation-override-expected.txt b/third_party/WebKit/LayoutTests/inspector/screen-orientation-override-expected.txt
index 25b78e8..711aab48 100644
--- a/third_party/WebKit/LayoutTests/inspector/screen-orientation-override-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/screen-orientation-override-expected.txt
@@ -2,6 +2,7 @@
 CONSOLE MESSAGE: line 25: angle: 180; type: portrait-secondary
 CONSOLE MESSAGE: line 25: angle: 90; type: landscape-primary
 CONSOLE MESSAGE: line 25: angle: 270; type: landscape-secondary
+CONSOLE MESSAGE: line 25: angle: 0; type: landscape-primary
 
 Running: initial
 
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-step/debugger-step-in-ignore-injected-script-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/debugger-step/debugger-step-in-ignore-injected-script-expected.txt
new file mode 100644
index 0000000..5b3b45e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-step/debugger-step-in-ignore-injected-script-expected.txt
@@ -0,0 +1,7 @@
+CONSOLE MESSAGE: line 9: 123
+Tests that stepInto doesn't pause in InjectedScriptSource.
+
+Set timer for test function.
+Call stack:
+    0) testFunction (debugger-step-in-ignore-injected-script.html:10)
+
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-step/debugger-step-in-ignore-injected-script.html b/third_party/WebKit/LayoutTests/inspector/sources/debugger-step/debugger-step-in-ignore-injected-script.html
new file mode 100644
index 0000000..5e650e9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-step/debugger-step-in-ignore-injected-script.html
@@ -0,0 +1,38 @@
+<html>
+<head>
+<script src="../../../http/tests/inspector/inspector-test.js"></script>
+<script src="../../../http/tests/inspector/debugger-test.js"></script>
+<script>
+function testFunction()
+{
+    debugger;
+    console.log(123);
+    return 239; // stack result should point here
+}
+</script>
+<script>
+
+function test()
+{
+    InspectorTest.startDebuggerTestPromise(/* quiet */ true)
+        .then(() => InspectorTest.runTestFunctionAndWaitUntilPausedPromise())
+        .then(() => stepIntoPromise())
+        .then(() => stepIntoPromise())
+        .then((callFrames) => InspectorTest.captureStackTrace(callFrames))
+        .then(() => InspectorTest.completeDebuggerTest());
+
+    function stepIntoPromise()
+    {
+        var cb;
+        var p = new Promise(fullfill => cb = fullfill);
+        InspectorTest.stepInto();
+        InspectorTest.waitUntilResumed(() => InspectorTest.waitUntilPaused(cb));
+        return p;
+    }
+}
+</script>
+</head>
+<body onload="runTest()">
+<p>Tests that stepInto doesn't pause in InjectedScriptSource.</p>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/error-in-watch-expressions.html b/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/error-in-watch-expressions.html
index 7d7f3b5..642f7a7e 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/error-in-watch-expressions.html
+++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/error-in-watch-expressions.html
@@ -8,7 +8,7 @@
 var test = function()
 {
     var watchExpressionsPane = WebInspector.panels.sources.sidebarPanes.watchExpressions;
-    watchExpressionsPane.requestReveal();
+    watchExpressionsPane.revealWidget();
     watchExpressionsPane.addExpression("#$%");
 
     InspectorTest.deprecatedRunAfterPendingDispatches(step1);
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/watch-expressions-panel-switch.html b/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/watch-expressions-panel-switch.html
index e449fa52..76c041f 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/watch-expressions-panel-switch.html
+++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/watch-expressions-panel-switch.html
@@ -24,7 +24,7 @@
     function step1()
     {
         watchExpressionsPane = WebInspector.panels.sources.sidebarPanes.watchExpressions;
-        watchExpressionsPane.requestReveal();
+        watchExpressionsPane.revealWidget();
         watchExpressionsPane.addExpression("window.document");
         watchExpressionsPane.addExpression("windowa.document");
 
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/watch-expressions-preserve-expansion.html b/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/watch-expressions-preserve-expansion.html
index a789a9b4..d4299de 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/watch-expressions-preserve-expansion.html
+++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/watch-expressions-preserve-expansion.html
@@ -27,7 +27,7 @@
 var test = function()
 {
     var watchExpressionsPane = WebInspector.panels.sources.sidebarPanes.watchExpressions;
-    watchExpressionsPane.requestReveal();
+    watchExpressionsPane.revealWidget();
     watchExpressionsPane.addExpression("globalObject");
     watchExpressionsPane.addExpression("windowAlias");
     watchExpressionsPane.addExpression("array");
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger/internal-script-flag-for-injected-script-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/debugger/internal-script-flag-for-injected-script-expected.txt
index 2ec3d70..67d14e7 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/debugger/internal-script-flag-for-injected-script-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger/internal-script-flag-for-injected-script-expected.txt
@@ -1,6 +1,6 @@
 CONSOLE MESSAGE: line 1: 42
 Tests that injected script has isInternalScript flag.
 
-Internal script
-Internal script
+:Internal script
+foo.js:Not internal script
 
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger/internal-script-flag-for-injected-script.html b/third_party/WebKit/LayoutTests/inspector/sources/debugger/internal-script-flag-for-injected-script.html
index 9890867..26679c6f 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/debugger/internal-script-flag-for-injected-script.html
+++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger/internal-script-flag-for-injected-script.html
@@ -12,13 +12,13 @@
 function test()
 {
     InspectorTest.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.ParsedScriptSource, step2);
-    InspectorTest.evaluateInPage("newWorld()");
+    InspectorTest.evaluateInPage("newWorld()\n//# sourceURL=foo.js");
 
     var expectedScriptParsed = 2;
     function step2(event)
     {
         var script = event.data;
-        InspectorTest.addResult(script._isInternalScript ? "Internal script" : "Not internal script");
+        InspectorTest.addResult(script.sourceURL + ":" + (script._isInternalScript ? "Internal script" : "Not internal script"));
         --expectedScriptParsed;
         if (!expectedScriptParsed)
             InspectorTest.completeTest();
diff --git a/third_party/WebKit/LayoutTests/loader/data-uri-images-load-asynchronously-expected.txt b/third_party/WebKit/LayoutTests/loader/data-uri-images-load-asynchronously-expected.txt
new file mode 100644
index 0000000..21927c9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/loader/data-uri-images-load-asynchronously-expected.txt
@@ -0,0 +1,2 @@
+Test for crbug.com/224317: data:uri images should load asynchronously.
+PASS
diff --git a/third_party/WebKit/LayoutTests/loader/data-uri-images-load-synchronously.html b/third_party/WebKit/LayoutTests/loader/data-uri-images-load-asynchronously.html
similarity index 89%
rename from third_party/WebKit/LayoutTests/loader/data-uri-images-load-synchronously.html
rename to third_party/WebKit/LayoutTests/loader/data-uri-images-load-asynchronously.html
index 7746f5b5..370eff19 100644
--- a/third_party/WebKit/LayoutTests/loader/data-uri-images-load-synchronously.html
+++ b/third_party/WebKit/LayoutTests/loader/data-uri-images-load-asynchronously.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <html>
 <body>
-Test for crbug.com/224317: data:uri images should load synchronously.<br/>
+Test for crbug.com/224317: data:uri images should load asynchronously.<br/>
 <script>
     if (window.testRunner)
         testRunner.dumpAsText();
@@ -10,9 +10,9 @@
     image.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAnklEQVR42u3QMQEAAAgDoGlyo1vBzwciUJlw1ApkyZIlS5YsBbJkyZIlS5YCWbJkyZIlS4EsWbJkyZKlQJYsWbJkyVIgS5YsWbJkKZAlS5YsWbIUyJIlS5YsWQpkyZIlS5YsBbJkyZIlS5YCWbJkyZIlS4EsWbJkyZKlQJYsWbJkyVIgS5YsWbJkKZAlS5YsWbIUyJIlS5YsWQpkyfq2MosBSIeKONMAAAAASUVORK5CYII=";
 
     if (image.width == 100 && image.height == 100)
-        document.write("PASS");
-    else
         document.write("FAIL");
+    else
+        document.write("PASS");
 </script>
 </body>
 </html>
diff --git a/third_party/WebKit/LayoutTests/loader/data-uri-images-load-synchronously-expected.txt b/third_party/WebKit/LayoutTests/loader/data-uri-images-load-synchronously-expected.txt
deleted file mode 100644
index 1dddd7e..0000000
--- a/third_party/WebKit/LayoutTests/loader/data-uri-images-load-synchronously-expected.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Test for crbug.com/224317: data:uri images should load synchronously.
-PASS
diff --git a/third_party/WebKit/LayoutTests/loader/data-uri-images-reload-asynchronously-expected.txt b/third_party/WebKit/LayoutTests/loader/data-uri-images-reload-asynchronously-expected.txt
new file mode 100644
index 0000000..8289b387
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/loader/data-uri-images-reload-asynchronously-expected.txt
@@ -0,0 +1,2 @@
+Test for crbug.com/224317: data:uri images should load asynchronously and reload synchronously.
+PASS
diff --git a/third_party/WebKit/LayoutTests/loader/data-uri-images-reload-synchronously.html b/third_party/WebKit/LayoutTests/loader/data-uri-images-reload-asynchronously.html
similarity index 65%
rename from third_party/WebKit/LayoutTests/loader/data-uri-images-reload-synchronously.html
rename to third_party/WebKit/LayoutTests/loader/data-uri-images-reload-asynchronously.html
index 9b583e0..cc83ee51 100644
--- a/third_party/WebKit/LayoutTests/loader/data-uri-images-reload-synchronously.html
+++ b/third_party/WebKit/LayoutTests/loader/data-uri-images-reload-asynchronously.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <html>
 <body>
-Test for crbug.com/224317: data:uri images should reload synchronously.<br/>
+Test for crbug.com/224317: data:uri images should load asynchronously and reload synchronously.<br/>
 <script>
     if (window.testRunner) {
         testRunner.waitUntilDone();
@@ -11,17 +11,23 @@
     var image = new Image();
     image.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAnklEQVR42u3QMQEAAAgDoGlyo1vBzwciUJlw1ApkyZIlS5YsBbJkyZIlS5YCWbJkyZIlS4EsWbJkyZKlQJYsWbJkyVIgS5YsWbJkKZAlS5YsWbIUyJIlS5YsWQpkyZIlS5YsBbJkyZIlS5YCWbJkyZIlS4EsWbJkyZKlQJYsWbJkyVIgS5YsWbJkKZAlS5YsWbIUyJIlS5YsWQpkyfq2MosBSIeKONMAAAAASUVORK5CYII=";
 
-    if (image.width != 100 || image.height != 100) {
-        document.write("FAIL");
-    } else {
-        if (location.hash == "#reloaded") {
-            document.write("PASS");
+    if (location.hash != "#reloaded") {
+        if (image.width == 100 || image.height == 100) {
+            document.write("FAIL");
             if (window.testRunner)
                 testRunner.notifyDone();
         } else {
             location.hash = "#reloaded";
             location.reload();
         }
+    } else {
+        if (image.width == 100 || image.height == 100) {
+            document.write("PASS");
+        } else {
+            document.write("FAIL");
+        }
+        if (window.testRunner)
+            testRunner.notifyDone();
     }
 </script>
 </body>
diff --git a/third_party/WebKit/LayoutTests/loader/data-uri-images-reload-synchronously-expected.txt b/third_party/WebKit/LayoutTests/loader/data-uri-images-reload-synchronously-expected.txt
deleted file mode 100644
index c0ed5e95..0000000
--- a/third_party/WebKit/LayoutTests/loader/data-uri-images-reload-synchronously-expected.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Test for crbug.com/224317: data:uri images should reload synchronously.
-PASS
diff --git a/third_party/WebKit/LayoutTests/platform/android/editing/pasteboard/8145-1-expected.png b/third_party/WebKit/LayoutTests/platform/android/editing/pasteboard/8145-1-expected.png
deleted file mode 100644
index d46c1ed3..0000000
--- a/third_party/WebKit/LayoutTests/platform/android/editing/pasteboard/8145-1-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/editing/pasteboard/8145-1-expected.txt b/third_party/WebKit/LayoutTests/platform/android/editing/pasteboard/8145-1-expected.txt
deleted file mode 100644
index 7310f96f..0000000
--- a/third_party/WebKit/LayoutTests/platform/android/editing/pasteboard/8145-1-expected.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x20
-        LayoutText {#text} at (0,0) size 409x19
-          text run at (0,0) width 409: "This is a replica of the paste that caused the crash covered by 8145."
-      LayoutBlockFlow {DIV} at (0,36) size 784x22 [border: (1px solid #000000)]
-        LayoutText {#text} at (1,1) size 69x19
-          text run at (1,1) width 69: "foo bar baz"
-caret: position 11 of child 0 {#text} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/android/virtual/gpu-rasterization/fast/images/jpeg-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/android/virtual/gpu-rasterization/fast/images/jpeg-with-color-profile-expected.png
new file mode 100644
index 0000000..c633a38
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/virtual/gpu-rasterization/fast/images/jpeg-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/virtual/gpu-rasterization/fast/images/png-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/android/virtual/gpu-rasterization/fast/images/png-with-color-profile-expected.png
new file mode 100644
index 0000000..c633a38
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/virtual/gpu-rasterization/fast/images/png-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-div-022-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-div-022-expected.png
deleted file mode 100644
index e993784..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-div-022-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-div-022-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-div-022-expected.txt
deleted file mode 100644
index 9a0efcf..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-div-022-expected.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x568
-      LayoutBlockFlow (anonymous) at (0,0) size 784x112
-        LayoutText {#text} at (0,0) size 784x83
-          text run at (0,0) width 747: "Test inserting paragraphs: should see \"foo\" in a blue box, then a blue box with"
-          text run at (746,0) width 7: " "
-          text run at (0,28) width 780: "with two lines in it: First line a bold \"x\"; second line a non-bold \"bar\". Fix for this"
-          text run at (780,28) width 4: " "
-          text run at (0,56) width 47: "bug: "
-        LayoutInline {A} at (0,0) size 257x27 [color=#0000EE]
-          LayoutText {#text} at (47,56) size 257x27
-            text run at (47,56) width 257: "<rdar://problem/3927554>"
-        LayoutText {#text} at (304,56) size 784x55
-          text run at (304,56) width 480: " Style info applied to remainder of document after"
-          text run at (784,56) width 0: " "
-          text run at (0,84) width 191: "a newline is entered"
-      LayoutBlockFlow {DIV} at (0,112) size 784x12
-      LayoutBlockFlow {P} at (0,148) size 784x55 [border: (2px solid #0000FF)]
-        LayoutInline {B} at (0,0) size 31x26
-          LayoutText {#text} at (14,14) size 31x26
-            text run at (14,14) width 31: "foo"
-      LayoutBlockFlow {P} at (0,227) size 784x83 [border: (2px solid #0000FF)]
-        LayoutInline {B} at (0,0) size 12x26
-          LayoutText {#text} at (14,14) size 12x26
-            text run at (14,14) width 12: "x"
-          LayoutBR {BR} at (26,35) size 0x0 [bgcolor=#008000]
-        LayoutText {#text} at (14,41) size 31x27
-          text run at (14,41) width 31: "bar"
-caret: position 1 of child 0 {#text} of child 0 {B} of child 6 {P} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-01-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-01-expected.png
deleted file mode 100644
index ee76492e..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-01-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-01-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-01-expected.txt
deleted file mode 100644
index 11873b7..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-01-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 742x39
-          text run at (0,0) width 341: "This tests inserting a paragraph separator before a table. "
-          text run at (341,0) width 401: "There should be an empty paragraph before the table and the caret"
-          text run at (0,20) width 185: "should be just before the table."
-      LayoutBlockFlow {DIV} at (0,56) size 784x50
-        LayoutBlockFlow (anonymous) at (0,0) size 784x20
-          LayoutBR {BR} at (0,0) size 0x19
-        LayoutTable {TABLE} at (0,20) size 30x30 [border: (1px outset #808080)]
-          LayoutTableSection {TBODY} at (1,1) size 28x28
-            LayoutTableRow {TR} at (0,2) size 28x24
-              LayoutTableCell {TD} at (2,2) size 24x24 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
-                LayoutText {#text} at (2,2) size 20x19
-                  text run at (2,2) width 20: "foo"
-caret: position 0 of child 1 {TABLE} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-02-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-02-expected.png
deleted file mode 100644
index 33ec9e90..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-02-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-02-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-02-expected.txt
deleted file mode 100644
index 3532bc36..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-02-expected.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 764x39
-          text run at (0,0) width 329: "This tests inserting a paragraph separator after a table. "
-          text run at (329,0) width 435: "There should be an empty paragraph between the table and 'bar' and the"
-          text run at (0,20) width 238: "caret should be in the empty paragraph."
-      LayoutBlockFlow {DIV} at (0,56) size 784x70
-        LayoutTable {TABLE} at (0,0) size 30x30 [border: (1px outset #808080)]
-          LayoutTableSection {TBODY} at (1,1) size 28x28
-            LayoutTableRow {TR} at (0,2) size 28x24
-              LayoutTableCell {TD} at (2,2) size 24x24 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
-                LayoutText {#text} at (2,2) size 20x19
-                  text run at (2,2) width 20: "foo"
-        LayoutBlockFlow (anonymous) at (0,30) size 784x40
-          LayoutBR {BR} at (0,0) size 0x19
-          LayoutText {#text} at (0,20) size 20x19
-            text run at (0,20) width 20: "bar"
-caret: position 0 of child 1 {BR} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-03-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-03-expected.png
deleted file mode 100644
index 4ba05242..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-03-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-03-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-03-expected.txt
deleted file mode 100644
index 59877e4f..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-03-expected.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 784x39
-          text run at (0,0) width 396: "This tests inserting a paragraph separator before a horizontal rule. "
-          text run at (396,0) width 388: "You should see 'foo', empty paragraph, horizontal rule, 'bar', and"
-          text run at (0,20) width 296: "the caret should be just before the horizontal rule."
-      LayoutBlockFlow {DIV} at (0,56) size 784x78
-        LayoutBlockFlow (anonymous) at (0,0) size 784x40
-          LayoutText {#text} at (0,0) size 20x19
-            text run at (0,0) width 20: "foo"
-          LayoutBR {BR} at (20,15) size 0x0
-          LayoutBR {BR} at (0,20) size 0x19
-        LayoutBlockFlow {HR} at (0,48) size 784x2 [border: (1px inset #EEEEEE)]
-        LayoutBlockFlow (anonymous) at (0,58) size 784x20
-          LayoutText {#text} at (0,0) size 20x19
-            text run at (0,0) width 20: "bar"
-caret: position 0 of child 3 {HR} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-05-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-05-expected.png
deleted file mode 100644
index ebc863a9..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-05-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-05-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-05-expected.txt
deleted file mode 100644
index efe515c..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-paragraph-05-expected.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x20
-        LayoutText {#text} at (0,0) size 580x19
-          text run at (0,0) width 580: "This tests inserting a paragraph separator before a special element at the start of an editable root."
-      LayoutBlockFlow {P} at (0,36) size 784x20
-        LayoutText {#text} at (0,0) size 576x19
-          text run at (0,0) width 576: "Visually, it should leave a blank line before the link, and the caret selection at the start of the link."
-      LayoutBlockFlow {P} at (0,72) size 784x20
-        LayoutText {#text} at (0,0) size 752x19
-          text run at (0,0) width 752: "Structurally, the empty paragraph element should go before the anchor element, rather than inside of it. See Radar #5452675."
-      LayoutBlockFlow {DIV} at (0,108) size 784x40
-        LayoutBlockFlow {DIV} at (0,0) size 784x20
-          LayoutBR {BR} at (0,0) size 0x19
-        LayoutBlockFlow (anonymous) at (0,20) size 784x20
-          LayoutInline {A} at (0,0) size 53x19 [color=#0000EE]
-            LayoutText {#text} at (0,0) size 53x19
-              text run at (0,0) width 53: "applesite"
-caret: position 0 of child 0 {#text} of child 1 {A} of child 6 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-001-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-001-expected.png
deleted file mode 100644
index 545c947b..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-001-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-001-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-001-expected.txt
deleted file mode 100644
index 6c12a1c..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-001-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 80x27
-          LayoutInline {SPAN} at (0,0) size 48x27
-            LayoutText {#text} at (14,14) size 48x27
-              text run at (14,14) width 48: "\x{9}"
-          LayoutText {#text} at (62,14) size 32x27
-            text run at (62,14) width 32: "foo"
-        LayoutText {#text} at (0,0) size 0x0
-caret: position 1 of child 0 {#text} of child 0 {SPAN} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-002-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-002-expected.png
deleted file mode 100644
index 8e53c1a..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-002-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-002-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-002-expected.txt
deleted file mode 100644
index 81ed8cb4..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-002-expected.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 48x27
-          LayoutText {#text} at (14,14) size 32x27
-            text run at (14,14) width 32: "foo"
-          LayoutInline {SPAN} at (0,0) size 16x27
-            LayoutText {#text} at (46,14) size 16x27
-              text run at (46,14) width 16: "\x{9}"
-caret: position 1 of child 0 {#text} of child 1 {SPAN} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-003-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-003-expected.png
deleted file mode 100644
index f4b9ea9..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-003-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-003-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-003-expected.txt
deleted file mode 100644
index de805fae..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-003-expected.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 60x27
-          LayoutText {#text} at (14,14) size 20x27
-            text run at (14,14) width 20: "fo"
-          LayoutInline {SPAN} at (0,0) size 28x27
-            LayoutText {#text} at (34,14) size 28x27
-              text run at (34,14) width 28: "\x{9}"
-          LayoutText {#text} at (62,14) size 12x27
-            text run at (62,14) width 12: "o"
-        LayoutText {#text} at (0,0) size 0x0
-caret: position 1 of child 0 {#text} of child 1 {SPAN} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-004-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-004-expected.png
deleted file mode 100644
index 848391cc..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-004-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-004-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-004-expected.txt
deleted file mode 100644
index fe72e08..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-tab-004-expected.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x84 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 80x55
-          LayoutBR {BR} at (14,14) size 0x27
-          LayoutInline {SPAN} at (0,0) size 48x27
-            LayoutText {#text} at (14,42) size 48x27
-              text run at (14,42) width 48: "\x{9}"
-          LayoutText {#text} at (62,42) size 32x27
-            text run at (62,42) width 32: "foo"
-        LayoutText {#text} at (0,0) size 0x0
-caret: position 1 of child 0 {#text} of child 1 {SPAN} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-with-newlines-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-with-newlines-expected.png
deleted file mode 100644
index f1f57cb..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-with-newlines-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-with-newlines-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-with-newlines-expected.txt
deleted file mode 100644
index a7ca601..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-with-newlines-expected.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x140 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 79x111
-          LayoutText {#text} at (14,14) size 79x27
-            text run at (14,14) width 79: "Foo xxx"
-          LayoutBR {BR} at (93,35) size 0x0
-          LayoutInline {I} at (0,0) size 34x27
-            LayoutText {#text} at (14,42) size 34x27
-              text run at (14,42) width 34: "bar"
-          LayoutText {#text} at (48,42) size 42x27
-            text run at (48,42) width 42: " xxx"
-          LayoutBR {BR} at (90,63) size 0x0
-          LayoutBR {BR} at (14,70) size 0x27
-          LayoutText {#text} at (14,98) size 69x27
-            text run at (14,98) width 69: "bazxxx"
-caret: position 6 of child 6 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-001-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-001-expected.png
deleted file mode 100644
index aec3ae9..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-001-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-001-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-001-expected.txt
deleted file mode 100644
index 35d5a7e..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-001-expected.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 176x27
-          LayoutText {#text} at (14,14) size 176x27
-            text run at (14,14) width 176: "xxxXXxxxXXxxx"
-caret: position 13 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-002-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-002-expected.png
deleted file mode 100644
index 068e11f..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-002-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-002-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-002-expected.txt
deleted file mode 100644
index 39da157..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-002-expected.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 113x27
-          LayoutText {#text} at (14,14) size 79x27
-            text run at (14,14) width 79: "Foo xxx"
-          LayoutInline {I} at (0,0) size 34x27
-            LayoutText {#text} at (93,14) size 34x27
-              text run at (93,14) width 34: "bar"
-        LayoutText {#text} at (0,0) size 0x0
-caret: position 7 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-003-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-003-expected.png
deleted file mode 100644
index 34ebe4a..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-003-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-003-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-003-expected.txt
deleted file mode 100644
index c402e80..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-003-expected.txt
+++ /dev/null
@@ -1,528 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x140 [border: (2px solid #FF0000)]
-        LayoutText {#text} at (14,14) size 738x111
-          text run at (14,14) width 696: "xxxx x xx xxxx xxxxxx xxxxx xxxxxx xxx xx xxxx xxx xxx xx x xxxxx"
-          text run at (710,14) width 6: " "
-          text run at (14,42) width 732: "xxxxxxxxxxxx xxxxxxxx xxx xxxx xxxxx xx xxx xxxx xxxx xxxxx xxxxxx"
-          text run at (746,42) width 6: " "
-          text run at (14,70) width 714: "xxx xx xxxx xxx xxx xx xxxxxx xxxxx xxxxxx xxx xx xxxx xxx xxx xx x"
-          text run at (728,70) width 6: " "
-          text run at (14,98) width 360: "xxxxx xxxxxxxxxxxx xxxxxxxx xxx "
-        LayoutInline {SPAN} at (0,0) size 0x27
-caret: position 233 of child 0 {#text} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-around-br-001-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-around-br-001-expected.png
deleted file mode 100644
index 5a977c8..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-around-br-001-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-around-br-001-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-around-br-001-expected.txt
deleted file mode 100644
index 038a073..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/typing-around-br-001-expected.txt
+++ /dev/null
@@ -1,95 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x252 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 70x223
-          LayoutText {#text} at (14,14) size 70x27
-            text run at (14,14) width 70: "XXxxx"
-          LayoutBR {BR} at (84,35) size 0x0
-          LayoutText {#text} at (14,42) size 70x27
-            text run at (14,42) width 70: "XXxxx"
-          LayoutBR {BR} at (84,63) size 0x0
-          LayoutText {#text} at (14,70) size 36x27
-            text run at (14,70) width 36: "xxx"
-          LayoutBR {BR} at (50,91) size 0x0
-          LayoutText {#text} at (14,98) size 70x27
-            text run at (14,98) width 70: "XXxxx"
-          LayoutBR {BR} at (84,119) size 0x0
-          LayoutText {#text} at (14,126) size 36x27
-            text run at (14,126) width 36: "xxx"
-          LayoutBR {BR} at (50,147) size 0x0
-          LayoutText {#text} at (14,154) size 36x27
-            text run at (14,154) width 36: "xxx"
-          LayoutBR {BR} at (50,175) size 0x0
-          LayoutText {#text} at (14,182) size 36x27
-            text run at (14,182) width 36: "xxx"
-          LayoutBR {BR} at (50,203) size 0x0
-          LayoutText {#text} at (14,210) size 70x27
-            text run at (14,210) width 70: "XXxxx"
-caret: position 5 of child 14 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-1-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-1-expected.png
deleted file mode 100644
index e8831950..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-1-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-1-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-1-expected.txt
deleted file mode 100644
index 8dbcf41e..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-1-expected.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x20
-        LayoutText {#text} at (0,0) size 409x19
-          text run at (0,0) width 409: "This is a replica of the paste that caused the crash covered by 8145."
-      LayoutBlockFlow {DIV} at (0,36) size 784x42 [border: (1px solid #000000)]
-        LayoutBlockFlow (anonymous) at (1,1) size 782x20
-          LayoutText {#text} at (0,0) size 69x19
-            text run at (0,0) width 69: "foo bar baz"
-            text run at (69,0) width 0: " "
-        LayoutBlockFlow {DIV} at (1,21) size 782x20
-          LayoutBR {BR} at (0,0) size 0x19
-caret: position 0 of child 0 {BR} of child 1 {DIV} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-2-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-2-expected.png
deleted file mode 100644
index 8b0d47f..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-2-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-2-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-2-expected.txt
deleted file mode 100644
index 934d965..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-2-expected.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 764x39
-          text run at (0,0) width 284: "This tests a change made with the fix for 8145. "
-          text run at (284,0) width 480: "The paragraph separator inserted to prevent nesting blocks from the fragment to"
-          text run at (0,20) width 738: "paste inside the block where the paste occured was incorrectly inserted when the paste occured at the start of a paragraph."
-      LayoutBlockFlow {DIV} at (0,56) size 784x82 [border: (1px solid #000000)]
-        LayoutBlockFlow (anonymous) at (1,1) size 782x20
-          LayoutText {#text} at (0,0) size 20x19
-            text run at (0,0) width 20: "foo"
-          LayoutBR {BR} at (20,15) size 0x0
-        LayoutBlockFlow {DIV} at (1,21) size 782x20
-          LayoutText {#text} at (0,0) size 20x19
-            text run at (0,0) width 20: "foo"
-        LayoutBlockFlow (anonymous) at (1,41) size 782x40
-          LayoutText {#text} at (0,0) size 20x19
-            text run at (0,0) width 20: "bar"
-          LayoutText {#text} at (20,0) size 20x19
-            text run at (20,0) width 20: "bar"
-          LayoutBR {BR} at (40,15) size 0x0
-          LayoutText {#text} at (0,20) size 21x19
-            text run at (0,20) width 21: "baz"
-caret: position 3 of child 3 {#text} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-3-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-3-expected.png
deleted file mode 100644
index bcbf8aa..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-3-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-3-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-3-expected.txt
deleted file mode 100644
index fec41330..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/8145-3-expected.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 766x39
-          text run at (0,0) width 284: "This tests a change made with the fix for 8145. "
-          text run at (284,0) width 480: "The paragraph separator inserted to prevent nesting blocks from the fragment to"
-          text run at (0,20) width 766: "paste inside the block where the paste occured was not being inserted when the fragment had an interchange newline at the end."
-      LayoutBlockFlow {DIV} at (0,56) size 784x62 [border: (1px solid #000000)]
-        LayoutBlockFlow {DIV} at (1,1) size 782x20
-          LayoutText {#text} at (0,0) size 24x19
-            text run at (0,0) width 24: "fbar"
-        LayoutBlockFlow (anonymous) at (1,21) size 782x20
-          LayoutText {#text} at (0,0) size 21x19
-            text run at (0,0) width 21: "baz"
-        LayoutBlockFlow {DIV} at (1,41) size 782x20
-          LayoutText {#text} at (0,0) size 16x19
-            text run at (0,0) width 16: "oo"
-caret: position 0 of child 0 {#text} of child 2 {DIV} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png
index 760121e3..ea2f6fdd 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
index cbc428a7..1dfeee8 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
index 7dbc393..13b5025 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-cover-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-cover-expected.png
index 3223c5fd..d02ef6c 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-cover-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-cover-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-expected.png
index 497dd69b..9cd15de 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-png-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-png-expected.png
index 497dd69b..9cd15de 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-png-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-png-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-repeat-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-repeat-expected.png
index 584c4a7b..17ce6a9 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-repeat-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-repeat-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-space-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-space-expected.png
index d8d26b43..6d51351 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-space-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-background-image-space-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-border-image-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-border-image-expected.png
index 2935e4f..4a67093 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-border-image-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-border-image-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-border-image-source-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-border-image-source-expected.png
index 9df0087..6612a57 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-border-image-source-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-border-image-source-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-group-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-group-expected.png
index 224570f..6b22267 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-group-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-group-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-expected.png
index 4533518..a2fb5d72 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-pattern-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-pattern-expected.png
index 5b9c1a7..a33b661 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-pattern-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-pattern-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-image-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-image-expected.png
index 7f866a3..b366495 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-image-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-image-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-image-profile-match-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-image-profile-match-expected.png
index 92aa6c4..1cf0831 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-image-profile-match-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-image-profile-match-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-mask-image-svg-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-mask-image-svg-expected.png
index 1126235f..ff9c06f 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-mask-image-svg-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-mask-image-svg-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb-expected.png
index 661d27d..8e69fc1 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb-expected.png
index 1b85222..3bdf5f2 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-object-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-object-expected.png
index 150b479..4d0ea750 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-object-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-object-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-reflection-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-reflection-expected.png
index 845bd1c..d743608 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-reflection-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-reflection-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-svg-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-svg-expected.png
index 7270dde..3f86660 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-svg-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/color-profile-svg-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/exif-orientation-height-image-document-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/exif-orientation-height-image-document-expected.png
index db6ab3ee..126ffc0 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/exif-orientation-height-image-document-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/exif-orientation-height-image-document-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/jpeg-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/jpeg-with-color-profile-expected.png
index c633a38..cefe1471 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/jpeg-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/jpeg-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/png-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/png-with-color-profile-expected.png
index c633a38..cefe1471 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/png-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/png-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/ycbcr-with-cmyk-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/ycbcr-with-cmyk-color-profile-expected.png
index ecf339f..d7efc45 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/ycbcr-with-cmyk-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/gpu-rasterization/fast/images/ycbcr-with-cmyk-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-appearance-expected.png
index d93b8cd..7031d457 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png
index 6e8a329..e9854c8 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
index 851e4582..857652d 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-one-row-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-one-row-appearance-expected.png
index 17bb7255..2010fd3 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-one-row-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-one-row-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-two-row-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-two-row-appearance-expected.png
index ea55a9f..0b82c20 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-two-row-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-two-row-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
index 9f89bff..87c8fd6 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb-expected.png
index ddef4421..2875fd7 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb-expected.png
index 5b2168a..ed11962fe 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-expected.png
index 47b9a2a..e3bfcc9 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png
index 4a5499b..57a625e5 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
index 741b0b44..da0e7c2 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-one-row-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-one-row-appearance-expected.png
index ec05e2a..08e52469 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-one-row-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-one-row-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-two-row-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-two-row-appearance-expected.png
index 3b048602..008fdad2 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-two-row-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-two-row-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
index e8c2cb238..0e20b65a3 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-div-022-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-div-022-expected.png
deleted file mode 100644
index c07b3b2..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-div-022-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-div-022-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-div-022-expected.txt
deleted file mode 100644
index 66739ef2..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-div-022-expected.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x568
-      LayoutBlockFlow (anonymous) at (0,0) size 784x112
-        LayoutText {#text} at (0,0) size 757x84
-          text run at (0,0) width 751: "Test inserting paragraphs: should see \"foo\" in a blue box, then a blue box with"
-          text run at (750,0) width 7: " "
-          text run at (0,28) width 747: "with two lines in it: First line a bold \"x\"; second line a non-bold \"bar\". Fix for"
-          text run at (746,28) width 7: " "
-          text run at (0,56) width 90: "this bug: "
-        LayoutInline {A} at (0,0) size 257x28 [color=#0000EE]
-          LayoutText {#text} at (89,56) size 257x28
-            text run at (89,56) width 257: "<rdar://problem/3927554>"
-        LayoutText {#text} at (345,56) size 783x56
-          text run at (345,56) width 432: " Style info applied to remainder of document"
-          text run at (776,56) width 7: " "
-          text run at (0,84) width 242: "after a newline is entered"
-      LayoutBlockFlow {DIV} at (0,112) size 784x12
-      LayoutBlockFlow {P} at (0,148) size 784x56 [border: (2px solid #0000FF)]
-        LayoutInline {B} at (0,0) size 32x28
-          LayoutText {#text} at (14,14) size 32x28
-            text run at (14,14) width 32: "foo"
-      LayoutBlockFlow {P} at (0,228) size 784x84 [border: (2px solid #0000FF)]
-        LayoutInline {B} at (0,0) size 12x28
-          LayoutText {#text} at (14,14) size 12x28
-            text run at (14,14) width 12: "x"
-          LayoutBR {BR} at (26,36) size 0x0 [bgcolor=#008000]
-        LayoutText {#text} at (14,42) size 31x28
-          text run at (14,42) width 31: "bar"
-caret: position 1 of child 0 {#text} of child 0 {B} of child 6 {P} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-01-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-01-expected.png
deleted file mode 100644
index 2c770ca..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-01-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-01-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-01-expected.txt
deleted file mode 100644
index 318ba7a5..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-01-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x36
-        LayoutText {#text} at (0,0) size 750x36
-          text run at (0,0) width 362: "This tests inserting a paragraph separator before a table. "
-          text run at (361,0) width 389: "There should be an empty paragraph before the table and the"
-          text run at (0,18) width 232: "caret should be just before the table."
-      LayoutBlockFlow {DIV} at (0,52) size 784x46
-        LayoutBlockFlow (anonymous) at (0,0) size 784x18
-          LayoutBR {BR} at (0,0) size 0x18
-        LayoutTable {TABLE} at (0,18) size 32x28 [border: (1px outset #808080)]
-          LayoutTableSection {TBODY} at (1,1) size 30x26
-            LayoutTableRow {TR} at (0,2) size 30x22
-              LayoutTableCell {TD} at (2,2) size 26x22 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
-                LayoutText {#text} at (2,2) size 22x18
-                  text run at (2,2) width 22: "foo"
-caret: position 0 of child 1 {TABLE} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-02-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-02-expected.png
deleted file mode 100644
index ea01aba..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-02-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-02-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-02-expected.txt
deleted file mode 100644
index b9b3e83..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-02-expected.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x36
-        LayoutText {#text} at (0,0) size 758x36
-          text run at (0,0) width 351: "This tests inserting a paragraph separator after a table. "
-          text run at (350,0) width 408: "There should be an empty paragraph between the table and 'bar'"
-          text run at (0,18) width 304: "and the caret should be in the empty paragraph."
-      LayoutBlockFlow {DIV} at (0,52) size 784x64
-        LayoutTable {TABLE} at (0,0) size 32x28 [border: (1px outset #808080)]
-          LayoutTableSection {TBODY} at (1,1) size 30x26
-            LayoutTableRow {TR} at (0,2) size 30x22
-              LayoutTableCell {TD} at (2,2) size 26x22 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
-                LayoutText {#text} at (2,2) size 22x18
-                  text run at (2,2) width 22: "foo"
-        LayoutBlockFlow (anonymous) at (0,28) size 784x36
-          LayoutBR {BR} at (0,0) size 0x18
-          LayoutText {#text} at (0,18) size 21x18
-            text run at (0,18) width 21: "bar"
-caret: position 0 of child 1 {BR} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-03-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-03-expected.png
deleted file mode 100644
index 0fe87683..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-03-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-03-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-03-expected.txt
deleted file mode 100644
index bdec91d..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-03-expected.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x36
-        LayoutText {#text} at (0,0) size 775x36
-          text run at (0,0) width 425: "This tests inserting a paragraph separator before a horizontal rule. "
-          text run at (424,0) width 351: "You should see 'foo', empty paragraph, horizontal rule,"
-          text run at (0,18) width 379: "'bar', and the caret should be just before the horizontal rule."
-      LayoutBlockFlow {DIV} at (0,52) size 784x72
-        LayoutBlockFlow (anonymous) at (0,0) size 784x36
-          LayoutText {#text} at (0,0) size 22x18
-            text run at (0,0) width 22: "foo"
-          LayoutBR {BR} at (21,14) size 1x0
-          LayoutBR {BR} at (0,18) size 0x18
-        LayoutBlockFlow {HR} at (0,44) size 784x2 [border: (1px inset #EEEEEE)]
-        LayoutBlockFlow (anonymous) at (0,54) size 784x18
-          LayoutText {#text} at (0,0) size 21x18
-            text run at (0,0) width 21: "bar"
-caret: position 0 of child 3 {HR} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-05-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-05-expected.png
deleted file mode 100644
index ad9e9c3..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-05-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-05-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-05-expected.txt
deleted file mode 100644
index 2703a06..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-paragraph-05-expected.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x18
-        LayoutText {#text} at (0,0) size 618x18
-          text run at (0,0) width 618: "This tests inserting a paragraph separator before a special element at the start of an editable root."
-      LayoutBlockFlow {P} at (0,34) size 784x18
-        LayoutText {#text} at (0,0) size 625x18
-          text run at (0,0) width 625: "Visually, it should leave a blank line before the link, and the caret selection at the start of the link."
-      LayoutBlockFlow {P} at (0,68) size 784x36
-        LayoutText {#text} at (0,0) size 729x36
-          text run at (0,0) width 729: "Structurally, the empty paragraph element should go before the anchor element, rather than inside of it. See Radar"
-          text run at (0,18) width 68: "#5452675."
-      LayoutBlockFlow {DIV} at (0,120) size 784x36
-        LayoutBlockFlow {DIV} at (0,0) size 784x18
-          LayoutBR {BR} at (0,0) size 0x18
-        LayoutBlockFlow (anonymous) at (0,18) size 784x18
-          LayoutInline {A} at (0,0) size 57x18 [color=#0000EE]
-            LayoutText {#text} at (0,0) size 57x18
-              text run at (0,0) width 57: "applesite"
-caret: position 0 of child 0 {#text} of child 1 {A} of child 6 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-001-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-001-expected.png
deleted file mode 100644
index 5a064f8..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-001-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-001-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-001-expected.txt
deleted file mode 100644
index ae27238..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-001-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 80x28
-          LayoutInline {SPAN} at (0,0) size 48x28
-            LayoutText {#text} at (14,14) size 48x28
-              text run at (14,14) width 48: "\x{9}"
-          LayoutText {#text} at (62,14) size 32x28
-            text run at (62,14) width 32: "foo"
-        LayoutText {#text} at (0,0) size 0x0
-caret: position 1 of child 0 {#text} of child 0 {SPAN} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-002-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-002-expected.png
deleted file mode 100644
index 88291ab..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-002-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-002-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-002-expected.txt
deleted file mode 100644
index 5c24ae5..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-002-expected.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 48x28
-          LayoutText {#text} at (14,14) size 32x28
-            text run at (14,14) width 32: "foo"
-          LayoutInline {SPAN} at (0,0) size 17x28
-            LayoutText {#text} at (45,14) size 17x28
-              text run at (45,14) width 17: "\x{9}"
-caret: position 1 of child 0 {#text} of child 1 {SPAN} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-003-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-003-expected.png
deleted file mode 100644
index 8ab02d8..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-003-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-003-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-003-expected.txt
deleted file mode 100644
index 5391b02e..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-003-expected.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 60x28
-          LayoutText {#text} at (14,14) size 20x28
-            text run at (14,14) width 20: "fo"
-          LayoutInline {SPAN} at (0,0) size 29x28
-            LayoutText {#text} at (33,14) size 29x28
-              text run at (33,14) width 29: "\x{9}"
-          LayoutText {#text} at (62,14) size 12x28
-            text run at (62,14) width 12: "o"
-        LayoutText {#text} at (0,0) size 0x0
-caret: position 1 of child 0 {#text} of child 1 {SPAN} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-004-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-004-expected.png
deleted file mode 100644
index 22b3b9a..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-004-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-004-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-004-expected.txt
deleted file mode 100644
index ed57133..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-tab-004-expected.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x84 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 80x56
-          LayoutBR {BR} at (14,14) size 0x28
-          LayoutInline {SPAN} at (0,0) size 48x28
-            LayoutText {#text} at (14,42) size 48x28
-              text run at (14,42) width 48: "\x{9}"
-          LayoutText {#text} at (62,42) size 32x28
-            text run at (62,42) width 32: "foo"
-        LayoutText {#text} at (0,0) size 0x0
-caret: position 1 of child 0 {#text} of child 1 {SPAN} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-with-newlines-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-with-newlines-expected.png
deleted file mode 100644
index 17f71cf..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-with-newlines-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-with-newlines-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-with-newlines-expected.txt
deleted file mode 100644
index 9179d4f..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-with-newlines-expected.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x140 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 80x112
-          LayoutText {#text} at (14,14) size 80x28
-            text run at (14,14) width 80: "Foo xxx"
-          LayoutBR {BR} at (93,36) size 1x0
-          LayoutInline {I} at (0,0) size 34x28
-            LayoutText {#text} at (14,42) size 34x28
-              text run at (14,42) width 34: "bar"
-          LayoutText {#text} at (47,42) size 43x28
-            text run at (47,42) width 43: " xxx"
-          LayoutBR {BR} at (89,64) size 1x0
-          LayoutBR {BR} at (14,70) size 0x28
-          LayoutText {#text} at (14,98) size 70x28
-            text run at (14,98) width 70: "bazxxx"
-caret: position 6 of child 6 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-001-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-001-expected.png
deleted file mode 100644
index 7b6ef0b..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-001-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-001-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-001-expected.txt
deleted file mode 100644
index 563bd33..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-001-expected.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 178x28
-          LayoutText {#text} at (14,14) size 178x28
-            text run at (14,14) width 178: "xxxXXxxxXXxxx"
-caret: position 13 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-002-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-002-expected.png
deleted file mode 100644
index 67b5b9c9..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-002-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-002-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-002-expected.txt
deleted file mode 100644
index 8305f01f..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-002-expected.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 113x28
-          LayoutText {#text} at (14,14) size 80x28
-            text run at (14,14) width 80: "Foo xxx"
-          LayoutInline {I} at (0,0) size 34x28
-            LayoutText {#text} at (93,14) size 34x28
-              text run at (93,14) width 34: "bar"
-        LayoutText {#text} at (0,0) size 0x0
-caret: position 7 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-003-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-003-expected.png
deleted file mode 100644
index 06280df..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-003-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-003-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-003-expected.txt
deleted file mode 100644
index f87b56c..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-003-expected.txt
+++ /dev/null
@@ -1,528 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x140 [border: (2px solid #FF0000)]
-        LayoutText {#text} at (14,14) size 738x112
-          text run at (14,14) width 696: "xxxx x xx xxxx xxxxxx xxxxx xxxxxx xxx xx xxxx xxx xxx xx x xxxxx"
-          text run at (710,14) width 6: " "
-          text run at (14,42) width 732: "xxxxxxxxxxxx xxxxxxxx xxx xxxx xxxxx xx xxx xxxx xxxx xxxxx xxxxxx"
-          text run at (746,42) width 6: " "
-          text run at (14,70) width 714: "xxx xx xxxx xxx xxx xx xxxxxx xxxxx xxxxxx xxx xx xxxx xxx xxx xx x"
-          text run at (728,70) width 6: " "
-          text run at (14,98) width 360: "xxxxx xxxxxxxxxxxx xxxxxxxx xxx "
-        LayoutInline {SPAN} at (0,0) size 0x28
-caret: position 233 of child 0 {#text} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-around-br-001-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-around-br-001-expected.png
deleted file mode 100644
index 58c4908..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-around-br-001-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-around-br-001-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-around-br-001-expected.txt
deleted file mode 100644
index 34e5eed..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/typing-around-br-001-expected.txt
+++ /dev/null
@@ -1,95 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x252 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 71x224
-          LayoutText {#text} at (14,14) size 71x28
-            text run at (14,14) width 71: "XXxxx"
-          LayoutBR {BR} at (84,36) size 1x0
-          LayoutText {#text} at (14,42) size 71x28
-            text run at (14,42) width 71: "XXxxx"
-          LayoutBR {BR} at (84,64) size 1x0
-          LayoutText {#text} at (14,70) size 36x28
-            text run at (14,70) width 36: "xxx"
-          LayoutBR {BR} at (50,92) size 0x0
-          LayoutText {#text} at (14,98) size 71x28
-            text run at (14,98) width 71: "XXxxx"
-          LayoutBR {BR} at (84,120) size 1x0
-          LayoutText {#text} at (14,126) size 36x28
-            text run at (14,126) width 36: "xxx"
-          LayoutBR {BR} at (50,148) size 0x0
-          LayoutText {#text} at (14,154) size 36x28
-            text run at (14,154) width 36: "xxx"
-          LayoutBR {BR} at (50,176) size 0x0
-          LayoutText {#text} at (14,182) size 36x28
-            text run at (14,182) width 36: "xxx"
-          LayoutBR {BR} at (50,204) size 0x0
-          LayoutText {#text} at (14,210) size 71x28
-            text run at (14,210) width 71: "XXxxx"
-caret: position 5 of child 14 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-1-expected.png
deleted file mode 100644
index c02ecf1..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-1-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-1-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-1-expected.txt
deleted file mode 100644
index 88c0156..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-1-expected.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x18
-        LayoutText {#text} at (0,0) size 431x18
-          text run at (0,0) width 431: "This is a replica of the paste that caused the crash covered by 8145."
-      LayoutBlockFlow {DIV} at (0,34) size 784x38 [border: (1px solid #000000)]
-        LayoutBlockFlow (anonymous) at (1,1) size 782x18
-          LayoutText {#text} at (0,0) size 72x18
-            text run at (0,0) width 72: "foo bar baz"
-            text run at (71,0) width 1: " "
-        LayoutBlockFlow {DIV} at (1,19) size 782x18
-          LayoutBR {BR} at (0,0) size 0x18
-caret: position 0 of child 0 {BR} of child 1 {DIV} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-2-expected.png
deleted file mode 100644
index fcf15dd..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-2-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-2-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-2-expected.txt
deleted file mode 100644
index 97be0da..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-2-expected.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x54
-        LayoutText {#text} at (0,0) size 774x54
-          text run at (0,0) width 304: "This tests a change made with the fix for 8145. "
-          text run at (303,0) width 434: "The paragraph separator inserted to prevent nesting blocks from the"
-          text run at (0,18) width 774: "fragment to paste inside the block where the paste occured was incorrectly inserted when the paste occured at the start of"
-          text run at (0,36) width 80: "a paragraph."
-      LayoutBlockFlow {DIV} at (0,70) size 784x74 [border: (1px solid #000000)]
-        LayoutBlockFlow (anonymous) at (1,1) size 782x18
-          LayoutText {#text} at (0,0) size 22x18
-            text run at (0,0) width 22: "foo"
-          LayoutBR {BR} at (21,14) size 1x0
-        LayoutBlockFlow {DIV} at (1,19) size 782x18
-          LayoutText {#text} at (0,0) size 22x18
-            text run at (0,0) width 22: "foo"
-        LayoutBlockFlow (anonymous) at (1,37) size 782x36
-          LayoutText {#text} at (0,0) size 21x18
-            text run at (0,0) width 21: "bar"
-          LayoutText {#text} at (20,0) size 21x18
-            text run at (20,0) width 21: "bar"
-          LayoutBR {BR} at (40,14) size 1x0
-          LayoutText {#text} at (0,18) size 23x18
-            text run at (0,18) width 23: "baz"
-caret: position 3 of child 3 {#text} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-3-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-3-expected.png
deleted file mode 100644
index 7ef8fd0..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-3-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-3-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-3-expected.txt
deleted file mode 100644
index a039f04..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/8145-3-expected.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x54
-        LayoutText {#text} at (0,0) size 771x54
-          text run at (0,0) width 304: "This tests a change made with the fix for 8145. "
-          text run at (303,0) width 434: "The paragraph separator inserted to prevent nesting blocks from the"
-          text run at (0,18) width 771: "fragment to paste inside the block where the paste occured was not being inserted when the fragment had an interchange"
-          text run at (0,36) width 121: "newline at the end."
-      LayoutBlockFlow {DIV} at (0,70) size 784x56 [border: (1px solid #000000)]
-        LayoutBlockFlow {DIV} at (1,1) size 782x18
-          LayoutText {#text} at (0,0) size 26x18
-            text run at (0,0) width 26: "fbar"
-        LayoutBlockFlow (anonymous) at (1,19) size 782x18
-          LayoutText {#text} at (0,0) size 23x18
-            text run at (0,0) width 23: "baz"
-        LayoutBlockFlow {DIV} at (1,37) size 782x18
-          LayoutText {#text} at (0,0) size 16x18
-            text run at (0,0) width 16: "oo"
-caret: position 0 of child 0 {#text} of child 2 {DIV} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-appearance-expected.png
index b03e25bc7..dda9a9f 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png
index 6fd69e7..4908055 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
index 053ac24..ec4f197 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-one-row-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-one-row-appearance-expected.png
index ff75054..0494553 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-one-row-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-one-row-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-two-row-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-two-row-appearance-expected.png
index 9aa03f2..45dfda1b 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-two-row-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-two-row-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
index ee13a239..a32e73b 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-cover-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-cover-expected.png
index e24725c..42410476 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-cover-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-cover-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-expected.png
index 9d66287..89cc35d43 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-png-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-png-expected.png
index 9d66287..89cc35d43 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-png-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-png-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-repeat-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-repeat-expected.png
index 03bbc3b..d7ef00e 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-repeat-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-repeat-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-space-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-space-expected.png
index debedc2..212c14c 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-space-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-background-image-space-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-border-image-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-border-image-expected.png
index 6e87996..24ed3031 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-border-image-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-border-image-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-border-image-source-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-border-image-source-expected.png
index 9e68607..f012245 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-border-image-source-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-border-image-source-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-group-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-group-expected.png
index 80a9549e..5f770c4 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-group-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-group-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-expected.png
index 0e5b90c..ccb9256 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-pattern-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-pattern-expected.png
index bdd88c8..acd4de6 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-pattern-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-pattern-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-image-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-image-expected.png
index 5a6f250..176a8ed 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-image-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-image-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-mask-image-svg-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-mask-image-svg-expected.png
index c5526aa0..568e936 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-mask-image-svg-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-mask-image-svg-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb-expected.png
index 46155ee..8eb8ec29 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb-expected.png
index 998f8d3..bff14432 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-object-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-object-expected.png
index 9d63d68..4413d8d 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-object-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-object-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-reflection-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-reflection-expected.png
index 2e868edb..7c40cb7 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-reflection-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-reflection-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-svg-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-svg-expected.png
index 32f2bd7..3d695cb 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-svg-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/color-profile-svg-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/exif-orientation-height-image-document-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/exif-orientation-height-image-document-expected.png
index db6ab3ee..126ffc0 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/exif-orientation-height-image-document-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/exif-orientation-height-image-document-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/jpeg-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/jpeg-with-color-profile-expected.png
index dc5e535..01c36cc 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/jpeg-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/jpeg-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/png-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/png-with-color-profile-expected.png
index dc5e535..01c36cc 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/png-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/png-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/ycbcr-with-cmyk-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/ycbcr-with-cmyk-color-profile-expected.png
index ecf339f..d7efc45 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/ycbcr-with-cmyk-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/gpu-rasterization/fast/images/ycbcr-with-cmyk-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-div-022-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-div-022-expected.png
deleted file mode 100644
index 5a9d6c0..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-div-022-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-div-022-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-div-022-expected.txt
deleted file mode 100644
index 3bccd3b..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-div-022-expected.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x568
-      LayoutBlockFlow (anonymous) at (0,0) size 784x108
-        LayoutText {#text} at (0,0) size 757x80
-          text run at (0,0) width 751: "Test inserting paragraphs: should see \"foo\" in a blue box, then a blue box with"
-          text run at (750,0) width 7: " "
-          text run at (0,27) width 747: "with two lines in it: First line a bold \"x\"; second line a non-bold \"bar\". Fix for"
-          text run at (746,27) width 7: " "
-          text run at (0,54) width 90: "this bug: "
-        LayoutInline {A} at (0,0) size 257x26 [color=#0000EE]
-          LayoutText {#text} at (89,54) size 257x26
-            text run at (89,54) width 257: "<rdar://problem/3927554>"
-        LayoutText {#text} at (345,54) size 783x53
-          text run at (345,54) width 432: " Style info applied to remainder of document"
-          text run at (776,54) width 7: " "
-          text run at (0,81) width 242: "after a newline is entered"
-      LayoutBlockFlow {DIV} at (0,108) size 784x12
-      LayoutBlockFlow {P} at (0,144) size 784x55 [border: (2px solid #0000FF)]
-        LayoutInline {B} at (0,0) size 32x26
-          LayoutText {#text} at (14,14) size 32x26
-            text run at (14,14) width 32: "foo"
-      LayoutBlockFlow {P} at (0,223) size 784x82 [border: (2px solid #0000FF)]
-        LayoutInline {B} at (0,0) size 12x26
-          LayoutText {#text} at (14,14) size 12x26
-            text run at (14,14) width 12: "x"
-          LayoutBR {BR} at (26,35) size 0x0 [bgcolor=#008000]
-        LayoutText {#text} at (14,41) size 31x26
-          text run at (14,41) width 31: "bar"
-caret: position 1 of child 0 {#text} of child 0 {B} of child 6 {P} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-01-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-01-expected.png
deleted file mode 100644
index 55f2649..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-01-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-01-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-01-expected.txt
deleted file mode 100644
index 8d07971..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-01-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x36
-        LayoutText {#text} at (0,0) size 750x35
-          text run at (0,0) width 362: "This tests inserting a paragraph separator before a table. "
-          text run at (361,0) width 389: "There should be an empty paragraph before the table and the"
-          text run at (0,18) width 232: "caret should be just before the table."
-      LayoutBlockFlow {DIV} at (0,52) size 784x46
-        LayoutBlockFlow (anonymous) at (0,0) size 784x18
-          LayoutBR {BR} at (0,0) size 0x17
-        LayoutTable {TABLE} at (0,18) size 32x28 [border: (1px outset #808080)]
-          LayoutTableSection {TBODY} at (1,1) size 30x26
-            LayoutTableRow {TR} at (0,2) size 30x22
-              LayoutTableCell {TD} at (2,2) size 26x22 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
-                LayoutText {#text} at (2,2) size 22x17
-                  text run at (2,2) width 22: "foo"
-caret: position 0 of child 1 {TABLE} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-02-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-02-expected.png
deleted file mode 100644
index c302318..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-02-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-02-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-02-expected.txt
deleted file mode 100644
index 96964a6c..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-02-expected.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x36
-        LayoutText {#text} at (0,0) size 758x35
-          text run at (0,0) width 351: "This tests inserting a paragraph separator after a table. "
-          text run at (350,0) width 408: "There should be an empty paragraph between the table and 'bar'"
-          text run at (0,18) width 304: "and the caret should be in the empty paragraph."
-      LayoutBlockFlow {DIV} at (0,52) size 784x64
-        LayoutTable {TABLE} at (0,0) size 32x28 [border: (1px outset #808080)]
-          LayoutTableSection {TBODY} at (1,1) size 30x26
-            LayoutTableRow {TR} at (0,2) size 30x22
-              LayoutTableCell {TD} at (2,2) size 26x22 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
-                LayoutText {#text} at (2,2) size 22x17
-                  text run at (2,2) width 22: "foo"
-        LayoutBlockFlow (anonymous) at (0,28) size 784x36
-          LayoutBR {BR} at (0,0) size 0x17
-          LayoutText {#text} at (0,18) size 21x17
-            text run at (0,18) width 21: "bar"
-caret: position 0 of child 1 {BR} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-03-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-03-expected.png
deleted file mode 100644
index a51fb895..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-03-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-03-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-03-expected.txt
deleted file mode 100644
index 64206525..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-03-expected.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x36
-        LayoutText {#text} at (0,0) size 775x35
-          text run at (0,0) width 425: "This tests inserting a paragraph separator before a horizontal rule. "
-          text run at (424,0) width 351: "You should see 'foo', empty paragraph, horizontal rule,"
-          text run at (0,18) width 379: "'bar', and the caret should be just before the horizontal rule."
-      LayoutBlockFlow {DIV} at (0,52) size 784x72
-        LayoutBlockFlow (anonymous) at (0,0) size 784x36
-          LayoutText {#text} at (0,0) size 22x17
-            text run at (0,0) width 22: "foo"
-          LayoutBR {BR} at (21,14) size 1x0
-          LayoutBR {BR} at (0,18) size 0x17
-        LayoutBlockFlow {HR} at (0,44) size 784x2 [border: (1px inset #EEEEEE)]
-        LayoutBlockFlow (anonymous) at (0,54) size 784x18
-          LayoutText {#text} at (0,0) size 21x17
-            text run at (0,0) width 21: "bar"
-caret: position 0 of child 3 {HR} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-05-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-05-expected.png
deleted file mode 100644
index 0cca2f3..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-05-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-05-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-05-expected.txt
deleted file mode 100644
index c9a3ff3..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-paragraph-05-expected.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x18
-        LayoutText {#text} at (0,0) size 618x17
-          text run at (0,0) width 618: "This tests inserting a paragraph separator before a special element at the start of an editable root."
-      LayoutBlockFlow {P} at (0,34) size 784x18
-        LayoutText {#text} at (0,0) size 625x17
-          text run at (0,0) width 625: "Visually, it should leave a blank line before the link, and the caret selection at the start of the link."
-      LayoutBlockFlow {P} at (0,68) size 784x36
-        LayoutText {#text} at (0,0) size 729x35
-          text run at (0,0) width 729: "Structurally, the empty paragraph element should go before the anchor element, rather than inside of it. See Radar"
-          text run at (0,18) width 68: "#5452675."
-      LayoutBlockFlow {DIV} at (0,120) size 784x36
-        LayoutBlockFlow {DIV} at (0,0) size 784x18
-          LayoutBR {BR} at (0,0) size 0x17
-        LayoutBlockFlow (anonymous) at (0,18) size 784x18
-          LayoutInline {A} at (0,0) size 57x17 [color=#0000EE]
-            LayoutText {#text} at (0,0) size 57x17
-              text run at (0,0) width 57: "applesite"
-caret: position 0 of child 0 {#text} of child 1 {A} of child 6 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-001-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-001-expected.png
deleted file mode 100644
index dfa4cf3..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-001-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-001-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-001-expected.txt
deleted file mode 100644
index e2793a3..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-001-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x55 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 80x26
-          LayoutInline {SPAN} at (0,0) size 48x26
-            LayoutText {#text} at (14,14) size 48x26
-              text run at (14,14) width 48: "\x{9}"
-          LayoutText {#text} at (62,14) size 32x26
-            text run at (62,14) width 32: "foo"
-        LayoutText {#text} at (0,0) size 0x0
-caret: position 1 of child 0 {#text} of child 0 {SPAN} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-002-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-002-expected.png
deleted file mode 100644
index 6842770..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-002-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-002-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-002-expected.txt
deleted file mode 100644
index 3edb4dd..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-002-expected.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x55 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 48x26
-          LayoutText {#text} at (14,14) size 32x26
-            text run at (14,14) width 32: "foo"
-          LayoutInline {SPAN} at (0,0) size 17x26
-            LayoutText {#text} at (45,14) size 17x26
-              text run at (45,14) width 17: "\x{9}"
-caret: position 1 of child 0 {#text} of child 1 {SPAN} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-003-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-003-expected.png
deleted file mode 100644
index 0ba2571..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-003-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-003-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-003-expected.txt
deleted file mode 100644
index f6da4ac6..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-003-expected.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x55 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 60x26
-          LayoutText {#text} at (14,14) size 20x26
-            text run at (14,14) width 20: "fo"
-          LayoutInline {SPAN} at (0,0) size 29x26
-            LayoutText {#text} at (33,14) size 29x26
-              text run at (33,14) width 29: "\x{9}"
-          LayoutText {#text} at (62,14) size 12x26
-            text run at (62,14) width 12: "o"
-        LayoutText {#text} at (0,0) size 0x0
-caret: position 1 of child 0 {#text} of child 1 {SPAN} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-004-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-004-expected.png
deleted file mode 100644
index 5e2b49a..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-004-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-004-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-004-expected.txt
deleted file mode 100644
index 9a8da12..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-tab-004-expected.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x82 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 80x53
-          LayoutBR {BR} at (14,14) size 0x26
-          LayoutInline {SPAN} at (0,0) size 48x26
-            LayoutText {#text} at (14,41) size 48x26
-              text run at (14,41) width 48: "\x{9}"
-          LayoutText {#text} at (62,41) size 32x26
-            text run at (62,41) width 32: "foo"
-        LayoutText {#text} at (0,0) size 0x0
-caret: position 1 of child 0 {#text} of child 1 {SPAN} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-with-newlines-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-with-newlines-expected.png
deleted file mode 100644
index acf2f00..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-with-newlines-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-with-newlines-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-with-newlines-expected.txt
deleted file mode 100644
index ce37222..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-with-newlines-expected.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x136 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 80x107
-          LayoutText {#text} at (14,14) size 80x26
-            text run at (14,14) width 80: "Foo xxx"
-          LayoutBR {BR} at (93,35) size 1x0
-          LayoutInline {I} at (0,0) size 34x26
-            LayoutText {#text} at (14,41) size 34x26
-              text run at (14,41) width 34: "bar"
-          LayoutText {#text} at (47,41) size 43x26
-            text run at (47,41) width 43: " xxx"
-          LayoutBR {BR} at (89,62) size 1x0
-          LayoutBR {BR} at (14,68) size 0x26
-          LayoutText {#text} at (14,95) size 70x26
-            text run at (14,95) width 70: "bazxxx"
-caret: position 6 of child 6 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-001-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-001-expected.png
deleted file mode 100644
index 5715cc8..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-001-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-001-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-001-expected.txt
deleted file mode 100644
index 730e443..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-001-expected.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x55 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 178x26
-          LayoutText {#text} at (14,14) size 178x26
-            text run at (14,14) width 178: "xxxXXxxxXXxxx"
-caret: position 13 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-002-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-002-expected.png
deleted file mode 100644
index a660735d..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-002-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-002-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-002-expected.txt
deleted file mode 100644
index 6229b82..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-002-expected.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x55 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 113x26
-          LayoutText {#text} at (14,14) size 80x26
-            text run at (14,14) width 80: "Foo xxx"
-          LayoutInline {I} at (0,0) size 34x26
-            LayoutText {#text} at (93,14) size 34x26
-              text run at (93,14) width 34: "bar"
-        LayoutText {#text} at (0,0) size 0x0
-caret: position 7 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-003-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-003-expected.png
deleted file mode 100644
index 87a43a3..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-003-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-003-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-003-expected.txt
deleted file mode 100644
index 7433cf7f..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-003-expected.txt
+++ /dev/null
@@ -1,528 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x136 [border: (2px solid #FF0000)]
-        LayoutText {#text} at (14,14) size 738x107
-          text run at (14,14) width 696: "xxxx x xx xxxx xxxxxx xxxxx xxxxxx xxx xx xxxx xxx xxx xx x xxxxx"
-          text run at (710,14) width 6: " "
-          text run at (14,41) width 732: "xxxxxxxxxxxx xxxxxxxx xxx xxxx xxxxx xx xxx xxxx xxxx xxxxx xxxxxx"
-          text run at (746,41) width 6: " "
-          text run at (14,68) width 714: "xxx xx xxxx xxx xxx xx xxxxxx xxxxx xxxxxx xxx xx xxxx xxx xxx xx x"
-          text run at (728,68) width 6: " "
-          text run at (14,95) width 360: "xxxxx xxxxxxxxxxxx xxxxxxxx xxx "
-        LayoutInline {SPAN} at (0,0) size 0x26
-caret: position 233 of child 0 {#text} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-around-br-001-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-around-br-001-expected.png
deleted file mode 100644
index 08365df..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-around-br-001-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-around-br-001-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-around-br-001-expected.txt
deleted file mode 100644
index b83d02a..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/typing-around-br-001-expected.txt
+++ /dev/null
@@ -1,95 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x244 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 71x215
-          LayoutText {#text} at (14,14) size 71x26
-            text run at (14,14) width 71: "XXxxx"
-          LayoutBR {BR} at (84,35) size 1x0
-          LayoutText {#text} at (14,41) size 71x26
-            text run at (14,41) width 71: "XXxxx"
-          LayoutBR {BR} at (84,62) size 1x0
-          LayoutText {#text} at (14,68) size 36x26
-            text run at (14,68) width 36: "xxx"
-          LayoutBR {BR} at (50,89) size 0x0
-          LayoutText {#text} at (14,95) size 71x26
-            text run at (14,95) width 71: "XXxxx"
-          LayoutBR {BR} at (84,116) size 1x0
-          LayoutText {#text} at (14,122) size 36x26
-            text run at (14,122) width 36: "xxx"
-          LayoutBR {BR} at (50,143) size 0x0
-          LayoutText {#text} at (14,149) size 36x26
-            text run at (14,149) width 36: "xxx"
-          LayoutBR {BR} at (50,170) size 0x0
-          LayoutText {#text} at (14,176) size 36x26
-            text run at (14,176) width 36: "xxx"
-          LayoutBR {BR} at (50,197) size 0x0
-          LayoutText {#text} at (14,203) size 71x26
-            text run at (14,203) width 71: "XXxxx"
-caret: position 5 of child 14 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-1-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-1-expected.png
deleted file mode 100644
index dea39fcd..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-1-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-1-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-1-expected.txt
deleted file mode 100644
index a957026..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-1-expected.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x18
-        LayoutText {#text} at (0,0) size 431x17
-          text run at (0,0) width 431: "This is a replica of the paste that caused the crash covered by 8145."
-      LayoutBlockFlow {DIV} at (0,34) size 784x38 [border: (1px solid #000000)]
-        LayoutBlockFlow (anonymous) at (1,1) size 782x18
-          LayoutText {#text} at (0,0) size 72x17
-            text run at (0,0) width 72: "foo bar baz"
-            text run at (71,0) width 1: " "
-        LayoutBlockFlow {DIV} at (1,19) size 782x18
-          LayoutBR {BR} at (0,0) size 0x17
-caret: position 0 of child 0 {BR} of child 1 {DIV} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-2-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-2-expected.png
deleted file mode 100644
index 0acaf21..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-2-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-2-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-2-expected.txt
deleted file mode 100644
index 9f27757..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-2-expected.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x54
-        LayoutText {#text} at (0,0) size 774x53
-          text run at (0,0) width 305: "This tests a change made with the fix for 8145. "
-          text run at (304,0) width 434: "The paragraph separator inserted to prevent nesting blocks from the"
-          text run at (0,18) width 774: "fragment to paste inside the block where the paste occured was incorrectly inserted when the paste occured at the start of"
-          text run at (0,36) width 80: "a paragraph."
-      LayoutBlockFlow {DIV} at (0,70) size 784x74 [border: (1px solid #000000)]
-        LayoutBlockFlow (anonymous) at (1,1) size 782x18
-          LayoutText {#text} at (0,0) size 22x17
-            text run at (0,0) width 22: "foo"
-          LayoutBR {BR} at (21,14) size 1x0
-        LayoutBlockFlow {DIV} at (1,19) size 782x18
-          LayoutText {#text} at (0,0) size 22x17
-            text run at (0,0) width 22: "foo"
-        LayoutBlockFlow (anonymous) at (1,37) size 782x36
-          LayoutText {#text} at (0,0) size 21x17
-            text run at (0,0) width 21: "bar"
-          LayoutText {#text} at (20,0) size 21x17
-            text run at (20,0) width 21: "bar"
-          LayoutBR {BR} at (40,14) size 1x0
-          LayoutText {#text} at (0,18) size 23x17
-            text run at (0,18) width 23: "baz"
-caret: position 3 of child 3 {#text} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-3-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-3-expected.png
deleted file mode 100644
index f1e472c..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-3-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-3-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-3-expected.txt
deleted file mode 100644
index 0fe33b8..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/8145-3-expected.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x54
-        LayoutText {#text} at (0,0) size 771x53
-          text run at (0,0) width 305: "This tests a change made with the fix for 8145. "
-          text run at (304,0) width 434: "The paragraph separator inserted to prevent nesting blocks from the"
-          text run at (0,18) width 771: "fragment to paste inside the block where the paste occured was not being inserted when the fragment had an interchange"
-          text run at (0,36) width 121: "newline at the end."
-      LayoutBlockFlow {DIV} at (0,70) size 784x56 [border: (1px solid #000000)]
-        LayoutBlockFlow {DIV} at (1,1) size 782x18
-          LayoutText {#text} at (0,0) size 26x17
-            text run at (0,0) width 26: "fbar"
-        LayoutBlockFlow (anonymous) at (1,19) size 782x18
-          LayoutText {#text} at (0,0) size 23x17
-            text run at (0,0) width 23: "baz"
-        LayoutBlockFlow {DIV} at (1,37) size 782x18
-          LayoutText {#text} at (0,0) size 16x17
-            text run at (0,0) width 16: "oo"
-caret: position 0 of child 0 {#text} of child 2 {DIV} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png
index 2029a39..6f37d2a3 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
index dcd19eb..6ff3496 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
index 394fa5f..abf4901b 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-cover-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-cover-expected.png
index 3f4374e..dfae2be2 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-cover-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-cover-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-expected.png
index 8485de08..2f8474d 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-png-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-png-expected.png
index 8485de08..2f8474d 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-png-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-cross-fade-png-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-repeat-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-repeat-expected.png
index 52e20922..d3d3491 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-repeat-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-repeat-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-space-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-space-expected.png
index a9f169e..a0e0e5e 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-space-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-background-image-space-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-border-image-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-border-image-expected.png
index 7a6bdb02..f922373 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-border-image-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-border-image-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-border-image-source-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-border-image-source-expected.png
index 38a4da5..72ff7d54 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-border-image-source-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-border-image-source-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-group-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-group-expected.png
index cad6e7870..c362efe 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-group-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-group-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-expected.png
index 0ff86d9..c915480 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-pattern-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-pattern-expected.png
index ba7c504..d2d9ba3 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-pattern-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-image-canvas-pattern-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-image-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-image-expected.png
index 396a4e9..81b6993 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-image-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-image-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-image-profile-match-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-image-profile-match-expected.png
index 460aba0..8deac3e 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-image-profile-match-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-image-profile-match-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-mask-image-svg-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-mask-image-svg-expected.png
index aa9ed4aa..a60b05d 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-mask-image-svg-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-mask-image-svg-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb-expected.png
index 5b0ba139..4c8271d 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-munsell-adobe-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb-expected.png
index b5e2538..cc99ea3 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-munsell-srgb-to-srgb-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-object-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-object-expected.png
index ec736c7..bb87a20 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-object-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-object-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-reflection-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-reflection-expected.png
index b54289827..8d89e59a 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-reflection-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-reflection-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-svg-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-svg-expected.png
index 0ede66c..68a9d14 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-svg-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/color-profile-svg-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/exif-orientation-height-image-document-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/exif-orientation-height-image-document-expected.png
index 3bd85e3..360a320 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/exif-orientation-height-image-document-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/exif-orientation-height-image-document-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/jpeg-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/jpeg-with-color-profile-expected.png
index e6cad44..8a8e863 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/jpeg-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/jpeg-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/png-with-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/png-with-color-profile-expected.png
index e6cad44..8a8e863 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/png-with-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/png-with-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/ycbcr-with-cmyk-color-profile-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/ycbcr-with-cmyk-color-profile-expected.png
index 86d3b0e..580b697 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/ycbcr-with-cmyk-color-profile-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/gpu-rasterization/fast/images/ycbcr-with-cmyk-color-profile-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win7/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
new file mode 100644
index 0000000..6132e75b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/win7/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/svg/canvas/canvas-draw-image-globalalpha.html b/third_party/WebKit/LayoutTests/svg/canvas/canvas-draw-image-globalalpha.html
index dec1382..24ba5cd 100644
--- a/third_party/WebKit/LayoutTests/svg/canvas/canvas-draw-image-globalalpha.html
+++ b/third_party/WebKit/LayoutTests/svg/canvas/canvas-draw-image-globalalpha.html
@@ -3,7 +3,9 @@
 <script>
 var img = new Image();
 img.src = 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"><rect width="100" height="100" fill="#008000"/></svg>';
-var c = document.querySelector('canvas').getContext('2d');
-c.globalAlpha = 0.5;
-c.drawImage(img, 0, 0);
+img.onload = function() {
+    var c = document.querySelector('canvas').getContext('2d');
+    c.globalAlpha = 0.5;
+    c.drawImage(img, 0, 0);
+}
 </script>
diff --git a/third_party/WebKit/LayoutTests/svg/canvas/image-svg-intrinsic-size.html b/third_party/WebKit/LayoutTests/svg/canvas/image-svg-intrinsic-size.html
index 917e029e8..bb94b5b 100644
--- a/third_party/WebKit/LayoutTests/svg/canvas/image-svg-intrinsic-size.html
+++ b/third_party/WebKit/LayoutTests/svg/canvas/image-svg-intrinsic-size.html
@@ -8,12 +8,15 @@
       image.src = "data:image/svg+xml," +
                   "<svg xmlns='http://www.w3.org/2000/svg' width='200' viewBox='0 0 1 1'>" +
                   "<rect width='1' height='1' fill='green'/></svg>";
+      image.onload = function() {
+          var canvas = document.querySelector('canvas');
+          var ctx = canvas.getContext("2d");
+          ctx.drawImage(document.querySelector('img'), 0, 0);
+          document.body.removeChild(document.querySelector('img'));
+      };
       return image;
   }
   document.body.appendChild(createSVGImage());
   document.body.offsetTop; // Force layout
-  var canvas = document.querySelector('canvas');
-  var ctx = canvas.getContext("2d");
-  ctx.drawImage(document.querySelector('img'), 0, 0);
-  document.body.removeChild(document.querySelector('img'));
+
 </script>
diff --git a/third_party/WebKit/LayoutTests/web-animations-api/delay-endDelay-phases.html b/third_party/WebKit/LayoutTests/web-animations-api/delay-endDelay-phases.html
index 51f4cee..2074cb3 100644
--- a/third_party/WebKit/LayoutTests/web-animations-api/delay-endDelay-phases.html
+++ b/third_party/WebKit/LayoutTests/web-animations-api/delay-endDelay-phases.html
@@ -48,8 +48,8 @@
     { at: 1, expect: 0 },
     { at: 2, expect: 0.1 },
     { at: 9, expect: 0.8 },
-    { at: 10, expect: 1 },
-    { at: 11, expect: 1 },
+    { at: 10, expect: 0.9 },
+    { at: 11, expect: 0.9 },
   ],
 }, 'Positive delay and negative endDelay');
 
@@ -84,9 +84,9 @@
     { at: 0, expect: 0.1 },
     { at: 1, expect: 0.2 },
     { at: 7, expect: 0.8 },
-    { at: 8, expect: 1 },
-    { at: 9, expect: 1 },
-    { at: 10, expect: 1 },
+    { at: 8, expect: 0.9 },
+    { at: 9, expect: 0.9 },
+    { at: 10, expect: 0.9 },
   ],
 }, 'delay and endDelay both negative');
 
@@ -99,12 +99,12 @@
   },
   expectations: [
     { at: -2, expect: 0 },
-    { at: -1, expect: 1 },
-    { at: 0, expect: 1 },
-    { at: 5, expect: 1 },
-    { at: 10, expect: 1 },
-    { at: 11, expect: 1 },
-    { at: 12, expect: 1 },
+    { at: -1, expect: 0 },
+    { at: 0, expect: 0 },
+    { at: 5, expect: 0 },
+    { at: 10, expect: 0 },
+    { at: 11, expect: 0 },
+    { at: 12, expect: 0 },
   ],
 }, 'Negative endDelay that eclipses delay and duration');
 </script>
diff --git a/third_party/WebKit/LayoutTests/web-animations-api/fill-forward-negative-end-delay.html b/third_party/WebKit/LayoutTests/web-animations-api/fill-forward-negative-end-delay.html
new file mode 100644
index 0000000..fac0d47
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/web-animations-api/fill-forward-negative-end-delay.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Tests for effect clipping via negative end delay</title>
+<link rel="help" href="http://w3c.github.io/web-animations/#calculating-the-active-time">
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="../imported/wpt/web-animations/testcommon.js"></script>
+<body>
+<script>
+'use strict';
+
+test(function(t) {
+  var animation = createDiv(t).animate(null, {
+    fill: 'forwards',
+    duration: 1,
+    endDelay: -1,
+  });
+  animation.currentTime = 10;
+  assert_equals(animation.effect.getComputedTiming().progress, 0,
+      'Progress should be zero since we clip to the start of the animation');
+}, 'Negative end delay clipping into the start of the animation');
+
+test(function(t) {
+  var animation = createDiv(t).animate(null, {
+    fill: 'forwards',
+    duration: 1,
+    iterations: 2,
+    endDelay: -1,
+  });
+  animation.currentTime = 10;
+  assert_equals(animation.effect.getComputedTiming().progress, 1,
+      'Progress should be 1 since we clip to the end of the first iteration ' +
+      'and the second iteration does not have a chance to start');
+}, 'Negative end delay clipping to the end of the the first iteration');
+
+test(function(t) {
+  var animation = createDiv(t).animate(null, {
+    fill: 'forwards',
+    duration: 1,
+    iterations: 2,
+    endDelay: -0.75,
+  });
+  animation.currentTime = 10;
+  assert_equals(animation.effect.getComputedTiming().progress, 0.25,
+      'Progress should be 0.25 since we clip part way through the second iteration');
+}, 'Negative end delay clipping part way into the second iteration');
+
+test(function(t) {
+  var animation = createDiv(t).animate(null, {
+    fill: 'forwards',
+    duration: 1,
+    iterations: 0,
+    endDelay: -1,
+  });
+  animation.currentTime = 10;
+  assert_equals(animation.effect.getComputedTiming().progress, 0,
+      'Progress should be 0 since there are no iterations to make progress in');
+}, 'Negative end delay clipping into zero iterations');
+
+</script>
+</body>
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.cpp
index 342dff7..32dc346 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.cpp
@@ -13,8 +13,8 @@
 #include "bindings/core/v8/V8ScriptRunner.h"
 #include "bindings/core/v8/V8ThrowException.h"
 #include "core/dom/ExceptionCode.h"
+#include "core/dom/custom/CustomElement.h"
 #include "core/html/HTMLElement.h"
-#include "core/html/HTMLUnknownElement.h"
 #include "v8.h"
 #include "wtf/Allocator.h"
 
@@ -205,12 +205,7 @@
             exceptionState.throwIfNeeded();
         }
 
-        // ...and let element be instead a new element that implements
-        // HTMLUnknownElement, with no attributes, namespace set to given
-        // namespace, namespace prefix set to null, custom element state
-        // "undefined", and node document set to document.
-        element = HTMLUnknownElement::create(tagName, document);
-        element->setCustomElementState(CustomElementState::Undefined);
+        return CustomElement::createFailedElement(document, tagName);
     }
     return element;
 }
diff --git a/third_party/WebKit/Source/bindings/core/v8/ToV8.cpp b/third_party/WebKit/Source/bindings/core/v8/ToV8.cpp
index f09ab370..c499b7c9 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ToV8.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/ToV8.cpp
@@ -20,17 +20,12 @@
 
     if (UNLIKELY(!window))
         return v8::Null(isolate);
-
-    // TODO(yukishiino): There must be no case to return undefined.
-    // 'window', 'frames' and 'self' attributes in Window interface return
-    // the WindowProxy object of the browsing context, which never be undefined.
-    // 'top' and 'parent' attributes return the same when detached.  Therefore,
-    // there must be no case to return undefined.
-    // See http://crbug.com/621730 and http://crbug.com/621577 .
-    if (!window->isCurrentlyDisplayedInFrame())
+    // Initializes environment of a frame, and return the global object
+    // of the frame.
+    Frame * frame = window->frame();
+    if (!frame)
         return v8Undefined();
 
-    Frame* frame = window->frame();
     return frame->windowProxy(DOMWrapperWorld::current(isolate))->globalIfNotDetached();
 }
 
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8ScriptRunner.cpp b/third_party/WebKit/Source/bindings/core/v8/V8ScriptRunner.cpp
index f85a045..4be52d5 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8ScriptRunner.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8ScriptRunner.cpp
@@ -360,7 +360,7 @@
     return compileScript(v8String(isolate, code), fileName, sourceMapUrl, textPosition, isolate, nullptr, nullptr, cacheMetadataHandler, accessControlStatus, v8CacheOptions);
 }
 
-v8::MaybeLocal<v8::Script> V8ScriptRunner::compileScript(v8::Local<v8::String> code, const String& fileName, const String& sourceMapUrl, const TextPosition& scriptStartPosition, v8::Isolate* isolate, ScriptResource* resource, ScriptStreamer* streamer, CachedMetadataHandler* cacheHandler, AccessControlStatus accessControlStatus, V8CacheOptions cacheOptions, bool isInternalScript)
+v8::MaybeLocal<v8::Script> V8ScriptRunner::compileScript(v8::Local<v8::String> code, const String& fileName, const String& sourceMapUrl, const TextPosition& scriptStartPosition, v8::Isolate* isolate, ScriptResource* resource, ScriptStreamer* streamer, CachedMetadataHandler* cacheHandler, AccessControlStatus accessControlStatus, V8CacheOptions cacheOptions)
 {
     TRACE_EVENT2("v8,devtools.timeline", "v8.compile", "fileName", fileName.utf8(), "data", InspectorCompileScriptEvent::data(fileName, scriptStartPosition));
     TRACE_EVENT_SCOPED_SAMPLING_STATE("v8", "V8Compile");
@@ -376,7 +376,7 @@
         v8::Integer::New(isolate, scriptStartPosition.m_column.zeroBasedInt()),
         v8Boolean(accessControlStatus == SharableCrossOrigin, isolate),
         v8::Local<v8::Integer>(),
-        v8Boolean(isInternalScript, isolate),
+        v8Boolean(false, isolate),
         v8String(isolate, sourceMapUrl),
         v8Boolean(accessControlStatus == OpaqueResource, isolate));
 
@@ -423,7 +423,7 @@
 v8::MaybeLocal<v8::Value> V8ScriptRunner::compileAndRunInternalScript(v8::Local<v8::String> source, v8::Isolate* isolate, const String& fileName, const TextPosition& scriptStartPosition)
 {
     v8::Local<v8::Script> script;
-    if (!V8ScriptRunner::compileScript(source, fileName, String(), scriptStartPosition, isolate, nullptr, nullptr, nullptr, SharableCrossOrigin, V8CacheOptionsDefault, true).ToLocal(&script))
+    if (!V8ScriptRunner::compileScript(source, fileName, String(), scriptStartPosition, isolate, nullptr, nullptr, nullptr, SharableCrossOrigin, V8CacheOptionsDefault).ToLocal(&script))
         return v8::MaybeLocal<v8::Value>();
 
     TRACE_EVENT0("v8", "v8.run");
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8ScriptRunner.h b/third_party/WebKit/Source/bindings/core/v8/V8ScriptRunner.h
index ed67b1a..973404e 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8ScriptRunner.h
+++ b/third_party/WebKit/Source/bindings/core/v8/V8ScriptRunner.h
@@ -58,7 +58,7 @@
     // normal scripe resources, CachedMetadataHandler is from ScriptResource.
     // For worker script, ScriptResource is null but CachedMetadataHandler may be
     // set. When ScriptStreamer is set, ScriptResource must be set.
-    static v8::MaybeLocal<v8::Script> compileScript(v8::Local<v8::String>, const String& fileName, const String& sourceMapUrl, const TextPosition&, v8::Isolate*, ScriptResource* = nullptr, ScriptStreamer* = nullptr, CachedMetadataHandler* = nullptr, AccessControlStatus = SharableCrossOrigin, V8CacheOptions = V8CacheOptionsDefault, bool isInternalScript = false);
+    static v8::MaybeLocal<v8::Script> compileScript(v8::Local<v8::String>, const String& fileName, const String& sourceMapUrl, const TextPosition&, v8::Isolate*, ScriptResource* = nullptr, ScriptStreamer* = nullptr, CachedMetadataHandler* = nullptr, AccessControlStatus = SharableCrossOrigin, V8CacheOptions = V8CacheOptionsDefault);
     static v8::MaybeLocal<v8::Value> runCompiledScript(v8::Isolate*, v8::Local<v8::Script>, ExecutionContext*);
     static v8::MaybeLocal<v8::Value> compileAndRunInternalScript(v8::Local<v8::String>, v8::Isolate*, const String& = String(), const TextPosition& = TextPosition());
     static v8::MaybeLocal<v8::Value> runCompiledInternalScript(v8::Isolate*, v8::Local<v8::Script>);
diff --git a/third_party/WebKit/Source/core/animation/AnimationEffect.cpp b/third_party/WebKit/Source/core/animation/AnimationEffect.cpp
index 1d6e86a1..a59ed55 100644
--- a/third_party/WebKit/Source/core/animation/AnimationEffect.cpp
+++ b/third_party/WebKit/Source/core/animation/AnimationEffect.cpp
@@ -156,7 +156,7 @@
             const double startOffset = multiplyZeroAlwaysGivesZero(m_timing.iterationStart, iterationDuration);
             ASSERT(startOffset >= 0);
             const double scaledActiveTime = calculateScaledActiveTime(activeDuration, activeTime, startOffset, m_timing);
-            const double iterationTime = calculateIterationTime(iterationDuration, repeatedDuration(), scaledActiveTime, startOffset, m_timing);
+            const double iterationTime = calculateIterationTime(iterationDuration, repeatedDuration(), scaledActiveTime, startOffset, currentPhase, m_timing);
 
             currentIteration = calculateCurrentIteration(iterationDuration, iterationTime, scaledActiveTime, m_timing);
             const double transformedTime = calculateTransformedTime(currentIteration, iterationDuration, iterationTime, m_timing);
@@ -187,7 +187,7 @@
             const double startOffset = m_timing.iterationStart * localIterationDuration;
             ASSERT(startOffset >= 0);
             const double scaledActiveTime = calculateScaledActiveTime(localActiveDuration, localActiveTime, startOffset, m_timing);
-            const double iterationTime = calculateIterationTime(localIterationDuration, localRepeatedDuration, scaledActiveTime, startOffset, m_timing);
+            const double iterationTime = calculateIterationTime(localIterationDuration, localRepeatedDuration, scaledActiveTime, startOffset, currentPhase, m_timing);
 
             currentIteration = calculateCurrentIteration(localIterationDuration, iterationTime, scaledActiveTime, m_timing);
             progress = calculateTransformedTime(currentIteration, localIterationDuration, iterationTime, m_timing);
diff --git a/third_party/WebKit/Source/core/animation/CompositorAnimationsTest.cpp b/third_party/WebKit/Source/core/animation/CompositorAnimationsTest.cpp
index dad1ada..7feb055 100644
--- a/third_party/WebKit/Source/core/animation/CompositorAnimationsTest.cpp
+++ b/third_party/WebKit/Source/core/animation/CompositorAnimationsTest.cpp
@@ -395,12 +395,6 @@
     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
     EXPECT_EQ(5.5, m_compositorTiming.adjustedIterationCount);
 
-    // EXPECT_DEATH tests are flaky on Android.
-#if ENABLE(ASSERT) && !OS(ANDROID)
-    m_timing.iterationCount = -1;
-    EXPECT_DEATH(convertTimingForCompositor(m_timing, m_compositorTiming), "");
-#endif
-
     m_timing.iterationCount = std::numeric_limits<double>::infinity();
     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
     EXPECT_EQ(-1, m_compositorTiming.adjustedIterationCount);
diff --git a/third_party/WebKit/Source/core/animation/TimingCalculations.h b/third_party/WebKit/Source/core/animation/TimingCalculations.h
index 0ba2110..ee902b4 100644
--- a/third_party/WebKit/Source/core/animation/TimingCalculations.h
+++ b/third_party/WebKit/Source/core/animation/TimingCalculations.h
@@ -89,7 +89,7 @@
         return nullValue();
     case AnimationEffect::PhaseAfter:
         if (fillMode == Timing::FillModeForwards || fillMode == Timing::FillModeBoth)
-            return activeDuration;
+            return std::max(0.0, std::min(activeDuration, activeDuration + specified.endDelay));
         return nullValue();
     case AnimationEffect::PhaseNone:
         ASSERT(isNull(localTime));
@@ -125,7 +125,8 @@
     return !fmod(iterationCount + iterationStart, 1);
 }
 
-static inline double calculateIterationTime(double iterationDuration, double repeatedDuration, double scaledActiveTime, double startOffset, const Timing& specified)
+// TODO(crbug.com/630915): Align this function with current Web Animations spec text.
+static inline double calculateIterationTime(double iterationDuration, double repeatedDuration, double scaledActiveTime, double startOffset, AnimationEffect::Phase phase, const Timing& specified)
 {
     ASSERT(iterationDuration > 0);
     ASSERT(repeatedDuration == multiplyZeroAlwaysGivesZero(iterationDuration, specified.iterationCount));
@@ -141,7 +142,17 @@
         return iterationDuration;
 
     ASSERT(std::isfinite(scaledActiveTime));
-    return fmod(scaledActiveTime, iterationDuration);
+    double iterationTime = fmod(scaledActiveTime, iterationDuration);
+
+    // This implements step 3 of
+    // http://w3c.github.io/web-animations/#calculating-the-simple-iteration-progress
+    if (iterationTime == 0
+        && phase == AnimationEffect::PhaseAfter
+        && repeatedDuration != 0
+        && scaledActiveTime != 0)
+        return iterationDuration;
+
+    return iterationTime;
 }
 
 static inline double calculateCurrentIteration(double iterationDuration, double iterationTime, double scaledActiveTime, const Timing& specified)
diff --git a/third_party/WebKit/Source/core/animation/TimingCalculationsTest.cpp b/third_party/WebKit/Source/core/animation/TimingCalculationsTest.cpp
index 698e567..86d4f181 100644
--- a/third_party/WebKit/Source/core/animation/TimingCalculationsTest.cpp
+++ b/third_party/WebKit/Source/core/animation/TimingCalculationsTest.cpp
@@ -101,20 +101,20 @@
 {
     Timing timing;
 
-    // calculateIterationTime(iterationDuration, repeatedDuration, scaledActiveTime, startOffset, timing)
+    // calculateIterationTime(iterationDuration, repeatedDuration, scaledActiveTime, startOffset, phase, timing)
 
     // if the scaled active time is null
-    EXPECT_TRUE(isNull(calculateIterationTime(1, 1, nullValue(), 1, timing)));
+    EXPECT_TRUE(isNull(calculateIterationTime(1, 1, nullValue(), 1, AnimationEffect::PhaseActive, timing)));
 
     // if (complex-conditions)...
-    EXPECT_EQ(12, calculateIterationTime(12, 12, 12, 0, timing));
+    EXPECT_EQ(12, calculateIterationTime(12, 12, 12, 0, AnimationEffect::PhaseActive, timing));
 
     // otherwise
     timing.iterationCount = 10;
-    EXPECT_EQ(5, calculateIterationTime(10, 100, 25, 4, timing));
-    EXPECT_EQ(7, calculateIterationTime(11, 110, 29, 1, timing));
+    EXPECT_EQ(5, calculateIterationTime(10, 100, 25, 4, AnimationEffect::PhaseActive, timing));
+    EXPECT_EQ(7, calculateIterationTime(11, 110, 29, 1, AnimationEffect::PhaseActive, timing));
     timing.iterationStart = 1.1;
-    EXPECT_EQ(8, calculateIterationTime(12, 120, 20, 7, timing));
+    EXPECT_EQ(8, calculateIterationTime(12, 120, 20, 7, AnimationEffect::PhaseActive, timing));
 }
 
 TEST(AnimationTimingCalculationsTest, CurrentIteration)
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
index 79d287d..c97e9a71 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -2765,7 +2765,7 @@
     return shape;
 }
 
-static CSSValue* consumeClipPath(CSSParserTokenRange& range, const CSSParserContext& context)
+static CSSValue* consumeWebkitClipPath(CSSParserTokenRange& range, const CSSParserContext& context)
 {
     if (range.peek().id() == CSSValueNone)
         return consumeIdent(range);
@@ -3894,7 +3894,7 @@
     case CSSPropertyShapeOutside:
         return consumeShapeOutside(m_range, m_context);
     case CSSPropertyWebkitClipPath:
-        return consumeClipPath(m_range, m_context);
+        return consumeWebkitClipPath(m_range, m_context);
     case CSSPropertyJustifyContent:
     case CSSPropertyAlignContent:
         ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled());
diff --git a/third_party/WebKit/Source/core/dom/ContainerNode.h b/third_party/WebKit/Source/core/dom/ContainerNode.h
index 58a97a0bd..c84bf925 100644
--- a/third_party/WebKit/Source/core/dom/ContainerNode.h
+++ b/third_party/WebKit/Source/core/dom/ContainerNode.h
@@ -83,7 +83,7 @@
 
     unsigned countChildren() const;
 
-    Element* querySelector(const AtomicString& selectors, ExceptionState&);
+    Element* querySelector(const AtomicString& selectors, ExceptionState& = ASSERT_NO_EXCEPTION);
     StaticElementList* querySelectorAll(const AtomicString& selectors, ExceptionState&);
 
     Node* insertBefore(Node* newChild, Node* refChild, ExceptionState& = ASSERT_NO_EXCEPTION);
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index ad88264..c2d0219 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -113,6 +113,7 @@
 #include "core/dom/shadow/FlatTreeTraversal.h"
 #include "core/dom/shadow/ShadowRoot.h"
 #include "core/editing/DragCaretController.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/editing/Editor.h"
 #include "core/editing/FrameSelection.h"
 #include "core/editing/InputMethodController.h"
diff --git a/third_party/WebKit/Source/core/dom/Element.cpp b/third_party/WebKit/Source/core/dom/Element.cpp
index 5334335c..4257023 100644
--- a/third_party/WebKit/Source/core/dom/Element.cpp
+++ b/third_party/WebKit/Source/core/dom/Element.cpp
@@ -1959,7 +1959,7 @@
 
     const AtomicString& tagName = localName();
     bool tagNameIsSupported = isV0CustomElement()
-        || isCustomElement()
+        || getCustomElementState() != CustomElementState::Uncustomized
         || tagName == HTMLNames::articleTag
         || tagName == HTMLNames::asideTag
         || tagName == HTMLNames::blockquoteTag
diff --git a/third_party/WebKit/Source/core/dom/Element.h b/third_party/WebKit/Source/core/dom/Element.h
index d4566f8..94dfc4f6 100644
--- a/third_party/WebKit/Source/core/dom/Element.h
+++ b/third_party/WebKit/Source/core/dom/Element.h
@@ -376,7 +376,7 @@
     void setIsInCanvasSubtree(bool value) { setElementFlag(IsInCanvasSubtree, value); }
     bool isInCanvasSubtree() const { return hasElementFlag(IsInCanvasSubtree); }
 
-    bool isDefined() const { return getCustomElementState() != CustomElementState::Undefined; }
+    bool isDefined() const { return !(static_cast<int>(getCustomElementState()) & static_cast<int>(CustomElementState::NotDefinedFlag)); }
     bool isUpgradedV0CustomElement() { return getV0CustomElementState() == V0Upgraded; }
     bool isUnresolvedV0CustomElement() { return getV0CustomElementState() == V0WaitingForUpgrade; }
 
diff --git a/third_party/WebKit/Source/core/dom/Fullscreen.cpp b/third_party/WebKit/Source/core/dom/Fullscreen.cpp
index ebdca0e..e07337e 100644
--- a/third_party/WebKit/Source/core/dom/Fullscreen.cpp
+++ b/third_party/WebKit/Source/core/dom/Fullscreen.cpp
@@ -46,6 +46,7 @@
 #include "core/layout/LayoutFullScreen.h"
 #include "core/layout/api/LayoutFullScreenItem.h"
 #include "core/page/ChromeClient.h"
+#include "platform/ScopedOrientationChangeIndicator.h"
 #include "platform/UserGestureIndicator.h"
 
 namespace blink {
@@ -254,15 +255,20 @@
         if (!fullscreenElementReady(element))
             break;
 
-        // This algorithm is not allowed to show a pop-up:
-        //   An algorithm is allowed to show a pop-up if, in the task in which the algorithm is running, either:
-        //   - an activation behavior is currently being processed whose click event was trusted, or
-        //   - the event listener for a trusted click event is being handled.
+        // Fullscreen is not supported.
+        if (!fullscreenIsSupported(element.document()))
+            break;
+
+        // This algorithm is not allowed to request fullscreen.
+        // An algorithm is allowed to request fullscreen if one of the following
+        // is true:
+        //  - the algorithm is triggered by a user activation.
+        //  - the algorithm is triggered by a user generated orientation change.
         //
         // If |forCrossProcessDescendant| is true, requestFullscreen
         // was already called on a descendant element in another process, and
         // getting here means that it already passed the user gesture check.
-        if (!UserGestureIndicator::utilizeUserGesture() && !forCrossProcessDescendant) {
+        if (!UserGestureIndicator::utilizeUserGesture() && !ScopedOrientationChangeIndicator::processingOrientationChange() && !forCrossProcessDescendant) {
             String message = ExceptionMessages::failedToExecute("requestFullScreen",
                 "Element", "API can only be initiated by a user gesture.");
             document()->addConsoleMessage(
@@ -270,10 +276,6 @@
             break;
         }
 
-        // Fullscreen is not supported.
-        if (!fullscreenIsSupported(element.document()))
-            break;
-
         // 2. Let doc be element's node document. (i.e. "this")
         Document* currentDoc = document();
 
diff --git a/third_party/WebKit/Source/core/dom/Node.cpp b/third_party/WebKit/Source/core/dom/Node.cpp
index 19799caf..8760f77 100644
--- a/third_party/WebKit/Source/core/dom/Node.cpp
+++ b/third_party/WebKit/Source/core/dom/Node.cpp
@@ -56,6 +56,7 @@
 #include "core/dom/Text.h"
 #include "core/dom/TreeScopeAdopter.h"
 #include "core/dom/UserActionElementSet.h"
+#include "core/dom/custom/CustomElement.h"
 #include "core/dom/shadow/ElementShadow.h"
 #include "core/dom/shadow/FlatTreeTraversal.h"
 #include "core/dom/shadow/InsertionPoint.h"
@@ -540,96 +541,6 @@
     }
 }
 
-// TODO(yoichio): Move to core/editing
-enum EditableLevel { Editable, RichlyEditable };
-static bool hasEditableStyle(const Node&, EditableLevel);
-static bool isEditableToAccessibility(const Node&, EditableLevel);
-
-// TODO(yoichio): Move to core/editing
-bool isContentEditable(const Node& node)
-{
-    node.document().updateStyleAndLayoutTree();
-    return blink::hasEditableStyle(node, Editable);
-}
-
-// TODO(yoichio): Move to core/editing
-bool isContentRichlyEditable(const Node& node)
-{
-    node.document().updateStyleAndLayoutTree();
-    return blink::hasEditableStyle(node, RichlyEditable);
-}
-
-// TODO(yoichio): Move to core/editing
-static bool hasEditableStyle(const Node& node, EditableLevel editableLevel)
-{
-    if (node.isPseudoElement())
-        return false;
-
-    // Ideally we'd call DCHECK(!needsStyleRecalc()) here, but
-    // ContainerNode::setFocus() calls setNeedsStyleRecalc(), so the assertion
-    // would fire in the middle of Document::setFocusedNode().
-
-    for (const Node& ancestor : NodeTraversal::inclusiveAncestorsOf(node)) {
-        if ((ancestor.isHTMLElement() || ancestor.isDocumentNode()) && ancestor.layoutObject()) {
-            switch (ancestor.layoutObject()->style()->userModify()) {
-            case READ_ONLY:
-                return false;
-            case READ_WRITE:
-                return true;
-            case READ_WRITE_PLAINTEXT_ONLY:
-                return editableLevel != RichlyEditable;
-            }
-            ASSERT_NOT_REACHED();
-            return false;
-        }
-    }
-
-    return false;
-}
-
-// TODO(yoichio): Move to core/editing
-static bool isEditableToAccessibility(const Node& node, EditableLevel editableLevel)
-{
-    if (blink::hasEditableStyle(node, editableLevel))
-        return true;
-
-    // FIXME: Respect editableLevel for ARIA editable elements.
-    if (editableLevel == RichlyEditable)
-        return false;
-
-    // FIXME(dmazzoni): support ScopedAXObjectCache (crbug/489851).
-    if (AXObjectCache* cache = node.document().existingAXObjectCache())
-        return cache->rootAXEditableElement(&node);
-
-    return false;
-}
-
-// TODO(yoichio): Move to core/editing
-bool hasEditableStyle(const Node& node, EditableType editableType)
-{
-    switch (editableType) {
-    case ContentIsEditable:
-        return blink::hasEditableStyle(node, Editable);
-    case HasEditableAXRole:
-        return isEditableToAccessibility(node, Editable);
-    }
-    NOTREACHED();
-    return false;
-}
-
-// TODO(yoichio): Move to core/editing
-bool layoutObjectIsRichlyEditable(const Node& node, EditableType editableType)
-{
-    switch (editableType) {
-    case ContentIsEditable:
-        return blink::hasEditableStyle(node, RichlyEditable);
-    case HasEditableAXRole:
-        return isEditableToAccessibility(node, RichlyEditable);
-    }
-    NOTREACHED();
-    return false;
-}
-
 LayoutBox* Node::layoutBox() const
 {
     LayoutObject* layoutObject = this->layoutObject();
@@ -1147,39 +1058,6 @@
     return parentOrShadowHostNode();
 }
 
-// TODO(yoichio): Move to core/editing
-bool isRootEditableElement(const Node& node)
-{
-    return hasEditableStyle(node) && node.isElementNode() && (!node.parentNode() || !hasEditableStyle(*node.parentNode())
-        || !node.parentNode()->isElementNode() || &node == node.document().body());
-}
-
-// TODO(yoichio): Move to core/editing
-Element* rootEditableElement(const Node& node, EditableType editableType)
-{
-    if (editableType == HasEditableAXRole) {
-        if (AXObjectCache* cache = node.document().existingAXObjectCache())
-            return const_cast<Element*>(cache->rootAXEditableElement(&node));
-    }
-
-    return rootEditableElement(node);
-}
-
-// TODO(yoichio): Move to core/editing
-Element* rootEditableElement(const Node& node)
-{
-    const Node* result = nullptr;
-    for (const Node* n = &node; n && hasEditableStyle(*n); n = n->parentNode()) {
-        if (n->isElementNode())
-            result = n;
-        if (node.document().body() == n)
-            break;
-    }
-    return toElement(const_cast<Node*>(result));
-}
-
-// FIXME: End of obviously misplaced HTML editing functions.  Try to move these out of Node.
-
 Document* Node::ownerDocument() const
 {
     Document* doc = &document();
@@ -2343,24 +2221,6 @@
     return document().userActionElements().isFocused(this);
 }
 
-std::ostream& operator<<(std::ostream& os, CustomElementState state)
-{
-    switch (state) {
-    case CustomElementState::Uncustomized: return os << "Uncustomized";
-    case CustomElementState::Undefined: return os << "Undefined";
-    case CustomElementState::Custom: return os << "Custom";
-    default: NOTREACHED();
-    }
-    return os;
-}
-
-CustomElementState Node::getCustomElementState() const
-{
-    return !isCustomElement()
-        ? CustomElementState::Uncustomized
-        : (getFlag(CustomElementCustomFlag) ? CustomElementState::Custom : CustomElementState::Undefined);
-}
-
 void Node::setCustomElementState(CustomElementState newState)
 {
     CustomElementState oldState = getCustomElementState();
@@ -2377,25 +2237,24 @@
     case CustomElementState::Custom:
         DCHECK_EQ(CustomElementState::Undefined, oldState);
         break;
+
+    case CustomElementState::Failed:
+        DCHECK_NE(CustomElementState::Failed, oldState);
+        break;
     }
 
     DCHECK(isHTMLElement());
     DCHECK_NE(V0Upgraded, getV0CustomElementState());
-#if DCHECK_IS_ON()
-    bool wasDefined = toElement(this)->isDefined();
-#endif
 
-    setFlag(CustomElementFlag);
-    if (newState == CustomElementState::Custom)
-        setFlag(CustomElementCustomFlag);
+    Element* element = toElement(this);
+    bool wasDefined = element->isDefined();
+
+    m_nodeFlags = (m_nodeFlags & ~CustomElementStateMask)
+        | static_cast<NodeFlags>(newState);
     DCHECK(newState == getCustomElementState());
 
-    // When the state goes from Uncustomized to Undefined, and then to Custom,
-    // isDefined is always flipped.
-#if DCHECK_IS_ON()
-    DCHECK_NE(wasDefined, toElement(this)->isDefined());
-#endif
-    toElement(this)->pseudoStateChanged(CSSSelector::PseudoDefined);
+    if (element->isDefined() != wasDefined)
+        element->pseudoStateChanged(CSSSelector::PseudoDefined);
 }
 
 void Node::setV0CustomElementState(V0CustomElementState newState)
diff --git a/third_party/WebKit/Source/core/dom/Node.h b/third_party/WebKit/Source/core/dom/Node.h
index 6480869..f9b52dc 100644
--- a/third_party/WebKit/Source/core/dom/Node.h
+++ b/third_party/WebKit/Source/core/dom/Node.h
@@ -92,6 +92,7 @@
 class TouchEvent;
 
 const int nodeStyleChangeShift = 19;
+const int nodeCustomElementShift = 21;
 
 enum StyleChangeType {
     NoStyleChange = 0,
@@ -101,12 +102,14 @@
 };
 
 enum class CustomElementState {
+    // https://dom.spec.whatwg.org/#concept-element-custom-element-state
     Uncustomized = 0,
-    Custom = 1,
-    Undefined = 2,
-};
+    Custom = 1 << nodeCustomElementShift,
+    Undefined = 2 << nodeCustomElementShift,
+    Failed = 3 << nodeCustomElementShift,
 
-CORE_EXPORT std::ostream& operator<<(std::ostream&, CustomElementState);
+    NotDefinedFlag = 2 << nodeCustomElementShift,
+};
 
 class NodeRareDataBase {
 public:
@@ -255,8 +258,7 @@
     bool isFirstLetterPseudoElement() const { return getPseudoId() == PseudoIdFirstLetter; }
     virtual PseudoId getPseudoId() const { return PseudoIdNone; }
 
-    bool isCustomElement() const { return getFlag(CustomElementFlag); }
-    CustomElementState getCustomElementState() const;
+    CustomElementState getCustomElementState() const { return static_cast<CustomElementState>(m_nodeFlags & CustomElementStateMask); }
     void setCustomElementState(CustomElementState);
     bool isV0CustomElement() const { return getFlag(V0CustomElementFlag); }
     enum V0CustomElementState {
@@ -695,8 +697,7 @@
         ChildNeedsStyleRecalcFlag = 1 << 18,
         StyleChangeMask = 1 << nodeStyleChangeShift | 1 << (nodeStyleChangeShift + 1),
 
-        CustomElementFlag = 1 << 21,
-        CustomElementCustomFlag = 1 << 22,
+        CustomElementStateMask = 0x3 << nodeCustomElementShift,
 
         HasNameOrIsEditingTextFlag = 1 << 23,
         HasWeakReferencesFlag = 1 << 24,
@@ -856,15 +857,6 @@
     return node;
 }
 
-// TODO(yoichio): Move to core/editing
-CORE_EXPORT bool isRootEditableElement(const Node&);
-CORE_EXPORT Element* rootEditableElement(const Node&);
-CORE_EXPORT Element* rootEditableElement(const Node&, EditableType);
-CORE_EXPORT bool hasEditableStyle(const Node&, EditableType = ContentIsEditable);
-CORE_EXPORT bool layoutObjectIsRichlyEditable(const Node&, EditableType = ContentIsEditable);
-CORE_EXPORT bool isContentEditable(const Node&);
-CORE_EXPORT bool isContentRichlyEditable(const Node&);
-
 // Allow equality comparisons of Nodes by reference or pointer, interchangeably.
 DEFINE_COMPARISON_OPERATORS_WITH_REFERENCES_REFCOUNTED(Node)
 
diff --git a/third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp b/third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp
index 48f58f8..5571998 100644
--- a/third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp
+++ b/third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp
@@ -43,4 +43,14 @@
     return getLoadingTaskRunner(document ? document->frame() : nullptr);
 }
 
+WebTaskRunner* TaskRunnerHelper::getUnthrottledTaskRunner(ExecutionContext* executionContext)
+{
+    return getUnthrottledTaskRunner(executionContext && executionContext->isDocument() ? static_cast<Document*>(executionContext) : nullptr);
+}
+
+WebTaskRunner* TaskRunnerHelper::getUnthrottledTaskRunner(ScriptState* scriptState)
+{
+    return getUnthrottledTaskRunner(scriptState ? scriptState->getExecutionContext() : nullptr);
+}
+
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/TaskRunnerHelper.h b/third_party/WebKit/Source/core/dom/TaskRunnerHelper.h
index d3a5b19..be7fc40 100644
--- a/third_party/WebKit/Source/core/dom/TaskRunnerHelper.h
+++ b/third_party/WebKit/Source/core/dom/TaskRunnerHelper.h
@@ -10,7 +10,9 @@
 namespace blink {
 
 class Document;
+class ExecutionContext;
 class LocalFrame;
+class ScriptState;
 class WebTaskRunner;
 
 class TaskRunnerHelper final {
@@ -22,6 +24,8 @@
     static WebTaskRunner* getUnthrottledTaskRunner(Document*);
     static WebTaskRunner* getTimerTaskRunner(Document*);
     static WebTaskRunner* getLoadingTaskRunner(Document*);
+    static WebTaskRunner* getUnthrottledTaskRunner(ExecutionContext*);
+    static WebTaskRunner* getUnthrottledTaskRunner(ScriptState*);
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/TextTest.cpp b/third_party/WebKit/Source/core/dom/TextTest.cpp
index f0b2f73..506213b 100644
--- a/third_party/WebKit/Source/core/dom/TextTest.cpp
+++ b/third_party/WebKit/Source/core/dom/TextTest.cpp
@@ -31,7 +31,7 @@
 {
     setBodyContent("<style>*::first-letter{font:icon;}</style><pre>AB\n</pre>");
 
-    Element* pre = document().querySelector("pre", ASSERT_NO_EXCEPTION);
+    Element* pre = document().querySelector("pre");
     Text* text = toText(pre->firstChild());
 
     Range* range = Range::create(document(), text, 0, text, 2);
diff --git a/third_party/WebKit/Source/core/dom/custom/CustomElement.cpp b/third_party/WebKit/Source/core/dom/custom/CustomElement.cpp
index 1156806d..6e2242b3a 100644
--- a/third_party/WebKit/Source/core/dom/custom/CustomElement.cpp
+++ b/third_party/WebKit/Source/core/dom/custom/CustomElement.cpp
@@ -15,6 +15,7 @@
 #include "core/frame/FrameHost.h"
 #include "core/frame/LocalDOMWindow.h"
 #include "core/html/HTMLElement.h"
+#include "core/html/HTMLUnknownElement.h"
 #include "platform/text/Character.h"
 #include "wtf/text/AtomicStringHash.h"
 
@@ -168,6 +169,23 @@
     return element;
 }
 
+HTMLElement* CustomElement::createFailedElement(Document& document, const QualifiedName& tagName)
+{
+    DCHECK(shouldCreateCustomElement(document, tagName));
+
+    // "create an element for a token":
+    // https://html.spec.whatwg.org/multipage/syntax.html#create-an-element-for-the-token
+
+    // 7. If this step throws an exception, let element be instead a new element
+    // that implements HTMLUnknownElement, with no attributes, namespace set to
+    // given namespace, namespace prefix set to null, custom element state set
+    // to "failed", and node document set to document.
+
+    HTMLElement* element = HTMLUnknownElement::create(tagName, document);
+    element->setCustomElementState(CustomElementState::Failed);
+    return element;
+}
+
 void CustomElement::enqueue(Element* element, CustomElementReaction* reaction)
 {
     // To enqueue an element on the appropriate element queue
diff --git a/third_party/WebKit/Source/core/dom/custom/CustomElement.h b/third_party/WebKit/Source/core/dom/custom/CustomElement.h
index 6465570..68034ae 100644
--- a/third_party/WebKit/Source/core/dom/custom/CustomElement.h
+++ b/third_party/WebKit/Source/core/dom/custom/CustomElement.h
@@ -42,6 +42,8 @@
     static HTMLElement* createCustomElementSync(Document&, const QualifiedName&);
     static HTMLElement* createCustomElementAsync(Document&, const QualifiedName&);
 
+    static HTMLElement* createFailedElement(Document&, const QualifiedName&);
+
     static void enqueue(Element*, CustomElementReaction*);
     static void enqueueConnectedCallback(Element*);
     static void enqueueDisconnectedCallback(Element*);
diff --git a/third_party/WebKit/Source/core/dom/custom/CustomElementDefinition.cpp b/third_party/WebKit/Source/core/dom/custom/CustomElementDefinition.cpp
index b5666d5..c459108 100644
--- a/third_party/WebKit/Source/core/dom/custom/CustomElementDefinition.cpp
+++ b/third_party/WebKit/Source/core/dom/custom/CustomElementDefinition.cpp
@@ -122,8 +122,10 @@
     DCHECK_EQ(m_constructionStack.size(), depth); // It's a *stack*.
     m_constructionStack.removeLast();
 
-    if (!succeeded)
+    if (!succeeded) {
+        element->setCustomElementState(CustomElementState::Failed);
         return;
+    }
 
     CHECK(element->getCustomElementState() == CustomElementState::Custom);
 }
diff --git a/third_party/WebKit/Source/core/dom/shadow/FlatTreeTraversalTest.cpp b/third_party/WebKit/Source/core/dom/shadow/FlatTreeTraversalTest.cpp
index 55ca8a7..ab79a672 100644
--- a/third_party/WebKit/Source/core/dom/shadow/FlatTreeTraversalTest.cpp
+++ b/third_party/WebKit/Source/core/dom/shadow/FlatTreeTraversalTest.cpp
@@ -116,16 +116,16 @@
     setupSampleHTML(mainHTML, shadowHTML, 0);
 
     Element* body = document().body();
-    Element* m0 = body->querySelector("#m0", ASSERT_NO_EXCEPTION);
-    Element* m00 = m0->querySelector("#m00", ASSERT_NO_EXCEPTION);
-    Element* m01 = m0->querySelector("#m01", ASSERT_NO_EXCEPTION);
+    Element* m0 = body->querySelector("#m0");
+    Element* m00 = m0->querySelector("#m00");
+    Element* m01 = m0->querySelector("#m01");
 
     Element* shadowHost = m0;
     ShadowRoot* shadowRoot = shadowHost->openShadowRoot();
-    Element* s00 = shadowRoot->querySelector("#s00", ASSERT_NO_EXCEPTION);
-    Element* s02 = shadowRoot->querySelector("#s02", ASSERT_NO_EXCEPTION);
-    Element* s03 = shadowRoot->querySelector("#s03", ASSERT_NO_EXCEPTION);
-    Element* s04 = shadowRoot->querySelector("#s04", ASSERT_NO_EXCEPTION);
+    Element* s00 = shadowRoot->querySelector("#s00");
+    Element* s02 = shadowRoot->querySelector("#s02");
+    Element* s03 = shadowRoot->querySelector("#s03");
+    Element* s04 = shadowRoot->querySelector("#s04");
 
     const unsigned numberOfChildNodes = 5;
     Node* expectedChildNodes[5] = { s00, m01, s02, s03, s04 };
@@ -191,24 +191,24 @@
         "<a id='s14'>s14</a>";
     setupSampleHTML(mainHTML, shadowHTML, 1);
     Element* body = document().body();
-    Element* m0 = body->querySelector("#m0", ASSERT_NO_EXCEPTION);
-    Element* m1 = body->querySelector("#m1", ASSERT_NO_EXCEPTION);
-    Element* m2 = body->querySelector("#m2", ASSERT_NO_EXCEPTION);
+    Element* m0 = body->querySelector("#m0");
+    Element* m1 = body->querySelector("#m1");
+    Element* m2 = body->querySelector("#m2");
 
-    Element* m00 = body->querySelector("#m00", ASSERT_NO_EXCEPTION);
-    Element* m01 = body->querySelector("#m01", ASSERT_NO_EXCEPTION);
-    Element* m10 = body->querySelector("#m10", ASSERT_NO_EXCEPTION);
-    Element* m11 = body->querySelector("#m11", ASSERT_NO_EXCEPTION);
-    Element* m12 = body->querySelector("#m12", ASSERT_NO_EXCEPTION);
-    Element* m20 = body->querySelector("#m20", ASSERT_NO_EXCEPTION);
-    Element* m21 = body->querySelector("#m21", ASSERT_NO_EXCEPTION);
+    Element* m00 = body->querySelector("#m00");
+    Element* m01 = body->querySelector("#m01");
+    Element* m10 = body->querySelector("#m10");
+    Element* m11 = body->querySelector("#m11");
+    Element* m12 = body->querySelector("#m12");
+    Element* m20 = body->querySelector("#m20");
+    Element* m21 = body->querySelector("#m21");
 
     ShadowRoot* shadowRoot = m1->openShadowRoot();
-    Element* s10 = shadowRoot->querySelector("#s10", ASSERT_NO_EXCEPTION);
-    Element* s11 = shadowRoot->querySelector("#s11", ASSERT_NO_EXCEPTION);
-    Element* s12 = shadowRoot->querySelector("#s12", ASSERT_NO_EXCEPTION);
-    Element* s13 = shadowRoot->querySelector("#s13", ASSERT_NO_EXCEPTION);
-    Element* s14 = shadowRoot->querySelector("#s14", ASSERT_NO_EXCEPTION);
+    Element* s10 = shadowRoot->querySelector("#s10");
+    Element* s11 = shadowRoot->querySelector("#s11");
+    Element* s12 = shadowRoot->querySelector("#s12");
+    Element* s13 = shadowRoot->querySelector("#s13");
+    Element* s14 = shadowRoot->querySelector("#s14");
 
     testCommonAncestor(body, *m0, *m1);
     testCommonAncestor(body, *m1, *m2);
@@ -262,17 +262,17 @@
     setupSampleHTML(mainHTML, shadowHTML, 1);
 
     Element* body = document().body();
-    Element* m0 = body->querySelector("#m0", ASSERT_NO_EXCEPTION);
-    Element* m1 = body->querySelector("#m1", ASSERT_NO_EXCEPTION);
-    Element* m2 = body->querySelector("#m2", ASSERT_NO_EXCEPTION);
+    Element* m0 = body->querySelector("#m0");
+    Element* m1 = body->querySelector("#m1");
+    Element* m2 = body->querySelector("#m2");
 
-    Element* m10 = body->querySelector("#m10", ASSERT_NO_EXCEPTION);
-    Element* m11 = body->querySelector("#m11", ASSERT_NO_EXCEPTION);
+    Element* m10 = body->querySelector("#m10");
+    Element* m11 = body->querySelector("#m11");
 
     ShadowRoot* shadowRoot = m1->openShadowRoot();
-    Element* s11 = shadowRoot->querySelector("#s11", ASSERT_NO_EXCEPTION);
-    Element* s12 = shadowRoot->querySelector("#s12", ASSERT_NO_EXCEPTION);
-    Element* s120 = shadowRoot->querySelector("#s120", ASSERT_NO_EXCEPTION);
+    Element* s11 = shadowRoot->querySelector("#s11");
+    Element* s12 = shadowRoot->querySelector("#s12");
+    Element* s120 = shadowRoot->querySelector("#s120");
 
     // Main tree node to main tree node
     EXPECT_EQ(*m1, FlatTreeTraversal::nextSkippingChildren(*m0));
@@ -320,15 +320,15 @@
     setupSampleHTML(mainHTML, shadowHTML, 1);
 
     Element* body = document().body();
-    Element* m0 = body->querySelector("#m0", ASSERT_NO_EXCEPTION);
-    Element* m1 = body->querySelector("#m1", ASSERT_NO_EXCEPTION);
-    Element* m2 = body->querySelector("#m2", ASSERT_NO_EXCEPTION);
+    Element* m0 = body->querySelector("#m0");
+    Element* m1 = body->querySelector("#m1");
+    Element* m2 = body->querySelector("#m2");
 
-    Element* m10 = body->querySelector("#m10", ASSERT_NO_EXCEPTION);
+    Element* m10 = body->querySelector("#m10");
 
     ShadowRoot* shadowRoot = m1->openShadowRoot();
-    Element* s11 = shadowRoot->querySelector("#s11", ASSERT_NO_EXCEPTION);
-    Element* s12 = shadowRoot->querySelector("#s12", ASSERT_NO_EXCEPTION);
+    Element* s11 = shadowRoot->querySelector("#s11");
+    Element* s12 = shadowRoot->querySelector("#s12");
 
     EXPECT_EQ(m0->firstChild(), FlatTreeTraversal::lastWithin(*m0));
     EXPECT_EQ(*m0->firstChild(), FlatTreeTraversal::lastWithinOrSelf(*m0));
@@ -365,17 +365,17 @@
     setupSampleHTML(mainHTML, shadowHTML, 1);
 
     Element* body = document().body();
-    Element* m0 = body->querySelector("#m0", ASSERT_NO_EXCEPTION);
-    Element* m1 = body->querySelector("#m1", ASSERT_NO_EXCEPTION);
-    Element* m2 = body->querySelector("#m2", ASSERT_NO_EXCEPTION);
+    Element* m0 = body->querySelector("#m0");
+    Element* m1 = body->querySelector("#m1");
+    Element* m2 = body->querySelector("#m2");
 
-    Element* m10 = body->querySelector("#m10", ASSERT_NO_EXCEPTION);
-    Element* m11 = body->querySelector("#m11", ASSERT_NO_EXCEPTION);
+    Element* m10 = body->querySelector("#m10");
+    Element* m11 = body->querySelector("#m11");
 
     ShadowRoot* shadowRoot = m1->openShadowRoot();
-    Element* s11 = shadowRoot->querySelector("#s11", ASSERT_NO_EXCEPTION);
-    Element* s12 = shadowRoot->querySelector("#s12", ASSERT_NO_EXCEPTION);
-    Element* s120 = shadowRoot->querySelector("#s120", ASSERT_NO_EXCEPTION);
+    Element* s11 = shadowRoot->querySelector("#s11");
+    Element* s12 = shadowRoot->querySelector("#s12");
+    Element* s120 = shadowRoot->querySelector("#s120");
 
     EXPECT_EQ(*m0->firstChild(), FlatTreeTraversal::previousPostOrder(*m0));
     EXPECT_EQ(*s12, FlatTreeTraversal::previousPostOrder(*m1));
@@ -408,7 +408,7 @@
     setupSampleHTML(mainHTML, shadowHTML, 1);
 
     Element* body = document().body();
-    Element* m10 = body->querySelector("#m10", ASSERT_NO_EXCEPTION);
+    Element* m10 = body->querySelector("#m10");
 
     EXPECT_EQ(nullptr, FlatTreeTraversal::nextSibling(*m10));
     EXPECT_EQ(nullptr, FlatTreeTraversal::previousSibling(*m10));
@@ -437,23 +437,23 @@
         "</div>";
 
     Element* body = document().body();
-    Element* m1 = body->querySelector("#m1", ASSERT_NO_EXCEPTION);
-    Element* m10 = body->querySelector("#m10", ASSERT_NO_EXCEPTION);
+    Element* m1 = body->querySelector("#m1");
+    Element* m10 = body->querySelector("#m10");
 
     ShadowRoot* shadowRoot1 = m1->openShadowRoot();
-    Element* s1 = shadowRoot1->querySelector("#s1", ASSERT_NO_EXCEPTION);
+    Element* s1 = shadowRoot1->querySelector("#s1");
 
     attachV0ShadowRoot(*s1, shadowHTML2);
 
     ShadowRoot* shadowRoot2 = s1->openShadowRoot();
-    Element* s21 = shadowRoot2->querySelector("#s21", ASSERT_NO_EXCEPTION);
+    Element* s21 = shadowRoot2->querySelector("#s21");
 
     EXPECT_EQ(s21, FlatTreeTraversal::nextSibling(*m10));
     EXPECT_EQ(m10, FlatTreeTraversal::previousSibling(*s21));
 
     // FlatTreeTraversal::traverseSiblings does not work for a node which is not in a document flat tree.
     // e.g. The following test fails. The result of FlatTreeTraversal::previousSibling(*m11)) will be #m10, instead of nullptr.
-    // Element* m11 = body->querySelector("#m11", ASSERT_NO_EXCEPTION);
+    // Element* m11 = body->querySelector("#m11");
     // EXPECT_EQ(nullptr, FlatTreeTraversal::previousSibling(*m11));
 }
 
@@ -472,16 +472,16 @@
 
     setupDocumentTree(mainHTML);
     Element* body = document().body();
-    Element* host = body->querySelector("#host", ASSERT_NO_EXCEPTION);
-    Element* child1 = body->querySelector("#child1", ASSERT_NO_EXCEPTION);
-    Element* child2 = body->querySelector("#child2", ASSERT_NO_EXCEPTION);
+    Element* host = body->querySelector("#host");
+    Element* child1 = body->querySelector("#child1");
+    Element* child2 = body->querySelector("#child2");
 
     attachOpenShadowRoot(*host, shadowHTML);
     ShadowRoot* shadowRoot = host->openShadowRoot();
-    Element* slot1 = shadowRoot->querySelector("[name=slot1]", ASSERT_NO_EXCEPTION);
-    Element* slot2 = shadowRoot->querySelector("[name=slot2]", ASSERT_NO_EXCEPTION);
-    Element* shadowChild1 = shadowRoot->querySelector("#shadow-child1", ASSERT_NO_EXCEPTION);
-    Element* shadowChild2 = shadowRoot->querySelector("#shadow-child2", ASSERT_NO_EXCEPTION);
+    Element* slot1 = shadowRoot->querySelector("[name=slot1]");
+    Element* slot2 = shadowRoot->querySelector("[name=slot2]");
+    Element* shadowChild1 = shadowRoot->querySelector("#shadow-child1");
+    Element* shadowChild2 = shadowRoot->querySelector("#shadow-child2");
 
     EXPECT_TRUE(slot1);
     EXPECT_TRUE(slot2);
@@ -519,29 +519,29 @@
     setupDocumentTree(mainHTML);
 
     Element* body = document().body();
-    Element* d1 = body->querySelector("#d1", ASSERT_NO_EXCEPTION);
-    Element* d2 = body->querySelector("#d2", ASSERT_NO_EXCEPTION);
-    Element* d3 = body->querySelector("#d3", ASSERT_NO_EXCEPTION);
-    Element* d4 = body->querySelector("#d4", ASSERT_NO_EXCEPTION);
-    Element* d5 = body->querySelector("#d5", ASSERT_NO_EXCEPTION);
-    Element* d6 = body->querySelector("#d6", ASSERT_NO_EXCEPTION);
+    Element* d1 = body->querySelector("#d1");
+    Element* d2 = body->querySelector("#d2");
+    Element* d3 = body->querySelector("#d3");
+    Element* d4 = body->querySelector("#d4");
+    Element* d5 = body->querySelector("#d5");
+    Element* d6 = body->querySelector("#d6");
 
     attachOpenShadowRoot(*d1, shadowHTML1);
     ShadowRoot* shadowRoot1 = d1->openShadowRoot();
-    Element* d11 = shadowRoot1->querySelector("#d1-1", ASSERT_NO_EXCEPTION);
-    Element* d12 = shadowRoot1->querySelector("#d1-2", ASSERT_NO_EXCEPTION);
-    Element* d13 = shadowRoot1->querySelector("#d1-3", ASSERT_NO_EXCEPTION);
-    Element* d14 = shadowRoot1->querySelector("#d1-4", ASSERT_NO_EXCEPTION);
-    Element* d1s0 = shadowRoot1->querySelector("#d1-s0", ASSERT_NO_EXCEPTION);
-    Element* d1s1 = shadowRoot1->querySelector("[name=d1-s1]", ASSERT_NO_EXCEPTION);
-    Element* d1s2 = shadowRoot1->querySelector("[name=d1-s2]", ASSERT_NO_EXCEPTION);
+    Element* d11 = shadowRoot1->querySelector("#d1-1");
+    Element* d12 = shadowRoot1->querySelector("#d1-2");
+    Element* d13 = shadowRoot1->querySelector("#d1-3");
+    Element* d14 = shadowRoot1->querySelector("#d1-4");
+    Element* d1s0 = shadowRoot1->querySelector("#d1-s0");
+    Element* d1s1 = shadowRoot1->querySelector("[name=d1-s1]");
+    Element* d1s2 = shadowRoot1->querySelector("[name=d1-s2]");
 
     attachOpenShadowRoot(*d11, shadowHTML2);
     ShadowRoot* shadowRoot2 = d11->openShadowRoot();
-    Element* d111 = shadowRoot2->querySelector("#d1-1-1", ASSERT_NO_EXCEPTION);
-    Element* d112 = shadowRoot2->querySelector("#d1-1-2", ASSERT_NO_EXCEPTION);
-    Element* d11s1 = shadowRoot2->querySelector("[name=d1-1-s1]", ASSERT_NO_EXCEPTION);
-    Element* d11s2 = shadowRoot2->querySelector("[name=d1-1-s2]", ASSERT_NO_EXCEPTION);
+    Element* d111 = shadowRoot2->querySelector("#d1-1-1");
+    Element* d112 = shadowRoot2->querySelector("#d1-1-2");
+    Element* d11s1 = shadowRoot2->querySelector("[name=d1-1-s1]");
+    Element* d11s2 = shadowRoot2->querySelector("[name=d1-1-s2]");
 
     EXPECT_TRUE(d5);
     EXPECT_TRUE(d12);
diff --git a/third_party/WebKit/Source/core/editing/EditingUtilities.cpp b/third_party/WebKit/Source/core/editing/EditingUtilities.cpp
index f49d88f..7427559 100644
--- a/third_party/WebKit/Source/core/editing/EditingUtilities.cpp
+++ b/third_party/WebKit/Source/core/editing/EditingUtilities.cpp
@@ -255,6 +255,114 @@
     return comparePositions(a.deepEquivalent(), b.deepEquivalent());
 }
 
+enum EditableLevel { Editable, RichlyEditable };
+static bool hasEditableStyle(const Node& node, EditableLevel editableLevel)
+{
+    if (node.isPseudoElement())
+        return false;
+
+    // Ideally we'd call DCHECK(!needsStyleRecalc()) here, but
+    // ContainerNode::setFocus() calls setNeedsStyleRecalc(), so the assertion
+    // would fire in the middle of Document::setFocusedNode().
+
+    for (const Node& ancestor : NodeTraversal::inclusiveAncestorsOf(node)) {
+        if ((ancestor.isHTMLElement() || ancestor.isDocumentNode()) && ancestor.layoutObject()) {
+            switch (ancestor.layoutObject()->style()->userModify()) {
+            case READ_ONLY:
+                return false;
+            case READ_WRITE:
+                return true;
+            case READ_WRITE_PLAINTEXT_ONLY:
+                return editableLevel != RichlyEditable;
+            }
+            NOTREACHED();
+            return false;
+        }
+    }
+
+    return false;
+}
+
+static bool isEditableToAccessibility(const Node& node, EditableLevel editableLevel)
+{
+    if (blink::hasEditableStyle(node, editableLevel))
+        return true;
+
+    // FIXME: Respect editableLevel for ARIA editable elements.
+    if (editableLevel == RichlyEditable)
+        return false;
+
+    // FIXME(dmazzoni): support ScopedAXObjectCache (crbug/489851).
+    if (AXObjectCache* cache = node.document().existingAXObjectCache())
+        return cache->rootAXEditableElement(&node);
+
+    return false;
+}
+
+bool isContentEditable(const Node& node)
+{
+    node.document().updateStyleAndLayoutTree();
+    return blink::hasEditableStyle(node, Editable);
+}
+
+bool isContentRichlyEditable(const Node& node)
+{
+    node.document().updateStyleAndLayoutTree();
+    return blink::hasEditableStyle(node, RichlyEditable);
+}
+
+bool hasEditableStyle(const Node& node, EditableType editableType)
+{
+    switch (editableType) {
+    case ContentIsEditable:
+        return blink::hasEditableStyle(node, Editable);
+    case HasEditableAXRole:
+        return isEditableToAccessibility(node, Editable);
+    }
+    NOTREACHED();
+    return false;
+}
+
+bool layoutObjectIsRichlyEditable(const Node& node, EditableType editableType)
+{
+    switch (editableType) {
+    case ContentIsEditable:
+        return blink::hasEditableStyle(node, RichlyEditable);
+    case HasEditableAXRole:
+        return isEditableToAccessibility(node, RichlyEditable);
+    }
+    NOTREACHED();
+    return false;
+}
+
+bool isRootEditableElement(const Node& node)
+{
+    return hasEditableStyle(node) && node.isElementNode() && (!node.parentNode() || !hasEditableStyle(*node.parentNode())
+        || !node.parentNode()->isElementNode() || &node == node.document().body());
+}
+
+Element* rootEditableElement(const Node& node)
+{
+    const Node* result = nullptr;
+    for (const Node* n = &node; n && hasEditableStyle(*n); n = n->parentNode()) {
+        if (n->isElementNode())
+            result = n;
+        if (node.document().body() == n)
+            break;
+    }
+    return toElement(const_cast<Node*>(result));
+}
+
+Element* rootEditableElement(const Node& node, EditableType editableType)
+{
+    if (editableType == HasEditableAXRole) {
+        if (AXObjectCache* cache = node.document().existingAXObjectCache())
+            return const_cast<Element*>(cache->rootAXEditableElement(&node));
+    }
+
+    return rootEditableElement(node);
+}
+
 ContainerNode* highestEditableRoot(const Position& position, EditableType editableType)
 {
     if (position.isNull())
diff --git a/third_party/WebKit/Source/core/editing/EditingUtilities.h b/third_party/WebKit/Source/core/editing/EditingUtilities.h
index c3cee9a..558b274 100644
--- a/third_party/WebKit/Source/core/editing/EditingUtilities.h
+++ b/third_party/WebKit/Source/core/editing/EditingUtilities.h
@@ -72,8 +72,13 @@
 // Node
 // -------------------------------------------------------------------------
 
-// Functions returning Node
-
+CORE_EXPORT bool isContentEditable(const Node&);
+CORE_EXPORT bool isContentRichlyEditable(const Node&);
+CORE_EXPORT bool hasEditableStyle(const Node&, EditableType = ContentIsEditable);
+CORE_EXPORT bool layoutObjectIsRichlyEditable(const Node&, EditableType = ContentIsEditable);
+CORE_EXPORT bool isRootEditableElement(const Node&);
+CORE_EXPORT Element* rootEditableElement(const Node&);
+CORE_EXPORT Element* rootEditableElement(const Node&, EditableType);
 // highestEditableRoot returns the highest editable node. If the
 // rootEditableElement of the speicified Position is <body>, this returns the
 // <body>. Otherwise, this searches ancestors for the highest editable node in
diff --git a/third_party/WebKit/Source/core/editing/RelocatablePositionTest.cpp b/third_party/WebKit/Source/core/editing/RelocatablePositionTest.cpp
index 1867604..2d79b44 100644
--- a/third_party/WebKit/Source/core/editing/RelocatablePositionTest.cpp
+++ b/third_party/WebKit/Source/core/editing/RelocatablePositionTest.cpp
@@ -15,8 +15,8 @@
 TEST_F(RelocatablePositionTest, position)
 {
     setBodyContent("<b>foo</b><textarea>bar</textarea>");
-    Node* boldface = document().querySelector("b", ASSERT_NO_EXCEPTION);
-    Node* textarea = document().querySelector("textarea", ASSERT_NO_EXCEPTION);
+    Node* boldface = document().querySelector("b");
+    Node* textarea = document().querySelector("textarea");
 
     RelocatablePosition relocatablePosition(Position(textarea, PositionAnchorType::BeforeAnchor));
     textarea->remove();
diff --git a/third_party/WebKit/Source/core/editing/VisiblePositionTest.cpp b/third_party/WebKit/Source/core/editing/VisiblePositionTest.cpp
index efd576e2..2b1baab6 100644
--- a/third_party/WebKit/Source/core/editing/VisiblePositionTest.cpp
+++ b/third_party/WebKit/Source/core/editing/VisiblePositionTest.cpp
@@ -20,10 +20,10 @@
     ShadowRoot* shadowRoot = setShadowContent(shadowContent, "host");
 
     Element* body = document().body();
-    Element* one = body->querySelector("#one", ASSERT_NO_EXCEPTION);
-    Element* two = body->querySelector("#two", ASSERT_NO_EXCEPTION);
-    Element* four = shadowRoot->querySelector("#s4", ASSERT_NO_EXCEPTION);
-    Element* five = shadowRoot->querySelector("#s5", ASSERT_NO_EXCEPTION);
+    Element* one = body->querySelector("#one");
+    Element* two = body->querySelector("#two");
+    Element* four = shadowRoot->querySelector("#s4");
+    Element* five = shadowRoot->querySelector("#s5");
 
     EXPECT_EQ(Position(one->firstChild(), 0), canonicalPositionOf(Position(one, 0)));
     EXPECT_EQ(Position(one->firstChild(), 0), createVisiblePosition(Position(one, 0)).deepEquivalent());
diff --git a/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp b/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp
index 8d762b26..e7ef15b 100644
--- a/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp
+++ b/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp
@@ -174,9 +174,9 @@
     ShadowRoot* shadowRoot = setShadowContent(shadowContent, "host");
 
     Element* body = document().body();
-    Element* host = body->querySelector("#host", ASSERT_NO_EXCEPTION);
-    Element* one = body->querySelector("#one", ASSERT_NO_EXCEPTION);
-    Element* six = shadowRoot->querySelector("#s6", ASSERT_NO_EXCEPTION);
+    Element* host = body->querySelector("#host");
+    Element* one = body->querySelector("#one");
+    Element* six = shadowRoot->querySelector("#s6");
 
     VisibleSelection selection(Position::firstPositionInNode(one), Position::lastPositionInNode(shadowRoot));
     VisibleSelectionInFlatTree selectionInFlatTree(PositionInFlatTree::firstPositionInNode(one), PositionInFlatTree::lastPositionInNode(host));
@@ -195,9 +195,9 @@
     ShadowRoot* shadowRoot = setShadowContent(shadowContent, "host");
 
     Element* body = document().body();
-    Element* one = body->querySelector("#one", ASSERT_NO_EXCEPTION);
-    Element* two = body->querySelector("#two", ASSERT_NO_EXCEPTION);
-    Element* five = shadowRoot->querySelector("#s5", ASSERT_NO_EXCEPTION);
+    Element* one = body->querySelector("#one");
+    Element* two = body->querySelector("#two");
+    Element* five = shadowRoot->querySelector("#s5");
 
     VisibleSelection selection(Position::firstPositionInNode(one), Position::lastPositionInNode(two));
     VisibleSelectionInFlatTree selectionInFlatTree(PositionInFlatTree::firstPositionInNode(one), PositionInFlatTree::lastPositionInNode(two));
@@ -226,9 +226,9 @@
     //    <span id="s6">66</span>
     //  </p>
     Element* body = document().body();
-    Element* host = body->querySelector("#host", ASSERT_NO_EXCEPTION);
-    Element* one = body->querySelector("#one", ASSERT_NO_EXCEPTION);
-    Element* eight = shadowRoot2->querySelector("#s8", ASSERT_NO_EXCEPTION);
+    Element* host = body->querySelector("#host");
+    Element* one = body->querySelector("#one");
+    Element* eight = shadowRoot2->querySelector("#s8");
 
     VisibleSelection selection(Position::firstPositionInNode(one), Position::lastPositionInNode(shadowRoot2));
     VisibleSelectionInFlatTree selectionInFlatTree(PositionInFlatTree::firstPositionInNode(one), PositionInFlatTree::afterNode(eight));
diff --git a/third_party/WebKit/Source/core/editing/VisibleUnits.cpp b/third_party/WebKit/Source/core/editing/VisibleUnits.cpp
index 0eed227..397bfe1 100644
--- a/third_party/WebKit/Source/core/editing/VisibleUnits.cpp
+++ b/third_party/WebKit/Source/core/editing/VisibleUnits.cpp
@@ -1567,80 +1567,84 @@
 }
 
 template <typename Strategy>
-static VisiblePositionTemplate<Strategy> endOfParagraphAlgorithm(const VisiblePositionTemplate<Strategy>& c, EditingBoundaryCrossingRule boundaryCrossingRule)
+static PositionTemplate<Strategy> endOfParagraphAlgorithm(const PositionTemplate<Strategy>& position, EditingBoundaryCrossingRule boundaryCrossingRule)
 {
-    if (c.isNull())
-        return VisiblePositionTemplate<Strategy>();
+    Node* const startNode = position.anchorNode();
 
-    const PositionTemplate<Strategy> p = c.deepEquivalent();
-    Node* startNode = p.anchorNode();
+    if (!startNode)
+        return PositionTemplate<Strategy>();
 
     if (isRenderedAsNonInlineTableImageOrHR(startNode))
-        return createVisiblePosition(PositionTemplate<Strategy>::afterNode(startNode));
+        return PositionTemplate<Strategy>::afterNode(startNode);
 
-    Element* startBlock = enclosingBlock(PositionTemplate<Strategy>::firstPositionInOrBeforeNode(startNode), CannotCrossEditingBoundary);
-    Element* stayInsideBlock = startBlock;
+    Element* const startBlock = enclosingBlock(PositionTemplate<Strategy>::firstPositionInOrBeforeNode(startNode), CannotCrossEditingBoundary);
+    ContainerNode* const highestRoot = highestEditableRoot(position);
+    const bool startNodeIsEditable = hasEditableStyle(*startNode);
 
-    Node* node = startNode;
-    ContainerNode* highestRoot = highestEditableRoot(p);
-    int offset = p.computeEditingOffset();
-    PositionAnchorType type = p.anchorType();
+    Node* candidateNode = startNode;
+    PositionAnchorType candidateType = position.anchorType();
+    int candidateOffset = position.computeEditingOffset();
 
-    Node* n = startNode;
-    bool startNodeIsEditable = hasEditableStyle(*startNode);
-    while (n) {
-        if (boundaryCrossingRule == CannotCrossEditingBoundary && !nodeIsUserSelectAll(n) && hasEditableStyle(*n) != startNodeIsEditable)
+    Node* nextNodeItreator = startNode;
+    while (nextNodeItreator) {
+        if (boundaryCrossingRule == CannotCrossEditingBoundary && !nodeIsUserSelectAll(nextNodeItreator) && hasEditableStyle(*nextNodeItreator) != startNodeIsEditable)
             break;
         if (boundaryCrossingRule == CanSkipOverEditingBoundary) {
-            while (n && hasEditableStyle(*n) != startNodeIsEditable)
-                n = Strategy::next(*n, stayInsideBlock);
-            if (!n || !n->isDescendantOf(highestRoot))
+            while (nextNodeItreator && hasEditableStyle(*nextNodeItreator) != startNodeIsEditable)
+                nextNodeItreator = Strategy::next(*nextNodeItreator, startBlock);
+            if (!nextNodeItreator || !nextNodeItreator->isDescendantOf(highestRoot))
                 break;
         }
 
-        LayoutObject* r = n->layoutObject();
-        if (!r) {
-            n = Strategy::next(*n, stayInsideBlock);
+        LayoutObject* const layoutObject = nextNodeItreator->layoutObject();
+        if (!layoutObject) {
+            nextNodeItreator = Strategy::next(*nextNodeItreator, startBlock);
             continue;
         }
-        const ComputedStyle& style = r->styleRef();
+        const ComputedStyle& style = layoutObject->styleRef();
         if (style.visibility() != VISIBLE) {
-            n = Strategy::next(*n, stayInsideBlock);
+            nextNodeItreator = Strategy::next(*nextNodeItreator, startBlock);
             continue;
         }
 
-        if (r->isBR() || isEnclosingBlock(n))
+        if (layoutObject->isBR() || isEnclosingBlock(nextNodeItreator))
             break;
 
         // FIXME: We avoid returning a position where the layoutObject can't accept the caret.
-        if (r->isText() && toLayoutText(r)->resolvedTextLength()) {
-            ASSERT_WITH_SECURITY_IMPLICATION(n->isTextNode());
-            int length = toLayoutText(r)->textLength();
-            type = PositionAnchorType::OffsetInAnchor;
-            LayoutText* text = toLayoutText(r);
+        if (layoutObject->isText() && toLayoutText(layoutObject)->resolvedTextLength()) {
+            SECURITY_DCHECK(nextNodeItreator->isTextNode());
+            LayoutText* const text = toLayoutText(layoutObject);
             if (style.preserveNewline()) {
-                int o = n == startNode ? offset : 0;
-                for (int i = o; i < length; ++i) {
+                const int length = toLayoutText(layoutObject)->textLength();
+                for (int i = (nextNodeItreator == startNode ? candidateOffset : 0); i < length; ++i) {
                     if ((*text)[i] == '\n')
-                        return createVisiblePosition(PositionTemplate<Strategy>(toText(n), i + text->textStartOffset()));
+                        return PositionTemplate<Strategy>(toText(nextNodeItreator), i + text->textStartOffset());
                 }
             }
-            node = n;
-            offset = r->caretMaxOffset() + text->textStartOffset();
-            n = Strategy::next(*n, stayInsideBlock);
-        } else if (Strategy::editingIgnoresContent(n) || isDisplayInsideTable(n)) {
-            node = n;
-            type = PositionAnchorType::AfterAnchor;
-            n = Strategy::nextSkippingChildren(*n, stayInsideBlock);
+
+            candidateNode = nextNodeItreator;
+            candidateType = PositionAnchorType::OffsetInAnchor;
+            candidateOffset = layoutObject->caretMaxOffset() + text->textStartOffset();
+            nextNodeItreator = Strategy::next(*nextNodeItreator, startBlock);
+        } else if (Strategy::editingIgnoresContent(nextNodeItreator) || isDisplayInsideTable(nextNodeItreator)) {
+            candidateNode = nextNodeItreator;
+            candidateType = PositionAnchorType::AfterAnchor;
+            nextNodeItreator = Strategy::nextSkippingChildren(*nextNodeItreator, startBlock);
         } else {
-            n = Strategy::next(*n, stayInsideBlock);
+            nextNodeItreator = Strategy::next(*nextNodeItreator, startBlock);
         }
     }
 
-    if (type == PositionAnchorType::OffsetInAnchor)
-        return createVisiblePosition(PositionTemplate<Strategy>(node, offset));
+    if (candidateType == PositionAnchorType::OffsetInAnchor)
+        return PositionTemplate<Strategy>(candidateNode, candidateOffset);
 
-    return createVisiblePosition(PositionTemplate<Strategy>(node, type));
+    return PositionTemplate<Strategy>(candidateNode, candidateType);
+}
+
+template <typename Strategy>
+static VisiblePositionTemplate<Strategy> endOfParagraphAlgorithm(const VisiblePositionTemplate<Strategy>& visiblePosition, EditingBoundaryCrossingRule boundaryCrossingRule)
+{
+    return createVisiblePosition(endOfParagraphAlgorithm(visiblePosition.deepEquivalent(), boundaryCrossingRule));
 }
 
 VisiblePosition endOfParagraph(const VisiblePosition& c, EditingBoundaryCrossingRule boundaryCrossingRule)
diff --git a/third_party/WebKit/Source/core/editing/VisibleUnitsTest.cpp b/third_party/WebKit/Source/core/editing/VisibleUnitsTest.cpp
index 4ffe01b..c8b50f6 100644
--- a/third_party/WebKit/Source/core/editing/VisibleUnitsTest.cpp
+++ b/third_party/WebKit/Source/core/editing/VisibleUnitsTest.cpp
@@ -56,7 +56,7 @@
     setShadowContent(shadowContent, "host");
 
     Element* body = document().body();
-    Element* one = body->querySelector("#one", ASSERT_NO_EXCEPTION);
+    Element* one = body->querySelector("#one");
 
     IntRect boundsInDOMTree = absoluteCaretBoundsOf(createVisiblePosition(Position(one, 0)));
     IntRect boundsInFlatTree = absoluteCaretBoundsOf(createVisiblePosition(PositionInFlatTree(one, 0)));
@@ -164,10 +164,10 @@
     const char* bodyContent = "<html><div id=one contenteditable>1</div><span id=two contenteditable=false>22</span><span id=three contenteditable=false>333</span><span id=four contenteditable=false>333</span></html>";
     setBodyContent(bodyContent);
 
-    Node* one = document().querySelector("#one", ASSERT_NO_EXCEPTION);
-    Node* two = document().querySelector("#two", ASSERT_NO_EXCEPTION);
-    Node* three = document().querySelector("#three", ASSERT_NO_EXCEPTION);
-    Node* four = document().querySelector("#four", ASSERT_NO_EXCEPTION);
+    Node* one = document().querySelector("#one");
+    Node* two = document().querySelector("#two");
+    Node* three = document().querySelector("#three");
+    Node* four = document().querySelector("#four");
     Element* html = document().createElement("html", ASSERT_NO_EXCEPTION);
     // Move two, three and four into second html element.
     html->appendChild(two);
@@ -579,10 +579,10 @@
     ShadowRoot* shadowRoot = setShadowContent(shadowContent, "host");
 
     Element* body = document().body();
-    Element* one = body->querySelector("#one", ASSERT_NO_EXCEPTION);
-    Element* two = body->querySelector("#two", ASSERT_NO_EXCEPTION);
-    Element* four = shadowRoot->querySelector("#s4", ASSERT_NO_EXCEPTION);
-    Element* five = shadowRoot->querySelector("#s5", ASSERT_NO_EXCEPTION);
+    Element* one = body->querySelector("#one");
+    Element* two = body->querySelector("#two");
+    Element* four = shadowRoot->querySelector("#s4");
+    Element* five = shadowRoot->querySelector("#s5");
 
     EXPECT_TRUE(inSameLine(positionWithAffinityInDOMTree(*one, 0), positionWithAffinityInDOMTree(*two, 0)));
     EXPECT_TRUE(inSameLine(positionWithAffinityInDOMTree(*one->firstChild(), 0), positionWithAffinityInDOMTree(*two->firstChild(), 0)));
@@ -705,10 +705,10 @@
     const char* bodyContent = "<html><div id=one contenteditable>1</div><span id=two contenteditable=false>22</span><span id=three contenteditable=false>333</span><span id=four contenteditable=false>333</span></html>";
     setBodyContent(bodyContent);
 
-    Node* one = document().querySelector("#one", ASSERT_NO_EXCEPTION);
-    Node* two = document().querySelector("#two", ASSERT_NO_EXCEPTION);
-    Node* three = document().querySelector("#three", ASSERT_NO_EXCEPTION);
-    Node* four = document().querySelector("#four", ASSERT_NO_EXCEPTION);
+    Node* one = document().querySelector("#one");
+    Node* two = document().querySelector("#two");
+    Node* three = document().querySelector("#three");
+    Node* four = document().querySelector("#four");
     Element* html = document().createElement("html", ASSERT_NO_EXCEPTION);
     // Move two, three and four into second html element.
     html->appendChild(two);
@@ -1307,7 +1307,7 @@
     const char* bodyContent = "<button> </button><script>document.designMode = 'on'</script>";
     setBodyContent(bodyContent);
 
-    Node* button = document().querySelector("button", ASSERT_NO_EXCEPTION);
+    Node* button = document().querySelector("button");
     EXPECT_TRUE(endsOfNodeAreVisuallyDistinctPositions(button));
 }
 
@@ -1317,7 +1317,7 @@
     const char* bodyContent = "<button><rt><script>document.designMode = 'on'</script></rt></button>";
     setBodyContent(bodyContent);
 
-    Node* button = document().querySelector("button", ASSERT_NO_EXCEPTION);
+    Node* button = document().querySelector("button");
     EXPECT_TRUE(endsOfNodeAreVisuallyDistinctPositions(button));
 }
 
diff --git a/third_party/WebKit/Source/core/editing/commands/AppendNodeCommand.cpp b/third_party/WebKit/Source/core/editing/commands/AppendNodeCommand.cpp
index f9a4d83..b2c17e0 100644
--- a/third_party/WebKit/Source/core/editing/commands/AppendNodeCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/AppendNodeCommand.cpp
@@ -26,6 +26,7 @@
 #include "core/editing/commands/AppendNodeCommand.h"
 
 #include "bindings/core/v8/ExceptionState.h"
+#include "core/editing/EditingUtilities.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/editing/commands/DeleteFromTextNodeCommand.cpp b/third_party/WebKit/Source/core/editing/commands/DeleteFromTextNodeCommand.cpp
index ca03d58e..1af396c 100644
--- a/third_party/WebKit/Source/core/editing/commands/DeleteFromTextNodeCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/DeleteFromTextNodeCommand.cpp
@@ -28,6 +28,7 @@
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
 #include "core/dom/Text.h"
+#include "core/editing/EditingUtilities.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/editing/commands/InsertIntoTextNodeCommand.cpp b/third_party/WebKit/Source/core/editing/commands/InsertIntoTextNodeCommand.cpp
index 9a95809..a745829 100644
--- a/third_party/WebKit/Source/core/editing/commands/InsertIntoTextNodeCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/InsertIntoTextNodeCommand.cpp
@@ -28,6 +28,7 @@
 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
 #include "core/dom/Document.h"
 #include "core/dom/Text.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/frame/Settings.h"
 #include "core/layout/LayoutText.h"
 
diff --git a/third_party/WebKit/Source/core/editing/commands/InsertNodeBeforeCommand.cpp b/third_party/WebKit/Source/core/editing/commands/InsertNodeBeforeCommand.cpp
index 7032c65..303327d 100644
--- a/third_party/WebKit/Source/core/editing/commands/InsertNodeBeforeCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/InsertNodeBeforeCommand.cpp
@@ -26,6 +26,7 @@
 #include "core/editing/commands/InsertNodeBeforeCommand.h"
 
 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
+#include "core/editing/EditingUtilities.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/editing/commands/MergeIdenticalElementsCommand.cpp b/third_party/WebKit/Source/core/editing/commands/MergeIdenticalElementsCommand.cpp
index 3b1719d..87475b61 100644
--- a/third_party/WebKit/Source/core/editing/commands/MergeIdenticalElementsCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/MergeIdenticalElementsCommand.cpp
@@ -28,6 +28,7 @@
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
 #include "core/dom/Element.h"
+#include "core/editing/EditingUtilities.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/editing/commands/RemoveNodeCommand.cpp b/third_party/WebKit/Source/core/editing/commands/RemoveNodeCommand.cpp
index 4898758..2bf2c67 100644
--- a/third_party/WebKit/Source/core/editing/commands/RemoveNodeCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/RemoveNodeCommand.cpp
@@ -27,6 +27,7 @@
 
 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
 #include "core/dom/Node.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/editing/commands/EditingState.h"
 #include "wtf/Assertions.h"
 
diff --git a/third_party/WebKit/Source/core/editing/commands/RemoveNodePreservingChildrenCommand.cpp b/third_party/WebKit/Source/core/editing/commands/RemoveNodePreservingChildrenCommand.cpp
index 25809843..63c736b 100644
--- a/third_party/WebKit/Source/core/editing/commands/RemoveNodePreservingChildrenCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/RemoveNodePreservingChildrenCommand.cpp
@@ -26,6 +26,7 @@
 #include "core/editing/commands/RemoveNodePreservingChildrenCommand.h"
 
 #include "core/dom/Node.h"
+#include "core/editing/EditingUtilities.h"
 #include "wtf/Assertions.h"
 
 namespace blink {
diff --git a/third_party/WebKit/Source/core/editing/commands/SplitElementCommand.cpp b/third_party/WebKit/Source/core/editing/commands/SplitElementCommand.cpp
index bc364945..ea4e40b 100644
--- a/third_party/WebKit/Source/core/editing/commands/SplitElementCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/SplitElementCommand.cpp
@@ -29,6 +29,7 @@
 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
 #include "core/HTMLNames.h"
 #include "core/dom/Element.h"
+#include "core/editing/EditingUtilities.h"
 #include "wtf/Assertions.h"
 
 namespace blink {
diff --git a/third_party/WebKit/Source/core/editing/commands/SplitTextNodeCommand.cpp b/third_party/WebKit/Source/core/editing/commands/SplitTextNodeCommand.cpp
index 00272e0..1ab27b44 100644
--- a/third_party/WebKit/Source/core/editing/commands/SplitTextNodeCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/SplitTextNodeCommand.cpp
@@ -29,6 +29,7 @@
 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
 #include "core/dom/Document.h"
 #include "core/dom/Text.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/editing/markers/DocumentMarkerController.h"
 #include "wtf/Assertions.h"
 
diff --git a/third_party/WebKit/Source/core/editing/commands/SplitTextNodeContainingElementCommand.cpp b/third_party/WebKit/Source/core/editing/commands/SplitTextNodeContainingElementCommand.cpp
index e299d36..4deb6ecf 100644
--- a/third_party/WebKit/Source/core/editing/commands/SplitTextNodeContainingElementCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/SplitTextNodeContainingElementCommand.cpp
@@ -27,6 +27,7 @@
 
 #include "core/dom/Element.h"
 #include "core/dom/Text.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/layout/LayoutObject.h"
 #include "wtf/Assertions.h"
 
diff --git a/third_party/WebKit/Source/core/editing/commands/WrapContentsInDummySpanCommand.cpp b/third_party/WebKit/Source/core/editing/commands/WrapContentsInDummySpanCommand.cpp
index df61ad00..8842c7a 100644
--- a/third_party/WebKit/Source/core/editing/commands/WrapContentsInDummySpanCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/WrapContentsInDummySpanCommand.cpp
@@ -26,6 +26,7 @@
 #include "core/editing/commands/WrapContentsInDummySpanCommand.h"
 
 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/editing/commands/ApplyStyleCommand.h"
 #include "core/html/HTMLSpanElement.h"
 
diff --git a/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckRequester.cpp b/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckRequester.cpp
index 57e4efe4..6b55a57 100644
--- a/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckRequester.cpp
+++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckRequester.cpp
@@ -27,6 +27,7 @@
 
 #include "core/dom/Document.h"
 #include "core/dom/Node.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/editing/markers/DocumentMarkerController.h"
 #include "core/editing/spellcheck/SpellChecker.h"
 #include "core/frame/LocalFrame.h"
diff --git a/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckerTest.cpp b/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckerTest.cpp
index 7955351..8306c954 100644
--- a/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckerTest.cpp
+++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellCheckerTest.cpp
@@ -18,7 +18,7 @@
 {
     setBodyContent("<input placeholder='placeholder'>abc");
     updateAllLifecyclePhases();
-    Element* input = document().querySelector("input", ASSERT_NO_EXCEPTION);
+    Element* input = document().querySelector("input");
     input->focus();
     document().settings()->setUnifiedTextCheckerEnabled(true);
     // Do not crash in AdvanceToNextMisspelling command.
diff --git a/third_party/WebKit/Source/core/events/EventTarget.cpp b/third_party/WebKit/Source/core/events/EventTarget.cpp
index e61dc73..cd8b30c 100644
--- a/third_party/WebKit/Source/core/events/EventTarget.cpp
+++ b/third_party/WebKit/Source/core/events/EventTarget.cpp
@@ -299,6 +299,10 @@
         if (LocalDOMWindow* executingWindow = this->executingWindow()) {
             UseCounter::count(executingWindow->document(), UseCounter::PointerEventAddListenerCount);
         }
+    } else if (eventType == EventTypeNames::slotchange) {
+        if (LocalDOMWindow* executingWindow = this->executingWindow()) {
+            UseCounter::count(executingWindow->document(), UseCounter::SlotChangeEventAddListener);
+        }
     }
 }
 
diff --git a/third_party/WebKit/Source/core/fetch/ImageResource.cpp b/third_party/WebKit/Source/core/fetch/ImageResource.cpp
index c08e465e..194fe542 100644
--- a/third_party/WebKit/Source/core/fetch/ImageResource.cpp
+++ b/third_party/WebKit/Source/core/fetch/ImageResource.cpp
@@ -375,7 +375,7 @@
     if (m_data)
         createImage();
 
-    bool sizeAvailable = false;
+    Image::SizeAvailability sizeAvailable = Image::SizeUnavailable;
 
     // Have the image update its data from its internal buffer.
     // It will not do anything now, but will delay decoding until
@@ -389,19 +389,20 @@
     // received all the data or the size is known. Each chunk from the
     // network causes observers to repaint, which will force that chunk
     // to decode.
-    if (sizeAvailable || allDataReceived) {
-        if (!m_image || m_image->isNull()) {
-            if (!errorOccurred())
-                setStatus(DecodeError);
-            clear();
-            if (memoryCache()->contains(this))
-                memoryCache()->remove(this);
-        }
-
-        // It would be nice to only redraw the decoded band of the image, but with the current design
-        // (decoding delayed until painting) that seems hard.
-        notifyObservers();
+    if (sizeAvailable == Image::SizeUnavailable && !allDataReceived)
+        return;
+    if (!m_image || m_image->isNull()) {
+        if (!errorOccurred())
+            setStatus(DecodeError);
+        if (!allDataReceived && m_loader)
+            m_loader->didFinishLoading(nullptr, monotonicallyIncreasingTime(), encodedSize());
+        clear();
+        memoryCache()->remove(this);
     }
+
+    // It would be nice to only redraw the decoded band of the image, but with the current design
+    // (decoding delayed until painting) that seems hard.
+    notifyObservers();
 }
 
 void ImageResource::updateImageAndClearBuffer()
diff --git a/third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp b/third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp
index 09937a62..f003e82 100644
--- a/third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp
+++ b/third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp
@@ -621,4 +621,20 @@
     EXPECT_TRUE(client2->notifyFinishedCalled());
 }
 
+TEST(ImageResourceTest, CancelOnDecodeError)
+{
+    KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html");
+    URLTestHelpers::registerMockedURLLoad(testURL, "cancelTest.html", "text/html");
+
+    ResourceFetcher* fetcher = ResourceFetcher::create(ImageResourceTestMockFetchContext::create());
+    FetchRequest request(testURL, FetchInitiatorInfo());
+    ImageResource* cachedImage = ImageResource::fetch(request, fetcher);
+    Platform::current()->getURLLoaderMockFactory()->unregisterURL(testURL);
+
+    cachedImage->loader()->didReceiveResponse(nullptr, WrappedResourceResponse(ResourceResponse(testURL, "image/jpeg", 18, nullAtom, String())), nullptr);
+    cachedImage->loader()->didReceiveData(nullptr, "notactuallyanimage", 18, 18, 18);
+    EXPECT_EQ(Resource::DecodeError, cachedImage->getStatus());
+    EXPECT_FALSE(cachedImage->isLoading());
+}
+
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/fetch/Resource.cpp b/third_party/WebKit/Source/core/fetch/Resource.cpp
index 56714095..3c0259df 100644
--- a/third_party/WebKit/Source/core/fetch/Resource.cpp
+++ b/third_party/WebKit/Source/core/fetch/Resource.cpp
@@ -397,7 +397,8 @@
     if (m_error.isCancellation() || !isPreloaded())
         memoryCache()->remove(this);
 
-    setStatus(LoadError);
+    if (!errorOccurred())
+        setStatus(LoadError);
     ASSERT(errorOccurred());
     m_data.clear();
     m_loader = nullptr;
diff --git a/third_party/WebKit/Source/core/frame/DOMWindow.cpp b/third_party/WebKit/Source/core/frame/DOMWindow.cpp
index 4e42da3..1c0aa092 100644
--- a/third_party/WebKit/Source/core/frame/DOMWindow.cpp
+++ b/third_party/WebKit/Source/core/frame/DOMWindow.cpp
@@ -103,10 +103,7 @@
 
 DOMWindow* DOMWindow::parent() const
 {
-    // TODO(yukishiino): The 'parent' attribute must return |this|
-    // (the WindowProxy object of the browsing context itself) when it's
-    // top-level or detached.
-    if (!isCurrentlyDisplayedInFrame())
+    if (!frame())
         return nullptr;
 
     Frame* parent = frame()->tree().parent();
@@ -115,10 +112,7 @@
 
 DOMWindow* DOMWindow::top() const
 {
-    // TODO(yukishiino): The 'top' attribute must return |this|
-    // (the WindowProxy object of the browsing context itself) when it's
-    // top-level or detached.
-    if (!isCurrentlyDisplayedInFrame())
+    if (!frame())
         return nullptr;
 
     return frame()->tree().top()->domWindow();
diff --git a/third_party/WebKit/Source/core/frame/ImageBitmap.cpp b/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
index d614506a..fcd05fb7 100644
--- a/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
+++ b/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
@@ -220,7 +220,8 @@
     RefPtr<SkImage> skiaImage = image->imageForCurrentFrame();
     // Attempt to get raw unpremultiplied image data, executed only when skiaImage is premultiplied.
     if ((((!parsedOptions.premultiplyAlpha && !skiaImage->isOpaque()) || !skiaImage) && image->data() && imageFormat == PremultiplyAlpha) || colorSpaceOp == ImageDecoder::GammaAndColorProfileIgnored) {
-        std::unique_ptr<ImageDecoder> decoder(ImageDecoder::create(*(image->data()),
+        std::unique_ptr<ImageDecoder> decoder(ImageDecoder::create(
+            ImageDecoder::determineImageType(*(image->data())),
             parsedOptions.premultiplyAlpha ? ImageDecoder::AlphaPremultiplied : ImageDecoder::AlphaNotPremultiplied,
             colorSpaceOp));
         if (!decoder)
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.h b/third_party/WebKit/Source/core/frame/UseCounter.h
index f7c528c..40f9c370 100644
--- a/third_party/WebKit/Source/core/frame/UseCounter.h
+++ b/third_party/WebKit/Source/core/frame/UseCounter.h
@@ -1269,6 +1269,7 @@
         VisualViewportScrollFired = 1465,
         VisualViewportResizeFired = 1466,
         NodeGetRootNode = 1467,
+        SlotChangeEventAddListener = 1468,
 
         // Add new features immediately above this line. Don't change assigned
         // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp b/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp
index 9e1f713b..f3d3de83 100644
--- a/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp
@@ -23,6 +23,7 @@
 
 #include "core/html/HTMLAnchorElement.h"
 
+#include "core/editing/EditingUtilities.h"
 #include "core/events/KeyboardEvent.h"
 #include "core/events/MouseEvent.h"
 #include "core/frame/FrameHost.h"
diff --git a/third_party/WebKit/Source/core/html/HTMLBodyElement.cpp b/third_party/WebKit/Source/core/html/HTMLBodyElement.cpp
index f3e9b8e..a69c782a 100644
--- a/third_party/WebKit/Source/core/html/HTMLBodyElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLBodyElement.cpp
@@ -31,6 +31,7 @@
 #include "core/css/parser/CSSParser.h"
 #include "core/dom/Attribute.h"
 #include "core/dom/StyleChangeReason.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/frame/LocalFrame.h"
 #include "core/html/HTMLFrameElementBase.h"
 #include "core/html/parser/HTMLParserIdioms.h"
diff --git a/third_party/WebKit/Source/core/html/HTMLElement.cpp b/third_party/WebKit/Source/core/html/HTMLElement.cpp
index c308e99e4..109e8b45a 100644
--- a/third_party/WebKit/Source/core/html/HTMLElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLElement.cpp
@@ -42,6 +42,7 @@
 #include "core/dom/shadow/ElementShadow.h"
 #include "core/dom/shadow/FlatTreeTraversal.h"
 #include "core/dom/shadow/ShadowRoot.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/editing/serializers/Serialization.h"
 #include "core/events/EventListener.h"
 #include "core/events/KeyboardEvent.h"
diff --git a/third_party/WebKit/Source/core/html/HTMLInputElement.cpp b/third_party/WebKit/Source/core/html/HTMLInputElement.cpp
index dd60325..46f57714 100644
--- a/third_party/WebKit/Source/core/html/HTMLInputElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLInputElement.cpp
@@ -1583,6 +1583,41 @@
     return false;
 }
 
+HeapVector<Member<HTMLOptionElement>> HTMLInputElement::filteredDataListOptions() const
+{
+    HeapVector<Member<HTMLOptionElement>> filtered;
+    HTMLDataListElement* dataList = this->dataList();
+    if (!dataList)
+        return filtered;
+
+    String value = innerEditorValue();
+    if (multiple() && type() == InputTypeNames::email) {
+        Vector<String> emails;
+        value.split(',', true, emails);
+        if (!emails.isEmpty())
+            value = emails.last().stripWhiteSpace();
+    }
+
+    HTMLDataListOptionsCollection* options = dataList->options();
+    filtered.reserveCapacity(options->length());
+    value = value.foldCase();
+    for (unsigned i = 0; i < options->length(); ++i) {
+        HTMLOptionElement* option = options->item(i);
+        DCHECK(option);
+        if (!value.isEmpty()) {
+            // Firefox shows OPTIONs with matched labels, Edge shows OPTIONs
+            // with matches values. We show both.
+            if (option->value().foldCase().find(value) == kNotFound && option->label().foldCase().find(value) == kNotFound)
+                continue;
+        }
+        // TODO(tkent): Should allow invalid strings. crbug.com/607097.
+        if (!isValidValue(option->value()))
+            continue;
+        filtered.append(option);
+    }
+    return filtered;
+}
+
 void HTMLInputElement::setListAttributeTargetObserver(ListAttributeTargetObserver* newObserver)
 {
     if (m_listAttributeTargetObserver)
diff --git a/third_party/WebKit/Source/core/html/HTMLInputElement.h b/third_party/WebKit/Source/core/html/HTMLInputElement.h
index 2a2d07c4..a2b80dd 100644
--- a/third_party/WebKit/Source/core/html/HTMLInputElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLInputElement.h
@@ -208,6 +208,8 @@
     HTMLDataListElement* dataList() const;
     bool hasValidDataListOptions() const;
     void listAttributeTargetChanged();
+    // Associated <datalsit> options which match to the current INPUT value.
+    HeapVector<Member<HTMLOptionElement>> filteredDataListOptions() const;
 
     HTMLInputElement* checkedRadioButtonForGroup();
     bool isInRequiredRadioButtonGroup();
diff --git a/third_party/WebKit/Source/core/html/HTMLInputElementTest.cpp b/third_party/WebKit/Source/core/html/HTMLInputElementTest.cpp
index 9dabccd..7ef7a1c 100644
--- a/third_party/WebKit/Source/core/html/HTMLInputElementTest.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLInputElementTest.cpp
@@ -11,6 +11,7 @@
 #include "core/html/HTMLBodyElement.h"
 #include "core/html/HTMLFormElement.h"
 #include "core/html/HTMLHtmlElement.h"
+#include "core/html/HTMLOptionElement.h"
 #include "core/html/forms/DateTimeChooser.h"
 #include "core/testing/DummyPageHolder.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -18,19 +19,86 @@
 
 namespace blink {
 
-TEST(HTMLInputElementTest, create)
+class HTMLInputElementTest : public testing::Test {
+protected:
+    Document& document() { return m_pageHolder->document(); }
+    HTMLInputElement& testElement()
+    {
+        Element* element = document().getElementById("test");
+        DCHECK(element);
+        return toHTMLInputElement(*element);
+    }
+
+private:
+    void SetUp() override
+    {
+        m_pageHolder = DummyPageHolder::create(IntSize(800, 600));
+    }
+
+    std::unique_ptr<DummyPageHolder> m_pageHolder;
+};
+
+TEST_F(HTMLInputElementTest, FilteredDataListOptionsNoList)
 {
-    Document* document = Document::create();
-    HTMLInputElement* input = HTMLInputElement::create(*document, nullptr, /* createdByParser */ false);
+    document().documentElement()->setInnerHTML("<input id=test>", ASSERT_NO_EXCEPTION);
+    EXPECT_TRUE(testElement().filteredDataListOptions().isEmpty());
+
+    document().documentElement()->setInnerHTML("<input id=test list=dl1><datalist id=dl1></datalist>", ASSERT_NO_EXCEPTION);
+    EXPECT_TRUE(testElement().filteredDataListOptions().isEmpty());
+}
+
+TEST_F(HTMLInputElementTest, FilteredDataListOptionsContain)
+{
+    document().documentElement()->setInnerHTML(
+        "<input id=test value=BC list=dl2>"
+        "<datalist id=dl2>"
+        "<option>AbC DEF</option>"
+        "<option>VAX</option>"
+        "<option value=ghi>abc</option>" // Match to label, not value.
+        "</datalist>", ASSERT_NO_EXCEPTION);
+    auto options = testElement().filteredDataListOptions();
+    EXPECT_EQ(2u, options.size());
+    EXPECT_EQ("AbC DEF", options[0]->value().utf8());
+    EXPECT_EQ("ghi", options[1]->value().utf8());
+
+    document().documentElement()->setInnerHTML(
+        "<input id=test value=i list=dl2>"
+        "<datalist id=dl2>"
+        "<option>I</option>"
+        "<option>&#x0130;</option>" // LATIN CAPITAL LETTER I WITH DOT ABOVE
+        "<option>&#xFF49;</option>" // FULLWIDTH LATIN SMALL LETTER I
+        "</datalist>", ASSERT_NO_EXCEPTION);
+    options = testElement().filteredDataListOptions();
+    EXPECT_EQ(2u, options.size());
+    EXPECT_EQ("I", options[0]->value().utf8());
+    EXPECT_EQ(0x0130, options[1]->value()[0]);
+}
+
+TEST_F(HTMLInputElementTest, FilteredDataListOptionsForMultipleEmail)
+{
+    document().documentElement()->setInnerHTML(
+        "<input id=test value='foo@example.com, tkent' list=dl3 type=email multiple>"
+        "<datalist id=dl3>"
+        "<option>keishi@chromium.org</option>"
+        "<option>tkent@chromium.org</option>"
+        "</datalist>", ASSERT_NO_EXCEPTION);
+    auto options = testElement().filteredDataListOptions();
+    EXPECT_EQ(1u, options.size());
+    EXPECT_EQ("tkent@chromium.org", options[0]->value().utf8());
+}
+
+TEST_F(HTMLInputElementTest, create)
+{
+    HTMLInputElement* input = HTMLInputElement::create(document(), nullptr, /* createdByParser */ false);
     EXPECT_NE(nullptr, input->userAgentShadowRoot());
 
-    input = HTMLInputElement::create(*document, nullptr, /* createdByParser */ true);
+    input = HTMLInputElement::create(document(), nullptr, /* createdByParser */ true);
     EXPECT_EQ(nullptr, input->userAgentShadowRoot());
     input->parserSetAttributes(Vector<Attribute>());
     EXPECT_NE(nullptr, input->userAgentShadowRoot());
 }
 
-TEST(HTMLInputElementTest, NoAssertWhenMovedInNewDocument)
+TEST_F(HTMLInputElementTest, NoAssertWhenMovedInNewDocument)
 {
     Document* documentWithoutFrame = Document::create();
     EXPECT_EQ(nullptr, documentWithoutFrame->frameHost());
@@ -53,20 +121,16 @@
     document.body()->removeChild(document.body()->firstChild());
 }
 
-TEST(HTMLInputElementTest, DefaultToolTip)
+TEST_F(HTMLInputElementTest, DefaultToolTip)
 {
-    Document* document = Document::create();
-    HTMLHtmlElement* html = HTMLHtmlElement::create(*document);
-    html->appendChild(HTMLBodyElement::create(*document));
-    HTMLInputElement* inputWithoutForm = HTMLInputElement::create(*document, nullptr, false);
+    HTMLInputElement* inputWithoutForm = HTMLInputElement::create(document(), nullptr, false);
     inputWithoutForm->setBooleanAttribute(HTMLNames::requiredAttr, true);
-    toHTMLBodyElement(html->firstChild())->appendChild(inputWithoutForm);
-    document->appendChild(html);
+    document().body()->appendChild(inputWithoutForm);
     EXPECT_EQ("<<ValidationValueMissing>>", inputWithoutForm->defaultToolTip());
 
-    HTMLFormElement* form = HTMLFormElement::create(*document);
-    document->body()->appendChild(form);
-    HTMLInputElement* inputWithForm = HTMLInputElement::create(*document, nullptr, false);
+    HTMLFormElement* form = HTMLFormElement::create(document());
+    document().body()->appendChild(form);
+    HTMLInputElement* inputWithForm = HTMLInputElement::create(document(), nullptr, false);
     inputWithForm->setBooleanAttribute(HTMLNames::requiredAttr, true);
     form->appendChild(inputWithForm);
     EXPECT_EQ("<<ValidationValueMissing>>", inputWithForm->defaultToolTip());
@@ -76,10 +140,9 @@
 }
 
 // crbug.com/589838
-TEST(HTMLInputElementTest, ImageTypeCrash)
+TEST_F(HTMLInputElementTest, ImageTypeCrash)
 {
-    Document* document = Document::create();
-    HTMLInputElement* input = HTMLInputElement::create(*document, nullptr, false);
+    HTMLInputElement* input = HTMLInputElement::create(document(), nullptr, false);
     input->setAttribute(HTMLNames::typeAttr, "image");
     input->ensureFallbackContent();
     // Make sure ensurePrimaryContent() recreates UA shadow tree, and updating
@@ -88,14 +151,12 @@
     input->setAttribute(HTMLNames::valueAttr, "aaa");
 }
 
-TEST(HTMLInputElementTest, DateTimeChooserSizeParamRespectsScale)
+TEST_F(HTMLInputElementTest, DateTimeChooserSizeParamRespectsScale)
 {
-    std::unique_ptr<DummyPageHolder> pageHolder = DummyPageHolder::create();
-    Document* document = &(pageHolder->document());
-    document->view()->frame().host()->visualViewport().setScale(2.f);
-    document->body()->setInnerHTML("<input type='date' style='width:200px;height:50px' />", ASSERT_NO_EXCEPTION);
-    document->view()->updateAllLifecyclePhases();
-    HTMLInputElement* input = toHTMLInputElement(document->body()->firstChild());
+    document().view()->frame().host()->visualViewport().setScale(2.f);
+    document().body()->setInnerHTML("<input type='date' style='width:200px;height:50px' />", ASSERT_NO_EXCEPTION);
+    document().view()->updateAllLifecyclePhases();
+    HTMLInputElement* input = toHTMLInputElement(document().body()->firstChild());
 
     DateTimeChooserParameters params;
     bool success = input->setupDateTimeChooserParameters(params);
diff --git a/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp b/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp
index eba8125..4427d83 100644
--- a/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp
@@ -663,8 +663,7 @@
 
         bool mediaQueryMatches = true;
         LocalFrame* frame = loadingFrame();
-        if (!m_owner->media().isEmpty() && frame && frame->document()) {
-            RefPtr<ComputedStyle> documentStyle = StyleResolver::styleForDocument(*frame->document());
+        if (!m_owner->media().isEmpty() && frame) {
             MediaQuerySet* media = MediaQuerySet::create(m_owner->media());
             MediaQueryEvaluator evaluator(frame);
             mediaQueryMatches = evaluator.eval(media);
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLSrcsetParser.cpp b/third_party/WebKit/Source/core/html/parser/HTMLSrcsetParser.cpp
index beb8fe0..2380c43 100644
--- a/third_party/WebKit/Source/core/html/parser/HTMLSrcsetParser.cpp
+++ b/third_party/WebKit/Source/core/html/parser/HTMLSrcsetParser.cpp
@@ -356,7 +356,7 @@
         return winner;
     for (unsigned i = imageCandidates.size() - 1; i > winner; --i) {
         KURL url = document->completeURL(stripLeadingAndTrailingHTMLSpaces(imageCandidates[i]->url()));
-        if (memoryCache()->resourceForURL(url, document->fetcher()->getCacheIdentifier()))
+        if (memoryCache()->resourceForURL(url, document->fetcher()->getCacheIdentifier()) || url.protocolIsData())
             return i;
     }
     return winner;
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaControlsTest.cpp b/third_party/WebKit/Source/core/html/shadow/MediaControlsTest.cpp
index 08cae76..8f2ea14a 100644
--- a/third_party/WebKit/Source/core/html/shadow/MediaControlsTest.cpp
+++ b/third_party/WebKit/Source/core/html/shadow/MediaControlsTest.cpp
@@ -62,7 +62,7 @@
         Document& document = this->document();
 
         document.write("<video>");
-        HTMLVideoElement& video = toHTMLVideoElement(*document.querySelector("video", ASSERT_NO_EXCEPTION));
+        HTMLVideoElement& video = toHTMLVideoElement(*document.querySelector("video"));
         m_mediaControls = video.mediaControls();
 
         // If scripts are not enabled, controls will always be shown.
diff --git a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.cpp b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.cpp
index 5fbfa1a..3e592171 100644
--- a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.cpp
+++ b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.cpp
@@ -232,7 +232,7 @@
     ImageDecoder::GammaAndColorProfileOption colorSpaceOp = ImageDecoder::GammaAndColorProfileApplied;
     if (colorSpaceConversionOption == "none")
         colorSpaceOp = ImageDecoder::GammaAndColorProfileIgnored;
-    std::unique_ptr<ImageDecoder> decoder(ImageDecoder::create(*sharedBuffer, alphaOp, colorSpaceOp));
+    std::unique_ptr<ImageDecoder> decoder(ImageDecoder::create(ImageDecoder::determineImageType(*sharedBuffer), alphaOp, colorSpaceOp));
     RefPtr<SkImage> frame;
     if (decoder) {
         decoder->setData(sharedBuffer.get(), true);
diff --git a/third_party/WebKit/Source/core/input/EventHandler.cpp b/third_party/WebKit/Source/core/input/EventHandler.cpp
index d6bb3c72..cc58b44 100644
--- a/third_party/WebKit/Source/core/input/EventHandler.cpp
+++ b/third_party/WebKit/Source/core/input/EventHandler.cpp
@@ -37,6 +37,7 @@
 #include "core/dom/TouchList.h"
 #include "core/dom/shadow/FlatTreeTraversal.h"
 #include "core/dom/shadow/ShadowRoot.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/editing/Editor.h"
 #include "core/editing/FrameSelection.h"
 #include "core/editing/SelectionController.h"
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.cpp
index 4e8b106..7241c7d 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.cpp
@@ -310,7 +310,7 @@
     if (hasBreakpoint(node, AttributeModified)) {
         std::unique_ptr<protocol::DictionaryValue> eventData = protocol::DictionaryValue::create();
         descriptionForDOMEvent(node, AttributeModified, false, eventData.get());
-        m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::DOM, std::move(eventData));
+        m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::DOM, eventData->toJSONString());
     }
 }
 
@@ -483,7 +483,7 @@
     if (hasBreakpoint(parent, SubtreeModified)) {
         std::unique_ptr<protocol::DictionaryValue> eventData = protocol::DictionaryValue::create();
         descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get());
-        m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::DOM, std::move(eventData));
+        m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::DOM, eventData->toJSONString());
     }
 }
 
@@ -493,11 +493,11 @@
     if (hasBreakpoint(node, NodeRemoved)) {
         std::unique_ptr<protocol::DictionaryValue> eventData = protocol::DictionaryValue::create();
         descriptionForDOMEvent(node, NodeRemoved, false, eventData.get());
-        m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::DOM, std::move(eventData));
+        m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::DOM, eventData->toJSONString());
     } else if (parentNode && hasBreakpoint(parentNode, SubtreeModified)) {
         std::unique_ptr<protocol::DictionaryValue> eventData = protocol::DictionaryValue::create();
         descriptionForDOMEvent(node, SubtreeModified, false, eventData.get());
-        m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::DOM, std::move(eventData));
+        m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::DOM, eventData->toJSONString());
     }
     didRemoveDOMNode(node);
 }
@@ -507,7 +507,7 @@
     if (hasBreakpoint(element, AttributeModified)) {
         std::unique_ptr<protocol::DictionaryValue> eventData = protocol::DictionaryValue::create();
         descriptionForDOMEvent(element, AttributeModified, false, eventData.get());
-        m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::DOM, std::move(eventData));
+        m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::DOM, eventData->toJSONString());
     }
 }
 
@@ -575,9 +575,9 @@
     if (!eventData)
         return;
     if (synchronous)
-        m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::EventListener, std::move(eventData));
+        m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::EventListener, eventData->toJSONString());
     else
-        m_v8Session->schedulePauseOnNextStatement(protocol::Debugger::API::Paused::ReasonEnum::EventListener, std::move(eventData));
+        m_v8Session->schedulePauseOnNextStatement(protocol::Debugger::API::Paused::ReasonEnum::EventListener, eventData->toJSONString());
 }
 
 std::unique_ptr<protocol::DictionaryValue> InspectorDOMDebuggerAgent::preparePauseOnNativeEventData(const String& eventName, const String* targetName)
@@ -679,7 +679,7 @@
     std::unique_ptr<protocol::DictionaryValue> eventData = protocol::DictionaryValue::create();
     eventData->setString("breakpointURL", breakpointURL);
     eventData->setString("url", url);
-    m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::XHR, std::move(eventData));
+    m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::XHR, eventData->toJSONString());
 }
 
 void InspectorDOMDebuggerAgent::didAddBreakpoint()
diff --git a/third_party/WebKit/Source/core/inspector/InspectorSession.cpp b/third_party/WebKit/Source/core/inspector/InspectorSession.cpp
index 92c7fdb..5f1d1106 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorSession.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorSession.cpp
@@ -6,7 +6,6 @@
 
 #include "bindings/core/v8/ScriptController.h"
 #include "core/frame/LocalFrame.h"
-#include "core/frame/Settings.h"
 #include "core/frame/UseCounter.h"
 #include "core/inspector/InspectedFrames.h"
 #include "core/inspector/InspectorBaseAgent.h"
@@ -81,7 +80,7 @@
 void InspectorSession::dispatchProtocolMessage(const String& method, const String& message)
 {
     DCHECK(!m_disposed);
-    if (V8InspectorSession::isV8ProtocolMethod(method))
+    if (V8InspectorSession::canDispatchMethod(method))
         m_v8Session->dispatchProtocolMessage(message);
     else
         m_inspectorBackendDispatcher->dispatch(message);
@@ -128,20 +127,6 @@
     m_notificationQueue.clear();
 }
 
-void InspectorSession::runtimeEnabled()
-{
-    if (!m_inspectedFrames)
-        return;
-    m_inspectedFrames->root()->settings()->setForceMainWorldInitialization(true);
-}
-
-void InspectorSession::runtimeDisabled()
-{
-    if (!m_inspectedFrames)
-        return;
-    m_inspectedFrames->root()->settings()->setForceMainWorldInitialization(false);
-}
-
 void InspectorSession::resumeStartup()
 {
     m_client->resumeStartup();
diff --git a/third_party/WebKit/Source/core/inspector/InspectorSession.h b/third_party/WebKit/Source/core/inspector/InspectorSession.h
index 8a9abbe..68fb1e3 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorSession.h
+++ b/third_party/WebKit/Source/core/inspector/InspectorSession.h
@@ -61,8 +61,6 @@
     void sendProtocolNotification(const protocol::String16& message) override;
 
     // V8InspectorSessionClient implementation.
-    void runtimeEnabled() override;
-    void runtimeDisabled() override;
     void resumeStartup() override;
     bool canExecuteScripts() override;
     void profilingStarted() override;
diff --git a/third_party/WebKit/Source/core/inspector/MainThreadDebugger.cpp b/third_party/WebKit/Source/core/inspector/MainThreadDebugger.cpp
index 2cdc2c1..97fb60c 100644
--- a/third_party/WebKit/Source/core/inspector/MainThreadDebugger.cpp
+++ b/third_party/WebKit/Source/core/inspector/MainThreadDebugger.cpp
@@ -45,6 +45,7 @@
 #include "core/frame/FrameHost.h"
 #include "core/frame/LocalDOMWindow.h"
 #include "core/frame/LocalFrame.h"
+#include "core/frame/Settings.h"
 #include "core/frame/UseCounter.h"
 #include "core/inspector/ConsoleMessage.h"
 #include "core/inspector/ConsoleMessageStorage.h"
@@ -219,11 +220,6 @@
         frame->host()->consoleMessageStorage().unmute();
 }
 
-bool MainThreadDebugger::callingContextCanAccessContext(v8::Local<v8::Context> calling, v8::Local<v8::Context> target)
-{
-    return BindingSecurity::shouldAllowAccessTo(m_isolate, calling, target, DoNotReportSecurityError);
-}
-
 v8::Local<v8::Context> MainThreadDebugger::ensureDefaultContextInGroup(int contextGroupId)
 {
     LocalFrame* frame = WeakIdentifierMap<LocalFrame>::lookup(contextGroupId);
@@ -231,6 +227,18 @@
     return scriptState ? scriptState->context() : v8::Local<v8::Context>();
 }
 
+void MainThreadDebugger::beginEnsureAllContextsInGroup(int contextGroupId)
+{
+    LocalFrame* frame = WeakIdentifierMap<LocalFrame>::lookup(contextGroupId);
+    frame->settings()->setForceMainWorldInitialization(true);
+}
+
+void MainThreadDebugger::endEnsureAllContextsInGroup(int contextGroupId)
+{
+    LocalFrame* frame = WeakIdentifierMap<LocalFrame>::lookup(contextGroupId);
+    frame->settings()->setForceMainWorldInitialization(false);
+}
+
 void MainThreadDebugger::consoleAPIMessage(int contextGroupId, MessageLevel level, const String16& message, const String16& url, unsigned lineNumber, unsigned columnNumber, V8StackTrace* stackTrace)
 {
     LocalFrame* frame = WeakIdentifierMap<LocalFrame>::lookup(contextGroupId);
diff --git a/third_party/WebKit/Source/core/inspector/MainThreadDebugger.h b/third_party/WebKit/Source/core/inspector/MainThreadDebugger.h
index d7dfc5f7..c4a15b8 100644
--- a/third_party/WebKit/Source/core/inspector/MainThreadDebugger.h
+++ b/third_party/WebKit/Source/core/inspector/MainThreadDebugger.h
@@ -87,8 +87,9 @@
     void quitMessageLoopOnPause() override;
     void muteWarningsAndDeprecations(int contextGroupId) override;
     void unmuteWarningsAndDeprecations(int contextGroupId) override;
-    bool callingContextCanAccessContext(v8::Local<v8::Context> calling, v8::Local<v8::Context> target) override;
     v8::Local<v8::Context> ensureDefaultContextInGroup(int contextGroupId) override;
+    void beginEnsureAllContextsInGroup(int contextGroupId) override;
+    void endEnsureAllContextsInGroup(int contextGroupId) override;
     void consoleAPIMessage(int contextGroupId, MessageLevel, const String16& message, const String16& url, unsigned lineNumber, unsigned columnNumber, V8StackTrace*) override;
 
     std::unique_ptr<ClientMessageLoop> m_clientMessageLoop;
diff --git a/third_party/WebKit/Source/core/inspector/ThreadDebugger.cpp b/third_party/WebKit/Source/core/inspector/ThreadDebugger.cpp
index 9b5c11a7..bb64706 100644
--- a/third_party/WebKit/Source/core/inspector/ThreadDebugger.cpp
+++ b/third_party/WebKit/Source/core/inspector/ThreadDebugger.cpp
@@ -16,6 +16,7 @@
 #include "bindings/core/v8/V8HTMLCollection.h"
 #include "bindings/core/v8/V8Node.h"
 #include "bindings/core/v8/V8NodeList.h"
+#include "bindings/core/v8/V8ScriptRunner.h"
 #include "core/inspector/ConsoleMessage.h"
 #include "core/inspector/InspectorDOMDebuggerAgent.h"
 #include "core/inspector/InspectorTraceEvents.h"
@@ -184,11 +185,11 @@
     info.GetReturnValue().Set(info.Data());
 }
 
-void ThreadDebugger::createFunctionProperty(v8::Local<v8::Context> context, v8::Local<v8::Object> object, const char* name, v8::FunctionCallback callback, const char* description)
+static void createFunctionPropertyWithData(v8::Local<v8::Context> context, v8::Local<v8::Object> object, const char* name, v8::FunctionCallback callback, v8::Local<v8::Value> data, const char* description)
 {
     v8::Local<v8::String> funcName = v8String(context->GetIsolate(), name);
     v8::Local<v8::Function> func;
-    if (!v8::Function::New(context, callback, v8::External::New(context->GetIsolate(), this), 0, v8::ConstructorBehavior::kThrow).ToLocal(&func))
+    if (!v8::Function::New(context, callback, data, 0, v8::ConstructorBehavior::kThrow).ToLocal(&func))
         return;
     func->SetName(funcName);
     v8::Local<v8::String> returnValue = v8String(context->GetIsolate(), description);
@@ -199,11 +200,20 @@
         return;
 }
 
+void ThreadDebugger::createFunctionProperty(v8::Local<v8::Context> context, v8::Local<v8::Object> object, const char* name, v8::FunctionCallback callback, const char* description)
+{
+    createFunctionPropertyWithData(context, object, name, callback, v8::External::New(context->GetIsolate(), this), description);
+}
+
 void ThreadDebugger::installAdditionalCommandLineAPI(v8::Local<v8::Context> context, v8::Local<v8::Object> object)
 {
-    createFunctionProperty(context, object, "monitorEvents", ThreadDebugger::monitorEventsCallback, "function monitorEvents(object, [types]) { [Command Line API] }");
-    createFunctionProperty(context, object, "unmonitorEvents", ThreadDebugger::unmonitorEventsCallback, "function unmonitorEvents(object, [types]) { [Command Line API] }");
     createFunctionProperty(context, object, "getEventListeners", ThreadDebugger::getEventListenersCallback, "function getEventListeners(node) { [Command Line API] }");
+
+    v8::Local<v8::Value> functionValue;
+    bool success = V8ScriptRunner::compileAndRunInternalScript(v8String(m_isolate, "(function(e) { console.log(e.type, e); })"), m_isolate).ToLocal(&functionValue) && functionValue->IsFunction();
+    DCHECK(success);
+    createFunctionPropertyWithData(context, object, "monitorEvents", ThreadDebugger::monitorEventsCallback, functionValue, "function monitorEvents(object, [types]) { [Command Line API] }");
+    createFunctionPropertyWithData(context, object, "unmonitorEvents", ThreadDebugger::unmonitorEventsCallback, functionValue, "function unmonitorEvents(object, [types]) { [Command Line API] }");
 }
 
 static Vector<String> normalizeEventTypes(const v8::FunctionCallbackInfo<v8::Value>& info)
@@ -241,25 +251,6 @@
     return outputTypes;
 }
 
-void ThreadDebugger::logCallback(const v8::FunctionCallbackInfo<v8::Value>& info)
-{
-    if (info.Length() < 1)
-        return;
-    ThreadDebugger* debugger = static_cast<ThreadDebugger*>(v8::Local<v8::External>::Cast(info.Data())->Value());
-    DCHECK(debugger);
-    Event* event = V8Event::toImplWithTypeCheck(info.GetIsolate(), info[0]);
-    if (!event)
-        return;
-    debugger->debugger()->logToConsole(info.GetIsolate()->GetCurrentContext(), v8String(info.GetIsolate(), event->type()), info[0]);
-}
-
-v8::Local<v8::Function> ThreadDebugger::eventLogFunction()
-{
-    if (m_eventLogFunction.IsEmpty())
-        m_eventLogFunction.Reset(m_isolate, v8::Function::New(m_isolate->GetCurrentContext(), logCallback, v8::External::New(m_isolate, this), 0, v8::ConstructorBehavior::kThrow).ToLocalChecked());
-    return m_eventLogFunction.Get(m_isolate);
-}
-
 static EventTarget* firstArgumentAsEventTarget(const v8::FunctionCallbackInfo<v8::Value>& info)
 {
     if (info.Length() < 1)
@@ -275,9 +266,7 @@
     if (!eventTarget)
         return;
     Vector<String> types = normalizeEventTypes(info);
-    ThreadDebugger* debugger = static_cast<ThreadDebugger*>(v8::Local<v8::External>::Cast(info.Data())->Value());
-    DCHECK(debugger);
-    EventListener* eventListener = V8EventListenerList::getEventListener(ScriptState::current(info.GetIsolate()), debugger->eventLogFunction(), false, enabled ? ListenerFindOrCreate : ListenerFindOnly);
+    EventListener* eventListener = V8EventListenerList::getEventListener(ScriptState::current(info.GetIsolate()), v8::Local<v8::Function>::Cast(info.Data()), false, enabled ? ListenerFindOrCreate : ListenerFindOnly);
     if (!eventListener)
         return;
     for (size_t i = 0; i < types.size(); ++i) {
diff --git a/third_party/WebKit/Source/core/inspector/ThreadDebugger.h b/third_party/WebKit/Source/core/inspector/ThreadDebugger.h
index 42cc986..d31183f7 100644
--- a/third_party/WebKit/Source/core/inspector/ThreadDebugger.h
+++ b/third_party/WebKit/Source/core/inspector/ThreadDebugger.h
@@ -70,12 +70,9 @@
     std::unique_ptr<V8Debugger> m_debugger;
 
 private:
-    v8::Local<v8::Function> eventLogFunction();
-
     static void setMonitorEventsCallback(const v8::FunctionCallbackInfo<v8::Value>&, bool enabled);
     static void monitorEventsCallback(const v8::FunctionCallbackInfo<v8::Value>&);
     static void unmonitorEventsCallback(const v8::FunctionCallbackInfo<v8::Value>&);
-    static void logCallback(const v8::FunctionCallbackInfo<v8::Value>&);
 
     static void getEventListenersCallback(const v8::FunctionCallbackInfo<v8::Value>&);
 
@@ -84,7 +81,6 @@
     Vector<V8DebuggerClient::TimerCallback> m_timerCallbacks;
     Vector<void*> m_timerData;
     std::unique_ptr<UserGestureIndicator> m_userGestureIndicator;
-    v8::Global<v8::Function> m_eventLogFunction;
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/inspector/WorkerThreadDebugger.cpp b/third_party/WebKit/Source/core/inspector/WorkerThreadDebugger.cpp
index 7ce1097..9510b04d 100644
--- a/third_party/WebKit/Source/core/inspector/WorkerThreadDebugger.cpp
+++ b/third_party/WebKit/Source/core/inspector/WorkerThreadDebugger.cpp
@@ -126,11 +126,6 @@
     m_workerThread->workerGlobalScope()->consoleMessageStorage()->unmute();
 }
 
-bool WorkerThreadDebugger::callingContextCanAccessContext(v8::Local<v8::Context> calling, v8::Local<v8::Context> target)
-{
-    return true;
-}
-
 v8::Local<v8::Context> WorkerThreadDebugger::ensureDefaultContextInGroup(int contextGroupId)
 {
     ASSERT(contextGroupId == workerContextGroupId);
@@ -138,6 +133,16 @@
     return scriptState ? scriptState->context() : v8::Local<v8::Context>();
 }
 
+void WorkerThreadDebugger::beginEnsureAllContextsInGroup(int contextGroupId)
+{
+    DCHECK(contextGroupId == workerContextGroupId);
+}
+
+void WorkerThreadDebugger::endEnsureAllContextsInGroup(int contextGroupId)
+{
+    DCHECK(contextGroupId == workerContextGroupId);
+}
+
 void WorkerThreadDebugger::consoleAPIMessage(int contextGroupId, MessageLevel level, const String16& message, const String16& url, unsigned lineNumber, unsigned columnNumber, V8StackTrace* stackTrace)
 {
     DCHECK(contextGroupId == workerContextGroupId);
diff --git a/third_party/WebKit/Source/core/inspector/WorkerThreadDebugger.h b/third_party/WebKit/Source/core/inspector/WorkerThreadDebugger.h
index e5088fe5..5e7eaa9 100644
--- a/third_party/WebKit/Source/core/inspector/WorkerThreadDebugger.h
+++ b/third_party/WebKit/Source/core/inspector/WorkerThreadDebugger.h
@@ -61,8 +61,9 @@
     void quitMessageLoopOnPause() override;
     void muteWarningsAndDeprecations(int contextGroupId) override;
     void unmuteWarningsAndDeprecations(int contextGroupId) override;
-    bool callingContextCanAccessContext(v8::Local<v8::Context> calling, v8::Local<v8::Context> target) override;
     v8::Local<v8::Context> ensureDefaultContextInGroup(int contextGroupId) override;
+    void beginEnsureAllContextsInGroup(int contextGroupId) override;
+    void endEnsureAllContextsInGroup(int contextGroupId) override;
 
     v8::MaybeLocal<v8::Value> memoryInfo(v8::Isolate*, v8::Local<v8::Context>) override;
     void consoleAPIMessage(int contextGroupId, MessageLevel, const String16& message, const String16& url, unsigned lineNumber, unsigned columnNumber, V8StackTrace*) override;
diff --git a/third_party/WebKit/Source/core/layout/HitTestResult.cpp b/third_party/WebKit/Source/core/layout/HitTestResult.cpp
index 07508a8..ff3418d 100644
--- a/third_party/WebKit/Source/core/layout/HitTestResult.cpp
+++ b/third_party/WebKit/Source/core/layout/HitTestResult.cpp
@@ -26,6 +26,7 @@
 #include "core/dom/PseudoElement.h"
 #include "core/dom/shadow/FlatTreeTraversal.h"
 #include "core/dom/shadow/ShadowRoot.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/editing/FrameSelection.h"
 #include "core/editing/markers/DocumentMarkerController.h"
 #include "core/frame/LocalFrame.h"
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
index 7148dcf..514ed4ad 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
@@ -2403,6 +2403,11 @@
     }
 }
 
+static bool isMergeableAnonymousBlock(const LayoutBlockFlow* block)
+{
+    return block->isAnonymousBlock() && !block->continuation() && !block->beingDestroyed() && !block->isRubyRun() && !block->isRubyBase();
+}
+
 void LayoutBlockFlow::removeChild(LayoutObject* oldChild)
 {
     // No need to waste time in merging or removing empty anonymous blocks.
@@ -2428,11 +2433,12 @@
     LayoutBlock::removeChild(oldChild);
 
     LayoutObject* child = prev ? prev : next;
-    if (mergedAnonymousBlocks && child && !child->previousSibling() && !child->nextSibling()) {
-        // The removal has knocked us down to containing only a single anonymous
-        // box.  We can go ahead and pull the content right back up into our
+    if (child && child->isLayoutBlockFlow() && !child->previousSibling() && !child->nextSibling()) {
+        // If the removal has knocked us down to containing only a single anonymous
+        // box we can go ahead and pull the content right back up into our
         // box.
-        collapseAnonymousBlockChild(toLayoutBlockFlow(child));
+        if (mergedAnonymousBlocks || isMergeableAnonymousBlock(toLayoutBlockFlow(child)))
+            collapseAnonymousBlockChild(toLayoutBlockFlow(child));
     }
 
     if (!firstChild()) {
@@ -2554,11 +2560,6 @@
     child->destroy();
 }
 
-static bool isMergeableAnonymousBlock(const LayoutBlockFlow* block)
-{
-    return block->isAnonymousBlock() && !block->continuation() && !block->beingDestroyed() && !block->isRubyRun() && !block->isRubyBase();
-}
-
 bool LayoutBlockFlow::mergeSiblingContiguousAnonymousBlock(LayoutBlockFlow* siblingThatMayBeDeleted)
 {
     // Note: |this| and |siblingThatMayBeDeleted| may not be adjacent siblings at this point. There
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp
index ec3e9219..c0e08b0 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "core/dom/AXObjectCache.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/layout/BidiRunForLine.h"
 #include "core/layout/LayoutObject.h"
 #include "core/layout/LayoutRubyRun.h"
diff --git a/third_party/WebKit/Source/core/layout/LayoutButton.h b/third_party/WebKit/Source/core/layout/LayoutButton.h
index 685b092..25eeb08 100644
--- a/third_party/WebKit/Source/core/layout/LayoutButton.h
+++ b/third_party/WebKit/Source/core/layout/LayoutButton.h
@@ -21,6 +21,7 @@
 #ifndef LayoutButton_h
 #define LayoutButton_h
 
+#include "core/editing/EditingUtilities.h"
 #include "core/html/HTMLInputElement.h"
 #include "core/layout/LayoutFlexibleBox.h"
 
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
index cc8f300..78d02a87 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
@@ -2641,7 +2641,7 @@
         selectionPaintInvalidationMap->remove(this);
 
     if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
-        clearObjectPaintProperties();
+        objectPaintPropertiesMap().remove(this);
 
     clearLayoutRootIfNeeded();
 
@@ -3627,7 +3627,7 @@
         frameView()->removeBackgroundAttachmentFixedObject(this);
 }
 
-ObjectPaintProperties* LayoutObject::objectPaintProperties() const
+const ObjectPaintProperties* LayoutObject::objectPaintProperties() const
 {
     ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
     return objectPaintPropertiesMap().get(this);
@@ -3643,12 +3643,6 @@
     return *addResult.storedValue->value;
 }
 
-void LayoutObject::clearObjectPaintProperties()
-{
-    ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
-    objectPaintPropertiesMap().remove(this);
-}
-
 } // namespace blink
 
 #ifndef NDEBUG
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.h b/third_party/WebKit/Source/core/layout/LayoutObject.h
index 2db924a..7a88a69 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.h
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.h
@@ -408,9 +408,10 @@
     // property tree nodes that are created by the layout object for painting.
     // The property nodes are only updated during InUpdatePaintProperties phase
     // of the document lifecycle and shall remain immutable during other phases.
-    ObjectPaintProperties* objectPaintProperties() const;
+    const ObjectPaintProperties* objectPaintProperties() const;
+
+private:
     ObjectPaintProperties& ensureObjectPaintProperties();
-    void clearObjectPaintProperties();
 
 private:
     //////////////////////////////////////////
@@ -1387,13 +1388,16 @@
     class MutableForPainting {
     public:
         void setPreviousPaintOffset(const LayoutPoint& paintOffset) { m_layoutObject.setPreviousPaintOffset(paintOffset); }
-        ObjectPaintProperties& ensureObjectPaintProperties() { return m_layoutObject.ensureObjectPaintProperties(); }
-        void clearObjectPaintProperties() { m_layoutObject.clearObjectPaintProperties(); }
         PaintInvalidationReason invalidatePaintIfNeeded(const PaintInvalidationState& paintInvalidationState) { return m_layoutObject.invalidatePaintIfNeeded(paintInvalidationState); }
         void clearPaintInvalidationFlags(const PaintInvalidationState& paintInvalidationState) { m_layoutObject.clearPaintInvalidationFlags(paintInvalidationState); }
         void setShouldDoDelayedFullPaintInvalidation() { m_layoutObject.setShouldDoFullPaintInvalidation(PaintInvalidationDelayedFull); }
 
     private:
+        friend class PaintPropertyTreeBuilder;
+        // The following two functions can be called from PaintPropertyTreeBuilder only.
+        ObjectPaintProperties& ensureObjectPaintProperties() { return m_layoutObject.ensureObjectPaintProperties(); }
+        ObjectPaintProperties* objectPaintProperties() { return const_cast<ObjectPaintProperties*>(m_layoutObject.objectPaintProperties()); }
+
         friend class LayoutObject;
         MutableForPainting(const LayoutObject& layoutObject) : m_layoutObject(const_cast<LayoutObject&>(layoutObject)) { }
 
diff --git a/third_party/WebKit/Source/core/layout/LayoutTextFragment.h b/third_party/WebKit/Source/core/layout/LayoutTextFragment.h
index 375eaa69..bcaed3f 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTextFragment.h
+++ b/third_party/WebKit/Source/core/layout/LayoutTextFragment.h
@@ -23,6 +23,7 @@
 #ifndef LayoutTextFragment_h
 #define LayoutTextFragment_h
 
+#include "core/editing/EditingUtilities.h"
 #include "core/layout/LayoutText.h"
 #include "platform/heap/Handle.h"
 
diff --git a/third_party/WebKit/Source/core/layout/api/LayoutItem.h b/third_party/WebKit/Source/core/layout/api/LayoutItem.h
index a3b64d0..a37a961 100644
--- a/third_party/WebKit/Source/core/layout/api/LayoutItem.h
+++ b/third_party/WebKit/Source/core/layout/api/LayoutItem.h
@@ -294,7 +294,7 @@
         return m_layoutObject->resolveColor(colorProperty);
     }
 
-    ObjectPaintProperties* objectPaintProperties() const
+    const ObjectPaintProperties* objectPaintProperties() const
     {
         return m_layoutObject->objectPaintProperties();
     }
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp
index cc53dc4..45d65c050 100644
--- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp
@@ -504,12 +504,14 @@
 TEST_F(CompositedLayerMappingTest, InterestRectOfSquashingLayerWithNegativeOverflow)
 {
     setBodyInnerHTML(
-        "<style>body { margin: 0 }</style>"
+        "<style>body { margin: 0; font-size: 16px; }</style>"
         "<div style='position: absolute; top: -500px; width: 200px; height: 700px; will-change: transform'></div>"
-        "<div id='squashed' style='position: absolute; top: 190px'>"
-        "  <div style='width: 100px; height: 100px; text-indent: -10000px'>text</div>"
+        "<div id='squashed' style='position: absolute; top: 190px;'>"
+        "  <div id='inside' style='width: 100px; height: 100px; text-indent: -10000px'>text</div>"
         "</div>");
 
+    EXPECT_EQ(document().getElementById("inside")->layoutBox()->visualOverflowRect().size().height(), 100);
+
     CompositedLayerMapping* groupedMapping = document().getElementById("squashed")->layoutBox()->layer()->groupedMapping();
     // The squashing layer is at (-10000, 190, 10100, 100) in viewport coordinates.
     // The following rect is at (-4000, 190, 4100, 100) in viewport coordinates.
diff --git a/third_party/WebKit/Source/core/layout/line/RootInlineBox.cpp b/third_party/WebKit/Source/core/layout/line/RootInlineBox.cpp
index d654f5a..bcf6a23 100644
--- a/third_party/WebKit/Source/core/layout/line/RootInlineBox.cpp
+++ b/third_party/WebKit/Source/core/layout/line/RootInlineBox.cpp
@@ -21,6 +21,7 @@
 
 #include "core/dom/Document.h"
 #include "core/dom/StyleEngine.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/layout/HitTestResult.h"
 #include "core/layout/VerticalPositionCache.h"
 #include "core/layout/api/LineLayoutBlockFlow.h"
diff --git a/third_party/WebKit/Source/core/loader/ImageLoader.cpp b/third_party/WebKit/Source/core/loader/ImageLoader.cpp
index 3fed17e..a44826e 100644
--- a/third_party/WebKit/Source/core/loader/ImageLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/ImageLoader.cpp
@@ -428,7 +428,7 @@
         if (resource && !resource->errorOccurred())
             return true;
     }
-    return (isHTMLObjectElement(m_element) || isHTMLEmbedElement(m_element) || url.protocolIsData());
+    return (isHTMLObjectElement(m_element) || isHTMLEmbedElement(m_element));
 }
 
 void ImageLoader::imageNotifyFinished(ImageResource* resource)
diff --git a/third_party/WebKit/Source/core/observer/ResizeObservation.cpp b/third_party/WebKit/Source/core/observer/ResizeObservation.cpp
index 0781e2a..a3c0e41 100644
--- a/third_party/WebKit/Source/core/observer/ResizeObservation.cpp
+++ b/third_party/WebKit/Source/core/observer/ResizeObservation.cpp
@@ -4,18 +4,54 @@
 
 #include "core/observer/ResizeObservation.h"
 
-#include "core/dom/Element.h"
+#include "core/layout/LayoutBox.h"
 #include "core/observer/ResizeObserver.h"
+#include "core/svg/SVGElement.h"
+#include "core/svg/SVGGraphicsElement.h"
 
 namespace blink {
 
 ResizeObservation::ResizeObservation(Element* target, ResizeObserver* observer)
     : m_target(target)
     , m_observer(observer)
+    , m_observationSize(0, 0)
 {
     DCHECK(m_target);
 }
 
+void ResizeObservation::setObservationSize(const LayoutSize& size)
+{
+    m_observationSize = size;
+}
+
+bool ResizeObservation::observationSizeOutOfSync() const
+{
+    return m_observationSize != ResizeObservation::getTargetSize(m_target);
+}
+
+size_t ResizeObservation::targetDepth()
+{
+    unsigned depth = 0;
+    for (Element* parent = m_target; parent; parent = parent->parentElement())
+        ++depth;
+    return depth;
+}
+
+LayoutSize ResizeObservation::getTargetSize(Element* target) // static
+{
+    if (target) {
+        if (target->isSVGElement() && toSVGElement(target)->isSVGGraphicsElement()) {
+            SVGGraphicsElement& svg = toSVGGraphicsElement(*target);
+            return LayoutSize(svg.getBBox().size());
+        }
+        LayoutBox* layout = target->layoutBox();
+        if (layout)
+            return layout->contentSize();
+    }
+    return LayoutSize();
+}
+
+
 DEFINE_TRACE(ResizeObservation)
 {
     visitor->trace(m_target);
diff --git a/third_party/WebKit/Source/core/observer/ResizeObservation.h b/third_party/WebKit/Source/core/observer/ResizeObservation.h
index b1a3f79..18b6f0e 100644
--- a/third_party/WebKit/Source/core/observer/ResizeObservation.h
+++ b/third_party/WebKit/Source/core/observer/ResizeObservation.h
@@ -15,18 +15,25 @@
 class ResizeObserver;
 
 // ResizeObservation represents an element that is being observed.
-class ResizeObservation final : public GarbageCollected<ResizeObservation> {
+class CORE_EXPORT ResizeObservation final : public GarbageCollected<ResizeObservation> {
 public:
     ResizeObservation(Element* target, ResizeObserver*);
 
     Element* target() const { return m_target; }
+    size_t targetDepth();
+    void setObservationSize(const LayoutSize&);
+    // True if observationSize differs from target's current size.
+    bool observationSizeOutOfSync() const;
+
+    static LayoutSize getTargetSize(Element* target);
 
     DECLARE_TRACE();
 
 private:
     WeakMember<Element> m_target;
-
     Member<ResizeObserver> m_observer;
+    // Target size sent in last observation notification.
+    LayoutSize m_observationSize;
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/observer/ResizeObserver.h b/third_party/WebKit/Source/core/observer/ResizeObserver.h
index 4bb112b..9bdde38 100644
--- a/third_party/WebKit/Source/core/observer/ResizeObserver.h
+++ b/third_party/WebKit/Source/core/observer/ResizeObserver.h
@@ -18,7 +18,7 @@
 
 // ResizeObserver represents ResizeObserver javascript api:
 // https://github.com/WICG/ResizeObserver/
-class ResizeObserver final : public GarbageCollectedFinalized<ResizeObserver>, public ScriptWrappable {
+class CORE_EXPORT ResizeObserver final : public GarbageCollectedFinalized<ResizeObserver>, public ScriptWrappable {
     DEFINE_WRAPPERTYPEINFO();
 public:
 
diff --git a/third_party/WebKit/Source/core/page/TouchAdjustment.cpp b/third_party/WebKit/Source/core/page/TouchAdjustment.cpp
index f2d31df8..abd2696 100644
--- a/third_party/WebKit/Source/core/page/TouchAdjustment.cpp
+++ b/third_party/WebKit/Source/core/page/TouchAdjustment.cpp
@@ -23,6 +23,7 @@
 #include "core/dom/Node.h"
 #include "core/dom/NodeComputedStyle.h"
 #include "core/dom/Text.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/editing/Editor.h"
 #include "core/frame/FrameView.h"
 #include "core/frame/LocalFrame.h"
diff --git a/third_party/WebKit/Source/core/paint/ObjectPaintProperties.h b/third_party/WebKit/Source/core/paint/ObjectPaintProperties.h
index 2d72971..9c9a1a7 100644
--- a/third_party/WebKit/Source/core/paint/ObjectPaintProperties.h
+++ b/third_party/WebKit/Source/core/paint/ObjectPaintProperties.h
@@ -48,22 +48,22 @@
     //                                      This is equivalent to the local border box space above,
     //                                      with pixel snapped paint offset baked in. It is really redundant,
     //                                      but it is a pain to teach scrollbars to paint with an offset.
-    TransformPaintPropertyNode* paintOffsetTranslation() const { return m_paintOffsetTranslation.get(); }
-    TransformPaintPropertyNode* transform() const { return m_transform.get(); }
-    TransformPaintPropertyNode* perspective() const { return m_perspective.get(); }
-    TransformPaintPropertyNode* svgLocalToBorderBoxTransform() const { return m_svgLocalToBorderBoxTransform.get(); }
-    TransformPaintPropertyNode* scrollTranslation() const { return m_scrollTranslation.get(); }
-    TransformPaintPropertyNode* scrollbarPaintOffset() const { return m_scrollbarPaintOffset.get(); }
+    const TransformPaintPropertyNode* paintOffsetTranslation() const { return m_paintOffsetTranslation.get(); }
+    const TransformPaintPropertyNode* transform() const { return m_transform.get(); }
+    const TransformPaintPropertyNode* perspective() const { return m_perspective.get(); }
+    const TransformPaintPropertyNode* svgLocalToBorderBoxTransform() const { return m_svgLocalToBorderBoxTransform.get(); }
+    const TransformPaintPropertyNode* scrollTranslation() const { return m_scrollTranslation.get(); }
+    const TransformPaintPropertyNode* scrollbarPaintOffset() const { return m_scrollbarPaintOffset.get(); }
 
-    EffectPaintPropertyNode* effect() const { return m_effect.get(); }
+    const EffectPaintPropertyNode* effect() const { return m_effect.get(); }
 
     // The hierarchy of the clip subtree created by a LayoutObject is as follows:
     // [ css clip ]
     // |
     // +--- [ overflow clip ]
-    ClipPaintPropertyNode* cssClip() const { return m_cssClip.get(); }
-    ClipPaintPropertyNode* cssClipFixedPosition() const { return m_cssClipFixedPosition.get(); }
-    ClipPaintPropertyNode* overflowClip() const { return m_overflowClip.get(); }
+    const ClipPaintPropertyNode* cssClip() const { return m_cssClip.get(); }
+    const ClipPaintPropertyNode* cssClipFixedPosition() const { return m_cssClipFixedPosition.get(); }
+    const ClipPaintPropertyNode* overflowClip() const { return m_overflowClip.get(); }
 
     // This is a complete set of property nodes that should be used as a starting point to paint
     // this layout object. It is needed becauase some property inherits from the containing block,
@@ -76,32 +76,52 @@
         LayoutPoint paintOffset;
         PropertyTreeState propertyTreeState;
     };
-    LocalBorderBoxProperties* localBorderBoxProperties() const { return m_localBorderBoxProperties.get(); }
+    const LocalBorderBoxProperties* localBorderBoxProperties() const { return m_localBorderBoxProperties.get(); }
+
+    void clearPaintOffsetTranslation() { m_paintOffsetTranslation = nullptr; }
+    void clearTransform() { m_transform = nullptr; }
+    void clearEffect() { m_effect = nullptr; }
+    void clearCssClip() { m_cssClip = nullptr; }
+    void clearCssClipFixedPosition() { m_cssClipFixedPosition = nullptr; }
+    void clearOverflowClip() { m_overflowClip = nullptr; }
+    void clearPerspective() { m_perspective = nullptr; }
+    void clearSvgLocalToBorderBoxTransform() { m_svgLocalToBorderBoxTransform = nullptr; }
+    void clearScrollTranslation() { m_scrollTranslation = nullptr; }
+    void clearScrollbarPaintOffset() { m_scrollbarPaintOffset = nullptr; }
+
+    template <typename... Args> TransformPaintPropertyNode* createOrUpdatePaintOffsetTranslation(Args&&... args) { return createOrUpdateProperty(m_paintOffsetTranslation, std::forward<Args>(args)...); }
+    template <typename... Args> TransformPaintPropertyNode* createOrUpdateTransform(Args&&... args) { return createOrUpdateProperty(m_transform, std::forward<Args>(args)...); }
+    template <typename... Args> TransformPaintPropertyNode* createOrUpdatePerspective(Args&&... args) { return createOrUpdateProperty(m_perspective, std::forward<Args>(args)...); }
+    template <typename... Args> TransformPaintPropertyNode* createOrUpdateSvgLocalToBorderBoxTransform(Args&&... args)
+    {
+        DCHECK(!scrollTranslation()) << "SVG elements cannot scroll so there should never be both a scroll translation and an SVG local to border box transform.";
+        return createOrUpdateProperty(m_svgLocalToBorderBoxTransform, std::forward<Args>(args)...);
+    }
+    template <typename... Args> TransformPaintPropertyNode* createOrUpdateScrollTranslation(Args&&... args)
+    {
+        DCHECK(!svgLocalToBorderBoxTransform()) << "SVG elements cannot scroll so there should never be both a scroll translation and an SVG local to border box transform.";
+        return createOrUpdateProperty(m_scrollTranslation, std::forward<Args>(args)...);
+    }
+    template <typename... Args> TransformPaintPropertyNode* createOrUpdateScrollbarPaintOffset(Args&&... args) { return createOrUpdateProperty(m_scrollbarPaintOffset, std::forward<Args>(args)...); }
+    template <typename... Args> EffectPaintPropertyNode* createOrUpdateEffect(Args&&... args) { return createOrUpdateProperty(m_effect, std::forward<Args>(args)...); }
+    template <typename... Args> ClipPaintPropertyNode* createOrUpdateCssClip(Args&&... args) { return createOrUpdateProperty(m_cssClip, std::forward<Args>(args)...); }
+    template <typename... Args> ClipPaintPropertyNode* createOrUpdateCssClipFixedPosition(Args&&... args) { return createOrUpdateProperty(m_cssClipFixedPosition, std::forward<Args>(args)...); }
+    template <typename... Args> ClipPaintPropertyNode* createOrUpdateOverflowClip(Args&&... args) { return createOrUpdateProperty(m_overflowClip, std::forward<Args>(args)...); }
+
+    void setLocalBorderBoxProperties(std::unique_ptr<LocalBorderBoxProperties> properties) { m_localBorderBoxProperties = std::move(properties); }
 
 private:
     ObjectPaintProperties() { }
 
-    friend class PaintPropertyTreeBuilder;
-    // These setters should only be used by PaintPropertyTreeBuilder.
-    void setPaintOffsetTranslation(PassRefPtr<TransformPaintPropertyNode> paintOffset) { m_paintOffsetTranslation = paintOffset; }
-    void setTransform(PassRefPtr<TransformPaintPropertyNode> transform) { m_transform = transform; }
-    void setEffect(PassRefPtr<EffectPaintPropertyNode> effect) { m_effect = effect; }
-    void setCssClip(PassRefPtr<ClipPaintPropertyNode> clip) { m_cssClip = clip; }
-    void setCssClipFixedPosition(PassRefPtr<ClipPaintPropertyNode> clip) { m_cssClipFixedPosition = clip; }
-    void setOverflowClip(PassRefPtr<ClipPaintPropertyNode> clip) { m_overflowClip = clip; }
-    void setPerspective(PassRefPtr<TransformPaintPropertyNode> perspective) { m_perspective = perspective; }
-    void setSvgLocalToBorderBoxTransform(PassRefPtr<TransformPaintPropertyNode> transform)
+    template <typename PaintPropertyNode, typename... Args>
+    PaintPropertyNode* createOrUpdateProperty(RefPtr<PaintPropertyNode>& field, Args&&... args)
     {
-        DCHECK(!scrollTranslation() || !transform) << "SVG elements cannot scroll so there should never be both a scroll translation and an SVG local to border box transform.";
-        m_svgLocalToBorderBoxTransform = transform;
+        if (field)
+            field->update(std::forward<Args>(args)...);
+        else
+            field = PaintPropertyNode::create(std::forward<Args>(args)...);
+        return field.get();
     }
-    void setScrollTranslation(PassRefPtr<TransformPaintPropertyNode> translation)
-    {
-        DCHECK(!svgLocalToBorderBoxTransform() || !translation) << "SVG elements cannot scroll so there should never be both a scroll translation and an SVG local to border box transform.";
-        m_scrollTranslation = translation;
-    }
-    void setScrollbarPaintOffset(PassRefPtr<TransformPaintPropertyNode> paintOffset) { m_scrollbarPaintOffset = paintOffset; }
-    void setLocalBorderBoxProperties(std::unique_ptr<LocalBorderBoxProperties> properties) { m_localBorderBoxProperties = std::move(properties); }
 
     RefPtr<TransformPaintPropertyNode> m_paintOffsetTranslation;
     RefPtr<TransformPaintPropertyNode> m_transform;
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp b/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp
index 5c70cf5..3b68559 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp
@@ -370,7 +370,7 @@
 
         Optional<ScopedPaintChunkProperties> scopedPaintChunkProperties;
         if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
-            ObjectPaintProperties* objectPaintProperties = m_paintLayer.layoutObject()->objectPaintProperties();
+            const ObjectPaintProperties* objectPaintProperties = m_paintLayer.layoutObject()->objectPaintProperties();
             ASSERT(objectPaintProperties && objectPaintProperties->localBorderBoxProperties());
             PaintChunkProperties properties(context.getPaintController().currentPaintChunkProperties());
             auto& localBorderBoxProperties = *objectPaintProperties->localBorderBoxProperties();
@@ -693,7 +693,7 @@
     Optional<ScrollRecorder> scrollRecorder;
     LayoutPoint paintOffset = -m_paintLayer.layoutBoxLocation();
     if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
-        ObjectPaintProperties* objectPaintProperties = m_paintLayer.layoutObject()->objectPaintProperties();
+        const ObjectPaintProperties* objectPaintProperties = m_paintLayer.layoutObject()->objectPaintProperties();
         ASSERT(objectPaintProperties && objectPaintProperties->localBorderBoxProperties());
         paintOffset += toSize(objectPaintProperties->localBorderBoxProperties()->paintOffset);
     } else {
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
index 5ef29d2..1a2ac75 100644
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
@@ -76,32 +76,6 @@
     context.fixedPosition.transform = frameView.preTranslation();
 }
 
-template <typename PropertyNode, void (ObjectPaintProperties::*Setter)(PassRefPtr<PropertyNode>)>
-void PaintPropertyTreeBuilder::clearPaintProperty(const LayoutObject& object)
-{
-    if (ObjectPaintProperties* existingProperties = object.objectPaintProperties())
-        (existingProperties->*Setter)(nullptr);
-}
-
-template <
-    typename PropertyNode,
-    PropertyNode* (ObjectPaintProperties::*Getter)() const,
-    void (ObjectPaintProperties::*Setter)(PassRefPtr<PropertyNode>),
-    typename... Args>
-void PaintPropertyTreeBuilder::updateOrCreatePaintProperty(const LayoutObject& object, const PaintPropertyTreeBuilderContext& context, PropertyNode*& contextProperty, const Args&... args)
-{
-    ObjectPaintProperties* existingProperties = object.objectPaintProperties();
-    PropertyNode* existingPropertyNode = existingProperties ? (existingProperties->*Getter)() : nullptr;
-    if (existingPropertyNode) {
-        existingPropertyNode->update(contextProperty, args...);
-        contextProperty = existingPropertyNode;
-    } else {
-        RefPtr<PropertyNode> newPropertyNode = PropertyNode::create(contextProperty, args...);
-        contextProperty = newPropertyNode.get();
-        (object.getMutableForPainting().ensureObjectPaintProperties().*Setter)(newPropertyNode.release());
-    }
-}
-
 void PaintPropertyTreeBuilder::updatePaintOffsetTranslation(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
 {
     if (object.isBoxModelObject() && context.current.paintOffset != LayoutPoint()) {
@@ -116,14 +90,16 @@
             IntPoint roundedPaintOffset = roundedIntPoint(context.current.paintOffset);
             LayoutPoint fractionalPaintOffset = LayoutPoint(context.current.paintOffset - roundedPaintOffset);
 
-            updateOrCreatePaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::paintOffsetTranslation, &ObjectPaintProperties::setPaintOffsetTranslation>(
-                object, context, context.current.transform, TransformationMatrix().translate(roundedPaintOffset.x(), roundedPaintOffset.y()), FloatPoint3D(),
+            context.current.transform = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdatePaintOffsetTranslation(
+                context.current.transform, TransformationMatrix().translate(roundedPaintOffset.x(), roundedPaintOffset.y()), FloatPoint3D(),
                 context.current.shouldFlattenInheritedTransform, context.current.renderingContextID);
             context.current.paintOffset = fractionalPaintOffset;
             return;
         }
     }
-    clearPaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::setPaintOffsetTranslation>(object);
+
+    if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
+        properties->clearPaintOffsetTranslation();
 }
 
 static FloatPoint3D transformOrigin(const LayoutBox& box)
@@ -149,8 +125,8 @@
         const AffineTransform& transform = object.isSVGForeignObject() ? object.localSVGTransform() : object.localToSVGParentTransform();
         if (!transform.isIdentity()) {
             // The origin is included in the local transform, so leave origin empty.
-            updateOrCreatePaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::transform, &ObjectPaintProperties::setTransform>(
-                object, context, context.current.transform, TransformationMatrix(transform), FloatPoint3D());
+            context.current.transform = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateTransform(
+                context.current.transform, TransformationMatrix(transform), FloatPoint3D());
             context.current.renderingContextID = 0;
             context.current.shouldFlattenInheritedTransform = false;
             return;
@@ -179,25 +155,28 @@
                 childrenFlattenInheritedTransform = false;
             }
 
-            updateOrCreatePaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::transform, &ObjectPaintProperties::setTransform>(
-                object, context, context.current.transform, matrix, origin, flattensInheritedTransform, renderingContextID);
+            context.current.transform = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateTransform(
+                context.current.transform, matrix, origin, flattensInheritedTransform, renderingContextID);
             context.current.renderingContextID = renderingContextIDForChildren;
             context.current.shouldFlattenInheritedTransform = childrenFlattenInheritedTransform;
             return;
         }
     }
-    clearPaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::setTransform>(object);
+
+    if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
+        properties->clearTransform();
 }
 
 void PaintPropertyTreeBuilder::updateEffect(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
 {
     if (!object.styleRef().hasOpacity()) {
-        clearPaintProperty<EffectPaintPropertyNode, &ObjectPaintProperties::setEffect>(object);
+        if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
+            properties->clearEffect();
         return;
     }
 
-    updateOrCreatePaintProperty<EffectPaintPropertyNode, &ObjectPaintProperties::effect, &ObjectPaintProperties::setEffect>(
-        object, context, context.currentEffect, object.styleRef().opacity());
+    context.currentEffect = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateEffect(
+        context.currentEffect, object.styleRef().opacity());
 }
 
 void PaintPropertyTreeBuilder::updateCssClip(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
@@ -209,11 +188,13 @@
         // at updateOutOfFlowContext() step.
         DCHECK(object.canContainAbsolutePositionObjects());
         LayoutRect clipRect = toLayoutBox(object).clipRect(context.current.paintOffset);
-        updateOrCreatePaintProperty<ClipPaintPropertyNode, &ObjectPaintProperties::cssClip, &ObjectPaintProperties::setCssClip>(
-            object, context, context.current.clip, context.current.transform, FloatRoundedRect(FloatRect(clipRect)));
+        context.current.clip = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateCssClip(
+            context.current.clip, context.current.transform, FloatRoundedRect(FloatRect(clipRect)));
         return;
     }
-    clearPaintProperty<ClipPaintPropertyNode, &ObjectPaintProperties::setCssClip>(object);
+
+    if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
+        properties->clearCssClip();
 }
 
 void PaintPropertyTreeBuilder::updateLocalBorderBoxContext(const LayoutObject& object, const PaintPropertyTreeBuilderContext& context)
@@ -237,16 +218,15 @@
         if (PaintLayerScrollableArea* scrollableArea = toLayoutBoxModelObject(object).getScrollableArea()) {
             if (scrollableArea->horizontalScrollbar() || scrollableArea->verticalScrollbar()) {
                 auto paintOffset = TransformationMatrix().translate(roundedPaintOffset.x(), roundedPaintOffset.y());
-                // Make a copy of context.current.transform because we don't want to set the scrollbarPaintOffset node
-                // as the current transform.
-                TransformPaintPropertyNode* parentTransform = context.current.transform;
-                updateOrCreatePaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::scrollbarPaintOffset, &ObjectPaintProperties::setScrollbarPaintOffset>(
-                    object, context, parentTransform, paintOffset, FloatPoint3D());
+                object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateScrollbarPaintOffset(
+                    context.current.transform, paintOffset, FloatPoint3D());
                 return;
             }
         }
     }
-    clearPaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::setScrollbarPaintOffset>(object);
+
+    if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
+        properties->clearScrollbarPaintOffset();
 }
 
 void PaintPropertyTreeBuilder::updateOverflowClip(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
@@ -265,7 +245,8 @@
     } else if (box.hasOverflowClip()) {
         clipRect = box.overflowClipRect(context.current.paintOffset);
     } else {
-        clearPaintProperty<ClipPaintPropertyNode, &ObjectPaintProperties::setOverflowClip>(object);
+        if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
+            properties->clearOverflowClip();
         return;
     }
 
@@ -278,8 +259,8 @@
         context.current.clip = borderRadiusClip.get();
     }
 
-    updateOrCreatePaintProperty<ClipPaintPropertyNode, &ObjectPaintProperties::overflowClip, &ObjectPaintProperties::setOverflowClip>(
-        object, context, context.current.clip, context.current.transform, FloatRoundedRect(FloatRect(clipRect)));
+    context.current.clip = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateOverflowClip(
+        context.current.clip, context.current.transform, FloatRoundedRect(FloatRect(clipRect)));
 }
 
 static FloatPoint perspectiveOrigin(const LayoutBox& box)
@@ -295,7 +276,8 @@
 {
     const ComputedStyle& style = object.styleRef();
     if (!object.isBox() || !style.hasPerspective()) {
-        clearPaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::setPerspective>(object);
+        if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
+            properties->clearPerspective();
         return;
     }
 
@@ -304,8 +286,8 @@
     // transform nodes do.
     TransformationMatrix matrix = TransformationMatrix().applyPerspective(style.perspective());
     FloatPoint3D origin = perspectiveOrigin(toLayoutBox(object)) + toLayoutSize(context.current.paintOffset);
-    updateOrCreatePaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::perspective, &ObjectPaintProperties::setPerspective>(
-        object, context, context.current.transform, matrix, origin, context.current.shouldFlattenInheritedTransform, context.current.renderingContextID);
+    context.current.transform = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdatePerspective(
+        context.current.transform, matrix, origin, context.current.shouldFlattenInheritedTransform, context.current.renderingContextID);
     context.current.shouldFlattenInheritedTransform = false;
 }
 
@@ -321,12 +303,13 @@
     context.current.paintOffset = LayoutPoint();
 
     if (transformToBorderBox.isIdentity()) {
-        clearPaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::setSvgLocalToBorderBoxTransform>(object);
+        if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
+            properties->clearSvgLocalToBorderBoxTransform();
         return;
     }
 
-    updateOrCreatePaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::svgLocalToBorderBoxTransform, &ObjectPaintProperties::setSvgLocalToBorderBoxTransform>(
-        object, context, context.current.transform, transformToBorderBox, FloatPoint3D());
+    context.current.transform = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateSvgLocalToBorderBoxTransform(
+        context.current.transform, transformToBorderBox, FloatPoint3D());
     context.current.shouldFlattenInheritedTransform = false;
     context.current.renderingContextID = 0;
 }
@@ -340,13 +323,15 @@
 
         if (!scrollOffset.isZero() || layer->scrollsOverflow()) {
             TransformationMatrix matrix = TransformationMatrix().translate(-scrollOffset.width(), -scrollOffset.height());
-            updateOrCreatePaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::scrollTranslation, &ObjectPaintProperties::setScrollTranslation>(
-                object, context, context.current.transform, matrix, FloatPoint3D(), context.current.shouldFlattenInheritedTransform, context.current.renderingContextID);
+            context.current.transform = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateScrollTranslation(
+                context.current.transform, matrix, FloatPoint3D(), context.current.shouldFlattenInheritedTransform, context.current.renderingContextID);
             context.current.shouldFlattenInheritedTransform = false;
             return;
         }
     }
-    clearPaintProperty<TransformPaintPropertyNode, &ObjectPaintProperties::setScrollTranslation>(object);
+
+    if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
+        properties->clearScrollTranslation();
 }
 
 void PaintPropertyTreeBuilder::updateOutOfFlowContext(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
@@ -360,25 +345,27 @@
     // paint properties for rootLayerScrolls.
     if (!object.isLayoutView() && object.canContainFixedPositionObjects()) {
         context.fixedPosition = context.current;
-    } else if (object.objectPaintProperties() && object.objectPaintProperties()->cssClip()) {
+    } else if (object.getMutableForPainting().objectPaintProperties() && object.objectPaintProperties()->cssClip()) {
         // CSS clip applies to all descendants, even if this object is not a containing block
         // ancestor of the descendant. It is okay for absolute-position descendants because
         // having CSS clip implies being absolute position container. However for fixed-position
         // descendants we need to insert the clip here if we are not a containing block ancestor
         // of them.
-        auto* cssClip = object.objectPaintProperties()->cssClip();
+        auto* cssClip = object.getMutableForPainting().objectPaintProperties()->cssClip();
 
         // Before we actually create anything, check whether in-flow context and fixed-position
         // context has exactly the same clip. Reuse if possible.
         if (context.fixedPosition.clip == cssClip->parent()) {
             context.fixedPosition.clip = cssClip;
         } else {
-            updateOrCreatePaintProperty<ClipPaintPropertyNode, &ObjectPaintProperties::cssClipFixedPosition, &ObjectPaintProperties::setCssClipFixedPosition>(
-                object, context, context.fixedPosition.clip, const_cast<TransformPaintPropertyNode*>(cssClip->localTransformSpace()), cssClip->clipRect());
+            context.fixedPosition.clip = object.getMutableForPainting().ensureObjectPaintProperties().createOrUpdateCssClipFixedPosition(
+                context.fixedPosition.clip, const_cast<TransformPaintPropertyNode*>(cssClip->localTransformSpace()), cssClip->clipRect());
             return;
         }
     }
-    clearPaintProperty<ClipPaintPropertyNode, &ObjectPaintProperties::setCssClipFixedPosition>(object);
+
+    if (ObjectPaintProperties* properties = object.getMutableForPainting().objectPaintProperties())
+        properties->clearCssClipFixedPosition();
 }
 
 static void deriveBorderBoxFromContainerContext(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.h b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.h
index 9055a1f..af06059 100644
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.h
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.h
@@ -28,7 +28,7 @@
         // When a layout object recur to its children, the main context is expected to refer
         // the object's border box, then the callee will derive its own border box by translating
         // the space with its own layout location.
-        TransformPaintPropertyNode* transform = nullptr;
+        const TransformPaintPropertyNode* transform = nullptr;
         LayoutPoint paintOffset;
         // Whether newly created children should flatten their inherited transform
         // (equivalently, draw into the plane of their parent). Should generally
@@ -42,7 +42,7 @@
         // Note that the computed raster region in canvas space for a clip node is independent from
         // the transform and paint offset above. Also the actual raster region may be affected
         // by layerization and occlusion tracking.
-        ClipPaintPropertyNode* clip = nullptr;
+        const ClipPaintPropertyNode* clip = nullptr;
     };
 
     ContainingBlockContext current;
@@ -62,7 +62,7 @@
     // The effect hierarchy is applied by the stacking context tree. It is guaranteed that every
     // DOM descendant is also a stacking context descendant. Therefore, we don't need extra
     // bookkeeping for effect nodes and can generate the effect tree from a DOM-order traversal.
-    EffectPaintPropertyNode* currentEffect = nullptr;
+    const EffectPaintPropertyNode* currentEffect = nullptr;
 };
 
 // Creates paint property tree nodes for special things in the layout tree.
@@ -76,16 +76,6 @@
     void buildTreeNodes(const LayoutObject&, PaintPropertyTreeBuilderContext&);
 
 private:
-    template <typename PropertyNode, void (ObjectPaintProperties::*Setter)(PassRefPtr<PropertyNode>)>
-    static void clearPaintProperty(const LayoutObject&);
-
-    template <
-        typename PropertyNode,
-        PropertyNode* (ObjectPaintProperties::*Getter)() const,
-        void (ObjectPaintProperties::*Setter)(PassRefPtr<PropertyNode>),
-        typename... Args>
-    static void updateOrCreatePaintProperty(const LayoutObject&, const PaintPropertyTreeBuilderContext&, PropertyNode*& contextProperty, const Args&...);
-
     static void updatePaintOffsetTranslation(const LayoutObject&, PaintPropertyTreeBuilderContext&);
     static void updateTransform(const LayoutObject&, PaintPropertyTreeBuilderContext&);
     static void updateEffect(const LayoutObject&, PaintPropertyTreeBuilderContext&);
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp
index d395791..fba8378 100644
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp
@@ -78,7 +78,7 @@
     // target1 is a fixed-position element inside an absolute-position scrolling element.
     // It should be attached under the viewport to skip scrolling and offset of the parent.
     Element* target1 = document().getElementById("target1");
-    ObjectPaintProperties* target1Properties = target1->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* target1Properties = target1->layoutObject()->objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(200, 150), target1Properties->paintOffsetTranslation()->matrix());
     EXPECT_EQ(frameView->preTranslation(), target1Properties->paintOffsetTranslation()->parent());
     EXPECT_EQ(target1Properties->paintOffsetTranslation(), target1Properties->overflowClip()->localTransformSpace());
@@ -89,9 +89,9 @@
     // target2 is a fixed-position element inside a transformed scrolling element.
     // It should be attached under the scrolled box of the transformed element.
     Element* target2 = document().getElementById("target2");
-    ObjectPaintProperties* target2Properties = target2->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* target2Properties = target2->layoutObject()->objectPaintProperties();
     Element* scroller = document().getElementById("scroller");
-    ObjectPaintProperties* scrollerProperties = scroller->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* scrollerProperties = scroller->layoutObject()->objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(200, 150), target2Properties->paintOffsetTranslation()->matrix());
     EXPECT_EQ(scrollerProperties->scrollTranslation(), target2Properties->paintOffsetTranslation()->parent());
     EXPECT_EQ(target2Properties->paintOffsetTranslation(), target2Properties->overflowClip()->localTransformSpace());
@@ -109,7 +109,7 @@
     scroller->scrollTo(0, 100);
     FrameView* frameView = document().view();
     frameView->updateAllLifecyclePhases();
-    ObjectPaintProperties* scrollerProperties = scroller->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* scrollerProperties = scroller->layoutObject()->objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(0, -100), scrollerProperties->scrollTranslation()->matrix());
     EXPECT_EQ(frameView->scrollTranslation(), scrollerProperties->scrollTranslation()->parent());
     EXPECT_EQ(frameView->scrollTranslation(), scrollerProperties->overflowClip()->localTransformSpace());
@@ -119,7 +119,7 @@
     // The relative-positioned element should have accumulated box offset (exclude scrolling),
     // and should be affected by ancestor scroll transforms.
     Element* relPos = document().getElementById("rel-pos");
-    ObjectPaintProperties* relPosProperties = relPos->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* relPosProperties = relPos->layoutObject()->objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(680, 1120), relPosProperties->paintOffsetTranslation()->matrix());
     EXPECT_EQ(scrollerProperties->scrollTranslation(), relPosProperties->paintOffsetTranslation()->parent());
     EXPECT_EQ(relPosProperties->transform(), relPosProperties->overflowClip()->localTransformSpace());
@@ -128,7 +128,7 @@
 
     // The absolute-positioned element should not be affected by non-positioned scroller at all.
     Element* absPos = document().getElementById("abs-pos");
-    ObjectPaintProperties* absPosProperties = absPos->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* absPosProperties = absPos->layoutObject()->objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(123, 456), absPosProperties->paintOffsetTranslation()->matrix());
     EXPECT_EQ(frameView->scrollTranslation(), absPosProperties->paintOffsetTranslation()->parent());
     EXPECT_EQ(absPosProperties->transform(), absPosProperties->overflowClip()->localTransformSpace());
@@ -155,7 +155,7 @@
     EXPECT_EQ(nullptr, frameView->rootClip()->parent());
 
     LayoutViewItem layoutViewItem = document().layoutViewItem();
-    ObjectPaintProperties* layoutViewProperties = layoutViewItem.objectPaintProperties();
+    const ObjectPaintProperties* layoutViewProperties = layoutViewItem.objectPaintProperties();
     EXPECT_EQ(nullptr, layoutViewProperties->scrollTranslation());
 }
 
@@ -179,7 +179,7 @@
     EXPECT_EQ(frameView->preTranslation(), frameView->scrollTranslation()->parent());
 
     LayoutViewItem layoutViewItem = document().layoutViewItem();
-    ObjectPaintProperties* layoutViewProperties = layoutViewItem.objectPaintProperties();
+    const ObjectPaintProperties* layoutViewProperties = layoutViewItem.objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(0, -100), layoutViewProperties->scrollTranslation()->matrix());
     EXPECT_EQ(frameView->scrollTranslation(), layoutViewProperties->scrollTranslation()->parent());
 }
@@ -189,7 +189,7 @@
     loadTestData("perspective.html");
 
     Element* perspective = document().getElementById("perspective");
-    ObjectPaintProperties* perspectiveProperties = perspective->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* perspectiveProperties = perspective->layoutObject()->objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().applyPerspective(100), perspectiveProperties->perspective()->matrix());
     // The perspective origin is the center of the border box plus accumulated paint offset.
     EXPECT_EQ(FloatPoint3D(250, 250, 0), perspectiveProperties->perspective()->origin());
@@ -197,7 +197,7 @@
 
     // Adding perspective doesn't clear paint offset. The paint offset will be passed down to children.
     Element* inner = document().getElementById("inner");
-    ObjectPaintProperties* innerProperties = inner->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* innerProperties = inner->layoutObject()->objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(50, 100), innerProperties->paintOffsetTranslation()->matrix());
     EXPECT_EQ(perspectiveProperties->perspective(), innerProperties->paintOffsetTranslation()->parent());
 }
@@ -207,7 +207,7 @@
     loadTestData("transform.html");
 
     Element* transform = document().getElementById("transform");
-    ObjectPaintProperties* transformProperties = transform->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* transformProperties = transform->layoutObject()->objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate3d(123, 456, 789), transformProperties->transform()->matrix());
     EXPECT_EQ(FloatPoint3D(200, 150, 0), transformProperties->transform()->origin());
     EXPECT_EQ(transformProperties->paintOffsetTranslation(), transformProperties->transform()->parent());
@@ -220,7 +220,7 @@
     loadTestData("relative-position-inline.html");
 
     Element* inlineBlock = document().getElementById("inline-block");
-    ObjectPaintProperties* inlineBlockProperties = inlineBlock->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* inlineBlockProperties = inlineBlock->layoutObject()->objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(135, 490), inlineBlockProperties->paintOffsetTranslation()->matrix());
     EXPECT_EQ(document().view()->scrollTranslation(), inlineBlockProperties->paintOffsetTranslation()->parent());
 }
@@ -237,11 +237,11 @@
         "</div>");
 
     LayoutObject& nodeWithoutOpacity = *document().getElementById("nodeWithoutOpacity")->layoutObject();
-    ObjectPaintProperties* nodeWithoutOpacityProperties = nodeWithoutOpacity.objectPaintProperties();
+    const ObjectPaintProperties* nodeWithoutOpacityProperties = nodeWithoutOpacity.objectPaintProperties();
     EXPECT_NE(nullptr, nodeWithoutOpacityProperties);
 
     LayoutObject& childWithOpacity = *document().getElementById("childWithOpacity")->layoutObject();
-    ObjectPaintProperties* childWithOpacityProperties = childWithOpacity.objectPaintProperties();
+    const ObjectPaintProperties* childWithOpacityProperties = childWithOpacity.objectPaintProperties();
     EXPECT_EQ(0.5f, childWithOpacityProperties->effect()->opacity());
     // childWithOpacity is the root effect node.
     EXPECT_NE(nullptr, childWithOpacityProperties->effect()->parent());
@@ -250,7 +250,7 @@
     EXPECT_NE(nullptr, grandChildWithoutOpacity.objectPaintProperties());
 
     LayoutObject& greatGrandChildWithOpacity = *document().getElementById("greatGrandChildWithOpacity")->layoutObject();
-    ObjectPaintProperties* greatGrandChildWithOpacityProperties = greatGrandChildWithOpacity.objectPaintProperties();
+    const ObjectPaintProperties* greatGrandChildWithOpacityProperties = greatGrandChildWithOpacity.objectPaintProperties();
     EXPECT_EQ(0.2f, greatGrandChildWithOpacityProperties->effect()->opacity());
     EXPECT_EQ(childWithOpacityProperties->effect(), greatGrandChildWithOpacityProperties->effect()->parent());
 }
@@ -265,18 +265,18 @@
         "</div>");
 
     LayoutObject& nodeWithOpacity = *document().getElementById("nodeWithOpacity")->layoutObject();
-    ObjectPaintProperties* nodeWithOpacityProperties = nodeWithOpacity.objectPaintProperties();
+    const ObjectPaintProperties* nodeWithOpacityProperties = nodeWithOpacity.objectPaintProperties();
     EXPECT_EQ(0.6f, nodeWithOpacityProperties->effect()->opacity());
     EXPECT_NE(nullptr, nodeWithOpacityProperties->effect()->parent());
     EXPECT_EQ(nullptr, nodeWithOpacityProperties->transform());
 
     LayoutObject& childWithTransform = *document().getElementById("childWithTransform")->layoutObject();
-    ObjectPaintProperties* childWithTransformProperties = childWithTransform.objectPaintProperties();
+    const ObjectPaintProperties* childWithTransformProperties = childWithTransform.objectPaintProperties();
     EXPECT_EQ(nullptr, childWithTransformProperties->effect());
     EXPECT_EQ(TransformationMatrix().translate(10, 10), childWithTransformProperties->transform()->matrix());
 
     LayoutObject& grandChildWithOpacity = *document().getElementById("grandChildWithOpacity")->layoutObject();
-    ObjectPaintProperties* grandChildWithOpacityProperties = grandChildWithOpacity.objectPaintProperties();
+    const ObjectPaintProperties* grandChildWithOpacityProperties = grandChildWithOpacity.objectPaintProperties();
     EXPECT_EQ(0.4f, grandChildWithOpacityProperties->effect()->opacity());
     EXPECT_EQ(nodeWithOpacityProperties->effect(), grandChildWithOpacityProperties->effect()->parent());
     EXPECT_EQ(nullptr, grandChildWithOpacityProperties->transform());
@@ -292,18 +292,18 @@
         "</div>");
 
     LayoutObject& nodeWithOpacity = *document().getElementById("nodeWithOpacity")->layoutObject();
-    ObjectPaintProperties* nodeWithOpacityProperties = nodeWithOpacity.objectPaintProperties();
+    const ObjectPaintProperties* nodeWithOpacityProperties = nodeWithOpacity.objectPaintProperties();
     EXPECT_EQ(0.6f, nodeWithOpacityProperties->effect()->opacity());
     EXPECT_NE(nullptr, nodeWithOpacityProperties->effect()->parent());
     EXPECT_EQ(nullptr, nodeWithOpacityProperties->transform());
 
     LayoutObject& childWithStackingContext = *document().getElementById("childWithStackingContext")->layoutObject();
-    ObjectPaintProperties* childWithStackingContextProperties = childWithStackingContext.objectPaintProperties();
+    const ObjectPaintProperties* childWithStackingContextProperties = childWithStackingContext.objectPaintProperties();
     EXPECT_EQ(nullptr, childWithStackingContextProperties->effect());
     EXPECT_EQ(nullptr, childWithStackingContextProperties->transform());
 
     LayoutObject& grandChildWithOpacity = *document().getElementById("grandChildWithOpacity")->layoutObject();
-    ObjectPaintProperties* grandChildWithOpacityProperties = grandChildWithOpacity.objectPaintProperties();
+    const ObjectPaintProperties* grandChildWithOpacityProperties = grandChildWithOpacity.objectPaintProperties();
     EXPECT_EQ(0.4f, grandChildWithOpacityProperties->effect()->opacity());
     EXPECT_EQ(nodeWithOpacityProperties->effect(), grandChildWithOpacityProperties->effect()->parent());
     EXPECT_EQ(nullptr, grandChildWithOpacityProperties->transform());
@@ -323,28 +323,28 @@
         "</svg>");
 
     LayoutObject& groupWithOpacity = *document().getElementById("groupWithOpacity")->layoutObject();
-    ObjectPaintProperties* groupWithOpacityProperties = groupWithOpacity.objectPaintProperties();
+    const ObjectPaintProperties* groupWithOpacityProperties = groupWithOpacity.objectPaintProperties();
     EXPECT_EQ(0.6f, groupWithOpacityProperties->effect()->opacity());
     EXPECT_NE(nullptr, groupWithOpacityProperties->effect()->parent());
 
     LayoutObject& rectWithoutOpacity = *document().getElementById("rectWithoutOpacity")->layoutObject();
-    ObjectPaintProperties* rectWithoutOpacityProperties = rectWithoutOpacity.objectPaintProperties();
+    const ObjectPaintProperties* rectWithoutOpacityProperties = rectWithoutOpacity.objectPaintProperties();
     EXPECT_EQ(nullptr, rectWithoutOpacityProperties);
 
     LayoutObject& rectWithOpacity = *document().getElementById("rectWithOpacity")->layoutObject();
-    ObjectPaintProperties* rectWithOpacityProperties = rectWithOpacity.objectPaintProperties();
+    const ObjectPaintProperties* rectWithOpacityProperties = rectWithOpacity.objectPaintProperties();
     EXPECT_EQ(0.4f, rectWithOpacityProperties->effect()->opacity());
     EXPECT_EQ(groupWithOpacityProperties->effect(), rectWithOpacityProperties->effect()->parent());
 
     // Ensure that opacity nodes are created for LayoutSVGText which inherits from LayoutSVGBlock instead of LayoutSVGModelObject.
     LayoutObject& textWithOpacity = *document().getElementById("textWithOpacity")->layoutObject();
-    ObjectPaintProperties* textWithOpacityProperties = textWithOpacity.objectPaintProperties();
+    const ObjectPaintProperties* textWithOpacityProperties = textWithOpacity.objectPaintProperties();
     EXPECT_EQ(0.2f, textWithOpacityProperties->effect()->opacity());
     EXPECT_EQ(groupWithOpacityProperties->effect(), textWithOpacityProperties->effect()->parent());
 
     // Ensure that opacity nodes are created for LayoutSVGTSpan which inherits from LayoutSVGInline instead of LayoutSVGModelObject.
     LayoutObject& tspanWithOpacity = *document().getElementById("tspanWithOpacity")->layoutObject();
-    ObjectPaintProperties* tspanWithOpacityProperties = tspanWithOpacity.objectPaintProperties();
+    const ObjectPaintProperties* tspanWithOpacityProperties = tspanWithOpacity.objectPaintProperties();
     EXPECT_EQ(0.1f, tspanWithOpacityProperties->effect()->opacity());
     EXPECT_EQ(textWithOpacityProperties->effect(), tspanWithOpacityProperties->effect()->parent());
 }
@@ -359,17 +359,17 @@
         "</div>");
 
     LayoutObject& divWithOpacity = *document().getElementById("divWithOpacity")->layoutObject();
-    ObjectPaintProperties* divWithOpacityProperties = divWithOpacity.objectPaintProperties();
+    const ObjectPaintProperties* divWithOpacityProperties = divWithOpacity.objectPaintProperties();
     EXPECT_EQ(0.2f, divWithOpacityProperties->effect()->opacity());
     EXPECT_NE(nullptr, divWithOpacityProperties->effect()->parent());
 
     LayoutObject& svgRootWithOpacity = *document().getElementById("svgRootWithOpacity")->layoutObject();
-    ObjectPaintProperties* svgRootWithOpacityProperties = svgRootWithOpacity.objectPaintProperties();
+    const ObjectPaintProperties* svgRootWithOpacityProperties = svgRootWithOpacity.objectPaintProperties();
     EXPECT_EQ(0.3f, svgRootWithOpacityProperties->effect()->opacity());
     EXPECT_EQ(divWithOpacityProperties->effect(), svgRootWithOpacityProperties->effect()->parent());
 
     LayoutObject& rectWithOpacity = *document().getElementById("rectWithOpacity")->layoutObject();
-    ObjectPaintProperties* rectWithOpacityProperties = rectWithOpacity.objectPaintProperties();
+    const ObjectPaintProperties* rectWithOpacityProperties = rectWithOpacity.objectPaintProperties();
     EXPECT_EQ(0.4f, rectWithOpacityProperties->effect()->opacity());
     EXPECT_EQ(svgRootWithOpacityProperties->effect(), rectWithOpacityProperties->effect()->parent());
 }
@@ -386,17 +386,17 @@
         "</svg>");
 
     LayoutObject& svgRootWithOpacity = *document().getElementById("svgRootWithOpacity")->layoutObject();
-    ObjectPaintProperties* svgRootWithOpacityProperties = svgRootWithOpacity.objectPaintProperties();
+    const ObjectPaintProperties* svgRootWithOpacityProperties = svgRootWithOpacity.objectPaintProperties();
     EXPECT_EQ(0.3f, svgRootWithOpacityProperties->effect()->opacity());
     EXPECT_NE(nullptr, svgRootWithOpacityProperties->effect()->parent());
 
     LayoutObject& foreignObjectWithOpacity = *document().getElementById("foreignObjectWithOpacity")->layoutObject();
-    ObjectPaintProperties* foreignObjectWithOpacityProperties = foreignObjectWithOpacity.objectPaintProperties();
+    const ObjectPaintProperties* foreignObjectWithOpacityProperties = foreignObjectWithOpacity.objectPaintProperties();
     EXPECT_EQ(0.4f, foreignObjectWithOpacityProperties->effect()->opacity());
     EXPECT_EQ(svgRootWithOpacityProperties->effect(), foreignObjectWithOpacityProperties->effect()->parent());
 
     LayoutObject& spanWithOpacity = *document().getElementById("spanWithOpacity")->layoutObject();
-    ObjectPaintProperties* spanWithOpacityProperties = spanWithOpacity.objectPaintProperties();
+    const ObjectPaintProperties* spanWithOpacityProperties = spanWithOpacity.objectPaintProperties();
     EXPECT_EQ(0.5f, spanWithOpacityProperties->effect()->opacity());
     EXPECT_EQ(foreignObjectWithOpacityProperties->effect(), spanWithOpacityProperties->effect()->parent());
 }
@@ -425,7 +425,7 @@
         "</svg>");
 
     LayoutObject& svgRootWith3dTransform = *document().getElementById("svgRootWith3dTransform")->layoutObject();
-    ObjectPaintProperties* svgRootWith3dTransformProperties = svgRootWith3dTransform.objectPaintProperties();
+    const ObjectPaintProperties* svgRootWith3dTransformProperties = svgRootWith3dTransform.objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), svgRootWith3dTransformProperties->transform()->matrix());
     EXPECT_EQ(FloatPoint3D(50, 50, 0), svgRootWith3dTransformProperties->transform()->origin());
     EXPECT_EQ(svgRootWith3dTransformProperties->paintOffsetTranslation(), svgRootWith3dTransformProperties->transform()->parent());
@@ -433,7 +433,7 @@
     EXPECT_EQ(document().view()->scrollTranslation(), svgRootWith3dTransformProperties->paintOffsetTranslation()->parent());
 
     LayoutObject& rectWith2dTransform = *document().getElementById("rectWith2dTransform")->layoutObject();
-    ObjectPaintProperties* rectWith2dTransformProperties = rectWith2dTransform.objectPaintProperties();
+    const ObjectPaintProperties* rectWith2dTransformProperties = rectWith2dTransform.objectPaintProperties();
     TransformationMatrix matrix;
     matrix.translate(100, 100);
     matrix.rotate(45);
@@ -465,13 +465,13 @@
         "</svg>");
 
     LayoutObject& svgWithViewBox = *document().getElementById("svgWithViewBox")->layoutObject();
-    ObjectPaintProperties* svgWithViewBoxProperties = svgWithViewBox.objectPaintProperties();
+    const ObjectPaintProperties* svgWithViewBoxProperties = svgWithViewBox.objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), svgWithViewBoxProperties->transform()->matrix());
     EXPECT_EQ(TransformationMatrix().translate(-50, -50), svgWithViewBoxProperties->svgLocalToBorderBoxTransform()->matrix());
     EXPECT_EQ(svgWithViewBoxProperties->svgLocalToBorderBoxTransform()->parent(), svgWithViewBoxProperties->transform());
 
     LayoutObject& rect = *document().getElementById("rect")->layoutObject();
-    ObjectPaintProperties* rectProperties = rect.objectPaintProperties();
+    const ObjectPaintProperties* rectProperties = rect.objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(100, 100), rectProperties->transform()->matrix());
     EXPECT_EQ(svgWithViewBoxProperties->svgLocalToBorderBoxTransform(), rectProperties->transform()->parent());
 }
@@ -483,7 +483,7 @@
         "<svg id='svg' style='margin-left: 50px; margin-top: 25px; width: 100px; height: 100px;' />");
 
     LayoutObject& svg = *document().getElementById("svg")->layoutObject();
-    ObjectPaintProperties* svgProperties = svg.objectPaintProperties();
+    const ObjectPaintProperties* svgProperties = svg.objectPaintProperties();
     // Ensure that a paint offset transform is not unnecessarily emitted.
     EXPECT_EQ(nullptr, svgProperties->paintOffsetTranslation());
     EXPECT_EQ(TransformationMatrix().translate(50, 25), svgProperties->svgLocalToBorderBoxTransform()->matrix());
@@ -502,7 +502,7 @@
         "</svg>");
 
     LayoutObject& svg = *document().getElementById("svg")->layoutObject();
-    ObjectPaintProperties* svgProperties = svg.objectPaintProperties();
+    const ObjectPaintProperties* svgProperties = svg.objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(2, 3), svgProperties->paintOffsetTranslation()->matrix());
     EXPECT_EQ(TransformationMatrix().translate(5, 7), svgProperties->transform()->matrix());
     EXPECT_EQ(TransformationMatrix().translate(11, 11).scale(100.0 / 13.0), svgProperties->svgLocalToBorderBoxTransform()->matrix());
@@ -511,7 +511,7 @@
 
     // Ensure the rect's transform is a child of the local to border box transform.
     LayoutObject& rect = *document().getElementById("rect")->layoutObject();
-    ObjectPaintProperties* rectProperties = rect.objectPaintProperties();
+    const ObjectPaintProperties* rectProperties = rect.objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(17, 19), rectProperties->transform()->matrix());
     EXPECT_EQ(svgProperties->svgLocalToBorderBoxTransform(), rectProperties->transform()->parent());
 }
@@ -527,18 +527,18 @@
         "</svg>");
 
     LayoutObject& svg = *document().getElementById("svg")->layoutObject();
-    ObjectPaintProperties* svgProperties = svg.objectPaintProperties();
+    const ObjectPaintProperties* svgProperties = svg.objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(11, 11), svgProperties->transform()->matrix());
     EXPECT_EQ(TransformationMatrix().scale(2), svgProperties->svgLocalToBorderBoxTransform()->matrix());
 
     LayoutObject& nestedSvg = *document().getElementById("nestedSvg")->layoutObject();
-    ObjectPaintProperties* nestedSvgProperties = nestedSvg.objectPaintProperties();
+    const ObjectPaintProperties* nestedSvgProperties = nestedSvg.objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().scale(10), nestedSvgProperties->transform()->matrix());
     EXPECT_EQ(nullptr, nestedSvgProperties->svgLocalToBorderBoxTransform());
     EXPECT_EQ(svgProperties->svgLocalToBorderBoxTransform(), nestedSvgProperties->transform()->parent());
 
     LayoutObject& rect = *document().getElementById("rect")->layoutObject();
-    ObjectPaintProperties* rectProperties = rect.objectPaintProperties();
+    const ObjectPaintProperties* rectProperties = rect.objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(13, 13), rectProperties->transform()->matrix());
     EXPECT_EQ(nestedSvgProperties->transform(), rectProperties->transform()->parent());
 }
@@ -556,11 +556,11 @@
         "</svg>");
 
     LayoutObject& svgWithTransform = *document().getElementById("svgWithTransform")->layoutObject();
-    ObjectPaintProperties* svgWithTransformProperties = svgWithTransform.objectPaintProperties();
+    const ObjectPaintProperties* svgWithTransformProperties = svgWithTransform.objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), svgWithTransformProperties->transform()->matrix());
 
     LayoutObject& divWithTransform = *document().getElementById("divWithTransform")->layoutObject();
-    ObjectPaintProperties* divWithTransformProperties = divWithTransform.objectPaintProperties();
+    const ObjectPaintProperties* divWithTransformProperties = divWithTransform.objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate3d(3, 4, 5), divWithTransformProperties->transform()->matrix());
     // Ensure the div's transform node is a child of the svg's transform node.
     EXPECT_EQ(svgWithTransformProperties->transform(), divWithTransformProperties->transform()->parent());
@@ -581,16 +581,16 @@
         "</svg>");
 
     LayoutObject& svg = *document().getElementById("svg")->layoutObject();
-    ObjectPaintProperties* svgProperties = svg.objectPaintProperties();
+    const ObjectPaintProperties* svgProperties = svg.objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), svgProperties->transform()->matrix());
 
     LayoutObject& container = *document().getElementById("container")->layoutObject();
-    ObjectPaintProperties* containerProperties = container.objectPaintProperties();
+    const ObjectPaintProperties* containerProperties = container.objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(20, 30), containerProperties->transform()->matrix());
     EXPECT_EQ(svgProperties->transform(), containerProperties->transform()->parent());
 
     Element* fixed = document().getElementById("fixed");
-    ObjectPaintProperties* fixedProperties = fixed->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* fixedProperties = fixed->layoutObject()->objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(200, 150), fixedProperties->paintOffsetTranslation()->matrix());
     // Ensure the fixed position element is rooted at the nearest transform container.
     EXPECT_EQ(containerProperties->transform(), fixedProperties->paintOffsetTranslation()->parent());
@@ -612,7 +612,7 @@
 
     FrameView* frameView = document().view();
     LayoutObject& button = *document().getElementById("button")->layoutObject();
-    ObjectPaintProperties* buttonProperties = button.objectPaintProperties();
+    const ObjectPaintProperties* buttonProperties = button.objectPaintProperties();
     EXPECT_EQ(frameView->scrollTranslation(), buttonProperties->overflowClip()->localTransformSpace());
     EXPECT_EQ(FloatRoundedRect(5, 5, 335, 113), buttonProperties->overflowClip()->clipRect());
     EXPECT_EQ(frameView->contentClip(), buttonProperties->overflowClip()->parent());
@@ -640,7 +640,7 @@
 
     FrameView* frameView = document().view();
     LayoutObject& div = *document().getElementById("div")->layoutObject();
-    ObjectPaintProperties* divProperties = div.objectPaintProperties();
+    const ObjectPaintProperties* divProperties = div.objectPaintProperties();
     EXPECT_EQ(frameView->scrollTranslation(), divProperties->overflowClip()->localTransformSpace());
     // The overflow clip rect includes only the padding box.
     // padding box = border box(500+60+50, 400+45+55) - border outset(60+50, 45+55) - scrollbars(15, 15)
@@ -674,11 +674,11 @@
     document().view()->updateAllLifecyclePhases();
 
     LayoutObject& divWithTransform = *document().getElementById("divWithTransform")->layoutObject();
-    ObjectPaintProperties* divWithTransformProperties = divWithTransform.objectPaintProperties();
+    const ObjectPaintProperties* divWithTransformProperties = divWithTransform.objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), divWithTransformProperties->transform()->matrix());
 
     LayoutObject* innerDivWithTransform = frameDocument.getElementById("transform")->layoutObject();
-    ObjectPaintProperties* innerDivWithTransformProperties = innerDivWithTransform->objectPaintProperties();
+    const ObjectPaintProperties* innerDivWithTransformProperties = innerDivWithTransform->objectPaintProperties();
     auto* innerDivTransform = innerDivWithTransformProperties->transform();
     EXPECT_EQ(TransformationMatrix().translate3d(4, 5, 6), innerDivTransform->matrix());
 
@@ -751,9 +751,9 @@
     );
 
     LayoutObject& scroller = *document().getElementById("scroller")->layoutObject();
-    ObjectPaintProperties* scrollerProperties = scroller.objectPaintProperties();
+    const ObjectPaintProperties* scrollerProperties = scroller.objectPaintProperties();
     LayoutObject& child = *document().getElementById("child")->layoutObject();
-    ObjectPaintProperties* childProperties = child.objectPaintProperties();
+    const ObjectPaintProperties* childProperties = child.objectPaintProperties();
 
     EXPECT_EQ(scrollerProperties->overflowClip(), childProperties->localBorderBoxProperties()->propertyTreeState.clip);
     EXPECT_EQ(scrollerProperties->scrollTranslation(), childProperties->localBorderBoxProperties()->propertyTreeState.transform);
@@ -776,9 +776,9 @@
 
     FrameView* frameView = document().view();
     LayoutObject& scroller = *document().getElementById("scroller")->layoutObject();
-    ObjectPaintProperties* scrollerProperties = scroller.objectPaintProperties();
+    const ObjectPaintProperties* scrollerProperties = scroller.objectPaintProperties();
     LayoutObject& child = *document().getElementById("child")->layoutObject();
-    ObjectPaintProperties* childProperties = child.objectPaintProperties();
+    const ObjectPaintProperties* childProperties = child.objectPaintProperties();
 
     EXPECT_EQ(frameView->contentClip(), childProperties->localBorderBoxProperties()->propertyTreeState.clip);
     EXPECT_EQ(frameView->scrollTranslation(), childProperties->localBorderBoxProperties()->propertyTreeState.transform);
@@ -819,7 +819,7 @@
 
     FrameView* frameView = document().view();
     LayoutObject& target = *document().getElementById("target")->layoutObject();
-    ObjectPaintProperties* targetProperties = target.objectPaintProperties();
+    const ObjectPaintProperties* targetProperties = target.objectPaintProperties();
 
     EXPECT_EQ(LayoutPoint(170, 170), targetProperties->localBorderBoxProperties()->paintOffset);
     EXPECT_EQ(frameView->scrollTranslation(), targetProperties->localBorderBoxProperties()->propertyTreeState.transform);
@@ -854,13 +854,13 @@
     FrameView* frameView = document().view();
 
     LayoutObject& clip = *document().getElementById("clip")->layoutObject();
-    ObjectPaintProperties* clipProperties = clip.objectPaintProperties();
+    const ObjectPaintProperties* clipProperties = clip.objectPaintProperties();
     EXPECT_EQ(frameView->contentClip(), clipProperties->cssClip()->parent());
     EXPECT_EQ(frameView->scrollTranslation(), clipProperties->cssClip()->localTransformSpace());
     EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->cssClip()->clipRect());
 
     LayoutObject& fixed = *document().getElementById("fixed")->layoutObject();
-    ObjectPaintProperties* fixedProperties = fixed.objectPaintProperties();
+    const ObjectPaintProperties* fixedProperties = fixed.objectPaintProperties();
     EXPECT_EQ(clipProperties->cssClip(), fixedProperties->localBorderBoxProperties()->propertyTreeState.clip);
     EXPECT_EQ(frameView->preTranslation(), fixedProperties->localBorderBoxProperties()->propertyTreeState.transform->parent());
     EXPECT_EQ(TransformationMatrix().translate(654, 321), fixedProperties->localBorderBoxProperties()->propertyTreeState.transform->matrix());
@@ -905,12 +905,12 @@
     FrameView* frameView = document().view();
 
     LayoutObject& overflow = *document().getElementById("overflow")->layoutObject();
-    ObjectPaintProperties* overflowProperties = overflow.objectPaintProperties();
+    const ObjectPaintProperties* overflowProperties = overflow.objectPaintProperties();
     EXPECT_EQ(frameView->contentClip(), overflowProperties->overflowClip()->parent());
     EXPECT_EQ(frameView->scrollTranslation(), overflowProperties->scrollTranslation()->parent());
 
     LayoutObject& clip = *document().getElementById("clip")->layoutObject();
-    ObjectPaintProperties* clipProperties = clip.objectPaintProperties();
+    const ObjectPaintProperties* clipProperties = clip.objectPaintProperties();
     EXPECT_EQ(overflowProperties->overflowClip(), clipProperties->cssClip()->parent());
     EXPECT_EQ(overflowProperties->scrollTranslation(), clipProperties->cssClip()->localTransformSpace());
     EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->cssClip()->clipRect());
@@ -919,7 +919,7 @@
     EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->cssClipFixedPosition()->clipRect());
 
     LayoutObject& fixed = *document().getElementById("fixed")->layoutObject();
-    ObjectPaintProperties* fixedProperties = fixed.objectPaintProperties();
+    const ObjectPaintProperties* fixedProperties = fixed.objectPaintProperties();
     EXPECT_EQ(clipProperties->cssClipFixedPosition(), fixedProperties->localBorderBoxProperties()->propertyTreeState.clip);
     EXPECT_EQ(frameView->preTranslation(), fixedProperties->localBorderBoxProperties()->propertyTreeState.transform->parent());
     EXPECT_EQ(TransformationMatrix().translate(654, 321), fixedProperties->localBorderBoxProperties()->propertyTreeState.transform->matrix());
@@ -952,11 +952,11 @@
         "</div>"
     );
 
-    ObjectPaintProperties* aProperties = document().getElementById("a")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* aProperties = document().getElementById("a")->layoutObject()->objectPaintProperties();
     LayoutPoint aPaintOffset = LayoutPoint(FloatPoint(0.1, 0.3));
     EXPECT_EQ(aPaintOffset, aProperties->localBorderBoxProperties()->paintOffset);
 
-    ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
     LayoutPoint bPaintOffset = aPaintOffset + LayoutPoint(FloatPoint(0.5, 11.1));
     EXPECT_EQ(bPaintOffset, bProperties->localBorderBoxProperties()->paintOffset);
 }
@@ -975,7 +975,7 @@
         "</div>"
     );
 
-    ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate3d(0, 0, 0), bProperties->transform()->matrix());
     // The paint offset transform should be snapped from (0.3,0.3) to (0,0).
     EXPECT_EQ(TransformationMatrix().translate(0, 0), bProperties->transform()->parent()->matrix());
@@ -985,7 +985,7 @@
 
     // c should be painted starting at subpixelAccumulation + (0.1,0.1) = (0.4,0.4).
     LayoutPoint cPaintOffset = subpixelAccumulation + LayoutPoint(FloatPoint(0.1, 0.1));
-    ObjectPaintProperties* cProperties = document().getElementById("c")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* cProperties = document().getElementById("c")->layoutObject()->objectPaintProperties();
     EXPECT_EQ(cPaintOffset, cProperties->localBorderBoxProperties()->paintOffset);
 }
 
@@ -1003,7 +1003,7 @@
         "</div>"
     );
 
-    ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate3d(0, 0, 0), bProperties->transform()->matrix());
     // The paint offset transform should be snapped from (0.7,0.7) to (1,1).
     EXPECT_EQ(TransformationMatrix().translate(1, 1), bProperties->transform()->parent()->matrix());
@@ -1013,7 +1013,7 @@
 
     // c should be painted starting at subpixelAccumulation + (0.7,0.7) = (0.4,0.4).
     LayoutPoint cPaintOffset = subpixelAccumulation + LayoutPoint(FloatPoint(0.7, 0.7));
-    ObjectPaintProperties* cProperties = document().getElementById("c")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* cProperties = document().getElementById("c")->layoutObject()->objectPaintProperties();
     EXPECT_EQ(cPaintOffset, cProperties->localBorderBoxProperties()->paintOffset);
 }
 
@@ -1033,7 +1033,7 @@
         "</div>"
     );
 
-    ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate3d(5, 7, 0), bProperties->transform()->matrix());
     // The paint offset transform should be snapped from (0.7,0.7) to (1,1).
     EXPECT_EQ(TransformationMatrix().translate(1, 1), bProperties->transform()->parent()->matrix());
@@ -1041,7 +1041,7 @@
     LayoutPoint subpixelAccumulation = LayoutPoint(LayoutPoint(FloatPoint(0.7, 0.7)) - LayoutPoint(1, 1));
     EXPECT_EQ(subpixelAccumulation, bProperties->localBorderBoxProperties()->paintOffset);
 
-    ObjectPaintProperties* cProperties = document().getElementById("c")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* cProperties = document().getElementById("c")->layoutObject()->objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate3d(11, 13, 0), cProperties->transform()->matrix());
     // The paint offset should be (-0.3,-0.3) but the paint offset transform should still be at
     // (0,0) because it should be snapped.
@@ -1051,7 +1051,7 @@
 
     // d should be painted starting at subpixelAccumulation + (0.7,0.7) = (0.4,0.4).
     LayoutPoint dPaintOffset = subpixelAccumulation + LayoutPoint(FloatPoint(0.7, 0.7));
-    ObjectPaintProperties* dProperties = document().getElementById("d")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* dProperties = document().getElementById("d")->layoutObject()->objectPaintProperties();
     EXPECT_EQ(dPaintOffset, dProperties->localBorderBoxProperties()->paintOffset);
 }
 
@@ -1070,7 +1070,7 @@
         "</div>"
     );
 
-    ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(0, 0), bProperties->transform()->matrix());
     // The paint offset transform should be snapped from (0.7,0) to (1,0).
     EXPECT_EQ(TransformationMatrix().translate(1, 0), bProperties->transform()->parent()->matrix());
@@ -1078,13 +1078,13 @@
     LayoutPoint subpixelAccumulation = LayoutPoint(LayoutPoint(FloatPoint(0.7, 0)) - LayoutPoint(1, 0));
     EXPECT_EQ(subpixelAccumulation, bProperties->localBorderBoxProperties()->paintOffset);
 
-    ObjectPaintProperties* fixedProperties = document().getElementById("fixed")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* fixedProperties = document().getElementById("fixed")->layoutObject()->objectPaintProperties();
     // The residual subpixel adjustment should still be (-0.3,0).
     EXPECT_EQ(subpixelAccumulation, fixedProperties->localBorderBoxProperties()->paintOffset);
 
     // d should be painted starting at subpixelAccumulation + (0.7,0) = (0.4,0).
     LayoutPoint dPaintOffset = subpixelAccumulation + LayoutPoint(FloatPoint(0.7, 0));
-    ObjectPaintProperties* dProperties = document().getElementById("d")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* dProperties = document().getElementById("d")->layoutObject()->objectPaintProperties();
     EXPECT_EQ(dPaintOffset, dProperties->localBorderBoxProperties()->paintOffset);
 }
 
@@ -1096,13 +1096,13 @@
         "</svg>");
 
     LayoutObject& svgWithTransform = *document().getElementById("svg")->layoutObject();
-    ObjectPaintProperties* svgWithTransformProperties = svgWithTransform.objectPaintProperties();
+    const ObjectPaintProperties* svgWithTransformProperties = svgWithTransform.objectPaintProperties();
     EXPECT_EQ(TransformationMatrix(), svgWithTransformProperties->transform()->matrix());
     EXPECT_EQ(LayoutPoint(FloatPoint(0.1, 0)), svgWithTransformProperties->localBorderBoxProperties()->paintOffset);
     EXPECT_EQ(nullptr, svgWithTransformProperties->svgLocalToBorderBoxTransform());
 
     LayoutObject& rectWithTransform = *document().getElementById("rect")->layoutObject();
-    ObjectPaintProperties* rectWithTransformProperties = rectWithTransform.objectPaintProperties();
+    const ObjectPaintProperties* rectWithTransformProperties = rectWithTransform.objectPaintProperties();
     EXPECT_EQ(TransformationMatrix().translate(1, 1), rectWithTransformProperties->transform()->matrix());
 
     // Ensure there is no PaintOffset transform between the rect and the svg's transform.
@@ -1113,7 +1113,7 @@
 {
     setBodyInnerHTML("<div style=\"transform: translateZ(0)\"></div>");
 
-    ObjectPaintProperties* properties = document().body()->firstChild()->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* properties = document().body()->firstChild()->layoutObject()->objectPaintProperties();
     ASSERT_TRUE(properties->transform());
     EXPECT_FALSE(properties->transform()->hasRenderingContext());
 }
@@ -1126,8 +1126,8 @@
         "  <div id=\"b\" style=\"transform: translateZ(0)\"></div>"
         "</div>");
 
-    ObjectPaintProperties* aProperties = document().getElementById("a")->layoutObject()->objectPaintProperties();
-    ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* aProperties = document().getElementById("a")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
     ASSERT_TRUE(aProperties->transform() && bProperties->transform());
     EXPECT_NE(aProperties->transform(), bProperties->transform());
     EXPECT_TRUE(aProperties->transform()->hasRenderingContext());
@@ -1145,8 +1145,8 @@
         "</div>");
 
     ASSERT_FALSE(document().getElementById("a")->layoutObject()->styleRef().preserves3D());
-    ObjectPaintProperties* aProperties = document().getElementById("a")->layoutObject()->objectPaintProperties();
-    ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* aProperties = document().getElementById("a")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
     ASSERT_TRUE(aProperties->transform() && bProperties->transform());
 
     // #a should participate in a rendering context (due to its parent), but its
@@ -1167,8 +1167,8 @@
         "</div>");
 
     ASSERT_FALSE(document().getElementById("a")->layoutObject()->styleRef().preserves3D());
-    ObjectPaintProperties* aProperties = document().getElementById("a")->layoutObject()->objectPaintProperties();
-    ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* aProperties = document().getElementById("a")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
     ASSERT_TRUE(aProperties->transform() && bProperties->transform());
 
     // #a should participate in a rendering context (due to its parent). Its
@@ -1249,8 +1249,8 @@
         "  <div id=\"b\" style=\"transform: translateZ(0)\"></div>"
         "</div>");
 
-    ObjectPaintProperties* aProperties = document().getElementById("a")->layoutObject()->objectPaintProperties();
-    ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* aProperties = document().getElementById("a")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
     const TransformPaintPropertyNode* aPerspective = aProperties->perspective();
     ASSERT_TRUE(aPerspective);
     const TransformPaintPropertyNode* bTransform = bProperties->transform();
@@ -1269,8 +1269,8 @@
         "  <div id=\"b\" style=\"transform: translateZ(0)\"></div>"
         "</div>");
 
-    ObjectPaintProperties* aProperties = document().getElementById("a")->layoutObject()->objectPaintProperties();
-    ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* aProperties = document().getElementById("a")->layoutObject()->objectPaintProperties();
+    const ObjectPaintProperties* bProperties = document().getElementById("b")->layoutObject()->objectPaintProperties();
     const TransformPaintPropertyNode* aPerspective = aProperties->perspective();
     ASSERT_TRUE(aPerspective);
     EXPECT_FALSE(aPerspective->hasRenderingContext());
@@ -1289,18 +1289,18 @@
         "</div>");
 
     Element* a = document().getElementById("a");
-    ObjectPaintProperties* aProperties = a->layoutObject()->objectPaintProperties();
-    TransformPaintPropertyNode* aTransformNode = aProperties->transform();
+    const ObjectPaintProperties* aProperties = a->layoutObject()->objectPaintProperties();
+    const TransformPaintPropertyNode* aTransformNode = aProperties->transform();
     EXPECT_EQ(TransformationMatrix().translate(33, 44), aTransformNode->matrix());
 
     Element* b = document().getElementById("b");
-    ObjectPaintProperties* bProperties = b->layoutObject()->objectPaintProperties();
-    TransformPaintPropertyNode* bTransformNode = bProperties->transform();
+    const ObjectPaintProperties* bProperties = b->layoutObject()->objectPaintProperties();
+    const TransformPaintPropertyNode* bTransformNode = bProperties->transform();
     EXPECT_EQ(TransformationMatrix().translate(55, 66), bTransformNode->matrix());
 
     Element* c = document().getElementById("c");
-    ObjectPaintProperties* cProperties = c->layoutObject()->objectPaintProperties();
-    TransformPaintPropertyNode* cTransformNode = cProperties->transform();
+    const ObjectPaintProperties* cProperties = c->layoutObject()->objectPaintProperties();
+    const TransformPaintPropertyNode* cTransformNode = cProperties->transform();
     EXPECT_EQ(TransformationMatrix().translate(77, 88), cTransformNode->matrix());
 
     // Change transform of b. B's transform node should be a new node with the new value,
diff --git a/third_party/WebKit/Source/core/svg/SVGAElement.cpp b/third_party/WebKit/Source/core/svg/SVGAElement.cpp
index a3ad28ce..f88c14c 100644
--- a/third_party/WebKit/Source/core/svg/SVGAElement.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGAElement.cpp
@@ -27,6 +27,7 @@
 #include "core/dom/Attr.h"
 #include "core/dom/Attribute.h"
 #include "core/dom/Document.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/events/KeyboardEvent.h"
 #include "core/events/MouseEvent.h"
 #include "core/frame/FrameHost.h"
diff --git a/third_party/WebKit/Source/core/svg/graphics/SVGImage.cpp b/third_party/WebKit/Source/core/svg/graphics/SVGImage.cpp
index a059f7f..6b987b7 100644
--- a/third_party/WebKit/Source/core/svg/graphics/SVGImage.cpp
+++ b/third_party/WebKit/Source/core/svg/graphics/SVGImage.cpp
@@ -479,13 +479,13 @@
     }
 }
 
-bool SVGImage::dataChanged(bool allDataReceived)
+Image::SizeAvailability SVGImage::dataChanged(bool allDataReceived)
 {
     TRACE_EVENT0("blink", "SVGImage::dataChanged");
 
     // Don't do anything if is an empty image.
     if (!data()->size())
-        return true;
+        return SizeAvailable;
 
     if (allDataReceived) {
         // SVGImage will fire events (and the default C++ handlers run) but doesn't
@@ -499,7 +499,7 @@
         if (m_page) {
             toLocalFrame(m_page->mainFrame())->loader().load(FrameLoadRequest(0, blankURL(), SubstituteData(data(), AtomicString("image/svg+xml"),
                 AtomicString("UTF-8"), KURL(), ForceSynchronousLoad)));
-            return true;
+            return SizeAvailable;
         }
 
         Page::PageClients pageClients;
@@ -559,7 +559,7 @@
         m_intrinsicSize = roundedIntSize(concreteObjectSize(FloatSize(LayoutReplaced::defaultWidth, LayoutReplaced::defaultHeight)));
     }
 
-    return m_page;
+    return m_page ? SizeAvailable : SizeUnavailable;
 }
 
 String SVGImage::filenameExtension() const
diff --git a/third_party/WebKit/Source/core/svg/graphics/SVGImage.h b/third_party/WebKit/Source/core/svg/graphics/SVGImage.h
index 7e066d4..6a58f33 100644
--- a/third_party/WebKit/Source/core/svg/graphics/SVGImage.h
+++ b/third_party/WebKit/Source/core/svg/graphics/SVGImage.h
@@ -96,7 +96,7 @@
     IntSize containerSize() const;
     bool usesContainerSize() const override { return true; }
 
-    bool dataChanged(bool allDataReceived) override;
+    SizeAvailability dataChanged(bool allDataReceived) override;
 
     // FIXME: SVGImages are underreporting decoded sizes and will be unable
     // to prune because these functions are not implemented yet.
diff --git a/third_party/WebKit/Source/devtools/devtools.gypi b/third_party/WebKit/Source/devtools/devtools.gypi
index 8820cfe..7d9e2180 100644
--- a/third_party/WebKit/Source/devtools/devtools.gypi
+++ b/third_party/WebKit/Source/devtools/devtools.gypi
@@ -170,6 +170,7 @@
             'front_end/sdk/ResourceTreeModel.js',
             'front_end/sdk/RuntimeModel.js',
             'front_end/sdk/Script.js',
+            'front_end/sdk/SecurityOriginManager.js',
             'front_end/sdk/ServiceWorkerCacheModel.js',
             'front_end/sdk/ServiceWorkerManager.js',
             'front_end/sdk/SourceMap.js',
@@ -256,7 +257,6 @@
             'front_end/ui/radioButton.css',
             'front_end/ui/reportView.css',
             'front_end/ui/searchableView.css',
-            'front_end/ui/sidebarPane.css',
             'front_end/ui/softContextMenu.css',
             'front_end/ui/smallIcon.css',
             'front_end/ui/splitWidget.css',
@@ -267,6 +267,7 @@
             'front_end/ui/textButton.css',
             'front_end/ui/textPrompt.css',
             'front_end/ui/treeoutline.css',
+            'front_end/ui/viewContainers.css',
             'front_end/ui/ActionRegistry.js',
             'front_end/ui/ColorSwatch.js',
             'front_end/ui/Context.js',
@@ -294,7 +295,6 @@
             'front_end/ui/SearchableView.js',
             'front_end/ui/SettingsUI.js',
             'front_end/ui/ShortcutRegistry.js',
-            'front_end/ui/SidebarPane.js',
             'front_end/ui/SidebarTreeElement.js',
             'front_end/ui/SoftContextMenu.js',
             'front_end/ui/SplitWidget.js',
@@ -307,6 +307,7 @@
             'front_end/ui/TextPrompt.js',
             'front_end/ui/ThrottledView.js',
             'front_end/ui/UIUtils.js',
+            'front_end/ui/ViewContainers.js',
             'front_end/ui/ViewportControl.js',
             'front_end/ui/Widget.js',
             'front_end/ui/ZoomManager.js',
diff --git a/third_party/WebKit/Source/devtools/front_end/accessibility/AccessibilitySidebarView.js b/third_party/WebKit/Source/devtools/front_end/accessibility/AccessibilitySidebarView.js
index b525281..25c78783 100644
--- a/third_party/WebKit/Source/devtools/front_end/accessibility/AccessibilitySidebarView.js
+++ b/third_party/WebKit/Source/devtools/front_end/accessibility/AccessibilitySidebarView.js
@@ -11,7 +11,10 @@
     WebInspector.ThrottledView.call(this, WebInspector.UIString("Accessibility"));
     this._axNodeSubPane = null;
     this._node = null;
-    this._sidebarPaneStack = null;
+    this._sidebarPaneStack = new WebInspector.View.ExpandableStackContainer();
+    this._axNodeSubPane = new WebInspector.AXNodeSubPane();
+    this._sidebarPaneStack.appendView(this._axNodeSubPane, true);
+    this._sidebarPaneStack.show(this.element);
     WebInspector.context.addFlavorChangeListener(WebInspector.DOMNode, this._pullNode, this);
     this._pullNode();
 }
@@ -53,16 +56,7 @@
     {
         WebInspector.ThrottledView.prototype.wasShown.call(this);
 
-        if (!this._sidebarPaneStack) {
-            this._axNodeSubPane = new WebInspector.AXNodeSubPane();
-            this._axNodeSubPane.setNode(this.node());
-            this._axNodeSubPane.show(this.element);
-
-            this._sidebarPaneStack = new WebInspector.SidebarPaneStack();
-            this._sidebarPaneStack.element.classList.add("flex-auto");
-            this._sidebarPaneStack.show(this.element);
-            this._sidebarPaneStack.addPane(this._axNodeSubPane);
-        }
+        this._axNodeSubPane.setNode(this.node());
 
         WebInspector.targetManager.addModelListener(WebInspector.DOMModel, WebInspector.DOMModel.Events.AttrModified, this._onAttrChange, this);
         WebInspector.targetManager.addModelListener(WebInspector.DOMModel, WebInspector.DOMModel.Events.AttrRemoved, this._onAttrChange, this);
@@ -84,8 +78,7 @@
     _pullNode: function()
     {
         this._node = WebInspector.context.flavor(WebInspector.DOMNode);
-        if (this._axNodeSubPane)
-            this._axNodeSubPane.setNode(this._node);
+        this._axNodeSubPane.setNode(this._node);
         this.update();
     },
 
@@ -164,7 +157,7 @@
      */
     createInfo: function(textContent, className)
     {
-        var classNameOrDefault = className || "info";
+        var classNameOrDefault = className || "gray-info-message";
         var info = this.element.createChild("div", classNameOrDefault);
         info.textContent = textContent;
         return info;
diff --git a/third_party/WebKit/Source/devtools/front_end/audits/AuditResultView.js b/third_party/WebKit/Source/devtools/front_end/audits/AuditResultView.js
index aedc51f8..b496b3b 100644
--- a/third_party/WebKit/Source/devtools/front_end/audits/AuditResultView.js
+++ b/third_party/WebKit/Source/devtools/front_end/audits/AuditResultView.js
@@ -30,29 +30,6 @@
 
 /**
  * @constructor
- * @extends {WebInspector.SidebarPaneStack}
- * @param {!Array.<!WebInspector.AuditCategoryResult>} categoryResults
- */
-WebInspector.AuditResultView = function(categoryResults)
-{
-    WebInspector.SidebarPaneStack.call(this);
-    this.setMinimumSize(100, 25);
-    this.element.classList.add("audit-result-view");
-
-    function categorySorter(a, b) {
-        return (a.title || "").localeCompare(b.title || "");
-    }
-    categoryResults.sort(categorySorter);
-    for (var i = 0; i < categoryResults.length; ++i)
-        this.addPane(new WebInspector.AuditCategoryResultPane(categoryResults[i]));
-}
-
-WebInspector.AuditResultView.prototype = {
-    __proto__: WebInspector.SidebarPaneStack.prototype
-}
-
-/**
- * @constructor
  * @extends {WebInspector.View}
  * @param {!WebInspector.AuditCategoryResult} categoryResult
  */
@@ -80,7 +57,7 @@
         var treeElement = this._appendResult(this._treeOutline.rootElement(), ruleResult, ruleResult.severity);
         treeElement.listItemElement.classList.add("audit-result");
     }
-    this.requestReveal();
+    this.revealWidget();
 }
 
 WebInspector.AuditCategoryResultPane.prototype = {
diff --git a/third_party/WebKit/Source/devtools/front_end/audits/AuditsPanel.js b/third_party/WebKit/Source/devtools/front_end/audits/AuditsPanel.js
index 1a5060a..43a33b9f 100644
--- a/third_party/WebKit/Source/devtools/front_end/audits/AuditsPanel.js
+++ b/third_party/WebKit/Source/devtools/front_end/audits/AuditsPanel.js
@@ -129,9 +129,13 @@
      */
     showResults: function(categoryResults)
     {
-        if (!categoryResults._resultView)
-            categoryResults._resultView = new WebInspector.AuditResultView(categoryResults);
-
+        if (!categoryResults._resultView) {
+            categoryResults.sort((a, b) => (a.title || "").localeCompare(b.title || ""));
+            var resultView = new WebInspector.View.ExpandableStackContainer();
+            for (var i = 0; i < categoryResults.length; ++i)
+                resultView.appendView(new WebInspector.AuditCategoryResultPane(categoryResults[i]), true);
+            categoryResults._resultView = resultView;
+        }
         this.visibleView = categoryResults._resultView;
     },
 
diff --git a/third_party/WebKit/Source/devtools/front_end/audits/auditResultTree.css b/third_party/WebKit/Source/devtools/front_end/audits/auditResultTree.css
index c2a5fd4..c618aeb 100644
--- a/third_party/WebKit/Source/devtools/front_end/audits/auditResultTree.css
+++ b/third_party/WebKit/Source/devtools/front_end/audits/auditResultTree.css
@@ -8,8 +8,8 @@
     background-image: url(Images/toolbarButtonGlyphs.png);
     background-size: 352px 168px;
     display: inline-block;
-    width: 10px;
-    height: 10px;
+    width: 11px;
+    height: 11px;
     position: relative;
     top: 1px;
     margin-right: 4px;
diff --git a/third_party/WebKit/Source/devtools/front_end/audits/auditsPanel.css b/third_party/WebKit/Source/devtools/front_end/audits/auditsPanel.css
index 927d84b..d253cad 100644
--- a/third_party/WebKit/Source/devtools/front_end/audits/auditsPanel.css
+++ b/third_party/WebKit/Source/devtools/front_end/audits/auditsPanel.css
@@ -102,12 +102,6 @@
     width: 14px;
 }
 
-.audit-result-view {
-    overflow: auto;
-    display: block;
-    flex: auto;
-}
-
 .audit-result-tree {
     margin: 0 0 3px;
 }
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings/PresentationConsoleMessageHelper.js b/third_party/WebKit/Source/devtools/front_end/bindings/PresentationConsoleMessageHelper.js
index dafe523..243c155 100644
--- a/third_party/WebKit/Source/devtools/front_end/bindings/PresentationConsoleMessageHelper.js
+++ b/third_party/WebKit/Source/devtools/front_end/bindings/PresentationConsoleMessageHelper.js
@@ -67,7 +67,7 @@
      */
     _consoleMessageAdded: function(message)
     {
-        if (!message.url || !message.isErrorOrWarning())
+        if (!message.isErrorOrWarning())
             return;
 
         var rawLocation = this._rawLocation(message);
@@ -86,14 +86,14 @@
         var debuggerModel = WebInspector.DebuggerModel.fromTarget(message.target());
         if (!debuggerModel)
             return null;
-        var callFrame = message.stackTrace && message.stackTrace.callFrames ? message.stackTrace.callFrames[0] : null;
-        var lineNumber = callFrame ? callFrame.lineNumber : message.line;
-        var columnNumber = callFrame ? callFrame.columnNumber : message.column;
-        if (callFrame)
-            columnNumber = callFrame.columnNumber;
         if (message.scriptId)
-            return debuggerModel.createRawLocationByScriptId(message.scriptId, lineNumber, columnNumber);
-        return debuggerModel.createRawLocationByURL(message.url || "", lineNumber, columnNumber);
+            return debuggerModel.createRawLocationByScriptId(message.scriptId, message.line, message.column);
+        var callFrame = message.stackTrace && message.stackTrace.callFrames ? message.stackTrace.callFrames[0] : null;
+        if (callFrame)
+            return debuggerModel.createRawLocationByScriptId(callFrame.scriptId, callFrame.lineNumber, callFrame.columnNumber);
+        if (message.url)
+            return debuggerModel.createRawLocationByURL(message.url, message.line, message.column);
+        return null;
     },
 
     /**
diff --git a/third_party/WebKit/Source/devtools/front_end/components/BreakpointsSidebarPaneBase.js b/third_party/WebKit/Source/devtools/front_end/components/BreakpointsSidebarPaneBase.js
index a72bfd4..07c6b5f 100644
--- a/third_party/WebKit/Source/devtools/front_end/components/BreakpointsSidebarPaneBase.js
+++ b/third_party/WebKit/Source/devtools/front_end/components/BreakpointsSidebarPaneBase.js
@@ -42,7 +42,7 @@
     this.listElement.className = "breakpoint-list";
 
     this.emptyElement = createElement("div");
-    this.emptyElement.className = "info";
+    this.emptyElement.className = "gray-info-message";
     this.emptyElement.textContent = WebInspector.UIString("No Breakpoints");
 
     this.element.appendChild(this.emptyElement);
diff --git a/third_party/WebKit/Source/devtools/front_end/components/DOMBreakpointsSidebarPane.js b/third_party/WebKit/Source/devtools/front_end/components/DOMBreakpointsSidebarPane.js
index 815b5f2f..28a9d83 100644
--- a/third_party/WebKit/Source/devtools/front_end/components/DOMBreakpointsSidebarPane.js
+++ b/third_party/WebKit/Source/devtools/front_end/components/DOMBreakpointsSidebarPane.js
@@ -348,7 +348,7 @@
         var element = this._breakpointElements[breakpointId];
         if (!element)
             return;
-        this.requestReveal();
+        this.revealWidget();
         element.classList.add("breakpoint-hit");
         this._highlightedElement = element;
     },
diff --git a/third_party/WebKit/Source/devtools/front_end/components/EventListenersView.js b/third_party/WebKit/Source/devtools/front_end/components/EventListenersView.js
index 83ef420..13a48968 100644
--- a/third_party/WebKit/Source/devtools/front_end/components/EventListenersView.js
+++ b/third_party/WebKit/Source/devtools/front_end/components/EventListenersView.js
@@ -23,7 +23,7 @@
     this._treeOutline.setComparator(WebInspector.EventListenersTreeElement.comparator);
     this._treeOutline.element.classList.add("monospace");
     this._element.appendChild(this._treeOutline.element)
-    this._emptyHolder = createElementWithClass("div", "info");
+    this._emptyHolder = createElementWithClass("div", "gray-info-message");
     this._emptyHolder.textContent = WebInspector.UIString("No Event Listeners");
     this._linkifier = new WebInspector.Linkifier();
     /** @type {!Map<string, !WebInspector.EventListenersTreeElement>} */
diff --git a/third_party/WebKit/Source/devtools/front_end/components/ObjectPropertiesSection.js b/third_party/WebKit/Source/devtools/front_end/components/ObjectPropertiesSection.js
index 2304c86..6fd85ce 100644
--- a/third_party/WebKit/Source/devtools/front_end/components/ObjectPropertiesSection.js
+++ b/third_party/WebKit/Source/devtools/front_end/components/ObjectPropertiesSection.js
@@ -600,7 +600,7 @@
 {
     if (treeNode.childCount())
         return;
-    var title = createElementWithClass("div", "info");
+    var title = createElementWithClass("div", "gray-info-message");
     title.textContent = emptyPlaceholder || WebInspector.UIString("No Properties");
     var infoElement = new TreeElement(title);
     treeNode.appendChild(infoElement);
diff --git a/third_party/WebKit/Source/devtools/front_end/devtools.js b/third_party/WebKit/Source/devtools/front_end/devtools.js
index f2a1325..5e83ae3 100644
--- a/third_party/WebKit/Source/devtools/front_end/devtools.js
+++ b/third_party/WebKit/Source/devtools/front_end/devtools.js
@@ -1000,6 +1000,8 @@
             location.search = "";
         if (name === "remoteBase" && !remoteBaseRegexp.test(value))
             location.search = "";
+        if (name === "settings")
+            location.search = "";
     }
 }
 
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/ElementsPanel.js b/third_party/WebKit/Source/devtools/front_end/elements/ElementsPanel.js
index 6c4c803..ed0d4be 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements/ElementsPanel.js
+++ b/third_party/WebKit/Source/devtools/front_end/elements/ElementsPanel.js
@@ -221,7 +221,7 @@
             this._elementsSidebarViews.push(view);
 
             if (this.sidebarPaneView)
-                this.sidebarPaneView.addPane(view);
+                this.sidebarPaneView.appendView(view);
         }
     },
 
@@ -907,7 +907,7 @@
                 showMetrics.call(this, false);
         }
 
-        this.sidebarPaneView = new WebInspector.SidebarTabbedPane();
+        this.sidebarPaneView = new WebInspector.View.TabbedPaneContainer();
         this.sidebarPaneView.element.addEventListener("contextmenu", this._sidebarContextMenuEventFired.bind(this), false);
         if (this._popoverHelper)
             this._popoverHelper.hidePopover();
@@ -918,8 +918,7 @@
             this._splitWidget.installResizer(this.sidebarPaneView.headerElement());
 
             var compositePane = new WebInspector.View(WebInspector.UIString("Styles"));
-            compositePane.element.classList.add("composite");
-            compositePane.element.classList.add("fill");
+            compositePane.element.classList.add("flex-auto");
 
             var splitWidget = new WebInspector.SplitWidget(true, true, "stylesPaneSplitViewState", 215);
             splitWidget.show(compositePane.element);
@@ -928,29 +927,29 @@
             splitWidget.setSidebarWidget(computedStylePanesWrapper);
 
             computedPane.show(computedStylePanesWrapper.element);
-            this.sidebarPaneView.addPane(compositePane);
+            this.sidebarPaneView.appendView(compositePane);
         } else {
             var stylesPane = new WebInspector.View(WebInspector.UIString("Styles"));
-            stylesPane.element.classList.add("composite", "fill", "metrics-and-styles");
+            stylesPane.element.classList.add("flex-auto", "metrics-and-styles");
 
             matchedStylesContainer.show(stylesPane.element);
             computedStylePanesWrapper.show(computedPane.element);
 
             this.sidebarPaneView.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected, tabSelected, this);
-            this.sidebarPaneView.addPane(stylesPane);
-            this.sidebarPaneView.addPane(computedPane);
+            this.sidebarPaneView.appendView(stylesPane);
+            this.sidebarPaneView.appendView(computedPane);
         }
 
         this.sidebarPanes.styles.show(matchedStylePanesWrapper.element);
         this.sidebarPanes.computedStyle.show(computedStylePanesWrapper.element);
         showMetrics.call(this, horizontally);
 
-        this.sidebarPaneView.addPane(this.sidebarPanes.eventListeners);
-        this.sidebarPaneView.addPane(this.sidebarPanes.domBreakpoints);
-        this.sidebarPaneView.addPane(this.sidebarPanes.properties);
+        this.sidebarPaneView.appendView(this.sidebarPanes.eventListeners);
+        this.sidebarPaneView.appendView(this.sidebarPanes.domBreakpoints);
+        this.sidebarPaneView.appendView(this.sidebarPanes.properties);
 
         for (var sidebarViewWrapper of this._elementsSidebarViews)
-            this.sidebarPaneView.addPane(sidebarViewWrapper);
+            this.sidebarPaneView.appendView(sidebarViewWrapper);
 
         this._extensionSidebarPanesContainer = this.sidebarPaneView;
 
@@ -978,7 +977,7 @@
     _addExtensionSidebarPane: function(pane)
     {
         if (pane.panelName() === this.name)
-            this._extensionSidebarPanesContainer.addPane(pane);
+            this._extensionSidebarPanesContainer.appendView(pane);
     },
 
     __proto__: WebInspector.Panel.prototype
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/StylesSidebarPane.js b/third_party/WebKit/Source/devtools/front_end/elements/StylesSidebarPane.js
index b6a6951e..28eedc23f 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements/StylesSidebarPane.js
+++ b/third_party/WebKit/Source/devtools/front_end/elements/StylesSidebarPane.js
@@ -425,7 +425,7 @@
      */
     _addBlankSection: function(insertAfterSection, styleSheetId, ruleLocation)
     {
-        this.requestReveal();
+        this.revealWidget();
         var node = this.node();
         var blankSection = new WebInspector.BlankStylePropertiesSection(this, insertAfterSection._matchedStyles, node ? WebInspector.DOMPresentationUtils.simpleSelector(node) : "", styleSheetId, ruleLocation, insertAfterSection._style);
 
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/elementsPanel.css b/third_party/WebKit/Source/devtools/front_end/elements/elementsPanel.css
index a268e92..7c2ac95 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements/elementsPanel.css
+++ b/third_party/WebKit/Source/devtools/front_end/elements/elementsPanel.css
@@ -217,7 +217,7 @@
     z-index: 1;
 }
 
-.styles-section .sidebar-pane-closing-brace {
+.sidebar-pane-closing-brace {
     clear: both;
 }
 
@@ -558,10 +558,6 @@
     -webkit-user-drag: auto;
 }
 
-.sidebar-pane.composite {
-    position: absolute;
-}
-
 .metrics {
     border-bottom: 1px solid #ccc;
 }
@@ -579,7 +575,7 @@
     border-bottom: none;
 }
 
-.sidebar-pane.composite .metrics {
+.metrics {
     min-height: 190px;
     display: flex;
     flex-direction: column;
@@ -587,20 +583,13 @@
     -webkit-justify-content: center;
 }
 
-.sidebar-pane .metrics-and-styles,
-.sidebar-pane .metrics-and-computed {
+.metrics-and-styles,
+.metrics-and-computed {
     display: flex !important;
     flex-direction: column !important;
     position: relative;
 }
 
-.sidebar-pane .style-panes-wrapper {
-    transform: translateZ(0);
-    flex: 1;
-    overflow-y: auto;
-    position: relative;
-}
-
 .styles-sidebar-pane-toolbar-container {
     flex-shrink: 0;
     overflow: hidden;
@@ -628,14 +617,6 @@
     border-bottom: none;
 }
 
-.sidebar-pane > .split-widget {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    left: 0;
-    right: 0;
-}
-
 .styles-section.styles-panel-hovered:not(.read-only) .style-properties .webkit-css-property:hover,
 .styles-section.styles-panel-hovered:not(.read-only) .style-properties .value:hover,
 .styles-section.styles-panel-hovered:not(.read-only) span.simple-selector:hover,
diff --git a/third_party/WebKit/Source/devtools/front_end/main/Main.js b/third_party/WebKit/Source/devtools/front_end/main/Main.js
index 0294bde..a70788b2 100644
--- a/third_party/WebKit/Source/devtools/front_end/main/Main.js
+++ b/third_party/WebKit/Source/devtools/front_end/main/Main.js
@@ -77,18 +77,6 @@
      */
     _createSettings: function(prefs)
     {
-        // Patch settings from the URL param (for tests).
-        var settingsParam = Runtime.queryParam("settings");
-        if (settingsParam) {
-            try {
-                var settings = JSON.parse(window.decodeURI(settingsParam));
-                for (var key in settings)
-                    prefs[key] = settings[key];
-            } catch (e) {
-                // Ignore malformed settings.
-            }
-        }
-
         this._initializeExperiments(prefs);
         WebInspector.settings = new WebInspector.Settings(new WebInspector.SettingsStorage(prefs,
             InspectorFrontendHost.setPreference, InspectorFrontendHost.removePreference, InspectorFrontendHost.clearPreferences));
diff --git a/third_party/WebKit/Source/devtools/front_end/resources/AppManifestView.js b/third_party/WebKit/Source/devtools/front_end/resources/AppManifestView.js
index a458ab19f..dab72cf 100644
--- a/third_party/WebKit/Source/devtools/front_end/resources/AppManifestView.js
+++ b/third_party/WebKit/Source/devtools/front_end/resources/AppManifestView.js
@@ -42,7 +42,7 @@
     this._orientationField = this._presentationSection.appendField(WebInspector.UIString("Orientation"));
     this._displayField = this._presentationSection.appendField(WebInspector.UIString("Display"));
 
-    WebInspector.targetManager.observeTargets(this);
+    WebInspector.targetManager.observeTargets(this, WebInspector.Target.Capability.DOM);
 }
 
 WebInspector.AppManifestView.prototype = {
@@ -52,12 +52,12 @@
      */
     targetAdded: function(target)
     {
-        if (this._target)
+        if (this._resourceTreeModel)
             return;
-        this._target = target;
-
+        var resourceTreeModel = WebInspector.ResourceTreeModel.fromTarget(target);
+        this._resourceTreeModel = resourceTreeModel;
         this._updateManifest();
-        WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.MainFrameNavigated, this._updateManifest, this);
+        resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._updateManifest, this);
     },
 
     /**
@@ -70,7 +70,7 @@
 
     _updateManifest: function()
     {
-        this._target.resourceTreeModel.fetchAppManifest(this._renderManifest.bind(this));
+        this._resourceTreeModel.fetchAppManifest(this._renderManifest.bind(this));
     },
 
     /**
diff --git a/third_party/WebKit/Source/devtools/front_end/resources/ClearStorageView.js b/third_party/WebKit/Source/devtools/front_end/resources/ClearStorageView.js
index e038177e..e8a247a 100644
--- a/third_party/WebKit/Source/devtools/front_end/resources/ClearStorageView.js
+++ b/third_party/WebKit/Source/devtools/front_end/resources/ClearStorageView.js
@@ -42,7 +42,7 @@
     this._appendItem(caches, WebInspector.UIString("Cache storage"), "cache_storage");
     this._appendItem(caches, WebInspector.UIString("Application cache"), "appcache");
 
-    WebInspector.targetManager.observeTargets(this);
+    WebInspector.targetManager.observeTargets(this, WebInspector.Target.Capability.Browser);
     var footer = this._reportView.appendSection("", "clear-storage-button").appendRow();
     this._clearButton = createTextButton(WebInspector.UIString("Clear site data"), this._clear.bind(this), WebInspector.UIString("Clear site data"));
     footer.appendChild(this._clearButton);
@@ -70,17 +70,18 @@
         if (this._target)
             return;
         this._target = target;
-        this._updateOrigin(target.resourceTreeModel.mainFrame ? target.resourceTreeModel.mainFrame.url : "");
-        WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.MainFrameNavigated, this._updateFrame, this);
+        var securityOriginManager = WebInspector.SecurityOriginManager.fromTarget(target);
+        this._updateOrigin(securityOriginManager.mainSecurityOrigin());
+        securityOriginManager.addEventListener(WebInspector.SecurityOriginManager.EventTypes.MainSecurityOriginChanged, this._originChanged, this);
     },
 
     /**
      * @param {!WebInspector.Event} event
      */
-    _updateFrame: function(event)
+    _originChanged: function(event)
     {
-        var frame = /** *@type {!WebInspector.ResourceTreeFrame} */ (event.data);
-        this._updateOrigin(frame.url);
+        var origin = /** *@type {string} */ (event.data);
+        this._updateOrigin(origin);
     },
 
     /**
@@ -131,11 +132,9 @@
 
         if (set.has(StorageAgent.StorageType.Cache_storage) || hasAll) {
             var target = WebInspector.targetManager.mainTarget();
-            if (target) {
-                var model = WebInspector.ServiceWorkerCacheModel.fromTarget(target);
-                if (model)
-                    model.clearForOrigin(this._securityOrigin);
-            }
+            var model = target && WebInspector.ServiceWorkerCacheModel.fromTarget(target);
+            if (model)
+                model.clearForOrigin(this._securityOrigin);
         }
 
         if (set.has(StorageAgent.StorageType.Appcache) || hasAll) {
diff --git a/third_party/WebKit/Source/devtools/front_end/resources/DOMStorageModel.js b/third_party/WebKit/Source/devtools/front_end/resources/DOMStorageModel.js
index ea87c7b..9e465d9f 100644
--- a/third_party/WebKit/Source/devtools/front_end/resources/DOMStorageModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/resources/DOMStorageModel.js
@@ -110,11 +110,13 @@
  * @constructor
  * @extends {WebInspector.SDKModel}
  * @param {!WebInspector.Target} target
+ * @param {!WebInspector.SecurityOriginManager} securityOriginManager
  */
-WebInspector.DOMStorageModel = function(target)
+WebInspector.DOMStorageModel = function(target, securityOriginManager)
 {
     WebInspector.SDKModel.call(this, WebInspector.DOMStorageModel, target);
 
+    this._securityOriginManager = securityOriginManager;
     /** @type {!Object.<string, !WebInspector.DOMStorage>} */
     this._storages = {};
     this._agent = target.domstorageAgent();
@@ -132,13 +134,12 @@
             return;
 
         this.target().registerDOMStorageDispatcher(new WebInspector.DOMStorageDispatcher(this));
-        this.target().resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded, this._securityOriginAdded, this);
-        this.target().resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved, this._securityOriginRemoved, this);
-        this._agent.enable();
+        this._securityOriginManager.addEventListener(WebInspector.SecurityOriginManager.EventTypes.SecurityOriginAdded, this._securityOriginAdded, this);
+        this._securityOriginManager.addEventListener(WebInspector.SecurityOriginManager.EventTypes.SecurityOriginRemoved, this._securityOriginRemoved, this);
 
-        var securityOrigins = this.target().resourceTreeModel.securityOrigins();
-        for (var i = 0; i < securityOrigins.length; ++i)
-            this._addOrigin(securityOrigins[i]);
+        for (var securityOrigin of this._securityOriginManager.securityOrigins())
+            this._addOrigin(securityOrigin);
+        this._agent.enable();
 
         this._enabled = true;
     },
@@ -353,14 +354,16 @@
 }
 
 WebInspector.DOMStorageModel._symbol = Symbol("DomStorage");
+
 /**
  * @param {!WebInspector.Target} target
  * @return {!WebInspector.DOMStorageModel}
  */
 WebInspector.DOMStorageModel.fromTarget = function(target)
 {
-    if (!target[WebInspector.DOMStorageModel._symbol])
-        target[WebInspector.DOMStorageModel._symbol] = new WebInspector.DOMStorageModel(target);
-
-    return target[WebInspector.DOMStorageModel._symbol];
+    var model = /** @type {?WebInspector.DOMStorageModel} */ (target.model(WebInspector.DOMStorageModel));
+    if (!model) {
+        model = new WebInspector.DOMStorageModel(target, WebInspector.SecurityOriginManager.fromTarget(target));
+    }
+    return model;
 }
diff --git a/third_party/WebKit/Source/devtools/front_end/resources/IndexedDBModel.js b/third_party/WebKit/Source/devtools/front_end/resources/IndexedDBModel.js
index 76039648..3cfe28d 100644
--- a/third_party/WebKit/Source/devtools/front_end/resources/IndexedDBModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/resources/IndexedDBModel.js
@@ -31,10 +31,13 @@
 /**
  * @constructor
  * @extends {WebInspector.SDKModel}
+ * @param {!WebInspector.Target} target
+ * @param {!WebInspector.SecurityOriginManager} securityOriginManager
  */
-WebInspector.IndexedDBModel = function(target)
+WebInspector.IndexedDBModel = function(target, securityOriginManager)
 {
     WebInspector.SDKModel.call(this, WebInspector.IndexedDBModel, target);
+    this._securityOriginManager = securityOriginManager;
     this._agent = target.indexedDBAgent();
 
     /** @type {!Map.<!WebInspector.IndexedDBModel.DatabaseId, !WebInspector.IndexedDBModel.Database>} */
@@ -58,43 +61,52 @@
 
 /**
  * @param {*} idbKey
- * @return {?Object}
+ * @return {({
+ *   array: (!Array<?>|undefined),
+ *   date: (number|undefined),
+ *   number: (number|undefined),
+ *   string: (string|undefined),
+ *   type: !IndexedDBAgent.KeyType<string>
+ * }|undefined)}
  */
 WebInspector.IndexedDBModel.keyFromIDBKey = function(idbKey)
 {
     if (typeof(idbKey) === "undefined" || idbKey === null)
-        return null;
+        return undefined;
 
+    var type;
     var key = {};
     switch (typeof(idbKey)) {
     case "number":
         key.number = idbKey;
-        key.type = WebInspector.IndexedDBModel.KeyTypes.NumberType;
+        type = WebInspector.IndexedDBModel.KeyTypes.NumberType;
         break;
     case "string":
         key.string = idbKey;
-        key.type = WebInspector.IndexedDBModel.KeyTypes.StringType;
+        type = WebInspector.IndexedDBModel.KeyTypes.StringType;
         break;
     case "object":
         if (idbKey instanceof Date) {
             key.date = idbKey.getTime();
-            key.type = WebInspector.IndexedDBModel.KeyTypes.DateType;
+            type = WebInspector.IndexedDBModel.KeyTypes.DateType;
         } else if (Array.isArray(idbKey)) {
             key.array = [];
             for (var i = 0; i < idbKey.length; ++i)
                 key.array.push(WebInspector.IndexedDBModel.keyFromIDBKey(idbKey[i]));
-            key.type = WebInspector.IndexedDBModel.KeyTypes.ArrayType;
+            type = WebInspector.IndexedDBModel.KeyTypes.ArrayType;
         }
         break;
     default:
-        return null;
+        return undefined;
     }
+    key.type = /** @type {!IndexedDBAgent.KeyType<string>} */ (type);
     return key;
 }
 
 /**
  * @param {?IDBKeyRange=} idbKeyRange
- * @return {?{lower: ?Object, upper: ?Object, lowerOpen: *, upperOpen: *}}
+ * @return {?IndexedDBAgent.KeyRange}
+ * eturn {?{lower: ?Object, upper: ?Object, lowerOpen: *, upperOpen: *}}
  */
 WebInspector.IndexedDBModel.keyRangeFromIDBKeyRange = function(idbKeyRange)
 {
@@ -104,8 +116,8 @@
     var keyRange = {};
     keyRange.lower = WebInspector.IndexedDBModel.keyFromIDBKey(idbKeyRange.lower);
     keyRange.upper = WebInspector.IndexedDBModel.keyFromIDBKey(idbKeyRange.upper);
-    keyRange.lowerOpen = idbKeyRange.lowerOpen;
-    keyRange.upperOpen = idbKeyRange.upperOpen;
+    keyRange.lowerOpen = !!idbKeyRange.lowerOpen;
+    keyRange.upperOpen = !!idbKeyRange.upperOpen;
     return keyRange;
 }
 
@@ -156,13 +168,11 @@
             return;
 
         this._agent.enable();
+        this._securityOriginManager.addEventListener(WebInspector.SecurityOriginManager.EventTypes.SecurityOriginAdded, this._securityOriginAdded, this);
+        this._securityOriginManager.addEventListener(WebInspector.SecurityOriginManager.EventTypes.SecurityOriginRemoved, this._securityOriginRemoved, this);
 
-        this.target().resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded, this._securityOriginAdded, this);
-        this.target().resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved, this._securityOriginRemoved, this);
-
-        var securityOrigins = this.target().resourceTreeModel.securityOrigins();
-        for (var i = 0; i < securityOrigins.length; ++i)
-            this._addOrigin(securityOrigins[i]);
+        for (var securityOrigin of this._securityOriginManager.securityOrigins())
+            this._addOrigin(securityOrigin);
 
         this._enabled = true;
     },
@@ -531,12 +541,12 @@
 
 /**
  * @param {!WebInspector.Target} target
- * @return {?WebInspector.IndexedDBModel}
+ * @return {!WebInspector.IndexedDBModel}
  */
 WebInspector.IndexedDBModel.fromTarget = function(target)
 {
     var model = /** @type {?WebInspector.IndexedDBModel} */ (target.model(WebInspector.IndexedDBModel));
     if (!model)
-        model = new WebInspector.IndexedDBModel(target);
+        model = new WebInspector.IndexedDBModel(target, WebInspector.SecurityOriginManager.fromTarget(target));
     return model;
 }
diff --git a/third_party/WebKit/Source/devtools/front_end/resources/ResourcesPanel.js b/third_party/WebKit/Source/devtools/front_end/resources/ResourcesPanel.js
index 83d170e..fe27697 100644
--- a/third_party/WebKit/Source/devtools/front_end/resources/ResourcesPanel.js
+++ b/third_party/WebKit/Source/devtools/front_end/resources/ResourcesPanel.js
@@ -126,15 +126,19 @@
             return;
         this._target = target;
         this._databaseModel = WebInspector.DatabaseModel.fromTarget(target);
-        this._domStorageModel = WebInspector.DOMStorageModel.fromTarget(target);
 
-        if (target.resourceTreeModel.cachedResourcesLoaded())
-            this._initialize();
-
-        target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.CachedResourcesLoaded, this._initialize, this);
-        target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.WillLoadCachedResources, this._resetWithFrames, this);
         this._databaseModel.addEventListener(WebInspector.DatabaseModel.Events.DatabaseAdded, this._databaseAdded, this);
         this._databaseModel.addEventListener(WebInspector.DatabaseModel.Events.DatabasesRemoved, this._resetWebSQL, this);
+
+        var resourceTreeModel = WebInspector.ResourceTreeModel.fromTarget(target);
+        if (!resourceTreeModel)
+            return;
+
+        if (resourceTreeModel.cachedResourcesLoaded())
+            this._initialize();
+
+        resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.CachedResourcesLoaded, this._initialize, this);
+        resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.WillLoadCachedResources, this._resetWithFrames, this);
     },
 
     /**
@@ -147,8 +151,11 @@
             return;
         delete this._target;
 
-        target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.CachedResourcesLoaded, this._initialize, this);
-        target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.WillLoadCachedResources, this._resetWithFrames, this);
+        var resourceTreeModel = WebInspector.ResourceTreeModel.fromTarget(target);
+        if (resourceTreeModel) {
+            resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.CachedResourcesLoaded, this._initialize, this);
+            resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.WillLoadCachedResources, this._resetWithFrames, this);
+        }
         this._databaseModel.removeEventListener(WebInspector.DatabaseModel.Events.DatabaseAdded, this._databaseAdded, this);
         this._databaseModel.removeEventListener(WebInspector.DatabaseModel.Events.DatabasesRemoved, this._resetWebSQL, this);
 
@@ -158,7 +165,7 @@
     _initialize: function()
     {
         this._databaseModel.enable();
-        this._domStorageModel.enable();
+
         var indexedDBModel = WebInspector.IndexedDBModel.fromTarget(this._target);
         if (indexedDBModel)
             indexedDBModel.enable();
@@ -169,7 +176,10 @@
 
         if (this._target.hasBrowserCapability())
             this._populateResourceTree();
-        this._populateDOMStorageTree();
+
+        var domStorageModel = WebInspector.DOMStorageModel.fromTarget(this._target);
+        if (domStorageModel)
+            this._populateDOMStorageTree(domStorageModel);
         this._populateApplicationCacheTree();
         this.indexedDBListTreeElement._initialize();
         this.cacheStorageListTreeElement._initialize();
@@ -280,10 +290,16 @@
     _populateResourceTree: function()
     {
         this._treeElementForFrameId = {};
-        this._target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameAdded, this._frameAdded, this);
-        this._target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated, this._frameNavigated, this);
-        this._target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameDetached, this._frameDetached, this);
-        this._target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded, this._resourceAdded, this);
+
+        var resourceTreeModel = WebInspector.ResourceTreeModel.fromTarget(this._target);
+
+        if (!resourceTreeModel)
+            return;
+
+        resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameAdded, this._frameAdded, this);
+        resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated, this._frameNavigated, this);
+        resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameDetached, this._frameDetached, this);
+        resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded, this._resourceAdded, this);
 
         /**
          * @param {!WebInspector.ResourceTreeFrame} frame
@@ -299,7 +315,7 @@
             for (var i = 0; i < resources.length; ++i)
                 this._resourceAdded({data:resources[i]});
         }
-        populateFrame.call(this, this._target.resourceTreeModel.mainFrame);
+        populateFrame.call(this, resourceTreeModel.mainFrame);
     },
 
     _frameAdded: function(event)
@@ -695,11 +711,15 @@
         database.getTableNames(tableNamesCallback);
     },
 
-    _populateDOMStorageTree: function()
+    /**
+     * @param {!WebInspector.DOMStorageModel} domStorageModel
+     */
+    _populateDOMStorageTree: function(domStorageModel)
     {
-        this._domStorageModel.storages().forEach(this._addDOMStorage.bind(this));
-        this._domStorageModel.addEventListener(WebInspector.DOMStorageModel.Events.DOMStorageAdded, this._domStorageAdded, this);
-        this._domStorageModel.addEventListener(WebInspector.DOMStorageModel.Events.DOMStorageRemoved, this._domStorageRemoved, this);
+        domStorageModel.enable();
+        domStorageModel.storages().forEach(this._addDOMStorage.bind(this));
+        domStorageModel.addEventListener(WebInspector.DOMStorageModel.Events.DOMStorageAdded, this._domStorageAdded, this);
+        domStorageModel.addEventListener(WebInspector.DOMStorageModel.Events.DOMStorageRemoved, this._domStorageRemoved, this);
     },
 
     _populateApplicationCacheTree: function()
@@ -1279,10 +1299,9 @@
         /** @type {!Array.<!WebInspector.SWCacheTreeElement>} */
         this._swCacheTreeElements = [];
         var target = this._storagePanel._target;
-        if (target) {
-            var model = WebInspector.ServiceWorkerCacheModel.fromTarget(target);
-            var caches = model.caches();
-            for (var cache of caches)
+        var model = target && WebInspector.ServiceWorkerCacheModel.fromTarget(target);
+        if (model) {
+            for (var cache of model.caches())
                 this._addCache(model, cache);
         }
         WebInspector.targetManager.addModelListener(WebInspector.ServiceWorkerCacheModel, WebInspector.ServiceWorkerCacheModel.EventTypes.CacheAdded, this._cacheAdded, this);
@@ -1307,6 +1326,8 @@
         var target = this._storagePanel._target;
         if (target) {
             var model = WebInspector.ServiceWorkerCacheModel.fromTarget(target);
+            if (!model)
+                return;
             model.refreshCacheNames();
         }
     },
@@ -1568,7 +1589,7 @@
         /** @type {!Array.<!WebInspector.IDBDatabaseTreeElement>} */
         this._idbDatabaseTreeElements = [];
 
-        var targets = WebInspector.targetManager.targets();
+        var targets = WebInspector.targetManager.targets(WebInspector.Target.Capability.Browser);
         for (var i = 0; i < targets.length; ++i) {
             var indexedDBModel = WebInspector.IndexedDBModel.fromTarget(targets[i]);
             var databases = indexedDBModel.databases();
@@ -1592,7 +1613,7 @@
 
     refreshIndexedDB: function()
     {
-        var targets = WebInspector.targetManager.targets();
+        var targets = WebInspector.targetManager.targets(WebInspector.Target.Capability.Browser);
         for (var i = 0; i < targets.length; ++i)
             WebInspector.IndexedDBModel.fromTarget(targets[i]).refreshDatabaseNames();
     },
@@ -2135,7 +2156,8 @@
 
     _refreshTitles: function()
     {
-        var frame = this._storagePanel._target.resourceTreeModel.frameForId(this._frameId);
+        var resourceTreeModel = WebInspector.ResourceTreeModel.fromTarget(this._storagePanel._target);
+        var frame = resourceTreeModel.frameForId(this._frameId);
         this.title = frame.displayName();
     },
 
diff --git a/third_party/WebKit/Source/devtools/front_end/resources/ServiceWorkersView.js b/third_party/WebKit/Source/devtools/front_end/resources/ServiceWorkersView.js
index 74c4c81..9093547 100644
--- a/third_party/WebKit/Source/devtools/front_end/resources/ServiceWorkersView.js
+++ b/third_party/WebKit/Source/devtools/front_end/resources/ServiceWorkersView.js
@@ -29,15 +29,16 @@
      */
     targetAdded: function(target)
     {
-        if (this._target || !target.serviceWorkerManager)
+        var securityOriginManager = WebInspector.SecurityOriginManager.fromTarget(target);
+        if (this._manager || !target.serviceWorkerManager || !securityOriginManager)
             return;
-        this._target = target;
-        this._manager = this._target.serviceWorkerManager;
+        this._manager = target.serviceWorkerManager;
+        this._securityOriginManager = securityOriginManager;
 
         this._toolbar.appendToolbarItem(WebInspector.NetworkConditionsSelector.createOfflineToolbarCheckbox());
         var forceUpdate = new WebInspector.ToolbarCheckbox(WebInspector.UIString("Update on reload"), WebInspector.UIString("Force update Service Worker on page reload"), this._manager.forceUpdateOnReloadSetting());
         this._toolbar.appendToolbarItem(forceUpdate);
-        var networkManager = this._target && WebInspector.NetworkManager.fromTarget(this._target);
+        var networkManager = target && WebInspector.NetworkManager.fromTarget(target);
         if (networkManager) {
             var fallbackToNetwork = new WebInspector.ToolbarCheckbox(WebInspector.UIString("Bypass for network"), WebInspector.UIString("Bypass Service Worker and load resources from the network"), networkManager.bypassServiceWorkerSetting());
             this._toolbar.appendToolbarItem(fallbackToNetwork);
@@ -53,8 +54,8 @@
         this._manager.addEventListener(WebInspector.ServiceWorkerManager.Events.RegistrationUpdated, this._registrationUpdated, this);
         this._manager.addEventListener(WebInspector.ServiceWorkerManager.Events.RegistrationDeleted, this._registrationDeleted, this);
         this._manager.addEventListener(WebInspector.ServiceWorkerManager.Events.RegistrationErrorAdded, this._registrationErrorAdded, this);
-        this._target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded, this._updateSectionVisibility, this);
-        this._target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved, this._updateSectionVisibility, this);
+        securityOriginManager.addEventListener(WebInspector.SecurityOriginManager.EventTypes.SecurityOriginAdded, this._updateSectionVisibility, this);
+        securityOriginManager.addEventListener(WebInspector.SecurityOriginManager.EventTypes.SecurityOriginRemoved, this._updateSectionVisibility, this);
     },
 
     /**
@@ -63,14 +64,15 @@
      */
     targetRemoved: function(target)
     {
-        if (target !== this._target)
+        if (this._manager !== target.serviceWorkerManager)
             return;
-        delete this._target;
+        this._manager = null;
+        this._securityOriginManager = null;
     },
 
     _updateSectionVisibility: function()
     {
-        var securityOrigins = new Set(this._target.resourceTreeModel.securityOrigins());
+        var securityOrigins = new Set(this._securityOriginManager.securityOrigins());
         for (var section of this._sections.values()) {
             var visible = this._showAllCheckbox.checked() || securityOrigins.has(section._registration.securityOrigin);
             section._section.element.classList.toggle("hidden", !visible);
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/CSSMetadata.js b/third_party/WebKit/Source/devtools/front_end/sdk/CSSMetadata.js
index 421c6522..f50200156 100644
--- a/third_party/WebKit/Source/devtools/front_end/sdk/CSSMetadata.js
+++ b/third_party/WebKit/Source/devtools/front_end/sdk/CSSMetadata.js
@@ -176,10 +176,15 @@
 ].keySet();
 
 WebInspector.CSSMetadata._colorAwareProperties = [
-    "background", "background-color", "background-image", "border", "border-color", "border-top", "border-right", "border-bottom",
-    "border-left", "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", "box-shadow", "color",
-    "fill", "outline", "outline-color", "stroke", "text-shadow", "-webkit-box-shadow", "-webkit-column-rule-color",
-    "-webkit-text-decoration-color", "-webkit-text-emphasis", "-webkit-text-emphasis-color"
+    "backdrop-filter", "background", "background-color", "background-image", "border", "border-color", "border-image",
+    "border-image-source", "border-bottom", "border-bottom-color", "border-left", "border-left-color", "border-right",
+    "border-right-color", "border-top", "border-top-color", "box-shadow", "color", "column-rule", "column-rule-color", "fill",
+    "list-style", "list-style-image", "outline", "outline-color", "stroke", "text-decoration-color", "text-shadow",
+    "-webkit-border-after", "-webkit-border-after-color", "-webkit-border-before", "-webkit-border-before-color", "-webkit-border-end",
+    "-webkit-border-end-color", "-webkit-border-start", "-webkit-border-start-color", "-webkit-box-reflect", "-webkit-box-shadow",
+    "-webkit-column-rule-color", "-webkit-filter", "-webkit-mask", "-webkit-mask-box-image", "-webkit-mask-box-image-source",
+    "-webkit-mask-image", "-webkit-tap-highlight-color", "-webkit-text-decoration-color", "-webkit-text-emphasis",
+    "-webkit-text-emphasis-color", "-webkit-text-fill-color", "-webkit-text-stroke", "-webkit-text-stroke-color"
 ].keySet();
 
 WebInspector.CSSMetadata._propertyDataMap = {
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/ResourceTreeModel.js b/third_party/WebKit/Source/devtools/front_end/sdk/ResourceTreeModel.js
index 7caf4b15..d70ad80 100644
--- a/third_party/WebKit/Source/devtools/front_end/sdk/ResourceTreeModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/sdk/ResourceTreeModel.js
@@ -33,8 +33,9 @@
  * @extends {WebInspector.SDKModel}
  * @param {!WebInspector.Target} target
  * @param {?WebInspector.NetworkManager} networkManager
+ * @param {!WebInspector.SecurityOriginManager} securityOriginManager
  */
-WebInspector.ResourceTreeModel = function(target, networkManager)
+WebInspector.ResourceTreeModel = function(target, networkManager, securityOriginManager)
 {
     WebInspector.SDKModel.call(this, WebInspector.ResourceTreeModel, target);
     if (networkManager) {
@@ -46,12 +47,12 @@
 
     this._agent = target.pageAgent();
     this._agent.enable();
+    this._securityOriginManager = securityOriginManager;
 
     this._fetchResourceTree();
 
     target.registerPageDispatcher(new WebInspector.PageDispatcher(this));
 
-    this._securityOriginFrameCount = {};
     this._inspectedPageURL = "";
     this._pendingReloadOptions = null;
     this._reloadSuspensionCount = 0;
@@ -74,13 +75,19 @@
     PageReloadRequested: "PageReloadRequested",
     WillReloadPage: "WillReloadPage",
     InspectedURLChanged: "InspectedURLChanged",
-    SecurityOriginAdded: "SecurityOriginAdded",
-    SecurityOriginRemoved: "SecurityOriginRemoved",
     ScreencastFrame: "ScreencastFrame",
     ScreencastVisibilityChanged: "ScreencastVisibilityChanged",
     ColorPicked: "ColorPicked"
 }
 
+/**
+ * @param {!WebInspector.Target} target
+ * @return {?WebInspector.ResourceTreeModel}
+ */
+WebInspector.ResourceTreeModel.fromTarget = function(target)
+{
+    return /** @type {?WebInspector.ResourceTreeModel} */ (target.model(WebInspector.ResourceTreeModel));
+}
 
 /**
  * @return {!Array.<!WebInspector.ResourceTreeFrame>}
@@ -88,8 +95,8 @@
 WebInspector.ResourceTreeModel.frames = function()
 {
     var result = [];
-    for (var target of WebInspector.targetManager.targets())
-        result = result.concat(target.resourceTreeModel._frames.valuesArray());
+    for (var target of WebInspector.targetManager.targets(WebInspector.Target.Capability.DOM))
+        result = result.concat(WebInspector.ResourceTreeModel.fromTarget(target)._frames.valuesArray());
     return result;
 }
 
@@ -99,8 +106,8 @@
  */
 WebInspector.ResourceTreeModel.resourceForURL = function(url)
 {
-    for (var target of WebInspector.targetManager.targets()) {
-        var mainFrame = target.resourceTreeModel.mainFrame;
+    for (var target of WebInspector.targetManager.targets(WebInspector.Target.Capability.DOM)) {
+        var mainFrame = WebInspector.ResourceTreeModel.fromTarget(target).mainFrame;
         var result = mainFrame ? mainFrame.resourceForURL(url) : null;
         if (result)
             return result;
@@ -119,22 +126,12 @@
 
     _processCachedResources: function(error, mainFramePayload)
     {
-        if (error) {
-            this._cachedResourcesProcessed = true;
-            this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.CachedResourcesLoaded);
-            return;
-        }
-
-        this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.WillLoadCachedResources);
-        this._inspectedPageURL = mainFramePayload.frame.url;
-
-        // Do not process SW resources.
-        if (this.target().hasBrowserCapability())
+        if (!error) {
+            this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.WillLoadCachedResources);
+            this._inspectedPageURL = mainFramePayload.frame.url;
             this._addFramesRecursively(null, mainFramePayload);
-        else
-            this._addSecurityOrigin(mainFramePayload.frame.securityOrigin);
-
-        this._dispatchInspectedURLChanged();
+            this._dispatchInspectedURLChanged();
+        }
         this._cachedResourcesProcessed = true;
         this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.CachedResourcesLoaded);
     },
@@ -177,47 +174,13 @@
     _addFrame: function(frame, aboutToNavigate)
     {
         this._frames.set(frame.id, frame);
-        if (frame.isMainFrame())
+        if (frame.isMainFrame()) {
             this.mainFrame = frame;
+            this._securityOriginManager.setMainSecurityOrigin(frame.url);
+        }
         this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameAdded, frame);
         if (!aboutToNavigate)
-            this._addSecurityOrigin(frame.securityOrigin);
-    },
-
-    /**
-     * @param {string} securityOrigin
-     */
-    _addSecurityOrigin: function(securityOrigin)
-    {
-        if (!this._securityOriginFrameCount[securityOrigin]) {
-            this._securityOriginFrameCount[securityOrigin] = 1;
-            this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded, securityOrigin);
-            return;
-        }
-        this._securityOriginFrameCount[securityOrigin] += 1;
-    },
-
-    /**
-     * @param {string|undefined} securityOrigin
-     */
-    _removeSecurityOrigin: function(securityOrigin)
-    {
-        if (typeof securityOrigin === "undefined")
-            return;
-        if (this._securityOriginFrameCount[securityOrigin] === 1) {
-            delete this._securityOriginFrameCount[securityOrigin];
-            this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved, securityOrigin);
-            return;
-        }
-        this._securityOriginFrameCount[securityOrigin] -= 1;
-    },
-
-    /**
-     * @return {!Array.<string>}
-     */
-    securityOrigins: function()
-    {
-        return Object.keys(this._securityOriginFrameCount);
+            this._securityOriginManager.addSecurityOrigin(frame.securityOrigin);
     },
 
     /**
@@ -234,7 +197,7 @@
             for (var i = 0; i < frame.childFrames.length; ++i)
                 removeOriginForFrame.call(this, frame.childFrames[i]);
             if (!frame.isMainFrame())
-                this._removeSecurityOrigin(frame.securityOrigin);
+                this._securityOriginManager.removeSecurityOrigin(frame.securityOrigin);
         }
         removeOriginForFrame.call(this, mainFrame);
     },
@@ -281,7 +244,7 @@
 
         this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameWillNavigate, frame);
 
-        this._removeSecurityOrigin(frame.securityOrigin);
+        this._securityOriginManager.removeSecurityOrigin(frame.securityOrigin);
         frame._navigate(framePayload);
         var addedOrigin = frame.securityOrigin;
 
@@ -297,7 +260,7 @@
                 this.target().consoleModel.clear();
         }
         if (addedOrigin)
-            this._addSecurityOrigin(addedOrigin);
+            this._securityOriginManager.addSecurityOrigin(addedOrigin);
 
         // Fill frame with retained resources (the ones loaded using new loader).
         var resources = frame.resources();
@@ -321,7 +284,7 @@
         if (!frame)
             return;
 
-        this._removeSecurityOrigin(frame.securityOrigin);
+        this._securityOriginManager.removeSecurityOrigin(frame.securityOrigin);
         if (frame.parentFrame)
             frame.parentFrame._removeChildFrame(frame);
         else
@@ -577,15 +540,28 @@
 }
 
 /**
+ * @param {!WebInspector.ExecutionContext|!WebInspector.CSSStyleSheetHeader|!WebInspector.Resource} object
+ * @return {?WebInspector.ResourceTreeFrame}
+ */
+WebInspector.ResourceTreeFrame._fromObject = function(object)
+{
+    var resourceTreeModel = WebInspector.ResourceTreeModel.fromTarget(object.target());
+    var frameId = object.frameId;
+    if (!resourceTreeModel || !frameId)
+        return null;
+    return resourceTreeModel.frameForId(frameId);
+}
+
+/**
  * @param {!WebInspector.Script} script
  * @return {?WebInspector.ResourceTreeFrame}
  */
 WebInspector.ResourceTreeFrame.fromScript = function(script)
 {
     var executionContext = script.executionContext();
-    if (!executionContext || !executionContext.frameId)
+    if (!executionContext)
         return null;
-    return script.target().resourceTreeModel.frameForId(executionContext.frameId);
+    return WebInspector.ResourceTreeFrame._fromObject(executionContext);
 }
 
 /**
@@ -594,7 +570,7 @@
  */
 WebInspector.ResourceTreeFrame.fromStyleSheet = function(header)
 {
-    return header.target().resourceTreeModel.frameForId(header.frameId);
+    return WebInspector.ResourceTreeFrame._fromObject(header);
 }
 
 /**
@@ -603,7 +579,7 @@
  */
 WebInspector.ResourceTreeFrame.fromResource = function(resource)
 {
-    return resource.target().resourceTreeModel.frameForId(resource.frameId);
+    return WebInspector.ResourceTreeFrame._fromObject(resource);
 }
 
 WebInspector.ResourceTreeFrame.prototype = {
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/SecurityOriginManager.js b/third_party/WebKit/Source/devtools/front_end/sdk/SecurityOriginManager.js
new file mode 100644
index 0000000..ba98e4f8b
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/sdk/SecurityOriginManager.js
@@ -0,0 +1,91 @@
+// 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.
+
+/**
+ * @constructor
+ * @extends {WebInspector.SDKModel}
+ * @param {!WebInspector.Target} target
+ */
+WebInspector.SecurityOriginManager = function(target)
+{
+    WebInspector.SDKModel.call(this, WebInspector.SecurityOriginManager, target);
+
+    this._securityOriginCounter = new Map();
+    this._mainSecurityOrigin = "";
+}
+
+WebInspector.SecurityOriginManager.EventTypes = {
+    SecurityOriginAdded: "SecurityOriginAdded",
+    SecurityOriginRemoved: "SecurityOriginRemoved",
+    MainSecurityOriginChanged: "MainSecurityOriginChanged",
+}
+
+/**
+ * @param {!WebInspector.Target} target
+ * @return {!WebInspector.SecurityOriginManager}
+ */
+WebInspector.SecurityOriginManager.fromTarget = function(target)
+{
+    var securityOriginManager = /** @type {?WebInspector.SecurityOriginManager} */ (target.model(WebInspector.SecurityOriginManager));
+    if (!securityOriginManager)
+        securityOriginManager = new WebInspector.SecurityOriginManager(target);
+    return securityOriginManager;
+}
+
+WebInspector.SecurityOriginManager.prototype = {
+    /**
+     * @param {string} securityOrigin
+     */
+    addSecurityOrigin: function(securityOrigin)
+    {
+        var currentCount = this._securityOriginCounter.get(securityOrigin);
+        if (!currentCount) {
+            this._securityOriginCounter.set(securityOrigin, 1);
+            this.dispatchEventToListeners(WebInspector.SecurityOriginManager.EventTypes.SecurityOriginAdded, securityOrigin);
+            return;
+        }
+        this._securityOriginCounter.set(securityOrigin, currentCount + 1);
+    },
+
+    /**
+     * @param {string} securityOrigin
+     */
+    removeSecurityOrigin: function(securityOrigin)
+    {
+        var currentCount = this._securityOriginCounter.get(securityOrigin);
+        if (currentCount === 1) {
+            this._securityOriginCounter.delete(securityOrigin);
+            this.dispatchEventToListeners(WebInspector.SecurityOriginManager.EventTypes.SecurityOriginRemoved, securityOrigin);
+            return;
+        }
+        this._securityOriginCounter.set(securityOrigin, currentCount - 1);
+    },
+
+    /**
+     * @return {!Array<string>}
+     */
+    securityOrigins: function()
+    {
+        return this._securityOriginCounter.keysArray();
+    },
+
+    /**
+     * @return {string}
+     */
+    mainSecurityOrigin: function()
+    {
+        return this._mainSecurityOrigin;
+    },
+
+    /**
+     * @param {string} securityOrigin
+     */
+    setMainSecurityOrigin: function(securityOrigin)
+    {
+        this._mainSecurityOrigin = securityOrigin;
+        this.dispatchEventToListeners(WebInspector.SecurityOriginManager.EventTypes.MainSecurityOriginChanged, securityOrigin);
+    },
+
+    __proto__: WebInspector.SDKModel.prototype
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/ServiceWorkerCacheModel.js b/third_party/WebKit/Source/devtools/front_end/sdk/ServiceWorkerCacheModel.js
index 98c5529..11540fb0 100644
--- a/third_party/WebKit/Source/devtools/front_end/sdk/ServiceWorkerCacheModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/sdk/ServiceWorkerCacheModel.js
@@ -6,8 +6,10 @@
  * Invariant: This model can only be constructed on a ServiceWorker target.
  * @constructor
  * @extends {WebInspector.SDKModel}
+ * @param {!WebInspector.Target} target
+ * @param {!WebInspector.SecurityOriginManager} securityOriginManager
  */
-WebInspector.ServiceWorkerCacheModel = function(target)
+WebInspector.ServiceWorkerCacheModel = function(target, securityOriginManager)
 {
     WebInspector.SDKModel.call(this, WebInspector.ServiceWorkerCacheModel, target);
 
@@ -16,6 +18,8 @@
 
     this._agent = target.cacheStorageAgent();
 
+    this._securityOriginManager = securityOriginManager;
+
     /** @type {boolean} */
     this._enabled = false;
 }
@@ -31,12 +35,11 @@
         if (this._enabled)
             return;
 
-        this.target().resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded, this._securityOriginAdded, this);
-        this.target().resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved, this._securityOriginRemoved, this);
+        this._securityOriginManager.addEventListener(WebInspector.SecurityOriginManager.EventTypes.SecurityOriginAdded, this._securityOriginAdded, this);
+        this._securityOriginManager.addEventListener(WebInspector.SecurityOriginManager.EventTypes.SecurityOriginRemoved, this._securityOriginRemoved, this);
 
-        var securityOrigins = this.target().resourceTreeModel.securityOrigins();
-        for (var i = 0; i < securityOrigins.length; ++i)
-            this._addOrigin(securityOrigins[i]);
+        for (var securityOrigin of this._securityOriginManager.securityOrigins())
+            this._addOrigin(securityOrigin);
         this._enabled = true;
     },
 
@@ -54,7 +57,7 @@
         for (var cache of this._caches.values())
             this._cacheRemoved(cache);
         this._caches.clear();
-        var securityOrigins = this.target().resourceTreeModel.securityOrigins();
+        var securityOrigins = this._securityOriginManager.securityOrigins();
         for (var securityOrigin of securityOrigins)
             this._loadCacheNames(securityOrigin);
     },
@@ -129,8 +132,8 @@
             this._cacheRemoved(cache);
         this._caches.clear();
         if (this._enabled) {
-            this.target().resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded, this._securityOriginAdded, this);
-            this.target().resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved, this._securityOriginRemoved, this);
+            this._securityOriginManager.removeEventListener(WebInspector.SecurityOriginManager.EventTypes.SecurityOriginAdded, this._securityOriginAdded, this);
+            this._securityOriginManager.removeEventListener(WebInspector.SecurityOriginManager.EventTypes.SecurityOriginRemoved, this._securityOriginRemoved, this);
         }
     },
 
@@ -321,16 +324,17 @@
     }
 }
 
-
-WebInspector.ServiceWorkerCacheModel._symbol = Symbol("CacheStorageModel");
 /**
  * @param {!WebInspector.Target} target
- * @return {!WebInspector.ServiceWorkerCacheModel}
+ * @return {?WebInspector.ServiceWorkerCacheModel}
  */
 WebInspector.ServiceWorkerCacheModel.fromTarget = function(target)
 {
-    if (!target[WebInspector.ServiceWorkerCacheModel._symbol])
-        target[WebInspector.ServiceWorkerCacheModel._symbol] = new WebInspector.ServiceWorkerCacheModel(target);
-
-    return target[WebInspector.ServiceWorkerCacheModel._symbol];
+    if (!target.hasBrowserCapability())
+        return null;
+    var instance = /** @type {?WebInspector.ServiceWorkerCacheModel} */ (target.model(WebInspector.ServiceWorkerCacheModel));
+    if (!instance)
+        instance = new WebInspector.ServiceWorkerCacheModel(target, WebInspector.SecurityOriginManager.fromTarget(target));
+    return instance;
 }
+
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/TargetManager.js b/third_party/WebKit/Source/devtools/front_end/sdk/TargetManager.js
index ca96560..84687b4 100644
--- a/third_party/WebKit/Source/devtools/front_end/sdk/TargetManager.js
+++ b/third_party/WebKit/Source/devtools/front_end/sdk/TargetManager.js
@@ -203,8 +203,9 @@
         if (target.hasNetworkCapability())
             networkManager = new WebInspector.NetworkManager(target);
 
+        var securityOriginManager = WebInspector.SecurityOriginManager.fromTarget(target);
         /** @type {!WebInspector.ResourceTreeModel} */
-        target.resourceTreeModel = new WebInspector.ResourceTreeModel(target, networkManager);
+        target.resourceTreeModel = new WebInspector.ResourceTreeModel(target, networkManager, securityOriginManager);
 
         if (networkManager)
             new WebInspector.NetworkLog(target, networkManager);
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/module.json b/third_party/WebKit/Source/devtools/front_end/sdk/module.json
index 633ec02..c7ee1ce6 100644
--- a/third_party/WebKit/Source/devtools/front_end/sdk/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/sdk/module.json
@@ -106,6 +106,7 @@
         "RemoteObject.js",
         "Resource.js",
         "ResourceTreeModel.js",
+        "SecurityOriginManager.js",
         "SourceMap.js",
         "NetworkManager.js",
         "NetworkRequest.js",
diff --git a/third_party/WebKit/Source/devtools/front_end/snippets/ScriptSnippetModel.js b/third_party/WebKit/Source/devtools/front_end/snippets/ScriptSnippetModel.js
index b771ffd8..8a771e6 100644
--- a/third_party/WebKit/Source/devtools/front_end/snippets/ScriptSnippetModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/snippets/ScriptSnippetModel.js
@@ -225,9 +225,17 @@
         var mapping = this._mappingForTarget.get(target);
         mapping._setEvaluationIndex(evaluationIndex, uiSourceCode);
         var evaluationUrl = mapping._evaluationSourceURL(uiSourceCode);
-        var expression = uiSourceCode.workingCopy();
-        WebInspector.console.show();
-        runtimeModel.compileScript(expression, "", true, executionContext.id, compileCallback.bind(this));
+        uiSourceCode.requestContent().then(compileSnippet.bind(this));
+
+        /**
+         * @this {WebInspector.ScriptSnippetModel}
+         */
+        function compileSnippet()
+        {
+            var expression = uiSourceCode.workingCopy();
+            WebInspector.console.show();
+            runtimeModel.compileScript(expression, "", true, executionContext.id, compileCallback.bind(this));
+        }
 
         /**
          * @param {!RuntimeAgent.ScriptId=} scriptId
@@ -240,12 +248,12 @@
             if (mapping.evaluationIndex(uiSourceCode) !== evaluationIndex)
                 return;
 
+            mapping._addScript(executionContext.debuggerModel.scriptForId(scriptId || exceptionDetails.scriptId), uiSourceCode);
             if (!scriptId) {
                 this._printRunOrCompileScriptResultFailure(target, exceptionDetails, evaluationUrl);
                 return;
             }
 
-            mapping._addScript(executionContext.debuggerModel.scriptForId(scriptId), uiSourceCode);
             var breakpointLocations = this._removeBreakpoints(uiSourceCode);
             this._restoreBreakpoints(uiSourceCode, breakpointLocations);
 
@@ -272,7 +280,7 @@
         function runCallback(target, result, exceptionDetails)
         {
             if (!exceptionDetails)
-                this._printRunScriptResult(target, result, sourceURL);
+                this._printRunScriptResult(target, result, scriptId, sourceURL);
             else
                 this._printRunOrCompileScriptResultFailure(target, exceptionDetails, sourceURL);
         }
@@ -281,9 +289,10 @@
     /**
      * @param {!WebInspector.Target} target
      * @param {?RuntimeAgent.RemoteObject} result
+     * @param {!RuntimeAgent.ScriptId} scriptId
      * @param {?string=} sourceURL
      */
-    _printRunScriptResult: function(target, result, sourceURL)
+    _printRunScriptResult: function(target, result, scriptId, sourceURL)
     {
         var consoleMessage = new WebInspector.ConsoleMessage(
             target,
@@ -296,7 +305,10 @@
             undefined,
             undefined,
             [result],
-            undefined);
+            undefined,
+            undefined,
+            undefined,
+            scriptId);
         target.consoleModel.addMessage(consoleMessage);
     },
 
@@ -318,7 +330,10 @@
             exceptionDetails.columnNumber,
             undefined,
             undefined,
-            exceptionDetails.stackTrace);
+            exceptionDetails.stackTrace,
+            undefined,
+            undefined,
+            exceptionDetails.stackTrace ? undefined : exceptionDetails.scriptId);
         target.consoleModel.addMessage(consoleMessage);
     },
 
diff --git a/third_party/WebKit/Source/devtools/front_end/source_frame/CodeMirrorUtils.js b/third_party/WebKit/Source/devtools/front_end/source_frame/CodeMirrorUtils.js
index 1098c1ed..0a252b71 100644
--- a/third_party/WebKit/Source/devtools/front_end/source_frame/CodeMirrorUtils.js
+++ b/third_party/WebKit/Source/devtools/front_end/source_frame/CodeMirrorUtils.js
@@ -132,6 +132,7 @@
         var codeMirror = new window.CodeMirror(element, {
             mode: config.mode,
             lineWrapping: config.lineWrapping,
+            lineWiseCopyCut: false,
             smartIndent: config.smartIndent,
             autofocus: true,
             theme: config.theme,
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/EventListenerBreakpointsSidebarPane.js b/third_party/WebKit/Source/devtools/front_end/sources/EventListenerBreakpointsSidebarPane.js
index cf08dd0..733b963 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/EventListenerBreakpointsSidebarPane.js
+++ b/third_party/WebKit/Source/devtools/front_end/sources/EventListenerBreakpointsSidebarPane.js
@@ -303,7 +303,7 @@
             breakpointItem = this._findBreakpointItem(eventName, WebInspector.EventListenerBreakpointsSidebarPane.eventTargetAny);
         if (!breakpointItem)
             return;
-        this.requestReveal();
+        this.revealWidget();
         breakpointItem.parent.element.expand();
         breakpointItem.element.listItemElement.classList.add("breakpoint-hit");
         this._highlightedElement = breakpointItem.element.listItemElement;
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptBreakpointsSidebarPane.js b/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptBreakpointsSidebarPane.js
index e3da8ca6..780d931 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptBreakpointsSidebarPane.js
+++ b/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptBreakpointsSidebarPane.js
@@ -113,7 +113,7 @@
         var breakpointItem = { element: element, checkbox: checkboxLabel.checkboxElement };
         this._items.set(breakpoint, breakpointItem);
 
-        this.requestReveal();
+        this.revealWidget();
     },
 
     /**
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/ScopeChainSidebarPane.js b/third_party/WebKit/Source/devtools/front_end/sources/ScopeChainSidebarPane.js
index 9f8d24b..8be8742 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/ScopeChainSidebarPane.js
+++ b/third_party/WebKit/Source/devtools/front_end/sources/ScopeChainSidebarPane.js
@@ -58,7 +58,7 @@
 
         if (!callFrame) {
             var infoElement = createElement("div");
-            infoElement.className = "info";
+            infoElement.className = "gray-info-message";
             infoElement.textContent = WebInspector.UIString("Not Paused");
             this.element.appendChild(infoElement);
             return;
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/SourcesPanel.js b/third_party/WebKit/Source/devtools/front_end/sources/SourcesPanel.js
index ba246e1..8f57885 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/SourcesPanel.js
+++ b/third_party/WebKit/Source/devtools/front_end/sources/SourcesPanel.js
@@ -28,6 +28,7 @@
  * @constructor
  * @extends {WebInspector.Panel}
  * @implements {WebInspector.ContextMenu.Provider}
+ * @implements {WebInspector.TargetManager.Observer}
  * @param {!WebInspector.Workspace=} workspaceForTest
  */
 WebInspector.SourcesPanel = function(workspaceForTest)
@@ -74,7 +75,7 @@
     this.editorView.setMainWidget(this._sourcesView);
 
     this.sidebarPanes = {};
-    this.sidebarPanes.threads = new WebInspector.ThreadsSidebarPane();
+    this.sidebarPanes.threads = null;
     this.sidebarPanes.watchExpressions = new WebInspector.WatchExpressionsSidebarPane();
     this.sidebarPanes.callstack = new WebInspector.CallStackSidebarPane();
     this.sidebarPanes.callstack.addEventListener(WebInspector.CallStackSidebarPane.Events.CallFrameSelected, this._callFrameSelectedInSidebar.bind(this));
@@ -112,6 +113,7 @@
     new WebInspector.WorkspaceMappingTip(this, this._workspace);
     WebInspector.extensionServer.addEventListener(WebInspector.ExtensionServer.Events.SidebarPaneAdded, this._extensionSidebarPaneAdded, this);
     WebInspector.DataSaverInfobar.maybeShowInPanel(this);
+    WebInspector.targetManager.observeTargets(this);
 }
 
 WebInspector.SourcesPanel._lastModificationTimeout = 200;
@@ -120,6 +122,29 @@
 
 WebInspector.SourcesPanel.prototype = {
     /**
+     * @override
+     * @param {!WebInspector.Target} target
+     */
+    targetAdded: function(target)
+    {
+        var hasThreads = WebInspector.targetManager.targets(WebInspector.Target.Capability.JS).length > 1;
+        if (hasThreads && !this.sidebarPanes.threads) {
+            this.sidebarPanes.threads = new WebInspector.ThreadsSidebarPane();
+            if (this._sidebarPaneStack) {
+                this._sidebarPaneStack.insertViewBefore(this.sidebarPanes.threads, this._splitWidget.isVertical() ? this.sidebarPanes.watchExpressions : this.sidebarPanes.callstack, true);
+            }
+        }
+    },
+
+    /**
+     * @override
+     * @param {!WebInspector.Target} target
+     */
+    targetRemoved: function(target)
+    {
+    },
+
+    /**
      * @param {?WebInspector.Target} target
      */
     _setTarget: function(target)
@@ -1092,39 +1117,41 @@
         var vbox = new WebInspector.VBox();
         vbox.element.appendChild(this._debugToolbarDrawer);
         vbox.setMinimumAndPreferredSizes(25, 25, WebInspector.SourcesPanel.minToolbarWidth, 100);
-        var sidebarPaneStack = new WebInspector.SidebarPaneStack();
-        sidebarPaneStack.element.classList.add("flex-auto");
-        sidebarPaneStack.show(vbox.element);
+        this._sidebarPaneStack = new WebInspector.View.ExpandableStackContainer();
+        this._sidebarPaneStack.show(vbox.element);
         vbox.element.appendChild(this._debugToolbar.element);
 
         if (!vertically) {
             // Populate the only stack.
-            for (var pane in this.sidebarPanes)
-                sidebarPaneStack.addPane(this.sidebarPanes[pane]);
-            this._extensionSidebarPanesContainer = sidebarPaneStack;
+            for (var pane in this.sidebarPanes) {
+                if (this.sidebarPanes[pane])
+                    this._sidebarPaneStack.appendView(this.sidebarPanes[pane]);
+            }
+            this._extensionSidebarPanesContainer = this._sidebarPaneStack;
             this.sidebarPaneView = vbox;
 
-            this.sidebarPanes.scopechain.requestReveal();
+            this.sidebarPanes.scopechain.revealWidget();
             this.sidebarPanes.watchExpressions.expandIfNecessary();
         } else {
             var splitWidget = new WebInspector.SplitWidget(true, true, "sourcesPanelDebuggerSidebarSplitViewState", 0.5);
             splitWidget.setMainWidget(vbox);
 
             // Populate the left stack.
-            sidebarPaneStack.addPane(this.sidebarPanes.threads);
-            sidebarPaneStack.addPane(this.sidebarPanes.callstack);
-            sidebarPaneStack.addPane(this.sidebarPanes.jsBreakpoints);
-            sidebarPaneStack.addPane(this.sidebarPanes.domBreakpoints);
-            sidebarPaneStack.addPane(this.sidebarPanes.xhrBreakpoints);
-            sidebarPaneStack.addPane(this.sidebarPanes.eventListenerBreakpoints);
-            sidebarPaneStack.addPane(this.sidebarPanes.objectEventListeners);
+            if (this.sidebarPanes.threads)
+                this._sidebarPaneStack.appendView(this.sidebarPanes.threads);
+            this._sidebarPaneStack.appendView(this.sidebarPanes.callstack);
+            this._sidebarPaneStack.appendView(this.sidebarPanes.jsBreakpoints);
+            this._sidebarPaneStack.appendView(this.sidebarPanes.domBreakpoints);
+            this._sidebarPaneStack.appendView(this.sidebarPanes.xhrBreakpoints);
+            this._sidebarPaneStack.appendView(this.sidebarPanes.eventListenerBreakpoints);
+            this._sidebarPaneStack.appendView(this.sidebarPanes.objectEventListeners);
 
-            var tabbedPane = new WebInspector.SidebarTabbedPane();
+            var tabbedPane = new WebInspector.View.TabbedPaneContainer();
             splitWidget.setSidebarWidget(tabbedPane);
-            tabbedPane.addPane(this.sidebarPanes.scopechain);
-            tabbedPane.addPane(this.sidebarPanes.watchExpressions);
+            tabbedPane.appendView(this.sidebarPanes.scopechain);
+            tabbedPane.appendView(this.sidebarPanes.watchExpressions);
             if (this.sidebarPanes.serviceWorkers)
-                tabbedPane.addPane(this.sidebarPanes.serviceWorkers);
+                tabbedPane.appendView(this.sidebarPanes.serviceWorkers);
             tabbedPane.selectTab(this._lastSelectedTabSetting.get());
             tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected, this._tabSelected, this);
             this._extensionSidebarPanesContainer = tabbedPane;
@@ -1136,9 +1163,10 @@
             this._addExtensionSidebarPane(extensionSidebarPanes[i]);
 
         this._splitWidget.setSidebarWidget(this.sidebarPaneView);
-        this.sidebarPanes.threads.requestReveal();
-        this.sidebarPanes.jsBreakpoints.requestReveal();
-        this.sidebarPanes.callstack.requestReveal();
+        if (this.sidebarPanes.threads)
+            this.sidebarPanes.threads.revealWidget();
+        this.sidebarPanes.jsBreakpoints.revealWidget();
+        this.sidebarPanes.callstack.revealWidget();
     },
 
     /**
@@ -1164,7 +1192,7 @@
     _addExtensionSidebarPane: function(pane)
     {
         if (pane.panelName() === this.name)
-            this._extensionSidebarPanesContainer.addPane(pane);
+            this._extensionSidebarPanesContainer.appendView(pane);
     },
 
     /**
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/ThreadsSidebarPane.js b/third_party/WebKit/Source/devtools/front_end/sources/ThreadsSidebarPane.js
index 046eca1..5b7d53c 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/ThreadsSidebarPane.js
+++ b/third_party/WebKit/Source/devtools/front_end/sources/ThreadsSidebarPane.js
@@ -10,7 +10,6 @@
 WebInspector.ThreadsSidebarPane = function()
 {
     WebInspector.View.call(this, WebInspector.UIString("Threads"));
-    this.requestSetVisible(false);
 
     /** @type {!Map.<!WebInspector.DebuggerModel, !WebInspector.UIList.Item>} */
     this._debuggerModelToListItems = new Map();
@@ -35,10 +34,8 @@
     targetAdded: function(target)
     {
         var debuggerModel = WebInspector.DebuggerModel.fromTarget(target)
-        if (!debuggerModel) {
-            this._updateVisibility();
+        if (!debuggerModel)
             return;
-        }
 
         var executionContext = target.runtimeModel.defaultExecutionContext();
         var label = executionContext && executionContext.label() ? executionContext.label() : target.name();
@@ -52,13 +49,6 @@
         this._listItemsToTargets.set(listItem, target);
         this.threadList.addItem(listItem);
         this._updateDebuggerState(debuggerModel);
-        this._updateVisibility();
-    },
-
-    _updateVisibility: function()
-    {
-        this._wasVisibleAtLeastOnce = this._wasVisibleAtLeastOnce || this._debuggerModelToListItems.size > 1;
-        this.requestSetVisible(this._wasVisibleAtLeastOnce);
     },
 
     /**
@@ -75,7 +65,6 @@
             this._listItemsToTargets.remove(listItem);
             this.threadList.removeItem(listItem);
         }
-        this._updateVisibility();
     },
 
     /**
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/WatchExpressionsSidebarPane.js b/third_party/WebKit/Source/devtools/front_end/sources/WatchExpressionsSidebarPane.js
index 354299b..54ef09fb 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/WatchExpressionsSidebarPane.js
+++ b/third_party/WebKit/Source/devtools/front_end/sources/WatchExpressionsSidebarPane.js
@@ -75,7 +75,7 @@
      */
     addExpression: function(expressionString)
     {
-        this.requestReveal();
+        this.revealWidget();
         if (this._requiresUpdate) {
             this._rebuildWatchExpressions();
             delete this._requiresUpdate;
@@ -87,7 +87,7 @@
     expandIfNecessary: function()
     {
         if (this._watchExpressionsSetting.get().length)
-            this.requestReveal();
+            this.revealWidget();
     },
 
     _saveExpressions: function()
@@ -116,7 +116,7 @@
     {
         if (event)
             event.consume(true);
-        this.requestReveal();
+        this.revealWidget();
         this._createWatchExpression(null).startEditing();
     },
 
@@ -134,7 +134,7 @@
         this._linkifier.reset();
         this._bodyElement.removeChildren();
         this._watchExpressions = [];
-        this._emptyElement = this._bodyElement.createChild("div", "info");
+        this._emptyElement = this._bodyElement.createChild("div", "gray-info-message");
         this._emptyElement.textContent = WebInspector.UIString("No Watch Expressions");
         var watchExpressionStrings = this._watchExpressionsSetting.get();
         for (var i = 0; i < watchExpressionStrings.length; ++i) {
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/XHRBreakpointsSidebarPane.js b/third_party/WebKit/Source/devtools/front_end/sources/XHRBreakpointsSidebarPane.js
index 392e33f..251e80a 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/XHRBreakpointsSidebarPane.js
+++ b/third_party/WebKit/Source/devtools/front_end/sources/XHRBreakpointsSidebarPane.js
@@ -52,7 +52,7 @@
         if (event)
             event.consume();
 
-        this.requestReveal();
+        this.revealWidget();
 
         var inputElementContainer = createElementWithClass("p", "breakpoint-condition");
         inputElementContainer.textContent = WebInspector.UIString("Break when URL contains:");
@@ -217,7 +217,7 @@
         var element = this._breakpointElements.get(url);
         if (!element)
             return;
-        this.requestReveal();
+        this.revealWidget();
         element.classList.add("breakpoint-hit");
         this._highlightedElement = element;
     },
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/sourcesPanel.css b/third_party/WebKit/Source/devtools/front_end/sources/sourcesPanel.css
index 05b34ece..70f415e 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/sourcesPanel.css
+++ b/third_party/WebKit/Source/devtools/front_end/sources/sourcesPanel.css
@@ -233,10 +233,6 @@
     white-space: normal;
 }
 
-.scope-chain-sidebar-pane-section {
-    padding: 2px 4px 2px 4px;
-}
-
 .scope-chain-sidebar-pane-section-subtitle {
     float: right;
     margin-left: 5px;
@@ -253,7 +249,6 @@
 
 .scope-chain-sidebar-pane-section {
     padding: 2px 4px 2px 4px;
-    overflow: hidden;
 }
 
 .hidden-callframes-message {
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/SidebarPane.js b/third_party/WebKit/Source/devtools/front_end/ui/SidebarPane.js
deleted file mode 100644
index 1284f67..0000000
--- a/third_party/WebKit/Source/devtools/front_end/ui/SidebarPane.js
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @constructor
- * @param {!Element} container
- * @param {!WebInspector.View} pane
- */
-WebInspector.SidebarPaneTitle = function(container, pane)
-{
-    this._pane = pane;
-
-    this.element = container.createChild("div", "sidebar-pane-title");
-    this.element.textContent = pane.title();
-    this.element.tabIndex = 0;
-    this.element.addEventListener("click", this._toggleExpanded.bind(this), false);
-    this.element.addEventListener("keydown", this._onTitleKeyDown.bind(this), false);
-}
-
-WebInspector.SidebarPaneTitle.prototype = {
-    _expand: function()
-    {
-        this.element.classList.add("expanded");
-        this._pane.show(/** @type {!Element} */(this.element.parentElement), /** @type {?Element} */ (this.element.nextSibling));
-    },
-
-    _collapse: function()
-    {
-        this.element.classList.remove("expanded");
-        if (this._pane.element.parentNode === this.element.parentNode)
-            this._pane.detach();
-    },
-
-    _toggleExpanded: function()
-    {
-        if (this.element.classList.contains("expanded"))
-            this._collapse();
-        else
-            this._pane.requestReveal();
-    },
-
-    /**
-     * @param {!Event} event
-     */
-    _onTitleKeyDown: function(event)
-    {
-        if (isEnterKey(event) || event.keyCode === WebInspector.KeyboardShortcut.Keys.Space.code)
-            this._toggleExpanded();
-    }
-}
-
-/**
- * @constructor
- * @extends {WebInspector.Widget}
- */
-WebInspector.SidebarPaneStack = function()
-{
-    WebInspector.Widget.call(this);
-    this.setMinimumSize(25, 0);
-    this.element.classList.add("sidebar-pane-container");
-    /** @type {!Map.<!WebInspector.View, !WebInspector.SidebarPaneTitle>} */
-    this._titleByPane = new Map();
-}
-
-WebInspector.SidebarPaneStack.prototype = {
-    /**
-     * @param {!WebInspector.View} pane
-     */
-    addPane: function(pane)
-    {
-        var paneTitle = new WebInspector.SidebarPaneTitle(this.element, pane);
-        this._titleByPane.set(pane, paneTitle);
-        var toolbarItems = pane.toolbarItems();
-        if (toolbarItems.length) {
-            var toolbar = new WebInspector.Toolbar("", paneTitle.element);
-            for (var item of toolbarItems)
-                toolbar.appendToolbarItem(item);
-        }
-        pane.setRequestVisibleCallback(this._setPaneVisible.bind(this, pane));
-        pane.setRevealCallback(paneTitle._expand.bind(paneTitle));
-    },
-
-    /**
-     * @param {!WebInspector.View} pane
-     * @param {boolean} visible
-     */
-    _setPaneVisible: function(pane, visible)
-    {
-        var title = this._titleByPane.get(pane);
-        if (!title)
-            return;
-
-        title.element.classList.toggle("hidden", !visible);
-        pane.element.classList.toggle("sidebar-hidden-override", !visible);
-    },
-
-    __proto__: WebInspector.Widget.prototype
-}
-
-/**
- * @constructor
- * @extends {WebInspector.TabbedPane}
- */
-WebInspector.SidebarTabbedPane = function()
-{
-    WebInspector.TabbedPane.call(this);
-    this.element.classList.add("sidebar-pane-container", "sidebar-tabbed-pane");
-}
-
-WebInspector.SidebarTabbedPane._toolbarSymbol = Symbol("toolbar");
-
-WebInspector.SidebarTabbedPane.prototype = {
-    /**
-     * @param {!WebInspector.View} pane
-     */
-    addPane: function(pane)
-    {
-        // Detach first to trigger toolbar cleanup.
-        pane.detach();
-
-        var title = pane.title();
-        var toolbarItems = pane.toolbarItems();
-        if (toolbarItems.length) {
-            var toolbar = new WebInspector.Toolbar("");
-            pane[WebInspector.SidebarTabbedPane._toolbarSymbol] = toolbar;
-            pane.element.insertBefore(toolbar.element, pane.element.firstChild);
-            for (var item of toolbarItems)
-                toolbar.appendToolbarItem(item);
-        }
-        this.appendTab(title, title, pane);
-        pane.setRequestVisibleCallback(this._setPaneVisible.bind(this, pane));
-        pane.setRevealCallback(this.selectTab.bind(this, title));
-    },
-
-    /**
-     * @param {!WebInspector.Widget} widget
-     * @override
-     */
-    childWasDetached: function(widget)
-    {
-        WebInspector.TabbedPane.prototype.childWasDetached.call(this, widget);
-
-        var toolbar = widget[WebInspector.SidebarTabbedPane._toolbarSymbol];
-        if (toolbar)
-            toolbar.element.remove();
-    },
-
-    /**
-     * @param {!WebInspector.View} pane
-     * @param {boolean} visible
-     */
-    _setPaneVisible: function(pane, visible)
-    {
-        var title = pane.title();
-        if (visible) {
-            if (!this.hasTab(title))
-                this.appendTab(title, title, pane);
-        } else {
-            if (this.hasTab(title))
-                this.closeTab(title);
-        }
-    },
-
-    __proto__: WebInspector.TabbedPane.prototype
-}
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/TabbedPane.js b/third_party/WebKit/Source/devtools/front_end/ui/TabbedPane.js
index 0fc7a2d..ae8b2454 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/TabbedPane.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/TabbedPane.js
@@ -855,6 +855,25 @@
         this._automaticReorder = automatic;
     },
 
+    /**
+     * @override
+     * @param {!WebInspector.Widget} child
+     * @return {boolean}
+     */
+    revealChild: function(child)
+    {
+        if (this._currentTabLocked)
+            return false;
+
+        for (var tabId of this.tabIds()) {
+            if (this.tabView(tabId) === child) {
+                this.selectTab(tabId);
+                return true;
+            }
+        }
+        return false;
+    },
+
     __proto__: WebInspector.VBox.prototype
 }
 
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js b/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
index 695643f0..3292b331 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
@@ -1278,8 +1278,6 @@
     var body = /** @type {!Element} */ (document.body);
     WebInspector.appendStyle(body, "ui/inspectorStyle.css");
     WebInspector.appendStyle(body, "ui/popover.css");
-    WebInspector.appendStyle(body, "ui/sidebarPane.css");
-
 }
 
 /**
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/ViewContainers.js b/third_party/WebKit/Source/devtools/front_end/ui/ViewContainers.js
new file mode 100644
index 0000000..5f79c4c
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/ui/ViewContainers.js
@@ -0,0 +1,220 @@
+// 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.
+
+/**
+ * @constructor
+ * @extends {WebInspector.VBox}
+ * @param {!WebInspector.View} view
+ */
+WebInspector.View._ContainerWidget = function(view)
+{
+    WebInspector.VBox.call(this);
+    this.element.classList.add("flex-auto", "view-container", "overflow-auto");
+
+    var toolbarItems = view.toolbarItems();
+    if (toolbarItems.length) {
+        var toolbar = new WebInspector.Toolbar("", this.element);
+        for (var item of toolbarItems)
+            toolbar.appendToolbarItem(item);
+    }
+
+    view.show(this.element);
+}
+
+WebInspector.View._ContainerWidget.prototype = {
+    __proto__: WebInspector.VBox.prototype
+}
+
+/**
+ * @constructor
+ * @extends {WebInspector.VBox}
+ * @param {!WebInspector.View} view
+ * @param {boolean} expanded
+ */
+WebInspector.View._ExpandableContainerWidget = function(view, expanded)
+{
+    WebInspector.VBox.call(this, true);
+    this.element.classList.add("flex-none");
+    this.registerRequiredCSS("ui/viewContainers.css");
+
+    this._titleElement = createElementWithClass("div", "expandable-view-title");
+    this._titleElement.textContent = view.title();
+    this._titleElement.tabIndex = 0;
+    this._titleElement.addEventListener("click", this._toggleExpanded.bind(this), false);
+    this._titleElement.addEventListener("keydown", this._onTitleKeyDown.bind(this), false);
+    this.contentElement.insertBefore(this._titleElement, this.contentElement.firstChild);
+    var toolbarElement = this.contentElement.createChild("div");
+    var toolbarItems = view.toolbarItems();
+    if (toolbarItems.length) {
+        var toolbar = new WebInspector.Toolbar("", this._titleElement);
+        for (var item of toolbarItems)
+            toolbar.appendToolbarItem(item);
+    }
+
+    this.contentElement.createChild("content");
+    this._view = view;
+    this._view.attach(this);
+    this._view[WebInspector.View._ExpandableContainerWidget._elementSymbol] = this.element;
+    if (expanded)
+        this.revealChild(this._view);
+}
+
+WebInspector.View._ExpandableContainerWidget._elementSymbol = Symbol("container-widget-element");
+
+WebInspector.View._ExpandableContainerWidget.prototype = {
+    /**
+     * @override
+     * @param {!WebInspector.Widget} child
+     * @return {boolean}
+     */
+    revealChild: function(child)
+    {
+        if (this._titleElement.classList.contains("expanded"))
+            return true;
+        this._titleElement.classList.add("expanded");
+        this._view.showWidget(this.element);
+        return true;
+    },
+
+    _collapse: function()
+    {
+        if (!this._titleElement.classList.contains("expanded"))
+            return;
+        this._titleElement.classList.remove("expanded");
+        this._view.hideWidget();
+    },
+
+    _toggleExpanded: function()
+    {
+        if (this._titleElement.classList.contains("expanded"))
+            this._collapse();
+        else
+            this.revealChild(this._view);
+    },
+
+    /**
+     * @param {!Event} event
+     */
+    _onTitleKeyDown: function(event)
+    {
+        if (isEnterKey(event) || event.keyCode === WebInspector.KeyboardShortcut.Keys.Space.code)
+            this._toggleExpanded();
+    },
+
+    /**
+     * @param {!WebInspector.Widget} widget
+     * @override
+     */
+    childWasDetached: function(widget)
+    {
+        WebInspector.VBox.prototype.childWasDetached.call(this, widget);
+        delete this._view[WebInspector.View._ExpandableContainerWidget._elementSymbol];
+    },
+
+    __proto__: WebInspector.VBox.prototype
+}
+
+/**
+ * @interface {WebInspector.TabbedPane}
+ */
+WebInspector.View.Container = function()
+{
+}
+
+WebInspector.View.Container.prototype = {
+    /**
+     * @param {!WebInspector.View} view
+     * @param {boolean=} reveal
+     */
+    appendView: function(view, reveal) { },
+
+    /**
+     * @param {!WebInspector.View} view
+     * @param {?WebInspector.View} insertBefore
+     * @param {boolean=} reveal
+     */
+    insertViewBefore: function(view, insertBefore, reveal) { }
+}
+
+/**
+ * @constructor
+ * @extends {WebInspector.TabbedPane}
+ * @implements {WebInspector.View.Container}
+ */
+WebInspector.View.TabbedPaneContainer = function()
+{
+    WebInspector.TabbedPane.call(this);
+}
+
+WebInspector.View.TabbedPaneContainer.prototype = {
+    /**
+     * @param {!WebInspector.View} view
+     * @param {boolean=} reveal
+     * @override
+     */
+    appendView: function(view, reveal)
+    {
+        this.insertViewBefore(view, null, reveal);
+    },
+
+    /**
+     * @param {!WebInspector.View} view
+     * @param {?WebInspector.View} insertBefore
+     * @param {boolean=} reveal
+     * @override
+     */
+    insertViewBefore: function(view, insertBefore, reveal)
+    {
+        var widgets = this.tabViews();
+        var index = 0;
+        for (var i = 0; insertBefore && i < widgets.length; ++i) {
+            if (widgets[i]._view === insertBefore) {
+                index = i;
+                break;
+            }
+        }
+        this.appendTab(view.title(), view.title(), new WebInspector.View._ContainerWidget(view), undefined, false, false, insertBefore ? index : undefined);
+        if (reveal)
+            this.selectTab(view.title());
+    },
+
+    __proto__: WebInspector.TabbedPane.prototype
+}
+
+/**
+ * @constructor
+ * @extends {WebInspector.VBox}
+ * @implements {WebInspector.View.Container}
+ */
+WebInspector.View.ExpandableStackContainer = function()
+{
+    WebInspector.VBox.call(this);
+    this.element.classList.add("flex-auto", "overflow-auto");
+}
+
+WebInspector.View.ExpandableStackContainer.prototype = {
+
+    /**
+     * @param {!WebInspector.View} view
+     * @param {boolean=} reveal
+     * @override
+     */
+    appendView: function(view, reveal)
+    {
+        this.insertViewBefore(view, null, reveal);
+    },
+
+    /**
+     * @param {!WebInspector.View} view
+     * @param {?WebInspector.View} insertBefore
+     * @param {boolean=} reveal
+     * @override
+     */
+    insertViewBefore: function(view, insertBefore, reveal)
+    {
+        new WebInspector.View._ExpandableContainerWidget(view, reveal || false).show(this.contentElement, insertBefore ? insertBefore[WebInspector.View._ExpandableContainerWidget._elementSymbol] : null);
+    },
+
+    __proto__: WebInspector.VBox.prototype
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/Widget.js b/third_party/WebKit/Source/devtools/front_end/ui/Widget.js
index bed99405..8866bcb 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/Widget.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/Widget.js
@@ -256,11 +256,13 @@
         else
             WebInspector.Widget.__assert(currentParent && currentParent.__widget === this._parentWidget, "Attempt to show under node belonging to alien widget");
 
-        if (this._visible)
+        var wasVisible = this._visible;
+        if (wasVisible && this.element.parentElement === parentElement)
             return;
+
         this._visible = true;
 
-        if (this._parentIsShowing())
+        if (!wasVisible && this._parentIsShowing())
             this._processWillShow();
 
         this.element.classList.remove("hidden");
@@ -274,7 +276,7 @@
                 WebInspector.Widget._originalAppendChild.call(parentElement, this.element);
         }
 
-        if (this._parentIsShowing())
+        if (!wasVisible && this._parentIsShowing())
             this._processWasShown();
 
         if (this._parentWidget && this._hasNonZeroConstraints())
@@ -551,6 +553,25 @@
             this._parentWidget.doLayout();
     },
 
+    /**
+     * @return {boolean}
+     */
+    revealWidget: function()
+    {
+        if (!this._parentWidget)
+            return this._isRoot;
+        if (!this._parentWidget.revealChild(this))
+            return false;
+        return this._parentWidget.revealWidget();
+    },
+
+    /**
+     * @param {!WebInspector.Widget} widget
+     * @return {boolean}
+     * @protected
+     */
+    revealChild: function(widget) { return true; },
+
     __proto__: WebInspector.Object.prototype
 }
 
@@ -696,7 +717,6 @@
 WebInspector.View = function(title, isWebComponent)
 {
     WebInspector.VBox.call(this, isWebComponent);
-    this.element.classList.add("view");
     this._title = title;
     /** @type {!Array<!WebInspector.ToolbarItem>} */
     this._toolbarItems = [];
@@ -712,49 +732,6 @@
     },
 
     /**
-     * @param {function()} callback
-     */
-    setRevealCallback: function(callback)
-    {
-        this._revealCallback = callback;
-        if (this._setRevealRequested) {
-            callback();
-            delete this._setRevealRequested;
-        }
-    },
-
-    /**
-     * @param {function(boolean)} callback
-     */
-    setRequestVisibleCallback: function(callback)
-    {
-        this._requestVisibleCallback = callback;
-        if (this._setVisibleRequested !== undefined) {
-            callback(this._setVisibleRequested);
-            delete this._setVisibleRequested;
-        }
-    },
-
-    requestReveal: function()
-    {
-        if (this._revealCallback)
-            this._revealCallback();
-        else
-            this._setRevealRequested = true;
-    },
-
-    /**
-     * @param {boolean} visible
-     */
-    requestSetVisible: function(visible)
-    {
-        if (this._requestVisibleCallback)
-            this._requestVisibleCallback(visible);
-        else
-            this._setVisibleRequested = visible;
-    },
-
-    /**
      * @param {!WebInspector.ToolbarItem} item
      */
     addToolbarItem: function(item)
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/inspectorCommon.css b/third_party/WebKit/Source/devtools/front_end/ui/inspectorCommon.css
index b22cebb..ab89341 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/inspectorCommon.css
+++ b/third_party/WebKit/Source/devtools/front_end/ui/inspectorCommon.css
@@ -89,6 +89,10 @@
     position: relative;
 }
 
+.view-container > .toolbar {
+    border-bottom: 1px solid #eee;
+}
+
 .flex-auto {
     flex: auto;
 }
@@ -107,6 +111,10 @@
     justify-content: center;
 }
 
+.overflow-auto {
+    overflow: auto;
+}
+
 iframe.widget {
     position: absolute;
     width: 100%;
@@ -274,6 +282,13 @@
     -webkit-box-shadow: inset 0 0 1px rgba(255,255,255,0.5);
 }
 
+.gray-info-message {
+    text-align: center;
+    font-style: italic;
+    padding: 6px;
+    color: #888;
+}
+
 label[is=dt-icon-label] {
     flex: none;
 }
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/module.json b/third_party/WebKit/Source/devtools/front_end/ui/module.json
index 32d347b..04349de3 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/ui/module.json
@@ -45,8 +45,8 @@
         "Tooltip.js",
         "SuggestBox.js",
         "TabbedPane.js",
-        "SidebarPane.js",
         "UIUtils.js",
+        "ViewContainers.js",
         "ViewportControl.js",
         "ZoomManager.js"
     ],
@@ -71,7 +71,7 @@
         "radioButton.css",
         "reportView.css",
         "searchableView.css",
-        "sidebarPane.css",
+        "viewContainers.css",
         "smallIcon.css",
         "softContextMenu.css",
         "splitWidget.css",
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/sidebarPane.css b/third_party/WebKit/Source/devtools/front_end/ui/viewContainers.css
similarity index 87%
rename from third_party/WebKit/Source/devtools/front_end/ui/sidebarPane.css
rename to third_party/WebKit/Source/devtools/front_end/ui/viewContainers.css
index 5a56671..2ce52a00 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/sidebarPane.css
+++ b/third_party/WebKit/Source/devtools/front_end/ui/viewContainers.css
@@ -27,18 +27,11 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-.sidebar-pane-container .info {
-    text-align: center;
-    font-style: italic;
-    padding: 6px;
-    color: #888;
-}
-
 .sidebar-hidden-override {
     display: none !important;
 }
 
-.sidebar-pane-title {
+.expandable-view-title {
     display: flex;
     align-items: center;
     background-color: #eee;
@@ -50,12 +43,12 @@
     position: relative;
 }
 
-.sidebar-pane-title.expanded,
-.sidebar-pane-title:last-child {
+.expandable-view-title.expanded,
+.expandable-view-title:last-child {
     border-bottom: 1px solid #ddd;
 }
 
-.sidebar-pane-title::before {
+.expandable-view-title::before {
     -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);
     -webkit-mask-size: 352px 168px;
     background-color: #888;
@@ -69,25 +62,29 @@
 }
 
 @media (-webkit-min-device-pixel-ratio: 1.5) {
-.sidebar-pane-title::before {
+.expandable-view-title::before {
     -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);
 }
 } /* media */
 
-.sidebar-pane-title::before {
+.expandable-view-title::before {
     -webkit-mask-position: -4px -96px;
 }
 
-.sidebar-pane-title.expanded::before {
+.expandable-view-title.expanded::before {
     -webkit-mask-position: -20px -96px;
 }
 
+.expandable-view-title > .toolbar {
+    position: absolute;
+    right: 0;
+    top: -3px;
+}
+
+.sidebar-pane-container .toolbar {
+    border-bottom: 1px solid #eee;
+}
+
 .sidebar-pane-container .toolbar > * {
     pointer-events: auto;
 }
-
-.sidebar-pane-title > .toolbar {
-    position: absolute;
-    right: 0;
-    top: -3px;
-}
diff --git a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
index 25f61a6..369c698d 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp
@@ -33,6 +33,7 @@
 #include "core/dom/NodeTraversal.h"
 #include "core/dom/Text.h"
 #include "core/dom/shadow/FlatTreeTraversal.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/editing/markers/DocumentMarkerController.h"
 #include "core/frame/FrameView.h"
 #include "core/html/HTMLDListElement.h"
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp b/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp
index b10b14c..7c75ba6 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXObjectCacheImpl.cpp
@@ -31,6 +31,7 @@
 #include "core/HTMLNames.h"
 #include "core/InputTypeNames.h"
 #include "core/dom/Document.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/frame/FrameView.h"
 #include "core/frame/LocalFrame.h"
 #include "core/frame/Settings.h"
diff --git a/third_party/WebKit/Source/modules/accessibility/AXTable.cpp b/third_party/WebKit/Source/modules/accessibility/AXTable.cpp
index 348445d..877de41 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXTable.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXTable.cpp
@@ -29,6 +29,7 @@
 #include "modules/accessibility/AXTable.h"
 
 #include "core/dom/ElementTraversal.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/html/HTMLCollection.h"
 #include "core/html/HTMLTableCaptionElement.h"
 #include "core/html/HTMLTableCellElement.h"
diff --git a/third_party/WebKit/Source/modules/notifications/NotificationImageLoader.cpp b/third_party/WebKit/Source/modules/notifications/NotificationImageLoader.cpp
index 3b545f9..298931c6 100644
--- a/third_party/WebKit/Source/modules/notifications/NotificationImageLoader.cpp
+++ b/third_party/WebKit/Source/modules/notifications/NotificationImageLoader.cpp
@@ -94,7 +94,7 @@
         DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, fileSizeHistogram, new CustomCountHistogram("Notifications.Icon.FileSize", 1, 10000000 /* ~10mb max */, 50 /* buckets */));
         fileSizeHistogram.count(m_data->size());
 
-        std::unique_ptr<ImageDecoder> decoder = ImageDecoder::create(*m_data.get(), ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied);
+        std::unique_ptr<ImageDecoder> decoder = ImageDecoder::create(ImageDecoder::determineImageType(*m_data.get()), ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied);
         if (decoder) {
             decoder->setData(m_data.get(), true /* allDataReceived */);
             // The |ImageFrame*| is owned by the decoder.
diff --git a/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationController.cpp b/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationController.cpp
index a1a1186ce..d87d188 100644
--- a/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationController.cpp
+++ b/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationController.cpp
@@ -13,6 +13,7 @@
 #include "modules/screen_orientation/ScreenOrientation.h"
 #include "modules/screen_orientation/ScreenOrientationDispatcher.h"
 #include "platform/LayoutTestSupport.h"
+#include "platform/ScopedOrientationChangeIndicator.h"
 #include "public/platform/WebScreenInfo.h"
 #include "public/platform/modules/screen_orientation/WebScreenOrientationClient.h"
 
@@ -174,6 +175,8 @@
 {
     if (!m_orientation)
         return;
+
+    ScopedOrientationChangeIndicator orientationChangeIndicator;
     m_orientation->dispatchEvent(Event::create(EventTypeNames::change));
 }
 
diff --git a/third_party/WebKit/Source/platform/ScopedOrientationChangeIndicator.cpp b/third_party/WebKit/Source/platform/ScopedOrientationChangeIndicator.cpp
new file mode 100644
index 0000000..50cc22d
--- /dev/null
+++ b/third_party/WebKit/Source/platform/ScopedOrientationChangeIndicator.cpp
@@ -0,0 +1,34 @@
+// 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 "platform/ScopedOrientationChangeIndicator.h"
+
+#include "wtf/Assertions.h"
+
+namespace blink {
+
+ScopedOrientationChangeIndicator::State ScopedOrientationChangeIndicator::s_state = ScopedOrientationChangeIndicator::State::NotProcessing;
+
+ScopedOrientationChangeIndicator::ScopedOrientationChangeIndicator()
+{
+    DCHECK(isMainThread());
+
+    m_previousState = s_state;
+    s_state = State::Processing;
+}
+
+ScopedOrientationChangeIndicator::~ScopedOrientationChangeIndicator()
+{
+    DCHECK(isMainThread());
+    s_state = m_previousState;
+}
+
+// static
+bool ScopedOrientationChangeIndicator::processingOrientationChange()
+{
+    DCHECK(isMainThread());
+    return s_state == State::Processing;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/platform/ScopedOrientationChangeIndicator.h b/third_party/WebKit/Source/platform/ScopedOrientationChangeIndicator.h
new file mode 100644
index 0000000..a51db2d
--- /dev/null
+++ b/third_party/WebKit/Source/platform/ScopedOrientationChangeIndicator.h
@@ -0,0 +1,36 @@
+// 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 ScopedOrientationChangeIndicator_h
+#define ScopedOrientationChangeIndicator_h
+
+#include "platform/PlatformExport.h"
+#include "wtf/Allocator.h"
+#include "wtf/Noncopyable.h"
+
+namespace blink {
+
+class PLATFORM_EXPORT ScopedOrientationChangeIndicator final {
+    STACK_ALLOCATED();
+    WTF_MAKE_NONCOPYABLE(ScopedOrientationChangeIndicator);
+public:
+    static bool processingOrientationChange();
+
+    explicit ScopedOrientationChangeIndicator();
+    ~ScopedOrientationChangeIndicator();
+
+private:
+    enum class State {
+        Processing,
+        NotProcessing,
+    };
+
+    static State s_state;
+
+    State m_previousState = State::NotProcessing;
+};
+
+} // namespace blink
+
+#endif
diff --git a/third_party/WebKit/Source/platform/ScopedOrientationChangeIndicatorTest.cpp b/third_party/WebKit/Source/platform/ScopedOrientationChangeIndicatorTest.cpp
new file mode 100644
index 0000000..0b33179
--- /dev/null
+++ b/third_party/WebKit/Source/platform/ScopedOrientationChangeIndicatorTest.cpp
@@ -0,0 +1,53 @@
+// 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 "platform/ScopedOrientationChangeIndicator.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+
+TEST(ScopedOrientationChangeIndicatorTest, InitialState)
+{
+    EXPECT_FALSE(ScopedOrientationChangeIndicator::processingOrientationChange());
+}
+
+TEST(ScopedOrientationChangeIndicatorTest, ConstructOneIndicatorWithGesture)
+{
+    ScopedOrientationChangeIndicator indicator;
+
+    EXPECT_TRUE(ScopedOrientationChangeIndicator::processingOrientationChange());
+}
+
+TEST(ScopedOrientationChangeIndicatorTest, MultipleIndicatorInTheSameScope)
+{
+    ScopedOrientationChangeIndicator indicator1;
+
+    EXPECT_TRUE(ScopedOrientationChangeIndicator::processingOrientationChange());
+
+    ScopedOrientationChangeIndicator indicator2;
+
+    EXPECT_TRUE(ScopedOrientationChangeIndicator::processingOrientationChange());
+}
+
+TEST(ScopedOrientationChangeIndicatorTest, DestructResetsStateUsingGesture)
+{
+    {
+        ScopedOrientationChangeIndicator indicator;
+    }
+
+    EXPECT_FALSE(ScopedOrientationChangeIndicator::processingOrientationChange());
+}
+
+TEST(ScopedOrientationChangeIndicatorTest, DestructResetsStateUsingNoGesture)
+{
+    ScopedOrientationChangeIndicator indicator;
+    {
+        ScopedOrientationChangeIndicator indicator;
+    }
+
+    EXPECT_TRUE(ScopedOrientationChangeIndicator::processingOrientationChange());
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/platform/blink_platform.gypi b/third_party/WebKit/Source/platform/blink_platform.gypi
index b75d5b7b..bdf4a84 100644
--- a/third_party/WebKit/Source/platform/blink_platform.gypi
+++ b/third_party/WebKit/Source/platform/blink_platform.gypi
@@ -103,6 +103,8 @@
       'PrerenderClient.h',
       'PurgeableVector.cpp',
       'PurgeableVector.h',
+      'ScopedOrientationChangeIndicator.cpp',
+      'ScopedOrientationChangeIndicator.h',
       'ScriptForbiddenScope.cpp',
       'ScriptForbiddenScope.h',
       'SecureTextInput.cpp',
@@ -487,6 +489,8 @@
       'fonts/shaping/SimpleShaper.cpp',
       'fonts/shaping/SimpleShaper.h',
       'fonts/skia/FontCacheSkia.cpp',
+      'fonts/skia/SkiaTextMetrics.h',
+      'fonts/skia/SkiaTextMetrics.cpp',
       'fonts/win/FontCacheSkiaWin.cpp',
       'fonts/win/FontFallbackWin.cpp',
       'fonts/win/FontFallbackWin.h',
@@ -1142,6 +1146,7 @@
       'weborigin/Suborigin.h',
     ],
     'platform_test_files': [
+      'ScopedOrientationChangeIndicatorTest.cpp',
       'DecimalTest.cpp',
       'DragImageTest.cpp',
       'HistogramTest.cpp',
diff --git a/third_party/WebKit/Source/platform/exported/WebImage.cpp b/third_party/WebKit/Source/platform/exported/WebImage.cpp
index 31dc8d7..d4b14e3 100644
--- a/third_party/WebKit/Source/platform/exported/WebImage.cpp
+++ b/third_party/WebKit/Source/platform/exported/WebImage.cpp
@@ -46,7 +46,7 @@
 WebImage WebImage::fromData(const WebData& data, const WebSize& desiredSize)
 {
     RefPtr<SharedBuffer> buffer = PassRefPtr<SharedBuffer>(data);
-    std::unique_ptr<ImageDecoder> decoder(ImageDecoder::create(*buffer.get(), ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileIgnored));
+    std::unique_ptr<ImageDecoder> decoder(ImageDecoder::create(ImageDecoder::determineImageType(*buffer.get()), ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileIgnored));
     if (!decoder)
         return WebImage();
 
@@ -90,7 +90,7 @@
     const size_t maxFrameCount = 8;
 
     RefPtr<SharedBuffer> buffer = PassRefPtr<SharedBuffer>(data);
-    std::unique_ptr<ImageDecoder> decoder(ImageDecoder::create(*buffer.get(), ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileIgnored));
+    std::unique_ptr<ImageDecoder> decoder(ImageDecoder::create(ImageDecoder::determineImageType(*buffer.get()), ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileIgnored));
     if (!decoder)
         return WebVector<WebImage>();
 
diff --git a/third_party/WebKit/Source/platform/fonts/SimpleFontData.cpp b/third_party/WebKit/Source/platform/fonts/SimpleFontData.cpp
index efed5b90..07c7335 100644
--- a/third_party/WebKit/Source/platform/fonts/SimpleFontData.cpp
+++ b/third_party/WebKit/Source/platform/fonts/SimpleFontData.cpp
@@ -29,13 +29,13 @@
 
 #include "platform/fonts/SimpleFontData.h"
 
-#include "SkPaint.h"
 #include "SkPath.h"
 #include "SkTypeface.h"
 #include "SkTypes.h"
 #include "platform/fonts/FontDescription.h"
 #include "platform/fonts/GlyphPage.h"
 #include "platform/fonts/VDMXParser.h"
+#include "platform/fonts/skia/SkiaTextMetrics.h"
 #include "platform/geometry/FloatRect.h"
 #include "wtf/MathExtras.h"
 #include "wtf/PtrUtil.h"
@@ -91,12 +91,12 @@
         return;
     }
 
-    SkPaint paint;
     SkPaint::FontMetrics metrics;
 
-    m_platformData.setupPaint(&paint);
-    paint.getFontMetrics(&metrics);
-    SkTypeface* face = paint.getTypeface();
+    m_platformData.setupPaint(&m_paint);
+    m_paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
+    m_paint.getFontMetrics(&metrics);
+    SkTypeface* face = m_paint.getTypeface();
     ASSERT(face);
 
     int vdmxAscent = 0, vdmxDescent = 0;
@@ -108,9 +108,9 @@
     // This code should be pushed into FreeType (hinted font metrics).
     static const uint32_t vdmxTag = SkSetFourByteTag('V', 'D', 'M', 'X');
     int pixelSize = m_platformData.size() + 0.5;
-    if (!paint.isAutohinted()
-        &&    (paint.getHinting() == SkPaint::kFull_Hinting
-            || paint.getHinting() == SkPaint::kNormal_Hinting))
+    if (!m_paint.isAutohinted()
+        &&    (m_paint.getHinting() == SkPaint::kFull_Hinting
+            || m_paint.getHinting() == SkPaint::kNormal_Hinting))
     {
         size_t vdmxSize = face->getTableSize(vdmxTag);
         if (vdmxSize && vdmxSize < maxVDMXTableSize) {
@@ -371,54 +371,19 @@
     return SimpleFontData::create(FontPlatformData(m_platformData, scaledSize), isCustomFont() ? CustomFontData::create() : nullptr);
 }
 
-static inline void getSkiaBoundsForGlyph(SkPaint& paint, Glyph glyph, SkRect& bounds)
-{
-    paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
-
-    SkPath path;
-    paint.getTextPath(&glyph, sizeof(glyph), 0, 0, &path);
-    bounds = path.getBounds();
-
-    if (!paint.isSubpixelText()) {
-        SkIRect ir;
-        bounds.round(&ir);
-        bounds.set(ir);
-    }
-}
-
 FloatRect SimpleFontData::platformBoundsForGlyph(Glyph glyph) const
 {
-    if (!m_platformData.size())
-        return FloatRect();
-
-    SkASSERT(sizeof(glyph) == 2); // compile-time assert
-
-    SkPaint paint;
-    m_platformData.setupPaint(&paint);
-
     SkRect bounds;
-    getSkiaBoundsForGlyph(paint, glyph, bounds);
+    SkiaTextMetrics(&m_paint).getSkiaBoundsForGlyph(glyph, &bounds);
     return FloatRect(bounds);
 }
 
 float SimpleFontData::platformWidthForGlyph(Glyph glyph) const
 {
-    if (!m_platformData.size())
-        return 0;
-
-    SkASSERT(sizeof(glyph) == 2); // compile-time assert
-
-    SkPaint paint;
-
-    m_platformData.setupPaint(&paint);
-
-    paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
-    SkScalar width = paint.measureText(&glyph, 2);
-    if (!paint.isSubpixelText())
-        width = SkScalarRoundToInt(width);
-    return SkScalarToFloat(width);
+    return SkiaTextMetrics(&m_paint).getSkiaWidthForGlyph(glyph);
 }
 
+
 bool SimpleFontData::fillGlyphPage(GlyphPage* pageToFill, unsigned offset, unsigned length, UChar* buffer, unsigned bufferLength) const
 {
     if (U16_IS_LEAD(buffer[bufferLength-1])) {
diff --git a/third_party/WebKit/Source/platform/fonts/SimpleFontData.h b/third_party/WebKit/Source/platform/fonts/SimpleFontData.h
index 9cbeb8b..75ca7335 100644
--- a/third_party/WebKit/Source/platform/fonts/SimpleFontData.h
+++ b/third_party/WebKit/Source/platform/fonts/SimpleFontData.h
@@ -37,6 +37,7 @@
 #include "platform/geometry/FloatRect.h"
 #include "wtf/PtrUtil.h"
 #include "wtf/text/StringHash.h"
+#include <SkPaint.h>
 #include <memory>
 
 namespace blink {
@@ -95,8 +96,8 @@
     void setAvgCharWidth(float avgCharWidth) { m_avgCharWidth = avgCharWidth; }
 
     FloatRect boundsForGlyph(Glyph) const;
-    float widthForGlyph(Glyph glyph) const;
     FloatRect platformBoundsForGlyph(Glyph) const;
+    float widthForGlyph(Glyph) const;
     float platformWidthForGlyph(Glyph) const;
 
     float spaceWidth() const { return m_spaceWidth; }
@@ -143,9 +144,9 @@
     float m_avgCharWidth;
 
     FontPlatformData m_platformData;
-
     mutable std::unique_ptr<GlyphMetricsMap<FloatRect>> m_glyphToBoundsMap;
     mutable GlyphMetricsMap<float> m_glyphToWidthMap;
+    SkPaint m_paint;
 
     bool m_isTextOrientationFallback;
     RefPtr<OpenTypeVerticalData> m_verticalData;
@@ -182,24 +183,35 @@
     RefPtr<CustomFontData> m_customFontData;
 };
 
+
 ALWAYS_INLINE FloatRect SimpleFontData::boundsForGlyph(Glyph glyph) const
 {
-    FloatRect bounds;
+    if (!m_platformData.size())
+        return FloatRect();
+
+    static_assert(sizeof(glyph) == 2, "Glyph id should not be truncated.");
+
+    FloatRect boundsResult;
     if (m_glyphToBoundsMap) {
-        bounds = m_glyphToBoundsMap->metricsForGlyph(glyph);
-        if (bounds.width() != cGlyphSizeUnknown)
-            return bounds;
+        boundsResult = m_glyphToBoundsMap->metricsForGlyph(glyph);
+        if (boundsResult.width() != cGlyphSizeUnknown)
+            return boundsResult;
     }
 
-    bounds = platformBoundsForGlyph(glyph);
+    boundsResult = platformBoundsForGlyph(glyph);
     if (!m_glyphToBoundsMap)
         m_glyphToBoundsMap = wrapUnique(new GlyphMetricsMap<FloatRect>);
-    m_glyphToBoundsMap->setMetricsForGlyph(glyph, bounds);
-    return bounds;
+    m_glyphToBoundsMap->setMetricsForGlyph(glyph, boundsResult);
+
+    return boundsResult;
 }
 
 ALWAYS_INLINE float SimpleFontData::widthForGlyph(Glyph glyph) const
 {
+    if (!m_platformData.size())
+        return 0;
+    static_assert(sizeof(glyph) == 2, "Glyph id should not be truncated.");
+
     float width = m_glyphToWidthMap.metricsForGlyph(glyph);
     if (width != cGlyphSizeUnknown)
         return width;
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp
index 60dfefe..d3a5048c 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp
+++ b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp
@@ -36,6 +36,7 @@
 #include "platform/fonts/SimpleFontData.h"
 #include "platform/fonts/UnicodeRangeSet.h"
 #include "platform/fonts/shaping/HarfBuzzShaper.h"
+#include "platform/fonts/skia/SkiaTextMetrics.h"
 #include "wtf/HashMap.h"
 #include "wtf/MathExtras.h"
 #include "wtf/PtrUtil.h"
@@ -164,37 +165,6 @@
     return clampTo<int>(value * kHbPosition1);
 }
 
-static void SkiaGetGlyphWidthAndExtents(SkPaint* paint, hb_codepoint_t codepoint, hb_position_t* width, hb_glyph_extents_t* extents)
-{
-    ASSERT(codepoint <= 0xFFFF);
-    paint->setTextEncoding(SkPaint::kGlyphID_TextEncoding);
-
-    SkScalar skWidth;
-    SkRect skBounds;
-    uint16_t glyph = codepoint;
-
-    paint->getTextWidths(&glyph, sizeof(glyph), &skWidth, &skBounds);
-    if (width) {
-        if (!paint->isSubpixelText())
-            skWidth = SkScalarRoundToInt(skWidth);
-        *width = SkiaScalarToHarfBuzzPosition(skWidth);
-    }
-    if (extents) {
-        if (!paint->isSubpixelText()) {
-            // Use roundOut() rather than round() to avoid rendering glyphs
-            // outside the visual overflow rect. crbug.com/452914.
-            SkIRect ir;
-            skBounds.roundOut(&ir);
-            skBounds.set(ir);
-        }
-        // Invert y-axis because Skia is y-grows-down but we set up HarfBuzz to be y-grows-up.
-        extents->x_bearing = SkiaScalarToHarfBuzzPosition(skBounds.fLeft);
-        extents->y_bearing = SkiaScalarToHarfBuzzPosition(-skBounds.fTop);
-        extents->width = SkiaScalarToHarfBuzzPosition(skBounds.width());
-        extents->height = SkiaScalarToHarfBuzzPosition(-skBounds.height());
-    }
-}
-
 static hb_bool_t harfBuzzGetGlyph(hb_font_t* hbFont, void* fontData, hb_codepoint_t unicode, hb_codepoint_t variationSelector, hb_codepoint_t* glyph, void* userData)
 {
     HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData);
@@ -211,7 +181,7 @@
     HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData);
     hb_position_t advance = 0;
 
-    SkiaGetGlyphWidthAndExtents(&hbFontData->m_paint, glyph, &advance, 0);
+    SkiaTextMetrics(&hbFontData->m_paint).getGlyphWidthAndExtentsForHarfBuzz(glyph, &advance, 0);
     return advance;
 }
 
@@ -268,7 +238,7 @@
 {
     HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData);
 
-    SkiaGetGlyphWidthAndExtents(&hbFontData->m_paint, glyph, 0, extents);
+    SkiaTextMetrics(&hbFontData->m_paint).getGlyphWidthAndExtentsForHarfBuzz(glyph, 0, extents);
     return true;
 }
 
@@ -373,6 +343,7 @@
 hb_font_t* HarfBuzzFace::getScaledFont(PassRefPtr<UnicodeRangeSet> rangeSet) const
 {
     m_platformData->setupPaint(&m_harfBuzzFontData->m_paint);
+    m_harfBuzzFontData->m_paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
     m_harfBuzzFontData->m_rangeSet = rangeSet;
     m_harfBuzzFontData->m_simpleFontData = FontCache::fontCache()->fontDataFromFontPlatformData(m_platformData).get();
     ASSERT(m_harfBuzzFontData->m_simpleFontData);
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResult.cpp b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResult.cpp
index e05e7b1..098fc0f 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResult.cpp
+++ b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResult.cpp
@@ -215,7 +215,8 @@
     ASSERT(fallback);
     ASSERT(m_primaryFont);
     for (unsigned i = 0; i < m_runs.size(); ++i) {
-        if (m_runs[i] && m_runs[i]->m_fontData != m_primaryFont
+        if (m_runs[i] && m_runs[i]->m_fontData
+            && m_runs[i]->m_fontData != m_primaryFont
             && !m_runs[i]->m_fontData->isTextOrientationFallbackOf(m_primaryFont.get())) {
             fallback->add(m_runs[i]->m_fontData.get());
         }
@@ -311,7 +312,12 @@
 
         // One out of x_advance and y_advance is zero, depending on
         // whether the buffer direction is horizontal or vertical.
-        float advance = harfBuzzPositionToFloat(pos.x_advance - pos.y_advance);
+        // Convert to float and negate to avoid integer-overflow for ULONG_MAX.
+        float advance;
+        if (LIKELY(pos.x_advance))
+            advance = harfBuzzPositionToFloat(pos.x_advance);
+        else
+            advance = -harfBuzzPositionToFloat(pos.y_advance);
 
         run->m_glyphData[i].characterIndex =
             glyphInfos[startGlyph + i].cluster - startCluster;
diff --git a/third_party/WebKit/Source/platform/fonts/skia/SkiaTextMetrics.cpp b/third_party/WebKit/Source/platform/fonts/skia/SkiaTextMetrics.cpp
new file mode 100644
index 0000000..05e92c2
--- /dev/null
+++ b/third_party/WebKit/Source/platform/fonts/skia/SkiaTextMetrics.cpp
@@ -0,0 +1,88 @@
+// 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 "SkiaTextMetrics.h"
+
+#include "wtf/MathExtras.h"
+
+#include <SkPath.h>
+
+namespace blink {
+
+static hb_position_t SkiaScalarToHarfBuzzPosition(SkScalar value)
+{
+    // We treat HarfBuzz hb_position_t as 16.16 fixed-point.
+    static const int kHbPosition1 = 1 << 16;
+    return clampTo<int>(value * kHbPosition1);
+}
+
+SkiaTextMetrics::SkiaTextMetrics(const SkPaint* paint)
+    : m_paint(paint)
+{
+    CHECK(m_paint->getTextEncoding() == SkPaint::kGlyphID_TextEncoding);
+}
+
+void SkiaTextMetrics::getGlyphWidthAndExtentsForHarfBuzz(hb_codepoint_t codepoint, hb_position_t* width, hb_glyph_extents_t* extents)
+{
+    DCHECK_LE(codepoint, 0xFFFFu);
+
+    SkScalar skWidth;
+    SkRect skBounds;
+    uint16_t glyph = codepoint;
+
+    m_paint->getTextWidths(&glyph, sizeof(glyph), &skWidth, &skBounds);
+    if (width) {
+        if (!m_paint->isSubpixelText())
+            skWidth = SkScalarRoundToInt(skWidth);
+        *width = SkiaScalarToHarfBuzzPosition(skWidth);
+    }
+    if (extents) {
+        if (!m_paint->isSubpixelText()) {
+            // Use roundOut() rather than round() to avoid rendering glyphs
+            // outside the visual overflow rect. crbug.com/452914.
+            SkIRect ir;
+            skBounds.roundOut(&ir);
+            skBounds.set(ir);
+        }
+        // Invert y-axis because Skia is y-grows-down but we set up HarfBuzz to be y-grows-up.
+        extents->x_bearing = SkiaScalarToHarfBuzzPosition(skBounds.fLeft);
+        extents->y_bearing = SkiaScalarToHarfBuzzPosition(-skBounds.fTop);
+        extents->width = SkiaScalarToHarfBuzzPosition(skBounds.width());
+        extents->height = SkiaScalarToHarfBuzzPosition(-skBounds.height());
+    }
+}
+
+void SkiaTextMetrics::getSkiaBoundsForGlyph(Glyph glyph, SkRect *bounds)
+{
+#if OS(MACOSX)
+    // TODO(drott): Remove this once we have better metrics bounds
+    // on Mac, https://bugs.chromium.org/p/skia/issues/detail?id=5328
+    SkPath path;
+    m_paint->getTextPath(&glyph, sizeof(glyph), 0, 0, &path);
+    *bounds = path.getBounds();
+#else
+    m_paint->getTextWidths(&glyph, sizeof(glyph), nullptr, bounds);
+#endif
+
+    if (!m_paint->isSubpixelText()) {
+        SkIRect ir;
+        bounds->roundOut(&ir);
+        bounds->set(ir);
+    }
+
+}
+
+float SkiaTextMetrics::getSkiaWidthForGlyph(Glyph glyph)
+{
+    SkScalar skWidth;
+    m_paint->getTextWidths(&glyph, sizeof(glyph), &skWidth, nullptr);
+
+    if (!m_paint->isSubpixelText())
+        skWidth = SkScalarRoundToInt(skWidth);
+
+    return SkScalarToFloat(skWidth);
+}
+
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/platform/fonts/skia/SkiaTextMetrics.h b/third_party/WebKit/Source/platform/fonts/skia/SkiaTextMetrics.h
new file mode 100644
index 0000000..ca85fa42
--- /dev/null
+++ b/third_party/WebKit/Source/platform/fonts/skia/SkiaTextMetrics.h
@@ -0,0 +1,30 @@
+// 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 SkiaTextMetrics_h
+#define SkiaTextMetrics_h
+
+#include "platform/fonts/Glyph.h"
+
+#include <SkPaint.h>
+#include <hb.h>
+
+namespace blink {
+
+class SkiaTextMetrics final {
+public:
+    SkiaTextMetrics(const SkPaint*);
+
+    void getGlyphWidthAndExtentsForHarfBuzz(hb_codepoint_t, hb_position_t* width, hb_glyph_extents_t*);
+
+    void getSkiaBoundsForGlyph(Glyph, SkRect* bounds);
+    float getSkiaWidthForGlyph(Glyph);
+
+private:
+    const SkPaint* m_paint;
+};
+
+} // namespace blink
+
+#endif
diff --git a/third_party/WebKit/Source/platform/graphics/BitmapImage.cpp b/third_party/WebKit/Source/platform/graphics/BitmapImage.cpp
index c361c5b3..8788a62 100644
--- a/third_party/WebKit/Source/platform/graphics/BitmapImage.cpp
+++ b/third_party/WebKit/Source/platform/graphics/BitmapImage.cpp
@@ -189,21 +189,24 @@
     return m_source.getHotSpot(hotSpot);
 }
 
-bool BitmapImage::setData(PassRefPtr<SharedBuffer> data, bool allDataReceived)
+Image::SizeAvailability BitmapImage::setData(PassRefPtr<SharedBuffer> data, bool allDataReceived)
 {
     if (!data.get())
-        return true;
+        return SizeAvailable;
 
     int length = data->size();
     if (!length)
-        return true;
+        return SizeAvailable;
 
-    m_source.setData(*data, allDataReceived);
+    // If ImageSource::setData() returns Invalid, we know that this is a decode error.
+    // Report size available so that it gets registered as such in ImageResource.
+    if (m_source.setData(*data, allDataReceived) == ImageDecoder::SniffResult::Invalid)
+        return SizeAvailable;
 
     return dataChanged(allDataReceived);
 }
 
-bool BitmapImage::dataChanged(bool allDataReceived)
+Image::SizeAvailability BitmapImage::dataChanged(bool allDataReceived)
 {
     TRACE_EVENT0("blink", "BitmapImage::dataChanged");
 
@@ -239,7 +242,7 @@
     m_allDataReceived = allDataReceived;
 
     m_haveFrameCount = false;
-    return isSizeAvailable();
+    return isSizeAvailable() ? SizeAvailable : SizeUnavailable;
 }
 
 bool BitmapImage::hasColorProfile() const
diff --git a/third_party/WebKit/Source/platform/graphics/BitmapImage.h b/third_party/WebKit/Source/platform/graphics/BitmapImage.h
index 590b199..68d1a1e 100644
--- a/third_party/WebKit/Source/platform/graphics/BitmapImage.h
+++ b/third_party/WebKit/Source/platform/graphics/BitmapImage.h
@@ -65,8 +65,9 @@
     IntSize sizeRespectingOrientation() const;
     bool getHotSpot(IntPoint&) const override;
     String filenameExtension() const override;
-    bool setData(PassRefPtr<SharedBuffer> data, bool allDataReceived) override;
-    bool dataChanged(bool allDataReceived) override;
+
+    SizeAvailability setData(PassRefPtr<SharedBuffer> data, bool allDataReceived) override;
+    SizeAvailability dataChanged(bool allDataReceived) override;
 
     bool isAllDataReceived() const { return m_allDataReceived; }
     bool hasColorProfile() const;
diff --git a/third_party/WebKit/Source/platform/graphics/BitmapImageMetrics.cpp b/third_party/WebKit/Source/platform/graphics/BitmapImageMetrics.cpp
index 10eefa6..b4af16f 100644
--- a/third_party/WebKit/Source/platform/graphics/BitmapImageMetrics.cpp
+++ b/third_party/WebKit/Source/platform/graphics/BitmapImageMetrics.cpp
@@ -30,4 +30,22 @@
     orientationHistogram.count(orientation);
 }
 
+void BitmapImageMetrics::countGamma(SkColorSpace* colorSpace)
+{
+    DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, gammaNamedHistogram, new EnumerationHistogram("Blink.ColorSpace.Destination", GammaEnd));
+
+    if (colorSpace) {
+        SkColorSpace::GammaNamed skGamma = colorSpace->gammaNamed();
+        Gamma gamma =
+            (SkColorSpace::kLinear_GammaNamed == skGamma)      ? GammaLinear :
+            (SkColorSpace::kSRGB_GammaNamed == skGamma)        ? GammaSRGB :
+            (SkColorSpace::k2Dot2Curve_GammaNamed == skGamma)  ? Gamma2Dot2 :
+            (SkColorSpace::kNonStandard_GammaNamed == skGamma) ? GammaNonStandard :
+            GammaFail;
+        gammaNamedHistogram.count(gamma);
+    } else {
+        gammaNamedHistogram.count(GammaNull);
+    }
+}
+
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/BitmapImageMetrics.h b/third_party/WebKit/Source/platform/graphics/BitmapImageMetrics.h
index 7382fe6..42c842a 100644
--- a/third_party/WebKit/Source/platform/graphics/BitmapImageMetrics.h
+++ b/third_party/WebKit/Source/platform/graphics/BitmapImageMetrics.h
@@ -7,6 +7,7 @@
 
 #include "platform/PlatformExport.h"
 #include "platform/graphics/ImageOrientation.h"
+#include "third_party/skia/include/core/SkColorSpace.h"
 #include "wtf/Allocator.h"
 #include "wtf/Forward.h"
 
@@ -27,8 +28,21 @@
         DecodedImageTypeEnumEnd = ImageBMP + 1
     };
 
+    enum Gamma {
+        // Values synced with 'Gamma' in src/tools/metrics/histograms/histograms.xml
+        GammaLinear = 0,
+        GammaSRGB = 1,
+        Gamma2Dot2 = 2,
+        GammaNonStandard = 3,
+        GammaEmpty = 4,
+        GammaNull = 5,
+        GammaFail = 6,
+        GammaEnd = GammaFail + 1,
+    };
+
     static void countDecodedImageType(const String& type);
     static void countImageOrientation(const ImageOrientationEnum);
+    static void countGamma(SkColorSpace*);
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp b/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp
index bfe1262..9bff319 100644
--- a/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp
+++ b/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp
@@ -122,7 +122,7 @@
 {
     // We just need the size of the image, so we have to temporarily create an ImageDecoder. Since
     // we only need the size, it doesn't really matter about premul or not, or gamma settings.
-    std::unique_ptr<ImageDecoder> decoder = ImageDecoder::create(static_cast<const char*>(data->data()), data->size(),
+    std::unique_ptr<ImageDecoder> decoder = ImageDecoder::create(ImageDecoder::determineImageType(static_cast<const char*>(data->data()), data->size()),
         ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied);
     if (!decoder)
         return 0;
diff --git a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp
index 0074f07..df4b8699 100644
--- a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp
@@ -57,9 +57,9 @@
     uint32_t m_uniqueID;
 };
 
-std::unique_ptr<DeferredImageDecoder> DeferredImageDecoder::create(const SharedBuffer& data, ImageDecoder::AlphaOption alphaOption, ImageDecoder::GammaAndColorProfileOption colorOptions)
+std::unique_ptr<DeferredImageDecoder> DeferredImageDecoder::create(ImageDecoder::SniffResult sniffResult, ImageDecoder::AlphaOption alphaOption, ImageDecoder::GammaAndColorProfileOption colorOptions)
 {
-    std::unique_ptr<ImageDecoder> actualDecoder = ImageDecoder::create(data, alphaOption, colorOptions);
+    std::unique_ptr<ImageDecoder> actualDecoder = ImageDecoder::create(sniffResult, alphaOption, colorOptions);
 
     if (!actualDecoder)
         return nullptr;
diff --git a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.h b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.h
index 1d29202..34ffa5a 100644
--- a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.h
+++ b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.h
@@ -47,7 +47,7 @@
     WTF_MAKE_NONCOPYABLE(DeferredImageDecoder);
     USING_FAST_MALLOC(DeferredImageDecoder);
 public:
-    static std::unique_ptr<DeferredImageDecoder> create(const SharedBuffer& data, ImageDecoder::AlphaOption, ImageDecoder::GammaAndColorProfileOption);
+    static std::unique_ptr<DeferredImageDecoder> create(ImageDecoder::SniffResult, ImageDecoder::AlphaOption, ImageDecoder::GammaAndColorProfileOption);
 
     static std::unique_ptr<DeferredImageDecoder> createForTesting(std::unique_ptr<ImageDecoder>);
 
diff --git a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoderTest.cpp b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoderTest.cpp
index b72b9df..ffac7d1 100644
--- a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoderTest.cpp
+++ b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoderTest.cpp
@@ -360,7 +360,7 @@
 
 TEST_F(DeferredImageDecoderTest, frameOpacity)
 {
-    std::unique_ptr<ImageDecoder> actualDecoder = ImageDecoder::create(*m_data,
+    std::unique_ptr<ImageDecoder> actualDecoder = ImageDecoder::create(ImageDecoder::determineImageType(*m_data),
         ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied);
     std::unique_ptr<DeferredImageDecoder> decoder = DeferredImageDecoder::createForTesting(std::move(actualDecoder));
     decoder->setData(*m_data, true);
diff --git a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoderTestWoPlatform.cpp b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoderTestWoPlatform.cpp
index 80bf250..10887c1 100644
--- a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoderTestWoPlatform.cpp
+++ b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoderTestWoPlatform.cpp
@@ -35,7 +35,7 @@
     RefPtr<SharedBuffer> file = readFile(fileName);
     ASSERT_NE(file, nullptr);
 
-    std::unique_ptr<DeferredImageDecoder> decoder = DeferredImageDecoder::create(*file.get(), ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileIgnored);
+    std::unique_ptr<DeferredImageDecoder> decoder = DeferredImageDecoder::create(ImageDecoder::determineImageType(*file.get()), ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileIgnored);
     ASSERT_TRUE(decoder.get());
 
     RefPtr<SharedBuffer> partialFile = SharedBuffer::create(file->data(), bytesForFirstFrame);
diff --git a/third_party/WebKit/Source/platform/graphics/Image.cpp b/third_party/WebKit/Source/platform/graphics/Image.cpp
index 52afd6a..0a7109d 100644
--- a/third_party/WebKit/Source/platform/graphics/Image.cpp
+++ b/third_party/WebKit/Source/platform/graphics/Image.cpp
@@ -82,15 +82,15 @@
     return MIMETypeRegistry::isSupportedImageResourceMIMEType(type);
 }
 
-bool Image::setData(PassRefPtr<SharedBuffer> data, bool allDataReceived)
+Image::SizeAvailability Image::setData(PassRefPtr<SharedBuffer> data, bool allDataReceived)
 {
     m_encodedImageData = data;
     if (!m_encodedImageData.get())
-        return true;
+        return SizeAvailable;
 
     int length = m_encodedImageData->size();
     if (!length)
-        return true;
+        return SizeAvailable;
 
     return dataChanged(allDataReceived);
 }
diff --git a/third_party/WebKit/Source/platform/graphics/Image.h b/third_party/WebKit/Source/platform/graphics/Image.h
index 63ede0a..ee10fe1 100644
--- a/third_party/WebKit/Source/platform/graphics/Image.h
+++ b/third_party/WebKit/Source/platform/graphics/Image.h
@@ -101,8 +101,12 @@
     int height() const { return size().height(); }
     virtual bool getHotSpot(IntPoint&) const { return false; }
 
-    virtual bool setData(PassRefPtr<SharedBuffer> data, bool allDataReceived);
-    virtual bool dataChanged(bool /*allDataReceived*/) { return false; }
+    enum SizeAvailability {
+        SizeAvailable,
+        SizeUnavailable
+    };
+    virtual SizeAvailability setData(PassRefPtr<SharedBuffer> data, bool allDataReceived);
+    virtual SizeAvailability dataChanged(bool /*allDataReceived*/) { return SizeUnavailable; }
 
     virtual String filenameExtension() const { return String(); } // null string if unknown
 
diff --git a/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp b/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp
index cebc233..099c7fc4 100644
--- a/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp
+++ b/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp
@@ -160,7 +160,7 @@
         return false;
     }
 
-    std::unique_ptr<ImageDecoder> decoder = ImageDecoder::create(*data, ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied);
+    std::unique_ptr<ImageDecoder> decoder = ImageDecoder::create(ImageDecoder::determineImageType(*data), ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied);
     // getYUVComponentSizes was already called and was successful, so ImageDecoder::create must succeed.
     ASSERT(decoder);
 
@@ -267,7 +267,7 @@
             *decoder = m_imageDecoderFactory->create().release();
 
         if (!*decoder)
-            *decoder = ImageDecoder::create(*data, ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied).release();
+            *decoder = ImageDecoder::create(ImageDecoder::determineImageType(*data), ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied).release();
 
         if (!*decoder)
             return false;
@@ -327,7 +327,7 @@
     if (m_yuvDecodingFailed)
         return false;
 
-    std::unique_ptr<ImageDecoder> decoder = ImageDecoder::create(*data, ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied);
+    std::unique_ptr<ImageDecoder> decoder = ImageDecoder::create(ImageDecoder::determineImageType(*data), ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied);
     if (!decoder)
         return false;
 
diff --git a/third_party/WebKit/Source/platform/graphics/ImageSource.cpp b/third_party/WebKit/Source/platform/graphics/ImageSource.cpp
index 1f98fe0..50d5fe2 100644
--- a/third_party/WebKit/Source/platform/graphics/ImageSource.cpp
+++ b/third_party/WebKit/Source/platform/graphics/ImageSource.cpp
@@ -51,15 +51,16 @@
     return m_decoder ? m_decoder->data() : nullptr;
 }
 
-void ImageSource::setData(SharedBuffer& data, bool allDataReceived)
+ImageDecoder::SniffResult ImageSource::setData(SharedBuffer& data, bool allDataReceived)
 {
-    // Create a decoder by sniffing the encoded data. If insufficient data bytes are available to
-    // determine the encoded image type, no decoder is created.
+    ImageDecoder::SniffResult result = ImageDecoder::determineImageType(data);
     if (!m_decoder)
-        m_decoder = DeferredImageDecoder::create(data, ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied);
+        m_decoder = DeferredImageDecoder::create(result, ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied);
 
     if (m_decoder)
         m_decoder->setData(data, allDataReceived);
+
+    return result;
 }
 
 String ImageSource::filenameExtension() const
diff --git a/third_party/WebKit/Source/platform/graphics/ImageSource.h b/third_party/WebKit/Source/platform/graphics/ImageSource.h
index 73bdb7ee..d813c08 100644
--- a/third_party/WebKit/Source/platform/graphics/ImageSource.h
+++ b/third_party/WebKit/Source/platform/graphics/ImageSource.h
@@ -27,6 +27,7 @@
 #define ImageSource_h
 
 #include "platform/PlatformExport.h"
+#include "platform/graphics/DeferredImageDecoder.h"
 #include "platform/graphics/ImageOrientation.h"
 #include "wtf/Forward.h"
 #include "wtf/Noncopyable.h"
@@ -36,7 +37,6 @@
 
 namespace blink {
 
-class DeferredImageDecoder;
 class ImageOrientation;
 class IntPoint;
 class IntSize;
@@ -70,7 +70,7 @@
     size_t clearCacheExceptFrame(size_t);
 
     PassRefPtr<SharedBuffer> data();
-    void setData(SharedBuffer& data, bool allDataReceived);
+    ImageDecoder::SniffResult setData(SharedBuffer& data, bool allDataReceived);
     String filenameExtension() const;
 
     bool isSizeAvailable();
diff --git a/third_party/WebKit/Source/platform/graphics/PictureSnapshot.cpp b/third_party/WebKit/Source/platform/graphics/PictureSnapshot.cpp
index 8cc9f53..cdf740b 100644
--- a/third_party/WebKit/Source/platform/graphics/PictureSnapshot.cpp
+++ b/third_party/WebKit/Source/platform/graphics/PictureSnapshot.cpp
@@ -60,7 +60,7 @@
 
 static bool decodeBitmap(const void* data, size_t length, SkBitmap* result)
 {
-    std::unique_ptr<ImageDecoder> imageDecoder = ImageDecoder::create(static_cast<const char*>(data), length,
+    std::unique_ptr<ImageDecoder> imageDecoder = ImageDecoder::create(ImageDecoder::determineImageType(static_cast<const char*>(data), length),
         ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileIgnored);
     if (!imageDecoder)
         return false;
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.cpp b/third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.cpp
index ea70f07..e294d1f 100644
--- a/third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.cpp
+++ b/third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.cpp
@@ -2142,7 +2142,7 @@
     if ((!skiaImage || ignoreGammaAndColorProfile || (hasAlpha && !premultiplyAlpha)) && m_image->data()) {
         // Attempt to get raw unpremultiplied image data.
         std::unique_ptr<ImageDecoder> decoder(ImageDecoder::create(
-            *(m_image->data()), ImageDecoder::AlphaNotPremultiplied,
+            ImageDecoder::determineImageType(*(m_image->data())), ImageDecoder::AlphaNotPremultiplied,
             ignoreGammaAndColorProfile ? ImageDecoder::GammaAndColorProfileIgnored : ImageDecoder::GammaAndColorProfileApplied));
         if (!decoder)
             return;
diff --git a/third_party/WebKit/Source/platform/graphics/paint/ClipPaintPropertyNode.h b/third_party/WebKit/Source/platform/graphics/paint/ClipPaintPropertyNode.h
index 2cabc7b..e340e2b 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/ClipPaintPropertyNode.h
+++ b/third_party/WebKit/Source/platform/graphics/paint/ClipPaintPropertyNode.h
@@ -22,14 +22,14 @@
 class PLATFORM_EXPORT ClipPaintPropertyNode : public RefCounted<ClipPaintPropertyNode> {
 public:
     static PassRefPtr<ClipPaintPropertyNode> create(
-        PassRefPtr<ClipPaintPropertyNode> parent,
-        PassRefPtr<TransformPaintPropertyNode> localTransformSpace,
+        PassRefPtr<const ClipPaintPropertyNode> parent,
+        PassRefPtr<const TransformPaintPropertyNode> localTransformSpace,
         const FloatRoundedRect& clipRect)
     {
         return adoptRef(new ClipPaintPropertyNode(parent, localTransformSpace, clipRect));
     }
 
-    void update(PassRefPtr<ClipPaintPropertyNode> parent, PassRefPtr<TransformPaintPropertyNode> localTransformSpace, const FloatRoundedRect& clipRect)
+    void update(PassRefPtr<const ClipPaintPropertyNode> parent, PassRefPtr<const TransformPaintPropertyNode> localTransformSpace, const FloatRoundedRect& clipRect)
     {
         m_parent = parent;
         m_localTransformSpace = localTransformSpace;
@@ -43,11 +43,11 @@
     const ClipPaintPropertyNode* parent() const { return m_parent.get(); }
 
 private:
-    ClipPaintPropertyNode(PassRefPtr<ClipPaintPropertyNode> parent, PassRefPtr<TransformPaintPropertyNode> localTransformSpace, const FloatRoundedRect& clipRect)
+    ClipPaintPropertyNode(PassRefPtr<const ClipPaintPropertyNode> parent, PassRefPtr<const TransformPaintPropertyNode> localTransformSpace, const FloatRoundedRect& clipRect)
         : m_parent(parent), m_localTransformSpace(localTransformSpace), m_clipRect(clipRect) { }
 
-    RefPtr<ClipPaintPropertyNode> m_parent;
-    RefPtr<TransformPaintPropertyNode> m_localTransformSpace;
+    RefPtr<const ClipPaintPropertyNode> m_parent;
+    RefPtr<const TransformPaintPropertyNode> m_localTransformSpace;
     FloatRoundedRect m_clipRect;
 };
 
diff --git a/third_party/WebKit/Source/platform/graphics/paint/EffectPaintPropertyNode.h b/third_party/WebKit/Source/platform/graphics/paint/EffectPaintPropertyNode.h
index a143354f..9aafaea 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/EffectPaintPropertyNode.h
+++ b/third_party/WebKit/Source/platform/graphics/paint/EffectPaintPropertyNode.h
@@ -19,12 +19,12 @@
 // TODO(pdr): Support more effects than just opacity.
 class PLATFORM_EXPORT EffectPaintPropertyNode : public RefCounted<EffectPaintPropertyNode> {
 public:
-    static PassRefPtr<EffectPaintPropertyNode> create(PassRefPtr<EffectPaintPropertyNode> parent, float opacity)
+    static PassRefPtr<EffectPaintPropertyNode> create(PassRefPtr<const EffectPaintPropertyNode> parent, float opacity)
     {
         return adoptRef(new EffectPaintPropertyNode(parent, opacity));
     }
 
-    void update(PassRefPtr<EffectPaintPropertyNode> parent, float opacity)
+    void update(PassRefPtr<const EffectPaintPropertyNode> parent, float opacity)
     {
         m_parent = parent;
         m_opacity = opacity;
@@ -36,10 +36,10 @@
     const EffectPaintPropertyNode* parent() const { return m_parent.get(); }
 
 private:
-    EffectPaintPropertyNode(PassRefPtr<EffectPaintPropertyNode> parent, float opacity)
+    EffectPaintPropertyNode(PassRefPtr<const EffectPaintPropertyNode> parent, float opacity)
         : m_parent(parent), m_opacity(opacity) { }
 
-    RefPtr<EffectPaintPropertyNode> m_parent;
+    RefPtr<const EffectPaintPropertyNode> m_parent;
     float m_opacity;
 };
 
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintChunkProperties.h b/third_party/WebKit/Source/platform/graphics/paint/PaintChunkProperties.h
index 57e65d2..a6427036 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/PaintChunkProperties.h
+++ b/third_party/WebKit/Source/platform/graphics/paint/PaintChunkProperties.h
@@ -29,9 +29,9 @@
     PaintChunkProperties() : backfaceHidden(false) { }
 
     // TODO(pdr): Add scroll properties.
-    RefPtr<TransformPaintPropertyNode> transform;
-    RefPtr<ClipPaintPropertyNode> clip;
-    RefPtr<EffectPaintPropertyNode> effect;
+    RefPtr<const TransformPaintPropertyNode> transform;
+    RefPtr<const ClipPaintPropertyNode> clip;
+    RefPtr<const EffectPaintPropertyNode> effect;
     bool backfaceHidden;
 };
 
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp b/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp
index 5cac5ab81..ecdfc3a 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp
+++ b/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp
@@ -42,8 +42,8 @@
     }
 #endif
 
-    DisplayItemList::iterator cachedItem = findCachedItem(DisplayItem::Id(client, type));
-    if (cachedItem == m_currentPaintArtifact.getDisplayItemList().end()) {
+    size_t cachedItem = findCachedItem(DisplayItem::Id(client, type));
+    if (cachedItem == kNotFound) {
         NOTREACHED();
         return false;
     }
@@ -51,11 +51,11 @@
     ++m_numCachedNewItems;
     ensureNewDisplayItemListInitialCapacity();
     if (!DCHECK_IS_ON() || !RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled())
-        processNewItem(m_newDisplayItemList.appendByMoving(*cachedItem));
+        processNewItem(m_newDisplayItemList.appendByMoving(m_currentPaintArtifact.getDisplayItemList()[cachedItem]));
 
     m_nextItemToMatch = cachedItem + 1;
     // Items before m_nextItemToMatch have been copied so we don't need to index them.
-    if (m_nextItemToMatch - m_nextItemToIndex > 0)
+    if (m_nextItemToMatch > m_nextItemToIndex)
         m_nextItemToIndex = m_nextItemToMatch;
 
 #if DCHECK_IS_ON()
@@ -98,8 +98,8 @@
     }
 #endif
 
-    DisplayItemList::iterator cachedItem = findCachedItem(DisplayItem::Id(client, DisplayItem::Subsequence));
-    if (cachedItem == m_currentPaintArtifact.getDisplayItemList().end()) {
+    size_t cachedItem = findCachedItem(DisplayItem::Id(client, DisplayItem::Subsequence));
+    if (cachedItem == kNotFound) {
         NOTREACHED();
         return false;
     }
@@ -110,7 +110,7 @@
 
     m_nextItemToMatch = cachedItem;
     // Items before |cachedItem| have been copied so we don't need to index them.
-    if (cachedItem - m_nextItemToIndex > 0)
+    if (cachedItem > m_nextItemToIndex)
         m_nextItemToIndex = cachedItem;
 
 #if DCHECK_IS_ON()
@@ -268,26 +268,25 @@
     indices.append(index);
 }
 
-DisplayItemList::iterator PaintController::findCachedItem(const DisplayItem::Id& id)
+size_t PaintController::findCachedItem(const DisplayItem::Id& id)
 {
     DCHECK(clientCacheIsValid(id.client));
 
     // Try to find the item sequentially first. This is fast if the current list and the new list are in
     // the same order around the new item. If found, we don't need to update and lookup the index.
-    DisplayItemList::iterator end = m_currentPaintArtifact.getDisplayItemList().end();
-    DisplayItemList::iterator it = m_nextItemToMatch;
-    for (; it != end; ++it) {
+    for (size_t i = m_nextItemToMatch; i < m_currentPaintArtifact.getDisplayItemList().size(); ++i) {
         // We encounter an item that has already been copied which indicates we can't do sequential matching.
-        if (!it->hasValidClient())
+        const DisplayItem& item = m_currentPaintArtifact.getDisplayItemList()[i];
+        if (!item.hasValidClient())
             break;
-        if (id == it->getId()) {
+        if (id == item.getId()) {
 #if DCHECK_IS_ON()
             ++m_numSequentialMatches;
 #endif
-            return it;
+            return i;
         }
         // We encounter a different cacheable item which also indicates we can't do sequential matching.
-        if (it->isCacheable())
+        if (item.isCacheable())
             break;
     }
 
@@ -296,30 +295,29 @@
 #if DCHECK_IS_ON()
         ++m_numOutOfOrderMatches;
 #endif
-        return m_currentPaintArtifact.getDisplayItemList().begin() + foundIndex;
+        return foundIndex;
     }
 
     return findOutOfOrderCachedItemForward(id);
 }
 
 // Find forward for the item and index all skipped indexable items.
-DisplayItemList::iterator PaintController::findOutOfOrderCachedItemForward(const DisplayItem::Id& id)
+size_t PaintController::findOutOfOrderCachedItemForward(const DisplayItem::Id& id)
 {
-    DisplayItemList::iterator end = m_currentPaintArtifact.getDisplayItemList().end();
-    for (DisplayItemList::iterator it = m_nextItemToIndex; it != end; ++it) {
-        const DisplayItem& item = *it;
+    for (size_t i = m_nextItemToIndex; i < m_currentPaintArtifact.getDisplayItemList().size(); ++i) {
+        const DisplayItem& item = m_currentPaintArtifact.getDisplayItemList()[i];
         DCHECK(item.hasValidClient());
         if (id == item.getId()) {
 #if DCHECK_IS_ON()
             ++m_numSequentialMatches;
 #endif
-            return it;
+            return i;
         }
         if (item.isCacheable()) {
 #if DCHECK_IS_ON()
             ++m_numIndexedItems;
 #endif
-            addItemToIndexIfNeeded(item, it - m_currentPaintArtifact.getDisplayItemList().begin(), m_outOfOrderItemIndices);
+            addItemToIndexIfNeeded(item, i, m_outOfOrderItemIndices);
         }
     }
 
@@ -331,48 +329,52 @@
     // We did not find the cached display item. This should be impossible, but may occur if there is a bug
     // in the system, such as under-invalidation, incorrect cache checking or duplicate display ids.
     // In this case, the caller should fall back to repaint the display item.
-    return end;
+    return kNotFound;
 }
 
-// Copies a cached subsequence from current list to the new list.
-// On return, |it| points to the item after the EndSubsequence item of the subsequence.
+// Copies a cached subsequence from current list to the new list. On return,
+// |cachedItemIndex| points to the item after the EndSubsequence item of the subsequence.
 // When paintUnderInvaldiationCheckingEnabled() we'll not actually copy the subsequence,
 // but mark the begin and end of the subsequence for under-invalidation checking.
-void PaintController::copyCachedSubsequence(DisplayItemList::iterator& it)
+void PaintController::copyCachedSubsequence(size_t& cachedItemIndex)
 {
+    DisplayItem* cachedItem = &m_currentPaintArtifact.getDisplayItemList()[cachedItemIndex];
 #if DCHECK_IS_ON()
-    DCHECK(it->getType() == DisplayItem::Subsequence);
+    DCHECK(cachedItem->getType() == DisplayItem::Subsequence);
     if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled()) {
         DCHECK(!isCheckingUnderInvalidation());
-        m_underInvalidationCheckingBegin = it;
+        m_underInvalidationCheckingBegin = cachedItemIndex;
 #ifndef NDEBUG
-        m_underInvalidationMessagePrefix = "(In CachedSubsequence of " + it->clientDebugString() + ")";
+        m_underInvalidationMessagePrefix = "(In CachedSubsequence of " + cachedItem->clientDebugString() + ")";
 #else
         m_underInvalidationMessagePrefix = "(In CachedSubsequence)";
 #endif
     }
 #endif
 
-    DisplayItem::Id endSubsequenceId(it->client(), DisplayItem::EndSubsequence);
-    bool metEndSubsequence = false;
-    do {
-        // We should always find the EndSubsequence display item.
-        DCHECK(it != m_currentPaintArtifact.getDisplayItemList().end());
-        DCHECK(it->hasValidClient());
+    DisplayItem::Id endSubsequenceId(cachedItem->client(), DisplayItem::EndSubsequence);
+    while (true) {
+        DCHECK(cachedItem->hasValidClient());
 #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS
-        CHECK(it->client().isAlive());
+        CHECK(cachedItem->client().isAlive());
 #endif
         ++m_numCachedNewItems;
-        if (it->getId() == endSubsequenceId)
-            metEndSubsequence = true;
+        bool metEndSubsequence = cachedItem->getId() == endSubsequenceId;
         if (!DCHECK_IS_ON() || !RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled())
-            processNewItem(m_newDisplayItemList.appendByMoving(*it));
-        ++it;
-    } while (!metEndSubsequence);
+            processNewItem(m_newDisplayItemList.appendByMoving(*cachedItem));
+
+        ++cachedItemIndex;
+        if (metEndSubsequence)
+            break;
+
+        // We should always be able to find the EndSubsequence display item.
+        DCHECK(cachedItemIndex < m_currentPaintArtifact.getDisplayItemList().size());
+        cachedItem = &m_currentPaintArtifact.getDisplayItemList()[cachedItemIndex];
+    }
 
 #if DCHECK_IS_ON()
     if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled()) {
-        m_underInvalidationCheckingEnd = it;
+        m_underInvalidationCheckingEnd = cachedItemIndex;
         DCHECK(isCheckingUnderInvalidation());
     }
 #endif
@@ -385,13 +387,13 @@
     return enclosingIntRect(visualRect);
 }
 
-void PaintController::resetCurrentListIterators()
+void PaintController::resetCurrentListIndices()
 {
-    m_nextItemToMatch = m_currentPaintArtifact.getDisplayItemList().begin();
-    m_nextItemToIndex = m_nextItemToMatch;
+    m_nextItemToMatch = 0;
+    m_nextItemToIndex = 0;
 #if DCHECK_IS_ON()
-    m_underInvalidationCheckingBegin = m_currentPaintArtifact.getDisplayItemList().end();
-    m_underInvalidationCheckingEnd = m_currentPaintArtifact.getDisplayItemList().begin();
+    m_underInvalidationCheckingBegin = 0;
+    m_underInvalidationCheckingEnd = 0;
 #endif
 }
 
@@ -425,7 +427,7 @@
     // The new list will not be appended to again so we can release unused memory.
     m_newDisplayItemList.shrinkToFit();
     m_currentPaintArtifact = PaintArtifact(std::move(m_newDisplayItemList), m_newPaintChunks.releasePaintChunks(), gpuAnalyzer.suitableForGpuRasterization());
-    resetCurrentListIterators();
+    resetCurrentListIndices();
     m_outOfOrderItemIndices.clear();
 
     // We'll allocate the initial buffer when we start the next paint.
@@ -474,9 +476,6 @@
     DrawingDisplayItem& displayItem = m_currentPaintArtifact.getDisplayItemList().allocateAndConstruct<DrawingDisplayItem>(displayItemClient, DisplayItem::DebugDrawing, picture);
     displayItem.setSkippedCache();
     m_currentPaintArtifact.getDisplayItemList().appendVisualRect(visualRectForDisplayItem(displayItem, offsetFromLayoutObject));
-
-    // Need to reset the iterators after mutation of the DisplayItemList.
-    resetCurrentListIterators();
 }
 
 #if DCHECK_IS_ON()
@@ -510,7 +509,7 @@
         return;
 
     const DisplayItem& newItem = m_newDisplayItemList.last();
-    const DisplayItem& oldItem = *m_underInvalidationCheckingBegin++;
+    const DisplayItem& oldItem = m_currentPaintArtifact.getDisplayItemList()[m_underInvalidationCheckingBegin++];
 
     if (newItem.isCacheable() && !clientCacheIsValid(newItem.client())) {
         showUnderInvalidationError("under-invalidation of PaintLayer: invalidated in cached subsequence", newItem, oldItem);
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintController.h b/third_party/WebKit/Source/platform/graphics/paint/PaintController.h
index d95c29f..82eb5fb 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/PaintController.h
+++ b/third_party/WebKit/Source/platform/graphics/paint/PaintController.h
@@ -171,7 +171,7 @@
         , m_numIndexedItems(0)
 #endif
     {
-        resetCurrentListIterators();
+        resetCurrentListIndices();
     }
 
 private:
@@ -200,14 +200,14 @@
     static size_t findMatchingItemFromIndex(const DisplayItem::Id&, const DisplayItemIndicesByClientMap&, const DisplayItemList&);
     static void addItemToIndexIfNeeded(const DisplayItem&, size_t index, DisplayItemIndicesByClientMap&);
 
-    DisplayItemList::iterator findCachedItem(const DisplayItem::Id&);
-    DisplayItemList::iterator findOutOfOrderCachedItemForward(const DisplayItem::Id&);
-    void copyCachedSubsequence(DisplayItemList::iterator&);
+    size_t findCachedItem(const DisplayItem::Id&);
+    size_t findOutOfOrderCachedItemForward(const DisplayItem::Id&);
+    void copyCachedSubsequence(size_t&);
 
-    // Resets the iterators (e.g. m_nextItemToMatch) of m_currentPaintArtifact.getDisplayItemList()
+    // Resets the indices (e.g. m_nextItemToMatch) of m_currentPaintArtifact.getDisplayItemList()
     // to their initial values. This should be called when the DisplayItemList in m_currentPaintArtifact
-    // is newly created, or is changed causing the previous iterators to be invalid.
-    void resetCurrentListIterators();
+    // is newly created, or is changed causing the previous indices to be invalid.
+    void resetCurrentListIndices();
 
 #if DCHECK_IS_ON()
     // The following two methods are for checking under-invalidations
@@ -249,10 +249,10 @@
     DisplayItemIndicesByClientMap m_outOfOrderItemIndices;
 
     // The next item in the current list for sequential match.
-    DisplayItemList::iterator m_nextItemToMatch;
+    size_t m_nextItemToMatch;
 
     // The next item in the current list to be indexed for out-of-order cache requests.
-    DisplayItemList::iterator m_nextItemToIndex;
+    size_t m_nextItemToIndex;
 
     DisplayItemClient::CacheGenerationOrInvalidationReason m_currentCacheGeneration;
 
@@ -269,8 +269,8 @@
     // indicating the begin and end of the cached drawing or subsequence in the current list.
     // The functions return false to let the client do actual painting, and PaintController
     // will check if the actual painting results are the same as the cached.
-    DisplayItemList::iterator m_underInvalidationCheckingBegin;
-    DisplayItemList::iterator m_underInvalidationCheckingEnd;
+    size_t m_underInvalidationCheckingBegin;
+    size_t m_underInvalidationCheckingEnd;
     String m_underInvalidationMessagePrefix;
 #endif
 
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PropertyTreeState.h b/third_party/WebKit/Source/platform/graphics/paint/PropertyTreeState.h
index c0520c2..dfefef9 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/PropertyTreeState.h
+++ b/third_party/WebKit/Source/platform/graphics/paint/PropertyTreeState.h
@@ -20,14 +20,14 @@
     PropertyTreeState() : PropertyTreeState(nullptr, nullptr, nullptr) {}
 
     PropertyTreeState(
-        TransformPaintPropertyNode* transform,
-        ClipPaintPropertyNode* clip,
-        EffectPaintPropertyNode* effect)
+        const TransformPaintPropertyNode* transform,
+        const ClipPaintPropertyNode* clip,
+        const EffectPaintPropertyNode* effect)
     : transform(transform), clip(clip), effect(effect) {}
 
-    RefPtr<TransformPaintPropertyNode> transform;
-    RefPtr<ClipPaintPropertyNode> clip;
-    RefPtr<EffectPaintPropertyNode> effect;
+    RefPtr<const TransformPaintPropertyNode> transform;
+    RefPtr<const ClipPaintPropertyNode> clip;
+    RefPtr<const EffectPaintPropertyNode> effect;
 };
 
 template <class A>
diff --git a/third_party/WebKit/Source/platform/graphics/paint/TransformPaintPropertyNode.h b/third_party/WebKit/Source/platform/graphics/paint/TransformPaintPropertyNode.h
index 1020a207..673fae4 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/TransformPaintPropertyNode.h
+++ b/third_party/WebKit/Source/platform/graphics/paint/TransformPaintPropertyNode.h
@@ -22,7 +22,7 @@
 class PLATFORM_EXPORT TransformPaintPropertyNode : public RefCounted<TransformPaintPropertyNode> {
 public:
     static PassRefPtr<TransformPaintPropertyNode> create(
-        PassRefPtr<TransformPaintPropertyNode> parent,
+        PassRefPtr<const TransformPaintPropertyNode> parent,
         const TransformationMatrix& matrix,
         const FloatPoint3D& origin,
         bool flattensInheritedTransform = false,
@@ -31,7 +31,7 @@
         return adoptRef(new TransformPaintPropertyNode(matrix, origin, parent, flattensInheritedTransform, renderingContextID));
     }
 
-    void update(PassRefPtr<TransformPaintPropertyNode> parent, const TransformationMatrix& matrix, const FloatPoint3D& origin, bool flattensInheritedTransform = false, unsigned renderingContextID = 0)
+    void update(PassRefPtr<const TransformPaintPropertyNode> parent, const TransformationMatrix& matrix, const FloatPoint3D& origin, bool flattensInheritedTransform = false, unsigned renderingContextID = 0)
     {
         m_parent = parent;
         m_matrix = matrix;
@@ -45,7 +45,7 @@
 
     // Parent transform that this transform is relative to, or nullptr if this
     // is the root transform.
-    TransformPaintPropertyNode* parent() const { return m_parent.get(); }
+    const TransformPaintPropertyNode* parent() const { return m_parent.get(); }
 
     // If true, content with this transform node (or its descendant) appears in
     // the plane of its parent. This is implemented by flattening the total
@@ -61,7 +61,7 @@
     TransformPaintPropertyNode(
         const TransformationMatrix& matrix,
         const FloatPoint3D& origin,
-        PassRefPtr<TransformPaintPropertyNode> parent,
+        PassRefPtr<const TransformPaintPropertyNode> parent,
         bool flattensInheritedTransform,
         unsigned renderingContextID)
         : m_matrix(matrix)
@@ -74,7 +74,7 @@
 
     TransformationMatrix m_matrix;
     FloatPoint3D m_origin;
-    RefPtr<TransformPaintPropertyNode> m_parent;
+    RefPtr<const TransformPaintPropertyNode> m_parent;
     bool m_flattensInheritedTransform;
     unsigned m_renderingContextID;
 };
diff --git a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
index b3bd7d9..93d5cc8 100644
--- a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
@@ -21,6 +21,7 @@
 #include "platform/image-decoders/ImageDecoder.h"
 
 #include "platform/PlatformInstrumentation.h"
+#include "platform/graphics/BitmapImageMetrics.h"
 #include "platform/image-decoders/bmp/BMPImageDecoder.h"
 #include "platform/image-decoders/gif/GIFImageDecoder.h"
 #include "platform/image-decoders/ico/ICOImageDecoder.h"
@@ -80,49 +81,65 @@
     return !memcmp(contents, "BM", 2);
 }
 
-std::unique_ptr<ImageDecoder> ImageDecoder::create(const char* contents, size_t length, AlphaOption alphaOption, GammaAndColorProfileOption colorOptions)
+std::unique_ptr<ImageDecoder> ImageDecoder::create(SniffResult sniffResult, AlphaOption alphaOption, GammaAndColorProfileOption colorOptions)
 {
-    const size_t longestSignatureLength = sizeof("RIFF????WEBPVP") - 1;
-    ASSERT(longestSignatureLength == 14);
-
-    if (length < longestSignatureLength)
-        return nullptr;
-
     size_t maxDecodedBytes = Platform::current() ? Platform::current()->maxDecodedImageBytes() : noDecodedImageByteLimit;
 
-    if (matchesJPEGSignature(contents))
+    switch (sniffResult) {
+    case SniffResult::JPEG:
         return wrapUnique(new JPEGImageDecoder(alphaOption, colorOptions, maxDecodedBytes));
-
-    if (matchesPNGSignature(contents))
+    case SniffResult::PNG:
         return wrapUnique(new PNGImageDecoder(alphaOption, colorOptions, maxDecodedBytes));
-
-    if (matchesGIFSignature(contents))
+    case SniffResult::GIF:
         return wrapUnique(new GIFImageDecoder(alphaOption, colorOptions, maxDecodedBytes));
-
-    if (matchesWebPSignature(contents))
+    case SniffResult::WEBP:
         return wrapUnique(new WEBPImageDecoder(alphaOption, colorOptions, maxDecodedBytes));
-
-    if (matchesICOSignature(contents) || matchesCURSignature(contents))
+    case SniffResult::ICO:
         return wrapUnique(new ICOImageDecoder(alphaOption, colorOptions, maxDecodedBytes));
-
-    if (matchesBMPSignature(contents))
+    case SniffResult::BMP:
         return wrapUnique(new BMPImageDecoder(alphaOption, colorOptions, maxDecodedBytes));
-
+    case SniffResult::InsufficientData:
+    case SniffResult::Invalid:
+        return nullptr;
+    }
+    NOTREACHED();
     return nullptr;
 }
 
-std::unique_ptr<ImageDecoder> ImageDecoder::create(const SharedBuffer& data, AlphaOption alphaOption, GammaAndColorProfileOption colorOptions)
+ImageDecoder::SniffResult ImageDecoder::determineImageType(const char* contents, size_t length)
+{
+    const size_t longestSignatureLength = sizeof("RIFF????WEBPVP") - 1;
+    DCHECK_EQ(14u, longestSignatureLength);
+
+    if (length < longestSignatureLength)
+        return SniffResult::InsufficientData;
+    if (matchesJPEGSignature(contents))
+        return SniffResult::JPEG;
+    if (matchesPNGSignature(contents))
+        return SniffResult::PNG;
+    if (matchesGIFSignature(contents))
+        return SniffResult::GIF;
+    if (matchesWebPSignature(contents))
+        return SniffResult::WEBP;
+    if (matchesICOSignature(contents) || matchesCURSignature(contents))
+        return SniffResult::ICO;
+    if (matchesBMPSignature(contents))
+        return SniffResult::BMP;
+    return SniffResult::Invalid;
+}
+
+ImageDecoder::SniffResult ImageDecoder::determineImageType(const SharedBuffer& data)
 {
     const char* contents;
     const size_t length = data.getSomeData<size_t>(contents);
-    return create(contents, length, alphaOption, colorOptions);
+    return determineImageType(contents, length);
 }
 
-std::unique_ptr<ImageDecoder> ImageDecoder::create(const SegmentReader& data, AlphaOption alphaOption, GammaAndColorProfileOption colorOptions)
+ImageDecoder::SniffResult ImageDecoder::determineImageType(const SegmentReader& data)
 {
     const char* contents;
     const size_t length = data.getSomeData(contents, 0);
-    return create(contents, length, alphaOption, colorOptions);
+    return determineImageType(contents, length);
 }
 
 size_t ImageDecoder::frameCount()
@@ -315,6 +332,11 @@
     if (gTargetColorProfile)
         return;
 
+    {
+        sk_sp<SkColorSpace> colorSpace = SkColorSpace::NewICC(profile.data(), profile.size());
+        BitmapImageMetrics::countGamma(colorSpace.get());
+    }
+
     // FIXME: Add optional ICCv4 support and support for multiple monitors.
     gTargetColorProfile = qcms_profile_from_memory(profile.data(), profile.size());
     if (!gTargetColorProfile)
diff --git a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.h b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.h
index ccb3e40..0a73a82 100644
--- a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.h
+++ b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.h
@@ -94,6 +94,21 @@
         GammaAndColorProfileIgnored
     };
 
+    enum class SniffResult {
+        JPEG,
+        PNG,
+        GIF,
+        WEBP,
+        ICO,
+        BMP,
+        InsufficientData,
+        Invalid
+    };
+
+    static SniffResult determineImageType(const char* data, size_t length);
+    static SniffResult determineImageType(const SharedBuffer&);
+    static SniffResult determineImageType(const SegmentReader&);
+
     ImageDecoder(AlphaOption alphaOption, GammaAndColorProfileOption colorOptions, size_t maxDecodedBytes)
         : m_premultiplyAlpha(alphaOption == AlphaPremultiplied)
         , m_ignoreGammaAndColorProfile(colorOptions == GammaAndColorProfileIgnored)
@@ -108,9 +123,7 @@
     // we can't sniff a supported type from the provided data (possibly
     // because there isn't enough data yet).
     // Sets m_maxDecodedBytes to Platform::maxImageDecodedBytes().
-    static std::unique_ptr<ImageDecoder> create(const char* data, size_t length, AlphaOption, GammaAndColorProfileOption);
-    static std::unique_ptr<ImageDecoder> create(const SharedBuffer&, AlphaOption, GammaAndColorProfileOption);
-    static std::unique_ptr<ImageDecoder> create(const SegmentReader&, AlphaOption, GammaAndColorProfileOption);
+    static std::unique_ptr<ImageDecoder> create(SniffResult, AlphaOption, GammaAndColorProfileOption);
 
     virtual String filenameExtension() const = 0;
 
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/CodeGenerator.py b/third_party/WebKit/Source/platform/inspector_protocol/CodeGenerator.py
index 34462ae..6b72fae 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/CodeGenerator.py
+++ b/third_party/WebKit/Source/platform/inspector_protocol/CodeGenerator.py
@@ -24,11 +24,18 @@
 # In Blink, jinja2 is in chromium's third_party directory.
 # Insert at 1 so at front to override system libraries, and
 # after path[0] == invoking script dir
-third_party_dir = os.path.normpath(os.path.join(
+blink_third_party_dir = os.path.normpath(os.path.join(
     module_path, os.pardir, os.pardir, os.pardir, os.pardir, os.pardir,
     "third_party"))
-if os.path.isdir(third_party_dir):
-    sys.path.insert(1, third_party_dir)
+if os.path.isdir(blink_third_party_dir):
+    sys.path.insert(1, blink_third_party_dir)
+
+# In V8, it is in third_party folder
+v8_third_party_dir = os.path.normpath(os.path.join(
+    module_path, os.pardir, os.pardir, "third_party"))
+
+if os.path.isdir(v8_third_party_dir):
+    sys.path.insert(1, v8_third_party_dir)
 
 # In Node, it is in deps folder
 deps_dir = os.path.normpath(os.path.join(
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/TypeBuilder_cpp.template b/third_party/WebKit/Source/platform/inspector_protocol/TypeBuilder_cpp.template
index e9489f4..1c3300a 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/TypeBuilder_cpp.template
+++ b/third_party/WebKit/Source/platform/inspector_protocol/TypeBuilder_cpp.template
@@ -16,6 +16,7 @@
 // ------------- Enum values from types.
 
 const char Metainfo::domainName[] = "{{domain.domain}}";
+const char Metainfo::commandPrefix[] = "{{domain.domain}}.";
   {% for type in domain.types %}
     {% if "enum" in type %}
 
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/TypeBuilder_h.template b/third_party/WebKit/Source/platform/inspector_protocol/TypeBuilder_h.template
index d236374..1bbc619 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/TypeBuilder_h.template
+++ b/third_party/WebKit/Source/platform/inspector_protocol/TypeBuilder_h.template
@@ -285,6 +285,7 @@
     using FrontendClass = Frontend;
     using DispatcherClass = Dispatcher;
     static const char domainName[];
+    static const char commandPrefix[];
 };
 
 } // namespace {{domain.domain}}
diff --git a/third_party/WebKit/Source/platform/v8_inspector/InspectedContext.cpp b/third_party/WebKit/Source/platform/v8_inspector/InspectedContext.cpp
index 5b52e01..bf418196 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/InspectedContext.cpp
+++ b/third_party/WebKit/Source/platform/v8_inspector/InspectedContext.cpp
@@ -72,11 +72,6 @@
 void InspectedContext::createInjectedScript()
 {
     DCHECK(!m_injectedScript);
-    v8::HandleScope handles(isolate());
-    v8::Local<v8::Context> localContext = context();
-    v8::Local<v8::Context> callingContext = isolate()->GetCallingContext();
-    if (!callingContext.IsEmpty() && !m_debugger->client()->callingContextCanAccessContext(callingContext, localContext))
-        return;
     m_injectedScript = InjectedScript::create(this);
 }
 
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerAgentImpl.cpp b/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerAgentImpl.cpp
index 7af2a5e..20f19e5 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerAgentImpl.cpp
+++ b/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerAgentImpl.cpp
@@ -878,9 +878,6 @@
     // Fast return.
     if (m_scheduledDebuggerStep != StepInto)
         return;
-    // Skip unknown scripts (e.g. InjectedScript).
-    if (m_scripts.find(String16::fromInteger(scriptId)) == m_scripts.end())
-        return;
     schedulePauseOnNextStatementIfSteppingInto();
 }
 
@@ -1059,6 +1056,13 @@
     JavaScriptCallFrames callFrames = debugger().currentCallFrames(1);
     JavaScriptCallFrame* topCallFrame = !callFrames.empty() ? callFrames.begin()->get() : nullptr;
 
+    // Skip pause in internal scripts (e.g. InjectedScriptSource.js).
+    if (topCallFrame) {
+        ScriptsMap::iterator it = m_scripts.find(String16::fromInteger(topCallFrame->sourceID()));
+        if (it != m_scripts.end() && it->second->isInternalScript())
+            return RequestStepFrame;
+    }
+
     V8DebuggerAgentImpl::SkipPauseRequest result;
     if (m_skipAllPauses)
         result = RequestContinue;
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerImpl.cpp b/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerImpl.cpp
index d9db1a3..30f2c274 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerImpl.cpp
+++ b/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerImpl.cpp
@@ -809,24 +809,22 @@
 
 v8::MaybeLocal<v8::Value> V8DebuggerImpl::compileAndRunInternalScript(v8::Local<v8::Context> context, v8::Local<v8::String> source)
 {
-    v8::Local<v8::Script> script = compileInternalScript(context, source, String());
+    v8::Local<v8::Script> script = compileScript(context, source, String(), true);
     if (script.IsEmpty())
         return v8::MaybeLocal<v8::Value>();
     v8::MicrotasksScope microtasksScope(m_isolate, v8::MicrotasksScope::kDoNotRunMicrotasks);
     return script->Run(context);
 }
 
-v8::Local<v8::Script> V8DebuggerImpl::compileInternalScript(v8::Local<v8::Context> context, v8::Local<v8::String> code, const String16& fileName)
+v8::Local<v8::Script> V8DebuggerImpl::compileScript(v8::Local<v8::Context> context, v8::Local<v8::String> code, const String16& fileName, bool markAsInternal)
 {
-    // NOTE: For compatibility with WebCore, ScriptSourceCode's line starts at
-    // 1, whereas v8 starts at 0.
     v8::ScriptOrigin origin(
         toV8String(m_isolate, fileName),
         v8::Integer::New(m_isolate, 0),
         v8::Integer::New(m_isolate, 0),
         v8::False(m_isolate), // sharable
         v8::Local<v8::Integer>(),
-        v8::True(m_isolate), // internal
+        v8::Boolean::New(m_isolate, markAsInternal), // internal
         toV8String(m_isolate, String16()), // sourceMap
         v8::True(m_isolate)); // opaqueresource
     v8::ScriptCompiler::Source source(code, origin);
@@ -1063,20 +1061,6 @@
     m_isolate->GetCpuProfiler()->SetIdle(false);
 }
 
-void V8DebuggerImpl::logToConsole(v8::Local<v8::Context> context, v8::Local<v8::Value> arg1, v8::Local<v8::Value> arg2)
-{
-    int contextGroupId = getGroupId(context);
-    InspectedContext* inspectedContext = getContext(contextGroupId, contextId(context));
-    if (!inspectedContext)
-        return;
-    std::vector<v8::Local<v8::Value>> arguments;
-    if (!arg1.IsEmpty())
-        arguments.push_back(arg1);
-    if (!arg2.IsEmpty())
-        arguments.push_back(arg2);
-    ensureConsoleMessageStorage(contextGroupId)->addMessage(V8ConsoleMessage::createForConsoleAPI(m_client->currentTimeMS(), ConsoleAPIType::kLog, arguments, captureStackTraceImpl(false), inspectedContext));
-}
-
 void V8DebuggerImpl::exceptionThrown(int contextGroupId, const String16& errorMessage, const String16& url, unsigned lineNumber, unsigned columnNumber, std::unique_ptr<V8StackTrace> stackTrace, int scriptId)
 {
     std::unique_ptr<V8StackTraceImpl> stackTraceImpl = wrapUnique(static_cast<V8StackTraceImpl*>(stackTrace.release()));
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerImpl.h b/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerImpl.h
index 7994685b..83ebab0 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerImpl.h
+++ b/third_party/WebKit/Source/platform/v8_inspector/V8DebuggerImpl.h
@@ -114,7 +114,7 @@
     v8::MaybeLocal<v8::Value> runCompiledScript(v8::Local<v8::Context>, v8::Local<v8::Script>);
     v8::MaybeLocal<v8::Value> callFunction(v8::Local<v8::Function>, v8::Local<v8::Context>, v8::Local<v8::Value> receiver, int argc, v8::Local<v8::Value> info[]);
     v8::MaybeLocal<v8::Value> compileAndRunInternalScript(v8::Local<v8::Context>, v8::Local<v8::String>);
-    v8::Local<v8::Script> compileInternalScript(v8::Local<v8::Context>, v8::Local<v8::String>, const String16& fileName);
+    v8::Local<v8::Script> compileScript(v8::Local<v8::Context>, v8::Local<v8::String>, const String16& fileName, bool markAsInternal);
     v8::Local<v8::Context> regexContext();
 
     void enableStackCapturingIfNeeded();
@@ -132,7 +132,6 @@
     void didExecuteScript(v8::Local<v8::Context>) override;
     void idleStarted() override;
     void idleFinished() override;
-    void logToConsole(v8::Local<v8::Context>, v8::Local<v8::Value> arg1, v8::Local<v8::Value> arg2) override;
     void exceptionThrown(int contextGroupId, const String16& errorMessage, const String16& url, unsigned lineNumber, unsigned columnNumber, std::unique_ptr<V8StackTrace>, int scriptId) override;
     unsigned promiseRejected(v8::Local<v8::Context>, const String16& errorMessage, v8::Local<v8::Value> exception, const String16& url, unsigned lineNumber, unsigned columnNumber, std::unique_ptr<V8StackTrace>, int scriptId) override;
     void promiseRejectionRevoked(v8::Local<v8::Context>, unsigned promiseRejectionId) override;
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.cpp b/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.cpp
index db89ba4..de7886a 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.cpp
+++ b/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.cpp
@@ -22,9 +22,13 @@
 const char V8InspectorSession::backtraceObjectGroup[] = "backtrace";
 
 // static
-bool V8InspectorSession::isV8ProtocolMethod(const String16& method)
+bool V8InspectorSession::canDispatchMethod(const String16& method)
 {
-    return method.startWith("Debugger.") || method.startWith("HeapProfiler.") || method.startWith("Profiler.") || method.startWith("Runtime.") || method.startWith("Console.");
+    return method.startWith(protocol::Runtime::Metainfo::commandPrefix)
+        || method.startWith(protocol::Debugger::Metainfo::commandPrefix)
+        || method.startWith(protocol::Profiler::Metainfo::commandPrefix)
+        || method.startWith(protocol::HeapProfiler::Metainfo::commandPrefix)
+        || method.startWith(protocol::Console::Metainfo::commandPrefix);
 }
 
 std::unique_ptr<V8InspectorSessionImpl> V8InspectorSessionImpl::create(V8DebuggerImpl* debugger, int contextGroupId, protocol::FrontendChannel* channel, V8InspectorSessionClient* client, const String16* state)
@@ -278,9 +282,9 @@
     return m_inspectedObjects[num].get();
 }
 
-void V8InspectorSessionImpl::schedulePauseOnNextStatement(const String16& breakReason, std::unique_ptr<protocol::DictionaryValue> data)
+void V8InspectorSessionImpl::schedulePauseOnNextStatement(const String16& breakReason, const String16& breakDetails)
 {
-    m_debuggerAgent->schedulePauseOnNextStatement(breakReason, std::move(data));
+    m_debuggerAgent->schedulePauseOnNextStatement(breakReason, protocol::DictionaryValue::cast(parseJSON(breakDetails)));
 }
 
 void V8InspectorSessionImpl::cancelPauseOnNextStatement()
@@ -288,9 +292,9 @@
     m_debuggerAgent->cancelPauseOnNextStatement();
 }
 
-void V8InspectorSessionImpl::breakProgram(const String16& breakReason, std::unique_ptr<protocol::DictionaryValue> data)
+void V8InspectorSessionImpl::breakProgram(const String16& breakReason, const String16& breakDetails)
 {
-    m_debuggerAgent->breakProgram(breakReason, std::move(data));
+    m_debuggerAgent->breakProgram(breakReason, protocol::DictionaryValue::cast(parseJSON(breakDetails)));
 }
 
 void V8InspectorSessionImpl::setSkipAllPauses(bool skip)
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.h b/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.h
index 888c3d7..cbdab5e 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.h
+++ b/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.h
@@ -55,9 +55,9 @@
     void dispatchProtocolMessage(const String16& message) override;
     String16 stateJSON() override;
     void addInspectedObject(std::unique_ptr<V8InspectorSession::Inspectable>) override;
-    void schedulePauseOnNextStatement(const String16& breakReason, std::unique_ptr<protocol::DictionaryValue> data) override;
+    void schedulePauseOnNextStatement(const String16& breakReason, const String16& breakDetails) override;
     void cancelPauseOnNextStatement() override;
-    void breakProgram(const String16& breakReason, std::unique_ptr<protocol::DictionaryValue> data) override;
+    void breakProgram(const String16& breakReason, const String16& breakDetails) override;
     void setSkipAllPauses(bool) override;
     void resume() override;
     void stepOver() override;
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8RuntimeAgentImpl.cpp b/third_party/WebKit/Source/platform/v8_inspector/V8RuntimeAgentImpl.cpp
index c9a235ae..1f203b094 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/V8RuntimeAgentImpl.cpp
+++ b/third_party/WebKit/Source/platform/v8_inspector/V8RuntimeAgentImpl.cpp
@@ -115,7 +115,7 @@
         scope.context()->AllowCodeGenerationFromStrings(true);
 
     v8::MaybeLocal<v8::Value> maybeResultValue;
-    v8::Local<v8::Script> script = m_debugger->compileInternalScript(scope.context(), toV8String(m_debugger->isolate(), expression), String16());
+    v8::Local<v8::Script> script = m_debugger->compileScript(scope.context(), toV8String(m_debugger->isolate(), expression), String16(), false);
     if (!script.IsEmpty())
         maybeResultValue = m_debugger->runCompiledScript(scope.context(), script);
 
@@ -289,7 +289,7 @@
     if (!scope.initialize())
         return;
 
-    v8::Local<v8::Script> script = m_debugger->compileInternalScript(scope.context(), toV8String(m_debugger->isolate(), expression), sourceURL);
+    v8::Local<v8::Script> script = m_debugger->compileScript(scope.context(), toV8String(m_debugger->isolate(), expression), sourceURL, false);
     if (script.IsEmpty()) {
         v8::Local<v8::Message> message = scope.tryCatch().Message();
         if (!message.IsEmpty())
@@ -369,7 +369,7 @@
 {
     if (m_enabled)
         return;
-    m_session->client()->runtimeEnabled();
+    m_debugger->client()->beginEnsureAllContextsInGroup(m_session->contextGroupId());
     m_enabled = true;
     m_state->setBoolean(V8RuntimeAgentImplState::runtimeEnabled, true);
     m_session->debugger()->enableStackCapturingIfNeeded();
@@ -388,7 +388,7 @@
     m_session->debugger()->disableStackCapturingIfNeeded();
     m_session->discardInjectedScripts();
     reset();
-    m_session->client()->runtimeDisabled();
+    m_debugger->client()->endEnsureAllContextsInGroup(m_session->contextGroupId());
 }
 
 void V8RuntimeAgentImpl::reset()
diff --git a/third_party/WebKit/Source/platform/v8_inspector/public/V8Debugger.h b/third_party/WebKit/Source/platform/v8_inspector/public/V8Debugger.h
index da3dcac..1ee5cc4 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/public/V8Debugger.h
+++ b/third_party/WebKit/Source/platform/v8_inspector/public/V8Debugger.h
@@ -52,9 +52,6 @@
     virtual unsigned promiseRejected(v8::Local<v8::Context>, const String16& errorMessage, v8::Local<v8::Value> exception, const String16& url, unsigned lineNumber, unsigned columnNumber, std::unique_ptr<V8StackTrace>, int scriptId) = 0;
     virtual void promiseRejectionRevoked(v8::Local<v8::Context>, unsigned promiseRejectionId) = 0;
 
-    // TODO(dgozman): can we remove this method?
-    virtual void logToConsole(v8::Local<v8::Context>, v8::Local<v8::Value> arg1, v8::Local<v8::Value> arg2) = 0;
-
     // API methods.
     virtual std::unique_ptr<V8InspectorSession> connect(int contextGroupId, protocol::FrontendChannel*, V8InspectorSessionClient*, const String16* state) = 0;
     virtual std::unique_ptr<V8StackTrace> createStackTrace(v8::Local<v8::StackTrace>) = 0;
diff --git a/third_party/WebKit/Source/platform/v8_inspector/public/V8DebuggerClient.h b/third_party/WebKit/Source/platform/v8_inspector/public/V8DebuggerClient.h
index 3747f66..8b9a9531 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/public/V8DebuggerClient.h
+++ b/third_party/WebKit/Source/platform/v8_inspector/public/V8DebuggerClient.h
@@ -24,7 +24,6 @@
     virtual void unmuteWarningsAndDeprecations(int contextGroupId) = 0;
     virtual void beginUserGesture() = 0;
     virtual void endUserGesture() = 0;
-    virtual bool callingContextCanAccessContext(v8::Local<v8::Context> calling, v8::Local<v8::Context> target) = 0;
     virtual String16 valueSubtype(v8::Local<v8::Value>) = 0;
     virtual bool formatAccessorsAsProperties(v8::Local<v8::Value>) = 0;
     virtual bool isExecutionAllowed() = 0;
@@ -33,6 +32,8 @@
     virtual bool isInspectableHeapObject(v8::Local<v8::Object>) = 0;
     virtual void enableAsyncInstrumentation() = 0;
     virtual void disableAsyncInstrumentation() = 0;
+    virtual void beginEnsureAllContextsInGroup(int contextGroupId) = 0;
+    virtual void endEnsureAllContextsInGroup(int contextGroupId) = 0;
 
     virtual void installAdditionalCommandLineAPI(v8::Local<v8::Context>, v8::Local<v8::Object>) = 0;
 
diff --git a/third_party/WebKit/Source/platform/v8_inspector/public/V8InspectorSession.h b/third_party/WebKit/Source/platform/v8_inspector/public/V8InspectorSession.h
index 6d3caae..6b9a1da 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/public/V8InspectorSession.h
+++ b/third_party/WebKit/Source/platform/v8_inspector/public/V8InspectorSession.h
@@ -25,15 +25,14 @@
     virtual void addInspectedObject(std::unique_ptr<Inspectable>) = 0;
 
     // Dispatching protocol messages.
-    // TODO(dgozman): generate this one.
-    static bool isV8ProtocolMethod(const String16& method);
+    static bool canDispatchMethod(const String16& method);
     virtual void dispatchProtocolMessage(const String16& message) = 0;
     virtual String16 stateJSON() = 0;
 
     // Debugger actions.
-    virtual void schedulePauseOnNextStatement(const String16& breakReason, std::unique_ptr<protocol::DictionaryValue> data) = 0;
+    virtual void schedulePauseOnNextStatement(const String16& breakReason, const String16& breakDetails) = 0;
     virtual void cancelPauseOnNextStatement() = 0;
-    virtual void breakProgram(const String16& breakReason, std::unique_ptr<protocol::DictionaryValue> data) = 0;
+    virtual void breakProgram(const String16& breakReason, const String16& breakDetails) = 0;
     virtual void setSkipAllPauses(bool) = 0;
     virtual void resume() = 0;
     virtual void stepOver() = 0;
diff --git a/third_party/WebKit/Source/platform/v8_inspector/public/V8InspectorSessionClient.h b/third_party/WebKit/Source/platform/v8_inspector/public/V8InspectorSessionClient.h
index e9e7c33..78c1b7d1 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/public/V8InspectorSessionClient.h
+++ b/third_party/WebKit/Source/platform/v8_inspector/public/V8InspectorSessionClient.h
@@ -14,8 +14,6 @@
 class PLATFORM_EXPORT V8InspectorSessionClient {
 public:
     virtual ~V8InspectorSessionClient() { }
-    virtual void runtimeEnabled() = 0;
-    virtual void runtimeDisabled() = 0;
     virtual void resumeStartup() = 0;
     // TODO(dgozman): this was added to support service worker shadow page. We should not connect at all.
     virtual bool canExecuteScripts() = 0;
diff --git a/third_party/WebKit/Source/web/WebElement.cpp b/third_party/WebKit/Source/web/WebElement.cpp
index cbc2b52..634d2f1d2 100644
--- a/third_party/WebKit/Source/web/WebElement.cpp
+++ b/third_party/WebKit/Source/web/WebElement.cpp
@@ -34,6 +34,7 @@
 #include "core/HTMLNames.h"
 #include "core/dom/Element.h"
 #include "core/dom/custom/V0CustomElementProcessingStack.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/html/HTMLTextFormControlElement.h"
 #include "platform/graphics/Image.h"
 #include "public/platform/WebRect.h"
diff --git a/third_party/WebKit/Source/web/WebFormControlElement.cpp b/third_party/WebKit/Source/web/WebFormControlElement.cpp
index df17acd..a7182861 100644
--- a/third_party/WebKit/Source/web/WebFormControlElement.cpp
+++ b/third_party/WebKit/Source/web/WebFormControlElement.cpp
@@ -185,10 +185,22 @@
     return 0;
 }
 
+WebString WebFormControlElement::alignmentForFormData() const
+{
+    if (const ComputedStyle* style = constUnwrap<HTMLFormControlElement>()->computedStyle()) {
+        if (style->textAlign() == RIGHT)
+            return WebString::fromUTF8("right");
+        if (style->textAlign() == LEFT)
+            return WebString::fromUTF8("left");
+    }
+    return WebString();
+}
+
 WebString WebFormControlElement::directionForFormData() const
 {
-    if (const ComputedStyle* style = constUnwrap<HTMLFormControlElement>()->computedStyle())
+    if (const ComputedStyle* style = constUnwrap<HTMLFormControlElement>()->computedStyle()) {
         return style->isLeftToRightDirection() ? WebString::fromUTF8("ltr") : WebString::fromUTF8("rtl");
+    }
     return WebString::fromUTF8("ltr");
 }
 
diff --git a/third_party/WebKit/Source/web/WebInputElement.cpp b/third_party/WebKit/Source/web/WebInputElement.cpp
index e8b42333..c4b6c0a 100644
--- a/third_party/WebKit/Source/web/WebInputElement.cpp
+++ b/third_party/WebKit/Source/web/WebInputElement.cpp
@@ -42,6 +42,7 @@
 #include "platform/RuntimeEnabledFeatures.h"
 #include "public/platform/WebString.h"
 #include "public/web/WebElementCollection.h"
+#include "public/web/WebOptionElement.h"
 #include "wtf/PassRefPtr.h"
 
 namespace blink {
@@ -122,11 +123,9 @@
     return constUnwrap<HTMLInputElement>()->multiple();
 }
 
-WebElementCollection WebInputElement::dataListOptions() const
+WebVector<WebOptionElement> WebInputElement::filteredDataListOptions() const
 {
-    if (HTMLDataListElement* dataList = toHTMLDataListElement(constUnwrap<HTMLInputElement>()->list()))
-        return WebElementCollection(dataList->options());
-    return WebElementCollection();
+    return WebVector<WebOptionElement>(constUnwrap<HTMLInputElement>()->filteredDataListOptions());
 }
 
 WebString WebInputElement::localizeValue(const WebString& proposedValue) const
diff --git a/third_party/WebKit/Source/web/WebNode.cpp b/third_party/WebKit/Source/web/WebNode.cpp
index 44ef00b95..8b001a8 100644
--- a/third_party/WebKit/Source/web/WebNode.cpp
+++ b/third_party/WebKit/Source/web/WebNode.cpp
@@ -37,6 +37,7 @@
 #include "core/dom/NodeList.h"
 #include "core/dom/StaticNodeList.h"
 #include "core/dom/TagCollection.h"
+#include "core/editing/EditingUtilities.h"
 #include "core/editing/serializers/Serialization.h"
 #include "core/events/Event.h"
 #include "core/html/HTMLCollection.h"
diff --git a/third_party/WebKit/Source/web/tests/ActivityLoggerTest.cpp b/third_party/WebKit/Source/web/tests/ActivityLoggerTest.cpp
index 6cbf7bd..826800f 100644
--- a/third_party/WebKit/Source/web/tests/ActivityLoggerTest.cpp
+++ b/third_party/WebKit/Source/web/tests/ActivityLoggerTest.cpp
@@ -524,12 +524,12 @@
     const char* expectedActivities =
         "blinkAddElement | iframe | data:text/html;charset=utf-8,A\n"
         "blinkRequestResource | Main resource | data:text/html;charset=utf-8,A\n"
-        "blinkRequestResource | Image | data:text/html;charset=utf-8,B\n"
         "blinkAddElement | link | stylesheet | data:text/html;charset=utf-8,C\n"
         "blinkRequestResource | CSS stylesheet | data:text/html;charset=utf-8,C\n"
         "blinkAddElement | script | data:text/html;charset=utf-8,D\n"
         "blinkRequestResource | Script | data:text/html;charset=utf-8,D\n"
-        "blinkRequestResource | XMLHttpRequest | data:text/html;charset=utf-8,E";
+        "blinkRequestResource | XMLHttpRequest | data:text/html;charset=utf-8,E\n"
+        "blinkRequestResource | Image | data:text/html;charset=utf-8,B";
     executeScriptInMainWorld(code);
     ASSERT_TRUE(verifyActivities(""));
     executeScriptInIsolatedWorld(code);
diff --git a/third_party/WebKit/Source/web/tests/ResizeObserverTest.cpp b/third_party/WebKit/Source/web/tests/ResizeObserverTest.cpp
new file mode 100644
index 0000000..e78a0eb
--- /dev/null
+++ b/third_party/WebKit/Source/web/tests/ResizeObserverTest.cpp
@@ -0,0 +1,98 @@
+// 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 "core/observer/ResizeObserver.h"
+
+#include "core/observer/ResizeObservation.h"
+#include "core/observer/ResizeObserverCallback.h"
+#include "platform/testing/UnitTestHelpers.h"
+#include "web/WebViewImpl.h"
+#include "web/tests/sim/SimCompositor.h"
+#include "web/tests/sim/SimDisplayItemList.h"
+#include "web/tests/sim/SimRequest.h"
+#include "web/tests/sim/SimTest.h"
+#include "wtf/CurrentTime.h"
+
+namespace blink {
+
+namespace {
+
+class TestResizeObserverCallback : public ResizeObserverCallback {
+public:
+    TestResizeObserverCallback(Document& document)
+        : m_document(document)
+        , m_callCount(0)
+    { }
+    void handleEvent(const HeapVector<Member<ResizeObserverEntry>>& entries, ResizeObserver*) override
+    {
+        m_callCount++;
+    }
+    ExecutionContext* getExecutionContext() const { return m_document; }
+    int callCount() const { return m_callCount; }
+
+    DEFINE_INLINE_TRACE() {
+        ResizeObserverCallback::trace(visitor);
+        visitor->trace(m_document);
+    }
+
+private:
+    Member<Document> m_document;
+    int m_callCount;
+};
+
+} // namespace
+
+/* Testing:
+ * getTargetSize
+ * setTargetSize
+ * oubservationSizeOutOfSync == false
+ * modify target size
+ * oubservationSizeOutOfSync == true
+ */
+class ResizeObservationUnitTest : public SimTest { };
+
+TEST_F(ResizeObservationUnitTest, ObserveSchedulesFrame)
+{
+    SimRequest mainResource("https://example.com/", "text/html");
+    loadURL("https://example.com/");
+
+    mainResource.start();
+    mainResource.write(
+        "<div id='domTarget' style='width:100px;height:100px'>yo</div>"
+        "<svg height='200' width='200'>"
+            "<circle id='svgTarget' cx='100' cy='100' r='100'/>"
+        "</svg>"
+    );
+    mainResource.finish();
+
+    ResizeObserverCallback* callback = new TestResizeObserverCallback(document());
+    ResizeObserver* observer = ResizeObserver::create(document(), callback);
+    Element* domTarget = document().getElementById("domTarget");
+    Element* svgTarget = document().getElementById("svgTarget");
+    ResizeObservation* domObservation = new ResizeObservation(domTarget, observer);
+    ResizeObservation* svgObservation = new ResizeObservation(svgTarget, observer);
+
+    // Initial observation is out of sync
+    ASSERT_TRUE(domObservation->observationSizeOutOfSync());
+    ASSERT_TRUE(svgObservation->observationSizeOutOfSync());
+
+    // Target size is correct
+    LayoutSize size = ResizeObservation::getTargetSize(domTarget);
+    ASSERT_EQ(size.width(), 100);
+    ASSERT_EQ(size.height(), 100);
+    domObservation->setObservationSize(size);
+
+    size = ResizeObservation::getTargetSize(svgTarget);
+    ASSERT_EQ(size.width(), 200);
+    ASSERT_EQ(size.height(), 200);
+    svgObservation->setObservationSize(size);
+
+    // Target size is in sync
+    ASSERT_FALSE(domObservation->observationSizeOutOfSync());
+
+    // Target depths
+    ASSERT_EQ(svgObservation->targetDepth() - domObservation->targetDepth(), (size_t)1);
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/web/web.gypi b/third_party/WebKit/Source/web/web.gypi
index 47d78c4..4d0b255 100644
--- a/third_party/WebKit/Source/web/web.gypi
+++ b/third_party/WebKit/Source/web/web.gypi
@@ -265,6 +265,7 @@
       'tests/PrerenderingTest.cpp',
       'tests/ProgrammaticScrollTest.cpp',
       'tests/LayoutGeometryMapTest.cpp',
+      'tests/ResizeObserverTest.cpp',
       'tests/RootScrollerTest.cpp',
       'tests/ScreenWakeLockTest.cpp',
       'tests/ScrollingCoordinatorTest.cpp',
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py
index 3e8db9d..165e1d0 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py
@@ -300,7 +300,10 @@
         return [self._filesystem.join(path, suite.name) for path in self.default_baseline_search_path()]
 
     def baseline_search_path(self):
-        return self.get_option('additional_platform_directory', []) + self._compare_baseline() + self.default_baseline_search_path()
+        return (self.get_option('additional_platform_directory', []) +
+                self._flag_specific_baseline_search_path() +
+                self._compare_baseline() +
+                self.default_baseline_search_path())
 
     def default_baseline_search_path(self):
         """Return a list of absolute paths to directories to search under for
@@ -1265,6 +1268,11 @@
         return [self._filesystem.join(self.layout_tests_dir(), 'FlagExpectations', flag.lstrip('-'))
                 for flag in self.get_option('additional_driver_flag', [])]
 
+    def _flag_specific_baseline_search_path(self):
+        # TODO(skobes): Baselines specific to both flag and platform?
+        return [self._filesystem.join(self.layout_tests_dir(), 'flag-specific', flag.lstrip('-'))
+                for flag in self.get_option('additional_driver_flag', [])]
+
     def expectations_dict(self):
         """Returns an OrderedDict of name -> expectations strings.
         The names are expected to be (but not required to be) paths in the filesystem.
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base_unittest.py
index 584dcb4381..5014779 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base_unittest.py
@@ -211,6 +211,11 @@
             [('/tmp/local-baselines', 'fast/test-expected.txt')])
         self.assertEqual(port.baseline_path(), '/foo')
 
+        # Flag-specific baseline directory
+        port._options.additional_platform_directory = []
+        port._options.additional_driver_flag = ['--special-flag']
+        self.assertEqual(port.baseline_path(), '/mock-checkout/third_party/WebKit/LayoutTests/flag-specific/special-flag')
+
     def test_nonexistant_expectations(self):
         port = self.make_port(port_name='foo')
         port.expectations_files = lambda: ['/mock-checkout/third_party/WebKit/LayoutTests/platform/exists/TestExpectations',
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/tool/bot/commit_announcer_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/tool/bot/commit_announcer_unittest.py
index ee8ed47..4e410322 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/tool/bot/commit_announcer_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/tool/bot/commit_announcer_unittest.py
@@ -26,13 +26,13 @@
 import unittest
 
 from webkitpy.tool.bot.commit_announcer import CommitAnnouncer
-from webkitpy.tool.mock_tool import MockTool
+from webkitpy.tool.mock_tool import MockWebKitPatch
 
 
 class CommitAnnouncerTest(unittest.TestCase):
 
     def test_format_commit(self):
-        tool = MockTool()
+        tool = MockWebKitPatch()
         bot = CommitAnnouncer(tool, "test/directory", "test_password")
         self.assertEqual(
             'https://crrev.com/456789 authorABC@chromium.org committed "Commit test subject line"',
@@ -200,6 +200,6 @@
 """))
 
     def test_sanitize_string(self):
-        bot = CommitAnnouncer(MockTool(), "test/directory", "test_password")
+        bot = CommitAnnouncer(MockWebKitPatch(), "test/directory", "test_password")
         self.assertEqual('normal ascii', bot._sanitize_string('normal ascii'))
         self.assertEqual('uni\\u0441ode!', bot._sanitize_string(u'uni\u0441ode!'))
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/command_test.py b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/command_test.py
index 5265f11..413ae79 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/command_test.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/command_test.py
@@ -29,13 +29,13 @@
 import unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
-from webkitpy.tool.mock_tool import MockOptions, MockTool
+from webkitpy.tool.mock_tool import MockOptions, MockWebKitPatch
 
 
 class CommandsTest(unittest.TestCase):
 
     def assert_execute_outputs(self, command, args=None, expected_stdout="", expected_stderr="",
-                               expected_exception=None, expected_logs=None, options=MockOptions(), tool=MockTool()):
+                               expected_exception=None, expected_logs=None, options=MockOptions(), tool=MockWebKitPatch()):
         args = args or []
         options.blocks = None
         options.cc = 'MOCK cc'
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/flaky_tests_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/flaky_tests_unittest.py
index ebfd267..ad38515 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/flaky_tests_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/flaky_tests_unittest.py
@@ -6,7 +6,7 @@
 from webkitpy.layout_tests.layout_package import bot_test_expectations
 from webkitpy.tool.commands import flaky_tests
 from webkitpy.tool.commands.command_test import CommandsTest
-from webkitpy.tool.mock_tool import MockTool, MockOptions
+from webkitpy.tool.mock_tool import MockWebKitPatch, MockOptions
 
 
 class FakeBotTestExpectations(object):
@@ -70,7 +70,7 @@
 
     def test_integration(self):
         command = flaky_tests.FlakyTests()
-        tool = MockTool()
+        tool = MockWebKitPatch()
         tool.builders = self.fake_builders_list()
         command.expectations_factory = FakeBotTestExpectationsFactory
         options = MockOptions(upload=True)
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/queries_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/queries_unittest.py
index 39d235b..da91957f 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/queries_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/queries_unittest.py
@@ -30,9 +30,8 @@
 import unittest
 
 from webkitpy.common.system.outputcapture import OutputCapture
-from webkitpy.layout_tests.port.test import TestPort
 from webkitpy.tool.commands.queries import *
-from webkitpy.tool.mock_tool import MockTool, MockOptions
+from webkitpy.tool.mock_tool import MockWebKitPatch, MockOptions
 
 
 class PrintExpectationsTest(unittest.TestCase):
@@ -40,7 +39,7 @@
     def run_test(self, tests, expected_stdout, platform='test-win-win7', **args):
         options = MockOptions(all=False, csv=False, full=False, platform=platform,
                               include_keyword=[], exclude_keyword=[], paths=False).update(**args)
-        tool = MockTool()
+        tool = MockWebKitPatch()
         tool.port_factory.all_port_names = lambda: [
             'test-linux-trusty', 'test-linux-precise',
             'test-mac-mac10.11', 'test-mac-mac10.10',
@@ -112,7 +111,7 @@
 
     def setUp(self):
         self.oc = None
-        self.tool = MockTool()
+        self.tool = MockWebKitPatch()
         self.test_port = self.tool.port_factory.get('test-win-win7')
         self.tool.port_factory.get = lambda port_name=None: self.test_port
         self.tool.port_factory.all_port_names = lambda: [
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py
index e041ce3f..cc49911a 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py
@@ -10,7 +10,7 @@
 from webkitpy.common.system.outputcapture import OutputCapture
 from webkitpy.layout_tests.builder_list import BuilderList
 from webkitpy.tool.commands.rebaseline import *
-from webkitpy.tool.mock_tool import MockTool, MockOptions
+from webkitpy.tool.mock_tool import MockWebKitPatch, MockOptions
 
 
 class BaseTestCase(unittest.TestCase):
@@ -20,7 +20,7 @@
     command_constructor = None
 
     def setUp(self):
-        self.tool = MockTool()
+        self.tool = MockWebKitPatch()
         # lint warns that command_constructor might not be set, but this is intentional; pylint: disable=E1102
         self.command = self.command_constructor()
         self.tool.builders = BuilderList({
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/tool/mock_tool.py b/third_party/WebKit/Tools/Scripts/webkitpy/tool/mock_tool.py
index 44cd6a2..0a84a7d 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/tool/mock_tool.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/tool/mock_tool.py
@@ -51,8 +51,7 @@
         return self.__dict__[key]
 
 
-# FIXME: This should be renamed MockWebKitPatch.
-class MockTool(MockHost):
+class MockWebKitPatch(MockHost):
 
     def __init__(self, *args, **kwargs):
         MockHost.__init__(self, *args, **kwargs)
diff --git a/third_party/WebKit/public/web/WebDocument.h b/third_party/WebKit/public/web/WebDocument.h
index 040fa1b..6d2854d 100644
--- a/third_party/WebKit/public/web/WebDocument.h
+++ b/third_party/WebKit/public/web/WebDocument.h
@@ -35,6 +35,7 @@
 #include "WebExceptionCode.h"
 #include "WebFrame.h"
 #include "WebNode.h"
+#include "public/platform/WebColor.h"
 #include "public/platform/WebReferrerPolicy.h"
 #include "public/platform/WebSecurityOrigin.h"
 #include "public/platform/WebVector.h"
diff --git a/third_party/WebKit/public/web/WebFormControlElement.h b/third_party/WebKit/public/web/WebFormControlElement.h
index 0f01e1b..0600045 100644
--- a/third_party/WebKit/public/web/WebFormControlElement.h
+++ b/third_party/WebKit/public/web/WebFormControlElement.h
@@ -100,6 +100,9 @@
     // element nor textarea element, 0 is returned.
     BLINK_EXPORT int selectionEnd() const;
 
+    // Returns text-align(only left and right are supported. see crbug.com/482339) of text of element.
+    BLINK_EXPORT WebString alignmentForFormData() const;
+
     // Returns direction of text of element.
     BLINK_EXPORT WebString directionForFormData() const;
 
diff --git a/third_party/WebKit/public/web/WebFrame.h b/third_party/WebKit/public/web/WebFrame.h
index 5a295c7..26bb626c 100644
--- a/third_party/WebKit/public/web/WebFrame.h
+++ b/third_party/WebKit/public/web/WebFrame.h
@@ -31,18 +31,11 @@
 #ifndef WebFrame_h
 #define WebFrame_h
 
-#include "WebCompositionUnderline.h"
-#include "WebHistoryItem.h"
 #include "WebIconURL.h"
 #include "WebNode.h"
 #include "WebURLLoaderOptions.h"
-#include "public/platform/WebCachePolicy.h"
 #include "public/platform/WebCanvas.h"
 #include "public/platform/WebInsecureRequestPolicy.h"
-#include "public/platform/WebMessagePortChannel.h"
-#include "public/platform/WebReferrerPolicy.h"
-#include "public/platform/WebURL.h"
-#include "public/platform/WebURLRequest.h"
 #include "public/web/WebFrameLoadType.h"
 #include "public/web/WebTreeScopeType.h"
 #include <memory>
@@ -71,7 +64,6 @@
 class WebLayer;
 class WebLocalFrame;
 class WebPerformance;
-class WebRange;
 class WebRemoteFrame;
 class WebSecurityOrigin;
 class WebSharedWorkerRepositoryClient;
@@ -82,16 +74,11 @@
 class WebView;
 enum class WebSandboxFlags;
 struct WebConsoleMessage;
-struct WebFindOptions;
-struct WebFloatPoint;
-struct WebFloatRect;
 struct WebFrameOwnerProperties;
-struct WebPoint;
 struct WebPrintParams;
 struct WebRect;
 struct WebScriptSource;
 struct WebSize;
-struct WebURLLoaderOptions;
 
 template <typename T> class WebVector;
 
diff --git a/third_party/WebKit/public/web/WebInputElement.h b/third_party/WebKit/public/web/WebInputElement.h
index b9b8905..cd5dcc8 100644
--- a/third_party/WebKit/public/web/WebInputElement.h
+++ b/third_party/WebKit/public/web/WebInputElement.h
@@ -37,6 +37,7 @@
 
 class HTMLInputElement;
 class WebElementCollection;
+class WebOptionElement;
 
 // Provides readonly access to some properties of a DOM input element node.
 class WebInputElement final : public WebFormControlElement {
@@ -76,7 +77,8 @@
     BLINK_EXPORT bool isChecked() const;
     BLINK_EXPORT bool isMultiple() const;
 
-    BLINK_EXPORT WebElementCollection dataListOptions() const;
+    // Associated <datalsit> options which match to the current INPUT value.
+    BLINK_EXPORT WebVector<WebOptionElement> filteredDataListOptions() const;
 
     // Return the localized value for this input type.
     BLINK_EXPORT WebString localizeValue(const WebString&) const;
diff --git a/third_party/WebKit/public/web/WebLocalFrame.h b/third_party/WebKit/public/web/WebLocalFrame.h
index 59e559ef..3d93c03 100644
--- a/third_party/WebKit/public/web/WebLocalFrame.h
+++ b/third_party/WebKit/public/web/WebLocalFrame.h
@@ -5,8 +5,11 @@
 #ifndef WebLocalFrame_h
 #define WebLocalFrame_h
 
+#include "WebCompositionUnderline.h"
 #include "WebFrame.h"
 #include "WebFrameLoadType.h"
+#include "WebHistoryItem.h"
+#include "public/platform/WebCachePolicy.h"
 
 namespace blink {
 
@@ -15,14 +18,16 @@
 class WebDevToolsAgent;
 class WebDevToolsAgentClient;
 class WebFrameClient;
-class WebNode;
+class WebFrameWidget;
+class WebRange;
 class WebScriptExecutionCallback;
 class WebSuspendableTask;
-class WebFrameWidget;
 enum class WebAppBannerPromptReply;
 enum class WebCachePolicy;
 enum class WebSandboxFlags;
 enum class WebTreeScopeType;
+struct WebFindOptions;
+struct WebFloatRect;
 struct WebPrintPresetOptions;
 
 // Interface for interacting with in process frames. This contains methods that
diff --git a/third_party/WebKit/public/web/WebView.h b/third_party/WebKit/public/web/WebView.h
index 4f81bb6..fa560ed6 100644
--- a/third_party/WebKit/public/web/WebView.h
+++ b/third_party/WebKit/public/web/WebView.h
@@ -38,8 +38,6 @@
 #include "../platform/WebPageVisibilityState.h"
 #include "../platform/WebString.h"
 #include "../platform/WebVector.h"
-#include "WebHistoryCommitType.h"
-#include "WebHistoryItem.h"
 #include "WebWidget.h"
 
 namespace blink {
diff --git a/third_party/closure_compiler/externs/networking_private.js b/third_party/closure_compiler/externs/networking_private.js
index ee64645..8a1a78f 100644
--- a/third_party/closure_compiler/externs/networking_private.js
+++ b/third_party/closure_compiler/externs/networking_private.js
@@ -357,7 +357,7 @@
  * @typedef {{
  *   Gateway: (!chrome.networkingPrivate.ManagedDOMString|undefined),
  *   IPAddress: (!chrome.networkingPrivate.ManagedDOMString|undefined),
- *   NameServers: (!Array<!chrome.networkingPrivate.ManagedDOMString>|undefined),
+ *   NameServers: (!chrome.networkingPrivate.ManagedDOMStringList|undefined),
  *   RoutingPrefix: (!chrome.networkingPrivate.ManagedLong|undefined),
  *   Type: (!chrome.networkingPrivate.ManagedDOMString|undefined),
  *   WebProxyAutoDiscoveryUrl: (!chrome.networkingPrivate.ManagedDOMString|undefined)
@@ -595,11 +595,11 @@
  *   Proto: (!chrome.networkingPrivate.ManagedDOMString|undefined),
  *   PushPeerInfo: (!chrome.networkingPrivate.ManagedDOMString|undefined),
  *   RemoteCertEKU: (!chrome.networkingPrivate.ManagedDOMString|undefined),
- *   RemoteCertKU: (!Array<!chrome.networkingPrivate.ManagedDOMString>|undefined),
+ *   RemoteCertKU: (!chrome.networkingPrivate.ManagedDOMStringList|undefined),
  *   RemoteCertTLS: (!chrome.networkingPrivate.ManagedDOMString|undefined),
  *   RenegSec: (!chrome.networkingPrivate.ManagedLong|undefined),
  *   SaveCredentials: (!chrome.networkingPrivate.ManagedBoolean|undefined),
- *   ServerCARefs: (!Array<!chrome.networkingPrivate.ManagedDOMString>|undefined),
+ *   ServerCARefs: (!chrome.networkingPrivate.ManagedDOMStringList|undefined),
  *   ServerCertRef: (!chrome.networkingPrivate.ManagedDOMString|undefined),
  *   ServerPollTimeout: (!chrome.networkingPrivate.ManagedLong|undefined),
  *   Shaper: (!chrome.networkingPrivate.ManagedLong|undefined),
diff --git a/third_party/guava/BUILD.gn b/third_party/guava/BUILD.gn
index 05135807..3a44bbd 100644
--- a/third_party/guava/BUILD.gn
+++ b/third_party/guava/BUILD.gn
@@ -4,6 +4,6 @@
 
 import("//build/config/android/rules.gni")
 
-android_java_prebuilt("guava_java") {
+java_prebuilt("guava_java") {
   jar_path = "lib/guava-18.0.jar"
 }
diff --git a/third_party/hamcrest/BUILD.gn b/third_party/hamcrest/BUILD.gn
index a7922978..80aa97b 100644
--- a/third_party/hamcrest/BUILD.gn
+++ b/third_party/hamcrest/BUILD.gn
@@ -12,14 +12,14 @@
   ]
 }
 
-android_java_prebuilt("hamcrest_core_java") {
+java_prebuilt("hamcrest_core_java") {
   jar_path = "lib/hamcrest-core-1.3.jar"
 }
 
-android_java_prebuilt("hamcrest_integration_java") {
+java_prebuilt("hamcrest_integration_java") {
   jar_path = "lib/hamcrest-integration-1.3.jar"
 }
 
-android_java_prebuilt("hamcrest_library_java") {
+java_prebuilt("hamcrest_library_java") {
   jar_path = "lib/hamcrest-library-1.3.jar"
 }
diff --git a/third_party/libvpx/README.chromium b/third_party/libvpx/README.chromium
index 8e96d6d1..8a79be8 100644
--- a/third_party/libvpx/README.chromium
+++ b/third_party/libvpx/README.chromium
@@ -5,9 +5,9 @@
 License File: source/libvpx/LICENSE
 Security Critical: yes
 
-Date: Thursday July 21 2016
+Date: Monday July 25 2016
 Branch: master
-Commit: 4b073bc39a39283577c485ed1e56c92cf0eaaa89
+Commit: 82070ae9393b1e79559d81fcf1aa89c2e4aa58ee
 
 Description:
 Contains the sources used to compile libvpx binaries used by Google Chrome and
diff --git a/third_party/libvpx/source/config/vpx_version.h b/third_party/libvpx/source/config/vpx_version.h
index a8e4573..f3ab22be 100644
--- a/third_party/libvpx/source/config/vpx_version.h
+++ b/third_party/libvpx/source/config/vpx_version.h
@@ -1,7 +1,7 @@
 #define VERSION_MAJOR  1
 #define VERSION_MINOR  6
 #define VERSION_PATCH  0
-#define VERSION_EXTRA  "173-g4b073bc"
+#define VERSION_EXTRA  "201-g82070ae"
 #define VERSION_PACKED ((VERSION_MAJOR<<16)|(VERSION_MINOR<<8)|(VERSION_PATCH))
-#define VERSION_STRING_NOSP "v1.6.0-173-g4b073bc"
-#define VERSION_STRING      " v1.6.0-173-g4b073bc"
+#define VERSION_STRING_NOSP "v1.6.0-201-g82070ae"
+#define VERSION_STRING      " v1.6.0-201-g82070ae"
diff --git a/third_party/polymer/v1_0/chromium.patch b/third_party/polymer/v1_0/chromium.patch
index abea353..9de17ad 100644
--- a/third_party/polymer/v1_0/chromium.patch
+++ b/third_party/polymer/v1_0/chromium.patch
@@ -24,26 +24,15 @@
  removeCustomPropAssignment: function (cssText) {
  return cssText.replace(this._rx.customProp, '').replace(this._rx.mixinProp, '');
 diff --git a/components-chromium/polymer/polymer-extracted.js b/components-chromium/polymer/polymer-extracted.js
-index 8446e8a..3f679f6 100644
+index 627bdd3..7ba497c 100644
 --- a/components-chromium/polymer/polymer-extracted.js
 +++ b/components-chromium/polymer/polymer-extracted.js
-@@ -2475,7 +2475,7 @@ AT_START: '@'
- }();
- Polymer.StyleUtil = function () {
+@@ -2521,7 +2521,7 @@ AT_START: '@'
+ var settings = Polymer.Settings;
  return {
+ NATIVE_VARIABLES: Polymer.Settings.useNativeCSSProperties,
 -MODULE_STYLES_SELECTOR: 'style, link[rel=import][type~=css], template',
 +MODULE_STYLES_SELECTOR: 'style:not([no-process]), link[rel=import][type~=css], template',
  INCLUDE_ATTR: 'include',
- toCssText: function (rules, callback, preserveProperties) {
+ toCssText: function (rules, callback) {
  if (typeof rules === 'string') {
---- a/components-chromium/iron-collapse/iron-collapse-extracted.js
-+++ b/components-chromium/iron-collapse/iron-collapse-extracted.js
-@@ -96,7 +96,7 @@ Polymer({
- 
-     /**
-      * Updates the size of the element.
--     * @param {!String} size The new value for `maxWidth`/`maxHeight` as css property value, usually `auto` or `0px`.
-+     * @param {string} size The new value for `maxWidth`/`maxHeight` as css property value, usually `auto` or `0px`.
-      * @param {boolean=} animated if `true` updates the size with an animation, otherwise without.
-      */     
-     updateSize: function(size, animated) {
diff --git a/third_party/polymer/v1_0/components-chromium/app-layout/bower.json b/third_party/polymer/v1_0/components-chromium/app-layout/bower.json
index 304219f..160bea6 100644
--- a/third_party/polymer/v1_0/components-chromium/app-layout/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/app-layout/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "app-layout",
-  "version": "0.9.1",
+  "version": "0.9.2",
   "description": "A set of layout elements for your app",
   "authors": [
     "The Polymer Authors"
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/bower.json b/third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/bower.json
index ed8d8d00..c049390d 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-a11y-announcer",
-  "version": "1.0.4",
+  "version": "1.0.5",
   "description": "A singleton element that simplifies announcing text to screen readers.",
   "keywords": [
     "web-components",
@@ -18,7 +18,7 @@
   "main": "iron-a11y-announcer.html",
   "license": "http://polymer.github.io/LICENSE.txt",
   "dependencies": {
-    "polymer": "polymer/polymer#^1.0.0"
+    "polymer": "polymer/polymer#^1.1.0"
   },
   "devDependencies": {
     "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
@@ -27,7 +27,7 @@
     "paper-styles": "polymerelements/paper-styles#^1.0.0",
     "test-fixture": "polymerelements/test-fixture#^1.0.0",
     "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-    "web-component-tester": "polymer/web-component-tester#^3.4.0"
+    "web-component-tester": "^4.0.0"
   },
   "ignore": []
 }
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/iron-a11y-announcer.html b/third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/iron-a11y-announcer.html
index 8e2c18a..9a5b795c 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/iron-a11y-announcer.html
+++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/iron-a11y-announcer.html
@@ -43,15 +43,14 @@
 -->
 
 </head><body><dom-module id="iron-a11y-announcer">
-  <style>
-    :host {
-      display: inline-block;
-      position: fixed;
-      clip: rect(0px,0px,0px,0px);
-    }
-  </style>
-
   <template>
+    <style>
+      :host {
+        display: inline-block;
+        position: fixed;
+        clip: rect(0px,0px,0px,0px);
+      }
+    </style>
     <div aria-live$="[[mode]]">[[_text]]</div>
   </template>
 
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/bower.json b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/bower.json
index 17aa01368..28428683 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-a11y-keys-behavior",
-  "version": "1.1.5",
+  "version": "1.1.7",
   "description": "A behavior that enables keybindings for greater a11y.",
   "keywords": [
     "web-components",
@@ -19,7 +19,7 @@
   "main": "iron-a11y-keys-behavior.html",
   "license": "http://polymer.github.io/LICENSE.txt",
   "dependencies": {
-    "polymer": "Polymer/polymer#^1.0.0"
+    "polymer": "Polymer/polymer#^1.1.0"
   },
   "devDependencies": {
     "paper-styles": "PolymerElements/paper-styles#^1.0.2",
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/iron-a11y-keys-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/iron-a11y-keys-behavior-extracted.js
index 7b53434..ba496012 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/iron-a11y-keys-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/iron-a11y-keys-behavior-extracted.js
@@ -223,12 +223,31 @@
      * and uses an expressive syntax to filter key presses.
      *
      * Use the `keyBindings` prototype property to express what combination of keys
-     * will trigger the event to fire.
+     * will trigger the callback. A key binding has the format
+     * `"KEY+MODIFIER:EVENT": "callback"` (`"KEY": "callback"` or
+     * `"KEY:EVENT": "callback"` are valid as well). Some examples:
      *
-     * Use the `key-event-target` attribute to set up event handlers on a specific
+     *      keyBindings: {
+     *        'space': '_onKeydown', // same as 'space:keydown'
+     *        'shift+tab': '_onKeydown',
+     *        'enter:keypress': '_onKeypress',
+     *        'esc:keyup': '_onKeyup'
+     *      }
+     *
+     * The callback will receive with an event containing the following information in `event.detail`:
+     *
+     *      _onKeydown: function(event) {
+     *        console.log(event.detail.combo); // KEY+MODIFIER, e.g. "shift+tab"
+     *        console.log(event.detail.key); // KEY only, e.g. "tab"
+     *        console.log(event.detail.event); // EVENT, e.g. "keydown"
+     *        console.log(event.detail.keyboardEvent); // the original KeyboardEvent
+     *      }
+     *
+     * Use the `keyEventTarget` attribute to set up event handlers on a specific
      * node.
-     * The `keys-pressed` event will fire when one of the key combinations set with the
-     * `keys` property is pressed.
+     *
+     * See the [demo source code](https://github.com/PolymerElements/iron-a11y-keys-behavior/blob/master/demo/x-key-aware.html)
+     * for an example.
      *
      * @demo demo/index.html
      * @polymerBehavior
@@ -277,6 +296,12 @@
         '_resetKeyEventListeners(keyEventTarget, _boundKeyHandlers)'
       ],
 
+
+      /**
+       * To be used to express what combination of keys  will trigger the relative
+       * callback. e.g. `keyBindings: { 'esc': '_onEscPressed'}`
+       * @type {Object}
+       */
       keyBindings: {},
 
       registered: function() {
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/bower.json b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/bower.json
index 5cdaf486..79c18c5 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-a11y-keys",
-  "version": "1.0.5",
+  "version": "1.0.6",
   "description": "A basic element implementation of iron-a11y-keys-behavior, matching the legacy core-a11y-keys.",
   "keywords": [
     "web-components",
@@ -19,7 +19,7 @@
   "main": "iron-a11y-keys.html",
   "license": "http://polymer.github.io/LICENSE.txt",
   "dependencies": {
-    "polymer": "polymer/polymer#^1.0.0",
+    "polymer": "polymer/polymer#^1.1.0",
     "iron-a11y-keys-behavior": "polymerelements/iron-a11y-keys-behavior#^1.0.0"
   },
   "devDependencies": {
diff --git a/third_party/polymer/v1_0/components-chromium/iron-autogrow-textarea/bower.json b/third_party/polymer/v1_0/components-chromium/iron-autogrow-textarea/bower.json
index 67be4a66..2622be998 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-autogrow-textarea/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-autogrow-textarea/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-autogrow-textarea",
-  "version": "1.0.12",
+  "version": "1.0.13",
   "description": "A textarea element that automatically grows with input",
   "authors": [
     "The Polymer Authors"
@@ -25,7 +25,7 @@
     "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
     "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0",
     "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0",
-    "polymer": "Polymer/polymer#^1.0.0"
+    "polymer": "Polymer/polymer#^1.1.0"
   },
   "devDependencies": {
     "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
diff --git a/third_party/polymer/v1_0/components-chromium/iron-autogrow-textarea/iron-autogrow-textarea.html b/third_party/polymer/v1_0/components-chromium/iron-autogrow-textarea/iron-autogrow-textarea.html
index ede93016..aac2019e 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-autogrow-textarea/iron-autogrow-textarea.html
+++ b/third_party/polymer/v1_0/components-chromium/iron-autogrow-textarea/iron-autogrow-textarea.html
@@ -36,66 +36,66 @@
 -->
 
 </head><body><dom-module id="iron-autogrow-textarea">
-
-  <style>
-    :host {
-      display: inline-block;
-      position: relative;
-      width: 400px;
-      border: 1px solid;
-      padding: 2px;
-      -moz-appearance: textarea;
-      -webkit-appearance: textarea;
-      overflow: hidden;
-    }
-
-    .mirror-text {
-      visibility: hidden;
-      word-wrap: break-word;
-    }
-
-    .fit {
-      @apply(--layout-fit);
-    }
-
-    textarea {
-      position: relative;
-      outline: none;
-      border: none;
-      resize: none;
-      background: inherit;
-      color: inherit;
-      /* see comments in template */
-      width: 100%;
-      height: 100%;
-      font-size: inherit;
-      font-family: inherit;
-      line-height: inherit;
-      text-align: inherit;
-      @apply(--iron-autogrow-textarea);
-    }
-
-    ::content textarea:invalid {
-      box-shadow: none;
-    }
-
-    textarea::-webkit-input-placeholder {
-      @apply(--iron-autogrow-textarea-placeholder);
-    }
-
-    textarea:-moz-placeholder {
-      @apply(--iron-autogrow-textarea-placeholder);
-    }
-
-    textarea::-moz-placeholder {
-      @apply(--iron-autogrow-textarea-placeholder);
-    }
-
-    textarea:-ms-input-placeholder {
-      @apply(--iron-autogrow-textarea-placeholder);
-    }
-  </style>
   <template>
+    <style>
+      :host {
+        display: inline-block;
+        position: relative;
+        width: 400px;
+        border: 1px solid;
+        padding: 2px;
+        -moz-appearance: textarea;
+        -webkit-appearance: textarea;
+        overflow: hidden;
+      }
+
+      .mirror-text {
+        visibility: hidden;
+        word-wrap: break-word;
+      }
+
+      .fit {
+        @apply(--layout-fit);
+      }
+
+      textarea {
+        position: relative;
+        outline: none;
+        border: none;
+        resize: none;
+        background: inherit;
+        color: inherit;
+        /* see comments in template */
+        width: 100%;
+        height: 100%;
+        font-size: inherit;
+        font-family: inherit;
+        line-height: inherit;
+        text-align: inherit;
+        @apply(--iron-autogrow-textarea);
+      }
+
+      ::content textarea:invalid {
+        box-shadow: none;
+      }
+
+      textarea::-webkit-input-placeholder {
+        @apply(--iron-autogrow-textarea-placeholder);
+      }
+
+      textarea:-moz-placeholder {
+        @apply(--iron-autogrow-textarea-placeholder);
+      }
+
+      textarea::-moz-placeholder {
+        @apply(--iron-autogrow-textarea-placeholder);
+      }
+
+      textarea:-ms-input-placeholder {
+        @apply(--iron-autogrow-textarea-placeholder);
+      }
+    </style>
+
     <!-- the mirror sizes the input/textarea so it grows with typing -->
     <!-- use &#160; instead &nbsp; of to allow this element to be used in XHTML -->
     <div id="mirror" class="mirror-text" aria-hidden="true">&nbsp;</div>
diff --git a/third_party/polymer/v1_0/components-chromium/iron-behaviors/bower.json b/third_party/polymer/v1_0/components-chromium/iron-behaviors/bower.json
index 89d24c0..fd877fe 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-behaviors/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-behaviors/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-behaviors",
-  "version": "1.0.16",
+  "version": "1.0.17",
   "description": "Provides a set of behaviors for the iron elements",
   "private": true,
   "authors": [
diff --git a/third_party/polymer/v1_0/components-chromium/iron-checked-element-behavior/bower.json b/third_party/polymer/v1_0/components-chromium/iron-checked-element-behavior/bower.json
index 65154c8..f645217c 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-checked-element-behavior/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-checked-element-behavior/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-checked-element-behavior",
-  "version": "1.0.4",
+  "version": "1.0.5",
   "description": "Implements an element that has a checked attribute and can be added to a form",
   "authors": "The Polymer Authors",
   "keywords": [
@@ -19,7 +19,7 @@
   "homepage": "https://github.com/PolymerElements/iron-checked-element-behavior",
   "ignore": [],
   "dependencies": {
-    "polymer": "Polymer/polymer#^1.0.0",
+    "polymer": "Polymer/polymer#^1.1.0",
     "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0",
     "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0"
   },
@@ -28,7 +28,7 @@
     "paper-button": "PolymerElements/paper-button#^1.0.0",
     "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
     "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "*",
+    "web-component-tester": "^4.0.0",
     "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
   }
 }
diff --git a/third_party/polymer/v1_0/components-chromium/iron-checked-element-behavior/iron-checked-element-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/iron-checked-element-behavior/iron-checked-element-behavior-extracted.js
index c3c942a..f6acdd0 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-checked-element-behavior/iron-checked-element-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/iron-checked-element-behavior/iron-checked-element-behavior-extracted.js
@@ -59,10 +59,10 @@
     /**
      * Returns false if the element is required and not checked, and true otherwise.
      * @param {*=} _value Ignored.
-     * @return {boolean} true if `required` is false, or if `required` and `checked` are both true.
+     * @return {boolean} true if `required` is false or if `checked` is true.
      */
     _getValidity: function(_value) {
-      return this.disabled || !this.required || (this.required && this.checked);
+      return this.disabled || !this.required || this.checked;
     },
 
     /**
diff --git a/third_party/polymer/v1_0/components-chromium/iron-collapse/bower.json b/third_party/polymer/v1_0/components-chromium/iron-collapse/bower.json
index c11034a..ca565cd 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-collapse/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-collapse/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-collapse",
-  "version": "1.1.0",
+  "version": "1.2.0",
   "description": "Provides a collapsable container",
   "authors": [
     "The Polymer Authors"
diff --git a/third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse-extracted.js b/third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse-extracted.js
index daf1bc73..af836e3b 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse-extracted.js
@@ -49,7 +49,7 @@
     /**
      * `maxWidth` or `maxHeight`.
      * @private
-     */    
+     */
     get _dimensionMax() {
       return this.horizontal ? 'maxWidth' : 'maxHeight';
     },
@@ -98,7 +98,7 @@
      * Updates the size of the element.
      * @param {string} size The new value for `maxWidth`/`maxHeight` as css property value, usually `auto` or `0px`.
      * @param {boolean=} animated if `true` updates the size with an animation, otherwise without.
-     */     
+     */
     updateSize: function(size, animated) {
       // No change!
       var curSize = this.style[this._dimensionMax];
@@ -119,9 +119,9 @@
         }
         // Go to startSize without animation.
         this.style[this._dimensionMax] = startSize;
-        // Force layout to ensure transition will go. Set offsetHeight to itself
+        // Force layout to ensure transition will go. Set scrollTop to itself
         // so that compilers won't remove it.
-        this.offsetHeight = this.offsetHeight;
+        this.scrollTop = this.scrollTop;
         // Enable animation.
         this._updateTransition(true);
       }
diff --git a/third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse.html b/third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse.html
index 0b2e4ac..bd71fdba 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse.html
+++ b/third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse.html
@@ -42,6 +42,14 @@
       </div>
     </iron-collapse>
 
+### Styling
+
+The following custom properties and mixins are available for styling:
+
+Custom property | Description | Default
+----------------|-------------|----------
+`--iron-collapse-transition-duration` | Animation transition duration | `300ms`
+
 @group Iron Elements
 @hero hero.svg
 @demo demo/index.html
@@ -55,7 +63,7 @@
     <style>
       :host {
         display: block;
-        transition-duration: 300ms;
+        transition-duration: var(--iron-collapse-transition-duration, 300ms);
         overflow: visible;
       }
 
diff --git a/third_party/polymer/v1_0/components-chromium/iron-dropdown/bower.json b/third_party/polymer/v1_0/components-chromium/iron-dropdown/bower.json
index 0cc2bc5..4f76ba06 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-dropdown/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-dropdown/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-dropdown",
-  "version": "1.4.1",
+  "version": "1.5.0",
   "description": "An unstyled element that works similarly to a native browser select",
   "authors": [
     "The Polymer Authors"
@@ -19,7 +19,7 @@
   "license": "http://polymer.github.io/LICENSE.txt",
   "homepage": "https://github.com/PolymerElements/iron-dropdown",
   "dependencies": {
-    "polymer": "polymer/polymer#^1.0.0",
+    "polymer": "polymer/polymer#^1.1.0",
     "iron-behaviors": "polymerelements/iron-behaviors#^1.0.0",
     "iron-overlay-behavior": "polymerelements/iron-overlay-behavior#^1.0.0",
     "iron-resizable-behavior": "polymerelements/iron-resizable-behavior#^1.0.0",
diff --git a/third_party/polymer/v1_0/components-chromium/iron-dropdown/iron-dropdown-extracted.js b/third_party/polymer/v1_0/components-chromium/iron-dropdown/iron-dropdown-extracted.js
index 9e55e8e..228869e7 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-dropdown/iron-dropdown-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/iron-dropdown/iron-dropdown-extracted.js
@@ -76,6 +76,18 @@
           allowOutsideScroll: {
             type: Boolean,
             value: false
+          },
+
+          /**
+           * Callback for scroll events.
+           * @type {Function}
+           * @private
+           */
+          _boundOnCaptureScroll: {
+            type: Function,
+            value: function() {
+              return this._onCaptureScroll.bind(this);
+            }
           }
         },
 
@@ -102,6 +114,14 @@
           return this.focusTarget || this.containedElement;
         },
 
+        ready: function() {
+          // Memoized scrolling position, used to block scrolling outside.
+          this._scrollTop = 0;
+          this._scrollLeft = 0;
+          // Used to perform a non-blocking refit on scroll.
+          this._refitOnScrollRAF = null;
+        },
+
         detached: function() {
           this.cancelAnimation();
           Polymer.IronDropdownScrollManager.removeScrollLock(this);
@@ -118,9 +138,12 @@
             this.cancelAnimation();
             this.sizingTarget = this.containedElement || this.sizingTarget;
             this._updateAnimationConfig();
-            if (this.opened && !this.allowOutsideScroll) {
-              Polymer.IronDropdownScrollManager.pushScrollLock(this);
+            this._saveScrollPosition();
+            if (this.opened) {
+              document.addEventListener('scroll', this._boundOnCaptureScroll);
+              !this.allowOutsideScroll && Polymer.IronDropdownScrollManager.pushScrollLock(this);
             } else {
+              document.removeEventListener('scroll', this._boundOnCaptureScroll);
               Polymer.IronDropdownScrollManager.removeScrollLock(this);
             }
             Polymer.IronOverlayBehaviorImpl._openedChanged.apply(this, arguments);
@@ -143,6 +166,7 @@
          * Overridden from `IronOverlayBehavior`.
          */
         _renderClosed: function() {
+
           if (!this.noAnimations && this.animationConfig.close) {
             this.$.contentWrapper.classList.add('animating');
             this.playAnimation('close');
@@ -166,6 +190,47 @@
           }
         },
 
+        _onCaptureScroll: function() {
+          if (!this.allowOutsideScroll) {
+            this._restoreScrollPosition();
+          } else {
+            this._refitOnScrollRAF && window.cancelAnimationFrame(this._refitOnScrollRAF);
+            this._refitOnScrollRAF = window.requestAnimationFrame(this.refit.bind(this));
+          }
+        },
+
+        /**
+         * Memoizes the scroll position of the outside scrolling element.
+         * @private
+         */
+        _saveScrollPosition: function() {
+          if (document.scrollingElement) {
+            this._scrollTop = document.scrollingElement.scrollTop;
+            this._scrollLeft = document.scrollingElement.scrollLeft;
+          } else {
+            // Since we don't know if is the body or html, get max.
+            this._scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
+            this._scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
+          }
+        },
+
+        /**
+         * Resets the scroll position of the outside scrolling element.
+         * @private
+         */
+        _restoreScrollPosition: function() {
+          if (document.scrollingElement) {
+            document.scrollingElement.scrollTop = this._scrollTop;
+            document.scrollingElement.scrollLeft = this._scrollLeft;
+          } else {
+            // Since we don't know if is the body or html, set both.
+            document.documentElement.scrollTop = this._scrollTop;
+            document.documentElement.scrollLeft = this._scrollLeft;
+            document.body.scrollTop = this._scrollTop;
+            document.body.scrollLeft = this._scrollLeft;
+          }
+        },
+
         /**
          * Constructs the final animation config from different properties used
          * to configure specific parts of the opening and closing animations.
diff --git a/third_party/polymer/v1_0/components-chromium/iron-dropdown/iron-dropdown-scroll-manager-extracted.js b/third_party/polymer/v1_0/components-chromium/iron-dropdown/iron-dropdown-scroll-manager-extracted.js
index 9e501cf..0417115 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-dropdown/iron-dropdown-scroll-manager-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/iron-dropdown/iron-dropdown-scroll-manager-extracted.js
@@ -1,5 +1,13 @@
 (function() {
     'use strict';
+    // Used to calculate the scroll direction during touch events.
+    var LAST_TOUCH_POSITION = {
+      pageX: 0,
+      pageY: 0
+    };
+    // Used to avoid computing event.path and filter scrollable nodes (better perf).
+    var ROOT_TARGET = null;
+    var SCROLLABLE_NODES = [];
 
     /**
      * The IronDropdownScrollManager is intended to provide a central source
@@ -17,9 +25,8 @@
         return this._lockingElements[this._lockingElements.length - 1];
       },
 
-
       /**
-       * Returns true if the provided element is "scroll locked," which is to
+       * Returns true if the provided element is "scroll locked", which is to
        * say that it cannot be scrolled via pointer or keyboard interactions.
        *
        * @param {HTMLElement} element An HTML element instance which may or may
@@ -112,8 +119,6 @@
 
       _unlockedElementCache: null,
 
-      _originalBodyStyles: {},
-
       _isScrollingKeypress: function(event) {
         return Polymer.IronA11yKeysBehavior.keyboardEventMatchesKeys(
           event, 'pageup pagedown home end up left down right');
@@ -161,58 +166,186 @@
       },
 
       _scrollInteractionHandler: function(event) {
-        var scrolledElement =
-            /** @type {HTMLElement} */(Polymer.dom(event).rootTarget);
-        if (Polymer
-              .IronDropdownScrollManager
-              .elementIsScrollLocked(scrolledElement)) {
-          if (event.type === 'keydown' &&
-              !Polymer.IronDropdownScrollManager._isScrollingKeypress(event)) {
-            return;
-          }
-
+        // Avoid canceling an event with cancelable=false, e.g. scrolling is in
+        // progress and cannot be interrupted.
+        if (event.cancelable && this._shouldPreventScrolling(event)) {
           event.preventDefault();
         }
+        // If event has targetTouches (touch event), update last touch position.
+        if (event.targetTouches) {
+          var touch = event.targetTouches[0];
+          LAST_TOUCH_POSITION.pageX = touch.pageX;
+          LAST_TOUCH_POSITION.pageY = touch.pageY;
+        }
       },
 
       _lockScrollInteractions: function() {
-        // Memoize body inline styles:
-        this._originalBodyStyles.overflow = document.body.style.overflow;
-        this._originalBodyStyles.overflowX = document.body.style.overflowX;
-        this._originalBodyStyles.overflowY = document.body.style.overflowY;
-
-        // Disable overflow scrolling on body:
-        // TODO(cdata): It is technically not sufficient to hide overflow on
-        // body alone. A better solution might be to traverse all ancestors of
-        // the current scroll locking element and hide overflow on them. This
-        // becomes expensive, though, as it would have to be redone every time
-        // a new scroll locking element is added.
-        document.body.style.overflow = 'hidden';
-        document.body.style.overflowX = 'hidden';
-        document.body.style.overflowY = 'hidden';
-
+        this._boundScrollHandler = this._boundScrollHandler ||
+          this._scrollInteractionHandler.bind(this);
         // Modern `wheel` event for mouse wheel scrolling:
-        document.addEventListener('wheel', this._scrollInteractionHandler, true);
+        document.addEventListener('wheel', this._boundScrollHandler, true);
         // Older, non-standard `mousewheel` event for some FF:
-        document.addEventListener('mousewheel', this._scrollInteractionHandler, true);
+        document.addEventListener('mousewheel', this._boundScrollHandler, true);
         // IE:
-        document.addEventListener('DOMMouseScroll', this._scrollInteractionHandler, true);
+        document.addEventListener('DOMMouseScroll', this._boundScrollHandler, true);
+        // Save the SCROLLABLE_NODES on touchstart, to be used on touchmove.
+        document.addEventListener('touchstart', this._boundScrollHandler, true);
         // Mobile devices can scroll on touch move:
-        document.addEventListener('touchmove', this._scrollInteractionHandler, true);
+        document.addEventListener('touchmove', this._boundScrollHandler, true);
         // Capture keydown to prevent scrolling keys (pageup, pagedown etc.)
-        document.addEventListener('keydown', this._scrollInteractionHandler, true);
+        document.addEventListener('keydown', this._boundScrollHandler, true);
       },
 
       _unlockScrollInteractions: function() {
-        document.body.style.overflow = this._originalBodyStyles.overflow;
-        document.body.style.overflowX = this._originalBodyStyles.overflowX;
-        document.body.style.overflowY = this._originalBodyStyles.overflowY;
+        document.removeEventListener('wheel', this._boundScrollHandler, true);
+        document.removeEventListener('mousewheel', this._boundScrollHandler, true);
+        document.removeEventListener('DOMMouseScroll', this._boundScrollHandler, true);
+        document.removeEventListener('touchstart', this._boundScrollHandler, true);
+        document.removeEventListener('touchmove', this._boundScrollHandler, true);
+        document.removeEventListener('keydown', this._boundScrollHandler, true);
+      },
 
-        document.removeEventListener('wheel', this._scrollInteractionHandler, true);
-        document.removeEventListener('mousewheel', this._scrollInteractionHandler, true);
-        document.removeEventListener('DOMMouseScroll', this._scrollInteractionHandler, true);
-        document.removeEventListener('touchmove', this._scrollInteractionHandler, true);
-        document.removeEventListener('keydown', this._scrollInteractionHandler, true);
+      /**
+       * Returns true if the event causes scroll outside the current locking
+       * element, e.g. pointer/keyboard interactions, or scroll "leaking"
+       * outside the locking element when it is already at its scroll boundaries.
+       * @param {!Event} event
+       * @return {boolean}
+       * @private
+       */
+      _shouldPreventScrolling: function(event) {
+        // Avoid expensive checks if the event is not one of the observed keys.
+        if (event.type === 'keydown') {
+          // Prevent event if it is one of the scrolling keys.
+          return this._isScrollingKeypress(event);
+        }
+
+        // Update if root target changed. For touch events, ensure we don't
+        // update during touchmove.
+        var target = Polymer.dom(event).rootTarget;
+        if (event.type !== 'touchmove' && ROOT_TARGET !== target) {
+          ROOT_TARGET = target;
+          SCROLLABLE_NODES = this._getScrollableNodes(Polymer.dom(event).path);
+        }
+
+        // Prevent event if no scrollable nodes.
+        if (!SCROLLABLE_NODES.length) {
+          return true;
+        }
+        // Don't prevent touchstart event inside the locking element when it has
+        // scrollable nodes.
+        if (event.type === 'touchstart') {
+          return false;
+        }
+        // Get deltaX/Y.
+        var info = this._getScrollInfo(event);
+        // Prevent if there is no child that can scroll.
+        return !this._getScrollingNode(SCROLLABLE_NODES, info.deltaX, info.deltaY);
+      },
+
+      /**
+       * Returns an array of scrollable nodes up to the current locking element,
+       * which is included too if scrollable.
+       * @param {!Array<Node>} nodes
+       * @return {Array<Node>} scrollables
+       * @private
+       */
+      _getScrollableNodes: function(nodes) {
+        var scrollables = [];
+        var lockingIndex = nodes.indexOf(this.currentLockingElement);
+        // Loop from root target to locking element (included).
+        for (var i = 0; i <= lockingIndex; i++) {
+          var node = nodes[i];
+          // Skip document fragments.
+          if (node.nodeType === 11) {
+            continue;
+          }
+          // Check inline style before checking computed style.
+          var style = node.style;
+          if (style.overflow !== 'scroll' && style.overflow !== 'auto') {
+            style = window.getComputedStyle(node);
+          }
+          if (style.overflow === 'scroll' || style.overflow === 'auto') {
+            scrollables.push(node);
+          }
+        }
+        return scrollables;
+      },
+
+      /**
+       * Returns the node that is scrolling. If there is no scrolling,
+       * returns undefined.
+       * @param {!Array<Node>} nodes
+       * @param {number} deltaX Scroll delta on the x-axis
+       * @param {number} deltaY Scroll delta on the y-axis
+       * @return {Node|undefined}
+       * @private
+       */
+      _getScrollingNode: function(nodes, deltaX, deltaY) {
+        // No scroll.
+        if (!deltaX && !deltaY) {
+          return;
+        }
+        // Check only one axis according to where there is more scroll.
+        // Prefer vertical to horizontal.
+        var verticalScroll = Math.abs(deltaY) >= Math.abs(deltaX);
+        for (var i = 0; i < nodes.length; i++) {
+          var node = nodes[i];
+          var canScroll = false;
+          if (verticalScroll) {
+            // delta < 0 is scroll up, delta > 0 is scroll down.
+            canScroll = deltaY < 0 ? node.scrollTop > 0 :
+              node.scrollTop < node.scrollHeight - node.clientHeight;
+          } else {
+            // delta < 0 is scroll left, delta > 0 is scroll right.
+            canScroll = deltaX < 0 ? node.scrollLeft > 0 :
+              node.scrollLeft < node.scrollWidth - node.clientWidth;
+          }
+          if (canScroll) {
+            return node;
+          }
+        }
+      },
+
+      /**
+       * Returns scroll `deltaX` and `deltaY`.
+       * @param {!Event} event The scroll event
+       * @return {{
+       *  deltaX: number The x-axis scroll delta (positive: scroll right,
+       *                 negative: scroll left, 0: no scroll),
+       *  deltaY: number The y-axis scroll delta (positive: scroll down,
+       *                 negative: scroll up, 0: no scroll)
+       * }} info
+       * @private
+       */
+      _getScrollInfo: function(event) {
+        var info = {
+          deltaX: event.deltaX,
+          deltaY: event.deltaY
+        };
+        // Already available.
+        if ('deltaX' in event) {
+          // do nothing, values are already good.
+        }
+        // Safari has scroll info in `wheelDeltaX/Y`.
+        else if ('wheelDeltaX' in event) {
+          info.deltaX = -event.wheelDeltaX;
+          info.deltaY = -event.wheelDeltaY;
+        }
+        // Firefox has scroll info in `detail` and `axis`.
+        else if ('axis' in event) {
+          info.deltaX = event.axis === 1 ? event.detail : 0;
+          info.deltaY = event.axis === 2 ? event.detail : 0;
+        }
+        // On mobile devices, calculate scroll direction.
+        else if (event.targetTouches) {
+          var touch = event.targetTouches[0];
+          // Touch moves from right to left => scrolling goes right.
+          info.deltaX = LAST_TOUCH_POSITION.pageX - touch.pageX;
+          // Touch moves from down to up => scrolling goes down.
+          info.deltaY = LAST_TOUCH_POSITION.pageY - touch.pageY;
+        }
+        return info;
       }
     };
   })();
\ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/iron-dropdown/iron-dropdown.html b/third_party/polymer/v1_0/components-chromium/iron-dropdown/iron-dropdown.html
index 6c036a1..cf03204 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-dropdown/iron-dropdown.html
+++ b/third_party/polymer/v1_0/components-chromium/iron-dropdown/iron-dropdown.html
@@ -42,20 +42,21 @@
 -->
 
 </head><body><dom-module id="iron-dropdown">
-  <style>
-    :host {
-      position: fixed;
-    }
-
-    #contentWrapper ::content > * {
-      overflow: auto;
-    }
-
-    #contentWrapper.animating ::content > * {
-      overflow: hidden;
-    }
-  </style>
   <template>
+    <style>
+      :host {
+        position: fixed;
+      }
+
+      #contentWrapper ::content > * {
+        overflow: auto;
+      }
+
+      #contentWrapper.animating ::content > * {
+        overflow: hidden;
+      }
+    </style>
+
     <div id="contentWrapper">
       <content id="content" select=".dropdown-content"></content>
     </div>
diff --git a/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/bower.json b/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/bower.json
index 715b5737..7e4ce51 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-fit-behavior",
-  "version": "1.2.3",
+  "version": "1.2.5",
   "license": "http://polymer.github.io/LICENSE.txt",
   "description": "Fits an element inside another element",
   "private": true,
@@ -18,7 +18,7 @@
     "url": "git://github.com/PolymerElements/iron-fit-behavior.git"
   },
   "dependencies": {
-    "polymer": "Polymer/polymer#^1.0.0"
+    "polymer": "Polymer/polymer#^1.1.0"
   },
   "devDependencies": {
     "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
diff --git a/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/iron-fit-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/iron-fit-behavior-extracted.js
index 693534a0..33c668121 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/iron-fit-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/iron-fit-behavior/iron-fit-behavior-extracted.js
@@ -222,7 +222,6 @@
      * Positions and fits the element into the `fitInto` element.
      */
     fit: function() {
-      this._discoverInfo();
       this.position();
       this.constrain();
       this.center();
@@ -324,6 +323,7 @@
         // needs to be centered, and it is done after constrain.
         return;
       }
+      this._discoverInfo();
 
       this.style.position = 'fixed';
       // Need border-box for margin/padding.
@@ -384,6 +384,8 @@
       if (this.horizontalAlign || this.verticalAlign) {
         return;
       }
+      this._discoverInfo();
+
       var info = this._fitInfo;
       // position at (0px, 0px) if not already positioned, so we can measure the natural size.
       if (!info.positionedBy.vertically) {
@@ -438,6 +440,8 @@
       if (this.horizontalAlign || this.verticalAlign) {
         return;
       }
+      this._discoverInfo();
+
       var positionedBy = this._fitInfo.positionedBy;
       if (positionedBy.vertically && positionedBy.horizontally) {
         // Already positioned.
diff --git a/third_party/polymer/v1_0/components-chromium/iron-icon/bower.json b/third_party/polymer/v1_0/components-chromium/iron-icon/bower.json
index 38e4ba45..b5f35315e 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-icon/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-icon/bower.json
@@ -1,7 +1,7 @@
 {
   "name": "iron-icon",
   "private": true,
-  "version": "1.0.8",
+  "version": "1.0.9",
   "license": "http://polymer.github.io/LICENSE.txt",
   "description": "An element that supports displaying an icon",
   "main": "iron-icon.html",
@@ -21,7 +21,7 @@
   "dependencies": {
     "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0",
     "iron-meta": "polymerelements/iron-meta#^1.0.0",
-    "polymer": "Polymer/polymer#^1.0.0"
+    "polymer": "Polymer/polymer#^1.1.0"
   },
   "devDependencies": {
     "test-fixture": "polymerelements/test-fixture#^1.0.0",
diff --git a/third_party/polymer/v1_0/components-chromium/iron-icon/iron-icon.html b/third_party/polymer/v1_0/components-chromium/iron-icon/iron-icon.html
index e395853c..c7a29ff 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-icon/iron-icon.html
+++ b/third_party/polymer/v1_0/components-chromium/iron-icon/iron-icon.html
@@ -80,24 +80,22 @@
 -->
 
 </head><body><dom-module id="iron-icon">
-
-  <style>
-    :host {
-      @apply(--layout-inline);
-      @apply(--layout-center-center);
-      position: relative;
-
-      vertical-align: middle;
-
-      fill: var(--iron-icon-fill-color, currentcolor);
-      stroke: var(--iron-icon-stroke-color, none);
-
-      width: var(--iron-icon-width, 24px);
-      height: var(--iron-icon-height, 24px);
-    }
-  </style>
-
   <template>
+    <style>
+      :host {
+        @apply(--layout-inline);
+        @apply(--layout-center-center);
+        position: relative;
+
+        vertical-align: middle;
+
+        fill: var(--iron-icon-fill-color, currentcolor);
+        stroke: var(--iron-icon-stroke-color, none);
+
+        width: var(--iron-icon-width, 24px);
+        height: var(--iron-icon-height, 24px);
+      }
+    </style>
   </template>
 
   </dom-module>
diff --git a/third_party/polymer/v1_0/components-chromium/iron-list/bower.json b/third_party/polymer/v1_0/components-chromium/iron-list/bower.json
index 3b01348..75cdd0bc 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-list/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-list/bower.json
@@ -7,7 +7,7 @@
     "list",
     "virtual-list"
   ],
-  "version": "1.3.4",
+  "version": "1.3.5",
   "homepage": "https://github.com/PolymerElements/iron-list",
   "authors": [
     "The Polymer Authors"
diff --git a/third_party/polymer/v1_0/components-chromium/iron-location/bower.json b/third_party/polymer/v1_0/components-chromium/iron-location/bower.json
index fb43be2..dd66b14 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-location/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-location/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-location",
-  "version": "0.8.4",
+  "version": "0.8.5",
   "description": "Bidirectional data binding into the page's URL.",
   "private": true,
   "authors": [
diff --git a/third_party/polymer/v1_0/components-chromium/iron-location/iron-location-extracted.js b/third_party/polymer/v1_0/components-chromium/iron-location/iron-location-extracted.js
index 15e6cef8..7bf2c00 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-location/iron-location-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/iron-location/iron-location-extracted.js
@@ -179,9 +179,14 @@
       if (!href) {
         return;
       }
+      event.preventDefault();
+      // If the navigation is to the current page we shouldn't add a history
+      // entry or fire a change event.
+      if (href === window.location.href) {
+        return;
+      }
       window.history.pushState({}, '', href);
       this.fire('location-changed', {}, {node: window});
-      event.preventDefault();
     },
     /**
      * Returns the absolute URL of the link (if any) that this click event
@@ -264,11 +269,6 @@
       // Need to use a full URL in case the containing page has a base URI.
       var fullNormalizedHref = new URL(
           normalizedHref, window.location.href).href;
-      // If the navigation is to the current page we shouldn't add a history
-      // entry.
-      if (fullNormalizedHref === window.location.href) {
-        return null;
-      }
       return fullNormalizedHref;
     },
     _makeRegExp: function(urlSpaceRegex) {
diff --git a/third_party/polymer/v1_0/components-chromium/iron-menu-behavior/bower.json b/third_party/polymer/v1_0/components-chromium/iron-menu-behavior/bower.json
index 921662c..1417703 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-menu-behavior/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-menu-behavior/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-menu-behavior",
-  "version": "1.1.7",
+  "version": "1.1.9",
   "description": "Provides accessible menu behavior",
   "authors": "The Polymer Authors",
   "keywords": [
diff --git a/third_party/polymer/v1_0/components-chromium/iron-menu-behavior/iron-menu-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/iron-menu-behavior/iron-menu-behavior-extracted.js
index b340403..5a2f420 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-menu-behavior/iron-menu-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/iron-menu-behavior/iron-menu-behavior-extracted.js
@@ -123,11 +123,12 @@
     /**
      * Focuses the previous item (relative to the currently focused item) in the
      * menu, disabled items will be skipped.
+     * Loop until length + 1 to handle case of single item in menu.
      */
     _focusPrevious: function() {
       var length = this.items.length;
       var curFocusIndex = Number(this.indexOf(this.focusedItem));
-      for (var i = 1; i < length; i++) {
+      for (var i = 1; i < length + 1; i++) {
         var item = this.items[(curFocusIndex - i + length) % length];
         if (!item.hasAttribute('disabled')) {
           this._setFocusedItem(item);
@@ -139,11 +140,12 @@
     /**
      * Focuses the next item (relative to the currently focused item) in the
      * menu, disabled items will be skipped.
+     * Loop until length + 1 to handle case of single item in menu.
      */
     _focusNext: function() {
       var length = this.items.length;
       var curFocusIndex = Number(this.indexOf(this.focusedItem));
-      for (var i = 1; i < length; i++) {
+      for (var i = 1; i < length + 1; i++) {
         var item = this.items[(curFocusIndex + i) % length];
         if (!item.hasAttribute('disabled')) {
           this._setFocusedItem(item);
diff --git a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/bower.json b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/bower.json
index 2715cffd..9e835a60 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-overlay-behavior",
-  "version": "1.8.1",
+  "version": "1.8.5",
   "license": "http://polymer.github.io/LICENSE.txt",
   "description": "Provides a behavior for making an element an overlay",
   "private": true,
diff --git a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js
index 4bd7a4c..881e9b5 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js
@@ -6,9 +6,12 @@
 on top of other content. It includes an optional backdrop, and can be used to implement a variety
 of UI controls including dialogs and drop downs. Multiple overlays may be displayed at once.
 
+See the [demo source code](https://github.com/PolymerElements/iron-overlay-behavior/blob/master/demo/simple-overlay.html)
+for an example.
+
 ### Closing and canceling
 
-A dialog may be hidden by closing or canceling. The difference between close and cancel is user
+An overlay may be hidden by closing or canceling. The difference between close and cancel is user
 intent. Closing generally implies that the user acknowledged the content on the overlay. By default,
 it will cancel whenever the user taps outside it or presses the escape key. This behavior is
 configurable with the `no-cancel-on-esc-key` and the `no-cancel-on-outside-click` properties.
@@ -27,6 +30,10 @@
 appended to `<body>` and is of type `<iron-overlay-backdrop>`. See its doc page for styling
 options.
 
+In addition, `with-backdrop` will wrap the focus within the content in the light DOM.
+Override the [`_focusableNodes` getter](#Polymer.IronOverlayBehavior:property-_focusableNodes)
+to achieve a different behavior.
+
 ### Limitations
 
 The element is styled to appear on top of other content by setting its `z-index` property. You
@@ -62,7 +69,8 @@
       },
 
       /**
-       * Set to true to display a backdrop behind the overlay.
+       * Set to true to display a backdrop behind the overlay. It traps the focus
+       * within the light DOM of the overlay.
        */
       withBackdrop: {
         observer: '_withBackdropChanged',
@@ -327,6 +335,8 @@
           this._prepareRenderOpened();
           this._renderOpened();
         } else {
+          // Move the focus before actually closing.
+          this._applyFocus();
           this._renderClosed();
         }
       }.bind(this));
@@ -363,6 +373,9 @@
       this.refit();
       this._finishPositioning();
 
+      // Move the focus to the child node with [autofocus].
+      this._applyFocus();
+
       // Safari will apply the focus to the autofocus element when displayed for the first time,
       // so we blur it. Later, _applyFocus will set the focus if necessary.
       if (this.noAutoFocus && document.activeElement === this._focusNode) {
@@ -391,8 +404,6 @@
      * @protected
      */
     _finishRenderOpened: function() {
-      // Focus the child node with [autofocus]
-      this._applyFocus();
 
       this.notifyResize();
       this.__isAnimating = false;
@@ -415,8 +426,6 @@
       // Reset z-index only at the end of the animation.
       this.style.zIndex = '';
 
-      this._applyFocus();
-
       this.notifyResize();
       this.__isAnimating = false;
       this.fire('iron-overlay-closed', this.closingReason);
diff --git a/third_party/polymer/v1_0/components-chromium/iron-pages/bower.json b/third_party/polymer/v1_0/components-chromium/iron-pages/bower.json
index 3fa960879..8f12d53 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-pages/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-pages/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-pages",
-  "version": "1.0.7",
+  "version": "1.0.8",
   "license": "http://polymer.github.io/LICENSE.txt",
   "description": "Organizes a set of pages and shows one at a time",
   "main": "iron-pages.html",
diff --git a/third_party/polymer/v1_0/components-chromium/iron-range-behavior/bower.json b/third_party/polymer/v1_0/components-chromium/iron-range-behavior/bower.json
index a58ad63f..c702ac95 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-range-behavior/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-range-behavior/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-range-behavior",
-  "version": "1.0.5",
+  "version": "1.0.6",
   "license": "http://polymer.github.io/LICENSE.txt",
   "description": "Provides a behavior for something with a minimum and maximum value",
   "authors": "The Polymer Authors",
@@ -16,7 +16,7 @@
     "url": "git://github.com/PolymerElements/iron-range-behavior.git"
   },
   "dependencies": {
-    "polymer": "Polymer/polymer#^1.0.0"
+    "polymer": "Polymer/polymer#^1.1.0"
   },
   "devDependencies": {
     "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
diff --git a/third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/bower.json b/third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/bower.json
index 053bfd0..484a7d6b 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-resizable-behavior",
-  "version": "1.0.3",
+  "version": "1.0.4",
   "license": "http://polymer.github.io/LICENSE.txt",
   "description": "Coordinates the flow of resizeable elements",
   "private": true,
@@ -19,7 +19,7 @@
     "url": "git://github.com/PolymerElements/iron-resizable-behavior.git"
   },
   "dependencies": {
-    "polymer": "Polymer/polymer#^1.0.0"
+    "polymer": "Polymer/polymer#^1.1.0"
   },
   "devDependencies": {
     "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
diff --git a/third_party/polymer/v1_0/components-chromium/iron-scroll-target-behavior/bower.json b/third_party/polymer/v1_0/components-chromium/iron-scroll-target-behavior/bower.json
index 3d8ee2b..dea16bf 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-scroll-target-behavior/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-scroll-target-behavior/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-scroll-target-behavior",
-  "version": "1.0.6",
+  "version": "1.0.7",
   "description": "Allows to define a scroller target",
   "private": true,
   "license": "http://polymer.github.io/LICENSE.txt",
@@ -20,7 +20,7 @@
   "homepage": "https://github.com/PolymerElements/iron-scroll-target-behavior",
   "ignore": [],
   "dependencies": {
-    "polymer": "Polymer/polymer#^1.0.0"
+    "polymer": "Polymer/polymer#^1.1.0"
   },
   "devDependencies": {
     "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/bower.json b/third_party/polymer/v1_0/components-chromium/neon-animation/bower.json
index 29499b8..8af634ef 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/bower.json
@@ -1,7 +1,7 @@
 {
   "name": "neon-animation",
   "description": "A system for animating Polymer-based web components",
-  "version": "1.2.3",
+  "version": "1.2.4",
   "authors": [
     "The Polymer Authors"
   ],
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/compiled_resources2.gyp b/third_party/polymer/v1_0/components-chromium/neon-animation/compiled_resources2.gyp
index 07f6dd1..c500df6 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/compiled_resources2.gyp
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/compiled_resources2.gyp
@@ -22,7 +22,6 @@
       'dependencies': [
         '../iron-resizable-behavior/compiled_resources2.gyp:iron-resizable-behavior-extracted',
         '../iron-selector/compiled_resources2.gyp:iron-selectable-extracted',
-        'animations/compiled_resources2.gyp:opaque-animation-extracted',
         'neon-animation-runner-behavior-extracted',
       ],
       'includes': ['../../../../closure_compiler/compile_js2.gypi'],
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animatable.html b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animatable.html
index 7234f6ba..7c95477 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animatable.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animatable.html
@@ -24,16 +24,13 @@
 -->
 
 </head><body><dom-module id="neon-animatable">
-
-  <style>
-
-    :host {
-      display: block;
-    }
-
-  </style>
-
   <template>
+    <style>
+      :host {
+        display: block;
+      }
+    </style>
+    
     <content></content>
   </template>
 
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animated-pages.html b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animated-pages.html
index 9495e23..422bfde4 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animated-pages.html
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animated-pages.html
@@ -10,7 +10,6 @@
 <link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
 <link rel="import" href="../iron-selector/iron-selectable.html">
 <link rel="import" href="neon-animation-runner-behavior.html">
-<link rel="import" href="animations/opaque-animation.html">
 
 <!--
 Material design: [Meaningful transitions](https://www.google.com/design/spec/animation/meaningful-transitions.html)
@@ -25,33 +24,30 @@
 -->
 
 </head><body><dom-module id="neon-animated-pages">
-
-  <style>
-
-    :host {
-      display: block;
-      position: relative;
-    }
-
-    :host > ::content > * {
-      position: absolute;
-      top: 0;
-      left: 0;
-      bottom: 0;
-      right: 0;
-    }
-
-    :host > ::content > :not(.iron-selected):not(.neon-animating) {
-      display: none !important;
-    }
-
-    :host > ::content > .neon-animating {
-      pointer-events: none;
-    }
-
-  </style>
-
   <template>
+    <style>
+      :host {
+        display: block;
+        position: relative;
+      }
+
+      :host > ::content > * {
+        position: absolute;
+        top: 0;
+        left: 0;
+        bottom: 0;
+        right: 0;
+      }
+
+      :host > ::content > :not(.iron-selected):not(.neon-animating) {
+        display: none !important;
+      }
+
+      :host > ::content > .neon-animating {
+        pointer-events: none;
+      }
+    </style>
+    
     <content id="content"></content>
   </template>
 
diff --git a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-runner-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-runner-behavior-extracted.js
index 04905d3..c34d4e2 100644
--- a/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-runner-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-runner-behavior-extracted.js
@@ -5,28 +5,30 @@
    */
   Polymer.NeonAnimationRunnerBehaviorImpl = {
 
-    properties: {
-
-      /** @type {?Object} */
-      _player: {
-        type: Object
-      }
-
-    },
-
-    _configureAnimationEffects: function(allConfigs) {
-      var allAnimations = [];
-      if (allConfigs.length > 0) {
-        for (var config, index = 0; config = allConfigs[index]; index++) {
-          var animation = document.createElement(config.name);
+    _configureAnimations: function(configs) {
+      var results = [];
+      if (configs.length > 0) {
+        for (var config, index = 0; config = configs[index]; index++) {
+          var neonAnimation = document.createElement(config.name);
           // is this element actually a neon animation?
-          if (animation.isNeonAnimation) {
-            var effect = animation.configure(config);
-            if (effect) {
-              allAnimations.push({
-                animation: animation,
+          if (neonAnimation.isNeonAnimation) {
+            var result = null;
+            // configuration or play could fail if polyfills aren't loaded
+            try {
+              result = neonAnimation.configure(config);
+              // Check if we have an Effect rather than an Animation
+              if (typeof result.cancel != 'function') { 
+                result = document.timeline.play(result);
+              }
+            } catch (e) {
+              result = null;
+              console.warn('Couldnt play', '(', config.name, ').', e);
+            }
+            if (result) {
+              results.push({
+                neonAnimation: neonAnimation,
                 config: config,
-                effect: effect
+                animation: result,
               });
             }
           } else {
@@ -34,16 +36,26 @@
           }
         }
       }
-      return allAnimations;
+      return results;
     },
 
-    _runAnimationEffects: function(allEffects) {
-      return document.timeline.play(new GroupEffect(allEffects));
+    _shouldComplete: function(activeEntries) {
+      var finished = true;
+      for (var i = 0; i < activeEntries.length; i++) {
+        if (activeEntries[i].animation.playState != 'finished') {
+          finished = false;
+          break;
+        }
+      }
+      return finished;
     },
 
-    _completeAnimations: function(allAnimations) {
-      for (var animation, index = 0; animation = allAnimations[index]; index++) {
-        animation.animation.complete(animation.config);
+    _complete: function(activeEntries) {
+      for (var i = 0; i < activeEntries.length; i++) {
+        activeEntries[i].neonAnimation.complete(activeEntries[i].config);
+      }
+      for (var i = 0; i < activeEntries.length; i++) {
+        activeEntries[i].animation.cancel();
       }
     },
 
@@ -53,43 +65,44 @@
      * @param {!Object=} cookie
      */
     playAnimation: function(type, cookie) {
-      var allConfigs = this.getAnimationConfig(type);
-      if (!allConfigs) {
+      var configs = this.getAnimationConfig(type);
+      if (!configs) {
         return;
       }
-      try {
-        var allAnimations = this._configureAnimationEffects(allConfigs);
-        var allEffects = allAnimations.map(function(animation) {
-          return animation.effect;
-        });
-
-        if (allEffects.length > 0) {
-          this._player = this._runAnimationEffects(allEffects);
-          this._player.onfinish = function() {
-            this._completeAnimations(allAnimations);
-
-            if (this._player) {
-              this._player.cancel();
-              this._player = null;
-            }
-
-            this.fire('neon-animation-finish', cookie, {bubbles: false});
-          }.bind(this);
-          return;
-        }
-      } catch (e) {
-        console.warn('Couldnt play', '(', type, allConfigs, ').', e);
+      this._active = this._active || {};
+      if (this._active[type]) {
+        this._complete(this._active[type]);
+        delete this._active[type];
       }
-      this.fire('neon-animation-finish', cookie, {bubbles: false});
+
+      var activeEntries = this._configureAnimations(configs);
+
+      if (activeEntries.length == 0) {
+        this.fire('neon-animation-finish', cookie, {bubbles: false});
+        return;
+      }
+
+      this._active[type] = activeEntries;
+
+      for (var i = 0; i < activeEntries.length; i++) {
+        activeEntries[i].animation.onfinish = function() {
+          if (this._shouldComplete(activeEntries)) {
+            this._complete(activeEntries);
+            delete this._active[type];
+            this.fire('neon-animation-finish', cookie, {bubbles: false});
+          }
+        }.bind(this);
+      }
     },
 
     /**
-     * Cancels the currently running animation.
+     * Cancels the currently running animations.
      */
     cancelAnimation: function() {
-      if (this._player) {
-        this._player.cancel();
+      for (var k in this._animations) {
+        this._animations[k].cancel();
       }
+      this._animations = {};
     }
   };
 
diff --git a/third_party/polymer/v1_0/components-chromium/paper-behaviors/bower.json b/third_party/polymer/v1_0/components-chromium/paper-behaviors/bower.json
index 5933ab1..8439368 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-behaviors/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/paper-behaviors/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "paper-behaviors",
-  "version": "1.0.11",
+  "version": "1.0.12",
   "description": "Common behaviors across the paper elements",
   "authors": [
     "The Polymer Authors"
diff --git a/third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-button-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-button-behavior-extracted.js
index 405268c..c02810ab 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-button-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-button-behavior-extracted.js
@@ -1,8 +1,6 @@
 /** @polymerBehavior Polymer.PaperButtonBehavior */
   Polymer.PaperButtonBehaviorImpl = {
-
     properties: {
-
       /**
        * The z-depth of this element, from 0-5. Setting to 0 will remove the
        * shadow, and each increasing number greater than 0 will be "deeper"
@@ -17,7 +15,6 @@
         reflectToAttribute: true,
         readOnly: true
       }
-
     },
 
     observers: [
@@ -73,7 +70,6 @@
         this._ripple.uiUpAction();
       }
     }
-
   };
 
   /** @polymerBehavior */
diff --git a/third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-checked-element-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-checked-element-behavior-extracted.js
index 35e1a67..4b1c405 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-checked-element-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-checked-element-behavior-extracted.js
@@ -5,7 +5,6 @@
    * @polymerBehavior Polymer.PaperCheckedElementBehavior
    */
   Polymer.PaperCheckedElementBehaviorImpl = {
-
     /**
      * Synchronizes the element's checked state with its ripple effect.
      */
@@ -32,7 +31,6 @@
         this.checked = this.active;
       }
     }
-
   };
 
   /** @polymerBehavior Polymer.PaperCheckedElementBehavior */
diff --git a/third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-inky-focus-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-inky-focus-behavior-extracted.js
index 86f699552..257e7c8f 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-inky-focus-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-inky-focus-behavior-extracted.js
@@ -4,7 +4,6 @@
    * @polymerBehavior Polymer.PaperInkyFocusBehavior
    */
   Polymer.PaperInkyFocusBehaviorImpl = {
-
     observers: [
       '_focusedChanged(receivedFocusFromKeyboard)'
     ],
@@ -25,7 +24,6 @@
       ripple.classList.add('circle');
       return ripple;
     }
-
   };
 
   /** @polymerBehavior Polymer.PaperInkyFocusBehavior */
diff --git a/third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-ripple-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-ripple-behavior-extracted.js
index ca6f6e0..31891f3 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-ripple-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-ripple-behavior-extracted.js
@@ -8,7 +8,6 @@
    * @polymerBehavior Polymer.PaperRippleBehavior
    */
   Polymer.PaperRippleBehavior = {
-
     properties: {
       /**
        * If true, the element will not produce a ripple effect when interacted
@@ -109,5 +108,4 @@
         this._ripple.noink = noink;
       }
     }
-
   };
\ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/paper-checkbox/bower.json b/third_party/polymer/v1_0/components-chromium/paper-checkbox/bower.json
index f86bd00..3762b1c 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-checkbox/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/paper-checkbox/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "paper-checkbox",
-  "version": "1.2.1",
+  "version": "1.3.0",
   "description": "A material design checkbox",
   "authors": [
     "The Polymer Authors"
diff --git a/third_party/polymer/v1_0/components-chromium/paper-checkbox/paper-checkbox.html b/third_party/polymer/v1_0/components-chromium/paper-checkbox/paper-checkbox.html
index 7d752ee..a14c57c 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-checkbox/paper-checkbox.html
+++ b/third_party/polymer/v1_0/components-chromium/paper-checkbox/paper-checkbox.html
@@ -40,6 +40,8 @@
 `--paper-checkbox-label-color` | Label color | `--primary-text-color`
 `--paper-checkbox-label-checked-color` | Label color when the input is checked | `--paper-checkbox-label-color`
 `--paper-checkbox-label-spacing` | Spacing between the label and the checkbox | `8px`
+`--paper-checkbox-label` | Mixin applied to the label | `{}`
+`--paper-checkbox-label-checked` | Mixin applied to the label when the input is checked | `{}`
 `--paper-checkbox-error-color` | Checkbox color when invalid | `--error-color`
 `--paper-checkbox-size` | Size of the checkbox | `18px`
 `--paper-checkbox-margin` | Margin around the checkbox container | `initial`
@@ -64,6 +66,10 @@
         -webkit-tap-highlight-color: transparent;
       }
 
+      :host([hidden]) {
+        display: none !important;
+      }
+
       :host(:focus) {
         outline: none;
       }
@@ -176,10 +182,12 @@
         white-space: normal;
         line-height: normal;
         color: var(--paper-checkbox-label-color, --primary-text-color);
+        @apply(--paper-checkbox-label);
       }
 
       :host([checked]) #checkboxLabel {
         color: var(--paper-checkbox-label-checked-color, --paper-checkbox-label-color);
+        @apply(--paper-checkbox-label-checked);
       }
 
       :host-context([dir="rtl"]) #checkboxLabel {
diff --git a/third_party/polymer/v1_0/components-chromium/paper-dialog-behavior/bower.json b/third_party/polymer/v1_0/components-chromium/paper-dialog-behavior/bower.json
index 4f4e58ff..cbe17d3 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-dialog-behavior/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/paper-dialog-behavior/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "paper-dialog-behavior",
-  "version": "1.2.6",
+  "version": "1.2.7",
   "description": "Implements a behavior used for material design dialogs",
   "authors": "The Polymer Authors",
   "keywords": [
diff --git a/third_party/polymer/v1_0/components-chromium/paper-dialog-behavior/paper-dialog-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/paper-dialog-behavior/paper-dialog-behavior-extracted.js
index 64aff8b..0dd39ee 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-dialog-behavior/paper-dialog-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/paper-dialog-behavior/paper-dialog-behavior-extracted.js
@@ -26,7 +26,7 @@
 This element has `role="dialog"` by default. Depending on the context, it may be more appropriate
 to override this attribute with `role="alertdialog"`.
 
-If `modal` is set, the element will set `aria-modal` and prevent the focus from exiting the element.
+If `modal` is set, the element will prevent the focus from exiting the element.
 It will also ensure that focus remains in the dialog.
 
 @hero hero.svg
@@ -69,12 +69,6 @@
     },
 
     _modalChanged: function(modal, readied) {
-      if (modal) {
-        this.setAttribute('aria-modal', 'true');
-      } else {
-        this.setAttribute('aria-modal', 'false');
-      }
-
       // modal implies noCancelOnOutsideClick, noCancelOnEscKey and withBackdrop.
       // We need to wait for the element to be ready before we can read the
       // properties values.
diff --git a/third_party/polymer/v1_0/components-chromium/paper-dialog/bower.json b/third_party/polymer/v1_0/components-chromium/paper-dialog/bower.json
index ab3be84..e7882a55 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-dialog/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/paper-dialog/bower.json
@@ -1,7 +1,7 @@
 {
   "name": "paper-dialog",
   "description": "A Material Design dialog",
-  "version": "1.0.4",
+  "version": "1.1.0",
   "authors": "The Polymer Authors",
   "keywords": [
     "web-components",
@@ -21,11 +21,13 @@
   "dependencies": {
     "neon-animation": "PolymerElements/neon-animation#^1.0.0",
     "paper-dialog-behavior": "PolymerElements/paper-dialog-behavior#^1.0.0",
+    "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#^1.7.0",
     "paper-styles": "PolymerElements/paper-styles#^1.0.0",
     "polymer": "Polymer/polymer#^1.1.0"
   },
   "devDependencies": {
     "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
     "paper-button": "PolymerElements/paper-button#^1.0.0",
     "paper-dialog-scrollable": "PolymerElements/paper-dialog-scrollable#^1.0.0",
     "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#^1.0.0",
diff --git a/third_party/polymer/v1_0/components-chromium/paper-dialog/paper-dialog-extracted.js b/third_party/polymer/v1_0/components-chromium/paper-dialog/paper-dialog-extracted.js
index 1b3570a..570cf42 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-dialog/paper-dialog-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/paper-dialog/paper-dialog-extracted.js
@@ -15,17 +15,11 @@
 
     _renderOpened: function() {
       this.cancelAnimation();
-      if (this.withBackdrop) {
-        this.backdropElement.open();
-      }
       this.playAnimation('entry');
     },
 
     _renderClosed: function() {
       this.cancelAnimation();
-      if (this.withBackdrop) {
-        this.backdropElement.close();
-      }
       this.playAnimation('exit');
     },
 
diff --git a/third_party/polymer/v1_0/components-chromium/paper-dialog/paper-dialog.html b/third_party/polymer/v1_0/components-chromium/paper-dialog/paper-dialog.html
index 86ed386..8c40551 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-dialog/paper-dialog.html
+++ b/third_party/polymer/v1_0/components-chromium/paper-dialog/paper-dialog.html
@@ -16,10 +16,11 @@
 `<paper-dialog>` is a dialog with Material Design styling and optional animations when it is
 opened or closed. It provides styles for a header, content area, and an action area for buttons.
 You can use the `<paper-dialog-scrollable>` element (in its own repository) if you need a scrolling
-content area. See `Polymer.PaperDialogBehavior` for specifics.
+content area. To autofocus a specific child element after opening the dialog, give it the `autofocus`
+attribute. See `Polymer.PaperDialogBehavior` and `Polymer.IronOverlayBehavior` for specifics.
 
 For example, the following code implements a dialog with a header, scrolling content area and
-buttons.
+buttons. Focus will be given to the `dialog-confirm` button when the dialog is opened.
 
     <paper-dialog>
       <h2>Header</h2>
@@ -28,7 +29,7 @@
       </paper-dialog-scrollable>
       <div class="buttons">
         <paper-button dialog-dismiss>Cancel</paper-button>
-        <paper-button dialog-confirm>Accept</paper-button>
+        <paper-button dialog-confirm autofocus>Accept</paper-button>
       </div>
     </paper-dialog>
 
diff --git a/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/bower.json b/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/bower.json
index 6a945cb..64e9588 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "paper-dropdown-menu",
-  "version": "1.2.2",
+  "version": "1.3.2",
   "description": "An element that works similarly to a native browser select",
   "authors": [
     "The Polymer Authors"
@@ -29,7 +29,7 @@
     "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0",
     "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
     "paper-input": "PolymerElements/paper-input#^1.0.9",
-    "paper-menu-button": "PolymerElements/paper-menu-button#^1.0.0",
+    "paper-menu-button": "PolymerElements/paper-menu-button#^1.3.0",
     "paper-ripple": "PolymerElements/paper-ripple#^1.0.0",
     "paper-styles": "PolymerElements/paper-styles#^1.0.0"
   },
diff --git a/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/paper-dropdown-menu-extracted.js b/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/paper-dropdown-menu-extracted.js
index 4965059..1f107e2 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/paper-dropdown-menu-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/paper-dropdown-menu-extracted.js
@@ -79,6 +79,17 @@
           },
 
           /**
+           * By default, the dropdown will constrain scrolling on the page
+           * to itself when opened.
+           * Set to true in order to prevent scroll from being constrained
+           * to the dropdown when it opens.
+           */
+          allowOutsideScroll: {
+            type: Boolean,
+            value: false
+          },
+
+          /**
            * Set to true to disable the floating label. Bind this to the
            * `<paper-input-container>`'s `noLabelFloat` property.
            */
@@ -216,7 +227,7 @@
           if (!selectedItem) {
             value = '';
           } else {
-            value = selectedItem.label || selectedItem.textContent.trim();
+            value = selectedItem.label || selectedItem.getAttribute('label') || selectedItem.textContent.trim();
           }
 
           this._setValue(value);
diff --git a/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/paper-dropdown-menu-light-extracted.js b/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/paper-dropdown-menu-light-extracted.js
index c07b4255..ca4595b 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/paper-dropdown-menu-light-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/paper-dropdown-menu-light-extracted.js
@@ -74,6 +74,17 @@
           },
 
           /**
+           * By default, the dropdown will constrain scrolling on the page
+           * to itself when opened.
+           * Set to true in order to prevent scroll from being constrained
+           * to the dropdown when it opens.
+           */
+          allowOutsideScroll: {
+            type: Boolean,
+            value: false
+          },
+          
+          /**
            * Set to true to disable the floating label. Bind this to the
            * `<paper-input-container>`'s `noLabelFloat` property.
            */
diff --git a/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/paper-dropdown-menu-light.html b/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/paper-dropdown-menu-light.html
index 4c28aef..4fdeff2 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/paper-dropdown-menu-light.html
+++ b/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/paper-dropdown-menu-light.html
@@ -266,8 +266,8 @@
     </style>
 
     <!-- this div fulfills an a11y requirement for combobox, do not remove -->
-    <div role="button"></div>
-    <paper-menu-button id="menuButton" vertical-align="[[verticalAlign]]" horizontal-align="[[horizontalAlign]]" vertical-offset="[[_computeMenuVerticalOffset(noLabelFloat)]]" disabled="[[disabled]]" no-animations="[[noAnimations]]" on-iron-select="_onIronSelect" on-iron-deselect="_onIronDeselect" opened="{{opened}}">
+    <span role="button"></span>
+    <paper-menu-button id="menuButton" vertical-align="[[verticalAlign]]" horizontal-align="[[horizontalAlign]]" vertical-offset="[[_computeMenuVerticalOffset(noLabelFloat)]]" disabled="[[disabled]]" no-animations="[[noAnimations]]" on-iron-select="_onIronSelect" on-iron-deselect="_onIronDeselect" opened="{{opened}}" close-on-activate="" allow-outside-scroll="[[allowOutsideScroll]]">
       <div class="dropdown-trigger">
         <label hidden$="[[!label]]" class$="[[_computeLabelClass(noLabelFloat,alwaysFloatLabel,hasContent)]]">[[label]]</label>
         <div id="input" tabindex="-1">&nbsp;</div>
diff --git a/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/paper-dropdown-menu.html b/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/paper-dropdown-menu.html
index e9cd0b4..091dc42 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/paper-dropdown-menu.html
+++ b/third_party/polymer/v1_0/components-chromium/paper-dropdown-menu/paper-dropdown-menu.html
@@ -83,8 +83,8 @@
     <style include="paper-dropdown-menu-shared-styles"></style>
 
     <!-- this div fulfills an a11y requirement for combobox, do not remove -->
-    <div role="button"></div>
-    <paper-menu-button id="menuButton" vertical-align="[[verticalAlign]]" horizontal-align="[[horizontalAlign]]" vertical-offset="[[_computeMenuVerticalOffset(noLabelFloat)]]" disabled="[[disabled]]" no-animations="[[noAnimations]]" on-iron-select="_onIronSelect" on-iron-deselect="_onIronDeselect" opened="{{opened}}">
+    <span role="button"></span>
+    <paper-menu-button id="menuButton" vertical-align="[[verticalAlign]]" horizontal-align="[[horizontalAlign]]" vertical-offset="[[_computeMenuVerticalOffset(noLabelFloat)]]" disabled="[[disabled]]" no-animations="[[noAnimations]]" on-iron-select="_onIronSelect" on-iron-deselect="_onIronDeselect" opened="{{opened}}" close-on-activate="" allow-outside-scroll="[[allowOutsideScroll]]">
       <div class="dropdown-trigger">
         <paper-ripple></paper-ripple>
         <!-- paper-input has type="text" for a11y, do not remove -->
diff --git a/third_party/polymer/v1_0/components-chromium/paper-input/bower.json b/third_party/polymer/v1_0/components-chromium/paper-input/bower.json
index f9de644..d3d3c5e 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-input/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/paper-input/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "paper-input",
-  "version": "1.1.13",
+  "version": "1.1.15",
   "description": "Material design text fields",
   "authors": [
     "The Polymer Authors"
diff --git a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-behavior-extracted.js
index cbdb805..8ae94d9 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-behavior-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-behavior-extracted.js
@@ -196,7 +196,8 @@
        * element, bind this to the `<input is="iron-input">`'s `autofocus` property.
        */
       autofocus: {
-        type: Boolean
+        type: Boolean,
+        observer: '_autofocusChanged'
       },
 
       /**
@@ -513,6 +514,33 @@
           cancelable: event.cancelable
         });
       }
+    },
+
+    _autofocusChanged: function() {
+      // Firefox doesn't respect the autofocus attribute if it's applied after
+      // the page is loaded (Chrome/WebKit do respect it), preventing an
+      // autofocus attribute specified in markup from taking effect when the
+      // element is upgraded. As a workaround, if the autofocus property is set,
+      // and the focus hasn't already been moved elsewhere, we take focus.
+      if (this.autofocus && this._focusableElement) {
+
+        // In IE 11, the default document.activeElement can be the page's
+        // outermost html element, but there are also cases (under the
+        // polyfill?) in which the activeElement is not a real HTMLElement, but
+        // just a plain object. We identify the latter case as having no valid
+        // activeElement.
+        var activeElement = document.activeElement;
+        var isActiveElementValid = activeElement instanceof HTMLElement;
+
+        // Has some other element has already taken the focus?
+        var isSomeElementActive = isActiveElementValid &&
+            activeElement !== document.body &&
+            activeElement !== document.documentElement; /* IE 11 */
+        if (!isSomeElementActive) {
+          // No specific element has taken the focus yet, so we can take it.
+          this._focusableElement.focus();
+        }
+      }
     }
   }
 
diff --git a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-container.html b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-container.html
index 79128bc..34afd6d 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-container.html
+++ b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-container.html
@@ -108,7 +108,7 @@
         @apply(--paper-input-container);
       }
 
-      :host[inline] {
+      :host([inline]) {
         display: inline-block;
       }
 
diff --git a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input.html b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input.html
index 12933251..052f32ef 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input.html
+++ b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input.html
@@ -97,14 +97,14 @@
 
       <content select="[prefix]"></content>
 
-      <label hidden$="[[!label]]" aria-hidden="true">[[label]]</label>
+      <label hidden$="[[!label]]" aria-hidden="true" for="input">[[label]]</label>
 
       <input is="iron-input" id="input" aria-labelledby$="[[_ariaLabelledBy]]" aria-describedby$="[[_ariaDescribedBy]]" disabled$="[[disabled]]" title$="[[title]]" bind-value="{{value}}" invalid="{{invalid}}" prevent-invalid-input="[[preventInvalidInput]]" allowed-pattern="[[allowedPattern]]" validator="[[validator]]" type$="[[type]]" pattern$="[[pattern]]" required$="[[required]]" autocomplete$="[[autocomplete]]" autofocus$="[[autofocus]]" inputmode$="[[inputmode]]" minlength$="[[minlength]]" maxlength$="[[maxlength]]" min$="[[min]]" max$="[[max]]" step$="[[step]]" name$="[[name]]" placeholder$="[[placeholder]]" readonly$="[[readonly]]" list$="[[list]]" size$="[[size]]" autocapitalize$="[[autocapitalize]]" autocorrect$="[[autocorrect]]" on-change="_onChange" tabindex$="[[tabindex]]" autosave$="[[autosave]]" results$="[[results]]" accept$="[[accept]]" multiple$="[[multiple]]">
 
       <content select="[suffix]"></content>
 
       <template is="dom-if" if="[[errorMessage]]">
-        <paper-input-error>[[errorMessage]]</paper-input-error>
+        <paper-input-error aria-live="assertive">[[errorMessage]]</paper-input-error>
       </template>
 
       <template is="dom-if" if="[[charCounter]]">
diff --git a/third_party/polymer/v1_0/components-chromium/paper-menu-button/bower.json b/third_party/polymer/v1_0/components-chromium/paper-menu-button/bower.json
index 58a0a5c..225ef08 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-menu-button/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/paper-menu-button/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "paper-menu-button",
-  "version": "1.1.1",
+  "version": "1.5.0",
   "description": "A material design element that composes a trigger and a dropdown menu",
   "authors": [
     "The Polymer Authors"
@@ -25,6 +25,7 @@
     "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0",
     "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
     "iron-dropdown": "PolymerElements/iron-dropdown#^1.0.0",
+    "iron-fit-behavior": "PolymerElements/iron-fit-behavior#^1.2.0",
     "neon-animation": "PolymerElements/neon-animation#^1.0.0",
     "paper-styles": "PolymerElements/paper-styles#^1.0.0"
   },
diff --git a/third_party/polymer/v1_0/components-chromium/paper-menu-button/paper-menu-button-extracted.js b/third_party/polymer/v1_0/components-chromium/paper-menu-button/paper-menu-button-extracted.js
index 67ef7b0..e361823 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-menu-button/paper-menu-button-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/paper-menu-button/paper-menu-button-extracted.js
@@ -1,6 +1,11 @@
 (function() {
       'use strict';
 
+      var config = {
+        ANIMATION_CUBIC_BEZIER: 'cubic-bezier(.3,.95,.5,1)',
+        MAX_ANIMATION_TIME_MS: 400
+      };
+
       var PaperMenuButton = Polymer({
         is: 'paper-menu-button',
 
@@ -53,6 +58,16 @@
           },
 
           /**
+           * If true, the `horizontalAlign` and `verticalAlign` properties will
+           * be considered preferences instead of strict requirements when
+           * positioning the dropdown and may be changed if doing so reduces
+           * the area of the dropdown falling outside of `fitInto`.
+           */
+          dynamicAlign: {
+            type: Boolean
+          },
+
+          /**
            * A pixel value that will be added to the position calculated for the
            * given `horizontalAlign`. Use a negative value to offset to the
            * left, or a positive value to offset to the right.
@@ -75,6 +90,14 @@
           },
 
           /**
+           * If true, the dropdown will be positioned so that it doesn't overlap
+           * the button.
+           */
+          noOverlap: {
+            type: Boolean
+          },
+
+          /**
            * Set to true to disable animations when opening and closing the
            * dropdown.
            */
@@ -93,6 +116,15 @@
           },
 
           /**
+           * Set to true to enable automatically closing the dropdown after an
+           * item has been activated, even if the selection did not change.
+           */
+          closeOnActivate: {
+            type: Boolean,
+            value: false
+          },
+
+          /**
            * An animation config. If provided, this will be used to animate the
            * opening of the dropdown.
            */
@@ -110,14 +142,14 @@
                 timing: {
                   delay: 100,
                   duration: 150,
-                  easing: PaperMenuButton.ANIMATION_CUBIC_BEZIER
+                  easing: config.ANIMATION_CUBIC_BEZIER
                 }
               }, {
                 name: 'paper-menu-grow-height-animation',
                 timing: {
                   delay: 100,
                   duration: 275,
-                  easing: PaperMenuButton.ANIMATION_CUBIC_BEZIER
+                  easing: config.ANIMATION_CUBIC_BEZIER
                 }
               }];
             }
@@ -140,7 +172,7 @@
                 timing: {
                   delay: 100,
                   duration: 50,
-                  easing: PaperMenuButton.ANIMATION_CUBIC_BEZIER
+                  easing: config.ANIMATION_CUBIC_BEZIER
                 }
               }, {
                 name: 'paper-menu-shrink-height-animation',
@@ -151,6 +183,25 @@
               }];
             }
           },
+          
+          /**
+           * By default, the dropdown will constrain scrolling on the page
+           * to itself when opened.
+           * Set to true in order to prevent scroll from being constrained
+           * to the dropdown when it opens.
+           */
+          allowOutsideScroll: {
+            type: Boolean,
+            value: false
+          },
+
+          /**
+           * Whether focus should be restored to the button when the menu closes.
+           */
+          restoreFocusOnClose: {
+            type: Boolean,
+            value: true
+          },
 
           /**
            * This is the element intended to be bound as the focus target
@@ -167,6 +218,7 @@
         },
 
         listeners: {
+          'iron-activate': '_onIronActivate',
           'iron-select': '_onIronSelect'
         },
 
@@ -221,6 +273,18 @@
         },
 
         /**
+         * Closes the dropdown when an `iron-activate` event is received if
+         * `closeOnActivate` is true.
+         *
+         * @param {CustomEvent} event A CustomEvent of type 'iron-activate'.
+         */
+        _onIronActivate: function(event) {
+          if (this.closeOnActivate) {
+            this.close();
+          }
+        },
+
+        /**
          * When the dropdown opens, the `paper-menu-button` fires `paper-open`.
          * When the dropdown closes, the `paper-menu-button` fires `paper-close`.
          *
@@ -266,8 +330,9 @@
         }
       });
 
-      PaperMenuButton.ANIMATION_CUBIC_BEZIER = 'cubic-bezier(.3,.95,.5,1)';
-      PaperMenuButton.MAX_ANIMATION_TIME_MS = 400;
+      Object.keys(config).forEach(function (key) {
+        PaperMenuButton[key] = config[key];
+      });
 
       Polymer.PaperMenuButton = PaperMenuButton;
     })();
\ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/paper-menu-button/paper-menu-button.html b/third_party/polymer/v1_0/components-chromium/paper-menu-button/paper-menu-button.html
index 0ff635ee..3310f607 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-menu-button/paper-menu-button.html
+++ b/third_party/polymer/v1_0/components-chromium/paper-menu-button/paper-menu-button.html
@@ -108,7 +108,7 @@
       <content select=".dropdown-trigger"></content>
     </div>
 
-    <iron-dropdown id="dropdown" opened="{{opened}}" horizontal-align="[[horizontalAlign]]" vertical-align="[[verticalAlign]]" horizontal-offset="[[horizontalOffset]]" vertical-offset="[[verticalOffset]]" open-animation-config="[[openAnimationConfig]]" close-animation-config="[[closeAnimationConfig]]" no-animations="[[noAnimations]]" focus-target="[[_dropdownContent]]" restore-focus-on-close="" on-iron-overlay-canceled="__onIronOverlayCanceled">
+    <iron-dropdown id="dropdown" opened="{{opened}}" horizontal-align="[[horizontalAlign]]" vertical-align="[[verticalAlign]]" dynamic-align="[[dynamicAlign]]" horizontal-offset="[[horizontalOffset]]" vertical-offset="[[verticalOffset]]" no-overlap="[[noOverlap]]" open-animation-config="[[openAnimationConfig]]" close-animation-config="[[closeAnimationConfig]]" no-animations="[[noAnimations]]" focus-target="[[_dropdownContent]]" allow-outside-scroll="[[allowOutsideScroll]]" restore-focus-on-close="[[restoreFocusOnClose]]" on-iron-overlay-canceled="__onIronOverlayCanceled">
       <div class="dropdown-content">
         <content id="content" select=".dropdown-content"></content>
       </div>
diff --git a/third_party/polymer/v1_0/components-chromium/paper-ripple/bower.json b/third_party/polymer/v1_0/components-chromium/paper-ripple/bower.json
index b72e943..1fce5584 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-ripple/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/paper-ripple/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "paper-ripple",
-  "version": "1.0.7",
+  "version": "1.0.8",
   "license": "http://polymer.github.io/LICENSE.txt",
   "description": "Adds a material design ripple to any container",
   "private": true,
@@ -18,7 +18,7 @@
   },
   "main": "paper-ripple.html",
   "dependencies": {
-    "iron-a11y-keys-behavior": "polymerelements/iron-a11y-keys-behavior#^1.1.4",
+    "iron-a11y-keys-behavior": "polymerelements/iron-a11y-keys-behavior#^1.1.5",
     "polymer": "Polymer/polymer#^1.1.0"
   },
   "devDependencies": {
diff --git a/third_party/polymer/v1_0/components-chromium/paper-toolbar/bower.json b/third_party/polymer/v1_0/components-chromium/paper-toolbar/bower.json
index 997d1cb..1fc3b4e 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-toolbar/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/paper-toolbar/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "paper-toolbar",
-  "version": "1.1.5",
+  "version": "1.1.6",
   "license": "http://polymer.github.io/LICENSE.txt",
   "description": "A material design toolbar that is easily customizable",
   "private": true,
diff --git a/third_party/polymer/v1_0/components-chromium/paper-toolbar/paper-toolbar.html b/third_party/polymer/v1_0/components-chromium/paper-toolbar/paper-toolbar.html
index b0eaf6b2..25292ca 100644
--- a/third_party/polymer/v1_0/components-chromium/paper-toolbar/paper-toolbar.html
+++ b/third_party/polymer/v1_0/components-chromium/paper-toolbar/paper-toolbar.html
@@ -218,29 +218,28 @@
         pointer-events: none;
 
         @apply(--layout-flex);
-        @apply(--paper-toolbar-title);
       }
 
-      /**
-       * TODO: Refactor these selectors
-       * Work in progress.
-       */
-      .toolbar-tools > ::content paper-icon-button[icon=menu] {
-        margin-right: 24px;
-      }
-
-      .toolbar-tools > ::content > .title,
-      .toolbar-tools > ::content[select=".middle"] > .title,
-      .toolbar-tools > ::content[select=".bottom"] > .title {
+      .toolbar-tools > ::content > .title {
         margin-left: 56px;
       }
 
-      .toolbar-tools > ::content > paper-icon-button + .title,
-      .toolbar-tools > ::content[select=".middle"] paper-icon-button + .title,
-      .toolbar-tools > ::content[select=".bottom"] paper-icon-button + .title {
+      .toolbar-tools > ::content > paper-icon-button + .title {
         margin-left: 0;
       }
 
+      /**
+       * The --paper-toolbar-title mixin is applied here instead of above to
+       * fix the issue with margin-left being ignored due to css ordering.
+       */
+      .toolbar-tools > ::content .title {
+        @apply(--paper-toolbar-title);
+      }
+
+      .toolbar-tools > ::content paper-icon-button[icon=menu] {
+        margin-right: 24px;
+      }
+
       .toolbar-tools > ::content > .fit {
         position: absolute;
         top: auto;
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/bower.json b/third_party/polymer/v1_0/components-chromium/polymer/bower.json
index c34ec481..52783a4 100644
--- a/third_party/polymer/v1_0/components-chromium/polymer/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/polymer/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "polymer",
-  "version": "1.5.0",
+  "version": "1.6.0",
   "main": [
     "polymer.html",
     "polymer-mini.html",
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js b/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js
index 1a0b2eb..90dd9dd 100644
--- a/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js
@@ -837,9 +837,9 @@
 cancelable: true
 });
 if (ev.defaultPrevented) {
-var se = detail.sourceEvent;
-if (se && se.preventDefault) {
-se.preventDefault();
+var preventer = detail.preventer || detail.sourceEvent;
+if (preventer && preventer.preventDefault) {
+preventer.preventDefault();
 }
 }
 },
@@ -905,16 +905,17 @@
 this.fire('down', t, e);
 },
 touchstart: function (e) {
-this.fire('down', Gestures.findOriginalTarget(e), e.changedTouches[0]);
+this.fire('down', Gestures.findOriginalTarget(e), e.changedTouches[0], e);
 },
 touchend: function (e) {
-this.fire('up', Gestures.findOriginalTarget(e), e.changedTouches[0]);
+this.fire('up', Gestures.findOriginalTarget(e), e.changedTouches[0], e);
 },
-fire: function (type, target, event) {
+fire: function (type, target, event, preventer) {
 Gestures.fire(target, type, {
 x: event.clientX,
 y: event.clientY,
 sourceEvent: event,
+preventer: preventer,
 prevent: function (e) {
 return Gestures.prevent(e);
 }
@@ -1043,10 +1044,10 @@
 x: ct.clientX,
 y: ct.clientY
 });
-this.fire(t, ct);
+this.fire(t, ct, e);
 }
 },
-fire: function (target, touch) {
+fire: function (target, touch, preventer) {
 var secondlast = this.info.moves[this.info.moves.length - 2];
 var lastmove = this.info.moves[this.info.moves.length - 1];
 var dx = lastmove.x - this.info.x;
@@ -1065,6 +1066,7 @@
 ddx: ddx,
 ddy: ddy,
 sourceEvent: touch,
+preventer: preventer,
 hover: function () {
 return Gestures.deepTargetFind(touch.clientX, touch.clientY);
 }
@@ -1115,12 +1117,12 @@
 }
 },
 touchstart: function (e) {
-this.save(e.changedTouches[0]);
+this.save(e.changedTouches[0], e);
 },
 touchend: function (e) {
-this.forward(e.changedTouches[0]);
+this.forward(e.changedTouches[0], e);
 },
-forward: function (e) {
+forward: function (e, preventer) {
 var dx = Math.abs(e.clientX - this.info.x);
 var dy = Math.abs(e.clientY - this.info.y);
 var t = Gestures.findOriginalTarget(e);
@@ -1129,7 +1131,8 @@
 Gestures.fire(t, 'tap', {
 x: e.clientX,
 y: e.clientY,
-sourceEvent: e
+sourceEvent: e,
+preventer: preventer
 });
 }
 }
@@ -1165,7 +1168,9 @@
 }
 });
 Polymer.Gestures = Gestures;
-}());Polymer.Base._addFeature({
+}());(function () {
+'use strict';
+Polymer.Base._addFeature({
 $$: function (slctr) {
 return Polymer.dom(this.root).querySelector(slctr);
 },
@@ -1305,26 +1310,45 @@
 this.transform('translate3d(' + x + ',' + y + ',' + z + ')', node);
 },
 importHref: function (href, onload, onerror, optAsync) {
-var l = document.createElement('link');
-l.rel = 'import';
-l.href = href;
-optAsync = Boolean(optAsync);
-if (optAsync) {
-l.setAttribute('async', '');
-}
+var link = document.createElement('link');
+link.rel = 'import';
+link.href = href;
+var list = Polymer.Base.importHref.imported = Polymer.Base.importHref.imported || {};
+var cached = list[link.href];
+var imprt = cached || link;
 var self = this;
 if (onload) {
-l.onload = function (e) {
+var loadListener = function (e) {
+e.target.__firedLoad = true;
+e.target.removeEventListener('load', loadListener);
 return onload.call(self, e);
 };
+imprt.addEventListener('load', loadListener);
 }
 if (onerror) {
-l.onerror = function (e) {
+var errorListener = function (e) {
+e.target.__firedError = true;
+e.target.removeEventListener('error', errorListener);
 return onerror.call(self, e);
 };
+imprt.addEventListener('error', errorListener);
 }
-document.head.appendChild(l);
-return l;
+if (cached) {
+if (cached.__firedLoad) {
+cached.dispatchEvent(new Event('load'));
+}
+if (cached.__firedError) {
+cached.dispatchEvent(new Event('error'));
+}
+} else {
+list[link.href] = link;
+optAsync = Boolean(optAsync);
+if (optAsync) {
+link.setAttribute('async', '');
+}
+document.head.appendChild(link);
+}
+return imprt;
 },
 create: function (tag, props) {
 var elt = document.createElement(tag);
@@ -1341,7 +1365,22 @@
 isLocalDescendant: function (node) {
 return this.root === Polymer.dom(node).getOwnerRoot();
 }
-});Polymer.Bind = {
+});
+if (!Polymer.Settings.useNativeCustomElements) {
+var importHref = Polymer.Base.importHref;
+Polymer.Base.importHref = function (href, onload, onerror, optAsync) {
+CustomElements.ready = false;
+var loadFn = function (e) {
+CustomElements.upgradeDocumentTree(document);
+CustomElements.ready = true;
+if (onload) {
+return onload.call(this, e);
+}
+};
+return importHref.call(this, href, loadFn, onerror, optAsync);
+};
+}
+}());Polymer.Bind = {
 prepareModel: function (model) {
 Polymer.Base.mixin(model, this._modelApi);
 },
@@ -1382,7 +1421,7 @@
 },
 _effectEffects: function (property, value, effects, old, fromAbove) {
 for (var i = 0, l = effects.length, fx; i < l && (fx = effects[i]); i++) {
-fx.fn.call(this, property, value, fx.effect, old, fromAbove);
+fx.fn.call(this, property, this[property], fx.effect, old, fromAbove);
 }
 },
 _clearPath: function (path) {
@@ -2169,7 +2208,7 @@
 },
 _pathMatchesEffect: function (path, effect) {
 var effectArg = effect.trigger.name;
-return effectArg == path || effectArg.indexOf(path + '.') === 0 || effect.trigger.wildcard && path.indexOf(effectArg) === 0;
+return effectArg == path || effectArg.indexOf(path + '.') === 0 || effect.trigger.wildcard && path.indexOf(effectArg + '.') === 0;
 },
 linkPaths: function (to, from) {
 this._boundPaths = this._boundPaths || {};
@@ -2421,7 +2460,7 @@
 var cssText = '';
 if (node.cssText || node.rules) {
 var r$ = node.rules;
-if (r$ && (preserveProperties || !this._hasMixinRules(r$))) {
+if (r$ && !this._hasMixinRules(r$)) {
 for (var i = 0, l = r$.length, r; i < l && (r = r$[i]); i++) {
 cssText = this.stringify(r, preserveProperties, cssText);
 }
@@ -2469,7 +2508,7 @@
 port: /@import[^;]*;/gim,
 customProp: /(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,
 mixinProp: /(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,
-mixinApply: /@apply[\s]*\([^)]*?\)[\s]*(?:[;\n]|$)?/gim,
+mixinApply: /@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,
 varApply: /[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,
 keyframesRule: /^@[^\s]*keyframes/,
 multipleSpaces: /\s+/g
@@ -2479,22 +2518,31 @@
 AT_START: '@'
 };
 }();Polymer.StyleUtil = function () {
+var settings = Polymer.Settings;
 return {
+NATIVE_VARIABLES: Polymer.Settings.useNativeCSSProperties,
 MODULE_STYLES_SELECTOR: 'style:not([no-process]), link[rel=import][type~=css], template',
 INCLUDE_ATTR: 'include',
-toCssText: function (rules, callback, preserveProperties) {
+toCssText: function (rules, callback) {
 if (typeof rules === 'string') {
 rules = this.parser.parse(rules);
 }
 if (callback) {
 this.forEachRule(rules, callback);
 }
-return this.parser.stringify(rules, preserveProperties);
+return this.parser.stringify(rules, this.NATIVE_VARIABLES);
 },
 forRulesInStyles: function (styles, styleRuleCallback, keyframesRuleCallback) {
 if (styles) {
 for (var i = 0, l = styles.length, s; i < l && (s = styles[i]); i++) {
-this.forEachRule(this.rulesForStyle(s), styleRuleCallback, keyframesRuleCallback);
+this.forEachRuleInStyle(s, styleRuleCallback, keyframesRuleCallback);
+}
+}
+},
+forActiveRulesInStyles: function (styles, styleRuleCallback, keyframesRuleCallback) {
+if (styles) {
+for (var i = 0, l = styles.length, s; i < l && (s = styles[i]); i++) {
+this.forEachRuleInStyle(s, styleRuleCallback, keyframesRuleCallback, true);
 }
 }
 },
@@ -2507,11 +2555,36 @@
 isKeyframesSelector: function (rule) {
 return rule.parent && rule.parent.type === this.ruleTypes.KEYFRAMES_RULE;
 },
-forEachRule: function (node, styleRuleCallback, keyframesRuleCallback) {
+forEachRuleInStyle: function (style, styleRuleCallback, keyframesRuleCallback, onlyActiveRules) {
+var rules = this.rulesForStyle(style);
+var styleCallback, keyframeCallback;
+if (styleRuleCallback) {
+styleCallback = function (rule) {
+styleRuleCallback(rule, style);
+};
+}
+if (keyframesRuleCallback) {
+keyframeCallback = function (rule) {
+keyframesRuleCallback(rule, style);
+};
+}
+this.forEachRule(rules, styleCallback, keyframeCallback, onlyActiveRules);
+},
+forEachRule: function (node, styleRuleCallback, keyframesRuleCallback, onlyActiveRules) {
 if (!node) {
 return;
 }
 var skipRules = false;
+if (onlyActiveRules) {
+if (node.type === this.ruleTypes.MEDIA_RULE) {
+var matchMedia = node.selector.match(this.rx.MEDIA_MATCH);
+if (matchMedia) {
+if (!window.matchMedia(matchMedia[1]).matches) {
+skipRules = true;
+}
+}
+}
+}
 if (node.type === this.ruleTypes.STYLE_RULE) {
 styleRuleCallback(node);
 } else if (keyframesRuleCallback && node.type === this.ruleTypes.KEYFRAMES_RULE) {
@@ -2522,7 +2595,7 @@
 var r$ = node.rules;
 if (r$ && !skipRules) {
 for (var i = 0, l = r$.length, r; i < l && (r = r$[i]); i++) {
-this.forEachRule(r, styleRuleCallback, keyframesRuleCallback);
+this.forEachRule(r, styleRuleCallback, keyframesRuleCallback, onlyActiveRules);
 }
 }
 },
@@ -2595,13 +2668,37 @@
 }
 return cssText;
 },
+isTargetedBuild: function (buildType) {
+return settings.useNativeShadow ? buildType === 'shadow' : buildType === 'shady';
+},
+cssBuildTypeForModule: function (module) {
+var dm = Polymer.DomModule.import(module);
+if (dm) {
+return this.getCssBuildType(dm);
+}
+},
+getCssBuildType: function (element) {
+return element.getAttribute('css-build');
+},
+rx: {
+VAR_ASSIGN: /(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:([^;{]*)|{([^}]*)})(?:(?=[;\s}])|$)/gi,
+MIXIN_MATCH: /(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,
+VAR_MATCH: /(^|\W+)var\([\s]*([^,)]*)[\s]*,?[\s]*((?:[^,()]*)|(?:[^;()]*\([^;)]*\)+))[\s]*?\)/gi,
+VAR_CONSUMED: /(--[\w-]+)\s*([:,;)]|$)/gi,
+ANIMATION_MATCH: /(animation\s*:)|(animation-name\s*:)/,
+MEDIA_MATCH: /@media[^(]*(\([^)]*\))/,
+IS_VAR: /^--/,
+BRACKETED: /\{[^}]*\}/g,
+HOST_PREFIX: '(?:^|[^.#[:])',
+HOST_SUFFIX: '($|[.:[\\s>+~])'
+},
 resolveCss: Polymer.ResolveUrl.resolveCss,
 parser: Polymer.CssParse,
 ruleTypes: Polymer.CssParse.types
 };
 }();Polymer.StyleTransformer = function () {
-var nativeShadow = Polymer.Settings.useNativeShadow;
 var styleUtil = Polymer.StyleUtil;
+var settings = Polymer.Settings;
 var api = {
 dom: function (node, scope, useAttr, shouldRemoveScope) {
 this._transformDom(node, scope || '', useAttr, shouldRemoveScope);
@@ -2648,9 +2745,10 @@
 elementStyles: function (element, callback) {
 var styles = element._styles;
 var cssText = '';
+var cssBuildType = element.__cssBuild;
 for (var i = 0, l = styles.length, s; i < l && (s = styles[i]); i++) {
 var rules = styleUtil.rulesForStyle(s);
-cssText += nativeShadow ? styleUtil.toCssText(rules, callback) : this.css(rules, element.is, element.extends, callback, element._scopeCssViaAttr) + '\n\n';
+cssText += settings.useNativeShadow || cssBuildType === 'shady' ? styleUtil.toCssText(rules, callback) : this.css(rules, element.is, element.extends, callback, element._scopeCssViaAttr) + '\n\n';
 }
 return cssText.trim();
 },
@@ -2682,18 +2780,22 @@
 this._transformRule(rule, this._transformComplexSelector, scope, hostScope);
 },
 _transformRule: function (rule, transformer, scope, hostScope) {
+rule.selector = rule.transformedSelector = this._transformRuleCss(rule, transformer, scope, hostScope);
+},
+_transformRuleCss: function (rule, transformer, scope, hostScope) {
 var p$ = rule.selector.split(COMPLEX_SELECTOR_SEP);
 if (!styleUtil.isKeyframesSelector(rule)) {
 for (var i = 0, l = p$.length, p; i < l && (p = p$[i]); i++) {
 p$[i] = transformer.call(this, p, scope, hostScope);
 }
 }
-rule.selector = rule.transformedSelector = p$.join(COMPLEX_SELECTOR_SEP);
+return p$.join(COMPLEX_SELECTOR_SEP);
 },
 _transformComplexSelector: function (selector, scope, hostScope) {
 var stop = false;
 var hostContext = false;
 var self = this;
+selector = selector.trim();
 selector = selector.replace(CONTENT_START, HOST + ' $1');
 selector = selector.replace(SIMPLE_SELECTOR_SEP, function (m, c, s) {
 if (!stop) {
@@ -2720,10 +2822,7 @@
 if (selector.indexOf(HOST_CONTEXT) >= 0) {
 hostContext = true;
 } else if (selector.indexOf(HOST) >= 0) {
-selector = selector.replace(HOST_PAREN, function (m, host, paren) {
-return hostScope + paren;
-});
-selector = selector.replace(HOST, hostScope);
+selector = this._transformHostSelector(selector, hostScope);
 } else if (jumpIndex !== 0) {
 selector = scope ? this._transformSimpleSelector(selector, scope) : selector;
 }
@@ -2747,16 +2846,36 @@
 p$[0] += scope;
 return p$.join(PSEUDO_PREFIX);
 },
+_transformHostSelector: function (selector, hostScope) {
+var m = selector.match(HOST_PAREN);
+var paren = m && m[2].trim() || '';
+if (paren) {
+if (!paren[0].match(SIMPLE_SELECTOR_PREFIX)) {
+var typeSelector = paren.split(SIMPLE_SELECTOR_PREFIX)[0];
+if (typeSelector === hostScope) {
+return paren;
+} else {
+return SELECTOR_NO_MATCH;
+}
+} else {
+return selector.replace(HOST_PAREN, function (m, host, paren) {
+return hostScope + paren;
+});
+}
+} else {
+return selector.replace(HOST, hostScope);
+}
+},
 documentRule: function (rule) {
 rule.selector = rule.parsedSelector;
 this.normalizeRootSelector(rule);
-if (!nativeShadow) {
+if (!settings.useNativeShadow) {
 this._transformRule(rule, this._transformDocumentSelector);
 }
 },
 normalizeRootSelector: function (rule) {
 if (rule.selector === ROOT) {
-rule.selector = 'body';
+rule.selector = 'html';
 }
 },
 _transformDocumentSelector: function (selector) {
@@ -2768,9 +2887,10 @@
 var SCOPE_DOC_SELECTOR = ':not([' + SCOPE_NAME + '])' + ':not(.' + SCOPE_NAME + ')';
 var COMPLEX_SELECTOR_SEP = ',';
 var SIMPLE_SELECTOR_SEP = /(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=\[])+)/g;
+var SIMPLE_SELECTOR_PREFIX = /[[.:#*]/;
 var HOST = ':host';
 var ROOT = ':root';
-var HOST_PAREN = /(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/g;
+var HOST_PAREN = /(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/;
 var HOST_CONTEXT = ':host-context';
 var HOST_CONTEXT_PAREN = /(.*)(?::host-context)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))(.*)/;
 var CONTENT = '::content';
@@ -2781,6 +2901,7 @@
 var PSEUDO_PREFIX = ':';
 var CLASS = 'class';
 var CONTENT_START = new RegExp('^(' + CONTENT + ')');
+var SELECTOR_NO_MATCH = 'should_not_match';
 return api;
 }();Polymer.StyleExtends = function () {
 var styleUtil = Polymer.StyleUtil;
@@ -2852,33 +2973,187 @@
 STRIP: /%[^,]*$/
 }
 };
+}();Polymer.ApplyShim = function () {
+'use strict';
+var styleUtil = Polymer.StyleUtil;
+var MIXIN_MATCH = styleUtil.rx.MIXIN_MATCH;
+var VAR_ASSIGN = styleUtil.rx.VAR_ASSIGN;
+var VAR_MATCH = styleUtil.rx.VAR_MATCH;
+var APPLY_NAME_CLEAN = /;\s*/m;
+var MIXIN_VAR_SEP = '_-_';
+var mixinMap = {};
+function mapSet(name, prop) {
+name = name.trim();
+mixinMap[name] = prop;
+}
+function mapGet(name) {
+name = name.trim();
+return mixinMap[name];
+}
+function cssTextToMap(text) {
+var props = text.split(';');
+var out = {};
+for (var i = 0, p, sp; i < props.length; i++) {
+p = props[i];
+if (p) {
+sp = p.split(':');
+if (sp.length > 1) {
+out[sp[0].trim()] = sp.slice(1).join(':');
+}
+}
+}
+return out;
+}
+function produceCssProperties(matchText, propertyName, valueProperty, valueMixin) {
+if (valueProperty) {
+VAR_MATCH.lastIndex = 0;
+var m = VAR_MATCH.exec(valueProperty);
+if (m) {
+var value = m[2];
+if (mapGet(value)) {
+valueMixin = '@apply ' + value + ';';
+}
+}
+}
+if (!valueMixin) {
+return matchText;
+}
+var mixinAsProperties = consumeCssProperties(valueMixin);
+var prefix = matchText.slice(0, matchText.indexOf('--'));
+var mixinValues = cssTextToMap(mixinAsProperties);
+var oldProperties = mapGet(propertyName);
+var combinedProps = mixinValues;
+if (oldProperties) {
+combinedProps = Polymer.Base.mixin(oldProperties, mixinValues);
+} else {
+mapSet(propertyName, combinedProps);
+}
+var out = [];
+var p, v;
+for (p in combinedProps) {
+v = mixinValues[p];
+if (v === undefined) {
+v = 'initial';
+}
+out.push(propertyName + MIXIN_VAR_SEP + p + ': ' + v);
+}
+return prefix + out.join('; ') + ';';
+}
+function fixVars(matchText, prefix, value, fallback) {
+if (!fallback || fallback.indexOf('--') !== 0) {
+return matchText;
+}
+return [
+prefix,
+'var(',
+value,
+', var(',
+fallback,
+'));'
+].join('');
+}
+function atApplyToCssProperties(mixinName, fallbacks) {
+mixinName = mixinName.replace(APPLY_NAME_CLEAN, '');
+var vars = [];
+var mixinProperties = mapGet(mixinName);
+if (mixinProperties) {
+var p, parts, f;
+for (p in mixinProperties) {
+f = fallbacks && fallbacks[p];
+parts = [
+p,
+': var(',
+mixinName,
+MIXIN_VAR_SEP,
+p
+];
+if (f) {
+parts.push(',', f);
+}
+parts.push(')');
+vars.push(parts.join(''));
+}
+}
+return vars.join('; ');
+}
+function consumeCssProperties(text) {
+var m;
+while (m = MIXIN_MATCH.exec(text)) {
+var matchText = m[0];
+var mixinName = m[1];
+var idx = m.index;
+var applyPos = idx + matchText.indexOf('@apply');
+var afterApplyPos = idx + matchText.length;
+var textBeforeApply = text.slice(0, applyPos);
+var textAfterApply = text.slice(afterApplyPos);
+var defaults = cssTextToMap(textBeforeApply);
+var replacement = atApplyToCssProperties(mixinName, defaults);
+text = [
+textBeforeApply,
+replacement,
+textAfterApply
+].join('');
+MIXIN_MATCH.lastIndex = idx + replacement.length;
+}
+return text;
+}
+var ApplyShim = {
+_map: mixinMap,
+_separator: MIXIN_VAR_SEP,
+transform: function (styles) {
+styleUtil.forRulesInStyles(styles, this._boundTransformRule);
+},
+transformRule: function (rule) {
+rule.cssText = this.transformCssText(rule.parsedCssText);
+if (rule.selector === ':root') {
+rule.selector = ':host > *';
+}
+},
+transformCssText: function (cssText) {
+cssText = cssText.replace(VAR_MATCH, fixVars);
+cssText = cssText.replace(VAR_ASSIGN, produceCssProperties);
+return consumeCssProperties(cssText);
+}
+};
+ApplyShim._boundTransformRule = ApplyShim.transformRule.bind(ApplyShim);
+return ApplyShim;
 }();(function () {
 var prepElement = Polymer.Base._prepElement;
 var nativeShadow = Polymer.Settings.useNativeShadow;
 var styleUtil = Polymer.StyleUtil;
 var styleTransformer = Polymer.StyleTransformer;
 var styleExtends = Polymer.StyleExtends;
+var applyShim = Polymer.ApplyShim;
+var settings = Polymer.Settings;
 Polymer.Base._addFeature({
 _prepElement: function (element) {
-if (this._encapsulateStyle) {
+if (this._encapsulateStyle && this.__cssBuild !== 'shady') {
 styleTransformer.element(element, this.is, this._scopeCssViaAttr);
 }
 prepElement.call(this, element);
 },
 _prepStyles: function () {
-if (!nativeShadow) {
-this._scopeStyle = styleUtil.applyStylePlaceHolder(this.is);
-}
-},
-_prepShimStyles: function () {
-if (this._template) {
 if (this._encapsulateStyle === undefined) {
 this._encapsulateStyle = !nativeShadow;
 }
-this._styles = this._collectStyles();
-var cssText = styleTransformer.elementStyles(this);
+if (!nativeShadow) {
+this._scopeStyle = styleUtil.applyStylePlaceHolder(this.is);
+}
+this.__cssBuild = styleUtil.cssBuildTypeForModule(this.is);
+},
+_prepShimStyles: function () {
+if (this._template) {
+var hasTargetedCssBuild = styleUtil.isTargetedBuild(this.__cssBuild);
+if (settings.useNativeCSSProperties && this.__cssBuild === 'shadow' && hasTargetedCssBuild) {
+return;
+}
+this._styles = this._styles || this._collectStyles();
+if (settings.useNativeCSSProperties && !this.__cssBuild) {
+applyShim.transform(this._styles);
+}
+var cssText = settings.useNativeCSSProperties && hasTargetedCssBuild ? this._styles.length && this._styles[0].textContent.trim() : styleTransformer.elementStyles(this);
 this._prepStyleProperties();
-if (!this._needsStyleProperties() && this._styles.length) {
+if (!this._needsStyleProperties() && cssText) {
 styleUtil.applyCss(cssText, this.is, nativeShadow ? this._template.content : null, this._scopeStyle);
 }
 } else {
@@ -2959,15 +3234,28 @@
 });
 }());Polymer.StyleProperties = function () {
 'use strict';
-var nativeShadow = Polymer.Settings.useNativeShadow;
 var matchesSelector = Polymer.DomApi.matchesSelector;
 var styleUtil = Polymer.StyleUtil;
 var styleTransformer = Polymer.StyleTransformer;
+var settings = Polymer.Settings;
 return {
-decorateStyles: function (styles) {
-var self = this, props = {}, keyframes = [];
-styleUtil.forRulesInStyles(styles, function (rule) {
+decorateStyles: function (styles, scope) {
+var self = this, props = {}, keyframes = [], ruleIndex = 0;
+var scopeSelector = styleTransformer._calcHostScope(scope.is, scope.extends);
+styleUtil.forRulesInStyles(styles, function (rule, style) {
 self.decorateRule(rule);
+rule.index = ruleIndex++;
+self.whenHostOrRootRule(scope, rule, style, function (info) {
+if (rule.parent.type === styleUtil.ruleTypes.MEDIA_RULE) {
+scope.__notStyleScopeCacheable = true;
+}
+if (info.isHost) {
+var hostContextOrFunction = info.selector.split(' ').some(function (s) {
+return s.indexOf(scopeSelector) === 0 && s.length !== scopeSelector.length;
+});
+scope.__notStyleScopeCacheable = scope.__notStyleScopeCacheable || hostContextOrFunction;
+}
+});
 self.collectPropertiesInCssText(rule.propertyInfo.cssText, props);
 }, function onKeyframesRule(rule) {
 keyframes.push(rule);
@@ -3005,7 +3293,7 @@
 var cssText = rule.parsedCssText;
 var any;
 while (m = rx.exec(cssText)) {
-properties[m[1]] = (m[2] || m[3]).trim();
+properties[m[1].trim()] = (m[2] || m[3]).trim();
 any = true;
 }
 return any;
@@ -3019,11 +3307,10 @@
 },
 collectPropertiesInCssText: function (cssText, props) {
 var m;
-while (m = this.rx.VAR_CAPTURE.exec(cssText)) {
-props[m[1]] = true;
-var def = m[2];
-if (def && def.match(this.rx.IS_VAR)) {
-props[def] = true;
+while (m = this.rx.VAR_CONSUMED.exec(cssText)) {
+var name = m[1];
+if (m[2] !== ':') {
+props[name] = true;
 }
 }
 },
@@ -3041,7 +3328,7 @@
 } else {
 var self = this;
 var fn = function (all, prefix, value, fallback) {
-var propertyValue = self.valueForProperty(props[value], props) || (props[fallback] ? self.valueForProperty(props[fallback], props) : fallback);
+var propertyValue = self.valueForProperty(props[value], props) || self.valueForProperty(props[fallback] || fallback, props) || fallback;
 return prefix + (propertyValue || '');
 };
 property = property.replace(this.rx.VAR_MATCH, fn);
@@ -3053,7 +3340,8 @@
 var parts = property.split(';');
 for (var i = 0, p, m; i < parts.length; i++) {
 if (p = parts[i]) {
-m = p.match(this.rx.MIXIN_MATCH);
+this.rx.MIXIN_MATCH.lastIndex = 0;
+m = this.rx.MIXIN_MATCH.exec(p);
 if (m) {
 p = this.valueForProperty(props[m[1]], props);
 } else {
@@ -3110,48 +3398,78 @@
 },
 propertyDataFromStyles: function (styles, element) {
 var props = {}, self = this;
-var o = [], i = 0;
-styleUtil.forRulesInStyles(styles, function (rule) {
+var o = [];
+styleUtil.forActiveRulesInStyles(styles, function (rule) {
 if (!rule.propertyInfo) {
 self.decorateRule(rule);
 }
-if (element && rule.propertyInfo.properties && matchesSelector.call(element, rule.transformedSelector || rule.parsedSelector)) {
+var selectorToMatch = rule.transformedSelector || rule.parsedSelector;
+if (element && rule.propertyInfo.properties && selectorToMatch) {
+if (matchesSelector.call(element, selectorToMatch)) {
 self.collectProperties(rule, props);
-addToBitMask(i, o);
+addToBitMask(rule.index, o);
 }
-i++;
+}
 });
 return {
 properties: props,
 key: o
 };
 },
-scopePropertiesFromStyles: function (styles) {
-if (!styles._scopeStyleProperties) {
-styles._scopeStyleProperties = this.selectedPropertiesFromStyles(styles, this.SCOPE_SELECTORS);
-}
-return styles._scopeStyleProperties;
-},
-hostPropertiesFromStyles: function (styles) {
-if (!styles._hostStyleProperties) {
-styles._hostStyleProperties = this.selectedPropertiesFromStyles(styles, this.HOST_SELECTORS);
-}
-return styles._hostStyleProperties;
-},
-selectedPropertiesFromStyles: function (styles, selectors) {
-var props = {}, self = this;
-styleUtil.forRulesInStyles(styles, function (rule) {
+whenHostOrRootRule: function (scope, rule, style, callback) {
 if (!rule.propertyInfo) {
 self.decorateRule(rule);
 }
-for (var i = 0; i < selectors.length; i++) {
-if (rule.parsedSelector === selectors[i]) {
-self.collectProperties(rule, props);
+if (!rule.propertyInfo.properties) {
 return;
 }
+var hostScope = scope.is ? styleTransformer._calcHostScope(scope.is, scope.extends) : 'html';
+var parsedSelector = rule.parsedSelector;
+var isRoot = parsedSelector === ':root';
+var isHost = parsedSelector.indexOf(':host') === 0;
+var cssBuild = scope.__cssBuild || style.__cssBuild;
+if (cssBuild === 'shady') {
+isRoot = parsedSelector === hostScope + '> *.' + hostScope || parsedSelector.indexOf('html') !== -1;
+isHost = !isRoot && parsedSelector.indexOf(hostScope) === 0;
+}
+if (cssBuild === 'shadow') {
+isRoot = parsedSelector === ':host > *' || parsedSelector === 'html';
+isHost = isHost && !isRoot;
+}
+if (!isRoot && !isHost) {
+return;
+}
+var selectorToMatch = hostScope;
+if (isHost) {
+if (settings.useNativeShadow && !rule.transformedSelector) {
+rule.transformedSelector = styleTransformer._transformRuleCss(rule, styleTransformer._transformComplexSelector, scope.is, hostScope);
+}
+selectorToMatch = rule.transformedSelector || hostScope;
+}
+callback({
+selector: selectorToMatch,
+isHost: isHost,
+isRoot: isRoot
+});
+},
+hostAndRootPropertiesForScope: function (scope) {
+var hostProps = {}, rootProps = {}, self = this;
+styleUtil.forActiveRulesInStyles(scope._styles, function (rule, style) {
+self.whenHostOrRootRule(scope, rule, style, function (info) {
+var element = scope._element || scope;
+if (matchesSelector.call(element, info.selector)) {
+if (info.isHost) {
+self.collectProperties(rule, hostProps);
+} else {
+self.collectProperties(rule, rootProps);
+}
 }
 });
-return props;
+});
+return {
+rootProps: rootProps,
+hostProps: hostProps
+};
 },
 transformStyles: function (element, properties, scopeSelector) {
 var self = this;
@@ -3161,7 +3479,7 @@
 var keyframeTransforms = this._elementKeyframeTransforms(element, scopeSelector);
 return styleTransformer.elementStyles(element, function (rule) {
 self.applyProperties(rule, properties);
-if (!nativeShadow && !Polymer.StyleUtil.isKeyframesSelector(rule) && rule.cssText) {
+if (!settings.useNativeShadow && !Polymer.StyleUtil.isKeyframesSelector(rule) && rule.cssText) {
 self.applyKeyframeTransforms(rule, keyframeTransforms);
 self._scopeSelector(rule, hostRx, hostSelector, element._scopeCssViaAttr, scopeSelector);
 }
@@ -3170,7 +3488,7 @@
 _elementKeyframeTransforms: function (element, scopeSelector) {
 var keyframesRules = element._styles._keyframes;
 var keyframeTransforms = {};
-if (!nativeShadow && keyframesRules) {
+if (!settings.useNativeShadow && keyframesRules) {
 for (var i = 0, keyframesRule = keyframesRules[i]; i < keyframesRules.length; keyframesRule = keyframesRules[++i]) {
 this._scopeKeyframes(keyframesRule, scopeSelector);
 keyframeTransforms[keyframesRule.keyframesName] = this._keyframesRuleTransformer(keyframesRule);
@@ -3213,18 +3531,18 @@
 applyElementStyle: function (element, properties, selector, style) {
 var cssText = style ? style.textContent || '' : this.transformStyles(element, properties, selector);
 var s = element._customStyle;
-if (s && !nativeShadow && s !== style) {
+if (s && !settings.useNativeShadow && s !== style) {
 s._useCount--;
 if (s._useCount <= 0 && s.parentNode) {
 s.parentNode.removeChild(s);
 }
 }
-if (nativeShadow) {
+if (settings.useNativeShadow) {
 if (element._customStyle) {
 element._customStyle.textContent = cssText;
 style = element._customStyle;
 } else if (cssText) {
-style = styleUtil.applyCss(cssText, selector, element.root);
+style = styleUtil.applyCss(cssText, selector, element.root, element._scopeStyle);
 }
 } else {
 if (!style) {
@@ -3253,19 +3571,17 @@
 }
 }
 },
-rx: {
-VAR_ASSIGN: /(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:([^;{]*)|{([^}]*)})(?:(?=[;\s}])|$)/gi,
-MIXIN_MATCH: /(?:^|\W+)@apply[\s]*\(([^)]*)\)/i,
-VAR_MATCH: /(^|\W+)var\([\s]*([^,)]*)[\s]*,?[\s]*((?:[^,()]*)|(?:[^;()]*\([^;)]*\)))[\s]*?\)/gi,
-VAR_CAPTURE: /\([\s]*(--[^,\s)]*)(?:,[\s]*(--[^,\s)]*))?(?:\)|,)/gi,
-ANIMATION_MATCH: /(animation\s*:)|(animation-name\s*:)/,
-IS_VAR: /^--/,
-BRACKETED: /\{[^}]*\}/g,
-HOST_PREFIX: '(?:^|[^.#[:])',
-HOST_SUFFIX: '($|[.:[\\s>+~])'
+updateNativeStyleProperties: function (element, properties) {
+for (var i = 0; i < element.style.length; i++) {
+element.style.removeProperty(element.style[i]);
+}
+for (var p in properties) {
+if (properties[p] !== null) {
+element.style.setProperty(p, properties[p]);
+}
+}
 },
-HOST_SELECTORS: [':host'],
-SCOPE_SELECTORS: [':root'],
+rx: styleUtil.rx,
 XSCOPE_NAME: 'x-scope'
 };
 function addToBitMask(n, bits) {
@@ -3322,25 +3638,30 @@
 }());Polymer.StyleDefaults = function () {
 var styleProperties = Polymer.StyleProperties;
 var StyleCache = Polymer.StyleCache;
+var nativeVariables = Polymer.Settings.useNativeCSSProperties;
 var api = {
 _styles: [],
 _properties: null,
 customStyle: {},
 _styleCache: new StyleCache(),
+_element: Polymer.DomApi.wrap(document.documentElement),
 addStyle: function (style) {
 this._styles.push(style);
 this._properties = null;
 },
 get _styleProperties() {
 if (!this._properties) {
-styleProperties.decorateStyles(this._styles);
+styleProperties.decorateStyles(this._styles, this);
 this._styles._scopeStyleProperties = null;
-this._properties = styleProperties.scopePropertiesFromStyles(this._styles);
+this._properties = styleProperties.hostAndRootPropertiesForScope(this).rootProps;
 styleProperties.mixinCustomStyle(this._properties, this.customStyle);
 styleProperties.reify(this._properties);
 }
 return this._properties;
 },
+hasStyleProperties: function () {
+return Boolean(this._properties);
+},
 _needsStyleProperties: function () {
 },
 _computeStyleProperties: function () {
@@ -3357,6 +3678,9 @@
 s = s.__importElement || s;
 s._apply();
 }
+if (nativeVariables) {
+styleProperties.updateNativeStyleProperties(document.documentElement, this.customStyle);
+}
 }
 };
 return api;
@@ -3367,13 +3691,16 @@
 var styleTransformer = Polymer.StyleTransformer;
 var styleDefaults = Polymer.StyleDefaults;
 var nativeShadow = Polymer.Settings.useNativeShadow;
+var nativeVariables = Polymer.Settings.useNativeCSSProperties;
 Polymer.Base._addFeature({
 _prepStyleProperties: function () {
-this._ownStylePropertyNames = this._styles && this._styles.length ? propertyUtils.decorateStyles(this._styles) : null;
+if (!nativeVariables) {
+this._ownStylePropertyNames = this._styles && this._styles.length ? propertyUtils.decorateStyles(this._styles, this) : null;
+}
 },
 customStyle: null,
 getComputedStyleValue: function (property) {
-return this._styleProperties && this._styleProperties[property] || getComputedStyle(this).getPropertyValue(property);
+return !nativeVariables && this._styleProperties && this._styleProperties[property] || getComputedStyle(this).getPropertyValue(property);
 },
 _setupStyleProperties: function () {
 this.customStyle = {};
@@ -3384,10 +3711,11 @@
 this._customStyle = null;
 },
 _needsStyleProperties: function () {
-return Boolean(this._ownStylePropertyNames && this._ownStylePropertyNames.length);
+return Boolean(!nativeVariables && this._ownStylePropertyNames && this._ownStylePropertyNames.length);
 },
 _beforeAttached: function () {
-if (!this._scopeSelector && this._needsStyleProperties()) {
+if ((!this._scopeSelector || this.__stylePropertiesInvalid) && this._needsStyleProperties()) {
+this.__stylePropertiesInvalid = false;
 this._updateStyleProperties();
 }
 },
@@ -3407,8 +3735,11 @@
 scope._styleCache = new Polymer.StyleCache();
 }
 var scopeData = propertyUtils.propertyDataFromStyles(scope._styles, this);
+var scopeCacheable = !this.__notStyleScopeCacheable;
+if (scopeCacheable) {
 scopeData.key.customStyle = this.customStyle;
 info = scope._styleCache.retrieve(this.is, scopeData.key, this._styles);
+}
 var scopeCached = Boolean(info);
 if (scopeCached) {
 this._styleProperties = info._styleProperties;
@@ -3428,9 +3759,11 @@
 _scopeSelector: this._scopeSelector,
 _styleProperties: this._styleProperties
 };
+if (scopeCacheable) {
 scopeData.key.customStyle = {};
 this.mixin(scopeData.key.customStyle, this.customStyle);
 scope._styleCache.store(this.is, info, scopeData.key, this._styles);
+}
 if (!globalCached) {
 styleCache.store(this.is, Object.create(info), this._ownStyleProperties, this._styles);
 }
@@ -3442,10 +3775,11 @@
 scope._computeStyleProperties();
 }
 var props = Object.create(scope._styleProperties);
-this.mixin(props, propertyUtils.hostPropertiesFromStyles(this._styles));
+var hostAndRootProps = propertyUtils.hostAndRootPropertiesForScope(this);
+this.mixin(props, hostAndRootProps.hostProps);
 scopeProps = scopeProps || propertyUtils.propertyDataFromStyles(scope._styles, this).properties;
 this.mixin(props, scopeProps);
-this.mixin(props, propertyUtils.scopePropertiesFromStyles(this._styles));
+this.mixin(props, hostAndRootProps.rootProps);
 propertyUtils.mixinCustomStyle(props, this.customStyle);
 propertyUtils.reify(props);
 this._styleProperties = props;
@@ -3486,15 +3820,21 @@
 return selector;
 },
 updateStyles: function (properties) {
-if (this.isAttached) {
 if (properties) {
 this.mixin(this.customStyle, properties);
 }
+if (nativeVariables) {
+propertyUtils.updateNativeStyleProperties(this, this.customStyle);
+} else {
+if (this.isAttached) {
 if (this._needsStyleProperties()) {
 this._updateStyleProperties();
 } else {
 this._styleProperties = null;
 }
+} else {
+this.__stylePropertiesInvalid = true;
+}
 if (this._styleCache) {
 this._styleCache.clear();
 }
@@ -3573,12 +3913,21 @@
 var cssParse = Polymer.CssParse;
 var styleDefaults = Polymer.StyleDefaults;
 var styleTransformer = Polymer.StyleTransformer;
+var applyShim = Polymer.ApplyShim;
+var debounce = Polymer.Debounce;
+var settings = Polymer.Settings;
+var updateDebouncer;
 Polymer({
 is: 'custom-style',
 extends: 'style',
 _template: null,
 properties: { include: String },
 ready: function () {
+this.__appliedElement = this.__appliedElement || this;
+this.__cssBuild = styleUtil.getCssBuildType(this);
+if (this.__appliedElement !== this) {
+this.__appliedElement.__cssBuild = this.__cssBuild;
+}
 this._tryApply();
 },
 attached: function () {
@@ -3588,8 +3937,11 @@
 if (!this._appliesToDocument) {
 if (this.parentNode && this.parentNode.localName !== 'dom-module') {
 this._appliesToDocument = true;
-var e = this.__appliedElement || this;
+var e = this.__appliedElement;
+if (!settings.useNativeCSSProperties) {
+this.__needsUpdateStyles = styleDefaults.hasStyleProperties();
 styleDefaults.addStyle(e);
+}
 if (e.textContent || this.include) {
 this._apply(true);
 } else {
@@ -3603,34 +3955,61 @@
 }
 }
 },
-_apply: function (deferProperties) {
-var e = this.__appliedElement || this;
+_updateStyles: function () {
+Polymer.updateStyles();
+},
+_apply: function (initialApply) {
+var e = this.__appliedElement;
 if (this.include) {
 e.textContent = styleUtil.cssFromModules(this.include, true) + e.textContent;
 }
-if (e.textContent) {
-styleUtil.forEachRule(styleUtil.rulesForStyle(e), function (rule) {
+if (!e.textContent) {
+return;
+}
+var buildType = this.__cssBuild;
+var targetedBuild = styleUtil.isTargetedBuild(buildType);
+if (settings.useNativeCSSProperties && targetedBuild) {
+return;
+}
+var styleRules = styleUtil.rulesForStyle(e);
+if (!targetedBuild) {
+styleUtil.forEachRule(styleRules, function (rule) {
 styleTransformer.documentRule(rule);
+if (settings.useNativeCSSProperties && !buildType) {
+applyShim.transformRule(rule);
+}
 });
+}
+if (settings.useNativeCSSProperties) {
+e.textContent = styleUtil.toCssText(styleRules);
+} else {
 var self = this;
 var fn = function fn() {
-self._applyCustomProperties(e);
+self._flushCustomProperties();
 };
-if (this._pendingApplyProperties) {
-cancelAnimationFrame(this._pendingApplyProperties);
-this._pendingApplyProperties = null;
-}
-if (deferProperties) {
-this._pendingApplyProperties = requestAnimationFrame(fn);
+if (initialApply) {
+Polymer.RenderStatus.whenReady(fn);
 } else {
 fn();
 }
 }
 },
-_applyCustomProperties: function (element) {
+_flushCustomProperties: function () {
+if (this.__needsUpdateStyles) {
+this.__needsUpdateStyles = false;
+updateDebouncer = debounce(updateDebouncer, this._updateStyles);
+} else {
+this._applyCustomProperties();
+}
+},
+_applyCustomProperties: function () {
+var element = this.__appliedElement;
 this._computeStyleProperties();
 var props = this._styleProperties;
 var rules = styleUtil.rulesForStyle(element);
+if (!rules) {
+return;
+}
 element.textContent = styleUtil.toCssText(rules, function (rule) {
 var css = rule.cssText = rule.parsedCssText;
 if (rule.propertyInfo && rule.propertyInfo.cssText) {
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js b/third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js
index de1317db..84441a4 100644
--- a/third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js
@@ -28,6 +28,8 @@
 settings.useNativeCustomElements = !window.CustomElements || window.CustomElements.useNative;
 settings.useNativeShadow = settings.useShadow && settings.nativeShadow;
 settings.usePolyfillProto = !settings.useNativeCustomElements && !Object.__proto__;
+settings.hasNativeCSSProperties = !navigator.userAgent.match('AppleWebKit/601') && window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)');
+settings.useNativeCSSProperties = settings.hasNativeCSSProperties && settings.lazyRegister && settings.useNativeCSSProperties;
 return settings;
 }()
 };(function () {
@@ -115,6 +117,9 @@
 args
 ]);
 },
+hasRendered: function () {
+return this._ready;
+},
 _watchNextRender: function () {
 if (!this._waitingNextRender) {
 this._waitingNextRender = true;
@@ -666,7 +671,7 @@
 return value != null ? value : undefined;
 }
 }
-});Polymer.version = "1.5.0";Polymer.Base._addFeature({
+});Polymer.version = '1.6.0';Polymer.Base._addFeature({
 _registerFeatures: function () {
 this._prepIs();
 this._prepBehaviors();
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js b/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js
index 1743424..daebde9 100644
--- a/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js
@@ -498,7 +498,7 @@
 if (node.__dom.previousSibling) {
 node.__dom.previousSibling.__dom.nextSibling = node;
 }
-node.__dom.nextSibling = ref_node;
+node.__dom.nextSibling = ref_node || null;
 if (node.__dom.nextSibling) {
 node.__dom.nextSibling.__dom.previousSibling = node;
 }
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini.html b/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini.html
index 176bf18..eb76276 100644
--- a/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini.html
+++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini.html
@@ -8,6 +8,4 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="polymer-micro.html">
 
-
-
 </head><body><script src="polymer-mini-extracted.js"></script></body></html>
\ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer.html b/third_party/polymer/v1_0/components-chromium/polymer/polymer.html
index cac2179..1fea268 100644
--- a/third_party/polymer/v1_0/components-chromium/polymer/polymer.html
+++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer.html
@@ -16,6 +16,4 @@
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="polymer-mini.html">
 
-
-
 </head><body><script src="polymer-extracted.js"></script></body></html>
\ No newline at end of file
diff --git a/third_party/polymer/v1_0/components_summary.txt b/third_party/polymer/v1_0/components_summary.txt
index 114af82..06c0454 100644
--- a/third_party/polymer/v1_0/components_summary.txt
+++ b/third_party/polymer/v1_0/components_summary.txt
@@ -1,9 +1,9 @@
 Name: app-layout
-Version: 0.9.1
+Version: 0.9.2
 Repository: git://github.com/PolymerElements/app-layout.git
-Tag: v0.9.1
-Revision: 6ecd4771eb3e529f63c41947b5eb64ff66cddf33
-Tree link: https://github.com/PolymerElements/app-layout/tree/v0.9.1
+Tag: v0.9.2
+Revision: e4453ca78c83677938041885023d79ce92d03a3a
+Tree link: https://github.com/PolymerElements/app-layout/tree/v0.9.2
 
 Name: app-route
 Version: 0.9.2
@@ -20,67 +20,67 @@
 Tree link: https://github.com/PolymerElements/font-roboto/tree/v1.0.1
 
 Name: iron-a11y-announcer
-Version: 1.0.4
+Version: 1.0.5
 Repository: git://github.com/PolymerElements/iron-a11y-announcer.git
-Tag: v1.0.4
-Revision: 5ce3eb8c4282bb53cd72e348858dc6be6b4c50b9
-Tree link: https://github.com/PolymerElements/iron-a11y-announcer/tree/v1.0.4
+Tag: v1.0.5
+Revision: 2432d39a1693ccd728cbe7eb55810063737d3403
+Tree link: https://github.com/PolymerElements/iron-a11y-announcer/tree/v1.0.5
 
 Name: iron-a11y-keys
-Version: 1.0.5
+Version: 1.0.6
 Repository: git://github.com/PolymerElements/iron-a11y-keys.git
-Tag: v1.0.5
-Revision: e3369954dec2daa5037515aad9d1cb46eb78258b
-Tree link: https://github.com/PolymerElements/iron-a11y-keys/tree/v1.0.5
+Tag: v1.0.6
+Revision: aa9374f069b942dfabcaabb587cbb00b0dd28c63
+Tree link: https://github.com/PolymerElements/iron-a11y-keys/tree/v1.0.6
 
 Name: iron-a11y-keys-behavior
-Version: 1.1.5
+Version: 1.1.7
 Repository: git://github.com/PolymerElements/iron-a11y-keys-behavior.git
-Tag: v1.1.5
-Revision: b6f935cf203b328651f96ac3d21979cac7c9c241
-Tree link: https://github.com/PolymerElements/iron-a11y-keys-behavior/tree/v1.1.5
+Tag: v1.1.7
+Revision: cde403dee704a1d3ea5f7cb49067f0eab31a8afa
+Tree link: https://github.com/PolymerElements/iron-a11y-keys-behavior/tree/v1.1.7
 
 Name: iron-autogrow-textarea
-Version: 1.0.12
+Version: 1.0.13
 Repository: git://github.com/PolymerElements/iron-autogrow-textarea.git
-Tag: v1.0.12
-Revision: 86f8fd61b412bcea6bc7b8feaee9b24bc2ad48ea
-Tree link: https://github.com/PolymerElements/iron-autogrow-textarea/tree/v1.0.12
+Tag: v1.0.13
+Revision: 399cfdbb3fac0c7b61d14a8cf8402c0195b0ff04
+Tree link: https://github.com/PolymerElements/iron-autogrow-textarea/tree/v1.0.13
 
 Name: iron-behaviors
-Version: 1.0.16
+Version: 1.0.17
 Repository: git://github.com/PolymerElements/iron-behaviors.git
-Tag: v1.0.16
-Revision: 161e67233c4776e32a275a719a000865ed309393
-Tree link: https://github.com/PolymerElements/iron-behaviors/tree/v1.0.16
+Tag: v1.0.17
+Revision: ef8e89b5f0aa4e8a6b51ca6491ea453bf395f94f
+Tree link: https://github.com/PolymerElements/iron-behaviors/tree/v1.0.17
 
 Name: iron-checked-element-behavior
-Version: 1.0.4
+Version: 1.0.5
 Repository: git://github.com/PolymerElements/iron-checked-element-behavior.git
-Tag: v1.0.4
-Revision: cc30263ec2871ae8f8f944948f44299d3f3cdf0d
-Tree link: https://github.com/PolymerElements/iron-checked-element-behavior/tree/v1.0.4
+Tag: v1.0.5
+Revision: c70add47a9af62d30746587e8a1303fb390787c6
+Tree link: https://github.com/PolymerElements/iron-checked-element-behavior/tree/v1.0.5
 
 Name: iron-collapse
-Version: 1.1.0
+Version: 1.2.0
 Repository: git://github.com/PolymerElements/iron-collapse.git
-Tag: v1.1.0
-Revision: f9e64ea7731c43430f48d64dddb80166334122c7
-Tree link: https://github.com/PolymerElements/iron-collapse/tree/v1.1.0
+Tag: v1.2.0
+Revision: 3743d45099a50d8f79c06a99991f65d839441d5a
+Tree link: https://github.com/PolymerElements/iron-collapse/tree/v1.2.0
 
 Name: iron-dropdown
-Version: 1.4.1
+Version: 1.5.0
 Repository: git://github.com/PolymerElements/iron-dropdown.git
-Tag: v1.4.1
-Revision: fc5ce3d2ee6be97beef00b9456e6e06498408401
-Tree link: https://github.com/PolymerElements/iron-dropdown/tree/v1.4.1
+Tag: v1.5.0
+Revision: 8930a8884beaf72a4352b0bd5dcf1c63121d0a0f
+Tree link: https://github.com/PolymerElements/iron-dropdown/tree/v1.5.0
 
 Name: iron-fit-behavior
-Version: 1.2.3
+Version: 1.2.5
 Repository: git://github.com/PolymerElements/iron-fit-behavior.git
-Tag: v1.2.3
-Revision: ad54693c57aeb893407a4b5d843e36ee8178f72b
-Tree link: https://github.com/PolymerElements/iron-fit-behavior/tree/v1.2.3
+Tag: v1.2.5
+Revision: 8bc774b9376882ae5ba09f9e007764c6ee9fbbca
+Tree link: https://github.com/PolymerElements/iron-fit-behavior/tree/v1.2.5
 
 Name: iron-flex-layout
 Version: 1.3.1
@@ -97,11 +97,11 @@
 Tree link: https://github.com/PolymerElements/iron-form-element-behavior/tree/v1.0.6
 
 Name: iron-icon
-Version: 1.0.8
+Version: 1.0.9
 Repository: git://github.com/PolymerElements/iron-icon.git
-Tag: v1.0.8
-Revision: f36b38928849ef3853db727faa8c9ef104d611eb
-Tree link: https://github.com/PolymerElements/iron-icon/tree/v1.0.8
+Tag: v1.0.9
+Revision: f6fb241901377e30e2c9c6cd47e3e8e8beb6574d
+Tree link: https://github.com/PolymerElements/iron-icon/tree/v1.0.9
 
 Name: iron-icons
 Version: 1.1.3
@@ -125,18 +125,18 @@
 Tree link: https://github.com/PolymerElements/iron-input/tree/1.0.10
 
 Name: iron-list
-Version: 1.3.4
+Version: 1.3.5
 Repository: git://github.com/PolymerElements/iron-list.git
-Tag: v1.3.4
-Revision: 1335f9d3183fb6d748f765f5a687bfc465a5cb8e
-Tree link: https://github.com/PolymerElements/iron-list/tree/v1.3.4
+Tag: v1.3.5
+Revision: 4713a5dc86da222167e3467531a187b239885547
+Tree link: https://github.com/PolymerElements/iron-list/tree/v1.3.5
 
 Name: iron-location
-Version: 0.8.4
+Version: 0.8.5
 Repository: git://github.com/PolymerElements/iron-location.git
-Tag: v0.8.4
-Revision: dcb05b63c0f367fde7ebfd3bebefee606f69dd68
-Tree link: https://github.com/PolymerElements/iron-location/tree/v0.8.4
+Tag: v0.8.5
+Revision: d7c5a9c991bf5e94094c16e94eb34e2eb30db4b0
+Tree link: https://github.com/PolymerElements/iron-location/tree/v0.8.5
 
 Name: iron-media-query
 Version: 1.0.8
@@ -146,11 +146,11 @@
 Tree link: https://github.com/PolymerElements/iron-media-query/tree/v1.0.8
 
 Name: iron-menu-behavior
-Version: 1.1.7
+Version: 1.1.9
 Repository: git://github.com/PolymerElements/iron-menu-behavior.git
-Tag: v1.1.7
-Revision: ea59e6ce5644d8f7a20c22f13f614ea60604a812
-Tree link: https://github.com/PolymerElements/iron-menu-behavior/tree/v1.1.7
+Tag: v1.1.9
+Revision: d7d82ae11aac17ec7ebd7e468e5ce179a1d964bd
+Tree link: https://github.com/PolymerElements/iron-menu-behavior/tree/v1.1.9
 
 Name: iron-meta
 Version: 1.1.1
@@ -160,39 +160,39 @@
 Tree link: https://github.com/PolymerElements/iron-meta/tree/v1.1.1
 
 Name: iron-overlay-behavior
-Version: 1.8.1
+Version: 1.8.5
 Repository: git://github.com/PolymerElements/iron-overlay-behavior.git
-Tag: v1.8.1
-Revision: dde758ab728daccc26af5da31329acfd0ad0daea
-Tree link: https://github.com/PolymerElements/iron-overlay-behavior/tree/v1.8.1
+Tag: v1.8.5
+Revision: fc4a22e3d846c7ae49b1700b6a66eff41ba0eb48
+Tree link: https://github.com/PolymerElements/iron-overlay-behavior/tree/v1.8.5
 
 Name: iron-pages
-Version: 1.0.7
+Version: 1.0.8
 Repository: git://github.com/PolymerElements/iron-pages.git
-Tag: v1.0.7
-Revision: 357acb8508da5093b22887a85cb785919c20cfde
-Tree link: https://github.com/PolymerElements/iron-pages/tree/v1.0.7
+Tag: v1.0.8
+Revision: 1399d2d51a0ce50edd2c79a6d37419967509bf2c
+Tree link: https://github.com/PolymerElements/iron-pages/tree/v1.0.8
 
 Name: iron-range-behavior
-Version: 1.0.5
+Version: 1.0.6
 Repository: git://github.com/PolymerElements/iron-range-behavior.git
-Tag: v1.0.5
-Revision: 645ffc6b39ae4fb0efd23b97016a9c4aac777978
-Tree link: https://github.com/PolymerElements/iron-range-behavior/tree/v1.0.5
+Tag: v1.0.6
+Revision: 1317604307387599725b80b63cbd293102ea2db0
+Tree link: https://github.com/PolymerElements/iron-range-behavior/tree/v1.0.6
 
 Name: iron-resizable-behavior
-Version: 1.0.3
+Version: 1.0.4
 Repository: git://github.com/PolymerElements/iron-resizable-behavior.git
-Tag: v1.0.3
-Revision: dda1df6aaf452aedf3e52ff0cf69e72439452216
-Tree link: https://github.com/PolymerElements/iron-resizable-behavior/tree/v1.0.3
+Tag: v1.0.4
+Revision: 0fcaf0f96481489f69b54f6172e2f9d430c2a94b
+Tree link: https://github.com/PolymerElements/iron-resizable-behavior/tree/v1.0.4
 
 Name: iron-scroll-target-behavior
-Version: 1.0.6
+Version: 1.0.7
 Repository: git://github.com/PolymerElements/iron-scroll-target-behavior.git
-Tag: v1.0.6
-Revision: 33d5864e0557212eb530dbac280bfc4b4d923880
-Tree link: https://github.com/PolymerElements/iron-scroll-target-behavior/tree/v1.0.6
+Tag: v1.0.7
+Revision: e69dc32e6d6a92f4d9f4071ed9c64cd967d3199a
+Tree link: https://github.com/PolymerElements/iron-scroll-target-behavior/tree/v1.0.7
 
 Name: iron-scroll-threshold
 Version: 1.0.1
@@ -223,18 +223,18 @@
 Tree link: https://github.com/PolymerElements/iron-validatable-behavior/tree/v1.1.1
 
 Name: neon-animation
-Version: 1.2.3
+Version: 1.2.4
 Repository: git://github.com/PolymerElements/neon-animation.git
-Tag: v1.2.3
-Revision: c50d51e62825f4aa53f10e93f746796a174af232
-Tree link: https://github.com/PolymerElements/neon-animation/tree/v1.2.3
+Tag: v1.2.4
+Revision: bd4f50c9a84023363e80513e10456a18232b21a7
+Tree link: https://github.com/PolymerElements/neon-animation/tree/v1.2.4
 
 Name: paper-behaviors
-Version: 1.0.11
+Version: 1.0.12
 Repository: git://github.com/PolymerElements/paper-behaviors.git
-Tag: v1.0.11
-Revision: e3c1ab0c72905b58fb4d9adc2921ea73b5c085a5
-Tree link: https://github.com/PolymerElements/paper-behaviors/tree/v1.0.11
+Tag: v1.0.12
+Revision: 424919089ce3a68dfac1de17e6a56f4e09048e95
+Tree link: https://github.com/PolymerElements/paper-behaviors/tree/v1.0.12
 
 Name: paper-button
 Version: 1.0.12
@@ -244,25 +244,25 @@
 Tree link: https://github.com/PolymerElements/paper-button/tree/v1.0.12
 
 Name: paper-checkbox
-Version: 1.2.1
+Version: 1.3.0
 Repository: git://github.com/PolymerElements/paper-checkbox.git
-Tag: v1.2.1
-Revision: 79f6780db55f50d5ef6602e4f3ea6fd1e7f2abf2
-Tree link: https://github.com/PolymerElements/paper-checkbox/tree/v1.2.1
+Tag: v1.3.0
+Revision: 47e05d17eeca4e9f3a06ef59a86ae9739fa84022
+Tree link: https://github.com/PolymerElements/paper-checkbox/tree/v1.3.0
 
 Name: paper-dialog
-Version: 1.0.4
+Version: 1.1.0
 Repository: git://github.com/PolymerElements/paper-dialog.git
-Tag: v1.0.4
-Revision: 53b099bed06bbbab7cb0f82c8209328c1a82aee6
-Tree link: https://github.com/PolymerElements/paper-dialog/tree/v1.0.4
+Tag: v1.1.0
+Revision: 7f31fa918fbd562b516eb262f1ed527dcaf7b7c0
+Tree link: https://github.com/PolymerElements/paper-dialog/tree/v1.1.0
 
 Name: paper-dialog-behavior
-Version: 1.2.6
+Version: 1.2.7
 Repository: git://github.com/PolymerElements/paper-dialog-behavior.git
-Tag: v1.2.6
-Revision: 38bd4af9ee0d2f7a42cd1c6281c88d3f502f8500
-Tree link: https://github.com/PolymerElements/paper-dialog-behavior/tree/v1.2.6
+Tag: v1.2.7
+Revision: decc77ca55c0381cf01d7409ddf1eb966543e84e
+Tree link: https://github.com/PolymerElements/paper-dialog-behavior/tree/v1.2.7
 
 Name: paper-drawer-panel
 Version: 1.0.9
@@ -272,11 +272,11 @@
 Tree link: https://github.com/PolymerElements/paper-drawer-panel/tree/v1.0.9
 
 Name: paper-dropdown-menu
-Version: 1.2.2
+Version: 1.3.2
 Repository: git://github.com/PolymerElements/paper-dropdown-menu.git
-Tag: v1.2.2
-Revision: 2e990c4b2a27529dead9d9ebcc5830f74379c63e
-Tree link: https://github.com/PolymerElements/paper-dropdown-menu/tree/v1.2.2
+Tag: v1.3.2
+Revision: f4188cdfc2119b9b94fe33360223212e8de6022d
+Tree link: https://github.com/PolymerElements/paper-dropdown-menu/tree/v1.3.2
 
 Name: paper-fab
 Version: 1.2.0
@@ -300,11 +300,11 @@
 Tree link: https://github.com/PolymerElements/paper-icon-button/tree/v1.1.2
 
 Name: paper-input
-Version: 1.1.13
+Version: 1.1.15
 Repository: git://github.com/PolymerElements/paper-input.git
-Tag: v1.1.13
-Revision: ce90cc77b23b8d0047715651940c48450f4d8d7b
-Tree link: https://github.com/PolymerElements/paper-input/tree/v1.1.13
+Tag: v1.1.15
+Revision: cb868e5f6468f2d6b98be9ee7d30d6fcb9bf9698
+Tree link: https://github.com/PolymerElements/paper-input/tree/v1.1.15
 
 Name: paper-item
 Version: 1.2.1
@@ -335,11 +335,11 @@
 Tree link: https://github.com/PolymerElements/paper-menu/tree/v1.2.2
 
 Name: paper-menu-button
-Version: 1.1.1
+Version: 1.5.0
 Repository: git://github.com/PolymerElements/paper-menu-button.git
-Tag: v1.1.1
-Revision: 2d4d1cbdcfe260878e972e42d73ca5a3b7248cb9
-Tree link: https://github.com/PolymerElements/paper-menu-button/tree/v1.1.1
+Tag: v1.5.0
+Revision: 4902e216e1c4f6cb78aef4ec3ea338434e6c2ad1
+Tree link: https://github.com/PolymerElements/paper-menu-button/tree/v1.5.0
 
 Name: paper-progress
 Version: 1.0.9
@@ -363,11 +363,11 @@
 Tree link: https://github.com/PolymerElements/paper-radio-group/tree/v1.2.0
 
 Name: paper-ripple
-Version: 1.0.7
+Version: 1.0.8
 Repository: git://github.com/PolymerElements/paper-ripple.git
-Tag: v1.0.7
-Revision: 8f49ac1282a3603834e6a3a16926279ccee74489
-Tree link: https://github.com/PolymerElements/paper-ripple/tree/v1.0.7
+Tag: v1.0.8
+Revision: eb1c01cac162b7ce7e78760d5c0df61c9a5c2974
+Tree link: https://github.com/PolymerElements/paper-ripple/tree/v1.0.8
 
 Name: paper-slider
 Version: 1.0.11
@@ -405,11 +405,11 @@
 Tree link: https://github.com/PolymerElements/paper-toggle-button/tree/v1.1.2
 
 Name: paper-toolbar
-Version: 1.1.5
+Version: 1.1.6
 Repository: git://github.com/PolymerElements/paper-toolbar.git
-Tag: v1.1.5
-Revision: 9a3deca918b774741ab52f0d0dc27c30ccce96b0
-Tree link: https://github.com/PolymerElements/paper-toolbar/tree/v1.1.5
+Tag: v1.1.6
+Revision: 39b8ad381bd4ba7834ed8f30a938b49810b9204f
+Tree link: https://github.com/PolymerElements/paper-toolbar/tree/v1.1.6
 
 Name: paper-tooltip
 Version: 1.1.2
@@ -419,9 +419,9 @@
 Tree link: https://github.com/PolymerElements/paper-tooltip/tree/v1.1.2
 
 Name: polymer
-Version: 1.5.0
+Version: 1.6.0
 Repository: git://github.com/Polymer/polymer.git
-Tag: v1.5.0
-Revision: ce5b9fb2d8aa03c698410e2e55cffcfa0b788a3a
-Tree link: https://github.com/Polymer/polymer/tree/v1.5.0
+Tag: v1.6.0
+Revision: 8715c83bf04a228de00ec662ed43eb6141e61b91
+Tree link: https://github.com/Polymer/polymer/tree/v1.6.0
 
diff --git a/third_party/robolectric/BUILD.gn b/third_party/robolectric/BUILD.gn
index 790b53d..26ece06 100644
--- a/third_party/robolectric/BUILD.gn
+++ b/third_party/robolectric/BUILD.gn
@@ -19,6 +19,8 @@
   jar_path = "lib/json-20080701.jar"
 }
 
+# TODO(mikecase): Remove this target once all tests have been converted to
+# Robolectric 3.0.
 # GYP: //third_party/robolectric/robolectric.gyp:robolectric_jar
 java_prebuilt("robolectric_java") {
   testonly = true
@@ -29,3 +31,605 @@
     ":tagsoup-1.2",
   ]
 }
+
+java_prebuilt("android-all-5.0.0_r2-robolectric-1") {
+  jar_path = "lib/android-all-5.0.0_r2-robolectric-1.jar"
+}
+
+# TODO(mikecase): Rename target to robolectric_java once all tests have been
+# converted to Robolectric 3.0 and the old robolectric_java target has been
+# removed.
+java_library("robolectric_3_java") {
+  testonly = true
+  deps = [
+    ":android-all-5.0.0_r2-robolectric-1",
+    ":json-20080701",
+    ":robolectric_annotations_java",
+    ":robolectric_resources_java",
+    ":robolectric_utils_java",
+    ":shadows-core-3.0",
+    ":shadows-multidex-3.0",
+    ":tagsoup-1.2",
+    "//third_party/bouncycastle:bouncycastle_java",
+    "//third_party/icu4j:icu4j_java",
+    "//third_party/intellij:intellij_annotations_java",
+    "//third_party/junit:junit",
+    "//third_party/ow2_asm:asm_analysis_java",
+    "//third_party/ow2_asm:asm_commons_java",
+    "//third_party/ow2_asm:asm_java",
+    "//third_party/ow2_asm:asm_tree_java",
+    "//third_party/ow2_asm:asm_util_java",
+    "//third_party/sqlite4java:sqlite4java_java",
+  ]
+  java_files = [
+    "robolectric/robolectric/src/main/java/org/robolectric/DefaultTestLifecycle.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/MultiApiRobolectricTestRunner.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/ParameterizedRobolectricTestRunner.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/Robolectric.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/RobolectricGradleTestRunner.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/RobolectricTestRunner.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/TestLifecycle.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/TestLifecycleApplication.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/TestLifecycleApplicationImpl.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/ClassNameResolver.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/InstrumentingClassLoaderFactory.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/ParallelUniverse.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/ParallelUniverseInterface.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/SdkConfig.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/SdkEnvironment.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/bytecode/ClassHandler.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/bytecode/ClassInfo.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/bytecode/InstrumentationConfiguration.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/bytecode/InstrumentingClassLoader.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/bytecode/InvocationProfile.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/bytecode/MethodSignature.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/bytecode/RoboType.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/bytecode/RobolectricInternals.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/bytecode/ShadowConfig.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/bytecode/ShadowMap.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/bytecode/ShadowWrangler.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/dependency/CachedDependencyResolver.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/dependency/DependencyJar.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/dependency/DependencyResolver.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/dependency/LocalDependencyResolver.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/fakes/RoboCharsets.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/fakes/RoboExtendedResponseCache.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/fakes/RoboInstrumentation.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/fakes/RoboResponseSource.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/runtime/Api19RuntimeAdapter.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/runtime/Api21RuntimeAdapter.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/runtime/RuntimeAdapter.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/internal/runtime/RuntimeAdapterFactory.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/package-info.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/res/builder/DefaultPackageManager.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/res/builder/StubPackageManager.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/util/ActivityController.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/util/ComponentController.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/util/FragmentController.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/util/FragmentTestUtil.java",
+    "robolectric/robolectric/src/main/java/org/robolectric/util/ServiceController.java",
+  ]
+  additional_jar_files = [ rebase_path(
+                               "robolectric/robolectric/src/main/resources/robolectric-version.properties") + ":robolectric-version.properties" ]
+}
+
+java_library("robolectric_annotations_java") {
+  testonly = true
+  deps = [
+    ":android-all-5.0.0_r2-robolectric-1",
+    "//third_party/intellij:intellij_annotations_java",
+  ]
+  java_files = [
+    "robolectric/robolectric-annotations/src/main/java/org/robolectric/annotation/AccessibilityChecks.java",
+    "robolectric/robolectric-annotations/src/main/java/org/robolectric/annotation/Config.java",
+    "robolectric/robolectric-annotations/src/main/java/org/robolectric/annotation/HiddenApi.java",
+    "robolectric/robolectric-annotations/src/main/java/org/robolectric/annotation/Implementation.java",
+    "robolectric/robolectric-annotations/src/main/java/org/robolectric/annotation/Implements.java",
+    "robolectric/robolectric-annotations/src/main/java/org/robolectric/annotation/RealObject.java",
+    "robolectric/robolectric-annotations/src/main/java/org/robolectric/annotation/Resetter.java",
+    "robolectric/robolectric-annotations/src/main/java/org/robolectric/annotation/internal/DoNotInstrument.java",
+    "robolectric/robolectric-annotations/src/main/java/org/robolectric/annotation/internal/Instrument.java",
+    "robolectric/robolectric-annotations/src/main/java/org/robolectric/annotation/package-info.java",
+  ]
+}
+
+java_library("robolectric_processor_java") {
+  testonly = true
+  deps = [
+    ":robolectric_annotations_java",
+    "//build/android:sun_tools_java",
+    "//third_party/guava:guava_java",
+    "//third_party/intellij:intellij_annotations_java",
+  ]
+  provider_configurations = [ "robolectric/robolectric-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor" ]
+  java_files = [
+    "robolectric/robolectric-processor/src/main/java/org/robolectric/annotation/processing/RobolectricModel.java",
+    "robolectric/robolectric-processor/src/main/java/org/robolectric/annotation/processing/RobolectricProcessor.java",
+    "robolectric/robolectric-processor/src/main/java/org/robolectric/annotation/processing/generator/Generator.java",
+    "robolectric/robolectric-processor/src/main/java/org/robolectric/annotation/processing/generator/ServiceLoaderGenerator.java",
+    "robolectric/robolectric-processor/src/main/java/org/robolectric/annotation/processing/generator/ShadowProviderGenerator.java",
+    "robolectric/robolectric-processor/src/main/java/org/robolectric/annotation/processing/generator/package-info.java",
+    "robolectric/robolectric-processor/src/main/java/org/robolectric/annotation/processing/package-info.java",
+    "robolectric/robolectric-processor/src/main/java/org/robolectric/annotation/processing/validator/FoundOnImplementsValidator.java",
+    "robolectric/robolectric-processor/src/main/java/org/robolectric/annotation/processing/validator/ImplementationValidator.java",
+    "robolectric/robolectric-processor/src/main/java/org/robolectric/annotation/processing/validator/ImplementsValidator.java",
+    "robolectric/robolectric-processor/src/main/java/org/robolectric/annotation/processing/validator/RealObjectValidator.java",
+    "robolectric/robolectric-processor/src/main/java/org/robolectric/annotation/processing/validator/ResetterValidator.java",
+    "robolectric/robolectric-processor/src/main/java/org/robolectric/annotation/processing/validator/Validator.java",
+    "robolectric/robolectric-processor/src/main/java/org/robolectric/annotation/processing/validator/package-info.java",
+  ]
+}
+
+java_library("robolectric_resources_java") {
+  testonly = true
+  deps = [
+    ":android-all-5.0.0_r2-robolectric-1",
+    ":robolectric_annotations_java",
+    ":robolectric_utils_java",
+    "//third_party/intellij:intellij_annotations_java",
+  ]
+  java_files = [
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/RuntimeEnvironment.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/ShadowsAdapter.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/manifest/ActivityData.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/manifest/AndroidManifest.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/manifest/BroadcastReceiverData.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/manifest/ContentProviderData.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/manifest/IntentFilterData.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/manifest/MetaData.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/AttrData.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/AttrResourceLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/Attribute.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/ColorResourceLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/DocumentLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/DrawableNode.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/DrawableResourceLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/FileFsFile.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/FileTypedResource.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/Fs.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/FsFile.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/MenuNode.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/MergedResourceIndex.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/OpaqueFileLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/OverlayResourceIndex.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/OverlayResourceLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/PackageResourceLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/Plural.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/PluralResourceLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/PreferenceLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/PreferenceNode.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/RawResourceLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/ResBunch.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/ResBundle.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/ResName.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/ResType.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/ResourceExtractor.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/ResourceIndex.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/ResourceLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/ResourcePath.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/ResourceRemapper.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/ResourceValueConverter.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/RoutingResourceLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/StringResources.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/Style.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/StyleData.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/StyleResourceLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/TypedResource.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/ValueResourceLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/XResourceLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/XmlBlockLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/XmlLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/XpathResourceXmlLoader.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/builder/ResourceParser.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/builder/RobolectricPackageManager.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/res/builder/XmlBlock.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/shadows/Converter.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/shadows/ResourceHelper.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/shadows/RoboAttributeSet.java",
+    "robolectric/robolectric-resources/src/main/java/org/robolectric/shadows/RoboLayoutInflater.java",
+  ]
+}
+
+java_library("robolectric_utils_java") {
+  testonly = true
+  deps = [
+    ":android-all-5.0.0_r2-robolectric-1",
+    ":robolectric_annotations_java",
+    "//third_party/accessibility_test_framework:accessibility_test_framework_java",
+    "//third_party/hamcrest:hamcrest_core_java",
+    "//third_party/hamcrest:hamcrest_integration_java",
+    "//third_party/junit:junit",
+    "//third_party/ow2_asm:asm_commons_java",
+    "//third_party/ow2_asm:asm_java",
+  ]
+  java_files = [
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/internal/Shadow.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/internal/ShadowConstants.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/internal/ShadowExtractor.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/internal/ShadowProvider.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/internal/ShadowedObject.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/internal/bytecode/DirectObjectMarker.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/AccessibilityUtil.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/Function.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/Join.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/Logger.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/NamedStream.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/Pair.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/ReflectionHelpers.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/Scheduler.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/SimpleFuture.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/SoftThreadLocal.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/Strftime.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/Strings.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/TempDirectory.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/TimeUtils.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/Transcript.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/Util.java",
+    "robolectric/robolectric-utils/src/main/java/org/robolectric/util/package-info.java",
+  ]
+}
+
+template_files = [
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/android/app/RobolectricActivityManager.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/android/hardware/display/RoboDisplayManager.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/fakes/BaseCursor.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/fakes/RoboSensorManager.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/fakes/RoboVibrator.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/fakes/RoboWebSettings.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowAccessibilityManager.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowAccountManager.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowAlarmManager.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowAssetManager.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowBackgroundThread.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowBluetoothAdapter.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowClipboardManager.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowConnectivityManager.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowContextImpl.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowCursorWindow.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowCursorWrapper.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowDateIntervalFormat.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowDisplay.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowDisplayManagerGlobal.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowEnvironment.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowICU.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowLocaleData.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowMemoryMappedFile.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowMessage.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowMessageQueue.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowNotification.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowParcel.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowPowerManager.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowRenderNode.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowSQLiteConnection.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowSettings.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowSmsManager.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowStatFs.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowStaticLayout.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowTime.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowTypeface.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowWebView.java.vm",
+  "robolectric/robolectric-shadows/shadows-core/src/main/resources/org/robolectric/shadows/ShadowWindowManagerGlobal.java.vm",
+]
+
+processed_template_files = []
+foreach(t, template_files) {
+  gen_dir = get_path_info(t, "gen_dir")
+  name = get_path_info(t, "name")
+  processed_template_files += [ "$gen_dir/$name" ]
+}
+
+java_binary("robolectric_template_processor") {
+  testonly = true
+  java_files = [
+    "template_processor/src/org/chromium/testing/robolectric/template/ProcessRobolectricTemplate.java",
+    "template_processor/src/org/chromium/testing/robolectric/template/ProcessTemplateArgParser.java",
+  ]
+  main_class =
+      "org.chromium.testing.robolectric.template.ProcessRobolectricTemplate"
+  deps = [
+    "//third_party/apache_velocity:apache_velocity_java",
+  ]
+}
+
+action("process_robolectric_templates") {
+  testonly = true
+
+  api_level = "21"
+  base_template_dir = rebase_path(".", root_build_dir)
+  base_template_output_dir = rebase_path("$target_gen_dir", root_build_dir)
+  script = "$root_build_dir/bin/robolectric_template_processor"
+  args = [
+    "--api-level",
+    api_level,
+    "--base-template-dir",
+    base_template_dir,
+    "--output-dir",
+    base_template_output_dir,
+  ]
+  inputs = template_files
+  outputs = processed_template_files
+
+  deps = [
+    ":robolectric_template_processor",
+  ]
+}
+
+java_library("shadows-core-3.0") {
+  testonly = true
+  processors_javac =
+      [ "org.robolectric.annotation.processing.RobolectricProcessor" ]
+  processor_args_javac =
+      [ "org.robolectric.annotation.processing.shadowPackage=org.robolectric" ]
+  provider_configurations = [
+    "robolectric/robolectric-shadows/shadows-core/src/main/resources/META-INF/services/org.robolectric.ShadowsAdapter",
+
+    # TODO(mikecase): Switch to use the actual org.robolectric.internal.ShadowProvider file generated
+    # at compile time.
+    "robolectric/robolectric-processor/src/test/resources/META-INF/services/org.robolectric.internal.ShadowProvider",
+  ]
+  additional_jar_files = [
+    rebase_path("../sqlite4java/lib/linux-x86_64/libsqlite4java.so") +
+        ":linux-x86_64/libsqlite4java.so",
+    rebase_path("../sqlite4java/lib/linux-x86/libsqlite4java.so") +
+        ":linux-x86/libsqlite4java.so",
+    rebase_path("../sqlite4java/lib/mac-x86_64/libsqlite4java.jnilib") +
+        ":mac-x86_64/libsqlite4java.jnilib",
+    rebase_path("../sqlite4java/lib/windows-x86/sqlite4java.dll") +
+        ":windows-x86/sqlite4java.dll",
+    rebase_path("../sqlite4java/lib/windows-x86_64/sqlite4java.dll") +
+        ":windows-x86_64/sqlite4java.dll",
+  ]
+  java_files = [
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/fakes/RoboCursor.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/fakes/RoboIntentSender.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/fakes/RoboMenu.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/fakes/RoboMenuItem.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/fakes/RoboSharedPreferences.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/fakes/RoboSubMenu.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/fakes/package-info.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/CoreShadowsAdapter.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/Provider.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAbsListView.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAbsSeekBar.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAbsSpinner.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAbsoluteLayout.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAbstractCursor.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAccessibilityService.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowActivity.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowActivityGroup.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowActivityManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowActivityManagerNative.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowActivityThread.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAdapterView.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAddress.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAlertController.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAlertDialog.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAndroidBidi.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAndroidHttpClient.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAnimationBridge.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAnimationUtils.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAppWidgetHost.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAppWidgetHostView.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAppWidgetManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowApplication.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowArrayAdapter.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAsyncTask.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAsyncTaskBridge.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAsyncTaskLoader.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAudioEffect.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowAudioManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowBaseAdapter.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowBinder.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowBinderBridge.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowBitmap.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowBitmapDrawable.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowBitmapFactory.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowBitmapShader.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowBluetoothDevice.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowBroadcastReceiver.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowBundle.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowCamera.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowCanvas.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowChoreographer.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowColor.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowColorMatrix.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowColorMatrixColorFilter.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowCompoundButton.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowConfiguration.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowContentObserver.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowContentProvider.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowContentProviderClient.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowContentProviderOperation.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowContentProviderResult.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowContentResolver.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowContentUris.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowContext.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowContextThemeWrapper.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowContextWrapper.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowCookieManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowCookieSyncManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowCornerPathEffect.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowCountDownTimer.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowCursorAdapter.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowDashPathEffect.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowDateFormat.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowDatePickerDialog.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowDebug.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowDialog.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowDownloadManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowDrawable.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowEdgeEffect.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowExifInterface.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowExpandableListView.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowFilter.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowFloatMath.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowFrameLayout.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowGestureDetector.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowGradientDrawable.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowHandler.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowHttpResponseCache.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowImageView.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowInputDevice.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowInputEvent.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowInputMethodManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowIntent.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowIntentFilter.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowIntentSender.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowIntentService.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowJsPromptResult.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowJsResult.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowKeyCharacterMap.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowKeyguardManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowLayoutAnimationController.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowLinearGradient.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowLinearLayout.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowLinkMovementMethod.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowListPopupWindow.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowListView.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowLocalActivityManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowLocation.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowLocationManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowLog.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowLooper.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowMatrix.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowMediaMetadataRetriever.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowMediaPlayer.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowMediaRecorder.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowMediaRouter.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowMediaScannerConnection.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowMediaStore.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowMessenger.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowMimeTypeMap.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowMotionEvent.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowNetworkInfo.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowNfcAdapter.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowNinePatch.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowNotificationManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowNumberPicker.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowObjectAnimator.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowOverScroller.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPaint.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowParcelFileDescriptor.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPath.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPendingIntent.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPhoneWindow.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPopupMenu.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPopupWindow.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPorterDuffColorFilter.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPreference.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPreferenceActivity.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowPreferenceManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowProcess.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowProgressBar.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowProgressDialog.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowRegion.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowRelativeLayout.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowRemoteCallbackList.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowRemoteViews.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowResolveInfo.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowResourceCursorAdapter.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowResources.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowResultReceiver.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowScaleGestureDetector.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowScanResult.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowScrollView.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowScroller.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowSearchManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowSeekBar.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowSensorManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowService.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowServiceManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowSimpleCursorAdapter.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowSocketTagger.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowSpannableStringBuilder.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowSpellChecker.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowSslErrorHandler.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowStateListDrawable.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowStrictMode.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowSurface.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowSurfaceView.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowSystemClock.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowSystemProperties.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowTabActivity.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowTabHost.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowTabWidget.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowTelephonyManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowTextPaint.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowTextToSpeech.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowTextView.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowTimePickerDialog.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowToast.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowTouchDelegate.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowTrafficStats.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowTypedArray.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowVMRuntime.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowValueAnimator.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowVelocityTracker.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowVideoView.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowView.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowViewAnimator.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowViewConfiguration.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowViewGroup.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowViewRootImpl.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowViewTreeObserver.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowWallpaperManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowWebSyncManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowWebViewDatabase.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowWifiConfiguration.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowWifiInfo.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowWifiManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowWindow.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowWindowManager.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowWindowManagerImpl.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowZoomButtonsController.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/package-info.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/util/AppSingletonizer.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/util/DataSource.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/util/PreferenceBuilder.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/util/SQLiteLibraryLoader.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/util/package-info.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/util/concurrent/RoboExecutorService.java",
+    "robolectric/robolectric-shadows/shadows-core/src/main/java/org/robolectric/util/concurrent/package-info.java",
+  ]
+  java_files += processed_template_files
+
+  deps = [
+    ":android-all-5.0.0_r2-robolectric-1",
+    ":process_robolectric_templates",
+    ":robolectric_annotations_java",
+    ":robolectric_processor_java",
+    ":robolectric_resources_java",
+    ":robolectric_utils_java",
+    "//build/android:sun_tools_java",
+    "//third_party/guava:guava_java",
+    "//third_party/icu4j:icu4j_java",
+    "//third_party/intellij:intellij_annotations_java",
+    "//third_party/sqlite4java:sqlite4java_java",
+  ]
+}
+
+java_library("shadows-multidex-3.0") {
+  testonly = true
+  processors_javac =
+      [ "org.robolectric.annotation.processing.RobolectricProcessor" ]
+  processor_args_javac = [ "org.robolectric.annotation.processing.shadowPackage=org.robolectric.shadows.multidex" ]
+  provider_configurations = [
+    # TODO(mikecase): Switch to use the actual org.robolectric.internal.ShadowProvider file generated
+    # at compile time.
+    "robolectric/robolectric-processor/src/test/resources/META-INF/services/org.robolectric.internal.ShadowProvider",
+  ]
+  java_files = [
+    "robolectric/robolectric-shadows/shadows-multidex/src/main/java/org/robolectric/shadows/multidex/ShadowMultiDex.java",
+    "robolectric/robolectric-shadows/shadows-multidex/src/main/java/org/robolectric/shadows/multidex/package-info.java",
+  ]
+
+  deps = [
+    ":android-all-5.0.0_r2-robolectric-1",
+    ":robolectric_annotations_java",
+    ":robolectric_processor_java",
+    ":robolectric_utils_java",
+    "//build/android:sun_tools_java",
+    "//third_party/android_tools:android_support_multidex_java",
+    "//third_party/guava:guava_java",
+  ]
+}
diff --git a/third_party/robolectric/README.chromium b/third_party/robolectric/README.chromium
index 10aeba31..c1ab163c 100644
--- a/third_party/robolectric/README.chromium
+++ b/third_party/robolectric/README.chromium
@@ -1,11 +1,15 @@
 Name: Robolectric 
 URL: http://robolectric.org
-Version: 2.4
+Version: 3.0
 License: Apache 2.0 
 License File: NOT_SHIPPED
 Security Critical: no
 License Android Compatible: yes
-Description: Robolectric is a unit test framework for Android. To update the
-robolectric jars, go to robolectric.org/download and follow link to
-robolectric-X.X.X-jar-with-dependencies.jar.
-Local Modifications: None
+Description: Robolectric is a unit test framework for Android.
+Local Modifications:
+- Removed Robolectric's dependence on Maven jars.
+- Switched Robolectric's XML parsing logic from using the vtd-xml library to
+  using the org.w3c.dom package.
+- Hardcoded version number in robolectric-version.properties.
+- Hardcoded ShadowProvider service config file. This file is normally generated
+  at compile time but it is difficult to use the generated file with GN.
\ No newline at end of file
diff --git a/third_party/robolectric/lib/android-all-4.3_r2-robolectric-0.jar.sha1 b/third_party/robolectric/lib/android-all-4.3_r2-robolectric-0.jar.sha1
new file mode 100644
index 0000000..11ead144
--- /dev/null
+++ b/third_party/robolectric/lib/android-all-4.3_r2-robolectric-0.jar.sha1
@@ -0,0 +1 @@
+1231c61c42da2b1db9cbe13e449251f0db318e46
\ No newline at end of file
diff --git a/third_party/robolectric/lib/android-all-5.0.0_r2-robolectric-1.jar.sha1 b/third_party/robolectric/lib/android-all-5.0.0_r2-robolectric-1.jar.sha1
new file mode 100644
index 0000000..bbffefc
--- /dev/null
+++ b/third_party/robolectric/lib/android-all-5.0.0_r2-robolectric-1.jar.sha1
@@ -0,0 +1 @@
+7c63cd7aeb55d63e3e208b77882831c7ac588ed8
\ No newline at end of file
diff --git a/third_party/robolectric/lib/json-20080701.jar.sha1 b/third_party/robolectric/lib/json-20080701.jar.sha1
new file mode 100644
index 0000000..2bc52d8
--- /dev/null
+++ b/third_party/robolectric/lib/json-20080701.jar.sha1
@@ -0,0 +1 @@
+d652f102185530c93b66158b1859f35d45687258
\ No newline at end of file
diff --git a/third_party/robolectric/lib/robolectric-2.4-jar-with-dependencies.jar.sha1 b/third_party/robolectric/lib/robolectric-2.4-jar-with-dependencies.jar.sha1
new file mode 100644
index 0000000..8090edf
--- /dev/null
+++ b/third_party/robolectric/lib/robolectric-2.4-jar-with-dependencies.jar.sha1
@@ -0,0 +1 @@
+53663a79a5a8adc2cbc4858f92a74286cd283976
\ No newline at end of file
diff --git a/third_party/robolectric/lib/tagsoup-1.2.jar.sha1 b/third_party/robolectric/lib/tagsoup-1.2.jar.sha1
new file mode 100644
index 0000000..cea2788
--- /dev/null
+++ b/third_party/robolectric/lib/tagsoup-1.2.jar.sha1
@@ -0,0 +1 @@
+639fd364750d7363c85797dc944b4a80f78fa684
\ No newline at end of file
diff --git a/third_party/robolectric/template_processor/src/org/chromium/testing/robolectric/template/ProcessRobolectricTemplate.java b/third_party/robolectric/template_processor/src/org/chromium/testing/robolectric/template/ProcessRobolectricTemplate.java
new file mode 100644
index 0000000..db72e49
--- /dev/null
+++ b/third_party/robolectric/template_processor/src/org/chromium/testing/robolectric/template/ProcessRobolectricTemplate.java
@@ -0,0 +1,88 @@
+// 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.
+
+package org.chromium.testing.robolectric.template;
+
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.Velocity;
+import org.apache.velocity.exception.VelocityException;
+import org.apache.velocity.runtime.RuntimeConstants;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.nio.file.PathMatcher;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.FileSystems;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class to process Robolectric template (*.vm) files using Apache Velocity.
+ */
+public final class ProcessRobolectricTemplate {
+
+    private ProcessRobolectricTemplate() {
+    }
+
+    public static void main(String[] args) {
+        final ProcessTemplateArgParser parser = ProcessTemplateArgParser.parse(args);
+
+        Velocity.setProperty(RuntimeConstants.RESOURCE_LOADER, "file");
+        Velocity.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH,
+                parser.getBaseTemplateDir().toString());
+        Velocity.init();
+
+        final VelocityContext context = new VelocityContext();
+        int api = parser.getApiLevel();
+        context.put("api", api);
+        if (api >= 21) {
+            context.put("ptrClass", "long");
+            context.put("ptrClassBoxed", "Long");
+        } else {
+            context.put("ptrClass", "int");
+            context.put("ptrClassBoxed", "Integer");
+        }
+
+        try {
+            final PathMatcher templatePathMatcher =
+                    FileSystems.getDefault().getPathMatcher("glob:" + "**/*.vm");
+            Files.walkFileTree(parser.getBaseTemplateDir(), new SimpleFileVisitor<Path>() {
+                @Override
+                public FileVisitResult visitFile(
+                        Path path, BasicFileAttributes attrs) throws IOException {
+                    if (templatePathMatcher.matches(path)) {
+                        processTemplate(context, path, parser.getBaseTemplateDir(), parser.getOutputDir());
+                    }
+                    return FileVisitResult.CONTINUE;
+                }
+            });
+        } catch (IOException e) {
+            System.err.println("Error processing template files for Robolectric! " + e.toString());
+        }
+    }
+
+    private static void processTemplate(VelocityContext context, Path templateFile, Path baseTemplateDir, Path outputDir) throws IOException {
+        final StringWriter stringWriter = new StringWriter();
+        Template template = Velocity.getTemplate(baseTemplateDir.relativize(templateFile).toString(), "UTF-8");
+        template.merge(context, stringWriter);
+
+        String relativeOutputFile = templateFile.toString().replace(baseTemplateDir.toString(), "").replace(".vm", "");
+        if (relativeOutputFile.startsWith("/")) {
+            relativeOutputFile = relativeOutputFile.substring(1);
+        }
+        Path outputFile = outputDir.resolve(relativeOutputFile);
+        if (!Files.exists(outputFile.getParent())) {
+            Files.createDirectories(outputFile.getParent());
+        }
+        Files.write(outputFile, stringWriter.toString().getBytes("UTF-8"));
+    }
+}
\ No newline at end of file
diff --git a/third_party/robolectric/template_processor/src/org/chromium/testing/robolectric/template/ProcessTemplateArgParser.java b/third_party/robolectric/template_processor/src/org/chromium/testing/robolectric/template/ProcessTemplateArgParser.java
new file mode 100644
index 0000000..1df401a
--- /dev/null
+++ b/third_party/robolectric/template_processor/src/org/chromium/testing/robolectric/template/ProcessTemplateArgParser.java
@@ -0,0 +1,99 @@
+// 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.
+
+package org.chromium.testing.robolectric.template;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+/**
+ *  Parses command line arguments for ProcessRobolectricTemplate.
+ */
+public class ProcessTemplateArgParser {
+
+    private Path mBaseTemplateDir;
+    private Path mOutputDir;
+    private Integer mApiLevel;
+
+    public static ProcessTemplateArgParser parse(String[] args) {
+
+        ProcessTemplateArgParser parsed = new ProcessTemplateArgParser();
+
+        for (int i = 0; i < args.length; ++i) {
+            if (args[i].startsWith("-")) {
+                String argName;
+                if (args[i].startsWith("-", 1)) {
+                    argName = args[i].substring(2, args[i].length());
+                } else {
+                    argName = args[i].substring(1, args[i].length());
+                }
+                try {
+                    if ("output-dir".equals(argName)) {
+                        // Read the command line argument after the flag.
+                        parsed.setOutputDir(args[++i]);
+                    } else if ("base-template-dir".equals(argName)) {
+                        // Read the command line argument after the flag.
+                        parsed.setBaseTemplateDir(args[++i]);
+                    } else if ("api-level".equals(argName)) {
+                        // Read the command line argument after the flag.
+                        parsed.setApiLevel(args[++i]);
+                    } else {
+                        System.out.println("Ignoring flag: \"" + argName + "\"");
+                    }
+                } catch (ArrayIndexOutOfBoundsException e) {
+                    System.err.println("No value specified for argument \"" + argName + "\"");
+                    System.exit(1);
+                }
+            } else {
+                System.out.println("Ignoring argument: \"" + args[i] + "\"");
+            }
+        }
+
+        if (parsed.getOutputDir() == null) {
+            System.err.println("--output-dir argument required.");
+            System.exit(1);
+        }
+
+        if (parsed.getBaseTemplateDir() == null) {
+            System.err.println("--base-template-dir argument required.");
+            System.exit(1);
+        }
+
+        if (parsed.getApiLevel() == null) {
+            System.err.println("--api-level argument required.");
+            System.exit(1);
+        }
+        return parsed;
+    }
+
+    private ProcessTemplateArgParser() {
+        mBaseTemplateDir = null;
+        mOutputDir = null;
+        mApiLevel = null;
+    }
+
+    public Path getBaseTemplateDir() {
+        return mBaseTemplateDir;
+    }
+
+    public Path getOutputDir() {
+        return mOutputDir;
+    }
+
+    public Integer getApiLevel() {
+        return mApiLevel;
+    }
+
+    private void setBaseTemplateDir(String path) {
+        mBaseTemplateDir = Paths.get(path);
+    }
+
+    private void setOutputDir(String path) {
+        mOutputDir = Paths.get(path);
+    }
+
+    private void setApiLevel(String integer) {
+        mApiLevel = Integer.parseInt(integer);
+    }
+}
diff --git a/tools/clang/scripts/package.py b/tools/clang/scripts/package.py
index fb958605..acb31df 100755
--- a/tools/clang/scripts/package.py
+++ b/tools/clang/scripts/package.py
@@ -178,7 +178,7 @@
 
     opt_flags = []
     if sys.platform.startswith('linux'):
-      opt_flags += ['--lto-gold-plugin']
+      opt_flags += ['--lto']
     build_cmd = [sys.executable, os.path.join(THIS_DIR, 'update.py'),
                  '--bootstrap', '--force-local-build',
                  '--run-tests'] + opt_flags
@@ -217,6 +217,7 @@
                  'lib/clang/*/lib/darwin/*profile_osx*',
                  ])
   elif sys.platform.startswith('linux'):
+    want.append('bin/lld')
     # Copy the libstdc++.so.6 we linked Clang against so it can run.
     want.append('lib/libstdc++.so.6')
     # Copy only
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index 520903da..a7196497 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -437,8 +437,7 @@
 
   Checkout('LLVM', LLVM_REPO_URL + '/llvm/trunk', LLVM_DIR)
   Checkout('Clang', LLVM_REPO_URL + '/cfe/trunk', CLANG_DIR)
-  if sys.platform == 'win32' or use_head_revision:
-    Checkout('LLD', LLVM_REPO_URL + '/lld/trunk', LLD_DIR)
+  Checkout('LLD', LLVM_REPO_URL + '/lld/trunk', LLD_DIR)
   Checkout('compiler-rt', LLVM_REPO_URL + '/compiler-rt/trunk', COMPILER_RT_DIR)
   if sys.platform == 'darwin':
     # clang needs a libc++ checkout, else -stdlib=libc++ won't find includes
@@ -529,40 +528,34 @@
 
   # Build LLVM gold plugin with LTO. That speeds up the linker by ~10%.
   # We only use LTO for Linux now.
-  if args.bootstrap and args.lto_gold_plugin:
+  if args.bootstrap and args.lto:
     print 'Building LTO LLVM Gold plugin'
     if os.path.exists(LLVM_LTO_GOLD_PLUGIN_DIR):
       RmTree(LLVM_LTO_GOLD_PLUGIN_DIR)
     EnsureDirExists(LLVM_LTO_GOLD_PLUGIN_DIR)
     os.chdir(LLVM_LTO_GOLD_PLUGIN_DIR)
 
-    # Create a symlink to LLVMgold.so build in the previous step so that ar
-    # and ranlib could find it while linking LLVMgold.so with LTO.
-    EnsureDirExists(BFD_PLUGINS_DIR)
-    RunCommand(['ln', '-sf',
-                os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'lib', 'LLVMgold.so'),
-                os.path.join(BFD_PLUGINS_DIR, 'LLVMgold.so')])
-
     lto_cflags = ['-flto']
-    lto_ldflags = ['-fuse-ld=gold']
+    lto_cxxflags = ['-flto']
+    lto_ldflags = ['-fuse-ld=lld']
     if args.gcc_toolchain:
       # Tell the bootstrap compiler to use a specific gcc prefix to search
       # for standard library headers and shared object files.
       lto_cflags += ['--gcc-toolchain=' + args.gcc_toolchain]
+      lto_cxxflags += ['--gcc-toolchain=' + args.gcc_toolchain]
     lto_cmake_args = base_cmake_args + [
         '-DLLVM_BINUTILS_INCDIR=' + binutils_incdir,
         '-DCMAKE_C_COMPILER=' + cc,
         '-DCMAKE_CXX_COMPILER=' + cxx,
         '-DCMAKE_C_FLAGS=' + ' '.join(lto_cflags),
-        '-DCMAKE_CXX_FLAGS=' + ' '.join(lto_cflags),
+        '-DCMAKE_CXX_FLAGS=' + ' '.join(lto_cxxflags),
         '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(lto_ldflags),
         '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(lto_ldflags),
         '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(lto_ldflags)]
 
-    # We need to use the proper binutils which support LLVM Gold plugin.
+    # We need to use the proper binutils which support LTO.
     lto_env = os.environ.copy()
     lto_env['PATH'] = BINUTILS_BIN_DIR + os.pathsep + lto_env.get('PATH', '')
-
     RmCmakeCache('.')
     RunCommand(['cmake'] + lto_cmake_args + [LLVM_DIR], env=lto_env)
     RunCommand(['ninja', 'LLVMgold'], env=lto_env)
@@ -597,10 +590,27 @@
 
   CreateChromeToolsShim()
 
-  deployment_env = None
+  llvm_build_cflags = cflags
+  llvm_build_cxxflags = cxxflags
+  llvm_build_ldflags = ldflags
+  llvm_build_env = None
+  if sys.platform != 'win32':
+    # On Windows, the line below might add some Unicode entries
+    # and that will fail if passed into popen. See
+    # http://stackoverflow.com/questions/12253014/why-does-popen-fail-on-windows-if-the-env-parameter-contains-a-unicode-object
+    # Since we don't need to add anything into environment on Windows,
+    # just workaround this, until we moved into Python 3, where it's
+    # supposedly fixed.
+    llvm_build_env = os.environ.copy()
   if deployment_target:
-    deployment_env = os.environ.copy()
-    deployment_env['MACOSX_DEPLOYMENT_TARGET'] = deployment_target
+    llvm_build_env['MACOSX_DEPLOYMENT_TARGET'] = deployment_target
+  if args.lto:
+    # Put proper binutils for building with LTO
+    llvm_build_env['PATH'] = (BINUTILS_BIN_DIR + os.pathsep +
+                              llvm_build_env.get('PATH', ''))
+    llvm_build_cflags += ['-flto']
+    llvm_build_cxxflags += ['-flto']
+    llvm_build_ldflags += ['-fuse-ld=lld']
 
   cmake_args = []
   # TODO(thakis): Unconditionally append this to base_cmake_args instead once
@@ -610,11 +620,11 @@
   if cxx is not None: cc_args.append('-DCMAKE_CXX_COMPILER=' + cxx)
   cmake_args += base_cmake_args + [
       '-DLLVM_BINUTILS_INCDIR=' + binutils_incdir,
-      '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
-      '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags),
-      '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(ldflags),
-      '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(ldflags),
-      '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(ldflags),
+      '-DCMAKE_C_FLAGS=' + ' '.join(llvm_build_cflags),
+      '-DCMAKE_CXX_FLAGS=' + ' '.join(llvm_build_cxxflags),
+      '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(llvm_build_ldflags),
+      '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(llvm_build_ldflags),
+      '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(llvm_build_ldflags),
       '-DCMAKE_INSTALL_PREFIX=' + LLVM_BUILD_DIR,
       # TODO(thakis): Remove this once official builds pass -Wl,--build-id
       # explicitly, https://crbug.com/622775
@@ -626,7 +636,7 @@
   os.chdir(LLVM_BUILD_DIR)
   RmCmakeCache('.')
   RunCommand(['cmake'] + cmake_args + [LLVM_DIR],
-             msvc_arch='x64', env=deployment_env)
+             msvc_arch='x64', env=llvm_build_env)
 
   if args.gcc_toolchain:
     # Copy in the right stdlibc++.so.6 so clang can start.
@@ -666,8 +676,8 @@
     #cflags += ['-m32']
     #cxxflags += ['-m32']
   compiler_rt_args = base_cmake_args + [
-      '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
-      '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags)]
+      '-DCMAKE_C_FLAGS=' + ' '.join(llvm_build_cflags),
+      '-DCMAKE_CXX_FLAGS=' + ' '.join(llvm_build_cxxflags)]
   if sys.platform != 'win32':
     compiler_rt_args += ['-DLLVM_CONFIG_PATH=' +
                          os.path.join(LLVM_BUILD_DIR, 'bin', 'llvm-config'),
@@ -677,7 +687,7 @@
   RmCmakeCache('.')
   RunCommand(['cmake'] + compiler_rt_args +
              [LLVM_DIR if sys.platform == 'win32' else COMPILER_RT_DIR],
-             msvc_arch='x86', env=deployment_env)
+             msvc_arch='x86', env=llvm_build_env)
   RunCommand(['ninja', 'compiler-rt'], msvc_arch='x86')
 
   # Copy select output to the main tree.
@@ -808,8 +818,8 @@
   parser.add_argument('--gcc-toolchain', help='set the version for which gcc '
                       'version be used for building; --gcc-toolchain=/opt/foo '
                       'picks /opt/foo/bin/gcc')
-  parser.add_argument('--lto-gold-plugin', action='store_true',
-                      help='build LLVM Gold plugin with LTO')
+  parser.add_argument('--lto', action='store_true',
+                      help='build Clang toolchain with LTO')
   parser.add_argument('--llvm-force-head-revision', action='store_true',
                       help=('use the revision in the repo when printing '
                             'the revision'))
@@ -828,12 +838,12 @@
                       default=sys.platform.startswith('linux'))
   args = parser.parse_args()
 
-  if args.lto_gold_plugin and not args.bootstrap:
-    print '--lto-gold-plugin requires --bootstrap'
+  if args.lto and not args.bootstrap:
+    print '--lto requires --bootstrap'
     return 1
-  if args.lto_gold_plugin and not sys.platform.startswith('linux'):
-    print '--lto-gold-plugin is only effective on Linux. Ignoring the option.'
-    args.lto_gold_plugin = False
+  if args.lto and not sys.platform.startswith('linux'):
+    print '--lto is only effective on Linux. Ignoring the option.'
+    args.lto = False
 
   if args.if_needed:
     is_clang_required = False
diff --git a/tools/grit/grit/node/message.py b/tools/grit/grit/node/message.py
index 48cd1c79..e3024fb 100755
--- a/tools/grit/grit/node/message.py
+++ b/tools/grit/grit/node/message.py
@@ -11,15 +11,16 @@
 
 from grit.node import base
 
-import grit.format.rc_header
-import grit.format.rc
-
 from grit import clique
 from grit import exception
 from grit import lazy_re
 from grit import tclib
 from grit import util
 
+
+# Matches exactly three dots ending a line or followed by whitespace.
+_ELLIPSIS_PATTERN = lazy_re.compile(r'(?<!\.)\.\.\.(?=$|\s)')
+_ELLIPSIS_SYMBOL = u'\u2026'  # Ellipsis
 # Finds whitespace at the start and end of a string which can be multiline.
 _WHITESPACE = lazy_re.compile('(?P<start>\s*)(?P<body>.+?)(?P<end>\s*)\Z',
                               re.DOTALL | re.MULTILINE)
@@ -54,6 +55,9 @@
     # Example: "foo=5 bar baz=100"
     self.formatter_data = {}
 
+    # Whether or not to convert ... -> U+2026 within Translate().
+    self._replace_ellipsis = False
+
   def _IsValidChild(self, child):
     return isinstance(child, (PhNode))
 
@@ -68,6 +72,11 @@
       return False
     return True
 
+  def SetReplaceEllipsis(self, value):
+    '''Sets whether to replace ... with \u2026.
+    '''
+    self._replace_ellipsis = value
+
   def MandatoryAttributes(self):
     return ['name|offset']
 
@@ -200,6 +209,8 @@
                                          self.PseudoIsAllowed(),
                                          self.ShouldFallbackToEnglish()
                                          ).GetRealContent()
+    if self._replace_ellipsis:
+      msg = _ELLIPSIS_PATTERN.sub(_ELLIPSIS_SYMBOL, msg)
     return msg.replace('[GRITLANGCODE]', lang)
 
   def NameOrOffset(self):
diff --git a/tools/grit/grit/node/message_unittest.py b/tools/grit/grit/node/message_unittest.py
index a058257a..3592af37 100755
--- a/tools/grit/grit/node/message_unittest.py
+++ b/tools/grit/grit/node/message_unittest.py
@@ -8,12 +8,16 @@
 
 import os
 import sys
-if __name__ == '__main__':
-  sys.path.append(os.path.join(os.path.dirname(__file__), '../..'))
-
 import unittest
 import StringIO
 
+if __name__ == '__main__':
+  # When executed as the main module, the first entry in sys.path will be
+  # the directory contain this module. This entry causes the io.py file in this
+  # directory to be selected whenever any file does "import io", rather than the
+  # system "io" module. As a work-around, remove the first sys.path entry.
+  sys.path[0] = os.path.join(os.path.dirname(__file__), '../..')
+
 from grit import tclib
 from grit import util
 from grit.node import message
@@ -85,6 +89,18 @@
       self.failUnlessEqual(expected_formatter_data[key],
                            msg.formatter_data[key])
 
+  def testReplaceEllipsis(self):
+    root = util.ParseGrdForUnittest('''
+        <messages>
+        <message name="IDS_GREETING" desc="">
+        A...B.... <ph name="PH">%s<ex>A</ex></ph>... B... C...
+        </message>
+        </messages>''')
+    msg, = root.GetChildrenOfType(message.MessageNode)
+    msg.SetReplaceEllipsis(True)
+    content = msg.Translate('en')
+    self.failUnlessEqual(u'A...B.... %s\u2026 B\u2026 C\u2026', content)
+
 
 if __name__ == '__main__':
   unittest.main()
diff --git a/tools/grit/grit/tool/build.py b/tools/grit/grit/tool/build.py
index 65a966f..51d3341 100755
--- a/tools/grit/grit/tool/build.py
+++ b/tools/grit/grit/tool/build.py
@@ -15,9 +15,12 @@
 import sys
 
 from grit import grd_reader
-from grit import util
-from grit.tool import interface
 from grit import shortcuts
+from grit import util
+from grit.node import include
+from grit.node import message
+from grit.node import structure
+from grit.tool import interface
 
 
 # It would be cleaner to have each module register itself, but that would
@@ -145,10 +148,12 @@
     output_all_resource_defines = None
     write_only_new = False
     depend_on_stamp = False
+    replace_ellipsis = True
     (own_opts, args) = getopt.getopt(args, 'a:o:D:E:f:w:t:h:',
         ('depdir=','depfile=','assert-file-list=',
          'output-all-resource-defines',
          'no-output-all-resource-defines',
+         'no-replace-ellipsis',
          'depend-on-stamp',
          'write-only-new='))
     for (key, val) in own_opts:
@@ -176,6 +181,8 @@
         output_all_resource_defines = True
       elif key == '--no-output-all-resource-defines':
         output_all_resource_defines = False
+      elif key == '--no-replace-ellipsis':
+        replace_ellipsis = False
       elif key == '-t':
         target_platform = val
       elif key == '-h':
@@ -227,6 +234,13 @@
     if rc_header_format:
       self.res.AssignRcHeaderFormat(rc_header_format)
     self.res.RunGatherers()
+
+    # Replace ... with the single-character version. http://crbug.com/621772
+    if replace_ellipsis:
+      for node in self.res:
+        if isinstance(node, message.MessageNode):
+          node.SetReplaceEllipsis(True)
+
     self.Process()
 
     if assert_output_files:
@@ -267,9 +281,6 @@
   def AddWhitelistTags(start_node, whitelist_names):
     # Walk the tree of nodes added attributes for the nodes that shouldn't
     # be written into the target files (skip markers).
-    from grit.node import include
-    from grit.node import message
-    from grit.node import structure
     for node in start_node:
       # Same trick data_pack.py uses to see what nodes actually result in
       # real items.
diff --git a/tools/ipc_fuzzer/fuzzer/BUILD.gn b/tools/ipc_fuzzer/fuzzer/BUILD.gn
index 17cadc1c..35adabd 100644
--- a/tools/ipc_fuzzer/fuzzer/BUILD.gn
+++ b/tools/ipc_fuzzer/fuzzer/BUILD.gn
@@ -24,5 +24,6 @@
     # Compiling fuzzer.cc with ASan takes too long, see
     # http://crbug.com/360158.
     configs -= [ "//build/config/sanitizers:default_sanitizer_flags" ]
+    configs += [ "//build/config/sanitizers:default_sanitizer_ldflags" ]
   }
 }
diff --git a/tools/json_schema_compiler/feature_compiler.py b/tools/json_schema_compiler/feature_compiler.py
index c15e232..7970d47 100644
--- a/tools/json_schema_compiler/feature_compiler.py
+++ b/tools/json_schema_compiler/feature_compiler.py
@@ -54,7 +54,10 @@
 #include "%(header_file_path)s"
 
 #include "extensions/common/features/api_feature.h"
+#include "extensions/common/features/behavior_feature.h"
 #include "extensions/common/features/complex_feature.h"
+#include "extensions/common/features/manifest_feature.h"
+#include "extensions/common/features/permission_feature.h"
 
 namespace extensions {
 
@@ -192,7 +195,7 @@
 
 # These keys are used to find the parents of different features, but are not
 # compiled into the features themselves.
-IGNORED_KEYS = ['noparent', 'default_parent']
+IGNORED_KEYS = ['default_parent']
 
 # By default, if an error is encountered, assert to stop the compilation. This
 # can be disabled for testing.
@@ -330,6 +333,10 @@
 
     if cpp_value:
       self.feature_values[key] = cpp_value
+    elif key in self.feature_values:
+      # If the key is empty and this feature inherited a value from its parent,
+      # remove the inherited value.
+      del self.feature_values[key]
 
   def SetParent(self, parent):
     """Sets the parent of this feature, and inherits all properties from that
@@ -396,8 +403,17 @@
   def _FindParent(self, feature_name, feature_value):
     """Checks to see if a feature has a parent. If it does, returns the
     parent."""
+    no_parent = False
+    if type(feature_value) is list:
+      no_parent_values = ['noparent' in v for v in feature_value]
+      no_parent = all(no_parent_values)
+      assert no_parent or not any(no_parent_values), (
+              '"%s:" All child features must contain the same noparent value' %
+                  feature_name)
+    else:
+      no_parent = 'noparent' in feature_value
     sep = feature_name.rfind('.')
-    if sep is -1 or 'noparent' in feature_value:
+    if sep is -1 or no_parent:
       return None
     parent_name = feature_name[:sep]
     if parent_name not in self._features:
@@ -431,19 +447,27 @@
       # This doesn't handle nested complex features. I think that's probably for
       # the best.
       for v in feature_value:
-        feature = Feature(feature_name)
-        if parent:
-          feature.SetParent(parent)
-        feature.Parse(v)
-        feature_list.append(feature)
+        try:
+          feature = Feature(feature_name)
+          if parent:
+            feature.SetParent(parent)
+          feature.Parse(v)
+          feature_list.append(feature)
+        except:
+          print('Failure to parse feature "%s"' % feature_name)
+          raise
       self._features[feature_name] = feature_list
       return
 
-    feature = Feature(feature_name)
-    if parent:
-      feature.SetParent(parent)
-    feature.Parse(feature_value)
-    self._features[feature_name] = feature
+    try:
+      feature = Feature(feature_name)
+      if parent:
+        feature.SetParent(parent)
+      feature.Parse(feature_value)
+      self._features[feature_name] = feature
+    except:
+      print('Failure to parse feature "%s"' % feature_name)
+      raise
 
   def Compile(self):
     """Parses all features after loading the input files."""
diff --git a/tools/json_schema_compiler/test/BUILD.gn b/tools/json_schema_compiler/test/BUILD.gn
index e6d9cc0..fe124f0e 100644
--- a/tools/json_schema_compiler/test/BUILD.gn
+++ b/tools/json_schema_compiler/test/BUILD.gn
@@ -35,9 +35,9 @@
 }
 
 if (enable_extensions) {
-  json_features("features_test") {
+  json_features("features_compiler_test") {
     feature_class = "APIFeature"
-    provider_class = "TestAPIFeatureProvider"
+    provider_class = "CompilerTestFeatureProvider"
     sources = [
       "features_test.json",
       "features_test2.json",
@@ -65,7 +65,7 @@
   source_set("features_generation_test") {
     testonly = true
     public_deps = [
-      ":features_test",
+      ":features_compiler_test",
     ]
   }
 }
diff --git a/tools/json_schema_compiler/test/features_generation_unittest.cc b/tools/json_schema_compiler/test/features_generation_unittest.cc
index 7a175a0..087a344 100644
--- a/tools/json_schema_compiler/test/features_generation_unittest.cc
+++ b/tools/json_schema_compiler/test/features_generation_unittest.cc
@@ -7,7 +7,7 @@
 #include "extensions/common/features/feature.h"
 #include "extensions/common/features/simple_feature.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "tools/json_schema_compiler/test/features_test.h"
+#include "tools/json_schema_compiler/test/features_compiler_test.h"
 
 namespace extensions {
 
@@ -89,7 +89,7 @@
 }
 
 TEST(FeaturesGenerationTest, FeaturesTest) {
-  TestAPIFeatureProvider provider;
+  CompilerTestFeatureProvider provider;
 
   auto GetAPIFeature = [&provider](const std::string& name) {
     Feature* feature = provider.GetFeature(name);
@@ -125,6 +125,7 @@
         new version_info::Channel(version_info::Channel::BETA));
     comparator.platforms = {Feature::WIN_PLATFORM, Feature::MACOSX_PLATFORM};
     comparator.contexts = {Feature::BLESSED_EXTENSION_CONTEXT};
+    comparator.dependencies = {"permission:gamma"};
     comparator.extension_types = {Manifest::TYPE_EXTENSION};
     comparator.internal = true;
     comparator.CompareFeature(feature);
@@ -133,9 +134,9 @@
     // case that it specifies its own value. Thus, we reuse |comparator|.
     feature = GetAPIFeature("gamma.child");
     comparator.name = "gamma.child";
-    comparator.dependencies = {"permission:gamma.child"};
     comparator.whitelist = {"ccc"};
     comparator.platforms = {Feature::LINUX_PLATFORM};
+    comparator.dependencies.clear();
     comparator.CompareFeature(feature);
   }
   {
@@ -148,6 +149,18 @@
     comparator.CompareFeature(feature);
   }
   {
+    ComplexFeature* complex_feature = static_cast<ComplexFeature*>(
+        provider.GetFeature("gamma.complex_unparented"));
+    FeatureComparator comparator("gamma.complex_unparented");
+    comparator.contexts = {Feature::UNBLESSED_EXTENSION_CONTEXT};
+    comparator.channel.reset(
+        new version_info::Channel(version_info::Channel::STABLE));
+    // We cheat and have both children exactly the same for ease of comparing;
+    // complex features are tested more thoroughly below.
+    for (const auto& feature : complex_feature->features_)
+      comparator.CompareFeature(static_cast<SimpleFeature*>(feature.get()));
+  }
+  {
     APIFeature* feature = GetAPIFeature("delta");
     FeatureComparator comparator("delta");
     comparator.contexts = {Feature::BLESSED_EXTENSION_CONTEXT,
diff --git a/tools/json_schema_compiler/test/features_test.json b/tools/json_schema_compiler/test/features_test.json
index e727ec1..eeff28f3 100644
--- a/tools/json_schema_compiler/test/features_test.json
+++ b/tools/json_schema_compiler/test/features_test.json
@@ -17,12 +17,13 @@
     "channel": "beta",
     "platforms": ["win", "mac"],
     "contexts": ["blessed_extension"],
+    "dependencies": ["permission:gamma"],
     "extension_types": ["extension"],
     "internal": true
   },
   "gamma.child": {
     "whitelist": ["ccc"],
-    "dependencies": ["permission:gamma.child"],
+    "dependencies": [],
     "platforms": ["linux"]
   },
   "gamma.unparented": {
@@ -30,6 +31,15 @@
     "contexts": ["unblessed_extension"],
     "noparent": true
   },
+  "gamma.complex_unparented": [{
+    "channel": "stable",
+    "contexts": ["unblessed_extension"],
+    "noparent": true
+  }, {
+    "channel": "stable",
+    "contexts": ["unblessed_extension"],
+    "noparent": true
+  }],
   "delta": {
     "contexts": ["blessed_extension", "webui"],
     "matches": ["*://example.com/*"]
diff --git a/tools/json_schema_compiler/test/json_schema_compiler_tests.gyp b/tools/json_schema_compiler/test/json_schema_compiler_tests.gyp
index fcd6e83..c4e385c 100644
--- a/tools/json_schema_compiler/test/json_schema_compiler_tests.gyp
+++ b/tools/json_schema_compiler/test/json_schema_compiler_tests.gyp
@@ -50,9 +50,9 @@
       'type': 'static_library',
       'variables': {
         'feature_class': 'APIFeature',
-        'provider_class': 'TestAPIFeatureProvider',
+        'provider_class': 'CompilerTestFeatureProvider',
         'out_dir': 'tools/json_schema_compiler/test',
-        'out_base_filename': 'features_test',
+        'out_base_filename': 'features_compiler_test',
         'in_files': [
           'tools/json_schema_compiler/test/features_test.json',
           'tools/json_schema_compiler/test/features_test2.json',
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 0f798ce..385414e 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -914,6 +914,20 @@
   </description>
 </action>
 
+<action name="Android.LauncherShortcut.NewIncognitoTab">
+  <owner>twellington@chromium.org</owner>
+  <description>
+    User tapped on the 'New Incognito Tab' launcher shortcut option.
+  </description>
+</action>
+
+<action name="Android.LauncherShortcut.NewTab">
+  <owner>twellington@chromium.org</owner>
+  <description>
+    User tapped on the 'New Tab' launcher shortcut option.
+  </description>
+</action>
+
 <action name="Android.ManageSpace">
   <owner>dmurph@chromium.org</owner>
   <description>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 35c0485..f9264639 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -993,6 +993,17 @@
   </summary>
 </histogram>
 
+<histogram name="Arc.CumulativeUseTime" units="seconds">
+  <owner>elijahtaylor@google.com</owner>
+  <owner>mitsuji@google.com</owner>
+  <summary>
+    ARC use time. The use time is incremented in regular intervals while android
+    container is active. Reported at most once a day, at which point accumulated
+    time is reset (which means that sum of reported times for a OS version would
+    give an estimate of ARC usage time per OS version).
+  </summary>
+</histogram>
+
 <histogram name="Arc.IntentHandlerAction" enum="ArcIntentHandlerAction">
   <owner>elijahtaylor@google.com</owner>
   <owner>mitsuji@google.com</owner>
@@ -1405,6 +1416,16 @@
   <summary>The duration of mostly stationary long-duration touches.</summary>
 </histogram>
 
+<histogram name="Ash.SystemMenu.DefaultView.VisibleRows"
+    enum="SystemMenuDefaultViewRows">
+  <owner>bruthig@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <summary>
+    The visible rows displayed in the system menu's default view. Recorded each
+    time the menu is opened.
+  </summary>
+</histogram>
+
 <histogram name="Ash.SystemMenu.PercentageOfWorkAreaHeightCoveredByMenu"
     units="%">
   <owner>tdanderson@chromium.org</owner>
@@ -3660,6 +3681,11 @@
   <summary>Time spent on 2D canvas toDataURL API call.</summary>
 </histogram>
 
+<histogram name="Blink.ColorSpace.Destination" enum="Gamma">
+  <owner>msarett@chromium.org</owner>
+  <summary>Gamma properties of destination color space.</summary>
+</histogram>
+
 <histogram name="Blink.Compositing.UpdateTime" units="microseconds">
   <owner>paint-dev@chromium.org</owner>
   <summary>
@@ -23353,13 +23379,11 @@
   <owner>hajimehoshi@chromium.org</owner>
   <owner>kenjibaheux@google.com</owner>
   <owner>kouhei@chromium.org</owner>
-  <obsolete>
-    Deprecated 07/2016 and replaced with Memory.Browser.Large2.
-  </obsolete>
   <summary>
     The private working set used by the browser process.  Recorded once per UMA
     ping.  Note the existence of Memory.Browser.Large, which doesn't have
-    overflow issues.
+    overflow issues. TODO(rkaplow): This should be replaced with
+    Memory.Browser.Large2 in M54.
   </summary>
 </histogram>
 
@@ -23706,12 +23730,10 @@
   <owner>hajimehoshi@chromium.org</owner>
   <owner>kenjibaheux@google.com</owner>
   <owner>kouhei@chromium.org</owner>
-  <obsolete>
-    Deprecated 07/2016 and replaced with Memory.Renderer.Large2.
-  </obsolete>
   <summary>
     The private working set used by each renderer process.  Each renderer
-    process provides one sample.  Recorded once per UMA ping.
+    process provides one sample.  Recorded once per UMA ping. TODO(rkaplow):
+    This should be replaced with Memory.Renderer.Large2 in M54.
   </summary>
 </histogram>
 
@@ -35791,6 +35813,15 @@
   </summary>
 </histogram>
 
+<histogram name="NQE.CachedNetworkQualityAvailable" enum="BooleanAvailable">
+  <owner>tbansal@chromium.org</owner>
+  <owner>bengr@chromium.org</owner>
+  <summary>
+    Records if the cached network quality (from memory or from a persistent
+    source) was available. Recorded right after connection change event.
+  </summary>
+</histogram>
+
 <histogram name="NQE.CellularSignalStrengthAvailable" enum="BooleanAvailable">
   <owner>tbansal@chromium.org</owner>
   <owner>bengr@chromium.org</owner>
@@ -35862,6 +35893,20 @@
   </summary>
 </histogram>
 
+<histogram
+    name="NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff"
+    units="ms">
+  <owner>tbansal@chromium.org</owner>
+  <owner>bengr@chromium.org</owner>
+  <summary>
+    Records the difference between the HTTP RTT estimated by the external
+    estimate provider and the observed HTTP RTT. The HTTP RTT estimated by the
+    external estimate provider at the time of navigation start is compared with
+    the HTTP RTT observed during the specified time interval following the start
+    of the navigation.
+  </summary>
+</histogram>
+
 <histogram name="NQE.ExternalEstimateProviderStatus"
     enum="NQEExternalEstimateProviderStatus">
   <owner>bengr@chromium.org</owner>
@@ -59094,7 +59139,7 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SadTab.CrashCreated">
+<histogram name="Tabs.SadTab.CrashCreated" units="tabs">
   <owner>jamescook@chromium.org</owner>
   <summary>
     Cumulative number of times a tab crashed with &quot;Aw, Snap!&quot;,
@@ -59106,7 +59151,7 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SadTab.CrashDisplayed">
+<histogram name="Tabs.SadTab.CrashDisplayed" units="tabs">
   <owner>jamescook@chromium.org</owner>
   <summary>
     Cumulative number of times a tab crashed with &quot;Aw, Snap!&quot; and the
@@ -59117,7 +59162,7 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SadTab.KillCreated">
+<histogram name="Tabs.SadTab.KillCreated" units="tabs">
   <owner>jamescook@chromium.org</owner>
   <summary>
     Cumulative number of times a tab was killed with a &quot;He's dead,
@@ -59131,7 +59176,7 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SadTab.KillCreated.OOM">
+<histogram name="Tabs.SadTab.KillCreated.OOM" units="tabs">
   <owner>oshima@chromium.org</owner>
   <summary>
     Cumulative number of times a tab was killed with a &quot;He's dead,
@@ -59144,7 +59189,7 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SadTab.KillDisplayed">
+<histogram name="Tabs.SadTab.KillDisplayed" units="tabs">
   <owner>jamescook@chromium.org</owner>
   <summary>
     Cumulative number of times a tab was killed with a &quot;He's dead,
@@ -59155,7 +59200,7 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SadTab.KillDisplayed.OOM">
+<histogram name="Tabs.SadTab.KillDisplayed.OOM" units="tabs">
   <owner>oshima@chromium.org</owner>
   <summary>
     Cumulative number of times a tab was killed with a &quot;He's dead,
@@ -59167,7 +59212,30 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.SadTab.ReloadCount">
+<histogram name="Tabs.SadTab.OomCreated" units="tabs">
+  <owner>wfh@chromium.org</owner>
+  <summary>
+    Cumulative number of times a tab crashed with &quot;Aw, Snap!&quot;,
+    recorded once per tab oom event.  For example, a user who ran out of memory
+    in 3 tabs will record a count in the 1 bin, 2 bin, and 3 bin.  Thus each bin
+    N is the number of sessions where users experienced N or more oom events.
+    The user may not have actually seen the sad tab page, as it might have been
+    an inactive tab. Compare to Tabs.SadTab.OomDisplayed.
+  </summary>
+</histogram>
+
+<histogram name="Tabs.SadTab.OomDisplayed" units="tabs">
+  <owner>wfh@chromium.org</owner>
+  <summary>
+    Cumulative number of times a tab ran out of memory with &quot;Aw,
+    Snap!&quot; and the user saw the page, recorded once per tab oom event.  For
+    example, a user who ran out of memory in 3 tabs will record a count in the 1
+    bin, 2 bin, and 3 bin.  Thus each bin N is the number of sessions where
+    users experienced N or more oom events.  Compare to Tabs.SadTab.OomCreated.
+  </summary>
+</histogram>
+
+<histogram name="Tabs.SadTab.ReloadCount" units="tabs">
   <owner>jamescook@chromium.org</owner>
   <summary>
     The number of times a tab was reloaded because it was killed (usually by the
@@ -73454,7 +73522,8 @@
 <enum name="ExtensionBubbleAction" type="int">
   <int value="0" label="Learn more"/>
   <int value="1" label="Execute"/>
-  <int value="2" label="Dismiss"/>
+  <int value="2" label="Dismiss by user action"/>
+  <int value="3" label="Dismiss by deactivation"/>
 </enum>
 
 <enum name="ExtensionCreationFlags" type="int">
@@ -77210,6 +77279,7 @@
   <int value="1465" label="VisualViewportScrollFired"/>
   <int value="1466" label="VisualViewportResizeFired"/>
   <int value="1467" label="NodeGetRootNode"/>
+  <int value="1468" label="SlotChangeEventAddListener"/>
 </enum>
 
 <enum name="FetchRequestMode" type="int">
@@ -78212,6 +78282,15 @@
   <int value="8" label="Overflow"/>
 </enum>
 
+<enum name="Gamma" type="int">
+  <int value="0" label="kLinear_Gamma"/>
+  <int value="1" label="kSRGB_Gamma"/>
+  <int value="2" label="k2Dot2Curve_Gamma"/>
+  <int value="3" label="kNonStandard_Gamma"/>
+  <int value="4" label="kNull_Gamma"/>
+  <int value="5" label="kFail_Gamma"/>
+</enum>
+
 <enum name="GATTCharacteristicHash" type="int">
 <!-- Hash values can be produced using tool: bluetooth_metrics_hash (Only built via GN, not GYP) -->
 
@@ -92907,6 +92986,35 @@
   <int value="3" label="SSID"/>
 </enum>
 
+<enum name="SystemMenuDefaultViewRows" type="int">
+  <int value="0" label="NOT_RECORDED - Should not be recorded"/>
+  <int value="1" label="TEST - Should not be recorded"/>
+  <int value="2" label="Accessibility"/>
+  <int value="3" label="Audio"/>
+  <int value="4" label="Bluetooth"/>
+  <int value="5" label="Caps lock"/>
+  <int value="6" label="Cast"/>
+  <int value="7" label="Date"/>
+  <int value="8" label="Display settings"/>
+  <int value="9" label="Display brightness"/>
+  <int value="10" label="Enterprise"/>
+  <int value="11" label="IME"/>
+  <int value="12" label="Multi profile media"/>
+  <int value="13" label="Network"/>
+  <int value="14" label="Settings"/>
+  <int value="15" label="Update"/>
+  <int value="16" label="Power"/>
+  <int value="17" label="Rotation lock"/>
+  <int value="18" label="Screen capture"/>
+  <int value="19" label="Screen share"/>
+  <int value="20" label="Session length limit"/>
+  <int value="21" label="SMS"/>
+  <int value="22" label="Supervised user"/>
+  <int value="23" label="Tracing"/>
+  <int value="24" label="User"/>
+  <int value="25" label="VPN"/>
+</enum>
+
 <enum name="TabBackgroundLoadStatus" type="int">
   <int value="0" label="Loaded on creation and shown"/>
   <int value="1" label="Loaded on creation and lost"/>
@@ -98841,6 +98949,8 @@
       name="NQE.Accuracy.EffectiveConnectionType.EstimatedObservedDiff"/>
   <affected-histogram name="NQE.Accuracy.HttpRTT.EstimatedObservedDiff"/>
   <affected-histogram name="NQE.Accuracy.TransportRTT.EstimatedObservedDiff"/>
+  <affected-histogram
+      name="NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="NQE.Accuracy.Metric.AccuracyRecordingIntervals"
@@ -98867,6 +98977,10 @@
       name="NQE.Accuracy.TransportRTT.EstimatedObservedDiff.Negative"/>
   <affected-histogram
       name="NQE.Accuracy.TransportRTT.EstimatedObservedDiff.Positive"/>
+  <affected-histogram
+      name="NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff.Negative"/>
+  <affected-histogram
+      name="NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff.Positive"/>
 </histogram_suffixes>
 
 <histogram_suffixes
@@ -98951,6 +99065,18 @@
       name="NQE.Accuracy.TransportRTT.EstimatedObservedDiff.Positive.30"/>
   <affected-histogram
       name="NQE.Accuracy.TransportRTT.EstimatedObservedDiff.Positive.60"/>
+  <affected-histogram
+      name="NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff.Negative.15"/>
+  <affected-histogram
+      name="NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff.Negative.30"/>
+  <affected-histogram
+      name="NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff.Negative.60"/>
+  <affected-histogram
+      name="NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff.Positive.15"/>
+  <affected-histogram
+      name="NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff.Positive.30"/>
+  <affected-histogram
+      name="NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff.Positive.60"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="NQE.DifferentPercentiles" separator=".">
@@ -99532,6 +99658,14 @@
   <affected-histogram name="PerformanceMonitor.HighCPU"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="PermissionRequestGesture" separator=".">
+  <suffix name="Gesture" label="With user gesture"/>
+  <suffix name="NoGesture" label="Without user gesture"/>
+  <affected-histogram name="Permissions.Prompt.Accepted"/>
+  <affected-histogram name="Permissions.Prompt.Denied"/>
+  <affected-histogram name="Permissions.Prompt.Shown"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="PermissionTypes" separator=".">
   <suffix name="MidiSysEx" label="Midi SysEx permsision actions"/>
   <suffix name="PushMessaging" label="Push messaging permission actions"/>
diff --git a/tools/perf/benchmarks/silk_flags.py b/tools/perf/benchmarks/silk_flags.py
index 4b27dfd..080ed694 100644
--- a/tools/perf/benchmarks/silk_flags.py
+++ b/tools/perf/benchmarks/silk_flags.py
@@ -18,3 +18,8 @@
 def CustomizeBrowserOptionsForSyncScrolling(options):
   """Enables flags needed for synchronous (main thread) scrolling."""
   options.AppendExtraBrowserArgs('--disable-threaded-scrolling')
+
+def CustomizeBrowserOptionsForThreadTimes(options):
+  """Disables options known to cause noise in thread times"""
+  # Remove once crbug.com/621128 is fixed.
+  options.AppendExtraBrowserArgs('--disable-top-sites')
diff --git a/tools/perf/benchmarks/smoothness.py b/tools/perf/benchmarks/smoothness.py
index e8e79c8..9092163 100644
--- a/tools/perf/benchmarks/smoothness.py
+++ b/tools/perf/benchmarks/smoothness.py
@@ -283,7 +283,7 @@
     return 'smoothness.simple_mobile_sites'
 
 
-@benchmark.Enabled('android')
+@benchmark.Disabled('all') # http://crbug.com/631015
 class SmoothnessToughPinchZoomCases(_Smoothness):
   """Measures rendering statistics for pinch-zooming in the tough pinch zoom
   cases.
diff --git a/tools/perf/benchmarks/system_health_smoke_test.py b/tools/perf/benchmarks/system_health_smoke_test.py
index 71460af..c79dfdc 100644
--- a/tools/perf/benchmarks/system_health_smoke_test.py
+++ b/tools/perf/benchmarks/system_health_smoke_test.py
@@ -32,15 +32,11 @@
 
 
 _DISABLED_TESTS = frozenset({
-  # crbug.com/630686
-  'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop.browse:news:nytimes',  # pylint: disable=line-too-long
   # crbug.com/622409
   'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop.browse:news:cnn',  # pylint: disable=line-too-long
   # crbug.com/629123
   'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_mobile.browse:news:hackernews',  # pylint: disable=line-too-long
   'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_mobile.browse:news:nytimes',  # pylint: disable=line-too-long
-  # crbug.com/630765
-  'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop.browse:news:reddit',  # pylint: disable=line-too-long
 })
 
 
diff --git a/tools/perf/benchmarks/thread_times.py b/tools/perf/benchmarks/thread_times.py
index 641ffeb..c03706b4 100644
--- a/tools/perf/benchmarks/thread_times.py
+++ b/tools/perf/benchmarks/thread_times.py
@@ -26,6 +26,9 @@
     # Default to only reporting per-frame metrics.
     return 'per_second' not in value.name
 
+  def SetExtraBrowserOptions(self, options):
+    silk_flags.CustomizeBrowserOptionsForThreadTimes(options)
+
   def CreatePageTest(self, options):
     return thread_times.ThreadTimes(options.report_silk_details)
 
@@ -84,6 +87,7 @@
   page_set = page_sets.ToughCompositorCasesPageSet
 
   def SetExtraBrowserOptions(self, options):
+    super(ThreadTimesCompositorCases, self).SetExtraBrowserOptions(options)
     silk_flags.CustomizeBrowserOptionsForSoftwareRasterization(options)
 
   @classmethod
diff --git a/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm b/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm
index d5b3734..dcc8cca2 100644
--- a/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm
+++ b/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm
@@ -556,7 +556,10 @@
       ca_layer.reset([[CALayer alloc] init]);
     }
     [ca_layer setAnchorPoint:CGPointZero];
-    [superlayer addSublayer:ca_layer];
+    if (old_layer && old_layer->ca_layer)
+      [superlayer replaceSublayer:old_layer->ca_layer with:ca_layer];
+    else
+      [superlayer addSublayer:ca_layer];
   }
   DCHECK_EQ([ca_layer superlayer], superlayer);
   bool update_anything = update_contents || update_contents_rect ||
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn
index 0c596a7b..1a9b694 100644
--- a/ui/base/BUILD.gn
+++ b/ui/base/BUILD.gn
@@ -299,6 +299,7 @@
       "accelerators/accelerator_history.h",
       "accelerators/accelerator_manager.cc",
       "accelerators/accelerator_manager.h",
+      "accelerators/accelerator_manager_delegate.h",
       "base_window.cc",
       "base_window.h",
       "clipboard/clipboard.cc",
diff --git a/ui/base/accelerators/accelerator_manager.cc b/ui/base/accelerators/accelerator_manager.cc
index fdd2e0aa..466b7b745 100644
--- a/ui/base/accelerators/accelerator_manager.cc
+++ b/ui/base/accelerators/accelerator_manager.cc
@@ -7,11 +7,12 @@
 #include <algorithm>
 
 #include "base/logging.h"
+#include "ui/base/accelerators/accelerator_manager_delegate.h"
 
 namespace ui {
 
-AcceleratorManager::AcceleratorManager() {
-}
+AcceleratorManager::AcceleratorManager(AcceleratorManagerDelegate* delegate)
+    : delegate_(delegate) {}
 
 AcceleratorManager::~AcceleratorManager() {
 }
@@ -23,6 +24,7 @@
   AcceleratorTargetList& targets = accelerators_[accelerator].second;
   DCHECK(std::find(targets.begin(), targets.end(), target) == targets.end())
       << "Registering the same target multiple times";
+  const bool is_first_target_for_accelerator = targets.empty();
 
   // All priority accelerators go to the front of the line.
   if (priority) {
@@ -31,16 +33,17 @@
     targets.push_front(target);
     // Mark that we have a priority accelerator at the front.
     accelerators_[accelerator].first = true;
-    return;
+  } else {
+    // We are registering a normal priority handler. If no priority accelerator
+    // handler has been registered before us, just add the new handler to the
+    // front. Otherwise, register it after the first (only) priority handler.
+    if (!accelerators_[accelerator].first)
+      targets.push_front(target);
+    else
+      targets.insert(++targets.begin(), target);
   }
-
-  // We are registering a normal priority handler. If no priority accelerator
-  // handler has been registered before us, just add the new handler to the
-  // front. Otherwise, register it after the first (only) priority handler.
-  if (!accelerators_[accelerator].first)
-    targets.push_front(target);
-  else
-    targets.insert(++targets.begin(), target);
+  if (is_first_target_for_accelerator && delegate_)
+    delegate_->OnAcceleratorRegistered(accelerator);
 }
 
 void AcceleratorManager::Unregister(const Accelerator& accelerator,
@@ -51,28 +54,22 @@
     return;
   }
 
-  AcceleratorTargetList* targets = &map_iter->second.second;
-  AcceleratorTargetList::iterator target_iter =
-      std::find(targets->begin(), targets->end(), target);
-  if (target_iter == targets->end()) {
-    NOTREACHED() << "Unregistering accelerator for wrong target";
-    return;
-  }
-
-  // Check to see if we have a priority handler and whether we are removing it.
-  if (accelerators_[accelerator].first && target_iter == targets->begin()) {
-    // We've are taking the priority accelerator away, flip the priority flag.
-    accelerators_[accelerator].first = false;
-  }
-
-  targets->erase(target_iter);
+  UnregisterImpl(map_iter, target);
 }
 
 void AcceleratorManager::UnregisterAll(AcceleratorTarget* target) {
   for (AcceleratorMap::iterator map_iter = accelerators_.begin();
-       map_iter != accelerators_.end(); ++map_iter) {
+       map_iter != accelerators_.end();) {
     AcceleratorTargetList* targets = &map_iter->second.second;
-    targets->remove(target);
+    AcceleratorTargetList::iterator target_iter =
+        std::find(targets->begin(), targets->end(), target);
+    if (target_iter == targets->end()) {
+      ++map_iter;
+    } else {
+      auto tmp_iter = map_iter;
+      ++map_iter;
+      UnregisterImpl(tmp_iter, target);
+    }
   }
 }
 
@@ -115,4 +112,28 @@
   return map_iter->second.second.front()->CanHandleAccelerators();
 }
 
+void AcceleratorManager::UnregisterImpl(AcceleratorMap::iterator map_iter,
+                                        AcceleratorTarget* target) {
+  AcceleratorTargetList* targets = &map_iter->second.second;
+  AcceleratorTargetList::iterator target_iter =
+      std::find(targets->begin(), targets->end(), target);
+  if (target_iter == targets->end()) {
+    NOTREACHED() << "Unregistering accelerator for wrong target";
+    return;
+  }
+
+  // Only one priority handler is allowed, so if we remove the first element we
+  // no longer have a priority target.
+  if (target_iter == targets->begin())
+    map_iter->second.first = false;
+
+  targets->remove(target);
+  if (!targets->empty())
+    return;
+  const ui::Accelerator accelerator = map_iter->first;
+  accelerators_.erase(map_iter);
+  if (delegate_)
+    delegate_->OnAcceleratorUnregistered(accelerator);
+}
+
 }  // namespace ui
diff --git a/ui/base/accelerators/accelerator_manager.h b/ui/base/accelerators/accelerator_manager.h
index d103e6f..9db9629f 100644
--- a/ui/base/accelerators/accelerator_manager.h
+++ b/ui/base/accelerators/accelerator_manager.h
@@ -16,7 +16,10 @@
 
 namespace ui {
 
-// The AcceleratorManger is used to handle keyboard accelerators.
+class AcceleratorManagerDelegate;
+
+// AcceleratorManger handles processing of accelerators. A delegate may be
+// supplied which is notified as unique accelerators are added and removed.
 class UI_BASE_EXPORT AcceleratorManager {
  public:
   enum HandlerPriority {
@@ -24,7 +27,7 @@
     kHighPriority,
   };
 
-  AcceleratorManager();
+  explicit AcceleratorManager(AcceleratorManagerDelegate* = nullptr);
   ~AcceleratorManager();
 
   // Register a keyboard accelerator for the specified target. If multiple
@@ -70,11 +73,18 @@
 
  private:
   // The accelerators and associated targets.
-  typedef std::list<AcceleratorTarget*> AcceleratorTargetList;
+  using AcceleratorTargetList = std::list<AcceleratorTarget*>;
   // This construct pairs together a |bool| (denoting whether the list contains
   // a priority_handler at the front) with the list of AcceleratorTargets.
-  typedef std::pair<bool, AcceleratorTargetList> AcceleratorTargets;
-  typedef std::map<Accelerator, AcceleratorTargets> AcceleratorMap;
+  using AcceleratorTargets = std::pair<bool, AcceleratorTargetList>;
+  using AcceleratorMap = std::map<Accelerator, AcceleratorTargets>;
+
+  // Implementation of Unregister(). |map_iter| points to the accelerator to
+  // remove, and |target| the AcceleratorTarget to remove.
+  void UnregisterImpl(AcceleratorMap::iterator map_iter,
+                      AcceleratorTarget* target);
+
+  AcceleratorManagerDelegate* delegate_;
   AcceleratorMap accelerators_;
 
   DISALLOW_COPY_AND_ASSIGN(AcceleratorManager);
diff --git a/ui/base/accelerators/accelerator_manager_delegate.h b/ui/base/accelerators/accelerator_manager_delegate.h
new file mode 100644
index 0000000..e3c6d9c
--- /dev/null
+++ b/ui/base/accelerators/accelerator_manager_delegate.h
@@ -0,0 +1,31 @@
+// 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 UI_BASE_ACCELERATORS_ACCELERATOR_MANAGER_DELEGATE_H_
+#define UI_BASE_ACCELERATORS_ACCELERATOR_MANAGER_DELEGATE_H_
+
+#include "ui/base/ui_base_export.h"
+
+namespace ui {
+
+class Accelerator;
+
+class UI_BASE_EXPORT AcceleratorManagerDelegate {
+ public:
+  // Called the first time a target is registered for |accelerator|. This is
+  // only called the first time a target is registered for a unique accelerator.
+  // For example, if Register() is called twice with the same accelerator
+  // this is called only for the first call.
+  virtual void OnAcceleratorRegistered(const Accelerator& accelerator) = 0;
+
+  // Called when there no more targets are registered for |accelerator|.
+  virtual void OnAcceleratorUnregistered(const Accelerator& accelerator) = 0;
+
+ protected:
+  virtual ~AcceleratorManagerDelegate() {}
+};
+
+}  // namespace ui
+
+#endif  // UI_BASE_ACCELERATORS_ACCELERATOR_MANAGER_DELEGATE_H_
diff --git a/ui/base/accelerators/accelerator_manager_unittest.cc b/ui/base/accelerators/accelerator_manager_unittest.cc
index 0236d56..524cc371 100644
--- a/ui/base/accelerators/accelerator_manager_unittest.cc
+++ b/ui/base/accelerators/accelerator_manager_unittest.cc
@@ -4,9 +4,12 @@
 
 #include "ui/base/accelerators/accelerator_manager.h"
 
+#include <map>
+
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/accelerators/accelerator_manager_delegate.h"
 #include "ui/events/event_constants.h"
 #include "ui/events/keycodes/keyboard_codes.h"
 
@@ -51,21 +54,65 @@
   return Accelerator(code, mask);
 }
 
+// AcceleratorManagerDelegate implementation that records calls to interface
+// using the following format.
+// . OnAcceleratorRegistered() -> 'Register ' + id
+// . OnAcceleratorRegistered() -> 'Unregister' + id
+// where the id is specified using SetIdForAccelerator().
+class TestAcceleratorManagerDelegate : public AcceleratorManagerDelegate {
+ public:
+  TestAcceleratorManagerDelegate() {}
+  ~TestAcceleratorManagerDelegate() override {}
+
+  void SetIdForAccelerator(const Accelerator& accelerator,
+                           const std::string& id) {
+    accelerator_to_id_[accelerator] = id;
+  }
+
+  std::string GetAndClearCommands() {
+    std::string commands;
+    std::swap(commands, commands_);
+    return commands;
+  }
+
+  // AcceleratorManagerDelegate:
+  void OnAcceleratorRegistered(const Accelerator& accelerator) override {
+    if (!commands_.empty())
+      commands_ += " ";
+    commands_ += "Register " + accelerator_to_id_[accelerator];
+  }
+  void OnAcceleratorUnregistered(const Accelerator& accelerator) override {
+    if (!commands_.empty())
+      commands_ += " ";
+    commands_ += "Unregister " + accelerator_to_id_[accelerator];
+  }
+
+ private:
+  std::map<Accelerator, std::string> accelerator_to_id_;
+  std::string commands_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestAcceleratorManagerDelegate);
+};
+
 }  // namespace
 
 class AcceleratorManagerTest : public testing::Test {
  public:
-  AcceleratorManagerTest() {}
+  AcceleratorManagerTest() : manager_(&delegate_) {}
   ~AcceleratorManagerTest() override {}
 
+ protected:
+  TestAcceleratorManagerDelegate delegate_;
   AcceleratorManager manager_;
 };
 
 TEST_F(AcceleratorManagerTest, Register) {
   const Accelerator accelerator_a(VKEY_A, EF_NONE);
   TestTarget target;
+  delegate_.SetIdForAccelerator(accelerator_a, "a");
   manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority,
                     &target);
+  EXPECT_EQ("Register a", delegate_.GetAndClearCommands());
 
   // The registered accelerator is processed.
   EXPECT_TRUE(manager_.Process(accelerator_a));
@@ -74,12 +121,16 @@
 
 TEST_F(AcceleratorManagerTest, RegisterMultipleTarget) {
   const Accelerator accelerator_a(VKEY_A, EF_NONE);
+  delegate_.SetIdForAccelerator(accelerator_a, "a");
   TestTarget target1;
   manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority,
                     &target1);
+  EXPECT_EQ("Register a", delegate_.GetAndClearCommands());
   TestTarget target2;
   manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority,
                     &target2);
+  // Registering the same command shouldn't notify the delegate.
+  EXPECT_TRUE(delegate_.GetAndClearCommands().empty());
 
   // If multiple targets are registered with the same accelerator, the target
   // registered later processes the accelerator.
@@ -90,39 +141,56 @@
 
 TEST_F(AcceleratorManagerTest, Unregister) {
   const Accelerator accelerator_a(VKEY_A, EF_NONE);
+  delegate_.SetIdForAccelerator(accelerator_a, "a");
   TestTarget target;
   manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority,
                     &target);
+  EXPECT_EQ("Register a", delegate_.GetAndClearCommands());
   const Accelerator accelerator_b(VKEY_B, EF_NONE);
+  delegate_.SetIdForAccelerator(accelerator_b, "b");
   manager_.Register(accelerator_b, AcceleratorManager::kNormalPriority,
                     &target);
+  EXPECT_EQ("Register b", delegate_.GetAndClearCommands());
 
   // Unregistering a different accelerator does not affect the other
   // accelerator.
   manager_.Unregister(accelerator_b, &target);
+  EXPECT_EQ("Unregister b", delegate_.GetAndClearCommands());
   EXPECT_TRUE(manager_.Process(accelerator_a));
   EXPECT_EQ(1, target.accelerator_pressed_count());
 
   // The unregistered accelerator is no longer processed.
   target.set_accelerator_pressed_count(0);
   manager_.Unregister(accelerator_a, &target);
+  EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands());
   EXPECT_FALSE(manager_.Process(accelerator_a));
   EXPECT_EQ(0, target.accelerator_pressed_count());
 }
 
 TEST_F(AcceleratorManagerTest, UnregisterAll) {
   const Accelerator accelerator_a(VKEY_A, EF_NONE);
+  delegate_.SetIdForAccelerator(accelerator_a, "a");
   TestTarget target1;
   manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority,
                     &target1);
   const Accelerator accelerator_b(VKEY_B, EF_NONE);
+  delegate_.SetIdForAccelerator(accelerator_b, "b");
   manager_.Register(accelerator_b, AcceleratorManager::kNormalPriority,
                     &target1);
   const Accelerator accelerator_c(VKEY_C, EF_NONE);
+  delegate_.SetIdForAccelerator(accelerator_c, "c");
   TestTarget target2;
   manager_.Register(accelerator_c, AcceleratorManager::kNormalPriority,
                     &target2);
+  EXPECT_EQ("Register a Register b Register c",
+            delegate_.GetAndClearCommands());
   manager_.UnregisterAll(&target1);
+  {
+    const std::string commands = delegate_.GetAndClearCommands();
+    // Ordering is not guaranteed.
+    EXPECT_TRUE(commands == "Unregister a Unregister b" ||
+                commands == "Unregister b Unregister a");
+  }
 
   // All the accelerators registered for |target1| are no longer processed.
   EXPECT_FALSE(manager_.Process(accelerator_a));
@@ -176,5 +244,21 @@
   }
 }
 
+// Verifies delegate is notifed correctly when unregistering and registering
+// with the same accelerator.
+TEST_F(AcceleratorManagerTest, Reregister) {
+  const Accelerator accelerator_a(VKEY_A, EF_NONE);
+  TestTarget target;
+  delegate_.SetIdForAccelerator(accelerator_a, "a");
+  manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority,
+                    &target);
+  EXPECT_EQ("Register a", delegate_.GetAndClearCommands());
+  manager_.UnregisterAll(&target);
+  EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands());
+  manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority,
+                    &target);
+  EXPECT_EQ("Register a", delegate_.GetAndClearCommands());
+}
+
 }  // namespace test
 }  // namespace ui
diff --git a/ui/base/ime/linux/text_edit_command_auralinux.cc b/ui/base/ime/linux/text_edit_command_auralinux.cc
index cf6c7b7..3ccaf628 100644
--- a/ui/base/ime/linux/text_edit_command_auralinux.cc
+++ b/ui/base/ime/linux/text_edit_command_auralinux.cc
@@ -115,6 +115,8 @@
       return "SelectAll";
     case TextEditCommand::TRANSPOSE:
       return "Transpose";
+    case TextEditCommand::YANK:
+      return "Yank";
     case TextEditCommand::INSERT_TEXT:
       return "InsertText";
     case TextEditCommand::SET_MARK:
diff --git a/ui/base/ime/text_edit_commands.h b/ui/base/ime/text_edit_commands.h
index 17f25cdf..b0be57a 100644
--- a/ui/base/ime/text_edit_commands.h
+++ b/ui/base/ime/text_edit_commands.h
@@ -60,6 +60,7 @@
   PASTE,
   SELECT_ALL,
   TRANSPOSE,
+  YANK,
   INSERT_TEXT,
   SET_MARK,
   UNSELECT,
diff --git a/ui/base/ui_base.gyp b/ui/base/ui_base.gyp
index c000d29..4bde0e96 100644
--- a/ui/base/ui_base.gyp
+++ b/ui/base/ui_base.gyp
@@ -94,6 +94,7 @@
         'accelerators/accelerator_history.h',
         'accelerators/accelerator_manager.cc',
         'accelerators/accelerator_manager.h',
+        'accelerators/accelerator_manager_delegate.h',
         'accelerators/menu_label_accelerator_util_linux.cc',
         'accelerators/menu_label_accelerator_util_linux.h',
         'accelerators/platform_accelerator.h',
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h
index 05c3bcc..2f1d02b 100644
--- a/ui/compositor/compositor.h
+++ b/ui/compositor/compositor.h
@@ -144,6 +144,11 @@
 
   virtual void SetAuthoritativeVSyncInterval(ui::Compositor* compositor,
                                              base::TimeDelta interval) = 0;
+  // Mac path for transporting vsync parameters to the display.  Other platforms
+  // update it via the BrowserCompositorOutputSurface directly.
+  virtual void SetDisplayVSyncParameters(ui::Compositor* compositor,
+                                         base::TimeTicks timebase,
+                                         base::TimeDelta interval) = 0;
 
   virtual void SetOutputIsSecure(Compositor* compositor, bool secure) = 0;
 
diff --git a/ui/compositor/test/in_process_context_factory.h b/ui/compositor/test/in_process_context_factory.h
index 6603fa1..d17e148 100644
--- a/ui/compositor/test/in_process_context_factory.h
+++ b/ui/compositor/test/in_process_context_factory.h
@@ -68,6 +68,9 @@
                             const gfx::ColorSpace& color_space) override {}
   void SetAuthoritativeVSyncInterval(ui::Compositor* compositor,
                                      base::TimeDelta interval) override {}
+  void SetDisplayVSyncParameters(ui::Compositor* compositor,
+                                 base::TimeTicks timebase,
+                                 base::TimeDelta interval) override {}
   void SetOutputIsSecure(ui::Compositor* compositor, bool secure) override {}
   void AddObserver(ContextFactoryObserver* observer) override;
   void RemoveObserver(ContextFactoryObserver* observer) override;
diff --git a/ui/events/devices/x11/device_data_manager_x11.cc b/ui/events/devices/x11/device_data_manager_x11.cc
index 51927e4..0fd13e3 100644
--- a/ui/events/devices/x11/device_data_manager_x11.cc
+++ b/ui/events/devices/x11/device_data_manager_x11.cc
@@ -560,10 +560,16 @@
   }
 }
 
-void DeviceDataManagerX11::InvalidateScrollClasses() {
-  for (int i = 0; i < kMaxDeviceNum; i++) {
-    scroll_data_[i].horizontal.seen = false;
-    scroll_data_[i].vertical.seen = false;
+void DeviceDataManagerX11::InvalidateScrollClasses(int device_id) {
+  if (device_id == kAllDevices) {
+    for (int i = 0; i < kMaxDeviceNum; i++) {
+      scroll_data_[i].horizontal.seen = false;
+      scroll_data_[i].vertical.seen = false;
+    }
+  } else {
+    CHECK(device_id >= 0 && device_id < kMaxDeviceNum);
+    scroll_data_[device_id].horizontal.seen = false;
+    scroll_data_[device_id].vertical.seen = false;
   }
 }
 
diff --git a/ui/events/devices/x11/device_data_manager_x11.h b/ui/events/devices/x11/device_data_manager_x11.h
index c07aed4..d325674 100644
--- a/ui/events/devices/x11/device_data_manager_x11.h
+++ b/ui/events/devices/x11/device_data_manager_x11.h
@@ -109,6 +109,10 @@
     DT_LAST_ENTRY  // This must come last.
   };
 
+  // A Device ID number that can be passed to InvalidateScrollClasses that
+  // invalidates all devices.
+  static const int kAllDevices = -1;
+
   // Data struct to store extracted data from an input event.
   typedef std::map<int, double> EventData;
 
@@ -200,8 +204,9 @@
                              double* y_offset);
 
   // Invalidate stored scroll class counters, since they can change when
-  // pointing at other windows.
-  void InvalidateScrollClasses();
+  // pointing at other windows. If kAllDevices is specified, all devices are
+  // invalidated.
+  void InvalidateScrollClasses(int device_id);
 
   // Extract data from a fling event. User must first verify the event type
   // with IsFlingEvent. Pointers shouldn't be NULL.
diff --git a/ui/events/ozone/evdev/cursor_delegate_evdev.h b/ui/events/ozone/evdev/cursor_delegate_evdev.h
index 6a6820f..ab8ad640 100644
--- a/ui/events/ozone/evdev/cursor_delegate_evdev.h
+++ b/ui/events/ozone/evdev/cursor_delegate_evdev.h
@@ -22,10 +22,10 @@
 
   // Move the cursor from the Evdev thread.
   virtual void MoveCursor(const gfx::Vector2dF& delta) = 0;
-  // Move the cursor from the UI thread only.
+  // Move the cursor from the UI or Evdev (e.g. on a tablet).
   virtual void MoveCursorTo(gfx::AcceleratedWidget widget,
                             const gfx::PointF& location) = 0;
-  // Move the cursor from the UI thread only.
+  // Move the cursor from the UI or Evdev thread.
   virtual void MoveCursorTo(const gfx::PointF& location) = 0;
 
   // Location in screen. Either thread, IPC-free.
diff --git a/ui/events/platform/x11/x11_event_source.cc b/ui/events/platform/x11/x11_event_source.cc
index 337273f..ea5638d 100644
--- a/ui/events/platform/x11/x11_event_source.cc
+++ b/ui/events/platform/x11/x11_event_source.cc
@@ -206,9 +206,24 @@
 }
 
 void X11EventSource::PostDispatchEvent(XEvent* xevent) {
-  if (xevent->type == GenericEvent &&
-      (xevent->xgeneric.evtype == XI_HierarchyChanged ||
-       xevent->xgeneric.evtype == XI_DeviceChanged)) {
+  bool should_update_device_list = false;
+
+  if (xevent->type == GenericEvent) {
+    if (xevent->xgeneric.evtype == XI_HierarchyChanged) {
+      should_update_device_list = true;
+    } else if (xevent->xgeneric.evtype == XI_DeviceChanged) {
+      XIDeviceChangedEvent* xev =
+          static_cast<XIDeviceChangedEvent*>(xevent->xcookie.data);
+      if (xev->reason == XIDeviceChange) {
+        should_update_device_list = true;
+      } else if (xev->reason == XISlaveSwitch) {
+        ui::DeviceDataManagerX11::GetInstance()->InvalidateScrollClasses(
+            xev->sourceid);
+      }
+    }
+  }
+
+  if (should_update_device_list) {
     UpdateDeviceList();
     hotplug_event_handler_->OnHotplugEvent();
   }
@@ -217,7 +232,8 @@
       xevent->xcrossing.detail != NotifyInferior &&
       xevent->xcrossing.mode != NotifyUngrab) {
     // Clear stored scroll data
-    ui::DeviceDataManagerX11::GetInstance()->InvalidateScrollClasses();
+    ui::DeviceDataManagerX11::GetInstance()->InvalidateScrollClasses(
+        DeviceDataManagerX11::kAllDevices);
   }
 }
 
diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn
index dedcb758..4f626c75 100644
--- a/ui/gfx/BUILD.gn
+++ b/ui/gfx/BUILD.gn
@@ -70,8 +70,6 @@
     "color_palette.h",
     "color_space.cc",
     "color_space.h",
-    "color_space_mac.mm",
-    "color_space_win.cc",
     "color_utils.cc",
     "color_utils.h",
     "favicon_size.cc",
@@ -98,6 +96,10 @@
     "gdi_util.h",
     "gfx_paths.cc",
     "gfx_paths.h",
+    "icc_profile.cc",
+    "icc_profile.h",
+    "icc_profile_mac.mm",
+    "icc_profile_win.cc",
     "icon_util.cc",
     "icon_util.h",
     "image/image.cc",
@@ -496,6 +498,7 @@
     ]
   }
 }
+
 # Cannot be a static_library in component builds due to exported functions
 source_set("memory_buffer_sources") {
   visibility = [ ":*" ]  # Depend on through ":memory_buffer".
diff --git a/ui/gfx/color_space.cc b/ui/gfx/color_space.cc
index a108135..5c1825e 100644
--- a/ui/gfx/color_space.cc
+++ b/ui/gfx/color_space.cc
@@ -8,138 +8,49 @@
 
 #include "base/lazy_instance.h"
 #include "base/synchronization/lock.h"
+#include "ui/gfx/icc_profile.h"
 
 namespace gfx {
 
-namespace {
-static const size_t kMinProfileLength = 128;
-static const size_t kMaxProfileLength = 4 * 1024 * 1024;
-}  // namespace
-
-// The structure used to look up GlobalData structures.
-struct ColorSpace::Key {
-  Key(ColorSpace::Type type, const std::vector<char>& icc_profile)
-      : type(type), icc_profile(icc_profile) {}
-
-  bool operator<(const Key& other) const {
-    if (type < other.type)
-      return true;
-    if (type > other.type)
-      return false;
-    if (type != Type::ICC_PROFILE)
-      return false;
-
-    if (icc_profile.size() < other.icc_profile.size())
-      return true;
-    if (icc_profile.size() > other.icc_profile.size())
-      return false;
-    for (size_t i = 0; i < icc_profile.size(); ++i) {
-      if (icc_profile[i] < other.icc_profile[i])
-        return true;
-      if (icc_profile[i] > other.icc_profile[i])
-        return false;
-    }
-    return false;
-  }
-
-  ColorSpace::Type type;
-  const std::vector<char> icc_profile;
-};
-
-// Because this structure is shared across gfx::ColorSpace objects on
-// different threads, it needs to be thread-safe.
-class ColorSpace::GlobalData
-    : public base::RefCountedThreadSafe<ColorSpace::GlobalData> {
- public:
-  static void Get(const Key& key, scoped_refptr<GlobalData>* value) {
-    base::AutoLock lock(map_lock_.Get());
-    auto insert_result = map_.Get().insert(std::make_pair(key, nullptr));
-    if (insert_result.second)
-      insert_result.first->second = new GlobalData(key, insert_result.first);
-    *value = make_scoped_refptr(insert_result.first->second);
-  }
-
-  const std::vector<char>& GetICCProfile() const { return icc_profile_; }
-
- private:
-  friend class base::RefCountedThreadSafe<GlobalData>;
-
-  GlobalData(const Key& key, std::map<Key, GlobalData*>::iterator iterator)
-      : iterator_(iterator) {
-    // TODO: Compute the ICC profile for named color spaces.
-    if (key.type == Type::ICC_PROFILE)
-      icc_profile_ = key.icc_profile;
-  }
-  ~GlobalData() {
-    base::AutoLock lock(map_lock_.Get());
-    map_.Get().erase(iterator_);
-  }
-
-  std::vector<char> icc_profile_;
-
-  // In order to remove |this| from |map_| when its last reference goes away,
-  // keep in |iterator_| the corresponding iterator in |map_|.
-  std::map<Key, GlobalData*>::iterator iterator_;
-  // The |map_| tracks the existing GlobalData instances, which are owned by
-  // ColorSpace instances. Note that |map_| must be leaky because GlobalData
-  // instances will reach back into it at unpredictable times during tear-down.
-  static base::LazyInstance<std::map<Key, GlobalData*>>::Leaky map_;
-  static base::LazyInstance<base::Lock>::Leaky map_lock_;
-};
-
-base::LazyInstance<std::map<ColorSpace::Key, ColorSpace::GlobalData*>>::Leaky
-    ColorSpace::GlobalData::map_ = LAZY_INSTANCE_INITIALIZER;
-base::LazyInstance<base::Lock>::Leaky
-    ColorSpace::GlobalData::map_lock_ = LAZY_INSTANCE_INITIALIZER;
-
 ColorSpace::ColorSpace() = default;
-ColorSpace::ColorSpace(ColorSpace&& other) = default;
-ColorSpace::ColorSpace(const ColorSpace& other) = default;
-ColorSpace& ColorSpace::operator=(const ColorSpace& other) = default;
-ColorSpace::~ColorSpace() = default;
-
-bool ColorSpace::operator==(const ColorSpace& other) const {
-  if (type_ == Type::ICC_PROFILE && other.type_ == Type::ICC_PROFILE)
-    return global_data_ == other.global_data_;
-  return type_ == other.type_;
-}
-
-bool ColorSpace::operator<(const ColorSpace& other) const {
-  // Note that this does a pointer-based comparision.
-  if (type_ == Type::ICC_PROFILE && other.type_ == Type::ICC_PROFILE)
-    return global_data_.get() < other.global_data_.get();
-  return type_ < other.type_;
-}
 
 // static
-ColorSpace ColorSpace::FromICCProfile(const std::vector<char>& icc_profile) {
+ColorSpace ColorSpace::CreateSRGB() {
   ColorSpace color_space;
-  if (IsValidProfileLength(icc_profile.size())) {
-    color_space.type_ = Type::ICC_PROFILE;
-    Key key(Type::ICC_PROFILE, icc_profile);
-    GlobalData::Get(key, &color_space.global_data_);
-  }
+  color_space.valid_ = true;
+  color_space.icc_profile_id_ = ICCProfile::kSRGBId;
   return color_space;
 }
 
-#if !defined(OS_WIN) && !defined(OS_MACOSX)
 // static
-ColorSpace ColorSpace::FromBestMonitor() {
-  return ColorSpace();
-}
-#endif
-
-const std::vector<char>& ColorSpace::GetICCProfile() const {
-  if (!global_data_) {
-    Key key(type_, std::vector<char>());
-    GlobalData::Get(key, &global_data_);
-  }
-  return global_data_->GetICCProfile();
+ColorSpace ColorSpace::CreateJpeg() {
+  ColorSpace color_space;
+  color_space.valid_ = true;
+  color_space.icc_profile_id_ = ICCProfile::kJpegId;
+  return color_space;
 }
 
 // static
-bool ColorSpace::IsValidProfileLength(size_t length) {
-  return length >= kMinProfileLength && length <= kMaxProfileLength;
+ColorSpace ColorSpace::CreateREC601() {
+  ColorSpace color_space;
+  color_space.valid_ = true;
+  color_space.icc_profile_id_ = ICCProfile::kRec601Id;
+  return color_space;
+}
+
+// static
+ColorSpace ColorSpace::CreateREC709() {
+  ColorSpace color_space;
+  color_space.valid_ = true;
+  color_space.icc_profile_id_ = ICCProfile::kRec709Id;
+  return color_space;
+}
+
+bool ColorSpace::operator==(const ColorSpace& other) const {
+  // TODO(ccameron): The |icc_profile_id_| should eventually not factor in
+  // to equality comparison at all, because it's just an optimization, but
+  // for now there is no other data in this structure.
+  return valid_ == other.valid_ && icc_profile_id_ == other.icc_profile_id_;
 }
 
 }  // namespace gfx
diff --git a/ui/gfx/color_space.h b/ui/gfx/color_space.h
index 164ca003..4e166e17 100644
--- a/ui/gfx/color_space.h
+++ b/ui/gfx/color_space.h
@@ -5,17 +5,12 @@
 #ifndef UI_GFX_COLOR_SPACE_H_
 #define UI_GFX_COLOR_SPACE_H_
 
-#include <vector>
+#include <stdint.h>
 
 #include "base/macros.h"
-#include "base/memory/ref_counted.h"
 #include "build/build_config.h"
 #include "ui/gfx/gfx_export.h"
 
-#if defined(OS_MACOSX)
-#include <CoreGraphics/CGColorSpace.h>
-#endif
-
 namespace IPC {
 template <class P>
 struct ParamTraits;
@@ -23,55 +18,31 @@
 
 namespace gfx {
 
+class ICCProfile;
+
+// Used to represet a color space for the purpose of color conversion.
+// This is designed to be safe and compact enough to send over IPC
+// between any processes.
 class GFX_EXPORT ColorSpace {
  public:
   ColorSpace();
-  ColorSpace(ColorSpace&& other);
-  ColorSpace(const ColorSpace& other);
-  ColorSpace& operator=(const ColorSpace& other);
-  ~ColorSpace();
+  static ColorSpace CreateSRGB();
+
+  // TODO: Remove these, and replace with more generic constructors.
+  static ColorSpace CreateJpeg();
+  static ColorSpace CreateREC601();
+  static ColorSpace CreateREC709();
+
   bool operator==(const ColorSpace& other) const;
-  bool operator<(const ColorSpace& other) const;
-
-  // Returns the color profile of the monitor that can best represent color.
-  // This profile should be used for creating content that does not know on
-  // which monitor it will be displayed.
-  static ColorSpace FromBestMonitor();
-  static ColorSpace FromICCProfile(const std::vector<char>& icc_profile);
-#if defined(OS_MACOSX)
-  static ColorSpace FromCGColorSpace(CGColorSpaceRef cg_color_space);
-#endif
-
-  const std::vector<char>& GetICCProfile() const;
-
-#if defined(OS_WIN)
-  // This will read monitor ICC profiles from disk and cache the results for the
-  // other functions to read. This should not be called on the UI or IO thread.
-  static void UpdateCachedProfilesOnBackgroundThread();
-  static bool CachedProfilesNeedUpdate();
-#endif
-
-  static bool IsValidProfileLength(size_t length);
 
  private:
-  struct Key;
-  class GlobalData;
-  enum class Type {
-    UNDEFINED,
-    ICC_PROFILE,
-    LAST = ICC_PROFILE
-  };
-  Type type_ = Type::UNDEFINED;
+  bool valid_ = false;
+  // This is used to look up the ICCProfile from which this ColorSpace was
+  // created, if possible.
+  uint64_t icc_profile_id_ = 0;
 
-  // GlobalData stores large or expensive-to-compute data about a color space
-  // (e.g, ICC profile). This structure is shared by all identical ColorSpace
-  // objects in the process. It is lazily initialized for named color spaces.
-  mutable scoped_refptr<GlobalData> global_data_;
-
-  friend struct Key;
-  friend class GlobalData;
+  friend class ICCProfile;
   friend struct IPC::ParamTraits<gfx::ColorSpace>;
-  friend struct IPC::ParamTraits<gfx::ColorSpace::Type>;
 };
 
 }  // namespace gfx
diff --git a/ui/gfx/gfx.gyp b/ui/gfx/gfx.gyp
index 6d513666..9cd4f25 100644
--- a/ui/gfx/gfx.gyp
+++ b/ui/gfx/gfx.gyp
@@ -150,8 +150,6 @@
         'color_palette.h',
         'color_space.cc',
         'color_space.h',
-        'color_space_mac.mm',
-        'color_space_win.cc',
         'color_utils.cc',
         'color_utils.h',
         'favicon_size.cc',
@@ -183,6 +181,10 @@
         'harfbuzz_font_skia.h',
         'image/canvas_image_source.cc',
         'image/canvas_image_source.h',
+        'icc_profile.cc',
+        'icc_profile.h',
+        'icc_profile_mac.mm',
+        'icc_profile_win.cc',
         'image/image.cc',
         'image/image.h',
         'image/image_family.cc',
diff --git a/ui/gfx/icc_profile.cc b/ui/gfx/icc_profile.cc
new file mode 100644
index 0000000..fd6f4c89
--- /dev/null
+++ b/ui/gfx/icc_profile.cc
@@ -0,0 +1,127 @@
+// 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 "ui/gfx/icc_profile.h"
+
+#include <list>
+
+#include "base/containers/mru_cache.h"
+#include "base/lazy_instance.h"
+#include "base/synchronization/lock.h"
+
+namespace gfx {
+
+namespace {
+const size_t kMinProfileLength = 128;
+const size_t kMaxProfileLength = 4 * 1024 * 1024;
+
+// Allow keeping around a maximum of 8 cached ICC profiles. Beware that
+// we will do a linear search thorugh currently-cached ICC profiles,
+// when creating a new ICC profile.
+const size_t kMaxCachedICCProfiles = 8;
+
+struct Cache {
+  Cache() : id_to_icc_profile_mru(kMaxCachedICCProfiles) {}
+  ~Cache() {}
+
+  // Start from-ICC-data IDs at the end of the hard-coded list.
+  uint64_t next_unused_id = 5;
+  base::MRUCache<uint64_t, ICCProfile> id_to_icc_profile_mru;
+  base::Lock lock;
+};
+static base::LazyInstance<Cache> g_cache;
+
+}  // namespace
+
+ICCProfile::ICCProfile() = default;
+ICCProfile::ICCProfile(ICCProfile&& other) = default;
+ICCProfile::ICCProfile(const ICCProfile& other) = default;
+ICCProfile& ICCProfile::operator=(ICCProfile&& other) = default;
+ICCProfile& ICCProfile::operator=(const ICCProfile& other) = default;
+ICCProfile::~ICCProfile() = default;
+
+bool ICCProfile::operator==(const ICCProfile& other) const {
+  return valid_ == other.valid_ && data_ == other.data_;
+}
+
+// static
+ICCProfile ICCProfile::FromData(const std::vector<char>& icc_profile_data) {
+  ICCProfile icc_profile;
+  if (IsValidProfileLength(icc_profile_data.size())) {
+    icc_profile.valid_ = true;
+    icc_profile.data_ = icc_profile_data;
+  }
+  if (!icc_profile.valid_)
+    return icc_profile;
+
+  Cache& cache = g_cache.Get();
+  base::AutoLock lock(cache.lock);
+
+  // Linearly search the cached ICC profiles to find one with the same data.
+  // If it exists, re-use its id and touch it in the cache.
+  for (auto iter = cache.id_to_icc_profile_mru.begin();
+       iter != cache.id_to_icc_profile_mru.end(); ++iter) {
+    if (icc_profile.data_ == iter->second.data_) {
+      icc_profile.id_ = iter->second.id_;
+      cache.id_to_icc_profile_mru.Get(icc_profile.id_);
+      return icc_profile;
+    }
+  }
+
+  // Create a new cached id and add it to the cache.
+  icc_profile.id_ = cache.next_unused_id++;
+  cache.id_to_icc_profile_mru.Put(icc_profile.id_, icc_profile);
+  return icc_profile;
+}
+
+#if !defined(OS_WIN) && !defined(OS_MACOSX)
+// static
+ICCProfile ICCProfile::FromBestMonitor() {
+  return ICCProfile();
+}
+#endif
+
+// static
+ICCProfile ICCProfile::FromColorSpace(const gfx::ColorSpace& color_space) {
+  // Retrieve ICC profiles from the cache.
+  if (color_space.icc_profile_id_) {
+    Cache& cache = g_cache.Get();
+    base::AutoLock lock(cache.lock);
+
+    auto found = cache.id_to_icc_profile_mru.Get(color_space.icc_profile_id_);
+    if (found != cache.id_to_icc_profile_mru.end())
+      return found->second;
+  }
+  // TODO(ccameron): Support constructing ICC profiles from arbitrary ColorSpace
+  // objects.
+  return ICCProfile();
+}
+
+const std::vector<char>& ICCProfile::GetData() const {
+  return data_;
+}
+
+ColorSpace ICCProfile::GetColorSpace() const {
+  ColorSpace color_space;
+  color_space.valid_ = true;
+  color_space.icc_profile_id_ = id_;
+
+  // Move this ICC profile to the most recently used end of the cache.
+  {
+    Cache& cache = g_cache.Get();
+    base::AutoLock lock(cache.lock);
+
+    auto found = cache.id_to_icc_profile_mru.Get(id_);
+    if (found == cache.id_to_icc_profile_mru.end())
+      cache.id_to_icc_profile_mru.Put(id_, *this);
+  }
+  return color_space;
+}
+
+// static
+bool ICCProfile::IsValidProfileLength(size_t length) {
+  return length >= kMinProfileLength && length <= kMaxProfileLength;
+}
+
+}  // namespace gfx
diff --git a/ui/gfx/icc_profile.h b/ui/gfx/icc_profile.h
new file mode 100644
index 0000000..8004864
--- /dev/null
+++ b/ui/gfx/icc_profile.h
@@ -0,0 +1,83 @@
+// 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 UI_GFX_ICC_PROFILE_H_
+#define UI_GFX_ICC_PROFILE_H_
+
+#include <stdint.h>
+#include <vector>
+
+#include "ui/gfx/color_space.h"
+
+#if defined(OS_MACOSX)
+#include <CoreGraphics/CGColorSpace.h>
+#endif
+
+namespace gfx {
+
+// Used to represent a full ICC profile, usually retrieved from a monitor. It
+// can be lossily compressed into a ColorSpace object. This structure should
+// only be sent from higher-privilege processes to lower-privilege processes,
+// as parsing this structure is not secure.
+class GFX_EXPORT ICCProfile {
+ public:
+  ICCProfile();
+  ICCProfile(ICCProfile&& other);
+  ICCProfile(const ICCProfile& other);
+  ICCProfile& operator=(ICCProfile&& other);
+  ICCProfile& operator=(const ICCProfile& other);
+  ~ICCProfile();
+  bool operator==(const ICCProfile& other) const;
+
+  // Returns the color profile of the monitor that can best represent color.
+  // This profile should be used for creating content that does not know on
+  // which monitor it will be displayed.
+  static ICCProfile FromBestMonitor();
+#if defined(OS_MACOSX)
+  static ICCProfile FromCGColorSpace(CGColorSpaceRef cg_color_space);
+#endif
+
+  // This will recover a ICCProfile from a compact ColorSpace representation.
+  // Internally, this will make an effort to create an identical ICCProfile
+  // to the one that created |color_space|, but this is not guaranteed.
+  static ICCProfile FromColorSpace(const gfx::ColorSpace& color_space);
+
+  // This will perform a potentially-lossy conversion to a more compact color
+  // space representation.
+  ColorSpace GetColorSpace() const;
+
+  const std::vector<char>& GetData() const;
+
+#if defined(OS_WIN)
+  // This will read monitor ICC profiles from disk and cache the results for the
+  // other functions to read. This should not be called on the UI or IO thread.
+  static void UpdateCachedProfilesOnBackgroundThread();
+  static bool CachedProfilesNeedUpdate();
+#endif
+
+ private:
+  static ICCProfile FromData(const std::vector<char>& icc_profile);
+  static bool IsValidProfileLength(size_t length);
+
+  bool valid_ = false;
+  std::vector<char> data_;
+
+  // This globally identifies this ICC profile. It is used to look up this ICC
+  // profile from a ColorSpace object created from it.
+  uint64_t id_ = 0;
+
+  // Hard-coded values for the supported non-monitor-ICC-based profiles that we
+  // support (for now).
+  static const uint64_t kSRGBId = 1;
+  static const uint64_t kJpegId = 2;
+  static const uint64_t kRec601Id = 3;
+  static const uint64_t kRec709Id = 4;
+
+  friend class ColorSpace;
+  friend struct IPC::ParamTraits<gfx::ICCProfile>;
+};
+
+}  // namespace gfx
+
+#endif  // UI_GFX_ICC_PROFILE_H_
diff --git a/ui/gfx/color_space_mac.mm b/ui/gfx/icc_profile_mac.mm
similarity index 69%
rename from ui/gfx/color_space_mac.mm
rename to ui/gfx/icc_profile_mac.mm
index 630554b..92fe8dd 100644
--- a/ui/gfx/color_space_mac.mm
+++ b/ui/gfx/icc_profile_mac.mm
@@ -2,33 +2,29 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ui/gfx/color_space.h"
-
-#import <Cocoa/Cocoa.h>
-#include <stddef.h>
+#include "ui/gfx/icc_profile.h"
 
 #include "base/mac/mac_util.h"
 #include "base/mac/scoped_cftyperef.h"
-#include "ui/gfx/mac/coordinate_conversion.h"
 
 namespace gfx {
 
 // static
-ColorSpace ColorSpace::FromBestMonitor() {
+ICCProfile ICCProfile::FromBestMonitor() {
   return FromCGColorSpace(base::mac::GetSystemColorSpace());
 }
 
 // static
-ColorSpace ColorSpace::FromCGColorSpace(CGColorSpaceRef cg_color_space) {
+ICCProfile ICCProfile::FromCGColorSpace(CGColorSpaceRef cg_color_space) {
   base::ScopedCFTypeRef<CFDataRef> cf_icc_profile(
       CGColorSpaceCopyICCProfile(cg_color_space));
   if (!cf_icc_profile)
-    return gfx::ColorSpace();
+    return gfx::ICCProfile();
   size_t length = CFDataGetLength(cf_icc_profile);
   const unsigned char* data = CFDataGetBytePtr(cf_icc_profile);
   std::vector<char> vector_icc_profile;
   vector_icc_profile.assign(data, data + length);
-  return FromICCProfile(vector_icc_profile);
+  return FromData(vector_icc_profile);
 }
 
 }  // namespace gfx
diff --git a/ui/gfx/color_space_win.cc b/ui/gfx/icc_profile_win.cc
similarity index 81%
rename from ui/gfx/color_space_win.cc
rename to ui/gfx/icc_profile_win.cc
index 9446c4ee..826ecde 100644
--- a/ui/gfx/color_space_win.cc
+++ b/ui/gfx/icc_profile_win.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ui/gfx/color_space.h"
+#include "ui/gfx/icc_profile.h"
 
 #include <windows.h>
 #include <stddef.h>
@@ -30,36 +30,34 @@
   if (!base::ReadFileToString(base::FilePath(path), &profile_data))
     return;
   size_t length = profile_data.size();
-  if (!ColorSpace::IsValidProfileLength(length))
-    return;
   profile->assign(profile_data.data(), profile_data.data() + length);
 }
 
 base::LazyInstance<base::Lock> g_best_monitor_color_space_lock =
     LAZY_INSTANCE_INITIALIZER;
-base::LazyInstance<gfx::ColorSpace> g_best_monitor_color_space =
+base::LazyInstance<gfx::ICCProfile> g_best_monitor_color_space =
     LAZY_INSTANCE_INITIALIZER;
 bool g_has_initialized_best_monitor_color_space = false;
 
 }  // namespace
 
 // static
-ColorSpace ColorSpace::FromBestMonitor() {
+ICCProfile ICCProfile::FromBestMonitor() {
   base::AutoLock lock(g_best_monitor_color_space_lock.Get());
   return g_best_monitor_color_space.Get();
 }
 
 // static
-bool ColorSpace::CachedProfilesNeedUpdate() {
+bool ICCProfile::CachedProfilesNeedUpdate() {
   base::AutoLock lock(g_best_monitor_color_space_lock.Get());
   return !g_has_initialized_best_monitor_color_space;
 }
 
 // static
-void ColorSpace::UpdateCachedProfilesOnBackgroundThread() {
+void ICCProfile::UpdateCachedProfilesOnBackgroundThread() {
   std::vector<char> icc_profile;
   ReadBestMonitorICCProfile(&icc_profile);
-  gfx::ColorSpace color_space = FromICCProfile(icc_profile);
+  gfx::ICCProfile color_space = FromData(icc_profile);
 
   base::AutoLock lock(g_best_monitor_color_space_lock.Get());
   g_best_monitor_color_space.Get() = color_space;
diff --git a/ui/gfx/ipc/color/gfx_param_traits.cc b/ui/gfx/ipc/color/gfx_param_traits.cc
index 5853f6ba..abf6054 100644
--- a/ui/gfx/ipc/color/gfx_param_traits.cc
+++ b/ui/gfx/ipc/color/gfx_param_traits.cc
@@ -11,48 +11,31 @@
 
 void ParamTraits<gfx::ColorSpace>::GetSize(base::PickleSizer* s,
                                            const gfx::ColorSpace& p) {
-  GetParamSize(s, p.type_);
-  switch (p.type_) {
-    case gfx::ColorSpace::Type::UNDEFINED:
-      break;
-    case gfx::ColorSpace::Type::ICC_PROFILE: {
-      GetParamSize(s, p.GetICCProfile());
-      break;
-    }
-  }
+  GetParamSize(s, p.valid_);
+  if (!p.valid_)
+    return;
+  GetParamSize(s, p.icc_profile_id_);
 }
 
 void ParamTraits<gfx::ColorSpace>::Write(base::Pickle* m,
                                          const gfx::ColorSpace& p) {
-  std::vector<char> icc_profile = p.GetICCProfile();
-  WriteParam(m, p.type_);
-  switch (p.type_) {
-    case gfx::ColorSpace::Type::UNDEFINED:
-      break;
-    case gfx::ColorSpace::Type::ICC_PROFILE: {
-      WriteParam(m, p.GetICCProfile());
-      break;
-    }
-  }
+  WriteParam(m, p.valid_);
+  if (!p.valid_)
+    return;
+  WriteParam(m, p.icc_profile_id_);
 }
 
 bool ParamTraits<gfx::ColorSpace>::Read(const base::Pickle* m,
                                         base::PickleIterator* iter,
                                         gfx::ColorSpace* r) {
-  if (!ReadParam(m, iter, &r->type_))
+  if (!ReadParam(m, iter, &r->valid_))
     return false;
-  switch (r->type_) {
-    case gfx::ColorSpace::Type::UNDEFINED:
-      return true;
-    case gfx::ColorSpace::Type::ICC_PROFILE: {
-      std::vector<char> icc_profile;
-      if (!ReadParam(m, iter, &icc_profile))
-        return false;
-      *r = gfx::ColorSpace::FromICCProfile(icc_profile);
-      return true;
-    }
-  }
-  return false;
+  if (!r->valid_)
+    return true;
+
+  if (!ReadParam(m, iter, &r->icc_profile_id_))
+    return false;
+  return true;
 }
 
 void ParamTraits<gfx::ColorSpace>::Log(const gfx::ColorSpace& p,
diff --git a/ui/gfx/ipc/color/gfx_param_traits.h b/ui/gfx/ipc/color/gfx_param_traits.h
index 9fa41f36..81b6301 100644
--- a/ui/gfx/ipc/color/gfx_param_traits.h
+++ b/ui/gfx/ipc/color/gfx_param_traits.h
@@ -10,6 +10,7 @@
 #include "ipc/ipc_message_macros.h"
 #include "ui/gfx/color_space.h"
 #include "ui/gfx/ipc/color/gfx_ipc_color_export.h"
+#include "ui/gfx/ipc/color/gfx_param_traits_macros.h"
 
 namespace gfx {
 class ColorSpace;
diff --git a/ui/gfx/ipc/color/gfx_param_traits_macros.h b/ui/gfx/ipc/color/gfx_param_traits_macros.h
index 5a8927144..5c3fd35 100644
--- a/ui/gfx/ipc/color/gfx_param_traits_macros.h
+++ b/ui/gfx/ipc/color/gfx_param_traits_macros.h
@@ -9,11 +9,16 @@
 #include "ipc/param_traits_macros.h"
 #include "ipc/ipc_message_macros.h"
 #include "ui/gfx/color_space.h"
+#include "ui/gfx/icc_profile.h"
 #include "ui/gfx/ipc/color/gfx_ipc_color_export.h"
 
 #undef IPC_MESSAGE_EXPORT
 #define IPC_MESSAGE_EXPORT GFX_IPC_COLOR_EXPORT
 
-IPC_ENUM_TRAITS_MAX_VALUE(gfx::ColorSpace::Type, gfx::ColorSpace::Type::LAST)
+IPC_STRUCT_TRAITS_BEGIN(gfx::ICCProfile)
+  IPC_STRUCT_TRAITS_MEMBER(valid_)
+  IPC_STRUCT_TRAITS_MEMBER(data_)
+  IPC_STRUCT_TRAITS_MEMBER(id_)
+IPC_STRUCT_TRAITS_END()
 
 #endif  // UI_GFX_IPC_COLOR_GFX_PARAM_TRAITS_MACROS_H_
diff --git a/ui/gfx/vector_icons/palette_tray_icon_default.1x.icon b/ui/gfx/vector_icons/palette_tray_icon_default.1x.icon
new file mode 100644
index 0000000..c97c660
--- /dev/null
+++ b/ui/gfx/vector_icons/palette_tray_icon_default.1x.icon
@@ -0,0 +1,28 @@
+// 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.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 13.8f, 3.75f,
+R_CUBIC_TO, 0.26f, 0.26f, 0, 0.81f, 0, 0.81f,
+LINE_TO, 9.82f, 8.21f,
+R_LINE_TO, -2.26f, -2.08f,
+R_LINE_TO, 2.03f, -1.94f,
+R_LINE_TO, -0.79f, -0.76f,
+R_LINE_TO, -4.05f, 3.68f,
+R_LINE_TO, -0.82f, -0.61f,
+R_LINE_TO, 4.36f, -4.3f,
+R_CUBIC_TO, 0.26f, -0.26f, 0.87f, -0.26f, 1.12f, 0,
+R_LINE_TO, 0.95f, 0.94f,
+R_LINE_TO, 0.95f, -0.94f,
+R_CUBIC_TO, 0.25f, -0.26f, 0.68f, -0.26f, 0.94f, 0,
+R_LINE_TO, 1.56f, 1.55f,
+CLOSE,
+MOVE_TO, 2.02f, 11.66f,
+LINE_TO, 2, 14,
+R_H_LINE_TO, 2.34f,
+R_LINE_TO, 5.1f, -5.17f,
+R_LINE_TO, -2.22f, -2.02f,
+R_LINE_TO, -5.21f, 4.86f,
+CLOSE,
+END
diff --git a/ui/gfx/vector_icons/palette_tray_icon_default.icon b/ui/gfx/vector_icons/palette_tray_icon_default.icon
new file mode 100644
index 0000000..05da1c7e
--- /dev/null
+++ b/ui/gfx/vector_icons/palette_tray_icon_default.icon
@@ -0,0 +1,28 @@
+// 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.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 24.49f, 4.4f,
+R_LINE_TO, 3.12f, 3.11f,
+R_CUBIC_TO, 0.52f, 0.52f, 0.53f, 1.37f, 0.01f, 1.89f,
+R_LINE_TO, -7.16f, 7.15f,
+R_LINE_TO, -5.01f, -5.01f,
+R_LINE_TO, 3.37f, -3.37f,
+R_LINE_TO, -0.97f, -0.97f,
+R_LINE_TO, -7.54f, 7.55f,
+R_LINE_TO, -1.87f, -1.87f,
+R_LINE_TO, 8.49f, -8.48f,
+R_CUBIC_TO, 0.52f, -0.52f, 1.39f, -0.51f, 1.89f, 0.01f,
+R_LINE_TO, 1.89f, 1.88f,
+R_LINE_TO, 1.89f, -1.88f,
+R_CUBIC_TO, 0.51f, -0.52f, 1.36f, -0.52f, 1.88f, 0,
+CLOSE,
+MOVE_TO, 4, 23,
+R_V_LINE_TO, 5,
+R_H_LINE_TO, 4.99f,
+R_LINE_TO, 10.05f, -10.04f,
+R_LINE_TO, -5, -5,
+LINE_TO, 4, 23,
+CLOSE,
+END
diff --git a/ui/gfx/vector_icons_sources.gypi b/ui/gfx/vector_icons_sources.gypi
index 6fef3171..a3ef641 100644
--- a/ui/gfx/vector_icons_sources.gypi
+++ b/ui/gfx/vector_icons_sources.gypi
@@ -103,6 +103,8 @@
       'vector_icons/overflow_chevron.1x.icon',
       'vector_icons/overflow_chevron.icon',
       'vector_icons/paintbrush.icon',
+      'vector_icons/palette_tray_icon_default.1x.icon',
+      'vector_icons/palette_tray_icon_default.icon',
       'vector_icons/pdf.1x.icon',
       'vector_icons/pdf.icon',
       'vector_icons/photo_camera.icon',
diff --git a/ui/gl/ca_renderer_layer_params.h b/ui/gl/ca_renderer_layer_params.h
index ab046a2..22ba8aa 100644
--- a/ui/gl/ca_renderer_layer_params.h
+++ b/ui/gl/ca_renderer_layer_params.h
@@ -49,7 +49,8 @@
 
   // This is a subset of cc::FilterOperation::FilterType.
   enum class FilterEffectType : uint32_t {
-    GRAYSCALE,
+    MIN,
+    GRAYSCALE = MIN,
     SEPIA,
     SATURATE,
     HUE_ROTATE,
@@ -59,6 +60,7 @@
     OPACITY,
     BLUR,
     DROP_SHADOW,
+    MAX = DROP_SHADOW
   };
   struct GL_EXPORT FilterEffect {
     FilterEffectType type = FilterEffectType::GRAYSCALE;
diff --git a/ui/gl/init/gl_factory_ozone.cc b/ui/gl/init/gl_factory_ozone.cc
index 9df9e01..7ee46c7 100644
--- a/ui/gl/init/gl_factory_ozone.cc
+++ b/ui/gl/init/gl_factory_ozone.cc
@@ -64,19 +64,13 @@
 // TODO(kylechar): Remove when all implementations are switched over.
 scoped_refptr<GLSurface> CreateViewGLSurfaceOld(gfx::AcceleratedWidget window) {
   switch (GetGLImplementation()) {
-    case kGLImplementationEGLGLES2: {
+    case kGLImplementationEGLGLES2:
       DCHECK_NE(window, gfx::kNullAcceleratedWidget);
-      scoped_refptr<GLSurface> surface;
-      if (!surface && GLSurfaceEGL::IsEGLSurfacelessContextSupported())
-        surface = CreateViewGLSurfaceOzoneSurfacelessSurfaceImpl(window);
-      if (!surface)
-        surface = CreateViewGLSurfaceOzone(window);
-      return surface;
-    }
+      return CreateViewGLSurfaceOzone(window);
     default:
       NOTREACHED();
-      return nullptr;
   }
+  return nullptr;
 }
 
 // TODO(kylechar): Remove when all implementations are switched over.
@@ -131,16 +125,12 @@
                                                   window);
 }
 
-// TODO(kylechar): Update to use new API.
 scoped_refptr<GLSurface> CreateSurfacelessViewGLSurface(
     gfx::AcceleratedWidget window) {
   TRACE_EVENT0("gpu", "gl::init::CreateSurfacelessViewGLSurface");
-  if (GetGLImplementation() == kGLImplementationEGLGLES2 &&
-      window != gfx::kNullAcceleratedWidget &&
-      GLSurfaceEGL::IsEGLSurfacelessContextSupported()) {
-    return CreateViewGLSurfaceOzoneSurfaceless(window);
-  }
-  return nullptr;
+
+  return GetSurfaceFactory()->CreateSurfacelessViewGLSurface(
+      GetGLImplementation(), window);
 }
 
 scoped_refptr<GLSurface> CreateOffscreenGLSurface(const gfx::Size& size) {
diff --git a/ui/gl/init/gl_surface_ozone.cc b/ui/gl/init/gl_surface_ozone.cc
index ec18d36..a7315be 100644
--- a/ui/gl/init/gl_surface_ozone.cc
+++ b/ui/gl/init/gl_surface_ozone.cc
@@ -62,11 +62,6 @@
   return callbacks;
 }
 
-void WaitForFence(EGLDisplay display, EGLSyncKHR fence) {
-  eglClientWaitSyncKHR(display, fence, EGL_SYNC_FLUSH_COMMANDS_BIT_KHR,
-                       EGL_FOREVER_KHR);
-}
-
 // A thin wrapper around GLSurfaceEGL that owns the EGLNativeWindow.
 class GL_EXPORT GLSurfaceOzoneEGL : public NativeViewGLSurfaceEGL {
  public:
@@ -182,490 +177,6 @@
   return true;
 }
 
-class GL_EXPORT GLSurfaceOzoneSurfaceless : public SurfacelessEGL {
- public:
-  GLSurfaceOzoneSurfaceless(std::unique_ptr<ui::SurfaceOzoneEGL> ozone_surface,
-                            gfx::AcceleratedWidget widget);
-
-  // GLSurface:
-  bool Initialize(GLSurface::Format format) override;
-  bool Resize(const gfx::Size& size,
-              float scale_factor,
-              bool has_alpha) override;
-  gfx::SwapResult SwapBuffers() override;
-  bool ScheduleOverlayPlane(int z_order,
-                            gfx::OverlayTransform transform,
-                            GLImage* image,
-                            const gfx::Rect& bounds_rect,
-                            const gfx::RectF& crop_rect) override;
-  bool IsOffscreen() override;
-  gfx::VSyncProvider* GetVSyncProvider() override;
-  bool SupportsAsyncSwap() override;
-  bool SupportsPostSubBuffer() override;
-  gfx::SwapResult PostSubBuffer(int x, int y, int width, int height) override;
-  void SwapBuffersAsync(const SwapCompletionCallback& callback) override;
-  void PostSubBufferAsync(int x,
-                          int y,
-                          int width,
-                          int height,
-                          const SwapCompletionCallback& callback) override;
-  EGLConfig GetConfig() override;
-
- protected:
-  struct PendingFrame {
-    PendingFrame();
-
-    bool ScheduleOverlayPlanes(gfx::AcceleratedWidget widget);
-    void Flush();
-
-    bool ready;
-    std::vector<GLSurfaceOverlay> overlays;
-    SwapCompletionCallback callback;
-  };
-
-  ~GLSurfaceOzoneSurfaceless() override;
-
-  void SubmitFrame();
-
-  EGLSyncKHR InsertFence(bool implicit);
-  void FenceRetired(EGLSyncKHR fence, PendingFrame* frame);
-
-  void SwapCompleted(const SwapCompletionCallback& callback,
-                     gfx::SwapResult result);
-
-  // The native surface. Deleting this is allowed to free the EGLNativeWindow.
-  std::unique_ptr<ui::SurfaceOzoneEGL> ozone_surface_;
-  gfx::AcceleratedWidget widget_;
-  std::unique_ptr<gfx::VSyncProvider> vsync_provider_;
-  ScopedVector<PendingFrame> unsubmitted_frames_;
-  bool has_implicit_external_sync_;
-  bool has_image_flush_external_;
-  bool last_swap_buffers_result_;
-  bool swap_buffers_pending_;
-
-  base::WeakPtrFactory<GLSurfaceOzoneSurfaceless> weak_factory_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(GLSurfaceOzoneSurfaceless);
-};
-
-GLSurfaceOzoneSurfaceless::PendingFrame::PendingFrame() : ready(false) {}
-
-bool GLSurfaceOzoneSurfaceless::PendingFrame::ScheduleOverlayPlanes(
-    gfx::AcceleratedWidget widget) {
-  for (const auto& overlay : overlays)
-    if (!overlay.ScheduleOverlayPlane(widget))
-      return false;
-  return true;
-}
-
-void GLSurfaceOzoneSurfaceless::PendingFrame::Flush() {
-  for (const auto& overlay : overlays)
-    overlay.Flush();
-}
-
-GLSurfaceOzoneSurfaceless::GLSurfaceOzoneSurfaceless(
-    std::unique_ptr<ui::SurfaceOzoneEGL> ozone_surface,
-    gfx::AcceleratedWidget widget)
-    : SurfacelessEGL(gfx::Size()),
-      ozone_surface_(std::move(ozone_surface)),
-      widget_(widget),
-      has_implicit_external_sync_(
-          HasEGLExtension("EGL_ARM_implicit_external_sync")),
-      has_image_flush_external_(
-          HasEGLExtension("EGL_EXT_image_flush_external")),
-      last_swap_buffers_result_(true),
-      swap_buffers_pending_(false),
-      weak_factory_(this) {
-  unsubmitted_frames_.push_back(new PendingFrame());
-}
-
-bool GLSurfaceOzoneSurfaceless::Initialize(GLSurface::Format format) {
-  if (!SurfacelessEGL::Initialize(format))
-    return false;
-  vsync_provider_ = ozone_surface_->CreateVSyncProvider();
-  if (!vsync_provider_)
-    return false;
-  return true;
-}
-
-bool GLSurfaceOzoneSurfaceless::Resize(const gfx::Size& size,
-                                       float scale_factor,
-                                       bool has_alpha) {
-  if (!ozone_surface_->ResizeNativeWindow(size))
-    return false;
-
-  return SurfacelessEGL::Resize(size, scale_factor, has_alpha);
-}
-
-gfx::SwapResult GLSurfaceOzoneSurfaceless::SwapBuffers() {
-  glFlush();
-
-  unsubmitted_frames_.back()->Flush();
-
-  // TODO: the following should be replaced by a per surface flush as it gets
-  // implemented in GL drivers.
-  if (has_implicit_external_sync_ || has_image_flush_external_) {
-    EGLSyncKHR fence = InsertFence(has_implicit_external_sync_);
-    if (!fence)
-      return gfx::SwapResult::SWAP_FAILED;
-
-    EGLDisplay display = GetDisplay();
-    WaitForFence(display, fence);
-    eglDestroySyncKHR(display, fence);
-  }
-
-  unsubmitted_frames_.back()->ScheduleOverlayPlanes(widget_);
-  unsubmitted_frames_.back()->overlays.clear();
-
-  if (ozone_surface_->IsUniversalDisplayLinkDevice())
-    glFinish();
-
-  return ozone_surface_->OnSwapBuffers() ? gfx::SwapResult::SWAP_ACK
-                                         : gfx::SwapResult::SWAP_FAILED;
-}
-
-bool GLSurfaceOzoneSurfaceless::ScheduleOverlayPlane(
-    int z_order,
-    gfx::OverlayTransform transform,
-    GLImage* image,
-    const gfx::Rect& bounds_rect,
-    const gfx::RectF& crop_rect) {
-  unsubmitted_frames_.back()->overlays.push_back(
-      GLSurfaceOverlay(z_order, transform, image, bounds_rect, crop_rect));
-  return true;
-}
-
-bool GLSurfaceOzoneSurfaceless::IsOffscreen() {
-  return false;
-}
-
-gfx::VSyncProvider* GLSurfaceOzoneSurfaceless::GetVSyncProvider() {
-  return vsync_provider_.get();
-}
-
-bool GLSurfaceOzoneSurfaceless::SupportsAsyncSwap() {
-  return true;
-}
-
-bool GLSurfaceOzoneSurfaceless::SupportsPostSubBuffer() {
-  return true;
-}
-
-gfx::SwapResult GLSurfaceOzoneSurfaceless::PostSubBuffer(int x,
-                                                         int y,
-                                                         int width,
-                                                         int height) {
-  // The actual sub buffer handling is handled at higher layers.
-  NOTREACHED();
-  return gfx::SwapResult::SWAP_FAILED;
-}
-
-void GLSurfaceOzoneSurfaceless::SwapBuffersAsync(
-    const SwapCompletionCallback& callback) {
-  // If last swap failed, don't try to schedule new ones.
-  if (!last_swap_buffers_result_) {
-    callback.Run(gfx::SwapResult::SWAP_FAILED);
-    return;
-  }
-
-  glFlush();
-  unsubmitted_frames_.back()->Flush();
-
-  SwapCompletionCallback surface_swap_callback =
-      base::Bind(&GLSurfaceOzoneSurfaceless::SwapCompleted,
-                 weak_factory_.GetWeakPtr(), callback);
-
-  PendingFrame* frame = unsubmitted_frames_.back();
-  frame->callback = surface_swap_callback;
-  unsubmitted_frames_.push_back(new PendingFrame());
-
-  // TODO: the following should be replaced by a per surface flush as it gets
-  // implemented in GL drivers.
-  if (has_implicit_external_sync_ || has_image_flush_external_) {
-    EGLSyncKHR fence = InsertFence(has_implicit_external_sync_);
-    if (!fence) {
-      callback.Run(gfx::SwapResult::SWAP_FAILED);
-      return;
-    }
-
-    base::Closure fence_wait_task =
-        base::Bind(&WaitForFence, GetDisplay(), fence);
-
-    base::Closure fence_retired_callback =
-        base::Bind(&GLSurfaceOzoneSurfaceless::FenceRetired,
-                   weak_factory_.GetWeakPtr(), fence, frame);
-
-    base::WorkerPool::PostTaskAndReply(FROM_HERE, fence_wait_task,
-                                       fence_retired_callback, false);
-    return;  // Defer frame submission until fence signals.
-  }
-
-  frame->ready = true;
-  SubmitFrame();
-}
-
-void GLSurfaceOzoneSurfaceless::PostSubBufferAsync(
-    int x,
-    int y,
-    int width,
-    int height,
-    const SwapCompletionCallback& callback) {
-  // The actual sub buffer handling is handled at higher layers.
-  SwapBuffersAsync(callback);
-}
-
-EGLConfig GLSurfaceOzoneSurfaceless::GetConfig() {
-  if (!config_) {
-    ui::EglConfigCallbacks callbacks = GetEglConfigCallbacks(GetDisplay());
-    config_ = ozone_surface_->GetEGLSurfaceConfig(callbacks);
-  }
-  if (config_)
-    return config_;
-  return SurfacelessEGL::GetConfig();
-}
-
-GLSurfaceOzoneSurfaceless::~GLSurfaceOzoneSurfaceless() {
-  Destroy();  // The EGL surface must be destroyed before SurfaceOzone.
-}
-
-void GLSurfaceOzoneSurfaceless::SubmitFrame() {
-  DCHECK(!unsubmitted_frames_.empty());
-
-  if (unsubmitted_frames_.front()->ready && !swap_buffers_pending_) {
-    std::unique_ptr<PendingFrame> frame(unsubmitted_frames_.front());
-    unsubmitted_frames_.weak_erase(unsubmitted_frames_.begin());
-    swap_buffers_pending_ = true;
-
-    if (!frame->ScheduleOverlayPlanes(widget_)) {
-      // |callback| is a wrapper for SwapCompleted(). Call it to properly
-      // propagate the failed state.
-      frame->callback.Run(gfx::SwapResult::SWAP_FAILED);
-      return;
-    }
-
-    if (ozone_surface_->IsUniversalDisplayLinkDevice())
-      glFinish();
-
-    ozone_surface_->OnSwapBuffersAsync(frame->callback);
-  }
-}
-
-EGLSyncKHR GLSurfaceOzoneSurfaceless::InsertFence(bool implicit) {
-  const EGLint attrib_list[] = {EGL_SYNC_CONDITION_KHR,
-                                EGL_SYNC_PRIOR_COMMANDS_IMPLICIT_EXTERNAL_ARM,
-                                EGL_NONE};
-  return eglCreateSyncKHR(GetDisplay(), EGL_SYNC_FENCE_KHR,
-                          implicit ? attrib_list : NULL);
-}
-
-void GLSurfaceOzoneSurfaceless::FenceRetired(EGLSyncKHR fence,
-                                             PendingFrame* frame) {
-  eglDestroySyncKHR(GetDisplay(), fence);
-  frame->ready = true;
-  SubmitFrame();
-}
-
-void GLSurfaceOzoneSurfaceless::SwapCompleted(
-    const SwapCompletionCallback& callback,
-    gfx::SwapResult result) {
-  callback.Run(result);
-  swap_buffers_pending_ = false;
-  if (result == gfx::SwapResult::SWAP_FAILED) {
-    last_swap_buffers_result_ = false;
-    return;
-  }
-
-  SubmitFrame();
-}
-
-// This provides surface-like semantics implemented through surfaceless.
-// A framebuffer is bound automatically.
-class GL_EXPORT GLSurfaceOzoneSurfacelessSurfaceImpl
-    : public GLSurfaceOzoneSurfaceless {
- public:
-  GLSurfaceOzoneSurfacelessSurfaceImpl(
-      std::unique_ptr<ui::SurfaceOzoneEGL> ozone_surface,
-      gfx::AcceleratedWidget widget);
-
-  // GLSurface:
-  unsigned int GetBackingFrameBufferObject() override;
-  bool OnMakeCurrent(GLContext* context) override;
-  bool Resize(const gfx::Size& size,
-              float scale_factor,
-              bool has_alpha) override;
-  bool SupportsPostSubBuffer() override;
-  gfx::SwapResult SwapBuffers() override;
-  void SwapBuffersAsync(const SwapCompletionCallback& callback) override;
-  void Destroy() override;
-  bool IsSurfaceless() const override;
-
- private:
-  ~GLSurfaceOzoneSurfacelessSurfaceImpl() override;
-
-  void BindFramebuffer();
-  bool CreatePixmaps();
-
-  scoped_refptr<GLContext> context_;
-  GLuint fbo_;
-  GLuint textures_[2];
-  scoped_refptr<GLImage> images_[2];
-  int current_surface_;
-  DISALLOW_COPY_AND_ASSIGN(GLSurfaceOzoneSurfacelessSurfaceImpl);
-};
-
-GLSurfaceOzoneSurfacelessSurfaceImpl::GLSurfaceOzoneSurfacelessSurfaceImpl(
-    std::unique_ptr<ui::SurfaceOzoneEGL> ozone_surface,
-    gfx::AcceleratedWidget widget)
-    : GLSurfaceOzoneSurfaceless(std::move(ozone_surface), widget),
-      context_(nullptr),
-      fbo_(0),
-      current_surface_(0) {
-  for (auto& texture : textures_)
-    texture = 0;
-}
-
-unsigned int
-GLSurfaceOzoneSurfacelessSurfaceImpl::GetBackingFrameBufferObject() {
-  return fbo_;
-}
-
-bool GLSurfaceOzoneSurfacelessSurfaceImpl::OnMakeCurrent(GLContext* context) {
-  DCHECK(!context_ || context == context_);
-  context_ = context;
-  if (!fbo_) {
-    glGenFramebuffersEXT(1, &fbo_);
-    if (!fbo_)
-      return false;
-    glGenTextures(arraysize(textures_), textures_);
-    if (!CreatePixmaps())
-      return false;
-  }
-  BindFramebuffer();
-  glBindFramebufferEXT(GL_FRAMEBUFFER, fbo_);
-  return SurfacelessEGL::OnMakeCurrent(context);
-}
-
-bool GLSurfaceOzoneSurfacelessSurfaceImpl::Resize(const gfx::Size& size,
-                                                  float scale_factor,
-                                                  bool has_alpha) {
-  if (size == GetSize())
-    return true;
-  // Alpha value isn't actually used in allocating buffers yet, so always use
-  // true instead.
-  return GLSurfaceOzoneSurfaceless::Resize(size, scale_factor, true) &&
-         CreatePixmaps();
-}
-
-bool GLSurfaceOzoneSurfacelessSurfaceImpl::SupportsPostSubBuffer() {
-  return false;
-}
-
-gfx::SwapResult GLSurfaceOzoneSurfacelessSurfaceImpl::SwapBuffers() {
-  if (!images_[current_surface_]->ScheduleOverlayPlane(
-          widget_, 0, gfx::OverlayTransform::OVERLAY_TRANSFORM_NONE,
-          gfx::Rect(GetSize()), gfx::RectF(1, 1)))
-    return gfx::SwapResult::SWAP_FAILED;
-  gfx::SwapResult result = GLSurfaceOzoneSurfaceless::SwapBuffers();
-  if (result != gfx::SwapResult::SWAP_ACK)
-    return result;
-  current_surface_ ^= 1;
-  BindFramebuffer();
-  return gfx::SwapResult::SWAP_ACK;
-}
-
-void GLSurfaceOzoneSurfacelessSurfaceImpl::SwapBuffersAsync(
-    const SwapCompletionCallback& callback) {
-  if (!images_[current_surface_]->ScheduleOverlayPlane(
-          widget_, 0, gfx::OverlayTransform::OVERLAY_TRANSFORM_NONE,
-          gfx::Rect(GetSize()), gfx::RectF(1, 1))) {
-    callback.Run(gfx::SwapResult::SWAP_FAILED);
-    return;
-  }
-  GLSurfaceOzoneSurfaceless::SwapBuffersAsync(callback);
-  current_surface_ ^= 1;
-  BindFramebuffer();
-}
-
-void GLSurfaceOzoneSurfacelessSurfaceImpl::Destroy() {
-  if (!context_)
-    return;
-  scoped_refptr<GLContext> previous_context = GLContext::GetCurrent();
-  scoped_refptr<GLSurface> previous_surface;
-
-  bool was_current = previous_context && previous_context->IsCurrent(nullptr) &&
-                     GLSurface::GetCurrent() == this;
-  if (!was_current) {
-    // Only take a reference to previous surface if it's not |this|
-    // because otherwise we can take a self reference from our own dtor.
-    previous_surface = GLSurface::GetCurrent();
-    context_->MakeCurrent(this);
-  }
-
-  glBindFramebufferEXT(GL_FRAMEBUFFER, 0);
-  if (fbo_) {
-    glDeleteTextures(arraysize(textures_), textures_);
-    for (auto& texture : textures_)
-      texture = 0;
-    glDeleteFramebuffersEXT(1, &fbo_);
-    fbo_ = 0;
-  }
-  for (auto image : images_) {
-    if (image)
-      image->Destroy(true);
-  }
-
-  if (!was_current) {
-    if (previous_context) {
-      previous_context->MakeCurrent(previous_surface.get());
-    } else {
-      context_->ReleaseCurrent(this);
-    }
-  }
-}
-
-bool GLSurfaceOzoneSurfacelessSurfaceImpl::IsSurfaceless() const {
-  return false;
-}
-
-GLSurfaceOzoneSurfacelessSurfaceImpl::~GLSurfaceOzoneSurfacelessSurfaceImpl() {
-  Destroy();
-}
-
-void GLSurfaceOzoneSurfacelessSurfaceImpl::BindFramebuffer() {
-  ScopedFrameBufferBinder fb(fbo_);
-  glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
-                            textures_[current_surface_], 0);
-}
-
-bool GLSurfaceOzoneSurfacelessSurfaceImpl::CreatePixmaps() {
-  if (!fbo_)
-    return true;
-  for (size_t i = 0; i < arraysize(textures_); i++) {
-    scoped_refptr<ui::NativePixmap> pixmap =
-        ui::OzonePlatform::GetInstance()
-            ->GetSurfaceFactoryOzone()
-            ->CreateNativePixmap(widget_, GetSize(),
-                                 gfx::BufferFormat::BGRA_8888,
-                                 gfx::BufferUsage::SCANOUT);
-    if (!pixmap)
-      return false;
-    scoped_refptr<ui::GLImageOzoneNativePixmap> image =
-        new ui::GLImageOzoneNativePixmap(GetSize(), GL_BGRA_EXT);
-    if (!image->Initialize(pixmap.get(), gfx::BufferFormat::BGRA_8888))
-      return false;
-    // Image must have Destroy() called before destruction.
-    if (images_[i])
-      images_[i]->Destroy(true);
-    images_[i] = image;
-    // Bind image to texture.
-    ScopedTextureBinder binder(GL_TEXTURE_2D, textures_[i]);
-    if (!images_[i]->BindTexImage(GL_TEXTURE_2D))
-      return false;
-  }
-  return true;
-}
-
 }  // namespace
 
 scoped_refptr<GLSurface> CreateViewGLSurfaceOzone(
@@ -680,28 +191,4 @@
       new GLSurfaceOzoneEGL(std::move(surface_ozone), window));
 }
 
-scoped_refptr<GLSurface> CreateViewGLSurfaceOzoneSurfaceless(
-    gfx::AcceleratedWidget window) {
-  std::unique_ptr<ui::SurfaceOzoneEGL> surface_ozone =
-      ui::OzonePlatform::GetInstance()
-          ->GetSurfaceFactoryOzone()
-          ->CreateSurfacelessEGLSurfaceForWidget(window);
-  if (!surface_ozone)
-    return nullptr;
-  return InitializeGLSurface(
-      new GLSurfaceOzoneSurfaceless(std::move(surface_ozone), window));
-}
-
-scoped_refptr<GLSurface> CreateViewGLSurfaceOzoneSurfacelessSurfaceImpl(
-    gfx::AcceleratedWidget window) {
-  std::unique_ptr<ui::SurfaceOzoneEGL> surface_ozone =
-      ui::OzonePlatform::GetInstance()
-          ->GetSurfaceFactoryOzone()
-          ->CreateSurfacelessEGLSurfaceForWidget(window);
-  if (!surface_ozone)
-    return nullptr;
-  return InitializeGLSurface(new GLSurfaceOzoneSurfacelessSurfaceImpl(
-      std::move(surface_ozone), window));
-}
-
 }  // namespace gl
diff --git a/ui/gl/init/gl_surface_ozone.h b/ui/gl/init/gl_surface_ozone.h
index 115fcfd..3203f30 100644
--- a/ui/gl/init/gl_surface_ozone.h
+++ b/ui/gl/init/gl_surface_ozone.h
@@ -20,12 +20,6 @@
 scoped_refptr<GLSurface> CreateViewGLSurfaceOzone(
     gfx::AcceleratedWidget window);
 
-scoped_refptr<GLSurface> CreateViewGLSurfaceOzoneSurfaceless(
-    gfx::AcceleratedWidget window);
-
-scoped_refptr<GLSurface> CreateViewGLSurfaceOzoneSurfacelessSurfaceImpl(
-    gfx::AcceleratedWidget window);
-
 }  // namespace gl
 
 #endif  // UI_GL_INIT_GL_SURFACE_OZONE_H_
diff --git a/ui/native_theme/native_theme_win.cc b/ui/native_theme/native_theme_win.cc
index b683cdf..69954dd 100644
--- a/ui/native_theme/native_theme_win.cc
+++ b/ui/native_theme/native_theme_win.cc
@@ -21,6 +21,8 @@
 #include "skia/ext/skia_utils_win.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkColor.h"
+#include "third_party/skia/include/core/SkColorPriv.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
 #include "third_party/skia/include/core/SkShader.h"
 #include "ui/base/material_design/material_design_controller.h"
 #include "ui/display/win/dpi.h"
@@ -249,77 +251,43 @@
       CommonThemePaintMenuItemBackground(this, canvas, state, rect,
                                          extra.menu_item);
       return;
-    case kScrollbarCorner:
-      canvas->drawColor(SK_ColorWHITE, SkXfermode::kSrc_Mode);
-      return;
     default:
       break;
   }
 
-  skia::ScopedPlatformPaint scoped_platform_paint(canvas);
-  HDC hdc = scoped_platform_paint.GetPlatformSurface();
-
-  switch (part) {
-    case kCheckbox:
-      PaintCheckbox(hdc, part, state, rect, extra.button);
-      return;
-    case kInnerSpinButton:
-      PaintSpinButton(hdc, part, state, rect, extra.inner_spin);
-      return;
-    case kMenuList:
-      PaintMenuList(hdc, state, rect, extra.menu_list);
-      return;
-    case kMenuCheck:
-      PaintMenuCheck(hdc, state, rect, extra.menu_check);
-      return;
-    case kMenuCheckBackground:
-      PaintMenuCheckBackground(hdc, state, rect);
-      return;
-    case kMenuPopupArrow:
-      PaintMenuArrow(hdc, state, rect, extra.menu_arrow);
-      return;
-    case kProgressBar:
-      PaintProgressBar(hdc, rect, extra.progress_bar);
-      return;
-    case kPushButton:
-      PaintPushButton(hdc, part, state, rect, extra.button);
-      return;
-    case kRadio:
-      PaintRadioButton(hdc, part, state, rect, extra.button);
-      return;
-    case kScrollbarDownArrow:
-    case kScrollbarUpArrow:
-    case kScrollbarLeftArrow:
-    case kScrollbarRightArrow:
-      PaintScrollbarArrow(hdc, part, state, rect, extra.scrollbar_arrow);
-      return;
-    case kScrollbarHorizontalThumb:
-    case kScrollbarVerticalThumb:
-    case kScrollbarHorizontalGripper:
-    case kScrollbarVerticalGripper:
-      PaintScrollbarThumb(hdc, part, state, rect, extra.scrollbar_thumb);
-      return;
-    case kScrollbarHorizontalTrack:
-    case kScrollbarVerticalTrack:
-      PaintScrollbarTrack(canvas, hdc, part, state, rect,
-                          extra.scrollbar_track);
-      return;
-    case kTabPanelBackground:
-      PaintTabPanelBackground(hdc, rect);
-      return;
-    case kTextField:
-      PaintTextField(hdc, part, state, rect, extra.text_field);
-      return;
-    case kTrackbarThumb:
-    case kTrackbarTrack:
-      PaintTrackbar(canvas, hdc, part, state, rect, extra.trackbar);
-      return;
-    case kWindowResizeGripper:
-      PaintWindowResizeGripper(hdc, rect);
-      return;
-    default:
-      NOTREACHED();
+  bool needs_paint_indirect = false;
+  if (!skia::SupportsPlatformPaint(canvas)) {
+    // This block will only get hit with --enable-accelerated-drawing flag.
+    needs_paint_indirect = true;
+  } else {
+    // Scrollbar components on Windows Classic theme (on all Windows versions)
+    // have particularly problematic alpha values, so always draw them
+    // indirectly. In addition, scrollbar thumbs and grippers for the Windows XP
+    // theme (available only on Windows XP) also need their alpha values
+    // fixed.
+    switch (part) {
+      case kScrollbarDownArrow:
+      case kScrollbarUpArrow:
+      case kScrollbarLeftArrow:
+      case kScrollbarRightArrow:
+        needs_paint_indirect = !GetThemeHandle(SCROLLBAR);
+        break;
+      case kScrollbarHorizontalThumb:
+      case kScrollbarVerticalThumb:
+      case kScrollbarHorizontalGripper:
+      case kScrollbarVerticalGripper:
+        needs_paint_indirect = !GetThemeHandle(SCROLLBAR) ||
+            base::win::GetVersion() == base::win::VERSION_XP;
+        break;
+      default:
+        break;
+    }
   }
+
+  if (needs_paint_indirect)
+    PaintIndirect(canvas, part, state, rect, extra);
+  else
+    PaintDirect(canvas, part, state, rect, extra);
 }
 
 NativeThemeWin::NativeThemeWin()
@@ -408,6 +376,94 @@
   canvas->drawRect(gfx::RectToSkRect(rect), paint);
 }
 
+void NativeThemeWin::PaintDirect(SkCanvas* canvas,
+                                 Part part,
+                                 State state,
+                                 const gfx::Rect& rect,
+                                 const ExtraParams& extra) const {
+  skia::ScopedPlatformPaint scoped_platform_paint(canvas);
+  HDC hdc = scoped_platform_paint.GetPlatformSurface();
+
+  switch (part) {
+    case kCheckbox:
+      PaintCheckbox(hdc, part, state, rect, extra.button);
+      return;
+    case kInnerSpinButton:
+      PaintSpinButton(hdc, part, state, rect, extra.inner_spin);
+      return;
+    case kMenuList:
+      PaintMenuList(hdc, state, rect, extra.menu_list);
+      return;
+    case kMenuCheck:
+      PaintMenuCheck(hdc, state, rect, extra.menu_check);
+      return;
+    case kMenuCheckBackground:
+      PaintMenuCheckBackground(hdc, state, rect);
+      return;
+    case kMenuPopupArrow:
+      PaintMenuArrow(hdc, state, rect, extra.menu_arrow);
+      return;
+    case kMenuPopupBackground:
+      PaintMenuBackground(hdc, rect);
+      return;
+    case kMenuPopupGutter:
+      PaintMenuGutter(hdc, rect);
+      return;
+    case kMenuPopupSeparator:
+      PaintMenuSeparator(hdc, rect);
+      return;
+    case kMenuItemBackground:
+      PaintMenuItemBackground(hdc, state, rect, extra.menu_item);
+      return;
+    case kProgressBar:
+      PaintProgressBar(hdc, rect, extra.progress_bar);
+      return;
+    case kPushButton:
+      PaintPushButton(hdc, part, state, rect, extra.button);
+      return;
+    case kRadio:
+      PaintRadioButton(hdc, part, state, rect, extra.button);
+      return;
+    case kScrollbarDownArrow:
+    case kScrollbarUpArrow:
+    case kScrollbarLeftArrow:
+    case kScrollbarRightArrow:
+      PaintScrollbarArrow(hdc, part, state, rect, extra.scrollbar_arrow);
+      return;
+    case kScrollbarHorizontalThumb:
+    case kScrollbarVerticalThumb:
+    case kScrollbarHorizontalGripper:
+    case kScrollbarVerticalGripper:
+      PaintScrollbarThumb(hdc, part, state, rect, extra.scrollbar_thumb);
+      return;
+    case kScrollbarHorizontalTrack:
+    case kScrollbarVerticalTrack:
+      PaintScrollbarTrack(canvas, hdc, part, state, rect,
+                          extra.scrollbar_track);
+      return;
+    case kScrollbarCorner:
+      canvas->drawColor(SK_ColorWHITE, SkXfermode::kSrc_Mode);
+      return;
+    case kTabPanelBackground:
+      PaintTabPanelBackground(hdc, rect);
+      return;
+    case kTextField:
+      PaintTextField(hdc, part, state, rect, extra.text_field);
+      return;
+    case kTrackbarThumb:
+    case kTrackbarTrack:
+      PaintTrackbar(canvas, hdc, part, state, rect, extra.trackbar);
+      return;
+    case kWindowResizeGripper:
+      PaintWindowResizeGripper(hdc, rect);
+      return;
+    case kSliderTrack:
+    case kSliderThumb:
+    case kMaxPart:
+      NOTREACHED();
+  }
+}
+
 SkColor NativeThemeWin::GetSystemColor(ColorId color_id) const {
   const bool md = ui::MaterialDesignController::IsModeMaterial();
   if (!md) {
@@ -616,6 +672,76 @@
   return GetAuraColor(color_id, this);
 }
 
+void NativeThemeWin::PaintIndirect(SkCanvas* canvas,
+                                   Part part,
+                                   State state,
+                                   const gfx::Rect& rect,
+                                   const ExtraParams& extra) const {
+  // TODO(asvitkine): This path is pretty inefficient - for each paint operation
+  //                  it creates a new offscreen bitmap Skia canvas. This can
+  //                  be sped up by doing it only once per part/state and
+  //                  keeping a cache of the resulting bitmaps.
+
+  // Create an offscreen canvas that is backed by an HDC.
+  sk_sp<skia::BitmapPlatformDevice> device(
+      skia::BitmapPlatformDevice::Create(
+          rect.width(), rect.height(), false, NULL));
+  DCHECK(device);
+  SkCanvas offscreen_canvas(device.get());
+  DCHECK(skia::SupportsPlatformPaint(&offscreen_canvas));
+
+  // Some of the Windows theme drawing operations do not write correct alpha
+  // values for fully-opaque pixels; instead the pixels get alpha 0. This is
+  // especially a problem on Windows XP or when using the Classic theme.
+  //
+  // To work-around this, mark all pixels with a placeholder value, to detect
+  // which pixels get touched by the paint operation. After paint, set any
+  // pixels that have alpha 0 to opaque and placeholders to fully-transparent.
+  const SkColor placeholder = SkColorSetARGB(1, 0, 0, 0);
+  offscreen_canvas.clear(placeholder);
+
+  // Offset destination rects to have origin (0,0).
+  gfx::Rect adjusted_rect(rect.size());
+  ExtraParams adjusted_extra(extra);
+  switch (part) {
+    case kProgressBar:
+      adjusted_extra.progress_bar.value_rect_x = 0;
+      adjusted_extra.progress_bar.value_rect_y = 0;
+      break;
+    case kScrollbarHorizontalTrack:
+    case kScrollbarVerticalTrack:
+      adjusted_extra.scrollbar_track.track_x = 0;
+      adjusted_extra.scrollbar_track.track_y = 0;
+      break;
+    default:
+      break;
+  }
+  // Draw the theme controls using existing HDC-drawing code.
+  PaintDirect(&offscreen_canvas, part, state, adjusted_rect, adjusted_extra);
+
+  SkBitmap bitmap = skia::ReadPixels(&offscreen_canvas);
+
+  // Post-process the pixels to fix up the alpha values (see big comment above).
+  const SkPMColor placeholder_value = SkPreMultiplyColor(placeholder);
+  const int pixel_count = rect.width() * rect.height();
+  SkPMColor* pixels = bitmap.getAddr32(0, 0);
+  for (int i = 0; i < pixel_count; i++) {
+    if (pixels[i] == placeholder_value) {
+      // Pixel wasn't touched - make it fully transparent.
+      pixels[i] = SkPackARGB32(0, 0, 0, 0);
+    } else if (SkGetPackedA32(pixels[i]) == 0) {
+      // Pixel was touched but has incorrect alpha of 0, make it fully opaque.
+      pixels[i] = SkPackARGB32(0xFF,
+                               SkGetPackedR32(pixels[i]),
+                               SkGetPackedG32(pixels[i]),
+                               SkGetPackedB32(pixels[i]));
+    }
+  }
+
+  // Draw the offscreen bitmap to the destination canvas.
+  canvas->drawBitmap(bitmap, rect.x(), rect.y());
+}
+
 HRESULT NativeThemeWin::GetThemePartSize(ThemeName theme_name,
                                          HDC hdc,
                                          int part_id,
@@ -717,6 +843,33 @@
   return S_OK;
 }
 
+HRESULT NativeThemeWin::PaintMenuSeparator(
+    HDC hdc,
+    const gfx::Rect& rect) const {
+  RECT rect_win = rect.ToRECT();
+
+  HANDLE handle = GetThemeHandle(MENU);
+  if (handle && draw_theme_) {
+    // Delta is needed for non-classic to move separator up slightly.
+    --rect_win.top;
+    --rect_win.bottom;
+    return draw_theme_(handle, hdc, MENU_POPUPSEPARATOR, MPI_NORMAL, &rect_win,
+                       NULL);
+  }
+
+  DrawEdge(hdc, &rect_win, EDGE_ETCHED, BF_TOP);
+  return S_OK;
+}
+
+HRESULT NativeThemeWin::PaintMenuGutter(HDC hdc,
+                                        const gfx::Rect& rect) const {
+  RECT rect_win = rect.ToRECT();
+  HANDLE handle = GetThemeHandle(MENU);
+  return (handle && draw_theme_) ?
+      draw_theme_(handle, hdc, MENU_POPUPGUTTER, MPI_NORMAL, &rect_win, NULL) :
+      E_NOTIMPL;
+}
+
 HRESULT NativeThemeWin::PaintMenuArrow(
     HDC hdc,
     State state,
@@ -763,6 +916,22 @@
                            state);
 }
 
+HRESULT NativeThemeWin::PaintMenuBackground(HDC hdc,
+                                            const gfx::Rect& rect) const {
+  HANDLE handle = GetThemeHandle(MENU);
+  RECT rect_win = rect.ToRECT();
+  if (handle && draw_theme_) {
+    HRESULT result = draw_theme_(handle, hdc, MENU_POPUPBACKGROUND, 0,
+                                 &rect_win, NULL);
+    FrameRect(hdc, &rect_win, GetSysColorBrush(COLOR_3DSHADOW));
+    return result;
+  }
+
+  FillRect(hdc, &rect_win, GetSysColorBrush(COLOR_MENU));
+  DrawEdge(hdc, &rect_win, EDGE_RAISED, BF_RECT);
+  return S_OK;
+}
+
 HRESULT NativeThemeWin::PaintMenuCheck(
     HDC hdc,
     State state,
@@ -795,6 +964,37 @@
                      &rect_win, NULL);
 }
 
+HRESULT NativeThemeWin::PaintMenuItemBackground(
+    HDC hdc,
+    State state,
+    const gfx::Rect& rect,
+    const MenuItemExtraParams& extra) const {
+  HANDLE handle = GetThemeHandle(MENU);
+  RECT rect_win = rect.ToRECT();
+  int state_id = MPI_NORMAL;
+  switch (state) {
+    case kDisabled:
+      state_id = extra.is_selected ? MPI_DISABLEDHOT : MPI_DISABLED;
+      break;
+    case kHovered:
+      state_id = MPI_HOT;
+      break;
+    case kNormal:
+      break;
+    case kPressed:
+    case kNumStates:
+      NOTREACHED();
+      break;
+  }
+
+  if (handle && draw_theme_)
+    return draw_theme_(handle, hdc, MENU_POPUPITEM, state_id, &rect_win, NULL);
+
+  if (extra.is_selected)
+    FillRect(hdc, &rect_win, GetSysColorBrush(COLOR_HIGHLIGHT));
+  return S_OK;
+}
+
 HRESULT NativeThemeWin::PaintPushButton(HDC hdc,
                                         Part part,
                                         State state,
diff --git a/ui/native_theme/native_theme_win.h b/ui/native_theme/native_theme_win.h
index 8f8597b..03483650 100644
--- a/ui/native_theme/native_theme_win.h
+++ b/ui/native_theme/native_theme_win.h
@@ -130,6 +130,22 @@
   void PaintMenuGutter(SkCanvas* canvas, const gfx::Rect& rect) const;
   void PaintMenuBackground(SkCanvas* canvas, const gfx::Rect& rect) const;
 
+  // Paint directly to canvas' HDC.
+  void PaintDirect(SkCanvas* canvas,
+                   Part part,
+                   State state,
+                   const gfx::Rect& rect,
+                   const ExtraParams& extra) const;
+
+  // Create a temporary HDC, paint to that, clean up the alpha values in the
+  // temporary HDC, and then blit the result to canvas.  This is to work around
+  // the fact that Windows XP and some classic themes give bogus alpha values.
+  void PaintIndirect(SkCanvas* canvas,
+                     Part part,
+                     State state,
+                     const gfx::Rect& rect,
+                     const ExtraParams& extra) const;
+
   HRESULT GetThemePartSize(ThemeName themeName,
                            HDC hdc,
                            int part_id,
@@ -145,6 +161,11 @@
                       int state_id,
                       RECT* rect) const;
 
+  HRESULT PaintMenuSeparator(HDC hdc,
+                             const gfx::Rect& rect) const;
+
+  HRESULT PaintMenuGutter(HDC hdc, const gfx::Rect& rect) const;
+
   // |arrow_direction| determines whether the arrow is pointing to the left or
   // to the right. In RTL locales, sub-menus open from right to left and
   // therefore the menu arrow should point to the left and not to the right.
@@ -153,6 +174,8 @@
                          const gfx::Rect& rect,
                          const MenuArrowExtraParams& extra) const;
 
+  HRESULT PaintMenuBackground(HDC hdc, const gfx::Rect& rect) const;
+
   HRESULT PaintMenuCheck(HDC hdc,
                          State state,
                          const gfx::Rect& rect,
@@ -162,6 +185,11 @@
                                    State state,
                                    const gfx::Rect& rect) const;
 
+  HRESULT PaintMenuItemBackground(HDC hdc,
+                                  State state,
+                                  const gfx::Rect& rect,
+                                  const MenuItemExtraParams& extra) const;
+
   HRESULT PaintPushButton(HDC hdc,
                           Part part,
                           State state,
diff --git a/ui/ozone/common/BUILD.gn b/ui/ozone/common/BUILD.gn
index 0f88278..9497adb 100644
--- a/ui/ozone/common/BUILD.gn
+++ b/ui/ozone/common/BUILD.gn
@@ -31,5 +31,9 @@
     "//ui/ozone:ozone_base",
   ]
 
+  deps = [
+    "//ui/gl",
+  ]
+
   visibility = [ "//ui/ozone/platform/*" ]
 }
diff --git a/ui/ozone/common/egl_util.cc b/ui/ozone/common/egl_util.cc
index a867046..b33407a 100644
--- a/ui/ozone/common/egl_util.cc
+++ b/ui/ozone/common/egl_util.cc
@@ -5,6 +5,8 @@
 #include "ui/ozone/common/egl_util.h"
 
 #include "base/files/file_path.h"
+#include "ui/gl/egl_util.h"
+#include "ui/gl/gl_bindings.h"
 
 namespace ui {
 namespace {
@@ -62,6 +64,28 @@
   return true;
 }
 
+EGLConfig ChooseEGLConfig(EGLDisplay display, const int32_t* attributes) {
+  int32_t num_configs;
+  if (!eglChooseConfig(display, attributes, nullptr, 0, &num_configs)) {
+    LOG(ERROR) << "eglChooseConfig failed with error "
+               << GetLastEGLErrorString();
+    return nullptr;
+  }
+
+  if (num_configs == 0) {
+    LOG(ERROR) << "No suitable EGL configs found.";
+    return nullptr;
+  }
+
+  EGLConfig config;
+  if (!eglChooseConfig(display, attributes, &config, 1, &num_configs)) {
+    LOG(ERROR) << "eglChooseConfig failed with error "
+               << GetLastEGLErrorString();
+    return nullptr;
+  }
+  return config;
+}
+
 void* /* EGLConfig */ ChooseEGLConfig(const EglConfigCallbacks& egl,
                                       const int32_t* attributes) {
   void* config;
diff --git a/ui/ozone/common/egl_util.h b/ui/ozone/common/egl_util.h
index dbf9a8f..64d336c8 100644
--- a/ui/ozone/common/egl_util.h
+++ b/ui/ozone/common/egl_util.h
@@ -22,6 +22,10 @@
     const char* egl_library_name,
     const char* gles_library_name);
 
+void* /* EGLConfig */ ChooseEGLConfig(void* /* EGLConfig */ display,
+                                      const int32_t* attributes);
+
+// TODO(kylechar): This is deprecated, delete when all callers are gone.
 void* /* EGLConfig */ ChooseEGLConfig(const EglConfigCallbacks& egl,
                                       const int32_t* attributes);
 
diff --git a/ui/ozone/ozone.gyp b/ui/ozone/ozone.gyp
index cda661f..485137ae 100644
--- a/ui/ozone/ozone.gyp
+++ b/ui/ozone/ozone.gyp
@@ -79,6 +79,7 @@
         '<(DEPTH)/skia/skia.gyp:skia',
         '<(DEPTH)/ui/display/display.gyp:display_types',
         '<(DEPTH)/ui/display/display.gyp:display_util',
+        '<(DEPTH)/ui/gl/gl.gyp:gl',
         '<(DEPTH)/ui/gfx/gfx.gyp:gfx_geometry',
         '<(DEPTH)/ui/gfx/ipc/geometry/gfx_ipc_geometry.gyp:gfx_ipc_geometry',
         '<(DEPTH)/ui/gfx/ipc/skia/gfx_ipc_skia.gyp:gfx_ipc_skia',
diff --git a/ui/ozone/platform/drm/BUILD.gn b/ui/ozone/platform/drm/BUILD.gn
index af0da57..2f45c1d2 100644
--- a/ui/ozone/platform/drm/BUILD.gn
+++ b/ui/ozone/platform/drm/BUILD.gn
@@ -69,6 +69,8 @@
     "gpu/gbm_buffer_base.h",
     "gpu/gbm_device.cc",
     "gpu/gbm_device.h",
+    "gpu/gbm_surface.cc",
+    "gpu/gbm_surface.h",
     "gpu/gbm_surface_factory.cc",
     "gpu/gbm_surface_factory.h",
     "gpu/gbm_surfaceless.cc",
@@ -137,8 +139,10 @@
     "//ui/events/platform",
     "//ui/gfx",
     "//ui/gfx/geometry",
+    "//ui/gl",
     "//ui/ozone:ozone_base",
     "//ui/ozone/common",
+    "//ui/ozone/gl",
     "//ui/platform_window",
   ]
 
diff --git a/ui/ozone/platform/drm/gbm.gypi b/ui/ozone/platform/drm/gbm.gypi
index ff131da..bb1640a8 100644
--- a/ui/ozone/platform/drm/gbm.gypi
+++ b/ui/ozone/platform/drm/gbm.gypi
@@ -33,6 +33,7 @@
       'target_name': 'ozone_platform_gbm',
       'type': 'static_library',
       'dependencies': [
+        'gl/ozone_gl.gyp:ozone_gl',
         'ozone.gyp:ozone_base',
         'ozone.gyp:ozone_common',
         '../../base/base.gyp:base',
@@ -49,6 +50,7 @@
         '../events/ozone/events_ozone.gyp:events_ozone_evdev',
         '../events/ozone/events_ozone.gyp:events_ozone_layout',
         '../events/platform/events_platform.gyp:events_platform',
+        '../gl/gl.gyp:gl',
         '../gfx/gfx.gyp:gfx',
         '../gfx/gfx.gyp:gfx_geometry',
         'drm_atomic',
@@ -104,6 +106,8 @@
         'gpu/gbm_buffer_base.h',
         'gpu/gbm_device.cc',
         'gpu/gbm_device.h',
+        'gpu/gbm_surface.cc',
+        'gpu/gbm_surface.h',
         'gpu/gbm_surface_factory.cc',
         'gpu/gbm_surface_factory.h',
         'gpu/gbm_surfaceless.cc',
diff --git a/ui/ozone/platform/drm/gpu/gbm_surface.cc b/ui/ozone/platform/drm/gpu/gbm_surface.cc
new file mode 100644
index 0000000..566d0c7
--- /dev/null
+++ b/ui/ozone/platform/drm/gpu/gbm_surface.cc
@@ -0,0 +1,148 @@
+// 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 "ui/ozone/platform/drm/gpu/gbm_surface.h"
+
+#include <utility>
+
+#include "base/logging.h"
+#include "ui/gl/gl_surface_egl.h"
+#include "ui/ozone/gl/gl_image_ozone_native_pixmap.h"
+#include "ui/ozone/platform/drm/gpu/drm_window_proxy.h"
+#include "ui/ozone/platform/drm/gpu/gbm_surface_factory.h"
+#include "ui/ozone/public/native_pixmap.h"
+
+namespace ui {
+
+GbmSurface::GbmSurface(GbmSurfaceFactory* surface_factory,
+                       std::unique_ptr<DrmWindowProxy> window,
+                       gfx::AcceleratedWidget widget)
+    : GbmSurfaceless(surface_factory, std::move(window), widget) {
+  for (auto& texture : textures_)
+    texture = 0;
+}
+
+unsigned int GbmSurface::GetBackingFrameBufferObject() {
+  return fbo_;
+}
+
+bool GbmSurface::OnMakeCurrent(gl::GLContext* context) {
+  DCHECK(!context_ || context == context_);
+  context_ = context;
+  if (!fbo_) {
+    glGenFramebuffersEXT(1, &fbo_);
+    if (!fbo_)
+      return false;
+    glGenTextures(arraysize(textures_), textures_);
+    if (!CreatePixmaps())
+      return false;
+  }
+  BindFramebuffer();
+  glBindFramebufferEXT(GL_FRAMEBUFFER, fbo_);
+  return SurfacelessEGL::OnMakeCurrent(context);
+}
+
+bool GbmSurface::Resize(const gfx::Size& size,
+                        float scale_factor,
+                        bool has_alpha) {
+  if (size == GetSize())
+    return true;
+  // Alpha value isn't actually used in allocating buffers yet, so always use
+  // true instead.
+  return GbmSurfaceless::Resize(size, scale_factor, true) && CreatePixmaps();
+}
+
+bool GbmSurface::SupportsPostSubBuffer() {
+  return false;
+}
+
+void GbmSurface::SwapBuffersAsync(const SwapCompletionCallback& callback) {
+  if (!images_[current_surface_]->ScheduleOverlayPlane(
+          widget(), 0, gfx::OverlayTransform::OVERLAY_TRANSFORM_NONE,
+          gfx::Rect(GetSize()), gfx::RectF(1, 1))) {
+    callback.Run(gfx::SwapResult::SWAP_FAILED);
+    return;
+  }
+  GbmSurfaceless::SwapBuffersAsync(callback);
+  current_surface_ ^= 1;
+  BindFramebuffer();
+}
+
+void GbmSurface::Destroy() {
+  if (!context_)
+    return;
+  scoped_refptr<gl::GLContext> previous_context = gl::GLContext::GetCurrent();
+  scoped_refptr<GLSurface> previous_surface;
+
+  bool was_current = previous_context && previous_context->IsCurrent(nullptr) &&
+                     GLSurface::GetCurrent() == this;
+  if (!was_current) {
+    // Only take a reference to previous surface if it's not |this|
+    // because otherwise we can take a self reference from our own dtor.
+    previous_surface = GLSurface::GetCurrent();
+    context_->MakeCurrent(this);
+  }
+
+  glBindFramebufferEXT(GL_FRAMEBUFFER, 0);
+  if (fbo_) {
+    glDeleteTextures(arraysize(textures_), textures_);
+    for (auto& texture : textures_)
+      texture = 0;
+    glDeleteFramebuffersEXT(1, &fbo_);
+    fbo_ = 0;
+  }
+  for (auto image : images_) {
+    if (image)
+      image->Destroy(true);
+  }
+
+  if (!was_current) {
+    if (previous_context) {
+      previous_context->MakeCurrent(previous_surface.get());
+    } else {
+      context_->ReleaseCurrent(this);
+    }
+  }
+}
+
+bool GbmSurface::IsSurfaceless() const {
+  return false;
+}
+
+GbmSurface::~GbmSurface() {
+  Destroy();
+}
+
+void GbmSurface::BindFramebuffer() {
+  gl::ScopedFrameBufferBinder fb(fbo_);
+  glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                            textures_[current_surface_], 0);
+}
+
+bool GbmSurface::CreatePixmaps() {
+  if (!fbo_)
+    return true;
+  for (size_t i = 0; i < arraysize(textures_); i++) {
+    scoped_refptr<NativePixmap> pixmap = surface_factory()->CreateNativePixmap(
+        widget(), GetSize(), gfx::BufferFormat::BGRA_8888,
+        gfx::BufferUsage::SCANOUT);
+    if (!pixmap)
+      return false;
+    scoped_refptr<GLImageOzoneNativePixmap> image =
+        new GLImageOzoneNativePixmap(GetSize(), GL_BGRA_EXT);
+    if (!image->Initialize(pixmap.get(), gfx::BufferFormat::BGRA_8888))
+      return false;
+    // GLImage must have Destroy() called before destructor is called.
+    if (images_[i])
+      images_[i]->Destroy(true);
+    images_[i] = image;
+    // Bind image to texture.
+    gl::ScopedTextureBinder binder(GL_TEXTURE_2D, textures_[i]);
+    if (!images_[i]->BindTexImage(GL_TEXTURE_2D))
+      return false;
+  }
+  return true;
+}
+
+}  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/gbm_surface.h b/ui/ozone/platform/drm/gpu/gbm_surface.h
new file mode 100644
index 0000000..372a095c
--- /dev/null
+++ b/ui/ozone/platform/drm/gpu/gbm_surface.h
@@ -0,0 +1,57 @@
+// 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 UI_OZONE_PLATFORM_DRM_GPU_GBM_SURFACE_H_
+#define UI_OZONE_PLATFORM_DRM_GPU_GBM_SURFACE_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_image.h"
+#include "ui/ozone/platform/drm/gpu/gbm_surfaceless.h"
+
+namespace ui {
+
+class DrmWindowProxy;
+class GbmSurfaceFactory;
+
+// A GLSurface for GBM Ozone platform provides surface-like semantics
+// implemented through surfaceless. A framebuffer is bound automatically.
+class GbmSurface : public GbmSurfaceless {
+ public:
+  GbmSurface(GbmSurfaceFactory* surface_factory,
+             std::unique_ptr<DrmWindowProxy> window,
+             gfx::AcceleratedWidget widget);
+
+  // gl::GLSurface:
+  unsigned int GetBackingFrameBufferObject() override;
+  bool OnMakeCurrent(gl::GLContext* context) override;
+  bool Resize(const gfx::Size& size,
+              float scale_factor,
+              bool has_alpha) override;
+  bool SupportsPostSubBuffer() override;
+  void SwapBuffersAsync(const SwapCompletionCallback& callback) override;
+  void Destroy() override;
+  bool IsSurfaceless() const override;
+
+ private:
+  ~GbmSurface() override;
+
+  void BindFramebuffer();
+  bool CreatePixmaps();
+
+  scoped_refptr<gl::GLContext> context_;
+  GLuint fbo_ = 0;
+  GLuint textures_[2];
+  scoped_refptr<gl::GLImage> images_[2];
+  int current_surface_ = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(GbmSurface);
+};
+
+}  // namespace ui
+
+#endif  // UI_OZONE_PLATFORM_DRM_GPU_GBM_SURFACE_H_
diff --git a/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc b/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
index 48b2039..1633000 100644
--- a/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
+++ b/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
@@ -6,22 +6,25 @@
 
 #include <gbm.h>
 
+#include <utility>
+
 #include "base/files/file_path.h"
 #include "base/memory/ptr_util.h"
 #include "build/build_config.h"
 #include "third_party/khronos/EGL/egl.h"
 #include "ui/gfx/buffer_format_util.h"
+#include "ui/gl/gl_surface_egl.h"
 #include "ui/ozone/common/egl_util.h"
 #include "ui/ozone/platform/drm/common/drm_util.h"
 #include "ui/ozone/platform/drm/gpu/drm_thread_proxy.h"
 #include "ui/ozone/platform/drm/gpu/drm_window_proxy.h"
 #include "ui/ozone/platform/drm/gpu/gbm_buffer.h"
+#include "ui/ozone/platform/drm/gpu/gbm_surface.h"
 #include "ui/ozone/platform/drm/gpu/gbm_surfaceless.h"
 #include "ui/ozone/platform/drm/gpu/proxy_helpers.h"
 #include "ui/ozone/platform/drm/gpu/screen_manager.h"
 #include "ui/ozone/public/native_pixmap.h"
 #include "ui/ozone/public/surface_ozone_canvas.h"
-#include "ui/ozone/public/surface_ozone_egl.h"
 
 namespace ui {
 
@@ -51,6 +54,54 @@
   return it->second;
 }
 
+bool GbmSurfaceFactory::UseNewSurfaceAPI() {
+  return true;
+}
+
+scoped_refptr<gl::GLSurface> GbmSurfaceFactory::CreateViewGLSurface(
+    gl::GLImplementation implementation,
+    gfx::AcceleratedWidget widget) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+
+  if (implementation != gl::kGLImplementationEGLGLES2) {
+    NOTREACHED();
+    return nullptr;
+  }
+
+  return gl::InitializeGLSurface(
+      new GbmSurface(this, drm_thread_->CreateDrmWindowProxy(widget), widget));
+}
+
+scoped_refptr<gl::GLSurface> GbmSurfaceFactory::CreateSurfacelessViewGLSurface(
+    gl::GLImplementation implementation,
+    gfx::AcceleratedWidget widget) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+
+  if (implementation != gl::kGLImplementationEGLGLES2) {
+    NOTREACHED();
+    return nullptr;
+  }
+
+  return gl::InitializeGLSurface(new GbmSurfaceless(
+      this, drm_thread_->CreateDrmWindowProxy(widget), widget));
+}
+
+scoped_refptr<gl::GLSurface> GbmSurfaceFactory::CreateOffscreenGLSurface(
+    gl::GLImplementation implementation,
+    const gfx::Size& size) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+
+  if (implementation != gl::kGLImplementationEGLGLES2) {
+    NOTREACHED();
+    return nullptr;
+  }
+
+  DCHECK_EQ(size.width(), 0);
+  DCHECK_EQ(size.height(), 0);
+
+  return gl::InitializeGLSurface(new gl::SurfacelessEGL(size));
+}
+
 intptr_t GbmSurfaceFactory::GetNativeDisplay() {
   DCHECK(thread_checker_.CalledOnValidThread());
   return EGL_DEFAULT_DISPLAY;
@@ -70,20 +121,6 @@
   return nullptr;
 }
 
-std::unique_ptr<SurfaceOzoneEGL> GbmSurfaceFactory::CreateEGLSurfaceForWidget(
-    gfx::AcceleratedWidget widget) {
-  NOTREACHED();
-  return nullptr;
-}
-
-std::unique_ptr<SurfaceOzoneEGL>
-GbmSurfaceFactory::CreateSurfacelessEGLSurfaceForWidget(
-    gfx::AcceleratedWidget widget) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  return base::WrapUnique(
-      new GbmSurfaceless(drm_thread_->CreateDrmWindowProxy(widget), this));
-}
-
 std::vector<gfx::BufferFormat> GbmSurfaceFactory::GetScanoutFormats(
     gfx::AcceleratedWidget widget) {
   std::vector<gfx::BufferFormat> scanout_formats;
diff --git a/ui/ozone/platform/drm/gpu/gbm_surface_factory.h b/ui/ozone/platform/drm/gpu/gbm_surface_factory.h
index 71ab8e7..f35edf1 100644
--- a/ui/ozone/platform/drm/gpu/gbm_surface_factory.h
+++ b/ui/ozone/platform/drm/gpu/gbm_surface_factory.h
@@ -8,10 +8,13 @@
 #include <stdint.h>
 
 #include <map>
+#include <memory>
 #include <vector>
 
 #include "base/macros.h"
 #include "base/threading/thread_checker.h"
+#include "ui/gl/gl_implementation.h"
+#include "ui/gl/gl_surface.h"
 #include "ui/ozone/public/surface_factory_ozone.h"
 
 namespace ui {
@@ -30,6 +33,17 @@
   GbmSurfaceless* GetSurface(gfx::AcceleratedWidget widget) const;
 
   // SurfaceFactoryOzone:
+  bool UseNewSurfaceAPI() override;
+  scoped_refptr<gl::GLSurface> CreateViewGLSurface(
+      gl::GLImplementation implementation,
+      gfx::AcceleratedWidget widget) override;
+  scoped_refptr<gl::GLSurface> CreateSurfacelessViewGLSurface(
+      gl::GLImplementation implementation,
+      gfx::AcceleratedWidget widget) override;
+  scoped_refptr<gl::GLSurface> CreateOffscreenGLSurface(
+      gl::GLImplementation implementation,
+      const gfx::Size& size) override;
+
   intptr_t GetNativeDisplay() override;
   std::vector<gfx::BufferFormat> GetScanoutFormats(
       gfx::AcceleratedWidget widget) override;
@@ -38,10 +52,6 @@
       SetGLGetProcAddressProcCallback set_gl_get_proc_address) override;
   std::unique_ptr<SurfaceOzoneCanvas> CreateCanvasForWidget(
       gfx::AcceleratedWidget widget) override;
-  std::unique_ptr<ui::SurfaceOzoneEGL> CreateEGLSurfaceForWidget(
-      gfx::AcceleratedWidget w) override;
-  std::unique_ptr<SurfaceOzoneEGL> CreateSurfacelessEGLSurfaceForWidget(
-      gfx::AcceleratedWidget widget) override;
   scoped_refptr<ui::NativePixmap> CreateNativePixmap(
       gfx::AcceleratedWidget widget,
       gfx::Size size,
diff --git a/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc b/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
index 9631d282..2fe3306 100644
--- a/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
+++ b/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
@@ -1,4 +1,4 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// 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.
 
@@ -6,11 +6,12 @@
 
 #include <utility>
 
+#include "base/bind.h"
+#include "base/logging.h"
 #include "base/memory/ptr_util.h"
+#include "base/threading/worker_pool.h"
 #include "base/trace_event/trace_event.h"
-#include "third_party/khronos/EGL/egl.h"
 #include "ui/ozone/common/egl_util.h"
-#include "ui/ozone/platform/drm/gpu/drm_device.h"
 #include "ui/ozone/platform/drm/gpu/drm_vsync_provider.h"
 #include "ui/ozone/platform/drm/gpu/drm_window_proxy.h"
 #include "ui/ozone/platform/drm/gpu/gbm_surface_factory.h"
@@ -18,67 +19,232 @@
 
 namespace ui {
 
-GbmSurfaceless::GbmSurfaceless(std::unique_ptr<DrmWindowProxy> window,
-                               GbmSurfaceFactory* surface_manager)
-    : window_(std::move(window)), surface_manager_(surface_manager) {
-  surface_manager_->RegisterSurface(window_->widget(), this);
+namespace {
+
+void WaitForFence(EGLDisplay display, EGLSyncKHR fence) {
+  eglClientWaitSyncKHR(display, fence, EGL_SYNC_FLUSH_COMMANDS_BIT_KHR,
+                       EGL_FOREVER_KHR);
 }
 
-GbmSurfaceless::~GbmSurfaceless() {
-  surface_manager_->UnregisterSurface(window_->widget());
+}  // namespace
+
+GbmSurfaceless::GbmSurfaceless(GbmSurfaceFactory* surface_factory,
+                               std::unique_ptr<DrmWindowProxy> window,
+                               gfx::AcceleratedWidget widget)
+    : SurfacelessEGL(gfx::Size()),
+      surface_factory_(surface_factory),
+      window_(std::move(window)),
+      widget_(widget),
+      has_implicit_external_sync_(
+          HasEGLExtension("EGL_ARM_implicit_external_sync")),
+      has_image_flush_external_(
+          HasEGLExtension("EGL_EXT_image_flush_external")),
+      weak_factory_(this) {
+  surface_factory_->RegisterSurface(window_->widget(), this);
+  unsubmitted_frames_.push_back(new PendingFrame());
 }
 
 void GbmSurfaceless::QueueOverlayPlane(const OverlayPlane& plane) {
   planes_.push_back(plane);
 }
 
-intptr_t GbmSurfaceless::GetNativeWindow() {
-  NOTREACHED();
-  return 0;
-}
-
-bool GbmSurfaceless::ResizeNativeWindow(const gfx::Size& viewport_size) {
+bool GbmSurfaceless::Initialize(gl::GLSurface::Format format) {
+  if (!SurfacelessEGL::Initialize(format))
+    return false;
+  vsync_provider_ = base::MakeUnique<DrmVSyncProvider>(window_.get());
+  if (!vsync_provider_)
+    return false;
   return true;
 }
 
-bool GbmSurfaceless::OnSwapBuffers() {
+gfx::SwapResult GbmSurfaceless::SwapBuffers() {
   NOTREACHED();
+  return gfx::SwapResult::SWAP_FAILED;
+}
+
+bool GbmSurfaceless::ScheduleOverlayPlane(int z_order,
+                                          gfx::OverlayTransform transform,
+                                          gl::GLImage* image,
+                                          const gfx::Rect& bounds_rect,
+                                          const gfx::RectF& crop_rect) {
+  unsubmitted_frames_.back()->overlays.push_back(
+      gl::GLSurfaceOverlay(z_order, transform, image, bounds_rect, crop_rect));
+  return true;
+}
+
+bool GbmSurfaceless::IsOffscreen() {
   return false;
 }
 
-void GbmSurfaceless::OnSwapBuffersAsync(
-    const SwapCompletionCallback& callback) {
-  TRACE_EVENT0("drm", "GbmSurfaceless::OnSwapBuffersAsync");
-  window_->SchedulePageFlip(planes_, callback);
-  planes_.clear();
+gfx::VSyncProvider* GbmSurfaceless::GetVSyncProvider() {
+  return vsync_provider_.get();
 }
 
-std::unique_ptr<gfx::VSyncProvider> GbmSurfaceless::CreateVSyncProvider() {
-  return base::WrapUnique(new DrmVSyncProvider(window_.get()));
+bool GbmSurfaceless::SupportsAsyncSwap() {
+  return true;
+}
+
+bool GbmSurfaceless::SupportsPostSubBuffer() {
+  return true;
+}
+
+gfx::SwapResult GbmSurfaceless::PostSubBuffer(int x,
+                                              int y,
+                                              int width,
+                                              int height) {
+  // The actual sub buffer handling is handled at higher layers.
+  NOTREACHED();
+  return gfx::SwapResult::SWAP_FAILED;
+}
+
+void GbmSurfaceless::SwapBuffersAsync(const SwapCompletionCallback& callback) {
+  TRACE_EVENT0("drm", "GbmSurfaceless::SwapBuffersAsync");
+  // If last swap failed, don't try to schedule new ones.
+  if (!last_swap_buffers_result_) {
+    callback.Run(gfx::SwapResult::SWAP_FAILED);
+    return;
+  }
+
+  glFlush();
+  unsubmitted_frames_.back()->Flush();
+
+  SwapCompletionCallback surface_swap_callback = base::Bind(
+      &GbmSurfaceless::SwapCompleted, weak_factory_.GetWeakPtr(), callback);
+
+  PendingFrame* frame = unsubmitted_frames_.back();
+  frame->callback = surface_swap_callback;
+  unsubmitted_frames_.push_back(new PendingFrame());
+
+  // TODO: the following should be replaced by a per surface flush as it gets
+  // implemented in GL drivers.
+  if (has_implicit_external_sync_ || has_image_flush_external_) {
+    EGLSyncKHR fence = InsertFence(has_implicit_external_sync_);
+    if (!fence) {
+      callback.Run(gfx::SwapResult::SWAP_FAILED);
+      return;
+    }
+
+    base::Closure fence_wait_task =
+        base::Bind(&WaitForFence, GetDisplay(), fence);
+
+    base::Closure fence_retired_callback =
+        base::Bind(&GbmSurfaceless::FenceRetired, weak_factory_.GetWeakPtr(),
+                   fence, frame);
+
+    base::WorkerPool::PostTaskAndReply(FROM_HERE, fence_wait_task,
+                                       fence_retired_callback, false);
+    return;  // Defer frame submission until fence signals.
+  }
+
+  frame->ready = true;
+  SubmitFrame();
+}
+
+void GbmSurfaceless::PostSubBufferAsync(
+    int x,
+    int y,
+    int width,
+    int height,
+    const SwapCompletionCallback& callback) {
+  // The actual sub buffer handling is handled at higher layers.
+  SwapBuffersAsync(callback);
+}
+
+EGLConfig GbmSurfaceless::GetConfig() {
+  if (!config_) {
+    EGLint config_attribs[] = {EGL_BUFFER_SIZE,
+                               32,
+                               EGL_ALPHA_SIZE,
+                               8,
+                               EGL_BLUE_SIZE,
+                               8,
+                               EGL_GREEN_SIZE,
+                               8,
+                               EGL_RED_SIZE,
+                               8,
+                               EGL_RENDERABLE_TYPE,
+                               EGL_OPENGL_ES2_BIT,
+                               EGL_SURFACE_TYPE,
+                               EGL_DONT_CARE,
+                               EGL_NONE};
+    config_ = ChooseEGLConfig(GetDisplay(), config_attribs);
+  }
+  return config_;
+}
+
+GbmSurfaceless::~GbmSurfaceless() {
+  Destroy();  // The EGL surface must be destroyed before SurfaceOzone.
+  surface_factory_->UnregisterSurface(window_->widget());
+}
+
+GbmSurfaceless::PendingFrame::PendingFrame() {}
+
+GbmSurfaceless::PendingFrame::~PendingFrame() {}
+
+bool GbmSurfaceless::PendingFrame::ScheduleOverlayPlanes(
+    gfx::AcceleratedWidget widget) {
+  for (const auto& overlay : overlays)
+    if (!overlay.ScheduleOverlayPlane(widget))
+      return false;
+  return true;
+}
+
+void GbmSurfaceless::PendingFrame::Flush() {
+  for (const auto& overlay : overlays)
+    overlay.Flush();
+}
+
+void GbmSurfaceless::SubmitFrame() {
+  DCHECK(!unsubmitted_frames_.empty());
+
+  if (unsubmitted_frames_.front()->ready && !swap_buffers_pending_) {
+    std::unique_ptr<PendingFrame> frame(unsubmitted_frames_.front());
+    unsubmitted_frames_.weak_erase(unsubmitted_frames_.begin());
+    swap_buffers_pending_ = true;
+
+    if (!frame->ScheduleOverlayPlanes(widget_)) {
+      // |callback| is a wrapper for SwapCompleted(). Call it to properly
+      // propagate the failed state.
+      frame->callback.Run(gfx::SwapResult::SWAP_FAILED);
+      return;
+    }
+
+    if (IsUniversalDisplayLinkDevice())
+      glFinish();
+
+    window_->SchedulePageFlip(planes_, frame->callback);
+    planes_.clear();
+  }
+}
+
+EGLSyncKHR GbmSurfaceless::InsertFence(bool implicit) {
+  const EGLint attrib_list[] = {EGL_SYNC_CONDITION_KHR,
+                                EGL_SYNC_PRIOR_COMMANDS_IMPLICIT_EXTERNAL_ARM,
+                                EGL_NONE};
+  return eglCreateSyncKHR(GetDisplay(), EGL_SYNC_FENCE_KHR,
+                          implicit ? attrib_list : NULL);
+}
+
+void GbmSurfaceless::FenceRetired(EGLSyncKHR fence, PendingFrame* frame) {
+  eglDestroySyncKHR(GetDisplay(), fence);
+  frame->ready = true;
+  SubmitFrame();
+}
+
+void GbmSurfaceless::SwapCompleted(const SwapCompletionCallback& callback,
+                                   gfx::SwapResult result) {
+  callback.Run(result);
+  swap_buffers_pending_ = false;
+  if (result == gfx::SwapResult::SWAP_FAILED) {
+    last_swap_buffers_result_ = false;
+    return;
+  }
+
+  SubmitFrame();
 }
 
 bool GbmSurfaceless::IsUniversalDisplayLinkDevice() {
   return planes_.empty() ? false : planes_[0].buffer->RequiresGlFinish();
 }
 
-void* /* EGLConfig */ GbmSurfaceless::GetEGLSurfaceConfig(
-    const EglConfigCallbacks& egl) {
-  EGLint config_attribs[] = {EGL_BUFFER_SIZE,
-                             32,
-                             EGL_ALPHA_SIZE,
-                             8,
-                             EGL_BLUE_SIZE,
-                             8,
-                             EGL_GREEN_SIZE,
-                             8,
-                             EGL_RED_SIZE,
-                             8,
-                             EGL_RENDERABLE_TYPE,
-                             EGL_OPENGL_ES2_BIT,
-                             EGL_SURFACE_TYPE,
-                             EGL_DONT_CARE,
-                             EGL_NONE};
-  return ChooseEGLConfig(egl, config_attribs);
-}
-
 }  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/gbm_surfaceless.h b/ui/ozone/platform/drm/gpu/gbm_surfaceless.h
index 50e38caa..303ededa 100644
--- a/ui/ozone/platform/drm/gpu/gbm_surfaceless.h
+++ b/ui/ozone/platform/drm/gpu/gbm_surfaceless.h
@@ -1,56 +1,105 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// 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 UI_OZONE_PLATFORM_DRM_GPU_GBM_SURFACELESS_H_
 #define UI_OZONE_PLATFORM_DRM_GPU_GBM_SURFACELESS_H_
 
+#include <memory>
 #include <vector>
 
 #include "base/macros.h"
+#include "base/memory/scoped_vector.h"
+#include "base/memory/weak_ptr.h"
 #include "ui/gfx/native_widget_types.h"
+#include "ui/gl/gl_image.h"
+#include "ui/gl/gl_surface_egl.h"
+#include "ui/gl/gl_surface_overlay.h"
+#include "ui/gl/scoped_binders.h"
 #include "ui/ozone/platform/drm/gpu/overlay_plane.h"
-#include "ui/ozone/public/surface_ozone_egl.h"
-
-namespace gfx {
-class Size;
-}
 
 namespace ui {
 
 class DrmWindowProxy;
 class GbmSurfaceFactory;
 
-// In surfaceless mode drawing and displaying happens directly through
-// NativePixmap buffers. CC would call into SurfaceFactoryOzone to allocate the
-// buffers and then call ScheduleOverlayPlane(..) to schedule the buffer for
-// presentation.
-class GbmSurfaceless : public SurfaceOzoneEGL {
+// A GLSurface for GBM Ozone platform that uses surfaceless drawing. Drawing and
+// displaying happens directly through NativePixmap buffers. CC would call into
+// SurfaceFactoryOzone to allocate the buffers and then call
+// ScheduleOverlayPlane(..) to schedule the buffer for presentation.
+class GbmSurfaceless : public gl::SurfacelessEGL {
  public:
-  GbmSurfaceless(std::unique_ptr<DrmWindowProxy> window,
-                 GbmSurfaceFactory* surface_manager);
-  ~GbmSurfaceless() override;
+  GbmSurfaceless(GbmSurfaceFactory* surface_factory,
+                 std::unique_ptr<DrmWindowProxy> window,
+                 gfx::AcceleratedWidget widget);
 
   void QueueOverlayPlane(const OverlayPlane& plane);
 
-  // SurfaceOzoneEGL:
-  intptr_t GetNativeWindow() override;
-  bool ResizeNativeWindow(const gfx::Size& viewport_size) override;
-  bool OnSwapBuffers() override;
-  void OnSwapBuffersAsync(const SwapCompletionCallback& callback) override;
-  std::unique_ptr<gfx::VSyncProvider> CreateVSyncProvider() override;
-  bool IsUniversalDisplayLinkDevice() override;
-  void* /* EGLConfig */ GetEGLSurfaceConfig(
-      const EglConfigCallbacks& egl) override;
+  // gl::GLSurface:
+  bool Initialize(GLSurface::Format format) override;
+  gfx::SwapResult SwapBuffers() override;
+  bool ScheduleOverlayPlane(int z_order,
+                            gfx::OverlayTransform transform,
+                            gl::GLImage* image,
+                            const gfx::Rect& bounds_rect,
+                            const gfx::RectF& crop_rect) override;
+  bool IsOffscreen() override;
+  gfx::VSyncProvider* GetVSyncProvider() override;
+  bool SupportsAsyncSwap() override;
+  bool SupportsPostSubBuffer() override;
+  gfx::SwapResult PostSubBuffer(int x, int y, int width, int height) override;
+  void SwapBuffersAsync(const SwapCompletionCallback& callback) override;
+  void PostSubBufferAsync(int x,
+                          int y,
+                          int width,
+                          int height,
+                          const SwapCompletionCallback& callback) override;
+  EGLConfig GetConfig() override;
 
  protected:
-  std::unique_ptr<DrmWindowProxy> window_;
+  ~GbmSurfaceless() override;
 
-  GbmSurfaceFactory* surface_manager_;
-
-  std::vector<OverlayPlane> planes_;
+  gfx::AcceleratedWidget widget() { return widget_; }
+  GbmSurfaceFactory* surface_factory() { return surface_factory_; }
 
  private:
+  struct PendingFrame {
+    PendingFrame();
+    ~PendingFrame();
+
+    bool ScheduleOverlayPlanes(gfx::AcceleratedWidget widget);
+    void Flush();
+
+    bool ready = false;
+    std::vector<gl::GLSurfaceOverlay> overlays;
+    SwapCompletionCallback callback;
+  };
+
+  void SubmitFrame();
+
+  EGLSyncKHR InsertFence(bool implicit);
+  void FenceRetired(EGLSyncKHR fence, PendingFrame* frame);
+
+  void SwapCompleted(const SwapCompletionCallback& callback,
+                     gfx::SwapResult result);
+
+  bool IsUniversalDisplayLinkDevice();
+
+  GbmSurfaceFactory* surface_factory_;
+  std::unique_ptr<DrmWindowProxy> window_;
+  std::vector<OverlayPlane> planes_;
+
+  // The native surface. Deleting this is allowed to free the EGLNativeWindow.
+  gfx::AcceleratedWidget widget_;
+  std::unique_ptr<gfx::VSyncProvider> vsync_provider_;
+  ScopedVector<PendingFrame> unsubmitted_frames_;
+  bool has_implicit_external_sync_;
+  bool has_image_flush_external_;
+  bool last_swap_buffers_result_ = true;
+  bool swap_buffers_pending_ = false;
+
+  base::WeakPtrFactory<GbmSurfaceless> weak_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(GbmSurfaceless);
 };
 
diff --git a/ui/views/cocoa/bridged_content_view.mm b/ui/views/cocoa/bridged_content_view.mm
index 625cb43..9e3eb49 100644
--- a/ui/views/cocoa/bridged_content_view.mm
+++ b/ui/views/cocoa/bridged_content_view.mm
@@ -1073,6 +1073,13 @@
   [self deleteToEndOfLine:sender];
 }
 
+- (void)yank:(id)sender {
+  [self handleAction:ui::TextEditCommand::YANK
+             keyCode:ui::VKEY_Y
+             domCode:ui::DomCode::US_Y
+          eventFlags:ui::EF_CONTROL_DOWN];
+}
+
 // Cancellation.
 
 - (void)cancelOperation:(id)sender {
diff --git a/ui/views/cocoa/bridged_native_widget_unittest.mm b/ui/views/cocoa/bridged_native_widget_unittest.mm
index 4554eee..7e99a918 100644
--- a/ui/views/cocoa/bridged_native_widget_unittest.mm
+++ b/ui/views/cocoa/bridged_native_widget_unittest.mm
@@ -25,6 +25,7 @@
 #import "ui/views/cocoa/native_widget_mac_nswindow.h"
 #import "ui/views/cocoa/views_nswindow_delegate.h"
 #include "ui/views/controls/textfield/textfield.h"
+#include "ui/views/controls/textfield/textfield_model.h"
 #include "ui/views/view.h"
 #include "ui/views/widget/native_widget_mac.h"
 #include "ui/views/widget/root_view.h"
@@ -113,7 +114,7 @@
 ];
 
 NSArray* const kMiscActions =
-    @[ @"insertText:", @"cancelOperation:", @"transpose:" ];
+    @[ @"insertText:", @"cancelOperation:", @"transpose:", @"yank:" ];
 
 // Empty range shortcut for readibility.
 NSRange EmptyRange() {
@@ -449,6 +450,9 @@
 }
 
 void BridgedNativeWidgetTest::TearDown() {
+  // Clear kill buffer so that no state persists between tests.
+  TextfieldModel::ClearKillBuffer();
+
   if (bridge())
     bridge()->SetRootView(nullptr);
   view_.reset();
@@ -483,6 +487,12 @@
   EXPECT_NSEQ_3(@" bar ", GetExpectedText(), GetActualText());
   EXPECT_EQ_RANGE_3(NSMakeRange(5, 0), GetExpectedSelectionRange(),
                     GetActualSelectionRange());
+
+  // Verify yanking inserts the deleted text.
+  PerformCommand(@selector(yank:));
+  EXPECT_NSEQ_3(@" bar baz", GetExpectedText(), GetActualText());
+  EXPECT_EQ_RANGE_3(NSMakeRange(8, 0), GetExpectedSelectionRange(),
+                    GetActualSelectionRange());
 }
 
 void BridgedNativeWidgetTest::TestDeleteEnd(SEL sel) {
@@ -511,6 +521,12 @@
   EXPECT_NSEQ_3(@"bar", GetExpectedText(), GetActualText());
   EXPECT_EQ_RANGE_3(NSMakeRange(0, 0), GetExpectedSelectionRange(),
                     GetActualSelectionRange());
+
+  // Verify yanking inserts the deleted text.
+  PerformCommand(@selector(yank:));
+  EXPECT_NSEQ_3(@"foo bar", GetExpectedText(), GetActualText());
+  EXPECT_EQ_RANGE_3(NSMakeRange(4, 0), GetExpectedSelectionRange(),
+                    GetActualSelectionRange());
 }
 
 void BridgedNativeWidgetTest::TestEditingCommands(NSArray* selectors) {
@@ -897,6 +913,12 @@
   EXPECT_EQ_RANGE_3(NSMakeRange(0, 0), GetExpectedSelectionRange(),
                     GetActualSelectionRange());
 
+  // Verify that deletion did not modify the kill buffer.
+  PerformCommand(@selector(yank:));
+  EXPECT_NSEQ_3(nil, GetExpectedText(), GetActualText());
+  EXPECT_EQ_RANGE_3(NSMakeRange(0, 0), GetExpectedSelectionRange(),
+                    GetActualSelectionRange());
+
   // Try to delete again on an empty string.
   PerformCommand(@selector(deleteBackward:));
   EXPECT_NSEQ_3(nil, GetExpectedText(), GetActualText());
@@ -922,6 +944,12 @@
   EXPECT_NSEQ_3(nil, GetExpectedText(), GetActualText());
   EXPECT_EQ_RANGE_3(NSMakeRange(0, 0), GetExpectedSelectionRange(),
                     GetActualSelectionRange());
+
+  // Verify that deletion did not modify the kill buffer.
+  PerformCommand(@selector(yank:));
+  EXPECT_NSEQ_3(nil, GetExpectedText(), GetActualText());
+  EXPECT_EQ_RANGE_3(NSMakeRange(0, 0), GetExpectedSelectionRange(),
+                    GetActualSelectionRange());
 }
 
 // Test forward word deletion using text input protocol.
@@ -951,6 +979,12 @@
   EXPECT_NSEQ_3(@"o b baz", GetExpectedText(), GetActualText());
   EXPECT_EQ_RANGE_3(NSMakeRange(0, 0), GetExpectedSelectionRange(),
                     GetActualSelectionRange());
+
+  // Verify that deletion did not modify the kill buffer.
+  PerformCommand(@selector(yank:));
+  EXPECT_NSEQ_3(@"o b baz", GetExpectedText(), GetActualText());
+  EXPECT_EQ_RANGE_3(NSMakeRange(0, 0), GetExpectedSelectionRange(),
+                    GetActualSelectionRange());
 }
 
 // Test backward word deletion using text input protocol.
@@ -982,6 +1016,12 @@
   EXPECT_NSEQ_3(@"faz", GetExpectedText(), GetActualText());
   EXPECT_EQ_RANGE_3(NSMakeRange(1, 0), GetExpectedSelectionRange(),
                     GetActualSelectionRange());
+
+  // Verify that deletion did not modify the kill buffer.
+  PerformCommand(@selector(yank:));
+  EXPECT_NSEQ_3(@"faz", GetExpectedText(), GetActualText());
+  EXPECT_EQ_RANGE_3(NSMakeRange(1, 0), GetExpectedSelectionRange(),
+                    GetActualSelectionRange());
 }
 
 // Test deleting to beginning/end of line/paragraph using text input protocol.
diff --git a/ui/views/controls/table/table_view.cc b/ui/views/controls/table/table_view.cc
index 9ef4fe95..9ce94cc 100644
--- a/ui/views/controls/table/table_view.cc
+++ b/ui/views/controls/table/table_view.cc
@@ -234,15 +234,20 @@
 void TableView::ToggleSortOrder(int visible_column_index) {
   DCHECK(visible_column_index >= 0 &&
          visible_column_index < static_cast<int>(visible_columns_.size()));
-  if (!visible_columns_[visible_column_index].column.sortable)
+  const ui::TableColumn& column = visible_columns_[visible_column_index].column;
+  if (!column.sortable)
     return;
-  const int column_id = visible_columns_[visible_column_index].column.id;
   SortDescriptors sort(sort_descriptors_);
-  if (!sort.empty() && sort[0].column_id == column_id) {
-    sort[0].ascending = !sort[0].ascending;
+  if (!sort.empty() && sort[0].column_id == column.id) {
+    if (sort[0].ascending == column.initial_sort_is_ascending) {
+      // First toggle inverts the order.
+      sort[0].ascending = !sort[0].ascending;
+    } else {
+      // Second toggle clears the sort.
+      sort.clear();
+    }
   } else {
-    SortDescriptor descriptor(column_id, visible_columns_[
-        visible_column_index].column.initial_sort_is_ascending);
+    SortDescriptor descriptor(column.id, column.initial_sort_is_ascending);
     sort.insert(sort.begin(), descriptor);
     // Only persist two sort descriptors.
     if (sort.size() > 2)
@@ -251,6 +256,13 @@
   SetSortDescriptors(sort);
 }
 
+void TableView::SetSortDescriptors(const SortDescriptors& sort_descriptors) {
+  sort_descriptors_ = sort_descriptors;
+  SortItemsAndUpdateMapping();
+  if (header_)
+    header_->SchedulePaint();
+}
+
 bool TableView::IsColumnVisible(int id) const {
   for (size_t i = 0; i < visible_columns_.size(); ++i) {
     if (visible_columns_[i].column.id == id)
@@ -640,13 +652,6 @@
   SchedulePaint();
 }
 
-void TableView::SetSortDescriptors(const SortDescriptors& sort_descriptors) {
-  sort_descriptors_ = sort_descriptors;
-  SortItemsAndUpdateMapping();
-  if (header_)
-    header_->SchedulePaint();
-}
-
 void TableView::SortItemsAndUpdateMapping() {
   if (!is_sorted()) {
     view_to_model_.clear();
diff --git a/ui/views/controls/table/table_view.h b/ui/views/controls/table/table_view.h
index fc7f0281..3c2e954 100644
--- a/ui/views/controls/table/table_view.h
+++ b/ui/views/controls/table/table_view.h
@@ -154,10 +154,17 @@
   // Sets the width of the column. |index| is in terms of |visible_columns_|.
   void SetVisibleColumnWidth(int index, int width);
 
-  // Toggles the sort order of the specified visible column index.
+  // Modify the table sort order, depending on a clicked column and the previous
+  // table sort order. Does nothing if this column is not sortable.
+  //
+  // When called repeatedly on the same sortable column, the sort order will
+  // cycle through three states in order: sorted -> reverse-sorted -> unsorted.
+  // When switching from one sort column to another, the previous sort column
+  // will be remembered and used as a secondary sort key.
   void ToggleSortOrder(int visible_column_index);
 
   const SortDescriptors& sort_descriptors() const { return sort_descriptors_; }
+  void SetSortDescriptors(const SortDescriptors& descriptors);
   bool is_sorted() const { return !sort_descriptors_.empty(); }
 
   // Maps from the index in terms of the model to that of the view.
@@ -227,9 +234,6 @@
   // Invoked when the number of rows changes in some way.
   void NumRowsChanged();
 
-  // Resets the sort descriptions.
-  void SetSortDescriptors(const SortDescriptors& sort_descriptors);
-
   // Does the actual sort and updates the mappings (|view_to_model_| and
   // |model_to_view_|) appropriately.
   void SortItemsAndUpdateMapping();
diff --git a/ui/views/controls/table/table_view_unittest.cc b/ui/views/controls/table/table_view_unittest.cc
index 9fb6bb0..c94994c 100644
--- a/ui/views/controls/table/table_view_unittest.cc
+++ b/ui/views/controls/table/table_view_unittest.cc
@@ -161,6 +161,29 @@
   return result;
 }
 
+// Formats the whole table as a string, like: "[a, b, c], [d, e, f]". Rows
+// scrolled out of view are included; hidden columns are excluded.
+std::string GetRowsInViewOrderAsString(TableView* table) {
+  std::string result;
+  for (int i = 0; i < table->RowCount(); ++i) {
+    if (i != 0)
+      result += ", ";  // Comma between each row.
+
+    // Format row |i| like this: "[value1, value2, value3]"
+    result += "[";
+    for (size_t j = 0; j < table->visible_columns().size(); ++j) {
+      const ui::TableColumn& column = table->visible_columns()[j].column;
+      if (j != 0)
+        result += ", ";  // Comma between each value in the row.
+
+      result += base::UTF16ToUTF8(
+          table->model()->GetText(table->ViewToModel(i), column.id));
+    }
+    result += "]";
+  }
+  return result;
+}
+
 class TestTableView : public TableView {
  public:
   TestTableView(ui::TableModel* model,
@@ -335,6 +358,13 @@
 
 // Assertions for table sorting.
 TEST_F(TableViewTest, Sort) {
+  // Initial ordering.
+  EXPECT_TRUE(table_->sort_descriptors().empty());
+  EXPECT_EQ("0 1 2 3", GetViewToModelAsString(table_));
+  EXPECT_EQ("0 1 2 3", GetModelToViewAsString(table_));
+  EXPECT_EQ("[0, 1], [1, 1], [2, 2], [3, 0]",
+            GetRowsInViewOrderAsString(table_));
+
   // Toggle the sort order of the first column, shouldn't change anything.
   table_->ToggleSortOrder(0);
   ASSERT_EQ(1u, table_->sort_descriptors().size());
@@ -342,46 +372,119 @@
   EXPECT_TRUE(table_->sort_descriptors()[0].ascending);
   EXPECT_EQ("0 1 2 3", GetViewToModelAsString(table_));
   EXPECT_EQ("0 1 2 3", GetModelToViewAsString(table_));
+  EXPECT_EQ("[0, 1], [1, 1], [2, 2], [3, 0]",
+            GetRowsInViewOrderAsString(table_));
 
-  // Invert the sort (first column descending).
+  // Toggle the sort (first column descending).
   table_->ToggleSortOrder(0);
   ASSERT_EQ(1u, table_->sort_descriptors().size());
   EXPECT_EQ(0, table_->sort_descriptors()[0].column_id);
   EXPECT_FALSE(table_->sort_descriptors()[0].ascending);
   EXPECT_EQ("3 2 1 0", GetViewToModelAsString(table_));
   EXPECT_EQ("3 2 1 0", GetModelToViewAsString(table_));
+  EXPECT_EQ("[3, 0], [2, 2], [1, 1], [0, 1]",
+            GetRowsInViewOrderAsString(table_));
 
-  // Change cell 0x3 to -1, meaning we have 0, 1, 2, -1 (in the first column).
+  // Change the [3, 0] cell to [-1, 0]. This should move it to the back of
+  // the current sort order.
   model_->ChangeRow(3, -1, 0);
   ASSERT_EQ(1u, table_->sort_descriptors().size());
   EXPECT_EQ(0, table_->sort_descriptors()[0].column_id);
   EXPECT_FALSE(table_->sort_descriptors()[0].ascending);
   EXPECT_EQ("2 1 0 3", GetViewToModelAsString(table_));
   EXPECT_EQ("2 1 0 3", GetModelToViewAsString(table_));
+  EXPECT_EQ("[2, 2], [1, 1], [0, 1], [-1, 0]",
+            GetRowsInViewOrderAsString(table_));
 
-  // Invert sort again (first column ascending).
+  // Toggle the sort again, to clear the sort and restore the model ordering.
+  table_->ToggleSortOrder(0);
+  EXPECT_TRUE(table_->sort_descriptors().empty());
+  EXPECT_EQ("0 1 2 3", GetViewToModelAsString(table_));
+  EXPECT_EQ("0 1 2 3", GetModelToViewAsString(table_));
+  EXPECT_EQ("[0, 1], [1, 1], [2, 2], [-1, 0]",
+            GetRowsInViewOrderAsString(table_));
+
+  // Toggle the sort again (first column ascending).
   table_->ToggleSortOrder(0);
   ASSERT_EQ(1u, table_->sort_descriptors().size());
   EXPECT_EQ(0, table_->sort_descriptors()[0].column_id);
   EXPECT_TRUE(table_->sort_descriptors()[0].ascending);
   EXPECT_EQ("3 0 1 2", GetViewToModelAsString(table_));
   EXPECT_EQ("1 2 3 0", GetModelToViewAsString(table_));
+  EXPECT_EQ("[-1, 0], [0, 1], [1, 1], [2, 2]",
+            GetRowsInViewOrderAsString(table_));
 
-  // Add a row so that model has 0, 3, 1, 2, -1.
+  // Add a row that's second in the model order, but last in the active sort
+  // order.
   model_->AddRow(1, 3, 4);
   ASSERT_EQ(1u, table_->sort_descriptors().size());
   EXPECT_EQ(0, table_->sort_descriptors()[0].column_id);
   EXPECT_TRUE(table_->sort_descriptors()[0].ascending);
   EXPECT_EQ("4 0 2 3 1", GetViewToModelAsString(table_));
   EXPECT_EQ("1 4 2 3 0", GetModelToViewAsString(table_));
+  EXPECT_EQ("[-1, 0], [0, 1], [1, 1], [2, 2], [3, 4]",
+            GetRowsInViewOrderAsString(table_));
 
-  // Delete the first row, ending up with 3, 1, 2, -1.
-  model_->RemoveRow(0);
+  // Add a row that's last in the model order but second in the the active sort
+  // order.
+  model_->AddRow(5, -1, 20);
   ASSERT_EQ(1u, table_->sort_descriptors().size());
   EXPECT_EQ(0, table_->sort_descriptors()[0].column_id);
   EXPECT_TRUE(table_->sort_descriptors()[0].ascending);
-  EXPECT_EQ("3 1 2 0", GetViewToModelAsString(table_));
-  EXPECT_EQ("3 1 2 0", GetModelToViewAsString(table_));
+  EXPECT_EQ("4 5 0 2 3 1", GetViewToModelAsString(table_));
+  EXPECT_EQ("2 5 3 4 0 1", GetModelToViewAsString(table_));
+  EXPECT_EQ("[-1, 0], [-1, 20], [0, 1], [1, 1], [2, 2], [3, 4]",
+            GetRowsInViewOrderAsString(table_));
+
+  // Click the first column again, then click the second column. This should
+  // yield an ordering of second column ascending, with the first column
+  // descending as a tiebreaker.
+  table_->ToggleSortOrder(0);
+  table_->ToggleSortOrder(1);
+  ASSERT_EQ(2u, table_->sort_descriptors().size());
+  EXPECT_EQ(1, table_->sort_descriptors()[0].column_id);
+  EXPECT_TRUE(table_->sort_descriptors()[0].ascending);
+  EXPECT_EQ(0, table_->sort_descriptors()[1].column_id);
+  EXPECT_FALSE(table_->sort_descriptors()[1].ascending);
+  EXPECT_EQ("4 2 0 3 1 5", GetViewToModelAsString(table_));
+  EXPECT_EQ("2 4 1 3 0 5", GetModelToViewAsString(table_));
+  EXPECT_EQ("[-1, 0], [1, 1], [0, 1], [2, 2], [3, 4], [-1, 20]",
+            GetRowsInViewOrderAsString(table_));
+
+  // Toggle the current column to change from ascending to descending. This
+  // should result in an almost-reversal of the previous order, except for the
+  // two rows with the same value for the second column.
+  table_->ToggleSortOrder(1);
+  ASSERT_EQ(2u, table_->sort_descriptors().size());
+  EXPECT_EQ(1, table_->sort_descriptors()[0].column_id);
+  EXPECT_FALSE(table_->sort_descriptors()[0].ascending);
+  EXPECT_EQ(0, table_->sort_descriptors()[1].column_id);
+  EXPECT_FALSE(table_->sort_descriptors()[1].ascending);
+  EXPECT_EQ("5 1 3 2 0 4", GetViewToModelAsString(table_));
+  EXPECT_EQ("4 1 3 2 5 0", GetModelToViewAsString(table_));
+  EXPECT_EQ("[-1, 20], [3, 4], [2, 2], [1, 1], [0, 1], [-1, 0]",
+            GetRowsInViewOrderAsString(table_));
+
+  // Delete the [0, 1] row from the model. It's at model index zero.
+  model_->RemoveRow(0);
+  ASSERT_EQ(2u, table_->sort_descriptors().size());
+  EXPECT_EQ(1, table_->sort_descriptors()[0].column_id);
+  EXPECT_FALSE(table_->sort_descriptors()[0].ascending);
+  EXPECT_EQ(0, table_->sort_descriptors()[1].column_id);
+  EXPECT_FALSE(table_->sort_descriptors()[1].ascending);
+  EXPECT_EQ("4 0 2 1 3", GetViewToModelAsString(table_));
+  EXPECT_EQ("1 3 2 4 0", GetModelToViewAsString(table_));
+  EXPECT_EQ("[-1, 20], [3, 4], [2, 2], [1, 1], [-1, 0]",
+            GetRowsInViewOrderAsString(table_));
+
+  // Toggle the current sort column again. This should clear both the primary
+  // and secondary sort descriptor.
+  table_->ToggleSortOrder(1);
+  EXPECT_TRUE(table_->sort_descriptors().empty());
+  EXPECT_EQ("0 1 2 3 4", GetViewToModelAsString(table_));
+  EXPECT_EQ("0 1 2 3 4", GetModelToViewAsString(table_));
+  EXPECT_EQ("[3, 4], [1, 1], [2, 2], [-1, 0], [-1, 20]",
+            GetRowsInViewOrderAsString(table_));
 }
 
 // Verfies clicking on the header sorts.
@@ -501,7 +604,13 @@
   EXPECT_EQ("0 1 2 3", GetViewToModelAsString(table_));
   EXPECT_EQ("0 1 2 3", GetModelToViewAsString(table_));
 
-  // Toggle to ascending sort.
+  // Toggle to clear the sort.
+  table_->ToggleSortOrder(0);
+  EXPECT_TRUE(table_->sort_descriptors().empty());
+  EXPECT_EQ("0 1 2 3", GetViewToModelAsString(table_));
+  EXPECT_EQ("0 1 2 3", GetModelToViewAsString(table_));
+
+  // Toggle again to effect an ascending sort.
   table_->ToggleSortOrder(0);
   ASSERT_EQ(1u, table_->sort_descriptors().size());
   EXPECT_EQ(0, table_->sort_descriptors()[0].column_id);
diff --git a/ui/views/controls/textfield/textfield.cc b/ui/views/controls/textfield/textfield.cc
index 381fef4..be796b2 100644
--- a/ui/views/controls/textfield/textfield.cc
+++ b/ui/views/controls/textfield/textfield.cc
@@ -1493,6 +1493,8 @@
     case ui::TextEditCommand::TRANSPOSE:
       return editable && !model_->HasSelection() &&
              !model_->HasCompositionText();
+    case ui::TextEditCommand::YANK:
+      return editable;
     case ui::TextEditCommand::MOVE_DOWN:
     case ui::TextEditCommand::MOVE_DOWN_AND_MODIFY_SELECTION:
     case ui::TextEditCommand::MOVE_PAGE_DOWN:
@@ -1543,21 +1545,24 @@
 void Textfield::ExecuteTextEditCommand(ui::TextEditCommand command) {
   DestroyTouchSelection();
 
+  bool add_to_kill_buffer = false;
+
   // Some codepaths may bypass GetCommandForKeyEvent, so any selection-dependent
   // modifications of the command should happen here.
-  if (HasSelection()) {
-    switch (command) {
-      case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE:
-      case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_PARAGRAPH:
-      case ui::TextEditCommand::DELETE_TO_END_OF_LINE:
-      case ui::TextEditCommand::DELETE_TO_END_OF_PARAGRAPH:
-      case ui::TextEditCommand::DELETE_WORD_BACKWARD:
-      case ui::TextEditCommand::DELETE_WORD_FORWARD:
+  switch (command) {
+    case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE:
+    case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_PARAGRAPH:
+    case ui::TextEditCommand::DELETE_TO_END_OF_LINE:
+    case ui::TextEditCommand::DELETE_TO_END_OF_PARAGRAPH:
+      add_to_kill_buffer = true;
+    // Fall through.
+    case ui::TextEditCommand::DELETE_WORD_BACKWARD:
+    case ui::TextEditCommand::DELETE_WORD_FORWARD:
+      if (HasSelection())
         command = ui::TextEditCommand::DELETE_FORWARD;
-        break;
-      default:
-        break;
-    }
+      break;
+    default:
+      break;
   }
 
   // We only execute the commands enabled in Textfield::IsTextEditCommandEnabled
@@ -1575,28 +1580,28 @@
   OnBeforeUserAction();
   switch (command) {
     case ui::TextEditCommand::DELETE_BACKWARD:
-      text_changed = cursor_changed = model_->Backspace();
+      text_changed = cursor_changed = model_->Backspace(add_to_kill_buffer);
       break;
     case ui::TextEditCommand::DELETE_FORWARD:
-      text_changed = cursor_changed = model_->Delete();
+      text_changed = cursor_changed = model_->Delete(add_to_kill_buffer);
       break;
     case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_LINE:
     case ui::TextEditCommand::DELETE_TO_BEGINNING_OF_PARAGRAPH:
       model_->MoveCursor(gfx::LINE_BREAK, begin, true);
-      text_changed = cursor_changed = model_->Backspace();
+      text_changed = cursor_changed = model_->Backspace(add_to_kill_buffer);
       break;
     case ui::TextEditCommand::DELETE_TO_END_OF_LINE:
     case ui::TextEditCommand::DELETE_TO_END_OF_PARAGRAPH:
       model_->MoveCursor(gfx::LINE_BREAK, end, true);
-      text_changed = cursor_changed = model_->Delete();
+      text_changed = cursor_changed = model_->Delete(add_to_kill_buffer);
       break;
     case ui::TextEditCommand::DELETE_WORD_BACKWARD:
       model_->MoveCursor(gfx::WORD_BREAK, begin, true);
-      text_changed = cursor_changed = model_->Backspace();
+      text_changed = cursor_changed = model_->Backspace(add_to_kill_buffer);
       break;
     case ui::TextEditCommand::DELETE_WORD_FORWARD:
       model_->MoveCursor(gfx::WORD_BREAK, end, true);
-      text_changed = cursor_changed = model_->Delete();
+      text_changed = cursor_changed = model_->Delete(add_to_kill_buffer);
       break;
     case ui::TextEditCommand::MOVE_BACKWARD:
       model_->MoveCursor(gfx::CHARACTER_BREAK, begin, false);
@@ -1689,6 +1694,9 @@
     case ui::TextEditCommand::TRANSPOSE:
       text_changed = cursor_changed = model_->Transpose();
       break;
+    case ui::TextEditCommand::YANK:
+      text_changed = cursor_changed = model_->Yank();
+      break;
     case ui::TextEditCommand::MOVE_DOWN:
     case ui::TextEditCommand::MOVE_DOWN_AND_MODIFY_SELECTION:
     case ui::TextEditCommand::MOVE_PAGE_DOWN:
diff --git a/ui/views/controls/textfield/textfield_model.cc b/ui/views/controls/textfield/textfield_model.cc
index 7c6d5917..bdcb552 100644
--- a/ui/views/controls/textfield/textfield_model.cc
+++ b/ui/views/controls/textfield/textfield_model.cc
@@ -8,6 +8,7 @@
 
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/message_loop/message_loop.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -263,6 +264,24 @@
   return gfx::Range::InvalidRange();
 }
 
+// Returns a pointer to the kill buffer which holds the text to be inserted on
+// executing yank command. Singleton since it needs to be persisted across
+// multiple textfields.
+// On Mac, the size of the kill ring (no. of buffers) is controlled by
+// NSTextKillRingSize, a text system default. However to keep things simple,
+// the default kill ring size of 1 (i.e. a single buffer) is assumed.
+base::string16* GetKillBuffer() {
+  CR_DEFINE_STATIC_LOCAL(base::string16, kill_buffer, ());
+  DCHECK(base::MessageLoopForUI::IsCurrent());
+  return &kill_buffer;
+}
+
+// Helper method to set the kill buffer.
+void SetKillBuffer(const base::string16& buffer) {
+  base::string16* kill_buffer = GetKillBuffer();
+  *kill_buffer = buffer;
+}
+
 }  // namespace
 
 using internal::Edit;
@@ -325,13 +344,15 @@
   ClearSelection();
 }
 
-bool TextfieldModel::Delete() {
+bool TextfieldModel::Delete(bool add_to_kill_buffer) {
   if (HasCompositionText()) {
     // No undo/redo for composition text.
     CancelCompositionText();
     return true;
   }
   if (HasSelection()) {
+    if (add_to_kill_buffer)
+      SetKillBuffer(GetSelectedText());
     DeleteSelection();
     return true;
   }
@@ -339,28 +360,36 @@
     size_t cursor_position = GetCursorPosition();
     size_t next_grapheme_index = render_text_->IndexOfAdjacentGrapheme(
         cursor_position, gfx::CURSOR_FORWARD);
-    ExecuteAndRecordDelete(gfx::Range(cursor_position, next_grapheme_index),
-                           true);
+    gfx::Range range_to_delete(cursor_position, next_grapheme_index);
+    if (add_to_kill_buffer)
+      SetKillBuffer(GetTextFromRange(range_to_delete));
+    ExecuteAndRecordDelete(range_to_delete, true);
     return true;
   }
   return false;
 }
 
-bool TextfieldModel::Backspace() {
+bool TextfieldModel::Backspace(bool add_to_kill_buffer) {
   if (HasCompositionText()) {
     // No undo/redo for composition text.
     CancelCompositionText();
     return true;
   }
   if (HasSelection()) {
+    if (add_to_kill_buffer)
+      SetKillBuffer(GetSelectedText());
     DeleteSelection();
     return true;
   }
   size_t cursor_position = GetCursorPosition();
   if (cursor_position > 0) {
     // Delete one code point, which may be two UTF-16 words.
-    size_t previous_char = gfx::UTF16OffsetToIndex(text(), cursor_position, -1);
-    ExecuteAndRecordDelete(gfx::Range(cursor_position, previous_char), true);
+    size_t previous_grapheme_index =
+        gfx::UTF16OffsetToIndex(text(), cursor_position, -1);
+    gfx::Range range_to_delete(cursor_position, previous_grapheme_index);
+    if (add_to_kill_buffer)
+      SetKillBuffer(GetTextFromRange(range_to_delete));
+    ExecuteAndRecordDelete(range_to_delete, true);
     return true;
   }
   return false;
@@ -557,6 +586,15 @@
   return true;
 }
 
+bool TextfieldModel::Yank() {
+  const base::string16* kill_buffer = GetKillBuffer();
+  if (!kill_buffer->empty() || HasSelection()) {
+    InsertTextInternal(*kill_buffer, false);
+    return true;
+  }
+  return false;
+}
+
 bool TextfieldModel::HasSelection() const {
   return !render_text_->selection().is_empty();
 }
@@ -810,4 +848,9 @@
   // TODO(oshima): Select text that was just undone, like Mac (but not GTK).
 }
 
+// static
+void TextfieldModel::ClearKillBuffer() {
+  SetKillBuffer(base::string16());
+}
+
 }  // namespace views
diff --git a/ui/views/controls/textfield/textfield_model.h b/ui/views/controls/textfield/textfield_model.h
index df3e9754..88a07b17 100644
--- a/ui/views/controls/textfield/textfield_model.h
+++ b/ui/views/controls/textfield/textfield_model.h
@@ -37,6 +37,10 @@
 
 }  // namespace internal
 
+namespace test {
+class BridgedNativeWidgetTest;
+}  // namsespace test
+
 // A model that represents text content for a views::Textfield.
 // It supports editing, selection and cursor manipulation.
 class VIEWS_EXPORT TextfieldModel {
@@ -95,15 +99,17 @@
 
   // Deletes the first character after the current cursor position (as if, the
   // the user has pressed delete key in the textfield). Returns true if
-  // the deletion is successful.
+  // the deletion is successful. If |add_to_kill_buffer| is true, the deleted
+  // text is copied to the kill buffer.
   // If there is composition text, it'll be deleted instead.
-  bool Delete();
+  bool Delete(bool add_to_kill_buffer = false);
 
   // Deletes the first character before the current cursor position (as if, the
   // the user has pressed backspace key in the textfield). Returns true if
-  // the removal is successful.
+  // the removal is successful. If |add_to_kill_buffer| is true, the deleted
+  // text is copied to the kill buffer.
   // If there is composition text, it'll be deleted instead.
-  bool Backspace();
+  bool Backspace(bool add_to_kill_buffer = false);
 
   // Cursor related methods.
 
@@ -182,6 +188,10 @@
   // changed.
   bool Transpose();
 
+  // Pastes text from the kill buffer at the current cursor position. Returns
+  // true if the text has changed after yanking.
+  bool Yank();
+
   // Tells if any text is selected, even if the selection is in composition
   // text.
   bool HasSelection() const;
@@ -225,6 +235,9 @@
 
  private:
   friend class internal::Edit;
+  friend class test::BridgedNativeWidgetTest;
+  friend class TextfieldModelTest;
+  friend class TextfieldTest;
 
   FRIEND_TEST_ALL_PREFIXES(TextfieldModelTest, UndoRedo_BasicTest);
   FRIEND_TEST_ALL_PREFIXES(TextfieldModelTest, UndoRedo_CutCopyPasteTest);
@@ -269,6 +282,9 @@
 
   void ClearComposition();
 
+  // Clears the kill buffer. Used to clear global state between tests.
+  static void ClearKillBuffer();
+
   // The TextfieldModel::Delegate instance should be provided by the owner.
   Delegate* delegate_;
 
diff --git a/ui/views/controls/textfield/textfield_model_unittest.cc b/ui/views/controls/textfield/textfield_model_unittest.cc
index 3663816..62552abd 100644
--- a/ui/views/controls/textfield/textfield_model_unittest.cc
+++ b/ui/views/controls/textfield/textfield_model_unittest.cc
@@ -55,6 +55,14 @@
         composition_text_confirmed_or_cleared_(false) {
   }
 
+  // ::testing::Test:
+  void TearDown() override {
+    // Clear kill buffer used for "Yank" text editing command so that no state
+    // persists between tests.
+    TextfieldModel::ClearKillBuffer();
+    ViewsTestBase::TearDown();
+  }
+
   void OnCompositionTextConfirmedOrCleared() override {
     composition_text_confirmed_or_cleared_ = true;
   }
@@ -1653,4 +1661,52 @@
   }
 }
 
+TEST_F(TextfieldModelTest, Yank) {
+  TextfieldModel model(nullptr);
+  model.SetText(base::ASCIIToUTF16("abcde"));
+  model.SelectRange(gfx::Range(1, 3));
+
+  // Delete selection but don't add to kill buffer.
+  model.Delete(false);
+  EXPECT_STR_EQ("ade", model.text());
+
+  // Since the kill buffer is empty, yank should cause no change.
+  model.Yank();
+  EXPECT_STR_EQ("ade", model.text());
+
+  // Delete selection and add to kill buffer.
+  model.SelectRange(gfx::Range(0, 1));
+  model.Delete(true);
+  EXPECT_STR_EQ("de", model.text());
+
+  // Yank twice.
+  model.Yank();
+  model.Yank();
+  EXPECT_STR_EQ("aade", model.text());
+
+  // Ensure an empty deletion does not modify the kill buffer.
+  model.SelectRange(gfx::Range(4));
+  model.Delete(true);
+  model.Yank();
+  EXPECT_STR_EQ("aadea", model.text());
+
+  // Backspace twice but don't add to kill buffer.
+  model.Backspace(false);
+  model.Backspace(false);
+  EXPECT_STR_EQ("aad", model.text());
+
+  // Ensure kill buffer is not modified.
+  model.Yank();
+  EXPECT_STR_EQ("aada", model.text());
+
+  // Backspace twice, each time modifying the kill buffer.
+  model.Backspace(true);
+  model.Backspace(true);
+  EXPECT_STR_EQ("aa", model.text());
+
+  // Ensure yanking inserts the modified kill buffer text.
+  model.Yank();
+  EXPECT_STR_EQ("aad", model.text());
+}
+
 }  // namespace views
diff --git a/ui/views/controls/textfield/textfield_unittest.cc b/ui/views/controls/textfield/textfield_unittest.cc
index c6e4fba..affd8dc 100644
--- a/ui/views/controls/textfield/textfield_unittest.cc
+++ b/ui/views/controls/textfield/textfield_unittest.cc
@@ -378,6 +378,9 @@
   void TearDown() override {
     if (widget_)
       widget_->Close();
+    // Clear kill buffer used for "Yank" text editing command so that no state
+    // persists between tests.
+    TextfieldModel::ClearKillBuffer();
     ViewsTestBase::TearDown();
   }
 
@@ -1838,8 +1841,9 @@
 }
 
 // Most platforms support Ctrl+Y as an alternative to Ctrl+Shift+Z, but on Mac
-// that is bound to "Show full history", so is not mapped as an editing
-// command. So, on Mac, send Cmd+Shift+Z.
+// Ctrl+Y is bound to "Yank" and Cmd+Y is bound to "Show full history". So, on
+// Mac, Cmd+Shift+Z is sent for the tests above and the Ctrl+Y test below is
+// skipped.
 #if !defined(OS_MACOSX)
 
 // Test that Ctrl+Y works for Redo, as well as Ctrl+Shift+Z.
@@ -1859,6 +1863,56 @@
 
 #endif  // !defined(OS_MACOSX)
 
+// Non-Mac platforms don't have a key binding for Yank. Since this test is only
+// run on Mac, it uses some Mac specific key bindings.
+#if defined(OS_MACOSX)
+
+TEST_F(TextfieldTest, Yank) {
+  InitTextfields(2);
+  textfield_->SetText(ASCIIToUTF16("abcdef"));
+  textfield_->SelectRange(gfx::Range(2, 4));
+
+  // Press Ctrl+Y to yank.
+  SendKeyPress(ui::VKEY_Y, ui::EF_CONTROL_DOWN);
+
+  // Initially the kill buffer should be empty. Hence yanking should delete the
+  // selected text.
+  EXPECT_STR_EQ("abef", textfield_->text());
+  EXPECT_EQ(gfx::Range(2), textfield_->GetSelectedRange());
+
+  // Press Ctrl+K to delete to end of paragraph. This should place the deleted
+  // text in the kill buffer.
+  SendKeyPress(ui::VKEY_K, ui::EF_CONTROL_DOWN);
+
+  EXPECT_STR_EQ("ab", textfield_->text());
+  EXPECT_EQ(gfx::Range(2), textfield_->GetSelectedRange());
+
+  // Yank twice.
+  SendKeyPress(ui::VKEY_Y, ui::EF_CONTROL_DOWN);
+  SendKeyPress(ui::VKEY_Y, ui::EF_CONTROL_DOWN);
+  EXPECT_STR_EQ("abefef", textfield_->text());
+  EXPECT_EQ(gfx::Range(6), textfield_->GetSelectedRange());
+
+  // Verify pressing backspace does not modify the kill buffer.
+  SendKeyEvent(ui::VKEY_BACK);
+  SendKeyPress(ui::VKEY_Y, ui::EF_CONTROL_DOWN);
+  EXPECT_STR_EQ("abefeef", textfield_->text());
+  EXPECT_EQ(gfx::Range(7), textfield_->GetSelectedRange());
+
+  // Move focus to next textfield.
+  widget_->GetFocusManager()->AdvanceFocus(false);
+  EXPECT_EQ(2, GetFocusedView()->id());
+  Textfield* textfield2 = static_cast<Textfield*>(GetFocusedView());
+  EXPECT_TRUE(textfield2->text().empty());
+
+  // Verify yanked text persists across multiple textfields.
+  SendKeyPress(ui::VKEY_Y, ui::EF_CONTROL_DOWN);
+  EXPECT_STR_EQ("ef", textfield2->text());
+  EXPECT_EQ(gfx::Range(2), textfield2->GetSelectedRange());
+}
+
+#endif  // defined(OS_MACOSX)
+
 TEST_F(TextfieldTest, CutCopyPaste) {
   InitTextfield();
 
diff --git a/ui/views/mus/aura_init.cc b/ui/views/mus/aura_init.cc
index 5335188..26eb071 100644
--- a/ui/views/mus/aura_init.cc
+++ b/ui/views/mus/aura_init.cc
@@ -19,7 +19,7 @@
 #include "ui/base/ui_base_paths.h"
 #include "ui/views/views_delegate.h"
 
-#if defined(OS_LINUX) && !defined(OS_ANDROID)
+#if defined(OS_LINUX)
 #include "components/font_service/public/cpp/font_loader.h"
 #endif
 
@@ -63,7 +63,7 @@
 }
 
 AuraInit::~AuraInit() {
-#if defined(OS_LINUX) && !defined(OS_ANDROID)
+#if defined(OS_LINUX)
   if (font_loader_.get()) {
     SkFontConfigInterface::SetGlobal(nullptr);
     // FontLoader is ref counted. We need to explicitly shutdown the background
@@ -91,7 +91,7 @@
       std::move(pak_file_2), ui::SCALE_FACTOR_100P);
 
 // Initialize the skia font code to go ask fontconfig underneath.
-#if defined(OS_LINUX) && !defined(OS_ANDROID)
+#if defined(OS_LINUX)
   font_loader_ = sk_make_sp<font_service::FontLoader>(connector);
   SkFontConfigInterface::SetGlobal(font_loader_.get());
 #endif
diff --git a/ui/views/mus/aura_init.h b/ui/views/mus/aura_init.h
index 9330845..d768276 100644
--- a/ui/views/mus/aura_init.h
+++ b/ui/views/mus/aura_init.h
@@ -38,7 +38,7 @@
  private:
   void InitializeResources(shell::Connector* connector);
 
-#if defined(OS_LINUX) && !defined(OS_ANDROID)
+#if defined(OS_LINUX)
   sk_sp<font_service::FontLoader> font_loader_;
 #endif
 
diff --git a/ui/views/mus/native_widget_mus.cc b/ui/views/mus/native_widget_mus.cc
index a628fe0..fd0053245 100644
--- a/ui/views/mus/native_widget_mus.cc
+++ b/ui/views/mus/native_widget_mus.cc
@@ -31,7 +31,6 @@
 #include "ui/base/view_prop.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
-#include "ui/display/screen.h"
 #include "ui/events/event.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/path.h"
@@ -967,7 +966,7 @@
   // NOTIMPLEMENTED();
 }
 
-void NativeWidgetMus::SetShape(SkRegion* shape) {
+void NativeWidgetMus::SetShape(std::unique_ptr<SkRegion> shape) {
   // NOTIMPLEMENTED();
 }
 
diff --git a/ui/views/mus/native_widget_mus.h b/ui/views/mus/native_widget_mus.h
index 472be9a3..3634de41 100644
--- a/ui/views/mus/native_widget_mus.h
+++ b/ui/views/mus/native_widget_mus.h
@@ -141,7 +141,7 @@
   void StackAbove(gfx::NativeView native_view) override;
   void StackAtTop() override;
   void StackBelow(gfx::NativeView native_view) override;
-  void SetShape(SkRegion* shape) override;
+  void SetShape(std::unique_ptr<SkRegion> shape) override;
   void Close() override;
   void CloseNow() override;
   void Show() override;
diff --git a/ui/views/mus/surface_context_factory.h b/ui/views/mus/surface_context_factory.h
index c0aa550c..69afdd6 100644
--- a/ui/views/mus/surface_context_factory.h
+++ b/ui/views/mus/surface_context_factory.h
@@ -55,6 +55,9 @@
                             const gfx::ColorSpace& color_space) override {}
   void SetAuthoritativeVSyncInterval(ui::Compositor* compositor,
                                      base::TimeDelta interval) override {}
+  void SetDisplayVSyncParameters(ui::Compositor* compositor,
+                                 base::TimeTicks timebase,
+                                 base::TimeDelta interval) override {}
   void SetOutputIsSecure(ui::Compositor* compositor, bool secure) override {}
   void AddObserver(ui::ContextFactoryObserver* observer) override {}
   void RemoveObserver(ui::ContextFactoryObserver* observer) override {}
diff --git a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
index 5afea83..b19ee7f7 100644
--- a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
+++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
@@ -707,9 +707,9 @@
 void DesktopNativeWidgetAura::StackBelow(gfx::NativeView native_view) {
 }
 
-void DesktopNativeWidgetAura::SetShape(SkRegion* shape) {
+void DesktopNativeWidgetAura::SetShape(std::unique_ptr<SkRegion> shape) {
   if (content_window_)
-    desktop_window_tree_host_->SetShape(shape);
+    desktop_window_tree_host_->SetShape(std::move(shape));
 }
 
 void DesktopNativeWidgetAura::Close() {
diff --git a/ui/views/widget/desktop_aura/desktop_native_widget_aura.h b/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
index 9322297..4ed4955 100644
--- a/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
+++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
@@ -129,7 +129,7 @@
   void StackAbove(gfx::NativeView native_view) override;
   void StackAtTop() override;
   void StackBelow(gfx::NativeView native_view) override;
-  void SetShape(SkRegion* shape) override;
+  void SetShape(std::unique_ptr<SkRegion> shape) override;
   void Close() override;
   void CloseNow() override;
   void Show() override;
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host.h b/ui/views/widget/desktop_aura/desktop_window_tree_host.h
index f12a231..17c3852 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host.h
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host.h
@@ -19,7 +19,7 @@
 namespace client {
 class DragDropClient;
 }
-}
+}  // namespace aura
 
 namespace gfx {
 class ImageSkia;
@@ -95,8 +95,8 @@
   virtual gfx::Rect GetWorkAreaBoundsInScreen() const = 0;
 
   // Sets the shape of the root window. If |native_region| is NULL then the
-  // window reverts to rectangular. Takes ownership of |native_region|.
-  virtual void SetShape(SkRegion* native_region) = 0;
+  // window reverts to rectangular.
+  virtual void SetShape(std::unique_ptr<SkRegion> native_region) = 0;
 
   virtual void Activate() = 0;
   virtual void Deactivate() = 0;
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
index f58bbaa..953349dc 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
@@ -304,35 +304,35 @@
   return display::win::ScreenWin::ScreenToDIPRect(GetHWND(), pixel_bounds);
 }
 
-void DesktopWindowTreeHostWin::SetShape(SkRegion* native_region) {
-  if (native_region) {
-    // TODO(wez): This would be a lot simpler if we were passed an SkPath.
-    // See crbug.com/410593.
-    SkRegion* shape = native_region;
-    SkRegion device_region;
-    if (display::win::GetDPIScale() > 1.0) {
-      shape = &device_region;
-      const float& scale = display::win::GetDPIScale();
-      std::vector<SkIRect> rects;
-      for (SkRegion::Iterator it(*native_region); !it.done(); it.next()) {
-        const SkIRect& rect = it.rect();
-        SkRect scaled_rect =
-            SkRect::MakeLTRB(rect.left() * scale, rect.top() * scale,
-                             rect.right() * scale, rect.bottom() * scale);
-        SkIRect rounded_scaled_rect;
-        scaled_rect.roundOut(&rounded_scaled_rect);
-        rects.push_back(rounded_scaled_rect);
-      }
-      if (!rects.empty())
-        device_region.setRects(&rects[0], rects.size());
-    }
-
-    message_handler_->SetRegion(gfx::CreateHRGNFromSkRegion(*shape));
-  } else {
-    message_handler_->SetRegion(NULL);
+void DesktopWindowTreeHostWin::SetShape(
+    std::unique_ptr<SkRegion> native_region) {
+  if (!native_region) {
+    message_handler_->SetRegion(nullptr);
+    return;
   }
 
-  delete native_region;
+  // TODO(wez): This would be a lot simpler if we were passed an SkPath.
+  // See crbug.com/410593.
+  SkRegion* shape = native_region.get();
+  SkRegion device_region;
+  if (display::win::GetDPIScale() > 1.0) {
+    shape = &device_region;
+    const float scale = display::win::GetDPIScale();
+    std::vector<SkIRect> rects;
+    for (SkRegion::Iterator it(*native_region); !it.done(); it.next()) {
+      const SkIRect& rect = it.rect();
+      SkRect scaled_rect =
+          SkRect::MakeLTRB(rect.left() * scale, rect.top() * scale,
+                           rect.right() * scale, rect.bottom() * scale);
+      SkIRect rounded_scaled_rect;
+      scaled_rect.roundOut(&rounded_scaled_rect);
+      rects.push_back(rounded_scaled_rect);
+    }
+    if (!rects.empty())
+      device_region.setRects(&rects[0], rects.size());
+  }
+
+  message_handler_->SetRegion(gfx::CreateHRGNFromSkRegion(*shape));
 }
 
 void DesktopWindowTreeHostWin::Activate() {
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
index ec0bd2a..e42e8393 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
@@ -68,7 +68,7 @@
   gfx::Rect GetRestoredBounds() const override;
   std::string GetWorkspace() const override;
   gfx::Rect GetWorkAreaBoundsInScreen() const override;
-  void SetShape(SkRegion* native_region) override;
+  void SetShape(std::unique_ptr<SkRegion> native_region) override;
   void Activate() override;
   void Deactivate() override;
   bool IsActive() const override;
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
index 51fc0e45..aeadc78 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
@@ -588,7 +588,8 @@
   return ToDIPRect(GetWorkAreaBoundsInPixels());
 }
 
-void DesktopWindowTreeHostX11::SetShape(SkRegion* native_region) {
+void DesktopWindowTreeHostX11::SetShape(
+    std::unique_ptr<SkRegion> native_region) {
   custom_window_shape_ = false;
   window_shape_.reset();
 
@@ -608,7 +609,6 @@
     }
 
     custom_window_shape_ = true;
-    delete native_region;
   }
   ResetWindowRegion();
 }
@@ -754,7 +754,7 @@
                   reinterpret_cast<const unsigned char*>(utf8str.c_str()),
                   utf8str.size());
   XTextProperty xtp;
-  char *c_utf8_str = const_cast<char *>(utf8str.c_str());
+  char* c_utf8_str = const_cast<char*>(utf8str.c_str());
   if (Xutf8TextListToTextProperty(xdisplay_, &c_utf8_str, 1,
                                   XUTF8StringStyle, &xtp) == Success) {
     XSetWMName(xdisplay_, xwindow_, &xtp);
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
index aced1ef5..b648c006 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
@@ -111,7 +111,7 @@
   gfx::Rect GetRestoredBounds() const override;
   std::string GetWorkspace() const override;
   gfx::Rect GetWorkAreaBoundsInScreen() const override;
-  void SetShape(SkRegion* native_region) override;
+  void SetShape(std::unique_ptr<SkRegion> native_region) override;
   void Activate() override;
   void Deactivate() override;
   bool IsActive() const override;
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc
index 52a3827..5426fe48 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_unittest.cc
@@ -53,10 +53,9 @@
       : X11PropertyChangeWaiter(window, "_NET_WM_STATE"),
         hint_(hint),
         wait_till_set_(wait_till_set) {
-
-    const char* kAtomsToCache[] = {
+    const char* const kAtomsToCache[] = {
         hint,
-        NULL
+        nullptr
     };
     atom_cache_.reset(new ui::X11AtomCache(gfx::GetXDisplay(), kAtomsToCache));
   }
@@ -90,7 +89,7 @@
 // A NonClientFrameView with a window mask with the bottom right corner cut out.
 class ShapedNonClientFrameView : public NonClientFrameView {
  public:
-  explicit ShapedNonClientFrameView() {
+  ShapedNonClientFrameView() {
   }
 
   ~ShapedNonClientFrameView() override {}
@@ -287,12 +286,12 @@
   shape2.lineTo(100, 0);
   shape2.close();
 
-  SkRegion* shape_region = new SkRegion;
+  auto shape_region = base::MakeUnique<SkRegion>();
   shape_region->setPath(shape2, SkRegion(shape2.getBounds().round()));
 
-  std::unique_ptr<Widget> widget2(CreateWidget(NULL));
+  std::unique_ptr<Widget> widget2(CreateWidget(nullptr));
   widget2->Show();
-  widget2->SetShape(shape_region);
+  widget2->SetShape(std::move(shape_region));
   ui::X11EventSource::GetInstance()->DispatchXEvents();
 
   XID xid2 = widget2->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
@@ -346,10 +345,10 @@
   // Emulate the window manager exiting fullscreen via a window manager
   // accelerator key. It should not affect the widget's fullscreen state.
   {
-    const char* kAtomsToCache[] = {
+    const char* const kAtomsToCache[] = {
         "_NET_WM_STATE",
         "_NET_WM_STATE_FULLSCREEN",
-        NULL
+        nullptr
     };
     Display* display = gfx::GetXDisplay();
     ui::X11AtomCache atom_cache(display, kAtomsToCache);
@@ -397,10 +396,10 @@
 
   // Minimize by sending _NET_WM_STATE_HIDDEN
   {
-    const char* kAtomsToCache[] = {
+    const char* const kAtomsToCache[] = {
         "_NET_WM_STATE",
         "_NET_WM_STATE_HIDDEN",
-        NULL
+        nullptr
     };
 
     ui::X11AtomCache atom_cache(display, kAtomsToCache);
@@ -429,10 +428,10 @@
 
   // Show from minimized by sending _NET_WM_STATE_FOCUSED
   {
-    const char* kAtomsToCache[] = {
+    const char* const kAtomsToCache[] = {
         "_NET_WM_STATE",
         "_NET_WM_STATE_FOCUSED",
-        NULL
+        nullptr
     };
 
     ui::X11AtomCache atom_cache(display, kAtomsToCache);
diff --git a/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc b/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc
index 22dc294f..9ca36c2 100644
--- a/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc
+++ b/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc
@@ -45,7 +45,7 @@
  public:
   explicit MinimizeWaiter(XID window)
       : X11PropertyChangeWaiter(window, "_NET_WM_STATE") {
-    const char* kAtomsToCache[] = { "_NET_WM_STATE_HIDDEN", NULL };
+    const char* const kAtomsToCache[] = {"_NET_WM_STATE_HIDDEN", nullptr};
     atom_cache_.reset(new ui::X11AtomCache(gfx::GetXDisplay(), kAtomsToCache));
   }
 
@@ -84,7 +84,7 @@
   void Wait() override {
     // StackingClientListWaiter may be created after
     // _NET_CLIENT_LIST_STACKING already contains |expected_windows|.
-    if (!ShouldKeepOnWaiting(NULL))
+    if (!ShouldKeepOnWaiting(nullptr))
       return;
 
     X11PropertyChangeWaiter::Wait();
@@ -248,7 +248,7 @@
   EXPECT_EQ(window1, FindTopmostLocalProcessWindowAt(150, 150));
 
   EXPECT_EQ(xid2, FindTopmostXWindowAt(250, 150));
-  EXPECT_EQ(NULL, FindTopmostLocalProcessWindowAt(250, 150));
+  EXPECT_FALSE(FindTopmostLocalProcessWindowAt(250, 150));
 
   EXPECT_EQ(xid3, FindTopmostXWindowAt(250, 250));
   EXPECT_EQ(window3, FindTopmostLocalProcessWindowAt(250, 250));
@@ -262,14 +262,12 @@
   EXPECT_NE(xid1, FindTopmostXWindowAt(1000, 1000));
   EXPECT_NE(xid2, FindTopmostXWindowAt(1000, 1000));
   EXPECT_NE(xid3, FindTopmostXWindowAt(1000, 1000));
-  EXPECT_EQ(NULL, FindTopmostLocalProcessWindowAt(1000, 1000));
+  EXPECT_FALSE(FindTopmostLocalProcessWindowAt(1000, 1000));
 
   EXPECT_EQ(window1,
             FindTopmostLocalProcessWindowWithIgnore(150, 150, window3));
-  EXPECT_EQ(NULL,
-            FindTopmostLocalProcessWindowWithIgnore(250, 250, window3));
-  EXPECT_EQ(NULL,
-            FindTopmostLocalProcessWindowWithIgnore(150, 250, window3));
+  EXPECT_FALSE(FindTopmostLocalProcessWindowWithIgnore(250, 250, window3));
+  EXPECT_FALSE(FindTopmostLocalProcessWindowWithIgnore(150, 250, window3));
   EXPECT_EQ(window1,
             FindTopmostLocalProcessWindowWithIgnore(150, 195, window3));
 
@@ -320,11 +318,10 @@
   std::unique_ptr<Widget> widget1(
       CreateAndShowWidget(gfx::Rect(100, 100, 100, 100)));
   XID xid1 = widget1->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
-  SkRegion* skregion1 = new SkRegion;
+  auto skregion1 = base::MakeUnique<SkRegion>();
   skregion1->op(SkIRect::MakeXYWH(0, 10, 10, 90), SkRegion::kUnion_Op);
   skregion1->op(SkIRect::MakeXYWH(10, 0, 90, 100), SkRegion::kUnion_Op);
-  // Widget takes ownership of |skregion1|.
-  widget1->SetShape(skregion1);
+  widget1->SetShape(std::move(skregion1));
 
   SkRegion skregion2;
   skregion2.op(SkIRect::MakeXYWH(0, 10, 10, 90), SkRegion::kUnion_Op);
@@ -360,10 +357,10 @@
   std::unique_ptr<Widget> widget1(
       CreateAndShowWidget(gfx::Rect(100, 100, 100, 100)));
   XID xid1 = widget1->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
-  SkRegion* skregion1 = new SkRegion;
+  auto skregion1 = base::MakeUnique<SkRegion>();
   skregion1->op(SkIRect::MakeXYWH(0, 0, 0, 0), SkRegion::kUnion_Op);
   // Widget takes ownership of |skregion1|.
-  widget1->SetShape(skregion1);
+  widget1->SetShape(std::move(skregion1));
 
   XID xids[] = { xid1 };
   StackingClientListWaiter stack_waiter(xids, arraysize(xids));
@@ -381,13 +378,12 @@
   std::unique_ptr<Widget> widget1(
       CreateAndShowWidget(gfx::Rect(100, 100, 100, 100)));
   XID xid1 = widget1->GetNativeWindow()->GetHost()->GetAcceleratedWidget();
-  SkRegion* skregion1 = new SkRegion;
+  auto skregion1 = base::MakeUnique<SkRegion>();
   skregion1->op(SkIRect::MakeXYWH(0, 0, 0, 0), SkRegion::kUnion_Op);
-  // Widget takes ownership of |skregion1|.
-  widget1->SetShape(skregion1);
+  widget1->SetShape(std::move(skregion1));
 
   // Remove the shape - this is now just a normal window.
-  widget1->SetShape(NULL);
+  widget1->SetShape(nullptr);
 
   XID xids[] = { xid1 };
   StackingClientListWaiter stack_waiter(xids, arraysize(xids));
@@ -415,7 +411,7 @@
                                CWOverrideRedirect,
                                &swa);
   {
-    const char* kAtomsToCache[] = { "_NET_WM_WINDOW_TYPE_MENU", NULL };
+    const char* const kAtomsToCache[] = {"_NET_WM_WINDOW_TYPE_MENU", nullptr};
     ui::X11AtomCache atom_cache(gfx::GetXDisplay(), kAtomsToCache);
     ui::SetAtomProperty(menu_xid,
                         "_NET_WM_WINDOW_TYPE",
diff --git a/ui/views/widget/native_widget_aura.cc b/ui/views/widget/native_widget_aura.cc
index a2b790b..1f72f3a 100644
--- a/ui/views/widget/native_widget_aura.cc
+++ b/ui/views/widget/native_widget_aura.cc
@@ -448,11 +448,9 @@
     window_->parent()->StackChildBelow(window_, native_view);
 }
 
-void NativeWidgetAura::SetShape(SkRegion* region) {
+void NativeWidgetAura::SetShape(std::unique_ptr<SkRegion> region) {
   if (window_)
-    window_->layer()->SetAlphaShape(base::WrapUnique(region));
-  else
-    delete region;
+    window_->layer()->SetAlphaShape(std::move(region));
 }
 
 void NativeWidgetAura::Close() {
diff --git a/ui/views/widget/native_widget_aura.h b/ui/views/widget/native_widget_aura.h
index 43b3ec42..77a4d38 100644
--- a/ui/views/widget/native_widget_aura.h
+++ b/ui/views/widget/native_widget_aura.h
@@ -89,7 +89,7 @@
   void StackAbove(gfx::NativeView native_view) override;
   void StackAtTop() override;
   void StackBelow(gfx::NativeView native_view) override;
-  void SetShape(SkRegion* shape) override;
+  void SetShape(std::unique_ptr<SkRegion> shape) override;
   void Close() override;
   void CloseNow() override;
   void Show() override;
diff --git a/ui/views/widget/native_widget_mac.h b/ui/views/widget/native_widget_mac.h
index 08ff8c30..9ee6855 100644
--- a/ui/views/widget/native_widget_mac.h
+++ b/ui/views/widget/native_widget_mac.h
@@ -25,7 +25,7 @@
 
 class VIEWS_EXPORT NativeWidgetMac : public internal::NativeWidgetPrivate {
  public:
-  NativeWidgetMac(internal::NativeWidgetDelegate* delegate);
+  explicit NativeWidgetMac(internal::NativeWidgetDelegate* delegate);
   ~NativeWidgetMac() override;
 
   // Retrieves the bridge associated with the given NSWindow. Returns null if
@@ -84,7 +84,7 @@
   void StackAbove(gfx::NativeView native_view) override;
   void StackAtTop() override;
   void StackBelow(gfx::NativeView native_view) override;
-  void SetShape(SkRegion* shape) override;
+  void SetShape(std::unique_ptr<SkRegion> shape) override;
   void Close() override;
   void CloseNow() override;
   void Show() override;
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm
index 00e5f50..b1e67e8c 100644
--- a/ui/views/widget/native_widget_mac.mm
+++ b/ui/views/widget/native_widget_mac.mm
@@ -336,7 +336,7 @@
   NOTIMPLEMENTED();
 }
 
-void NativeWidgetMac::SetShape(SkRegion* shape) {
+void NativeWidgetMac::SetShape(std::unique_ptr<SkRegion> shape) {
   NOTIMPLEMENTED();
 }
 
diff --git a/ui/views/widget/native_widget_private.h b/ui/views/widget/native_widget_private.h
index 21f4f894..7b3fb6d 100644
--- a/ui/views/widget/native_widget_private.h
+++ b/ui/views/widget/native_widget_private.h
@@ -5,6 +5,7 @@
 #ifndef UI_VIEWS_WIDGET_NATIVE_WIDGET_PRIVATE_H_
 #define UI_VIEWS_WIDGET_NATIVE_WIDGET_PRIVATE_H_
 
+#include <memory>
 #include <string>
 
 #include "base/strings/string16.h"
@@ -177,7 +178,7 @@
   virtual void StackAbove(gfx::NativeView native_view) = 0;
   virtual void StackAtTop() = 0;
   virtual void StackBelow(gfx::NativeView native_view) = 0;
-  virtual void SetShape(SkRegion* shape) = 0;
+  virtual void SetShape(std::unique_ptr<SkRegion> shape) = 0;
   virtual void Close() = 0;
   virtual void CloseNow() = 0;
   virtual void Show() = 0;
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc
index eebeb87..ca92c5b 100644
--- a/ui/views/widget/widget.cc
+++ b/ui/views/widget/widget.cc
@@ -557,8 +557,8 @@
   native_widget_->StackBelow(native_view);
 }
 
-void Widget::SetShape(SkRegion* shape) {
-  native_widget_->SetShape(shape);
+void Widget::SetShape(std::unique_ptr<SkRegion> shape) {
+  native_widget_->SetShape(std::move(shape));
 }
 
 void Widget::Close() {
diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h
index 4e1617fd..a92dbce 100644
--- a/ui/views/widget/widget.h
+++ b/ui/views/widget/widget.h
@@ -8,7 +8,6 @@
 #include <map>
 #include <memory>
 #include <set>
-#include <stack>
 #include <string>
 #include <vector>
 
@@ -59,7 +58,7 @@
 class OSExchangeData;
 class ThemeProvider;
 class Window;
-}
+}  // namespace ui
 
 namespace views {
 
@@ -476,8 +475,8 @@
   void StackBelow(gfx::NativeView native_view);
 
   // Sets a shape on the widget. Passing a NULL |shape| reverts the widget to
-  // be rectangular. Takes ownership of |shape|.
-  void SetShape(SkRegion* shape);
+  // be rectangular.
+  void SetShape(std::unique_ptr<SkRegion> shape);
 
   // Hides the widget then closes it after a return to the message loop.
   virtual void Close();
diff --git a/ui/webui/resources/js/polymer_config.js b/ui/webui/resources/js/polymer_config.js
index 02e4d9f3..f747921 100644
--- a/ui/webui/resources/js/polymer_config.js
+++ b/ui/webui/resources/js/polymer_config.js
@@ -6,7 +6,8 @@
   Polymer = {
     dom: 'shadow',
     lazyRegister: true,
-    useNativeCSSProperties: true,
+    // TODO(dbeam): re-enable when this doesn't break things.
+    // useNativeCSSProperties: true,
   };
 } else {
   console.error('Polymer is already defined.');