Merge from Chromium at DEPS revision 37.0.2062.76

This commit was generated by merge_to_master.py.

Change-Id: I167d28401e65e520fca24a7cd89b56027205c775
diff --git a/android_webview/buildbot/aosp_manifest.xml b/android_webview/buildbot/aosp_manifest.xml
index aaae29c..19dc9cb 100644
--- a/android_webview/buildbot/aosp_manifest.xml
+++ b/android_webview/buildbot/aosp_manifest.xml
@@ -261,7 +261,7 @@
   <project name="platform/frameworks/support" path="frameworks/support" revision="1e3d0c89282627f8b0d66d2bdae4efc2287ab043"/>
   <project name="platform/frameworks/testing" path="frameworks/testing" revision="5c8e0271db889518f5969b142a37faa01a4ee54d"/>
   <project name="platform/frameworks/volley" path="frameworks/volley" revision="a53cb80bea6fc83edfa73e7a850e83f4020fcf07"/>
-  <project name="platform/frameworks/webview" path="frameworks/webview" revision="2b4719f12bac2f9f71d99567f09f46916903edf8"/>
+  <project name="platform/frameworks/webview" path="frameworks/webview" revision="707d93ceba55f52771e749b223fbfc010c9a025e"/>
   <project name="platform/frameworks/wilhelm" path="frameworks/wilhelm" revision="a62c3572e60ae0446632de15418a65089cccf551"/>
   <project name="platform/hardware/akm" path="hardware/akm" revision="32838ef838d1341aa8b77022869b801fb0bbb26c"/>
   <project groups="pdk" name="platform/hardware/broadcom/libbt" path="hardware/broadcom/libbt" revision="55ddd0cce019e88829f92b2fe4e17d5869daa9b9"/>
diff --git a/android_webview/public/browser/draw_gl.h b/android_webview/public/browser/draw_gl.h
index 4a43523..d62375f 100644
--- a/android_webview/public/browser/draw_gl.h
+++ b/android_webview/public/browser/draw_gl.h
@@ -86,8 +86,11 @@
 // Called to get the stride of the buffer
 typedef unsigned int AwGetStrideFunction(long buffer_id);
 
+static const int kAwDrawGLFunctionTableVersion = 1;
+
 // Set of functions used in rendering in hardware mode
 struct AwDrawGLFunctionTable {
+  int version;
   AwCreateGraphicBufferFunction* create_graphic_buffer;
   AwReleaseGraphicBufferFunction* release_graphic_buffer;
   AwMapFunction* map;
diff --git a/android_webview/public/browser/draw_sw.h b/android_webview/public/browser/draw_sw.h
index 97d6607..ae77195 100644
--- a/android_webview/public/browser/draw_sw.h
+++ b/android_webview/public/browser/draw_sw.h
@@ -43,9 +43,12 @@
 // Called to verify if the Skia versions are compatible.
 typedef bool (AwIsSkiaVersionCompatibleFunction)(SkiaVersionFunction function);
 
+static const int kAwDrawSWFunctionTableVersion = 1;
+
 // "vtable" for the functions declared in this file. An instance must be set via
 // AwContents.setAwDrawSWFunctionTable
 struct AwDrawSWFunctionTable {
+  int version;
   AwAccessPixelsFunction* access_pixels;
   AwReleasePixelsFunction* release_pixels;
 };
diff --git a/ash/resources/default_100_percent/common/shelf/shelf_background.png b/ash/resources/default_100_percent/common/shelf/shelf_background.png
index 45b06ed..212c0de 100644
--- a/ash/resources/default_100_percent/common/shelf/shelf_background.png
+++ b/ash/resources/default_100_percent/common/shelf/shelf_background.png
Binary files differ
diff --git a/ash/resources/default_200_percent/common/shelf/shelf_background.png b/ash/resources/default_200_percent/common/shelf/shelf_background.png
index 5a62204..3a3e6a1 100644
--- a/ash/resources/default_200_percent/common/shelf/shelf_background.png
+++ b/ash/resources/default_200_percent/common/shelf/shelf_background.png
Binary files differ
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb
index 31e289c..bff21be 100644
--- a/ash/strings/ash_strings_am.xtb
+++ b/ash/strings/ash_strings_am.xtb
@@ -154,7 +154,7 @@
 <translation id="1882897271359938046">ወደ <ph name="DISPLAY_NAME"/> በማንጸባረቅ ላይ</translation>
 <translation id="2727977024730340865">አነስተኛ ኃይል ወዳለው ባትሪ መሙያ ተሰክቷል። የባትሪ መሙላት አስተማማኝ ላይሆን ይችላል።</translation>
 <translation id="3784455785234192852">ቆልፍ</translation>
-<translation id="2805756323405976993">ትግበራዎች </translation>
+<translation id="2805756323405976993">መተግበሪያዎች</translation>
 <translation id="1512064327686280138">የማግበር አለመሳካት</translation>
 <translation id="5097002363526479830">ከአውታረ መረብ «<ph name="NAME"/>» ጋር መገናኘት አልተሳካም፦ <ph name="DETAILS"/></translation>
 <translation id="1850504506766569011">Wi-Fi ጠፍቷል።</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb
index 60e7041..3aa37fc 100644
--- a/ash/strings/ash_strings_da.xtb
+++ b/ash/strings/ash_strings_da.xtb
@@ -177,7 +177,7 @@
 <translation id="5045550434625856497">Ugyldig adgangskode</translation>
 <translation id="1602076796624386989">Aktivér mobildata</translation>
 <translation id="68610848741840742">ChromeVox (talefeedback)</translation>
-<translation id="6981982820502123353">Hjælpemidler</translation>
+<translation id="6981982820502123353">Hjælpefunktioner</translation>
 <translation id="6585808820553845416">Sessionen slutter om <ph name="SESSION_TIME_REMAINING"/>.</translation>
 <translation id="4274292172790327596">Fejlen genkendes ikke</translation>
 <translation id="5977415296283489383">Hovedtelefon</translation>
@@ -194,7 +194,7 @@
 <translation id="9044646465488564462">Det var ikke muligt at oprette forbindelse til netværket: <ph name="DETAILS"/></translation>
 <translation id="7029814467594812963">Afslut session</translation>
 <translation id="8454013096329229812">Wi-Fi er slået til.</translation>
-<translation id="4872237917498892622">Alt+Søg eller Skift</translation>
+<translation id="4872237917498892622">Alt+Søg eller Shift</translation>
 <translation id="2429753432712299108">Bluetooth-enheden &quot;<ph name="DEVICE_NAME"/>&quot; vil gerne have parringstilladelse. Inden du accepterer, skal du bekræfte, at denne adgangsnøgle er vist på den pågældende enhed: <ph name="PASSKEY"/></translation>
 <translation id="9201131092683066720">Batteriet er <ph name="PERCENTAGE"/> % opladet.</translation>
 <translation id="2983818520079887040">Indstillinger...</translation>
@@ -218,10 +218,10 @@
 <translation id="4895488851634969361">Batteriet er helt opladet.</translation>
 <translation id="615957422585914272">Vis skærmtastatur</translation>
 <translation id="5947494881799873997">Fortryd</translation>
-<translation id="7593891976182323525">Søg eller skift</translation>
+<translation id="7593891976182323525">Søg eller Shift</translation>
 <translation id="7649070708921625228">Hjælp</translation>
 <translation id="3050422059534974565">CAPS LOCK er slået til.
-Tryk på Søg eller Skift for at annullere.</translation>
+Tryk på Søg eller Shift for at annullere.</translation>
 <translation id="397105322502079400">Beregner...</translation>
 <translation id="158849752021629804">Hjemmenetværk mangler</translation>
 <translation id="1013923882670373915">Bluetooth-enheden &quot;<ph name="DEVICE_NAME"/>&quot; vil gerne have parringstilladelse. Indtast denne pinkode på den pågældende enhed: <ph name="PINCODE"/></translation>
@@ -242,7 +242,7 @@
 Tryk på Ctrl+Alt+Z for at deaktivere dette.</translation>
 <translation id="5045002648206642691">Google Drev-indstillinger...</translation>
 <translation id="7209101170223508707">CAPS LOCK er slået til.
-Tryk på Alt+Søg eller Skift for at annullere.</translation>
+Tryk på Alt+Søg eller Shift for at annullere.</translation>
 <translation id="8940956008527784070">Batteriniveauet er lavt (<ph name="PERCENTAGE"/> %)</translation>
 <translation id="4918086044614829423">Accepter</translation>
 <translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> tilbage</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb
index 4ed0c86..d41b033 100644
--- a/ash/strings/ash_strings_es-419.xtb
+++ b/ash/strings/ash_strings_es-419.xtb
@@ -154,7 +154,7 @@
 <translation id="1882897271359938046">Copiando en <ph name="DISPLAY_NAME"/></translation>
 <translation id="2727977024730340865">Conexión a un cargador de baja potencia. Es posible que la carga de la batería no sea confiable.</translation>
 <translation id="3784455785234192852">Bloquear</translation>
-<translation id="2805756323405976993">Google Apps</translation>
+<translation id="2805756323405976993">Aplicaciones</translation>
 <translation id="1512064327686280138">Fallo en la activación</translation>
 <translation id="5097002363526479830">Error al conectar a la red &quot;<ph name="NAME"/>&quot;: <ph name="DETAILS"/></translation>
 <translation id="1850504506766569011">Wi-Fi desactivada</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index 78cad17..5e00881 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -154,7 +154,7 @@
 <translation id="1882897271359938046"><ph name="DISPLAY_NAME"/> पर मिरर कर रहा है</translation>
 <translation id="2727977024730340865">कम-शक्ति वाले चार्जर में प्लग इन करें. बैटरी चार्ज करना संभवत: विश्वसनीय नहीं होगा.</translation>
 <translation id="3784455785234192852">लॉक करें</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">ऐप्स</translation>
 <translation id="1512064327686280138">सक्रियण विफलता</translation>
 <translation id="5097002363526479830">नेटवर्क से कनेक्ट करने में विफल '<ph name="NAME"/>': <ph name="DETAILS"/></translation>
 <translation id="1850504506766569011">वाई-फ़ाई  बंद है.</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb
index be8b983..3bbac57 100644
--- a/ash/strings/ash_strings_hu.xtb
+++ b/ash/strings/ash_strings_hu.xtb
@@ -154,7 +154,7 @@
 <translation id="1882897271359938046">Tükrözés: <ph name="DISPLAY_NAME"/></translation>
 <translation id="2727977024730340865">Kis teljesítményű töltőt csatlakoztatott. Az akkumulátor töltése nem megbízható.</translation>
 <translation id="3784455785234192852">Zárolás</translation>
-<translation id="2805756323405976993">Google Alkalmazások</translation>
+<translation id="2805756323405976993">Alkalmazások</translation>
 <translation id="1512064327686280138">Aktiválási hiba</translation>
 <translation id="5097002363526479830">Nem sikerült csatlakozni a(z) <ph name="NAME"/> hálózathoz: <ph name="DETAILS"/></translation>
 <translation id="1850504506766569011">Wi-Fi kikapcsolva.</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index cfc805c..f6d5ae1 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -154,7 +154,7 @@
 <translation id="1882897271359938046"><ph name="DISPLAY_NAME"/> へミラーリング</translation>
 <translation id="2727977024730340865">低電力の充電器に接続しています。バッテリーが充電されない可能性があります。</translation>
 <translation id="3784455785234192852">ロック</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">アプリ</translation>
 <translation id="1512064327686280138">起動失敗</translation>
 <translation id="5097002363526479830">ネットワーク「<ph name="NAME"/>」に接続できませんでした: <ph name="DETAILS"/></translation>
 <translation id="1850504506766569011">Wi-Fi が無効になりました。</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index c3ec52f..8dd240c 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -153,7 +153,7 @@
 <translation id="1882897271359938046"><ph name="DISPLAY_NAME"/> എന്നതിലേക്ക് മിറർചെയ്യുന്നു</translation>
 <translation id="2727977024730340865">കുറഞ്ഞ തോതിൽ വൈദ്യുതി പ്രവഹിക്കുന്ന ചാർജ്ജറിലേക്ക് പ്ലഗ് ചെയ്‌തിരിക്കുന്നു. ബാറ്ററി ചാർജുചെയ്യൽ വിശ്വസനീയമാകണമെന്നില്ല.</translation>
 <translation id="3784455785234192852">ലോക്കുചെയ്യുക</translation>
-<translation id="2805756323405976993">അപ്ലിക്കേഷന്‍സ്</translation>
+<translation id="2805756323405976993">ആപ്സ്</translation>
 <translation id="1512064327686280138">സജീവമാക്കല്‍ പരാജയപ്പെട്ടു</translation>
 <translation id="5097002363526479830">'<ph name="NAME"/>' നെറ്റ്‌വര്‍‌ക്കിലേക്ക് ബന്ധിപ്പിക്കുന്നതിൽ പരാജയപ്പെട്ടു: <ph name="DETAILS"/></translation>
 <translation id="1850504506766569011">Wi-Fi ഓഫുചെയ്‌തു.</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb
index 211f69b..0597112 100644
--- a/ash/strings/ash_strings_sr.xtb
+++ b/ash/strings/ash_strings_sr.xtb
@@ -154,7 +154,7 @@
 <translation id="1882897271359938046">Пресликавање у <ph name="DISPLAY_NAME"/></translation>
 <translation id="2727977024730340865">Уређај је укључен у пуњач мале снаге. Пуњење батерије можда неће бити поуздано.</translation>
 <translation id="3784455785234192852">Закључај</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">Апликације</translation>
 <translation id="1512064327686280138">Активација није успела</translation>
 <translation id="5097002363526479830">Повезивање са мрежом „<ph name="NAME"/>“ није успело: <ph name="DETAILS"/></translation>
 <translation id="1850504506766569011">Wi-Fi је искључен.</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb
index 7b22726..1d1c93a 100644
--- a/ash/strings/ash_strings_sv.xtb
+++ b/ash/strings/ash_strings_sv.xtb
@@ -154,7 +154,7 @@
 <translation id="1882897271359938046">Spegling av <ph name="DISPLAY_NAME"/></translation>
 <translation id="2727977024730340865">Ansluten till en laddare med låg effekt. Batteriet kanske inte laddas ordentligt.</translation>
 <translation id="3784455785234192852">Lås</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">Appar</translation>
 <translation id="1512064327686280138">Aktiveringsfel</translation>
 <translation id="5097002363526479830">Det gick inte att ansluta till nätverket <ph name="NAME"/>: <ph name="DETAILS"/></translation>
 <translation id="1850504506766569011">Wi-Fi är inaktiverat.</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index 4132adc..638a55b 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -154,7 +154,7 @@
 <translation id="1882897271359938046"><ph name="DISPLAY_NAME"/>కు దర్పణం చేస్తోంది</translation>
 <translation id="2727977024730340865">తక్కువ-పవర్ గల ఛార్జర్‌కు ప్లగిన్ చేయబడింది. బ్యాటరీ ఛార్జింగ్ విశ్వసనీయంగా ఉండకపోవచ్చు.</translation>
 <translation id="3784455785234192852">లాక్ చేయి</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">యాప్స్</translation>
 <translation id="1512064327686280138">సక్రియా విఫలం</translation>
 <translation id="5097002363526479830">'<ph name="NAME"/>'కు నెట్‌వర్క్‌కు కనెక్ట్ చేయడానికి విఫలమైంది: <ph name="DETAILS"/></translation>
 <translation id="1850504506766569011">Wi-Fi నిలిపివేయబడింది.</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index 63496e8..d640760 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -154,7 +154,7 @@
 <translation id="1882897271359938046">กำลังแสดงผลไปที่ <ph name="DISPLAY_NAME"/></translation>
 <translation id="2727977024730340865">เสียบอยู่กับที่ชาร์จพลังงานต่ำ การชาร์จแบตเตอรี่อาจไม่น่าเชื่อถือ</translation>
 <translation id="3784455785234192852">ล็อก</translation>
-<translation id="2805756323405976993">แอปพลิเคชัน</translation>
+<translation id="2805756323405976993">แอป</translation>
 <translation id="1512064327686280138">การเปิดใช้งานล้มเหลว</translation>
 <translation id="5097002363526479830">ไม่สามารถเชื่อมต่อเครือข่าย &quot;<ph name="NAME"/>&quot;: <ph name="DETAILS"/></translation>
 <translation id="1850504506766569011">WiFi ปิดอยู่</translation>
diff --git a/ash/system/chromeos/virtual_keyboard/virtual_keyboard_tray.cc b/ash/system/chromeos/virtual_keyboard/virtual_keyboard_tray.cc
index 63eadf1..a19a713 100644
--- a/ash/system/chromeos/virtual_keyboard/virtual_keyboard_tray.cc
+++ b/ash/system/chromeos/virtual_keyboard/virtual_keyboard_tray.cc
@@ -4,6 +4,7 @@
 
 #include "ash/system/chromeos/virtual_keyboard/virtual_keyboard_tray.h"
 
+#include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_constants.h"
 #include "ash/shell.h"
 #include "ash/system/status_area_widget.h"
@@ -20,42 +21,11 @@
 #include "ui/views/controls/button/image_button.h"
 
 namespace ash {
-namespace {
-
-class VirtualKeyboardButton : public views::ImageButton {
- public:
-  VirtualKeyboardButton(views::ButtonListener* listener);
-  virtual ~VirtualKeyboardButton();
-
-  // Overridden from views::ImageButton:
-  virtual gfx::Size GetPreferredSize() const OVERRIDE;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(VirtualKeyboardButton);
-};
-
-VirtualKeyboardButton::VirtualKeyboardButton(views::ButtonListener* listener)
-    : views::ImageButton(listener) {
-}
-
-VirtualKeyboardButton::~VirtualKeyboardButton() {
-}
-
-gfx::Size VirtualKeyboardButton::GetPreferredSize() const {
-  const int virtual_keyboard_button_height = kShelfSize;
-  gfx::Size size = ImageButton::GetPreferredSize();
-  int padding = virtual_keyboard_button_height - size.height();
-  size.set_height(virtual_keyboard_button_height);
-  size.set_width(size.width() + padding);
-  return size;
-}
-
-}  // namespace
 
 VirtualKeyboardTray::VirtualKeyboardTray(StatusAreaWidget* status_area_widget)
     : TrayBackgroundView(status_area_widget),
       button_(NULL) {
-  button_ = new VirtualKeyboardButton(this);
+  button_ = new views::ImageButton(this);
   button_->SetImage(views::CustomButton::STATE_NORMAL,
                     ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
                         IDR_AURA_UBER_TRAY_VIRTUAL_KEYBOARD));
@@ -82,6 +52,30 @@
 void VirtualKeyboardTray::SetShelfAlignment(ShelfAlignment alignment) {
   TrayBackgroundView::SetShelfAlignment(alignment);
   tray_container()->SetBorder(views::Border::NullBorder());
+
+  // Pad button size to align with other controls in the system tray.
+  const gfx::ImageSkia image = button_->GetImage(
+      views::CustomButton::STATE_NORMAL);
+  int top_padding = (kTrayBarButtonWidth - image.height()) / 2;
+  int left_padding = (kTrayBarButtonWidth - image.width()) / 2;
+  int bottom_padding = kTrayBarButtonWidth - image.height() - top_padding;
+  int right_padding = kTrayBarButtonWidth - image.width() - left_padding;
+
+  // Square up the padding if horizontally aligned. Avoid extra padding when
+  // vertically aligned as the button would violate the width constraint on the
+  // shelf.
+  if (alignment == SHELF_ALIGNMENT_BOTTOM || alignment == SHELF_ALIGNMENT_TOP) {
+    gfx::Insets insets = button_->GetInsets();
+    int additional_padding = std::max(0, top_padding - left_padding);
+    left_padding += additional_padding;
+    right_padding += additional_padding;
+  }
+
+  button_->SetBorder(views::Border::CreateEmptyBorder(
+      top_padding,
+      left_padding,
+      bottom_padding,
+      right_padding));
 }
 
 base::string16 VirtualKeyboardTray::GetAccessibleNameForTray() {
diff --git a/ash/wm/lock_state_controller.cc b/ash/wm/lock_state_controller.cc
index 09a46af..ebb0698 100644
--- a/ash/wm/lock_state_controller.cc
+++ b/ash/wm/lock_state_controller.cc
@@ -16,6 +16,7 @@
 #include "ash/wm/session_state_animator.h"
 #include "base/bind_helpers.h"
 #include "base/command_line.h"
+#include "base/strings/string_util.h"
 #include "base/timer/timer.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/compositor/layer_animation_sequence.h"
@@ -584,8 +585,17 @@
 }
 
 void LockStateController::PreLockAnimationFinished(bool request_lock) {
-  can_cancel_lock_animation_ = false;
   VLOG(1) << "PreLockAnimationFinished";
+  can_cancel_lock_animation_ = false;
+
+  // Don't do anything (including starting the lock-fail timer) if the screen
+  // was already locked while the animation was going.
+  if (system_is_locked_) {
+    DCHECK(!request_lock) << "Got request to lock already-locked system "
+                          << "at completion of pre-lock animation";
+    return;
+  }
+
   if (request_lock) {
     Shell::GetInstance()->metrics()->RecordUserMetricsAction(
         shutdown_after_lock_ ?
@@ -594,24 +604,19 @@
     delegate_->RequestLockScreen();
   }
 
-  int lock_timeout = kLockFailTimeoutMs;
-
+  base::TimeDelta timeout =
+      base::TimeDelta::FromMilliseconds(kLockFailTimeoutMs);
 #if defined(OS_CHROMEOS)
-  std::string board = base::SysInfo::GetLsbReleaseBoard();
-
   // Increase lock timeout for slower hardware, see http://crbug.com/350628
+  const std::string board = base::SysInfo::GetLsbReleaseBoard();
   if (board == "x86-mario" ||
-      board.substr(0, 8) == "x86-alex" ||
-      board.substr(0, 7) == "x86-zgb") {
-    lock_timeout *= 2;
+      StartsWithASCII(board, "x86-alex", true /* case_sensitive */) ||
+      StartsWithASCII(board, "x86-zgb", true /* case_sensitive */)) {
+    timeout *= 2;
   }
 #endif
-
   lock_fail_timer_.Start(
-      FROM_HERE,
-      base::TimeDelta::FromMilliseconds(lock_timeout),
-      this,
-      &LockStateController::OnLockFailTimeout);
+      FROM_HERE, timeout, this, &LockStateController::OnLockFailTimeout);
 }
 
 void LockStateController::PostLockAnimationFinished() {
diff --git a/ash/wm/maximize_mode/maximize_mode_controller.cc b/ash/wm/maximize_mode/maximize_mode_controller.cc
index a32812a..7d8485f 100644
--- a/ash/wm/maximize_mode/maximize_mode_controller.cc
+++ b/ash/wm/maximize_mode/maximize_mode_controller.cc
@@ -192,6 +192,11 @@
   return maximize_mode_window_manager_.get() != NULL;
 }
 
+void MaximizeModeController::AddWindow(aura::Window* window) {
+  if (IsMaximizeModeWindowManagerEnabled())
+    maximize_mode_window_manager_->AddWindow(window);
+}
+
 void MaximizeModeController::Shutdown() {
   maximize_mode_window_manager_.reset();
   Shell::GetInstance()->OnMaximizeModeEnded();
diff --git a/ash/wm/maximize_mode/maximize_mode_controller.h b/ash/wm/maximize_mode/maximize_mode_controller.h
index 8445bfa..8c0f719 100644
--- a/ash/wm/maximize_mode/maximize_mode_controller.h
+++ b/ash/wm/maximize_mode/maximize_mode_controller.h
@@ -26,6 +26,9 @@
 class MaximizeModeEventBlocker;
 class MaximizeModeWindowManager;
 class MaximizeModeWindowManagerTest;
+namespace test {
+class MultiUserWindowManagerChromeOSTest;
+}
 
 // MaximizeModeController listens to accelerometer events and automatically
 // enters and exits maximize mode when the lid is opened beyond the triggering
@@ -82,6 +85,12 @@
   // Test if the MaximizeModeWindowManager is enabled or not.
   bool IsMaximizeModeWindowManagerEnabled() const;
 
+  // Add a special window to the MaximizeModeWindowManager for tracking. This is
+  // only required for special windows which are handled by other window
+  // managers like the |MultiUserWindowManager|.
+  // If the maximize mode is not enabled no action will be performed.
+  void AddWindow(aura::Window* window);
+
   // TODO(jonross): move this into the destructor. Currently separated as
   // ShellOberver notifies of maximize mode ending, and the observers end up
   // attempting to access MaximizeModeController via the Shell. If done in
@@ -108,6 +117,7 @@
  private:
   friend class MaximizeModeControllerTest;
   friend class MaximizeModeWindowManagerTest;
+  friend class test::MultiUserWindowManagerChromeOSTest;
 
   // Detect hinge rotation from |base| and |lid| accelerometers and
   // automatically start / stop maximize mode.
diff --git a/ash/wm/maximize_mode/maximize_mode_window_manager.cc b/ash/wm/maximize_mode/maximize_mode_window_manager.cc
index e434cba..2e9f042 100644
--- a/ash/wm/maximize_mode/maximize_mode_window_manager.cc
+++ b/ash/wm/maximize_mode/maximize_mode_window_manager.cc
@@ -54,6 +54,18 @@
   return window_state_map_.size();
 }
 
+void MaximizeModeWindowManager::AddWindow(aura::Window* window) {
+  // Only add the window if it is a direct dependent of a container window
+  // and not yet tracked.
+  if (!ShouldHandleWindow(window) ||
+      window_state_map_.find(window) != window_state_map_.end() ||
+      !IsContainerWindow(window->parent())) {
+    return;
+  }
+
+  MaximizeAndTrackWindow(window);
+}
+
 void MaximizeModeWindowManager::WindowStateDestroyed(aura::Window* window) {
   // At this time ForgetWindow() should already have been called. If not,
   // someone else must have replaced the "window manager's state object".
diff --git a/ash/wm/maximize_mode/maximize_mode_window_manager.h b/ash/wm/maximize_mode/maximize_mode_window_manager.h
index 78e4405..0814621 100644
--- a/ash/wm/maximize_mode/maximize_mode_window_manager.h
+++ b/ash/wm/maximize_mode/maximize_mode_window_manager.h
@@ -42,6 +42,12 @@
   // Returns the number of maximized & tracked windows by this manager.
   int GetNumberOfManagedWindows();
 
+  // Adds a window which needs to be maximized. This is used by other window
+  // managers for windows which needs to get tracked due to (upcoming) state
+  // changes.
+  // The call gets ignored if the window was already or should not be handled.
+  void AddWindow(aura::Window* window);
+
   // Called from a window state object when it gets destroyed.
   void WindowStateDestroyed(aura::Window* window);
 
diff --git a/build/android/gyp/generate_v14_compatible_resources.py b/build/android/gyp/generate_v14_compatible_resources.py
index 1961622..2f1d812 100755
--- a/build/android/gyp/generate_v14_compatible_resources.py
+++ b/build/android/gyp/generate_v14_compatible_resources.py
@@ -226,18 +226,18 @@
   don't use attributes that cause crashes on certain devices. Print an error if
   they have."""
   for input_filename in build_utils.FindInDirectory(input_dir, '*.xml'):
-    exception_message = ('error : ' + input_filename + ' has an RTL attribute, '
-                        'i.e., attribute that has "start" or "end" in its name.'
-                        ' Pre-v17 resources should not include it because it '
-                        'can cause crashes on certain devices. Please refer to '
-                        'http://crbug.com/243952 for the details.')
+    warning_message = ('warning : ' + input_filename + ' has an RTL attribute, '
+                       'i.e., attribute that has "start" or "end" in its name.'
+                       ' Pre-v17 resources should not include it because it '
+                       'can cause crashes on certain devices. Please refer to '
+                       'http://crbug.com/243952 for the details.')
     dom = minidom.parse(input_filename)
     if resource_type in ('layout', 'xml'):
       if GenerateV14LayoutResourceDom(dom, input_filename, False):
-        raise Exception(exception_message)
+        print warning_message
     elif resource_type == 'values':
       if GenerateV14StyleResourceDom(dom, input_filename, False):
-        raise Exception(exception_message)
+        print warning_message
 
 
 def AssertNoDeprecatedAttributesInDir(input_dir, resource_type):
diff --git a/build/util/LASTCHANGE b/build/util/LASTCHANGE
index 129bedb..540b214 100644
--- a/build/util/LASTCHANGE
+++ b/build/util/LASTCHANGE
@@ -1 +1 @@
-LASTCHANGE=287650
+LASTCHANGE=289124
diff --git a/build/util/LASTCHANGE.blink b/build/util/LASTCHANGE.blink
index 8755db1..9e9dc7e 100644
--- a/build/util/LASTCHANGE.blink
+++ b/build/util/LASTCHANGE.blink
@@ -1 +1 @@
-LASTCHANGE=179513
+LASTCHANGE=180122
diff --git a/cc/layers/delegated_renderer_layer_impl.cc b/cc/layers/delegated_renderer_layer_impl.cc
index a233673..e94fd2a 100644
--- a/cc/layers/delegated_renderer_layer_impl.cc
+++ b/cc/layers/delegated_renderer_layer_impl.cc
@@ -389,13 +389,14 @@
   for (size_t i = 0; i < delegated_render_pass->quad_list.size(); ++i) {
     const DrawQuad* delegated_quad = delegated_render_pass->quad_list[i];
 
+    bool is_root_delegated_render_pass =
+        delegated_render_pass == render_passes_in_draw_order_.back();
+
     if (delegated_quad->shared_quad_state != delegated_shared_quad_state) {
       delegated_shared_quad_state = delegated_quad->shared_quad_state;
       output_shared_quad_state = quad_sink->CreateSharedQuadState();
       output_shared_quad_state->CopyFrom(delegated_shared_quad_state);
 
-      bool is_root_delegated_render_pass =
-          delegated_render_pass == render_passes_in_draw_order_.back();
       if (is_root_delegated_render_pass) {
         gfx::Transform delegated_frame_to_target_transform = draw_transform();
         delegated_frame_to_target_transform.Scale(inverse_device_scale_factor_,
@@ -428,9 +429,17 @@
     }
     DCHECK(output_shared_quad_state);
 
+    gfx::Transform quad_content_to_delegated_target_space =
+        output_shared_quad_state->content_to_target_transform;
+    if (!is_root_delegated_render_pass) {
+      quad_content_to_delegated_target_space.ConcatTransform(
+          quad_sink->render_pass()->transform_to_root_target);
+      quad_content_to_delegated_target_space.ConcatTransform(draw_transform());
+    }
+
     gfx::Rect quad_visible_rect = quad_sink->UnoccludedContentRect(
-        delegated_quad->visible_rect,
-        output_shared_quad_state->content_to_target_transform);
+        delegated_quad->visible_rect, quad_content_to_delegated_target_space);
+
     if (quad_visible_rect.IsEmpty())
       continue;
 
diff --git a/cc/layers/delegated_renderer_layer_impl_unittest.cc b/cc/layers/delegated_renderer_layer_impl_unittest.cc
index c4beddd..9556190 100644
--- a/cc/layers/delegated_renderer_layer_impl_unittest.cc
+++ b/cc/layers/delegated_renderer_layer_impl_unittest.cc
@@ -1522,6 +1522,33 @@
                 impl.quad_list()[0]->visible_rect.ToString());
     }
   }
+  {
+    gfx::Rect occluded(0, 0, 500, 1000);
+    // Move the occlusion to where it is in the contributing surface.
+    occluded -= quad_rect.OffsetFromOrigin() + gfx::Vector2d(11, 0);
+
+    SCOPED_TRACE("Contributing render pass with transformed root");
+
+    delegated_renderer_layer_impl->SetTransform(transform);
+    impl.CalcDrawProps(viewport_size);
+
+    impl.AppendQuadsForPassWithOcclusion(
+        delegated_renderer_layer_impl, pass2_id, occluded);
+    size_t partially_occluded_count = 0;
+    LayerTestCommon::VerifyQuadsCoverRectWithOcclusion(
+        impl.quad_list(),
+        gfx::Rect(quad_rect.size()),
+        occluded,
+        &partially_occluded_count);
+    // The layer outputs one quad, which is partially occluded.
+    EXPECT_EQ(1u, impl.quad_list().size());
+    EXPECT_EQ(1u, partially_occluded_count);
+    // The quad in the contributing surface is at (222,300) in the transformed
+    // root. The occlusion extends to 500 in the x-axis, pushing the left of the
+    // visible part of the quad to 500 - 222 = 300 - 22 inside the quad.
+    EXPECT_EQ(gfx::Rect(300 - 22, 0, 100 + 22, 500).ToString(),
+              impl.quad_list()[0]->visible_rect.ToString());
+  }
 }
 
 TEST_F(DelegatedRendererLayerImplTest, PushPropertiesTo) {
diff --git a/cc/layers/picture_image_layer.cc b/cc/layers/picture_image_layer.cc
index a65ac8c..7031ec0 100644
--- a/cc/layers/picture_image_layer.cc
+++ b/cc/layers/picture_image_layer.cc
@@ -54,17 +54,14 @@
       SkFloatToScalar(static_cast<float>(bounds().height()) / bitmap_.height());
   canvas->scale(content_to_layer_scale_x, content_to_layer_scale_y);
 
-  // Because PictureImageLayer always FillsBoundsCompletely it will not clear
-  // before painting on playback. As a result we must configure the paint to
-  // copy over the uncleared destination, rather than blending with it.
-  SkPaint paint;
-  paint.setXfermodeMode(SkXfermode::kSrc_Mode);
-  canvas->drawBitmap(bitmap_, 0, 0, &paint);
+  // Because Android WebView resourceless software draw mode rasters directly
+  // to the root canvas, this draw must use the kSrcOver_Mode so that
+  // transparent images blend correctly.
+  canvas->drawBitmap(bitmap_, 0, 0);
 }
 
 bool PictureImageLayer::FillsBoundsCompletely() const {
-  // PictureImageLayer will always paint to the entire layer bounds.
-  return true;
+  return false;
 }
 
 }  // namespace cc
diff --git a/cc/layers/quad_sink.h b/cc/layers/quad_sink.h
index c033bfb..bf82d04 100644
--- a/cc/layers/quad_sink.h
+++ b/cc/layers/quad_sink.h
@@ -43,6 +43,8 @@
 
   virtual void Append(scoped_ptr<DrawQuad> draw_quad);
 
+  const RenderPass* render_pass() const { return render_pass_; }
+
  protected:
   RenderPass* render_pass_;
 
diff --git a/chrome/VERSION b/chrome/VERSION
index 63cdcef..240043c 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=37
 MINOR=0
 BUILD=2062
-PATCH=68
+PATCH=76
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 472dc98..3f40b28 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -76,7 +76,7 @@
 <translation id="969096075394517431">Skift sprog</translation>
 <translation id="5556459405103347317">Genindlæs</translation>
 <translation id="5032574515228824816">Meddelelse</translation>
-<translation id="4847896847259487518">Tilføj bogmærke for siden</translation>
+<translation id="4847896847259487518">Tilføj siden som bogmærke</translation>
 <translation id="497421865427891073">Gå fremad</translation>
 <translation id="8310344678080805313">Standardfaner</translation>
 <translation id="6277522088822131679">Der opstod et problem med udskrivning af siden. Prøv igen.</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb
index 6f2b960..6487417 100644
--- a/chrome/app/resources/chromium_strings_hi.xtb
+++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -77,7 +77,7 @@
         <ph name="ADVANCED_TITLE"/>
         पर जाएं और का &quot;<ph name="NO_PREFETCH_DESCRIPTION"/>&quot; चयन रद्द करें.
         यदि इससे समस्या का समाधान नहीं होता, तो बेहतर प्रदर्शन के लिए हम इस
-        विकल्प को पुन: चुनने की अनुशंसा करते हैं.</translation>
+        विकल्प को पुन: चुनने की सुझाव देते हैं.</translation>
 <translation id="7463979740390522693">Chromium - सूचनाएं (<ph name="QUANTITY"/> अपठित)</translation>
 <translation id="225614027745146050">आपका स्वागत है</translation>
 <translation id="5823381412099532241">क्रोमियम स्वयं को नवीनतम संस्करण में अपडेट नहीं कर सका, इसलिए आप शानदार नई सुविधाओं और सुरक्षा समाधानों का लाभ नहीं ले पा रहे हैं. आपको क्रोमियम को अपडेट करना होगा.</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 3731b18..58c4fd4 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -2937,7 +2937,7 @@
 <translation id="7347751611463936647">ይህንን ቅጥያ ለመጠቀም «<ph name="EXTENSION_KEYWORD"/>» ብለው፣ ከዚያ TAB፣ ከዚያ ትዕዛዝዎን ወይም ፍለጋዎን ይተይቡ።</translation>
 <translation id="878431691778285679">አስቀድመው በዚያ ስም ያለ ተጠቃሚ እያስተዳደሩ ያሉ ይመስላል። <ph name="LINE_BREAK"/><ph name="BEGIN_LINK"/><ph name="PROFILE_NAME"/>ን ወደዚህ መሳሪያ ማስመጣት<ph name="END_LINK"/> ፈልገው ነበር?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> ማይክሮፎንዎን መጠቀም ይፈልጋል።</translation>
-<translation id="2805756323405976993">ትግበራዎች </translation>
+<translation id="2805756323405976993">መተግበሪያዎች</translation>
 <translation id="5151511998946489774">የዚህ ድር ጣቢያ ማንነት በ<ph name="ISSUER"/> የተረጋገጠ ሲሆን በይፋ ኦዲት መደረግ የሚችል ነው።</translation>
 <translation id="1608626060424371292">ይህን ተጠቃሚ አስወግድ</translation>
 <translation id="2779552785085366231">ይህ ገጽ ወደ የመተግበሪያ አስጀማሪ ሊታከል ይችላል።</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 88f3f76..abf291b 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -129,7 +129,7 @@
 <translation id="2972581237482394796">&amp;Annuller fortryd</translation>
 <translation id="5895138241574237353">Genstart</translation>
 <translation id="7012312584667795941">Identiteten af <ph name="ORGANIZATION"/> beliggende i <ph name="LOCALITY"/> er bekræftet af <ph name="ISSUER"/>, men virksomhedens dokumenter til offentlig revision kunne ikke bekræftes.</translation>
-<translation id="7113502843173351041">Kend din e-mailadresse</translation>
+<translation id="7113502843173351041">Kende din e-mailadresse</translation>
 <translation id="3726463242007121105">Denne enhed kan ikke åbnes, fordi dens filsystem ikke understøttes.</translation>
 <translation id="5606674617204776232"><ph name="PEPPER_PLUGIN_NAME"/> på <ph name="PEPPER_PLUGIN_DOMAIN"/> vil gerne have adgang til din enhed.</translation>
 <translation id="9008201768610948239">Ignorer</translation>
@@ -176,7 +176,7 @@
 <translation id="8804398419035066391">Kommunikere med andre websites</translation>
 <translation id="6023914116273780353">Tilpassede</translation>
 <translation id="7082055294850503883">Ignorer som standard CapsLock og indtastning af små bogstaver</translation>
-<translation id="4989966318180235467">Inspicer &amp;baggrundsside</translation>
+<translation id="4989966318180235467">Undersøg &amp;baggrundsside</translation>
 <translation id="4744603770635761495">Eksekverbar sti</translation>
 <translation id="3719826155360621982">Startside</translation>
 <translation id="5376169624176189338">Klik for at gå tilbage. Hold knappen inde for at se historikken.</translation>
@@ -260,7 +260,7 @@
 <translation id="7982789257301363584">Netværk</translation>
 <translation id="2271281383664374369">Udvidelsesanmodninger til denne webadresse er blevet midlertidigt tilbageholdt.</translation>
 <translation id="8528962588711550376">Logger ind...</translation>
-<translation id="2336228925368920074">Føj alle faner til Bogmærker...</translation>
+<translation id="2336228925368920074">Tilføj alle faner som bogmærker...</translation>
 <translation id="8774934320277480003">Topmargen</translation>
 <translation id="1390548061267426325">Åbn som almindelig fane</translation>
 <translation id="8821003679187790298">Aktivér en forenklet og forbedret oplevelse i fuld skærm på Mac.</translation>
@@ -592,7 +592,7 @@
 <translation id="5707185214361380026">Det var ikke muligt at indlæse udvidelsen fra:</translation>
 <translation id="7331786426925973633">En webbrowser, som er skabt til hurtighed, enkelhed og sikkerhed</translation>
 <translation id="5584537427775243893">Importerer</translation>
-<translation id="4779735050989188948">Manipuler de indstillinger, som styrer websites' adgang til cookies, JavaScript og plug-ins</translation>
+<translation id="4779735050989188948">Manipulere de indstillinger, som styrer websites' adgang til cookies, JavaScript og plug-ins</translation>
 <translation id="168841957122794586">Servercertifikatet indeholder en svag kryptografisk nøgle.</translation>
 <translation id="4181841719683918333">Sprog</translation>
 <translation id="1758831820837444715">Konfigurer Ethernet-netværk</translation>
@@ -651,7 +651,7 @@
 <translation id="2152580633399033274">Vis alle billeder (anbefales)</translation>
 <translation id="5618075537869101857">Kioskapplikationen kunne desværre ikke startes.</translation>
 <translation id="6196041699996825846">Få flere oplysninger om gæstesession</translation>
-<translation id="337286756654493126">Læs mapper, som du åbner i applikationen</translation>
+<translation id="337286756654493126">Læse mapper, som du åbner i applikationen</translation>
 <translation id="2783661497142353826">Administrer kioskapplikationer</translation>
 <translation id="5701101281789450335">Indstillinger for sprog og indtastning...</translation>
 <translation id="5483838506518938965">Så er du klar</translation>
@@ -739,7 +739,7 @@
 <translation id="7968833647796919681">Aktivér registrering af data om ydeevne</translation>
 <translation id="7645176681409127223"><ph name="USER_NAME"/> (ejer)</translation>
 <translation id="8427933533533814946">Foto af</translation>
-<translation id="5078638979202084724">Føj alle faner til Bogmærker</translation>
+<translation id="5078638979202084724">Tilføj alle faner som bogmærker</translation>
 <translation id="5585118885427931890">Bogmærkemappen blev ikke oprettet.</translation>
 <translation id="2553100941515833716">Gendan installationstilstanden for applisten ved genstart.</translation>
 <translation id="6019169947004469866">Beskær</translation>
@@ -837,7 +837,7 @@
 <translation id="2192280117622171197">En udvidelse har ændret, hvilken side der vises, når du søger via omnifeltet.</translation>
 <translation id="2731700343119398978">Vent et øjeblik...</translation>
 <translation id="5731751937436428514">Vietnamesisk indtastningsmetode (VIQR)</translation>
-<translation id="8412144371993786373">Føj den aktuelle side til Bogmærker</translation>
+<translation id="8412144371993786373">Tilføj den aktuelle side som bogmærke</translation>
 <translation id="1151169732719877940">Aktivér overenstemmende identitet mellem browser og cookie jar</translation>
 <translation id="7615851733760445951">&lt;ingen cookie er valgt&gt;</translation>
 <translation id="2493021387995458222">Vælg &quot;ord ad gangen&quot;</translation>
@@ -1147,7 +1147,7 @@
 <translation id="1849186935225320012">Denne side har fuld kontrol over MIDI-enheder.</translation>
 <translation id="7309416673261215716">Udvidelsens version</translation>
 <translation id="6840313690797192085">$1 PB</translation>
-<translation id="5971037678316050792">Kontrollér tilstand og parring af Bluetooth-adaptere</translation>
+<translation id="5971037678316050792">Kontrollere tilstand og parring af Bluetooth-adaptere</translation>
 <translation id="3313590242757056087">Du kan angive, hvilke websites den administrerede bruger skal kunne se, ved at konfigurere begrænsninger
     og indstillinger på <ph name="MANAGEMENT_URL"/>.
     Hvis du ikke ændrer standardindstillingerne, kan <ph name="USER_DISPLAY_NAME"/>
@@ -1364,7 +1364,7 @@
 <translation id="5380103295189760361">Hold Ctrl, Alt, Shift eller Søg nede for at se tastaturgenveje for disse ændringstaster.</translation>
 <translation id="7791543448312431591">Tilføj</translation>
 <translation id="8569764466147087991">Vælg den fil, der skal åbnes</translation>
-<translation id="9131487537093447019">Send beskeder til og modtag beskeder fra Bluetooth-enheder.</translation>
+<translation id="9131487537093447019">Sende beskeder til og modtage beskeder fra Bluetooth-enheder.</translation>
 <translation id="3010279545267083280">Adgangskoden er slettet</translation>
 <translation id="4275663329226226506">Medier</translation>
 <translation id="3629630062892748850">Relaterede webadresser og søgninger på Google.com</translation>
@@ -1737,7 +1737,7 @@
 <translation id="4776917500594043016">Adgangskode for <ph name="USER_EMAIL_ADDRESS"/></translation>
 <translation id="7792012425874949788">Der opstod en fejl under login</translation>
 <translation id="4105563239298244027">Få 1 TB gratis plads med Google Drev</translation>
-<translation id="8889883017054825362">Læs og rediger din browserhistorik</translation>
+<translation id="8889883017054825362">Læse og redigere din browserhistorik</translation>
 <translation id="7724603315864178912">Klip</translation>
 <translation id="8456681095658380701">Ugyldigt navn</translation>
 <translation id="3518086201899641494">Underretninger om captive portals</translation>
@@ -1805,7 +1805,7 @@
 <translation id="3810973564298564668">Valgmuligheder</translation>
 <translation id="254416073296957292">&amp;Sprogindstillinger...</translation>
 <translation id="6652975592920847366">Opret et genoprettelsesmedie til operativsystemet</translation>
-<translation id="3759933321830434300">Bloker dele af websiderne</translation>
+<translation id="3759933321830434300">Blokere dele af websiderne</translation>
 <translation id="52912272896845572">Den private nøglefil er ugyldig.</translation>
 <translation id="3232318083971127729">Værdi:</translation>
 <translation id="8807632654848257479">Stabil</translation>
@@ -1835,7 +1835,7 @@
 <translation id="2902382079633781842">Bogmærket blev tilføjet.</translation>
 <translation id="5436510242972373446">Søg på <ph name="SITE_NAME"/>:</translation>
 <translation id="3800764353337460026">Symboltypografi</translation>
-<translation id="1278049586634282054">Se visninger:</translation>
+<translation id="1278049586634282054">Undersøg visninger:</translation>
 <translation id="3254434849914415189">Vælg standardappen for <ph name="FILE_TYPE"/>-filer:</translation>
 <translation id="4991420928586866460">Brug tasterne på øverste række som funktionstaster</translation>
 <translation id="4350019051035968019">Denne enhed kan ikke tilmeldes det domæne, som din konto hører under, da enheden er markeret til administration på et andet domæne.</translation>
@@ -1879,7 +1879,7 @@
 <translation id="473775607612524610">Opdater</translation>
 <translation id="6122081475643980456">Din internetforbindelse bliver kontrolleret</translation>
 <translation id="8812403718714328880"><ph name="PRODUCT_NAME"/> har blokeret adgangen til <ph name="HOST_NAME"/> indtil videre.</translation>
-<translation id="2773013129377709345">Tilsidesæt brugergrænsefladen for bogmærker</translation>
+<translation id="2773013129377709345">Tilsidesætte brugergrænsefladen for bogmærker</translation>
 <translation id="1448389461181544401">Vil du gemme denne adgangskode?</translation>
 <translation id="148466539719134488">Schweizisk</translation>
 <translation id="8022523925619404071">Aktivér autoopdatering</translation>
@@ -1916,7 +1916,7 @@
 <translation id="3481915276125965083">Følgende pop op-vinduer blev blokeret på denne side:</translation>
 <translation id="2030481566774242610">Mente du <ph name="LINK"/>?</translation>
 <translation id="3090871774332213558">&quot;<ph name="DEVICE_NAME"/>&quot; er parret</translation>
-<translation id="7705276765467986571">Bogmærkemodellen blev ikke indlæst</translation>
+<translation id="7705276765467986571">Bogmærkemodellen blev ikke indlæst.</translation>
 <translation id="750413812607578381">Du skal genstarte <ph name="PRODUCT_NAME"/> nu.</translation>
 <translation id="2638286699381354126">Opdater...</translation>
 <translation id="1196338895211115272">Den personlige nøgle kunne ikke eksporteres.</translation>
@@ -1980,7 +1980,7 @@
 <translation id="5486561344817861625">Simuler genstart af browser</translation>
 <translation id="2367972762794486313">Vis apps</translation>
 <translation id="5602600725402519729">Gen&amp;indlæs</translation>
-<translation id="6955446738988643816">Inspicer pop op-vindue</translation>
+<translation id="6955446738988643816">Undersøg pop op-vindue</translation>
 <translation id="172612876728038702">TPM konfigureres. Vær tålmodig, det kan tage et par minutter.</translation>
 <translation id="6748140994595080445">Angiv, hvordan <ph name="APP_NAME"/> skal håndtere og vise sprog</translation>
 <translation id="2836635946302913370">Login med dette brugernavn er blevet deaktiveret af din administrator.</translation>
@@ -2178,7 +2178,7 @@
 <translation id="7461924472993315131">Fastgør</translation>
 <translation id="7279701417129455881">Administrer blokering af cookies...</translation>
 <translation id="665061930738760572">Åbn i &amp;nyt vindue</translation>
-<translation id="4876895919560854374">Lås skærmen/lås skærmen op</translation>
+<translation id="4876895919560854374">Låse skærmen/låse skærmen op</translation>
 <translation id="1166359541137214543">ABC</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="5528368756083817449">Bogmærkeadministrator</translation>
@@ -2186,7 +2186,7 @@
 <translation id="2826760142808435982">Forbindelsen er krypteret og godkendt ved hjælp af <ph name="CIPHER"/>, og den anvender <ph name="KX"/> som primær udvekslingsmekanisme.</translation>
 <translation id="215753907730220065">Afslut fuld skærm</translation>
 <translation id="7849264908733290972">Åbn &amp;billede på ny fane</translation>
-<translation id="1560991001553749272">Bogmærke tilføjet!</translation>
+<translation id="1560991001553749272">Bogmærket er tilføjet!</translation>
 <translation id="3966072572894326936">Vælg en anden mappe...</translation>
 <translation id="8758455334359714415">Indbygget asynkron DNS</translation>
 <translation id="5585912436068747822">Formatering mislykkedes</translation>
@@ -2231,7 +2231,7 @@
 <translation id="388442998277590542">Siden med valgmuligheder '<ph name="OPTIONS_PAGE"/>' kunne ikke indlæses.</translation>
 <translation id="8449008133205184768">Sæt ind og match stil</translation>
 <translation id="5258266922137542658">PPAPI (i gang)</translation>
-<translation id="5127881134400491887">Administrer netværksforbindelser</translation>
+<translation id="5127881134400491887">Administrere netværksforbindelser</translation>
 <translation id="8028993641010258682">Størrelse</translation>
 <translation id="8329978297633540474">Almindelig tekst</translation>
 <translation id="7704305437604973648">Opgave</translation>
@@ -2324,7 +2324,7 @@
 <translation id="8300259894948942413">Træk og slip ved berøring kan initieres via et langt tryk på et element, der kan trækkes.</translation>
 <translation id="1240892293903523606">DOM Inspector</translation>
 <translation id="5249624017678798539">Browseren lukkede ned, før overførslen var fuldført.</translation>
-<translation id="4474155171896946103">Føj alle faner til Bogmærker...</translation>
+<translation id="4474155171896946103">Tilføj alle faner som bogmærker...</translation>
 <translation id="5895187275912066135">Udstedt den</translation>
 <translation id="9100825730060086615">Tastaturtype</translation>
 <translation id="5197680270886368025">Synkroniseringen er fuldført.</translation>
@@ -2430,7 +2430,7 @@
 <translation id="7222232353993864120">E-mailadresse</translation>
 <translation id="2128531968068887769">Native Client</translation>
 <translation id="7175353351958621980">Indlæst fra:</translation>
-<translation id="3489785055052024984">Læs og rediger din browserhistorik på alle enheder, hvor du er logget ind</translation>
+<translation id="3489785055052024984">Læse og redigere din browserhistorik på alle enheder, hvor du er logget ind</translation>
 <translation id="8248050856337841185">&amp;Indsæt</translation>
 <translation id="347785443197175480">Tillad fortsat, at <ph name="HOST"/> har adgang til dit kamera og din mikrofon</translation>
 <translation id="6052976518993719690">SSL-certificeringsautoritet</translation>
@@ -2577,7 +2577,7 @@
 <translation id="7595321929944401166">Dette plugin er ikke understøttet.</translation>
 <translation id="2580093683987647761">Ring på (866) 628-1371 (USA), (866) 628-1372 (Canada) eller 0800 026 0613 (Storbritannien) for at anmode om en ny gratis oplader.</translation>
 <translation id="3996912167543967198">Nulstiller...</translation>
-<translation id="7509822997156351101">Rediger dine tilgængelighedsindstillinger</translation>
+<translation id="7509822997156351101">Redigere dine indstillinger for hjælpefunktioner</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="1541724327541608484">Kontrollér stavning i ​​tekstfelter</translation>
 <translation id="8637688295594795546">Der findes en tilgængelig opdatering til systemet. Forbereder download...</translation>
@@ -2597,7 +2597,7 @@
 <translation id="3714633008798122362">webkalender</translation>
 <translation id="3251759466064201842">&lt;Ikke en del af certifikatet&gt;</translation>
 <translation id="6186096729871643580">Antialias for LCD-tekst</translation>
-<translation id="3882882270042324158">Aktivér tilføjelse af scripts for tilgængelighed.</translation>
+<translation id="3882882270042324158">Aktivér tilføjelse af scripts for hjælpefunktioner.</translation>
 <translation id="7303492016543161086">Vis indstillinger for hjælpefunktioner i systemmenuen</translation>
 <translation id="6410257289063177456">Billedfiler</translation>
 <translation id="6419902127459849040">Centraleuropæisk</translation>
@@ -2616,7 +2616,7 @@
 <translation id="5298219193514155779">Tema oprettet af</translation>
 <translation id="6307722552931206656">Googles navneservere – <ph name="BEGIN_LINK"/>Få flere oplysninger<ph name="END_LINK"/></translation>
 <translation id="6628328486509726751">Uploadet <ph name="WEBRTC_LOG_UPLOAD_TIME"/></translation>
-<translation id="1047726139967079566">Indsæt bogmærke for denne side...</translation>
+<translation id="1047726139967079566">Tilføj denne side som bogmærke...</translation>
 <translation id="151279668805528202">Aktivér den nye lydafspiller</translation>
 <translation id="9020142588544155172">Serveren afviste forbindelsen.</translation>
 <translation id="5234320766290789922">Tillad ikke, at hylden minimerer vinduet, hvis der kun findes ét aktivt vindue, der er knyttet til det element på hylden, der klikkes på.</translation>
@@ -2813,7 +2813,7 @@
 <translation id="942954117721265519">Ingen billeder i denne mappe.</translation>
 <translation id="671928215901716392">Lås skærmen</translation>
 <translation id="2241468422635044128">Tilladt af udvidelse</translation>
-<translation id="3727187387656390258">Inspicer popupvindue</translation>
+<translation id="3727187387656390258">Undersøg pop op-vindue</translation>
 <translation id="361106536627977100">Flash-data</translation>
 <translation id="569068482611873351">Importer...</translation>
 <translation id="6571070086367343653">Rediger kreditkort</translation>
@@ -2826,7 +2826,7 @@
 <translation id="5622158329259661758">Deaktiverer brugen af GPU'en for at udføre lærredgengivelse i 2D og bruger softwaregengivelse i stedet.</translation>
 <translation id="8670869118777164560">Denne udvidelse kunne ikke omdirigere en netværksanmodning til <ph name="ATTEMPTED_REDIRECT_DESTINATION"/>, fordi en anden udvidelse (<ph name="EXTENSION_NAME"/>) omdirigerede den til <ph name="ACTUAL_REDIRECT_DESTINATION"/>.</translation>
 <translation id="3654092442379740616">Synkroniseringsfejl: <ph name="PRODUCT_NAME"/> er forældet og skal opdateres.</translation>
-<translation id="790040513076446191">Manipuler indstillinger til beskyttelse af personlige oplysninger</translation>
+<translation id="790040513076446191">Manipulere indstillinger til beskyttelse af personlige oplysninger</translation>
 <translation id="7260002739296185724">Aktivér brug af AVFoundation til optagelse af video og overvågning af videoenheder i OS X &gt;= 10.7. Hvis AVFoundation ikke aktiveres, bruges QTKit i stedet.</translation>
 <translation id="1463985642028688653">bloker</translation>
 <translation id="1715941336038158809">Ugyldigt brugernavn eller ugyldig adgangskode.</translation>
@@ -2993,7 +2993,7 @@
 <translation id="3972425373133383637">Hold dig ajour med det, du har brug for at vide, på alle dine enheder.</translation>
 <translation id="8493236660459102203">Mikrofon:</translation>
 <translation id="4788968718241181184">Vietnamesisk indtastningsmetode (TCVN6064)</translation>
-<translation id="3254409185687681395">Gem denne side som bogmærke</translation>
+<translation id="3254409185687681395">Tilføj denne side som bogmærke</translation>
 <translation id="5694501201003948907">Komprimerer $1 elementer...</translation>
 <translation id="2677924368525077324">Aktivér tekstredigering ved tryk</translation>
 <translation id="283669119850230892">Hvis du vil bruge netværket <ph name="NETWORK_ID"/>, skal du først oprette forbindelse til internettet nedenfor.</translation>
@@ -3046,7 +3046,7 @@
 <translation id="2386171414103162062">Forekomster, hvor en fane gik ned (&quot;<ph name="IDS_SAD_TAB_TITLE"/>&quot;)</translation>
 <translation id="761779991806306006">Der er ikke gemt nogen adgangskoder.</translation>
 <translation id="1692602667007917253">Hov! Der opstod en fejl</translation>
-<translation id="3922476559105512920">bruge serieforbundne enheder, der er sluttet til din computer</translation>
+<translation id="3922476559105512920">Bruge serieforbundne enheder, der er sluttet til din computer</translation>
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME"/> (udvidelses-id'et &quot;<ph name="EXTENSION_ID"/>&quot;) er ikke tilladt i denne sessionstype.</translation>
 <translation id="7062080924541270064"><ph name="BEGIN_LINK"/>Pluginnet Native Client<ph name="END_LINK"/> skal være aktiveret for at bruge denne funktion.</translation>
 <translation id="3613796918523876348">Gendan alligevel</translation>
@@ -3090,8 +3090,8 @@
 <translation id="3700834376805760154">Identiteten af <ph name="ORGANIZATION"/> beliggende i <ph name="LOCALITY"/> er bekræftet af <ph name="ISSUER"/>, og der kan foretages en offentlig revision af den.</translation>
 <translation id="436701661737309601">Ved et certifikat, der ikke er udløbet, gælder det, at udstederen af certifikatet er ansvarlig for at vedligeholde en &quot;tilbagekaldelsesliste&quot;. Hvis et certifikat på et tidspunkt kompromitteres, kan udstederen tilbagekalde det ved at føje det til tilbagekaldelseslisten, og derefter vil din browser ikke længere anse dette certifikat som pålideligt. Tilbagekaldelsesstatus kræves ikke for forældede certifikater, så selvom dette certifikat engang var gyldigt på det aktuelle website, er det ikke muligt at afgøre, om certifikatet er blevet kompromitteret og efterfølgende tilbagekaldt, eller om det stadigvæk er sikkert, på nuværende tidspunkt. Derfor er det umuligt at vide, om du kommunikerer med et troværdigt website, eller om certifikatet er blevet kompromitteret og nu styres af en hacker, som du kommunikerer med.</translation>
 <translation id="4342311272543222243">Hov! Der opstod en TPM-fejl.</translation>
-<translation id="3727884750434605207">Aktivér tilføjelse af scripts i stedet for den indbyggede tilgængelighed i Android.</translation>
-<translation id="1285484354230578868">Gem data i din Google Drev-konto</translation>
+<translation id="3727884750434605207">Aktivér tilføjelse af scripts i stedet for de indbyggede hjælpefunktioner i Android.</translation>
+<translation id="1285484354230578868">Gemme data på din Google Drev-konto</translation>
 <translation id="7106346894903675391">Køb mere lagerplads...</translation>
 <translation id="994289308992179865">&amp;Sløjfe</translation>
 <translation id="7596831438341298034">OK, start import</translation>
@@ -3227,7 +3227,7 @@
 <translation id="889901481107108152">Dette eksperiment er ikke tilgængeligt på din platform.</translation>
 <translation id="8238191901674777266">USA</translation>
 <translation id="1873879463550486830">SUID-sandkasse</translation>
-<translation id="8118860139461251237">Administrer dine downloads</translation>
+<translation id="8118860139461251237">Administrere dine downloads</translation>
 <translation id="5111852801054039429">Deaktiver WebRTC</translation>
 <translation id="2190355936436201913">(tom)</translation>
 <translation id="8515737884867295000">Den certifikatbaserede godkendelse mislykkedes</translation>
@@ -3585,7 +3585,7 @@
 <translation id="9026731007018893674">download</translation>
 <translation id="3212792897911394068">Deaktiver den eksperimenterende version af Encrypted Media Extensions på video- og lydelementer.</translation>
 <translation id="6199775032047436064">Genindlæs den aktuelle side</translation>
-<translation id="6981982820502123353">Hjælpemidler</translation>
+<translation id="6981982820502123353">Hjælpefunktioner</translation>
 <translation id="7210998213739223319">Brugernavn.</translation>
 <translation id="4523336217659634227">Der opstod en fejl (<ph name="ERROR"/>) under download af pluginnet.</translation>
 <translation id="4478664379124702289">Gem lin&amp;k som...</translation>
@@ -3903,7 +3903,7 @@
 <translation id="3092544800441494315">Inkluder dette skærmbillede:</translation>
 <translation id="2633199387167390344"><ph name="NAME"/> bruger <ph name="USAGE"/> MB diskplads.</translation>
 <translation id="472177018469288237">Google Wallet er deaktiveret</translation>
-<translation id="7730449930968088409">Tag et skærmbillede af dit indhold</translation>
+<translation id="7730449930968088409">Tage et skærmbillede af dit indhold</translation>
 <translation id="1431605150566631089">Kontrollér oplader</translation>
 <translation id="5330145655348521461">Disse filer blev åbnet på en anden computer. Skift til <ph name="USER_NAME"/> (<ph name="MAIL_ADDRESS"/>) for at se dem.</translation>
 <translation id="7714464543167945231">Certifikat</translation>
@@ -4066,7 +4066,7 @@
 <translation id="8948393169621400698">Tillad altid plugins på <ph name="HOST"/></translation>
 <translation id="6527303717912515753">Del</translation>
 <translation id="8211154138148153396">Underretninger om enhedsregistrering på lokalt netværk.</translation>
-<translation id="3893536212201235195">Læs og rediger dine tilgængelighedsindstillinger</translation>
+<translation id="3893536212201235195">Læse og redigere dine indstillinger for hjælpefunktioner</translation>
 <translation id="5039512255859636053">$1 TB</translation>
 <translation id="4285498937028063278">Frigør</translation>
 <translation id="8734073480934656039">Ved at aktivere denne indstilling tillader du, at terminalapplikationer åbnes automatisk under opstart.</translation>
@@ -4139,7 +4139,7 @@
 <translation id="2137808486242513288">Tilføj en bruger</translation>
 <translation id="129553762522093515">Senest lukkede</translation>
 <translation id="1588870296199743671">Åbn link med...</translation>
-<translation id="4761104368405085019">Brug din mikrofon</translation>
+<translation id="4761104368405085019">Bruge din mikrofon</translation>
 <translation id="4287167099933143704">Angiv nøgle til oplåsning af pinkode</translation>
 <translation id="3936418843437416078">Installationer</translation>
 <translation id="3129140854689651517">Find tekst</translation>
@@ -4214,14 +4214,14 @@
 <translation id="6680028776254050810">Skift bruger</translation>
 <translation id="2908789530129661844">Zoom ud på skærmen</translation>
 <translation id="212464871579942993">Websitet på <ph name="HOST_NAME"/> indeholder elementer fra websites, som ser ud til at hoste malware, dvs. software, som kan beskadige din computer, eller på anden måde foretage handlinger, du ikke har accepteret. Alene det, at du besøger et website, der indeholder malware, kan inficere din computer. Websitet hoster også indhold fra websites, der er blevet rapporteret som &quot;phishingwebsites&quot;. Phishingwebsites narrer brugere til at opgive personlige eller finansielle oplysninger. Det foregår gerne ved, at man udgiver sig for at repræsentere velkendte institutioner, som f.eks. banker.</translation>
-<translation id="2673135533890720193">Læs din browserhistorik</translation>
+<translation id="2673135533890720193">Læse din browserhistorik</translation>
 <translation id="6860427144121307915">Åbn på en fane</translation>
 <translation id="887692350334376364">Undtagelser for medier</translation>
 <translation id="8156020606310233796">Listevisning</translation>
 <translation id="146000042969587795">Denne ramme blev blokeret, da den indeholder usikkert indhold.</translation>
 <translation id="3258924582848461629">Inputmetode med håndskrift til japansk</translation>
 <translation id="8426564434439698958">&amp;Søg efter dette billede på <ph name="SEARCH_ENGINE"/></translation>
-<translation id="4375035964737468845">Åbn downloadede filer</translation>
+<translation id="4375035964737468845">Åbne downloadede filer</translation>
 <translation id="3968739731834770921">Kana</translation>
 <translation id="7387829944233909572">Dialogboksen &quot;Ryd browserdata&quot;</translation>
 <translation id="8023801379949507775">Opdater udvidelser nu</translation>
@@ -4239,7 +4239,7 @@
 <translation id="4104163789986725820">E&amp;ksporter...</translation>
 <translation id="9022026332614591902">Blokerede pop op-vinduer (<ph name="POP_UP_COUNT"/>)</translation>
 <translation id="380408572480438692">Aktiverer registrering af ydelsesdata, der hjælper Google med at forbedre systemet med tiden. Der sendes ingen data, før du indgiver en feedbackrapport (Alt-Shift-I) og medtager ydelsesdata. Du kan altid vende tilbage til dette skærmbillede for at deaktivere registreringen.</translation>
-<translation id="3654045516529121250">Læs dine tilgængelighedsindstillinger</translation>
+<translation id="3654045516529121250">Læse dine indstillinger for hjælpefunktioner</translation>
 <translation id="2113479184312716848">Åbn &amp;fil...</translation>
 <translation id="884264119367021077">Leveringsadresse</translation>
 <translation id="634208815998129842">Jobliste</translation>
@@ -4544,7 +4544,7 @@
 <translation id="169515659049020177">Shift</translation>
 <translation id="3551117997325569860">Skift proxy ved at aktivere indstillingen &quot;<ph name="USE_SHARED_PROXIES"/>&quot;.</translation>
 <translation id="8906421963862390172">&amp;Indstillinger for stavekontrol</translation>
-<translation id="193971656137910869">Læs og rediger dine bogmærker</translation>
+<translation id="193971656137910869">Læse og redigere dine bogmærker</translation>
 <translation id="6268747994388690914">Importér bogmærker fra HTML-fil...</translation>
 <translation id="6096047740730590436">Åbn maksimeret</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -4610,7 +4610,7 @@
 <translation id="4771973620359291008">Der er opstået en ukendt fejl.</translation>
 <translation id="5509914365760201064">Udsteder: <ph name="CERTIFICATE_AUTHORITY"/></translation>
 <translation id="4941246025622441835">Anvend denne enhedsrekvisition, når du tilmelder enheden til virksomhedsadministration.</translation>
-<translation id="5449588825071916739">Gem alle faner som bogmærker</translation>
+<translation id="5449588825071916739">Tilføj alle faner som bogmærker</translation>
 <translation id="7073385929680664879">Gennemgå indtastningsmetoderne</translation>
 <translation id="7842062217214609161">Ingen genvej</translation>
 <translation id="6898699227549475383">Organisation (O)</translation>
@@ -4635,7 +4635,7 @@
 <translation id="2509857212037838238">Installer <ph name="PLUGIN_NAME"/></translation>
 <translation id="2943400156390503548">Slides</translation>
 <translation id="3790146417033334899"><ph name="PLUGIN_NAME"/> fungerer kun på skrivebordet.</translation>
-<translation id="5117930984404104619">Overvåg adfærden for andre udvidelser, herunder de webadresser, du har besøgt.</translation>
+<translation id="5117930984404104619">Overvåge adfærden for andre udvidelser, herunder de webadresser, du har besøgt.</translation>
 <translation id="33022249435934718">GDI-håndtag</translation>
 <translation id="6308937455967653460">Gem lin&amp;k som...</translation>
 <translation id="741689768643916402">Google Wallet kan desværre kun bruges af købere med en amerikansk adresse hos denne sælger. Hvis du er amerikansk statsborger, skal du |ændre din privatadresse med Wallet| eller betale uden at bruge Google Wallet.</translation>
@@ -4737,7 +4737,7 @@
 <translation id="2665394472441560184">Tilføj et nyt ord</translation>
 <translation id="6095984072944024315">−</translation>
 <translation id="3653999333232393305">Tillad fortsat, at <ph name="HOST"/> har adgang til din mikrofon</translation>
-<translation id="3760460896538743390">Inspicer &amp;baggrundsside</translation>
+<translation id="3760460896538743390">Undersøg &amp;baggrundsside</translation>
 <translation id="5567989639534621706">Applikationscaches</translation>
 <translation id="9141716082071217089">Kan ikke kontrollere, om serverens certifikat er tilbagekaldt.</translation>
 <translation id="2436186046335138073">Vil du tillade, at <ph name="HANDLER_HOSTNAME"/> åbner alle <ph name="PROTOCOL"/>-links?</translation>
@@ -4778,7 +4778,7 @@
 <translation id="7549053541268690807">Søg i ordbog</translation>
 <translation id="8911079125461595075">Google har markeret <ph name="EXTENSION_NAME"/> som ondsindet, og installationen er blevet forhindret.</translation>
 <translation id="4347595254852029221">Aktivér hurtigt brugerskifte i avatarmenuen</translation>
-<translation id="5870086504539785141">Luk menuen for tilgængelighed</translation>
+<translation id="5870086504539785141">Luk menuen for hjælpefunktioner</translation>
 <translation id="9102800320402283920">Google Wallet kræver som minimum et fornavn og et efternavn.</translation>
 <translation id="7005848115657603926">Ugyldigt sideinterval, brug <ph name="EXAMPLE_PAGE_RANGE"/></translation>
 <translation id="3705722231355495246">-</translation>
@@ -4982,7 +4982,7 @@
 <translation id="385051799172605136">Tilbage</translation>
 <translation id="4196861286325780578">&amp;Annuller fortryd flytning</translation>
 <translation id="5075306601479391924">Deaktiver påkrævede bevægelser for brugeren ved afspilning af medieelementer. Hvis du aktiverer dette, tillader du automatisk afspilning.</translation>
-<translation id="9112748030372401671">Skift baggrund</translation>
+<translation id="9112748030372401671">Skifte baggrund</translation>
 <translation id="8938356204940892126">Jeg giver op</translation>
 <translation id="2670965183549957348">Chewing indtastningsmetode</translation>
 <translation id="7839804798877833423">Hvis du henter disse filer, bruge du ca. <ph name="FILE_SIZE"/> mobildata.</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 4f3e434..4aed0ad 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1167,7 +1167,7 @@
 <translation id="3791151686802386313">Erste Unternehmensanmeldung wird vorbereitet...</translation>
 <translation id="3393716657345709557">Angeforderter Eintrag wurde nicht im Cache gefunden.</translation>
 <translation id="7191454237977785534">Datei speichern unter</translation>
-<translation id="7241389281993241388">Melden Sie sich in <ph name="TOKEN_NAME"/> an, um das Client-Zertifikat zu importieren.</translation>
+<translation id="7241389281993241388">Melden Sie sich in <ph name="TOKEN_NAME"/> an, um das Clientzertifikat zu importieren.</translation>
 <translation id="8996526648899750015">Konto hinzufügen...</translation>
 <translation id="1773292249699193156">Für Ihr <ph name="ACCOUNT_EMAIL"/>-Konto verfügt die Erweiterung optional über folgende Berechtigungen:</translation>
 <translation id="7206693748120342859"><ph name="PLUGIN_NAME"/> wird heruntergeladen...</translation>
@@ -2592,7 +2592,7 @@
 <translation id="7303492016543161086">Optionen für Bedienungshilfen im Systemmenü anzeigen</translation>
 <translation id="6410257289063177456">Bilddateien</translation>
 <translation id="6419902127459849040">Mitteleuropäisch</translation>
-<translation id="6707389671160270963">SSL-Client-Zertifikat</translation>
+<translation id="6707389671160270963">SSL-Clientzertifikat</translation>
 <translation id="6083557600037991373">Zur Beschleunigung von Webseiten speichert <ph name="PRODUCT_NAME"/> heruntergeladene Dateien vorübergehend auf einem Laufwerk. Wenn <ph name="PRODUCT_NAME"/> nicht richtig beendet wird, können diese Dateien beschädigt werden, was schließlich zu einem Fehler führt. Das Problem kann gelöst werden, indem die Seite neu geladen wird, und ein richtiges Beenden sollte solchen Problemen in Zukunft vorbeugen.<ph name="LINE_BREAK"/>Sollte das Problem aber weiterhin auftreten, so versuchen Sie, den Cache zu leeren. In einigen Fällen kann dies auch auf Hardwareprobleme hinweisen.</translation>
 <translation id="5154176924561037127">F8</translation>
 <translation id="5298219193514155779">Design von</translation>
@@ -3476,7 +3476,7 @@
 <translation id="1425734930786274278">Die folgenden Cookies wurden blockiert (Cookies von Drittanbietern werden ausnahmslos blockiert):</translation>
 <translation id="3290704484208221223">Prozent</translation>
 <translation id="5265562206369321422">Seit über einer Woche offline</translation>
-<translation id="6805647936811177813">Melden Sie sich in <ph name="TOKEN_NAME"/> an, um das Client-Zertifikat von <ph name="HOST_NAME"/> herunterzuladen.</translation>
+<translation id="6805647936811177813">Melden Sie sich in <ph name="TOKEN_NAME"/> an, um das Clientzertifikat von <ph name="HOST_NAME"/> herunterzuladen.</translation>
 <translation id="6412931879992742813">Neues Inkognitofenster</translation>
 <translation id="1105117579475534983">Webseite blockiert</translation>
 <translation id="1673103856845176271">Auf die Datei konnte aus Sicherheitsgründen nicht zugegriffen werden.</translation>
@@ -5060,7 +5060,7 @@
 <translation id="4912643508233590958">Inaktive Weckbefehle</translation>
 <translation id="7839192898639727867">Schlüssel-ID für Antragsteller des Zertifikats</translation>
 <translation id="4759238208242260848">Downloads</translation>
-<translation id="2879560882721503072">Das von <ph name="ISSUER"/> ausgestellte Client-Zertifikat wurde erfolgreich gespeichert.</translation>
+<translation id="2879560882721503072">Das von <ph name="ISSUER"/> ausgestellte Clientzertifikat wurde erfolgreich gespeichert.</translation>
 <translation id="1275718070701477396">Ausgewählt</translation>
 <translation id="1178581264944972037">Anhalten</translation>
 <translation id="3948633535993872459"><ph name="PROTOCOL"/>-Links</translation>
@@ -5092,7 +5092,7 @@
 <translation id="7427348830195639090">Hintergrundseite: <ph name="BACKGROUND_PAGE_URL"/></translation>
 <translation id="8390029840652165810">Überprüfen Sie, ob Ihre Netzwerkverbindung funktioniert. Falls das Problem weiterhin besteht, melden Sie sich ab und wieder an, um Ihre Anmeldedaten neu zu laden.</translation>
 <translation id="4034042927394659004">Tastenhelligkeit verringern</translation>
-<translation id="5898154795085152510">Der Server hat ein ungültiges Client-Zertifikat zurückgegeben. Fehler <ph name="ERROR_NUMBER"/> (<ph name="ERROR_NAME"/>).</translation>
+<translation id="5898154795085152510">Der Server hat ein ungültiges Clientzertifikat zurückgegeben. Fehler <ph name="ERROR_NUMBER"/> (<ph name="ERROR_NAME"/>).</translation>
 <translation id="2704184184447774363">Microsoft-Dokumentsignatur</translation>
 <translation id="5677928146339483299">Blockiert</translation>
 <translation id="4645676300727003670">&amp;Beibehalten</translation>
@@ -5127,7 +5127,7 @@
 <translation id="2669198762040460457">Sie haben einen falschen Nutzernamen oder ein falsches Passwort eingegeben.</translation>
 <translation id="5849626805825065073">Bei deaktivierter Option wird der Text bei beschleunigtem Aufbau mit Graustufen-Antialiasing anstelle von LCD-Subpixeln gerendert.</translation>
 <translation id="8509646642152301857">Beim Herunterladen des Wörterbuchs für die Rechtschreibprüfung ist ein Fehler aufgetreten.</translation>
-<translation id="1161575384898972166">Melden Sie sich in <ph name="TOKEN_NAME"/> an, um das Client-Zertifikat zu exportieren.</translation>
+<translation id="1161575384898972166">Melden Sie sich in <ph name="TOKEN_NAME"/> an, um das Clientzertifikat zu exportieren.</translation>
 <translation id="7056526158851679338">&amp;Geräte untersuchen</translation>
 <translation id="1718559768876751602">Jetzt ein Google-Konto erstellen</translation>
 <translation id="7408287099496324465">Wenn diese Option aktiviert ist, wird die EmbeddedSearch API zur Übermittlung von Suchanfragen auf der Suchergebnisseite verwendet.</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 32c5c57..4a77266 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -2894,7 +2894,7 @@
 <translation id="7347751611463936647">Para usar esta extensión, escribe &quot;<ph name="EXTENSION_KEYWORD"/>&quot;, luego PESTAÑA, luego tu comando o búsqueda.</translation>
 <translation id="878431691778285679">Parece que ya administras un usuario que tiene ese nombre.<ph name="LINE_BREAK"/>¿Quieres <ph name="BEGIN_LINK"/>importar a <ph name="PROFILE_NAME"/> a este dispositivo<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> desea usar tu micrófono.</translation>
-<translation id="2805756323405976993">Google Apps</translation>
+<translation id="2805756323405976993">Aplicaciones</translation>
 <translation id="5151511998946489774"><ph name="ISSUER"/> verificó la identidad de este sitio web, y se pudo confirmar su transparencia.</translation>
 <translation id="1608626060424371292">Eliminar este usuario</translation>
 <translation id="2779552785085366231">Esta página se puede agregar al Selector de aplicaciones.</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 204c8f2..ee9ef5e 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -15,7 +15,7 @@
 <translation id="166179487779922818">Parool on liiga lühike.</translation>
 <translation id="9048642391959913289">Teksti suuruse automaatse muutmise kiirem rakendamine.</translation>
 <translation id="2345460471437425338">Hosti vale sertifikaat.</translation>
-<translation id="3688507211863392146">Kirjutage failidesse ja kaustadesse, mille rakenduses avate</translation>
+<translation id="3688507211863392146">Failidesse ja kaustadesse kirjutamine, mille rakenduses avate</translation>
 <translation id="3595596368722241419">Aku on täis</translation>
 <translation id="8098352321677019742">Toote <ph name="PRODUCT_NAME"/> märguanded</translation>
 <translation id="3566021033012934673">Teie ühendus ei ole privaatne</translation>
@@ -3466,7 +3466,7 @@
 <translation id="1834560242799653253">Suund:</translation>
 <translation id="6440616190620341629">Lubab krüpteeritud meediumilaiendustele vaikimisi mittekoostava dekodeerimise rakenduses MediaDrm.</translation>
 <translation id="7185025270390719314">Vaadake ja muutke oma arvutis ja külastatavatel veebisaitidel kõiki oma andmeid</translation>
-<translation id="8353683614194668312">See võib:</translation>
+<translation id="8353683614194668312">Rakendus saab teha järgmist.</translation>
 <translation id="1047956942837015229"><ph name="COUNT"/> üksuse kustutamine ...</translation>
 <translation id="1531961661616401172">Luba katselised sünkroonitud märguanded.</translation>
 <translation id="7361039089383199231">$1 baiti</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index d171702..5fd2ec2 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -7,7 +7,7 @@
 <translation id="9056953843249698117">Store</translation>
 <translation id="6431217872648827691">आपके Google पासवर्ड के द्वारा 
           <ph name="TIME"/> तक का सभी डेटा एन्क्रिप्ट किया गया था</translation>
-<translation id="335581015389089642">वाक्</translation>
+<translation id="335581015389089642">बोली</translation>
 <translation id="1890570400853666479">स्थिर गैलरी के बजाय प्रयोगात्मक नई गैलरी का उपयोग करें.</translation>
 <translation id="8206745257863499010">ब्‍लुसी</translation>
 <translation id="3314762460582564620">प्लेन झुयिन मोड.  स्वचालित उम्मीदवार चयन और संबंधित विकल्प
@@ -1444,7 +1444,7 @@
 <translation id="6051086608691487286">ओवरले स्क्रॉलबार</translation>
 <translation id="6132509723755265994">Google वॉलेट इस व्यापारी के साथ समर्थित नहीं है.</translation>
 <translation id="2378075407703503998"><ph name="SELCTED_FILE_COUNT"/> फ़ाइलें चयनित</translation>
-<translation id="4498419978438799658">संश्लेषि‍त वाक् का उपयोग करके बोले गए सभी टेक्स्ट तक पहुंचें</translation>
+<translation id="4498419978438799658">संश्लेषि‍त बोली का उपयोग करके बोले गए सभी टेक्स्ट तक पहुंचें</translation>
 <translation id="7339898014177206373">नई विंडो</translation>
 <translation id="8362900609631365882">पहुंच-योग्यता टैब स्विचर सक्षम करें.</translation>
 <translation id="1895215930471128025">सैंडबॉक्स न किए गए प्लग-इन को कभी भी <ph name="HOST"/> पर अनुमति न दें</translation>
@@ -2933,7 +2933,7 @@
 <translation id="7347751611463936647">इस एक्सटेंशन का उपयोग करने के लिए, &quot;<ph name="EXTENSION_KEYWORD"/>&quot; लिखें, फिर टैब लगाएं, फिर अपना आदेश या खोज लिखें.</translation>
 <translation id="878431691778285679">ऐसा लगता है आप पहले से ही उस नाम से किसी उपयोगकर्ता को प्रबंधित कर रहे हैं.<ph name="LINE_BREAK"/>क्या आप<ph name="BEGIN_LINK"/> <ph name="PROFILE_NAME"/> को इस उपकरण में निर्यात करना चाहते थे<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> आपके माइक्रोफ़ोन का उपयोग करना चाहता है.</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">ऐप्स</translation>
 <translation id="5151511998946489774">इस वेबसाइट की पहचान को <ph name="ISSUER"/> द्वारा सत्यापित किया गया है और यह सार्वजनिक रूप से ऑडिट किए जाने योग्य है.</translation>
 <translation id="1608626060424371292">इस उपयोगकर्ता को निकालें</translation>
 <translation id="2779552785085366231">इस पृष्ठ को ऐप्स लॉन्चर में जोड़ा जा सकता है</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 056e437..9abb890 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -2890,7 +2890,7 @@
 <translation id="7347751611463936647">A kifejezés használatához írja be a következőt: &quot;<ph name="EXTENSION_KEYWORD"/>&quot;, ezután nyomja meg a TAB-ot, majd parancsát vagy keresését.</translation>
 <translation id="878431691778285679">Úgy tűnik, Ön már kezel egy ilyen nevű felhasználót.<ph name="LINE_BREAK"/>Inkább <ph name="BEGIN_LINK"/>importálni szeretné <ph name="PROFILE_NAME"/> felhasználót erre az eszközre<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195">A(z) <ph name="HOST"/> a mikrofont kívánja használni.</translation>
-<translation id="2805756323405976993">Google Alkalmazások</translation>
+<translation id="2805756323405976993">Alkalmazások</translation>
 <translation id="5151511998946489774">A(z) <ph name="ISSUER"/> igazolta ennek a webhelynek az identitását, és az nyilvánosan megtekinthető.</translation>
 <translation id="1608626060424371292">Felhasználó eltávolítása</translation>
 <translation id="2779552785085366231">Az oldal nem adható hozzá az Alkalmazásindítóhoz</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 51d07d2..5495d64 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -4601,7 +4601,7 @@
 <translation id="2089090684895656482">Lebih Sedikit</translation>
 <translation id="6656103420185847513">Edit Folder</translation>
 <translation id="4918241738772068049">Tindakan yang diperlukan untuk menyambung</translation>
-<translation id="1949433054743893124">Menggunakan mode penyamaran tidak menyembunyikan penjelajahan dari pimpinan atau penyedia layanan internet Anda, maupun situs web yang dikunjungi.</translation>
+<translation id="1949433054743893124">Menggunakan mode penyamaran tidak menyembunyikan penjelajahan dari perusahaan Anda, penyedia layanan internet Anda, maupun situs web yang dikunjungi.</translation>
 <translation id="1132391573698572126">Subjek: <ph name="SUBJECT"/></translation>
 <translation id="4193154014135846272">Dokumen Google</translation>
 <translation id="4771973620359291008">Terjadi kesalahan yang tidak diketahui.</translation>
@@ -5033,7 +5033,7 @@
   • Anda dapat mengakhirinya kapan saja
 
 Terima?</translation>
-<translation id="8251578425305135684">Thumbnail dihapus.</translation>
+<translation id="8251578425305135684">Gambar kecil dihapus.</translation>
 <translation id="6163522313638838258">Luaskan semua...</translation>
 <translation id="31454997771848827">Domain grup</translation>
 <translation id="3188465121994729530">Rata-rata Perpindahan</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index c3ecb9c..b589ef4 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -93,7 +93,7 @@
 <translation id="5437452584883783369">プレビューを終了して再起動</translation>
 <translation id="7392118418926456391">ウイルス スキャンに失敗しました</translation>
 <translation id="1156689104822061371">キーボード レイアウト:</translation>
-<translation id="4764776831041365478"><ph name="URL"/> のウェブページは一時的に停止しているか、新しい URL に移動した可能性があります。</translation>
+<translation id="4764776831041365478"><ph name="URL"/> のウェブページは一時的に停止しているか、新しいウェブアドレスに移動した可能性があります。</translation>
 <translation id="6156863943908443225">スクリプト キャッシュ</translation>
 <translation id="4274187853770964845">同期エラー: 同期を停止してからもう一度開始してください。</translation>
 <translation id="6499114579475440437">ログインして Google ウォレットで支払う</translation>
@@ -1841,7 +1841,7 @@
 <translation id="2902382079633781842">ブックマークが追加されました</translation>
 <translation id="5436510242972373446"><ph name="SITE_NAME"/> を検索:</translation>
 <translation id="3800764353337460026">記号のスタイル</translation>
-<translation id="1278049586634282054">ビューを調査:</translation>
+<translation id="1278049586634282054">ビューを検証:</translation>
 <translation id="3254434849914415189"><ph name="FILE_TYPE"/> ファイルのデフォルト アプリを選択:</translation>
 <translation id="4991420928586866460">キーボードの最上段のキーをファンクション キーとして使用する</translation>
 <translation id="4350019051035968019">このデバイスは、別のドメインの管理対象として指定されているため、現在のアカウントの所属先ドメインに登録することはできません。</translation>
@@ -2912,7 +2912,7 @@
 <translation id="7347751611463936647">この拡張機能を使用するには、「<ph name="EXTENSION_KEYWORD"/>」と入力して Tab キーを押してからコマンドまたは検索キーワードを入力してください。</translation>
 <translation id="878431691778285679">この名前でユーザーを既に管理しているようです。<ph name="LINE_BREAK"/><ph name="BEGIN_LINK"/>このデバイスに <ph name="PROFILE_NAME"/> をインポート<ph name="END_LINK"/>しますか?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> がマイクへのアクセスを求めています。</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">アプリ</translation>
 <translation id="5151511998946489774">このウェブサイトの識別情報は <ph name="ISSUER"/> により確認済みで、公開監査が可能です。</translation>
 <translation id="1608626060424371292">このユーザーを削除</translation>
 <translation id="2779552785085366231">このページをアプリ ランチャーに追加できます</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 775e360..85d68bd 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -2924,7 +2924,7 @@
 <translation id="7347751611463936647">ഈ വിപുലീകരണം ഉപയോഗിക്കുക, &quot;<ph name="EXTENSION_KEYWORD"/>&quot; ടൈപ്പുചെയ്യുക, തുടര്‍ന്ന് TAB, തുടര്‍ന്ന് നിങ്ങളുടെ കമാന്‍റ് അല്ലെങ്കില്‍ തിരയല്‍.</translation>
 <translation id="878431691778285679">നിങ്ങൾ ഇതിനകം ആ പേരിൽ ഒരു ഉപയോക്താവിനെ നിയന്ത്രിക്കുന്നതുപോലെ തോന്നുന്നു.<ph name="LINE_BREAK"/>ഈ ഉപകരണത്തിലേക്ക് <ph name="BEGIN_LINK"/><ph name="PROFILE_NAME"/> ഇമ്പോർട്ടുചെയ്യുന്നതിന് നിങ്ങൾക്ക് താൽപ്പര്യമുണ്ടോ<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> എന്നതിന് ഒരു മൈക്രോഫോൺ ഉപയോഗിക്കണം.</translation>
-<translation id="2805756323405976993">അപ്ലിക്കേഷന്‍സ്</translation>
+<translation id="2805756323405976993">ആപ്സ്</translation>
 <translation id="5151511998946489774">ഈ വെബ്സൈറ്റിന്റെ ഐഡന്റിറ്റി <ph name="ISSUER"/> സ്ഥിരീകരിച്ചതും എല്ലാവർക്കും ഓഡിറ്റുചെയ്യാനാവുന്നതുമാണ്.</translation>
 <translation id="1608626060424371292">ഈ ഉപയോക്താവിനെ നീക്കംചെയ്യുക</translation>
 <translation id="2779552785085366231">ഈ പേജ് അപ്ലിക്കേഷൻ ലോഞ്ചറിലേക്ക് ചേർക്കാം</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index af95d98..6280972 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -121,7 +121,7 @@
 <translation id="4654488276758583406">Veldig liten</translation>
 <translation id="6647228709620733774">Nettadresse for tilbakekalling av Netscape-autoritetssertifikat</translation>
 <translation id="546411240573627095">Talltastaturstil</translation>
-<translation id="2310216585920710503">Konfigurer enkel opplåsing</translation>
+<translation id="2310216585920710503">Konfigurer Enkel opplåsing</translation>
 <translation id="8425213833346101688">Endre</translation>
 <translation id="2972581237482394796">Gjø&amp;r om</translation>
 <translation id="5895138241574237353">Start på nytt</translation>
@@ -519,7 +519,7 @@
 <translation id="413121957363593859">Komponenter</translation>
 <translation id="715487527529576698">Opprinnelig kinesisk modus er forenklet kinesisk</translation>
 <translation id="6522350652862471760">Slå på Google-profilnavn og -ikon</translation>
-<translation id="6181259999130430430">Slå på enkel opplåsing for denne enheten.</translation>
+<translation id="6181259999130430430">Slå på Enkel opplåsing for denne enheten.</translation>
 <translation id="8703575177326907206">Tilkoblingen til <ph name="DOMAIN"/> er ikke kryptert.</translation>
 <translation id="6135622770221372891">ID-er for kanal</translation>
 <translation id="8472623782143987204">maskinvarestøttet</translation>
@@ -712,7 +712,7 @@
 <translation id="3984921062031549150">Gjengivelsen slutter å fungere</translation>
 <translation id="7925285046818567682">Venter på <ph name="HOST_NAME"/>...</translation>
 <translation id="1079766198702302550">Blokkér alltid bruk av kameraet</translation>
-<translation id="2964845078799970531">Med enkel opplåsing kan du låse opp Chromebooken når den er i nærheten av telefonen din.</translation>
+<translation id="2964845078799970531">Med Enkel opplåsing kan du låse opp Chromebooken når den er i nærheten av telefonen din.</translation>
 <translation id="5053803681436838483">Ny leveringsadresse</translation>
 <translation id="5952256601775839173">Aktivér trefingerklikk for styreflaten.</translation>
 <translation id="3280237271814976245">L&amp;agre som...</translation>
@@ -1289,7 +1289,7 @@
 <translation id="9033857511263905942">&amp;Lim inn</translation>
 <translation id="1028690605877243613">Bruk den alternative hylleutformingen.</translation>
 <translation id="6736045498964449756">Beklager. Passordene samsvarer ikke!</translation>
-<translation id="4558985768677321342">Aktiver enkel opplåsing.</translation>
+<translation id="4558985768677321342">Aktiver Enkel opplåsing.</translation>
 <translation id="1221825588892235038">Bare utvalg</translation>
 <translation id="2227939492629426903">Aktiverer den nye brukerbildemenyen. Når den kombineres med ny profiladministrasjon, vises den nye brukerbildemenyen for administrasjon av profiler. I andre tilfeller viser den en brukerbildemeny med ny utforming, men med samme funksjonalitet som den gamle menyen. I tillegg vises et veiledningskort øverst som ber brukeren om å prøve det nye grensesnittet for administrasjon av profiler.</translation>
 <translation id="5582883434676861778"><ph name="PRODUCT_NAME"/> har blokkert tilgangen til <ph name="HOST_NAME"/>. Dette nettstedet har blitt rapportert som et nettfiskingsnettsted.</translation>
@@ -3323,7 +3323,7 @@
 <translation id="5917011688104426363">Fokuser adressefelt i søkemodus</translation>
 <translation id="3269101346657272573">Skriv inn personlig kode.</translation>
 <translation id="2822854841007275488">Arabisk</translation>
-<translation id="6559948977408379772">Dette ikonet vises når du og telefonen din er i nærheten og enkel opplåsing er tilgjengelig. Bare klikk for å åpne – ingen passord kreves.</translation>
+<translation id="6559948977408379772">Dette ikonet vises når du og telefonen din er i nærheten og Enkel opplåsing er tilgjengelig. Bare klikk for å åpne – ingen passord kreves.</translation>
 <translation id="5857090052475505287">Ny mappe</translation>
 <translation id="7450732239874446337">Nettverks-IO er sperret.</translation>
 <translation id="4003393903129308792">Aktiver én-kopis rasterenhet</translation>
@@ -3439,7 +3439,7 @@
 <translation id="1526560967942511387">Dokument uten tittel</translation>
 <translation id="3979748722126423326">Aktiver <ph name="NETWORKDEVICE"/></translation>
 <translation id="7819857487979277519">PSK (WPA eller RSN)</translation>
-<translation id="7561031016893995297">Administrer enheter med enkel opplåsing i kontoinnstillingene dine.</translation>
+<translation id="7561031016893995297">Administrer enheter med Enkel opplåsing i kontoinnstillingene dine.</translation>
 <translation id="2238379619048995541">Data om frekvenstilstand</translation>
 <translation id="4367133129601245178">K&amp;opier bildeadressen</translation>
 <translation id="6326175484149238433">Fjern fra Chrome</translation>
@@ -4439,7 +4439,7 @@
 <translation id="8148264977957212129">Pinyin inndatametode</translation>
 <translation id="2288278176040912387">Platespiller</translation>
 <translation id="7772032839648071052">Bekreft passord</translation>
-<translation id="3676582787770338561">Slå på enkel opplåsing for denne <ph name="DEVICE_TYPE"/>-enheten.</translation>
+<translation id="3676582787770338561">Slå på Enkel opplåsing for denne <ph name="DEVICE_TYPE"/>-enheten.</translation>
 <translation id="2871813825302180988">Denne kontoen er allerede i bruk på denne enheten.</translation>
 <translation id="1642505962779453775">Det siste kvartalet</translation>
 <translation id="3323235640813116393">Gjør det mulig å lagre sider som MHTML – én enkelt tekstfil som inneholder HTML og alle underressurser.</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 3d6da12..130825b 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -3341,7 +3341,7 @@
 <translation id="87377425248837826">Включение панелей</translation>
 <translation id="2805707493867224476">Разрешить открытие всплывающих окон на всех сайтах</translation>
 <translation id="3561217442734750519">Входное значение закрытого ключа должно предоставлять собой допустимый путь.</translation>
-<translation id="3582930987043644930">Укажите имя</translation>
+<translation id="3582930987043644930">Добавьте имя</translation>
 <translation id="2984337792991268709">Сегодня, <ph name="TODAY_DAYTIME"/></translation>
 <translation id="5227808808023563348">Найти предыдущий текст</translation>
 <translation id="4561162271279554092">Отключить нумерацию устройств средствами WebRTC.</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 21162e2..1567066 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -2909,7 +2909,7 @@
 <translation id="7347751611463936647">Да бисте користили овај додатак, унесите „<ph name="EXTENSION_KEYWORD"/>“ и притисните тастер TAB, а затим унесите команду или обавите претрагу.</translation>
 <translation id="878431691778285679">Изгледа да већ управљате корисником са тим именом.<ph name="LINE_BREAK"/>Да ли сте желели да <ph name="BEGIN_LINK"/>увезете корисника <ph name="PROFILE_NAME"/> на овај уређај<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> жели да користи микрофон.</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">Апликације</translation>
 <translation id="5151511998946489774">Идентитет овог веб-сајта је верификовао/ла <ph name="ISSUER"/> и он може јавно да се провери.</translation>
 <translation id="1608626060424371292">Уклони овог корисника</translation>
 <translation id="2779552785085366231">Ову страницу можете да додате у Покретач апликација</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index d3ca69d..ecee364 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -2912,7 +2912,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="878431691778285679">Det ser ut som om du redan hanterar en användare med det namnet.<ph name="LINE_BREAK"/>Ville du <ph name="BEGIN_LINK"/>importera <ph name="PROFILE_NAME"/> till den här enheten<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> försöker använda din mikrofon.</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">Appar</translation>
 <translation id="5151511998946489774">Webbplatsens identitet har verifierats av <ph name="ISSUER"/> och kan granskas offentligt.</translation>
 <translation id="1608626060424371292">Ta bort den här användaren</translation>
 <translation id="2779552785085366231">Den här sidan kan läggas till i startprogrammet för appar</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 00bd0a2..7dc7aef 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -900,7 +900,7 @@
 <translation id="2849936225196189499">Muhimu</translation>
 <translation id="9001035236599590379">Aina ya MIME</translation>
 <translation id="7238207184783103780">Google Wallet haipatikani kwa sasa.</translation>
-<translation id="3451859089869683931">Nambari batili ya simu. Tafadhali angalia na ujaribu tena.</translation>
+<translation id="3451859089869683931">Nambari ya simu si sahihi. Tafadhali angalia na ujaribu tena.</translation>
 <translation id="3464868340187708956">Ongeza Mtumiaji Mpya</translation>
 <translation id="7986039047000333986">Usasishaji maalum wa usalama kwa <ph name="PRODUCT_NAME"/> umetekelezwa hivi karibuni; unastahili kuanzisha upya sasa ili uanze kufanya kazi (tutarejesha upya vichupo vyako).</translation>
 <translation id="2787591391657537328">Ruhusu vipakuliwa ambavyo vimekatizwa kuendelea au kuanzishwa tena, kwa kutumia kipengee cha menyu ya maudhui cha Endelea.</translation>
@@ -1699,7 +1699,7 @@
 <translation id="4343792725927556911">Mipangilio mipya ya kamera na maikrofoni itaanza kufanya kazi baada ya kupakia upya ukurasa.</translation>
 <translation id="3847089579761895589">Unapewa usaidizi. Je, unataka kuendelea?</translation>
 <translation id="5634367113401639867">Lo! Kuna kitu kimeharibika wakati wa kusajili kiotomatiki kifaa hiki. Tafadhali jaribu tena kutoka kwenye skrini ya kuingia katika akaunti ukitumia vitufe vya Ctrl-Alt-E kwa pamoja, ua wasiliana na mhudumu wako wa usaidizi.</translation>
-<translation id="8452588990572106089">Nambari batili ya kadi. Tafadhali angalia na ujaribu tena.</translation>
+<translation id="8452588990572106089">Nambari ya kadi si sahihi. Tafadhali angalia na ujaribu tena.</translation>
 <translation id="7701869757853594372">Mishiko ya MTUMIAJI</translation>
 <translation id="5714678912774000384">Amilisha kichupo cha mwisho</translation>
 <translation id="7654972694106903394">Zima upangaji wa chapa kwa kujaribu ugongaji.</translation>
@@ -3377,7 +3377,7 @@
 <translation id="7317938878466090505"><ph name="PROFILE_NAME"/> (sasa)</translation>
 <translation id="6774230405643443657">Inawezesha usimbaji wa picha zinazotofautiana.</translation>
 <translation id="2148999191776934271">Inachaji
-<ph name="HOUR"/>:<ph name="MINUTE"/> hadi ijae</translation>
+Imebakisha <ph name="HOUR"/>:<ph name="MINUTE"/> ijae</translation>
 <translation id="6007237601604674381">Kusogezwa kumeshindika. <ph name="ERROR_MESSAGE"/></translation>
 <translation id="907841381057066561">Imeshindwa kuunda faili ya muda ya zip wakati wa kufungasha.</translation>
 <translation id="1064912851688322329">Tenganisha Akaunti yako ya Google</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 2fb5504..f4f6594 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -2911,7 +2911,7 @@
 <translation id="7347751611463936647">ఈ పొడిగింపును ఉపయోగించడానికి, &quot;<ph name="EXTENSION_KEYWORD"/>&quot; టైప్ చేసి, ఆపై టాబ్ చేసి, ఆపై మీ ఆదేశం లేదా శోధనను టైప్ చెయ్యండి.</translation>
 <translation id="878431691778285679">మీరు ఇప్పటికే ఆ పేరుతో ఒక వినియోగదారుని నిర్వహిస్తున్నట్లు కనిపిస్తోంది.<ph name="LINE_BREAK"/>మీరు <ph name="BEGIN_LINK"/><ph name="PROFILE_NAME"/>ని ఈ పరికరానికి దిగుమతి చేయాలనుకుంటున్నారా<ph name="END_LINK"/>?</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> మీ మైక్రోఫోన్‌ను ఉపయోగించాలని ఆశిస్తుంది.</translation>
-<translation id="2805756323405976993">Apps</translation>
+<translation id="2805756323405976993">యాప్స్</translation>
 <translation id="5151511998946489774">ఈ వెబ్‌సైట్ యొక్క గుర్తింపు <ph name="ISSUER"/> ద్వారా ధృవీకరించబడింది మరియు బహిరంగంగా పరిశీలించవచ్చు.</translation>
 <translation id="1608626060424371292">ఈ వినియోగదారుని తీసివేయండి</translation>
 <translation id="2779552785085366231">ఈ పేజీని అనువర్తన లాంచర్‌కి జోడించవచ్చు</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 928551a..903e812 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -2871,7 +2871,7 @@
 <translation id="7347751611463936647">ในการใช้ส่วนขยายนี้ ให้พิมพ์ &quot;<ph name="EXTENSION_KEYWORD"/>&quot; แล้วกด TAB ตามด้วยคำสั่งหรือการค้นหาของคุณ</translation>
 <translation id="878431691778285679">ดูเหมือนว่าคุณกำลังจัดการผู้ใช้ที่ชื่อนั้นอยู่แล้ว<ph name="LINE_BREAK"/>คุณต้องการ <ph name="BEGIN_LINK"/>นำเข้า <ph name="PROFILE_NAME"/> มายังอุปกรณ์นี้<ph name="END_LINK"/>ไหม</translation>
 <translation id="2912905526406334195"><ph name="HOST"/> ต้องการใช้ไมโครโฟนของคุณ</translation>
-<translation id="2805756323405976993">แอปพลิเคชัน</translation>
+<translation id="2805756323405976993">แอป</translation>
 <translation id="5151511998946489774">เว็บไซต์นี้ได้รับการยืนยันตัวตนโดย <ph name="ISSUER"/> และสามารถตรวจสอบได้แบบสาธารณะ</translation>
 <translation id="1608626060424371292">ลบผู้ใช้รายนี้</translation>
 <translation id="2779552785085366231">สามารถเพิ่มหน้านี้ลงในเครื่องเรียกใช้งานแอป</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index a635580..065da35 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -441,9 +441,9 @@
 <translation id="3855676282923585394">导入书签和设置...</translation>
 <translation id="1116694919640316211">关于</translation>
 <translation id="8381977081675353473">斯洛伐克语</translation>
-<translation id="2849866606957084126">已创建名为<ph name="NEW_PROFILE_NAME"/>的受监管用户。要设置该用户可以浏览哪些网站,您可以访问<ph name="BEGIN_LINK"/>www.chrome.com/manage<ph name="END_LINK"/>,在其中配置相应限制和设置。如果您未更改默认设置,<ph name="NEW_PROFILE_NAME"/>将可以浏览所有网站。
+<translation id="2849866606957084126">已创建名为“<ph name="NEW_PROFILE_NAME"/>”的受监管用户。要设置该用户可以浏览哪些网站,您可以访问<ph name="BEGIN_LINK"/>www.chrome.com/manage<ph name="END_LINK"/>,在其中配置相应限制和设置。如果您不更改默认设置,“<ph name="NEW_PROFILE_NAME"/>”将可以浏览所有网站。
 
-  有关详细说明,请查看<ph name="ACCOUNT_EMAIL"/>中的电子邮件。</translation>
+有关详细说明,请查看<ph name="ACCOUNT_EMAIL"/>中的电子邮件。</translation>
 <translation id="4422347585044846479">修改此页的书签</translation>
 <translation id="1965624977906726414">无需特殊权限。</translation>
 <translation id="2452539774207938933">切换到用户:<ph name="PROFILE_NAME"/></translation>
@@ -588,7 +588,7 @@
          “<ph name="PRODUCT_NAME"/>”不会使用不安全的连接。</translation>
 <translation id="7851858861565204677">来自其他设备的同步</translation>
 <translation id="1662837784918284394">(无)</translation>
-<translation id="2573269395582837871">选择照片和名称</translation>
+<translation id="2573269395582837871">选择照片和名字</translation>
 <translation id="5910363049092958439">图片存储为(&amp;V)...</translation>
 <translation id="8793975580333839911">运行此插件</translation>
 <translation id="1864146862702347178">启用滚动联想查询</translation>
@@ -4172,7 +4172,7 @@
 <translation id="1317502925920562130">这是您想要的主页吗?</translation>
 <translation id="7763146744708046348">请勿汇总数据 - 这可能会使速度变慢!</translation>
 <translation id="8616352574453019203">ID为“<ph name="IMPORT_ID"/>”的共享模块未列入白名单,无法导入。</translation>
-<translation id="5626134646977739690">名称:</translation>
+<translation id="5626134646977739690">名字:</translation>
 <translation id="4899837262951879307">触摸滚动模式。</translation>
 <translation id="5854409662653665676">如果您经常遇到问题,可以试着用以下方法解决此模块存在的问题:</translation>
 <translation id="3776796446459804932">此扩展程序违反了 Chrome 网上应用店政策。</translation>
@@ -4852,7 +4852,7 @@
 <translation id="3807747707162121253">取消(&amp;C)</translation>
 <translation id="202352106777823113">下载时间过长,网络已停止下载。</translation>
 <translation id="6155817405098385604">在无法使用 GPU 的情况下,不改用 3D 软件光栅器。</translation>
-<translation id="3306897190788753224">暂时停用个性化转化、基于历史记录的建议以及用户词典。</translation>
+<translation id="3306897190788753224">暂时停用个性化转化、基于历史记录的建议以及用户字典。</translation>
 <translation id="8941882480823041320">上一个字</translation>
 <translation id="2489435327075806094">指针速度:</translation>
 <translation id="2574102660421949343">允许来自 <ph name="DOMAIN"/> 的 Cookie。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb
index 748a591..544a176 100644
--- a/chrome/app/resources/google_chrome_strings_hi.xtb
+++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -158,7 +158,7 @@
         <ph name="ADVANCED_TITLE"/>
         पर जाएं और &quot;<ph name="NO_PREFETCH_DESCRIPTION"/>&quot; का चयन रद्द करें.
         यदि इससे समस्या का समाधान नहीं होता, तो हम बेहतर प्रदर्शन के लिए इस
-        विकल्प को पुन: चुनने की अनुशंसा करते हैं.</translation>
+        विकल्प को पुन: चुनने की सुझाव देते हैं.</translation>
 <translation id="6235018212288296708">mDNS ट्रैफ़िक की अनुमति देने के लिए Google Chrome हेतु इनबाउंड नियम.</translation>
 <translation id="61852838583753520">&amp;Chrome OS को अपडेट करें</translation>
 <translation id="5028489144783860647">Google Chrome आपका डेटा समन्‍वयित नहीं कर सका. कृपया अपना समन्‍वयन पासफ़्रेज़ अपडेट करें.</translation>
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index fa32096..397e55d 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -30,6 +30,7 @@
 #include "chrome/browser/chromeos/app_mode/kiosk_mode_idle_app_name_notification.h"
 #include "chrome/browser/chromeos/boot_times_loader.h"
 #include "chrome/browser/chromeos/dbus/cros_dbus_service.h"
+#include "chrome/browser/chromeos/device/input_service_proxy.h"
 #include "chrome/browser/chromeos/events/event_rewriter.h"
 #include "chrome/browser/chromeos/events/event_rewriter_controller.h"
 #include "chrome/browser/chromeos/events/keyboard_driven_event_rewriter.h"
@@ -769,6 +770,9 @@
 
   g_browser_process->platform_part()->oom_priority_manager()->Stop();
 
+  // Early wake-up of HID device service.
+  InputServiceProxy::WarmUp();
+
   // Destroy the application name notifier for Kiosk mode.
   KioskModeIdleAppNameNotification::Shutdown();
 
diff --git a/chrome/browser/chromeos/device/input_service_proxy.cc b/chrome/browser/chromeos/device/input_service_proxy.cc
index f065775..f07bce6 100644
--- a/chrome/browser/chromeos/device/input_service_proxy.cc
+++ b/chrome/browser/chromeos/device/input_service_proxy.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/chromeos/device/input_service_proxy.h"
 
+#include "base/bind_helpers.h"
 #include "base/task_runner_util.h"
 #include "content/public/browser/browser_thread.h"
 
@@ -100,6 +101,14 @@
                  base::Unretained(service_observer_.release())));
 }
 
+// static
+void InputServiceProxy::WarmUp() {
+  content::BrowserThread::PostTask(
+      content::BrowserThread::FILE,
+      FROM_HERE,
+      base::Bind(base::IgnoreResult(&InputServiceLinux::GetInstance)));
+}
+
 void InputServiceProxy::AddObserver(Observer* observer) {
   DCHECK(thread_checker_.CalledOnValidThread());
   if (observer)
diff --git a/chrome/browser/chromeos/device/input_service_proxy.h b/chrome/browser/chromeos/device/input_service_proxy.h
index 11ba071..e41196f 100644
--- a/chrome/browser/chromeos/device/input_service_proxy.h
+++ b/chrome/browser/chromeos/device/input_service_proxy.h
@@ -37,6 +37,9 @@
   InputServiceProxy();
   ~InputServiceProxy();
 
+  // Used for early init for cashing info about available HID.
+  static void WarmUp();
+
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
 
diff --git a/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc b/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc
index 4c85304..fda0e6f 100644
--- a/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc
+++ b/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc
@@ -19,55 +19,60 @@
 
 // Apps/extensions explicitly whitelisted for use in public sessions.
 const char* kPublicSessionWhitelist[] = {
-  // Public sessions in general:
-  "cbkkbcmdlboombapidmoeolnmdacpkch",  // Chrome RDP
-  "djflhoibgkdhkhhcedjiklpkjnoahfmg",  // User Agent Switcher
-  "iabmpiboiopbgfabjmgeedhcmjenhbla",  // VNC Viewer
+    // Public sessions in general:
+    "cbkkbcmdlboombapidmoeolnmdacpkch",  // Chrome RDP
+    "djflhoibgkdhkhhcedjiklpkjnoahfmg",  // User Agent Switcher
+    "iabmpiboiopbgfabjmgeedhcmjenhbla",  // VNC Viewer
 
-  // Retail mode:
-  "ehcabepphndocfmgbdkbjibfodelmpbb",  // Angry Birds demo
-  "kgimkbnclbekdkabkpjhpakhhalfanda",  // Bejeweled demo
-  "joodangkbfjnajiiifokapkpmhfnpleo",  // Calculator
-  "fpgfohogebplgnamlafljlcidjedbdeb",  // Calendar demo
-  "hfhhnacclhffhdffklopdkcgdhifgngh",  // Camera
-  "cdjikkcakjcdjemakobkmijmikhkegcj",  // Chrome Remote Desktop demo
-  "jkoildpomkimndcphjpffmephmcmkfhn",  // Chromebook Demo App
-  "ielkookhdphmgbipcfmafkaiagademfp",  // Custom bookmarks
-  "kogjlbfgggambihdjcpijgcbmenblimd",  // Custom bookmarks
-  "ogbkmlkceflgpilgbmbcfbifckpkfacf",  // Custom bookmarks
-  "pbbbjjecobhljkkcenlakfnkmkfkfamd",  // Custom bookmarks
-  "jkbfjmnjcdmhlfpephomoiipbhcoiffb",  // Custom bookmarks
-  "dgmblbpgafgcgpkoiilhjifindhinmai",  // Custom bookmarks
-  "iggnealjakkgfofealilhkkclnbnfnmo",  // Custom bookmarks
-  "lplkobnahgbopmpkdapaihnnojkphahc",  // Custom bookmarks
-  "lejnflfhjpcannpaghnahbedlabpmhoh",  // Custom bookmarks
-  "ebkhfdfghngbimnpgelagnfacdafhaba",  // Deezer demo
-  "npnjdccdffhdndcbeappiamcehbhjibf",  // Docs.app demo
-  "iddohohhpmajlkbejjjcfednjnhlnenk",  // Evernote demo
-  "bjdhhokmhgelphffoafoejjmlfblpdha",  // Gmail demo
-  "mdhnphfgagkpdhndljccoackjjhghlif",  // Google Drive demo
-  "dondgdlndnpianbklfnehgdhkickdjck",  // Google Keep demo
-  "fgjnkhlabjcaajddbaenilcmpcidahll",  // Google+ demo
-  "ifpkhncdnjfipfjlhfidljjffdgklanh",  // Google+ Photos demo
-  "cgmlfbhkckbedohgdepgbkflommbfkep",  // Hangouts.app demo
-  "edhhaiphkklkcfcbnlbpbiepchnkgkpn",  // Helper.extension demo
-  "diehajhcjifpahdplfdkhiboknagmfii",  // Kindle demo
-  "nhpmmldpbfjofkipjaieeomhnmcgihfm",  // Menu.app demo
-  "onbhgdmifjebcabplolilidlpgeknifi",  // Music.app demo
-  "kkkbcoabfhgekpnddfkaphobhinociem",  // Netflix demo
-  "adlphlfdhhjenpgimjochcpelbijkich",  // New York Times demo
-  "cgefhjmlaifaamhhoojmpcnihlbddeki",  // Pandora demo
-  "kpjjigggmcjinapdeipapdcnmnjealll",  // Pixlr demo
-  "aleodiobpjillgfjdkblghiiaegggmcm",  // Quickoffice demo
-  "nifkmgcdokhkjghdlgflonppnefddien",  // Sheets demo
-  "hdmobeajeoanbanmdlabnbnlopepchip",  // Slides demo
-  "dgohlccohkojjgkkfholmobjjoledflp",  // Spotify demo
-  "dhmdaeekeihmajjnmichlhiffffdbpde",  // Store.app demo
-  "jeabmjjifhfcejonjjhccaeigpnnjaak",  // TweetDeck demo
-  "pbdihpaifchmclcmkfdgffnnpfbobefh",  // YouTube demo
+    // Libraries:
+    "aclofikceldphonlfmghmimkodjdmhck",  // Ancoris login component
+    "eilbnahdgoddoedakcmfkcgfoegeloil",  // Ancoris proxy component
+    "ceehlgckkmkaoggdnjhibffkphfnphmg",  // Libdata login
 
-  // Testing extensions:
-  "ongnjlefhnoajpbodoldndkbkdgfomlp",  // Show Managed Storage
+    // Retail mode:
+    "ehcabepphndocfmgbdkbjibfodelmpbb",  // Angry Birds demo
+    "kgimkbnclbekdkabkpjhpakhhalfanda",  // Bejeweled demo
+    "joodangkbfjnajiiifokapkpmhfnpleo",  // Calculator
+    "fpgfohogebplgnamlafljlcidjedbdeb",  // Calendar demo
+    "hfhhnacclhffhdffklopdkcgdhifgngh",  // Camera
+    "cdjikkcakjcdjemakobkmijmikhkegcj",  // Chrome Remote Desktop demo
+    "jkoildpomkimndcphjpffmephmcmkfhn",  // Chromebook Demo App
+    "ielkookhdphmgbipcfmafkaiagademfp",  // Custom bookmarks
+    "kogjlbfgggambihdjcpijgcbmenblimd",  // Custom bookmarks
+    "ogbkmlkceflgpilgbmbcfbifckpkfacf",  // Custom bookmarks
+    "pbbbjjecobhljkkcenlakfnkmkfkfamd",  // Custom bookmarks
+    "jkbfjmnjcdmhlfpephomoiipbhcoiffb",  // Custom bookmarks
+    "dgmblbpgafgcgpkoiilhjifindhinmai",  // Custom bookmarks
+    "iggnealjakkgfofealilhkkclnbnfnmo",  // Custom bookmarks
+    "lplkobnahgbopmpkdapaihnnojkphahc",  // Custom bookmarks
+    "lejnflfhjpcannpaghnahbedlabpmhoh",  // Custom bookmarks
+    "ebkhfdfghngbimnpgelagnfacdafhaba",  // Deezer demo
+    "npnjdccdffhdndcbeappiamcehbhjibf",  // Docs.app demo
+    "iddohohhpmajlkbejjjcfednjnhlnenk",  // Evernote demo
+    "bjdhhokmhgelphffoafoejjmlfblpdha",  // Gmail demo
+    "mdhnphfgagkpdhndljccoackjjhghlif",  // Google Drive demo
+    "dondgdlndnpianbklfnehgdhkickdjck",  // Google Keep demo
+    "fgjnkhlabjcaajddbaenilcmpcidahll",  // Google+ demo
+    "ifpkhncdnjfipfjlhfidljjffdgklanh",  // Google+ Photos demo
+    "cgmlfbhkckbedohgdepgbkflommbfkep",  // Hangouts.app demo
+    "edhhaiphkklkcfcbnlbpbiepchnkgkpn",  // Helper.extension demo
+    "diehajhcjifpahdplfdkhiboknagmfii",  // Kindle demo
+    "nhpmmldpbfjofkipjaieeomhnmcgihfm",  // Menu.app demo
+    "onbhgdmifjebcabplolilidlpgeknifi",  // Music.app demo
+    "kkkbcoabfhgekpnddfkaphobhinociem",  // Netflix demo
+    "adlphlfdhhjenpgimjochcpelbijkich",  // New York Times demo
+    "cgefhjmlaifaamhhoojmpcnihlbddeki",  // Pandora demo
+    "kpjjigggmcjinapdeipapdcnmnjealll",  // Pixlr demo
+    "aleodiobpjillgfjdkblghiiaegggmcm",  // Quickoffice demo
+    "nifkmgcdokhkjghdlgflonppnefddien",  // Sheets demo
+    "hdmobeajeoanbanmdlabnbnlopepchip",  // Slides demo
+    "dgohlccohkojjgkkfholmobjjoledflp",  // Spotify demo
+    "dhmdaeekeihmajjnmichlhiffffdbpde",  // Store.app demo
+    "jeabmjjifhfcejonjjhccaeigpnnjaak",  // TweetDeck demo
+    "pbdihpaifchmclcmkfdgffnnpfbobefh",  // YouTube demo
+
+    // Testing extensions:
+    "ongnjlefhnoajpbodoldndkbkdgfomlp",  // Show Managed Storage
 };
 
 }  // namespace
diff --git a/chrome/browser/chromeos/input_method/input_method_engine.cc b/chrome/browser/chromeos/input_method/input_method_engine.cc
index bc9761e..0179772 100644
--- a/chrome/browser/chromeos/input_method/input_method_engine.cc
+++ b/chrome/browser/chromeos/input_method/input_method_engine.cc
@@ -120,15 +120,19 @@
       composition_cursor_(0),
       candidate_window_(new ui::CandidateWindow()),
       window_visible_(false),
-      sent_key_event_(NULL) {}
+      sent_key_event_(NULL),
+      profile_(NULL) {
+}
 
 InputMethodEngine::~InputMethodEngine() {
   if (start_time_.ToInternalValue())
     RecordHistogram("WorkingTime", (end_time_ - start_time_).InSeconds());
-  input_method::InputMethodManager::Get()->RemoveInputMethodExtension(imm_id_);
+  input_method::InputMethodManager::Get()->RemoveInputMethodExtension(profile_,
+                                                                      imm_id_);
 }
 
 void InputMethodEngine::Initialize(
+    Profile* profile,
     scoped_ptr<InputMethodEngineInterface::Observer> observer,
     const char* engine_name,
     const char* extension_id,
@@ -139,6 +143,8 @@
     const GURL& input_view) {
   DCHECK(observer) << "Observer must not be null.";
 
+  profile_ = profile;
+
   // TODO(komatsu): It is probably better to set observer out of Initialize.
   observer_ = observer.Pass();
   engine_id_ = engine_id;
@@ -170,7 +176,7 @@
 
   // TODO(komatsu): It is probably better to call AddInputMethodExtension
   // out of Initialize.
-  manager->AddInputMethodExtension(imm_id_, this);
+  manager->AddInputMethodExtension(profile, imm_id_, this);
 }
 
 const input_method::InputMethodDescriptor& InputMethodEngine::GetDescriptor()
diff --git a/chrome/browser/chromeos/input_method/input_method_engine.h b/chrome/browser/chromeos/input_method/input_method_engine.h
index d841a57..22a8006 100644
--- a/chrome/browser/chromeos/input_method/input_method_engine.h
+++ b/chrome/browser/chromeos/input_method/input_method_engine.h
@@ -13,6 +13,8 @@
 #include "chromeos/ime/input_method_descriptor.h"
 #include "url/gurl.h"
 
+class Profile;
+
 namespace ui {
 class CandidateWindow;
 class KeyEvent;
@@ -38,7 +40,8 @@
 
   virtual ~InputMethodEngine();
 
-  void Initialize(scoped_ptr<InputMethodEngineInterface::Observer> observer,
+  void Initialize(Profile* profile,
+                  scoped_ptr<InputMethodEngineInterface::Observer> observer,
                   const char* engine_name,
                   const char* extension_id,
                   const char* engine_id,
@@ -162,6 +165,9 @@
   // The start & end time of using this input method. This is for UMA.
   base::Time start_time_;
   base::Time end_time_;
+
+  // User profile that owns this method.
+  Profile* profile_;
 };
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/input_method/input_method_engine_unittest.cc b/chrome/browser/chromeos/input_method/input_method_engine_unittest.cc
index 8210b17..a5df161 100644
--- a/chrome/browser/chromeos/input_method/input_method_engine_unittest.cc
+++ b/chrome/browser/chromeos/input_method/input_method_engine_unittest.cc
@@ -175,7 +175,8 @@
     engine_.reset(new InputMethodEngine());
     observer_ = new TestObserver();
     scoped_ptr<InputMethodEngineInterface::Observer> observer_ptr(observer_);
-    engine_->Initialize(observer_ptr.Pass(),
+    engine_->Initialize(NULL /* profile */,
+                        observer_ptr.Pass(),
                         "",
                         whitelisted ? kTestExtensionId : kTestExtensionId2,
                         kTestImeEngineId,
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
index b89db86..8e3a62b 100644
--- a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
+++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
@@ -478,6 +478,7 @@
 }
 
 void InputMethodManagerImpl::AddInputMethodExtension(
+    Profile* profile,
     const std::string& id,
     InputMethodEngineInterface* engine) {
   if (state_ == STATE_TERMINATING)
@@ -485,7 +486,7 @@
 
   DCHECK(engine);
 
-  profile_engine_map_[GetProfile()][id] = engine;
+  profile_engine_map_[profile][id] = engine;
 
   if (id == current_input_method_.id()) {
     IMEBridge::Get()->SetCurrentEngineHandler(engine);
@@ -514,7 +515,8 @@
   }
 }
 
-void InputMethodManagerImpl::RemoveInputMethodExtension(const std::string& id) {
+void InputMethodManagerImpl::RemoveInputMethodExtension(Profile* profile,
+                                                        const std::string& id) {
   if (!extension_ime_util::IsExtensionIME(id))
     DVLOG(1) << id << " is not a valid extension input method ID.";
 
@@ -524,7 +526,7 @@
     active_input_method_ids_.erase(i);
   extra_input_methods_.erase(id);
 
-  EngineMap& engine_map = profile_engine_map_[GetProfile()];
+  EngineMap& engine_map = profile_engine_map_[profile];
   if (IMEBridge::Get()->GetCurrentEngineHandler() == engine_map[id])
     IMEBridge::Get()->SetCurrentEngineHandler(NULL);
   engine_map.erase(id);
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.h b/chrome/browser/chromeos/input_method/input_method_manager_impl.h
index c8117dc..9da266b 100644
--- a/chrome/browser/chromeos/input_method/input_method_manager_impl.h
+++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.h
@@ -70,9 +70,11 @@
   virtual void ChangeInputMethod(const std::string& input_method_id) OVERRIDE;
   virtual void ActivateInputMethodMenuItem(const std::string& key) OVERRIDE;
   virtual void AddInputMethodExtension(
+      Profile* profile,
       const std::string& id,
       InputMethodEngineInterface* instance) OVERRIDE;
-  virtual void RemoveInputMethodExtension(const std::string& id) OVERRIDE;
+  virtual void RemoveInputMethodExtension(Profile* profile,
+                                          const std::string& id) OVERRIDE;
   virtual void GetInputMethodExtensions(
       InputMethodDescriptors* result) OVERRIDE;
   virtual void SetEnabledExtensionImes(std::vector<std::string>* ids) OVERRIDE;
@@ -106,6 +108,8 @@
       scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate);
 
  private:
+  friend class InputMethodManagerImplTest;
+
   // CandidateWindowController::Observer overrides:
   virtual void CandidateClicked(int index) OVERRIDE;
   virtual void CandidateWindowOpened() OVERRIDE;
@@ -167,6 +171,9 @@
   void ReconfigureIMFramework();
 
   // Gets the current active user profile.
+  // Note: this method is deprecated as ActiveUserProfile might change
+  // during asynchronous operations that leads to strange crashes.
+  // Use with caution!
   Profile* GetProfile() const;
 
   scoped_ptr<InputMethodDelegate> delegate_;
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc
index ba24c42..551353e 100644
--- a/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc
+++ b/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc
@@ -58,6 +58,59 @@
   return extension_ime_util::GetInputMethodIDByEngineID(id);
 }
 
+class TestObserver : public InputMethodManager::Observer,
+                     public ash::ime::InputMethodMenuManager::Observer {
+ public:
+  TestObserver()
+      : input_method_changed_count_(0),
+        input_method_menu_item_changed_count_(0),
+        last_show_message_(false) {
+  }
+  virtual ~TestObserver() {}
+
+  virtual void InputMethodChanged(InputMethodManager* manager,
+                                  bool show_message) OVERRIDE {
+    ++input_method_changed_count_;
+    last_show_message_ = show_message;
+  }
+  virtual void InputMethodMenuItemChanged(
+      ash::ime::InputMethodMenuManager* manager) OVERRIDE {
+    ++input_method_menu_item_changed_count_;
+  }
+
+  int input_method_changed_count_;
+  int input_method_menu_item_changed_count_;
+  bool last_show_message_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TestObserver);
+};
+
+class TestCandidateWindowObserver
+    : public InputMethodManager::CandidateWindowObserver {
+ public:
+  TestCandidateWindowObserver()
+      : candidate_window_opened_count_(0),
+        candidate_window_closed_count_(0) {
+  }
+
+  virtual ~TestCandidateWindowObserver() {}
+
+  virtual void CandidateWindowOpened(InputMethodManager* manager) OVERRIDE {
+    ++candidate_window_opened_count_;
+  }
+  virtual void CandidateWindowClosed(InputMethodManager* manager) OVERRIDE {
+    ++candidate_window_closed_count_;
+  }
+
+  int candidate_window_opened_count_;
+  int candidate_window_closed_count_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TestCandidateWindowObserver);
+};
+}  // namespace
+
 class InputMethodManagerImplTest :  public BrowserWithTestWindowTest {
  public:
   InputMethodManagerImplTest()
@@ -108,6 +161,7 @@
   }
 
  protected:
+  Profile* GetProfile() { return manager_->GetProfile(); }
   // Helper function to initialize component extension stuff for testing.
   void InitComponentExtension() {
     mock_delegate_ = new MockComponentExtIMEManagerDelegate();
@@ -117,13 +171,17 @@
     // Note, for production, these SetEngineHandler are called when
     // IMEEngineHandlerInterface is initialized via
     // InitializeComponentextension.
-    manager_->AddInputMethodExtension(ImeIdFromEngineId(kNaclMozcUsId),
+    manager_->AddInputMethodExtension(GetProfile(),
+                                      ImeIdFromEngineId(kNaclMozcUsId),
                                       mock_engine_handler_.get());
-    manager_->AddInputMethodExtension(ImeIdFromEngineId(kNaclMozcJpId),
+    manager_->AddInputMethodExtension(GetProfile(),
+                                      ImeIdFromEngineId(kNaclMozcJpId),
                                       mock_engine_handler_.get());
-    manager_->AddInputMethodExtension(ImeIdFromEngineId(kExt2Engine1Id),
+    manager_->AddInputMethodExtension(GetProfile(),
+                                      ImeIdFromEngineId(kExt2Engine1Id),
                                       mock_engine_handler_.get());
-    manager_->AddInputMethodExtension(ImeIdFromEngineId(kExt2Engine2Id),
+    manager_->AddInputMethodExtension(GetProfile(),
+                                      ImeIdFromEngineId(kExt2Engine2Id),
                                       mock_engine_handler_.get());
     manager_->InitializeComponentExtensionForTesting(delegate.Pass());
   }
@@ -269,58 +327,6 @@
   DISALLOW_COPY_AND_ASSIGN(InputMethodManagerImplTest);
 };
 
-class TestObserver : public InputMethodManager::Observer,
-                     public ash::ime::InputMethodMenuManager::Observer{
- public:
-  TestObserver()
-      : input_method_changed_count_(0),
-        input_method_menu_item_changed_count_(0),
-        last_show_message_(false) {
-  }
-  virtual ~TestObserver() {}
-
-  virtual void InputMethodChanged(InputMethodManager* manager,
-                                  bool show_message) OVERRIDE {
-    ++input_method_changed_count_;
-    last_show_message_ = show_message;
-  }
-  virtual void InputMethodMenuItemChanged(
-      ash::ime::InputMethodMenuManager* manager) OVERRIDE {
-    ++input_method_menu_item_changed_count_;
-  }
-
-  int input_method_changed_count_;
-  int input_method_menu_item_changed_count_;
-  bool last_show_message_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestObserver);
-};
-
-class TestCandidateWindowObserver
-    : public InputMethodManager::CandidateWindowObserver {
- public:
-  TestCandidateWindowObserver()
-      : candidate_window_opened_count_(0),
-        candidate_window_closed_count_(0) {
-  }
-  virtual ~TestCandidateWindowObserver() {}
-
-  virtual void CandidateWindowOpened(InputMethodManager* manager) OVERRIDE {
-    ++candidate_window_opened_count_;
-  }
-  virtual void CandidateWindowClosed(InputMethodManager* manager) OVERRIDE {
-    ++candidate_window_closed_count_;
-  }
-
-  int candidate_window_opened_count_;
-  int candidate_window_closed_count_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestCandidateWindowObserver);
-};
-}  // namespace
-
 TEST_F(InputMethodManagerImplTest, TestGetImeKeyboard) {
   EXPECT_TRUE(manager_->GetImeKeyboard());
   EXPECT_EQ(keyboard_, manager_->GetImeKeyboard());
@@ -1129,7 +1135,7 @@
                                           GURL(),
                                           GURL());
   MockInputMethodEngine engine(descriptor1);
-  manager_->AddInputMethodExtension(ext1_id, &engine);
+  manager_->AddInputMethodExtension(GetProfile(), ext1_id, &engine);
 
   // Extension IMEs are not enabled by default.
   EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
@@ -1158,7 +1164,7 @@
                                           GURL(),
                                           GURL());
   MockInputMethodEngine engine2(descriptor2);
-  manager_->AddInputMethodExtension(ext2_id, &engine2);
+  manager_->AddInputMethodExtension(GetProfile(), ext2_id, &engine2);
   EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
 
   extension_ime_ids.push_back(ext2_id);
@@ -1174,9 +1180,9 @@
   }
 
   // Remove them.
-  manager_->RemoveInputMethodExtension(ext1_id);
+  manager_->RemoveInputMethodExtension(GetProfile(), ext1_id);
   EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
-  manager_->RemoveInputMethodExtension(ext2_id);
+  manager_->RemoveInputMethodExtension(GetProfile(), ext2_id);
   EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
 }
 
@@ -1210,7 +1216,7 @@
                                          GURL(),
                                          GURL());
   MockInputMethodEngine engine(descriptor);
-  manager_->AddInputMethodExtension(ext_id, &engine);
+  manager_->AddInputMethodExtension(GetProfile(), ext_id, &engine);
 
   // Extension IME is not enabled by default.
   EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
diff --git a/chrome/browser/chromeos/input_method/mock_input_method_manager.cc b/chrome/browser/chromeos/input_method/mock_input_method_manager.cc
index fa3e170..7af6d62 100644
--- a/chrome/browser/chromeos/input_method/mock_input_method_manager.cc
+++ b/chrome/browser/chromeos/input_method/mock_input_method_manager.cc
@@ -97,11 +97,13 @@
 }
 
 void MockInputMethodManager::AddInputMethodExtension(
+    Profile* profile,
     const std::string& id,
     InputMethodEngineInterface* instance) {
 }
 
-void MockInputMethodManager::RemoveInputMethodExtension(const std::string& id) {
+void MockInputMethodManager::RemoveInputMethodExtension(Profile* profile,
+                                                        const std::string& id) {
 }
 
 void MockInputMethodManager::GetInputMethodExtensions(
diff --git a/chrome/browser/chromeos/input_method/mock_input_method_manager.h b/chrome/browser/chromeos/input_method/mock_input_method_manager.h
index 9319126..4bfd2c2 100644
--- a/chrome/browser/chromeos/input_method/mock_input_method_manager.h
+++ b/chrome/browser/chromeos/input_method/mock_input_method_manager.h
@@ -47,9 +47,11 @@
   virtual void ChangeInputMethod(const std::string& input_method_id) OVERRIDE;
   virtual void ActivateInputMethodMenuItem(const std::string& key) OVERRIDE;
   virtual void AddInputMethodExtension(
+      Profile* profile,
       const std::string& id,
       InputMethodEngineInterface* instance) OVERRIDE;
-  virtual void RemoveInputMethodExtension(const std::string& id) OVERRIDE;
+  virtual void RemoveInputMethodExtension(Profile* profile,
+                                          const std::string& id) OVERRIDE;
   virtual void GetInputMethodExtensions(
       InputMethodDescriptors* result) OVERRIDE;
   virtual void SetEnabledExtensionImes(std::vector<std::string>* ids) OVERRIDE;
diff --git a/chrome/browser/component_updater/default_component_installer.cc b/chrome/browser/component_updater/default_component_installer.cc
index a2983c1..48cd770 100644
--- a/chrome/browser/component_updater/default_component_installer.cc
+++ b/chrome/browser/component_updater/default_component_installer.cc
@@ -154,17 +154,20 @@
   }
 
   if (found) {
-    current_version_ = latest_version;
-    // TODO(ddorwin): Remove these members and pass them directly to
-    // FinishRegistration().
-    base::ReadFileToString(latest_dir.AppendASCII("manifest.fingerprint"),
-                           &current_fingerprint_);
     current_manifest_ = ReadManifest(latest_dir);
-    if (!current_manifest_) {
+    if (current_manifest_) {
+      current_version_ = latest_version;
+      // TODO(ddorwin): Remove these members and pass them directly to
+      // FinishRegistration().
+      base::ReadFileToString(latest_dir.AppendASCII("manifest.fingerprint"),
+                             &current_fingerprint_);
+    } else {
+      // If the manifest can't be read, mark the directory for deletion and
+      // continue as if there were no versioned directories at all.
       DLOG(ERROR) << "Failed to read manifest for "
                   << installer_traits_->GetName() << " ("
                   << base_dir.MaybeAsASCII() << ").";
-      return;
+      older_dirs.push_back(latest_dir);
     }
   }
 
diff --git a/chrome/browser/extensions/api/input/input.cc b/chrome/browser/extensions/api/input/input.cc
index 2e2772b..a3939ad 100644
--- a/chrome/browser/extensions/api/input/input.cc
+++ b/chrome/browser/extensions/api/input/input.cc
@@ -18,6 +18,12 @@
 #include "ui/keyboard/keyboard_controller.h"
 #include "ui/keyboard/keyboard_switches.h"
 
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/login/lock/screen_locker.h"
+#include "chrome/browser/chromeos/login/ui/user_adding_screen.h"
+#include "chrome/browser/chromeos/login/users/user_manager.h"
+#endif  // OS_CHROMEOS
+
 #if defined(USE_ASH)
 #include "ash/root_window_controller.h"
 #include "ash/shell.h"
@@ -168,6 +174,16 @@
 bool VirtualKeyboardPrivateOpenSettingsFunction::RunSync() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 #if defined(USE_ASH)
+#if defined(OS_CHROMEOS)
+  // Do not try to open language options page if user is not logged in or
+  // locked.
+  if (!chromeos::UserManager::Get()->IsUserLoggedIn() ||
+      chromeos::UserAddingScreen::Get()->IsRunning() ||
+      (chromeos::ScreenLocker::default_screen_locker() &&
+          chromeos::ScreenLocker::default_screen_locker()->locked()))
+    return true;
+#endif  // OS_CHROMEOS
+
   content::RecordAction(base::UserMetricsAction("OpenLanguageOptionsDialog"));
   chrome::ShowSettingsSubPageForProfile(
       ProfileManager::GetActiveUserProfile(), chrome::kLanguageOptionsSubPage);
diff --git a/chrome/browser/extensions/api/input_ime/input_ime_api.cc b/chrome/browser/extensions/api/input_ime/input_ime_api.cc
index b698b8b..3b4c626 100644
--- a/chrome/browser/extensions/api/input_ime/input_ime_api.cc
+++ b/chrome/browser/extensions/api/input_ime/input_ime_api.cc
@@ -328,6 +328,7 @@
 }
 
 bool InputImeEventRouter::RegisterIme(
+    Profile* profile,
     const std::string& extension_id,
     const extensions::InputComponentInfo& component) {
 #if defined(USE_X11)
@@ -344,11 +345,11 @@
   // to maintain an internal map for observers which does nearly nothing
   // but just make sure they can properly deleted.
   // Making Obesrver per InputMethodEngine can make things cleaner.
-  Profile* profile = ProfileManager::GetActiveUserProfile();
   scoped_ptr<chromeos::InputMethodEngineInterface::Observer> observer(
       new chromeos::ImeObserver(profile, extension_id));
   chromeos::InputMethodEngine* engine = new chromeos::InputMethodEngine();
-  engine->Initialize(observer.Pass(),
+  engine->Initialize(profile,
+                     observer.Pass(),
                      component.name.c_str(),
                      extension_id.c_str(),
                      component.id.c_str(),
@@ -830,14 +831,17 @@
        component != input_components->end();
        ++component) {
     if (component->type == extensions::INPUT_COMPONENT_TYPE_IME) {
-      // Don't pass profile_ to register ime, instead always use
-      // GetActiveUserProfile. It is because:
-      // The original profile for login screen is called signin profile.
-      // And the active profile is the incognito profile based on signin
-      // profile. So if |profile_| is signin profile, we need to make sure
+      // If |browser_context| looks like signin profile, use the real signin
+      // profile. This is because IME extensions for signin profile are run
+      // in Off-The-Record profile, based on given static defaults.
+      // So if |profile_| is signin profile, we need to make sure
       // the router/observer runs under its incognito profile, because the
       // component extensions were installed under its incognito profile.
-      input_ime_event_router()->RegisterIme(extension->id(), *component);
+      Profile* profile = Profile::FromBrowserContext(browser_context);
+      if (chromeos::ProfileHelper::IsSigninProfile(profile))
+        profile = chromeos::ProfileHelper::GetSigninProfile();
+      input_ime_event_router()->RegisterIme(
+          profile, extension->id(), *component);
     }
   }
 }
diff --git a/chrome/browser/extensions/api/input_ime/input_ime_api.h b/chrome/browser/extensions/api/input_ime/input_ime_api.h
index 773d13b..0090e5d 100644
--- a/chrome/browser/extensions/api/input_ime/input_ime_api.h
+++ b/chrome/browser/extensions/api/input_ime/input_ime_api.h
@@ -36,7 +36,8 @@
  public:
   static InputImeEventRouter* GetInstance();
 
-  bool RegisterIme(const std::string& extension_id,
+  bool RegisterIme(Profile*,
+                   const std::string& extension_id,
                    const extensions::InputComponentInfo& component);
   void UnregisterAllImes(const std::string& extension_id);
   chromeos::InputMethodEngineInterface* GetEngine(
diff --git a/chrome/browser/extensions/extension_install_prompt.cc b/chrome/browser/extensions/extension_install_prompt.cc
index 074b046..97af6cb 100644
--- a/chrome/browser/extensions/extension_install_prompt.cc
+++ b/chrome/browser/extensions/extension_install_prompt.cc
@@ -712,22 +712,18 @@
   else
     prompt_->set_experiment(ExtensionInstallPromptExperiment::ControlGroup());
 
-  if (permissions_.get()) {
-    if (extension_) {
-      const extensions::PermissionsData* permissions_data =
-          extension_->permissions_data();
-      prompt_->SetPermissions(permissions_data->GetPermissionMessageStrings());
-      prompt_->SetPermissionsDetails(
-          permissions_data->GetPermissionMessageDetailsStrings());
-    } else {
-      const extensions::PermissionMessageProvider* message_provider =
-          extensions::PermissionMessageProvider::Get();
-      prompt_->SetPermissions(message_provider->GetWarningMessages(
-          permissions_, Manifest::TYPE_UNKNOWN));
-      prompt_->SetPermissionsDetails(
-          message_provider->GetWarningMessagesDetails(permissions_,
-                                                      Manifest::TYPE_UNKNOWN));
-    }
+  if (permissions_.get() &&
+      (!extension_ ||
+       !extensions::PermissionsData::ShouldSkipPermissionWarnings(
+           extension_->id()))) {
+    Manifest::Type type =
+        extension_ ? extension_->GetType() : Manifest::TYPE_UNKNOWN;
+    const extensions::PermissionMessageProvider* message_provider =
+        extensions::PermissionMessageProvider::Get();
+    prompt_->SetPermissions(
+        message_provider->GetWarningMessages(permissions_, type));
+    prompt_->SetPermissionsDetails(
+        message_provider->GetWarningMessagesDetails(permissions_, type));
   }
 
   switch (prompt_->type()) {
diff --git a/chrome/browser/extensions/extension_install_prompt.h b/chrome/browser/extensions/extension_install_prompt.h
index 57ed542..59dcd6c 100644
--- a/chrome/browser/extensions/extension_install_prompt.h
+++ b/chrome/browser/extensions/extension_install_prompt.h
@@ -353,6 +353,10 @@
   // Installation failed. This is declared virtual for testing.
   virtual void OnInstallFailure(const extensions::CrxInstallerError& error);
 
+  void set_callback_for_test(const ShowDialogCallback& show_dialog_callback) {
+    show_dialog_callback_ = show_dialog_callback;
+  }
+
  protected:
   friend class extensions::ExtensionWebstorePrivateApiTest;
   friend class WebstoreStartupInstallUnpackFailureTest;
diff --git a/chrome/browser/extensions/extension_install_prompt_unittest.cc b/chrome/browser/extensions/extension_install_prompt_unittest.cc
new file mode 100644
index 0000000..347db0f
--- /dev/null
+++ b/chrome/browser/extensions/extension_install_prompt_unittest.cc
@@ -0,0 +1,57 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/bind.h"
+#include "base/memory/ref_counted.h"
+#include "base/run_loop.h"
+#include "chrome/browser/extensions/extension_install_prompt.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/extension_builder.h"
+#include "extensions/common/permissions/api_permission.h"
+#include "extensions/common/permissions/api_permission_set.h"
+#include "extensions/common/permissions/manifest_permission_set.h"
+#include "extensions/common/permissions/permission_set.h"
+#include "extensions/common/url_pattern_set.h"
+#include "extensions/common/value_builder.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace extensions {
+
+void VerifyPromptPermissionsCallback(
+    const base::Closure& quit_closure,
+    const ExtensionInstallPrompt::ShowParams& params,
+    ExtensionInstallPrompt::Delegate* delegate,
+    scoped_refptr<ExtensionInstallPrompt::Prompt> install_prompt) {
+  ASSERT_TRUE(install_prompt.get());
+  EXPECT_EQ(1u, install_prompt->GetPermissionCount());
+  quit_closure.Run();
+}
+
+TEST(ExtensionInstallPromptUnittest, PromptShowsPermissionWarnings) {
+  content::TestBrowserThreadBundle thread_bundle;
+  APIPermissionSet api_permissions;
+  api_permissions.insert(APIPermission::kTab);
+  scoped_refptr<PermissionSet> permission_set =
+      new PermissionSet(api_permissions,
+                        ManifestPermissionSet(),
+                        URLPatternSet(),
+                        URLPatternSet());
+  scoped_refptr<const Extension> extension =
+      ExtensionBuilder().SetManifest(
+          DictionaryBuilder().Set("name", "foo")
+                             .Set("version", "1.0")
+                             .Set("manifest_version", 2)
+                             .Set("description", "Random Ext")).Build();
+  ExtensionInstallPrompt prompt(NULL /* no web contents in this test */);
+  base::RunLoop run_loop;
+  prompt.set_callback_for_test(base::Bind(&VerifyPromptPermissionsCallback,
+                                          run_loop.QuitClosure()));
+  prompt.ConfirmPermissions(NULL,  // no delegate
+                            extension,
+                            permission_set);
+  run_loop.Run();
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/history/history_backend.cc b/chrome/browser/history/history_backend.cc
index c30c6aa..bc8a328 100644
--- a/chrome/browser/history/history_backend.cc
+++ b/chrome/browser/history/history_backend.cc
@@ -996,14 +996,14 @@
   return false;
 }
 
-HistoryBackend::QueryURLResult HistoryBackend::QueryURL(const GURL& url,
-                                                        bool want_visits) {
-  QueryURLResult result;
-  result.success = db_ && db_->GetRowForURL(url, &result.row);
+void HistoryBackend::QueryURL(const GURL& url,
+                              bool want_visits,
+                              QueryURLResult* result) {
+  DCHECK(result);
+  result->success = db_ && db_->GetRowForURL(url, &result->row);
   // Optionally query the visits.
-  if (result.success && want_visits)
-    db_->GetVisitsForURL(result.row.id(), &result.visits);
-  return result;
+  if (result->success && want_visits)
+    db_->GetVisitsForURL(result->row.id(), &result->visits);
 }
 
 TypedUrlSyncableService* HistoryBackend::GetTypedUrlSyncableService() const {
diff --git a/chrome/browser/history/history_backend.h b/chrome/browser/history/history_backend.h
index 8ed3508..82552eb 100644
--- a/chrome/browser/history/history_backend.h
+++ b/chrome/browser/history/history_backend.h
@@ -159,7 +159,9 @@
   void IterateURLs(
       const scoped_refptr<visitedlink::VisitedLinkDelegate::URLEnumerator>&
           enumerator);
-  QueryURLResult QueryURL(const GURL& url, bool want_visits);
+  void QueryURL(const GURL& url,
+                bool want_visits,
+                QueryURLResult* query_url_result);
   void QueryHistory(scoped_refptr<QueryHistoryRequest> request,
                     const base::string16& text_query,
                     const QueryOptions& options);
diff --git a/chrome/browser/history/history_service.cc b/chrome/browser/history/history_service.cc
index 405b8e8..80803bb 100644
--- a/chrome/browser/history/history_service.cc
+++ b/chrome/browser/history/history_service.cc
@@ -82,8 +82,8 @@
 }
 
 void RunWithQueryURLResult(const HistoryService::QueryURLCallback& callback,
-                           const HistoryBackend::QueryURLResult& result) {
-  callback.Run(result.success, result.row, result.visits);
+                           const HistoryBackend::QueryURLResult* result) {
+  callback.Run(result->success, result->row, result->visits);
 }
 
 // Extract history::URLRows into GURLs for VisitedLinkMaster.
@@ -708,12 +708,18 @@
     const QueryURLCallback& callback,
     base::CancelableTaskTracker* tracker) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  return PostTaskAndReplyWithResult(
+  HistoryBackend::QueryURLResult* query_url_result =
+      new HistoryBackend::QueryURLResult();
+  return tracker->PostTaskAndReply(
       thread_->message_loop_proxy().get(),
       FROM_HERE,
+      base::Bind(&HistoryBackend::QueryURL,
+                 history_backend_.get(),
+                 url,
+                 want_visits,
+                 base::Unretained(query_url_result)),
       base::Bind(
-          &HistoryBackend::QueryURL, history_backend_.get(), url, want_visits),
-      base::Bind(&RunWithQueryURLResult, callback));
+          &RunWithQueryURLResult, callback, base::Owned(query_url_result)));
 }
 
 // Downloads -------------------------------------------------------------------
diff --git a/chrome/browser/local_discovery/service_discovery_shared_client.cc b/chrome/browser/local_discovery/service_discovery_shared_client.cc
index e7f851e..01c3c00 100644
--- a/chrome/browser/local_discovery/service_discovery_shared_client.cc
+++ b/chrome/browser/local_discovery/service_discovery_shared_client.cc
@@ -20,16 +20,12 @@
 #endif
 
 #if defined(ENABLE_MDNS)
-#include "chrome/browser/local_discovery/service_discovery_client_mdns.h"
 #include "chrome/browser/local_discovery/service_discovery_client_utility.h"
 #endif  // ENABLE_MDNS
 
 namespace {
 
 #if defined(OS_WIN)
-
-bool g_is_firewall_ready = false;
-
 void ReportFirewallStats() {
   base::FilePath exe_path;
   if (!PathService::Get(base::FILE_EXE, &exe_path))
@@ -40,9 +36,9 @@
                                          exe_path);
   if (!manager)
     return;
-  g_is_firewall_ready = manager->CanUseLocalPorts();
+  bool is_ready = manager->CanUseLocalPorts();
   UMA_HISTOGRAM_TIMES("LocalDiscovery.FirewallAccessTime", timer.Elapsed());
-  UMA_HISTOGRAM_BOOLEAN("LocalDiscovery.IsFirewallReady", g_is_firewall_ready);
+  UMA_HISTOGRAM_BOOLEAN("LocalDiscovery.IsFirewallReady", is_ready);
 }
 #endif  // OS_WIN
 
@@ -84,13 +80,11 @@
   static bool reported =
       BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
                               base::Bind(&ReportFirewallStats));
-  // TODO(vitalybuka): Switch to |ServiceDiscoveryClientMdns| after we find what
-  // to do with firewall for user-level installs. crbug.com/366408
-  if (!g_is_firewall_ready)
-    return new ServiceDiscoveryClientUtility();
 #endif  // OS_WIN
 
-  return new ServiceDiscoveryClientMdns();
+  // TODO(vitalybuka): Switch to |ServiceDiscoveryClientMdns| after we find what
+  // to do with firewall for user-level installs. crbug.com/366408
+  return new ServiceDiscoveryClientUtility();
 #endif // OS_MACOSX
 }
 
diff --git a/chrome/browser/renderer_host/chrome_extension_message_filter.cc b/chrome/browser/renderer_host/chrome_extension_message_filter.cc
index 6a358ee..a6865c8 100644
--- a/chrome/browser/renderer_host/chrome_extension_message_filter.cc
+++ b/chrome/browser/renderer_host/chrome_extension_message_filter.cc
@@ -9,6 +9,7 @@
 #include "base/files/file_path.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/activity_log/activity_action_constants.h"
 #include "chrome/browser/extensions/activity_log/activity_actions.h"
 #include "chrome/browser/extensions/activity_log/activity_log.h"
@@ -18,6 +19,7 @@
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/common/extensions/api/i18n/default_locale_handler.h"
 #include "chrome/common/render_messages.h"
+#include "content/public/browser/notification_service.h"
 #include "content/public/browser/render_process_host.h"
 #include "extensions/browser/extension_system.h"
 #include "extensions/common/constants.h"
@@ -71,9 +73,14 @@
       profile_(profile),
       extension_info_map_(
           extensions::ExtensionSystem::Get(profile)->info_map()) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  notification_registrar_.Add(this,
+                              chrome::NOTIFICATION_PROFILE_DESTROYED,
+                              content::Source<Profile>(profile));
 }
 
 ChromeExtensionMessageFilter::~ChromeExtensionMessageFilter() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 }
 
 bool ChromeExtensionMessageFilter::OnMessageReceived(
@@ -115,6 +122,14 @@
   }
 }
 
+void ChromeExtensionMessageFilter::OnDestruct() const {
+  if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
+    delete this;
+  } else {
+    BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, this);
+  }
+}
+
 void ChromeExtensionMessageFilter::OnCanTriggerClipboardRead(
     const GURL& origin, bool* allowed) {
   *allowed = extension_info_map_->SecurityOriginHasAPIPermission(
@@ -154,10 +169,17 @@
     const std::string& channel_name,
     bool include_tls_channel_id) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-  extensions::MessageService::Get(profile_)->OpenChannelToExtension(
-      source_process_id, source_routing_id, receiver_port_id,
-      info.source_id, info.target_id, info.source_url, channel_name,
-      include_tls_channel_id);
+  if (profile_) {
+    extensions::MessageService::Get(profile_)
+        ->OpenChannelToExtension(source_process_id,
+                                 source_routing_id,
+                                 receiver_port_id,
+                                 info.source_id,
+                                 info.target_id,
+                                 info.source_url,
+                                 channel_name,
+                                 include_tls_channel_id);
+  }
 }
 
 void ChromeExtensionMessageFilter::OnOpenChannelToNativeApp(
@@ -181,9 +203,14 @@
     const std::string& source_extension_id,
     const std::string& native_app_name) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-  extensions::MessageService::Get(profile_)->OpenChannelToNativeApp(
-      render_process_id_, source_routing_id, receiver_port_id,
-      source_extension_id, native_app_name);
+  if (profile_) {
+    extensions::MessageService::Get(profile_)
+        ->OpenChannelToNativeApp(render_process_id_,
+                                 source_routing_id,
+                                 receiver_port_id,
+                                 source_extension_id,
+                                 native_app_name);
+  }
 }
 
 void ChromeExtensionMessageFilter::OnOpenChannelToTab(
@@ -206,9 +233,15 @@
     const std::string& extension_id,
     const std::string& channel_name) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-  extensions::MessageService::Get(profile_)->OpenChannelToTab(
-      source_process_id, source_routing_id, receiver_port_id,
-      tab_id, extension_id, channel_name);
+  if (profile_) {
+    extensions::MessageService::Get(profile_)
+        ->OpenChannelToTab(source_process_id,
+                           source_routing_id,
+                           receiver_port_id,
+                           tab_id,
+                           extension_id,
+                           channel_name);
+  }
 }
 
 void ChromeExtensionMessageFilter::OnGetExtMessageBundle(
@@ -298,3 +331,11 @@
   }
   AddActionToExtensionActivityLog(profile_, action);
 }
+
+void ChromeExtensionMessageFilter::Observe(
+    int type,
+    const content::NotificationSource& source,
+    const content::NotificationDetails& details) {
+  DCHECK_EQ(chrome::NOTIFICATION_PROFILE_DESTROYED, type);
+  profile_ = NULL;
+}
diff --git a/chrome/browser/renderer_host/chrome_extension_message_filter.h b/chrome/browser/renderer_host/chrome_extension_message_filter.h
index 57cd927..4a3f341 100644
--- a/chrome/browser/renderer_host/chrome_extension_message_filter.h
+++ b/chrome/browser/renderer_host/chrome_extension_message_filter.h
@@ -9,6 +9,8 @@
 
 #include "base/sequenced_task_runner_helpers.h"
 #include "content/public/browser/browser_message_filter.h"
+#include "content/public/browser/notification_observer.h"
+#include "content/public/browser/notification_registrar.h"
 
 class GURL;
 class Profile;
@@ -26,7 +28,8 @@
 
 // This class filters out incoming Chrome-specific IPC messages from the
 // extension process on the IPC thread.
-class ChromeExtensionMessageFilter : public content::BrowserMessageFilter {
+class ChromeExtensionMessageFilter : public content::BrowserMessageFilter,
+                                     public content::NotificationObserver {
  public:
   ChromeExtensionMessageFilter(int render_process_id, Profile* profile);
 
@@ -35,6 +38,7 @@
   virtual void OverrideThreadForMessage(
       const IPC::Message& message,
       content::BrowserThread::ID* thread) OVERRIDE;
+  virtual void OnDestruct() const OVERRIDE;
 
  private:
   friend class content::BrowserThread;
@@ -97,14 +101,23 @@
       const std::string& extension_id,
       const ExtensionHostMsg_APIActionOrEvent_Params& params);
 
+  // content::NotificationObserver implementation.
+  virtual void Observe(int type,
+                       const content::NotificationSource& source,
+                       const content::NotificationDetails& details) OVERRIDE;
+
   const int render_process_id_;
 
   // The Profile associated with our renderer process.  This should only be
-  // accessed on the UI thread!
+  // accessed on the UI thread! Furthermore since this class is refcounted it
+  // may outlive |profile_|, so make sure to NULL check if in doubt; async
+  // calls and the like.
   Profile* profile_;
 
   scoped_refptr<extensions::InfoMap> extension_info_map_;
 
+  content::NotificationRegistrar notification_registrar_;
+
   DISALLOW_COPY_AND_ASSIGN(ChromeExtensionMessageFilter);
 };
 
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
index 32c7ccd..6f56091 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
@@ -121,7 +121,7 @@
 <translation id="5080758118274074384">डबल क्लिक किया गया</translation>
 <translation id="6281876499889881039">अगला समान तत्व.</translation>
 <translation id="8767968232364267681">अगले स्‍तर 4 का शीर्षक</translation>
-<translation id="5042770794184672516">वाक् वॉल्‍यूम बढ़ाएं</translation>
+<translation id="5042770794184672516">बोली वॉल्‍यूम बढ़ाएं</translation>
 <translation id="3865806312596179194">mnu itm</translation>
 <translation id="3149472044574196936">अगली पंक्ति</translation>
 <translation id="5866042630553435010">आंशिक रूप से चेक किया गया</translation>
@@ -135,7 +135,7 @@
 <translation id="6364795331201459219">h6</translation>
 <translation id="1156132699680778945">1 लिंक</translation>
 <translation id="3629895152177651589">hd</translation>
-<translation id="5876817486144482042">वाक् वॉल्‍यूम घटाएं</translation>
+<translation id="5876817486144482042">बोली वॉल्‍यूम घटाएं</translation>
 <translation id="5608798115546226984">स्वतः पूर्णता इनलाइन</translation>
 <translation id="5963413905009737549">अनुभाग</translation>
 <translation id="3172700825913348768">{COUNT,plural, =1{रिक्ति}one{# रिक्तियां}other{# रिक्तियां}}</translation>
@@ -224,7 +224,7 @@
 <translation id="962913030769097253">अगले स्तर 1 का शीर्षक</translation>
 <translation id="3616113530831147358">ऑडियो</translation>
 <translation id="3406283310380167331">फ़ॉर्म सूची दिखाएं</translation>
-<translation id="225732394367814946">वाक् की दर बढ़ाएं</translation>
+<translation id="225732394367814946">बोली की दर बढ़ाएं</translation>
 <translation id="3093176084511590672">अगला स्थानचिह्न</translation>
 <translation id="5402367795255837559">ब्रेल</translation>
 <translation id="1452236308086741652"><ph name="VALUE"/>, पासवर्ड पाठ बॉक्‍स</translation>
@@ -354,7 +354,7 @@
 <translation id="1653266918374749391">पिछले स्‍तर 3 का शीर्षक</translation>
 <translation id="3493915602752813531">कोई अगला एंकर नहीं.</translation>
 <translation id="5919442531159595654">प्रतिलिपि बनाएं.</translation>
-<translation id="3712520970944678024">वाक् नियंत्रित करना</translation>
+<translation id="3712520970944678024">बोली नियंत्रित करना</translation>
 <translation id="3392045790598181549"><ph name="NAME"/>, मेनू आइटम</translation>
 <translation id="5851548754964597211">टैब सूची</translation>
 <translation id="5054047268577924192">पिछला सूची आइटम</translation>
@@ -430,7 +430,7 @@
 <translation id="7693840228159394336">पिछला रेडियो बटन</translation>
 <translation id="844681116543532394">कोई पिछला चेकबॉक्स नहीं.</translation>
 <translation id="3030432017085518523">मेनू आइटम रेडियो बटन</translation>
-<translation id="4372705107434148843">वाक् रोकें</translation>
+<translation id="4372705107434148843">बोली रोकें</translation>
 <translation id="2100350898815792233">सभी विराम चिह्न</translation>
 <translation id="7226216518520804442">lst</translation>
 <translation id="4206289001967551965">तालिका के अंदर</translation>
@@ -484,7 +484,7 @@
 <translation id="7609342235116740824">वर्तमान पृष्ठ का URL प्रदर्शित करें</translation>
 <translation id="5102981729317424850">टूल बार</translation>
 <translation id="1810107444790159527">सूची बॉक्स</translation>
-<translation id="948171205378458592">वाक् की दर घटाएं</translation>
+<translation id="948171205378458592">बोली की दर घटाएं</translation>
 <translation id="4842108708071771135">कोई अगला ब्लॉककोट नहीं.</translation>
 <translation id="3286390186030710347">स्लाइडर</translation>
 <translation id="7041173719775863268">चयन समाप्त करें</translation>
diff --git a/chrome/browser/resources/chromeos/login/oobe_screen_hid_detection.css b/chrome/browser/resources/chromeos/login/oobe_screen_hid_detection.css
index 4e4da07..ba150cd 100644
--- a/chrome/browser/resources/chromeos/login/oobe_screen_hid_detection.css
+++ b/chrome/browser/resources/chromeos/login/oobe_screen_hid_detection.css
@@ -19,12 +19,16 @@
 }
 
 #hid-detection #hid-prerequisite-msg {
-  padding: 10px 0 30px;
+  padding: 10px 0 20px;
 }
 
 #hid-keyboard-block,
 #hid-mouse-block {
-  padding: 20px 0;
+  padding: 10px 0;
+}
+
+#hid-keyboard-block {
+  padding-bottom: 30px;
 }
 
 #hid-keyboard-icon,
@@ -42,6 +46,7 @@
 
 #hid-mouse-label,
 #hid-keyboard-label {
+  -webkit-padding-start: 10px;
   display: inline;
 }
 
@@ -63,7 +68,9 @@
 }
 
 #hid-detection #hid-keyboard-pincode {
-  padding: 10px 0 20px 40px;
+  -webkit-padding-start: 40px;
+  padding-bottom: 15px;
+  padding-top: 15px;
 }
 
 .searching #hid-keyboard-label-searching,
@@ -89,6 +96,4 @@
 
 .pairing #hid-keyboard-pincode {
   display: block;
-  margin-left: 40px;
-  padding: 15px 0;
 }
diff --git a/chrome/browser/resources/options/chromeos/bluetooth.css b/chrome/browser/resources/options/chromeos/bluetooth.css
index 3c849a9..b93849e 100644
--- a/chrome/browser/resources/options/chromeos/bluetooth.css
+++ b/chrome/browser/resources/options/chromeos/bluetooth.css
@@ -108,18 +108,12 @@
 .bluetooth-keyboard-button {
   -webkit-padding-end: 15px;
   -webkit-padding-start: 15px;
-  background-image: linear-gradient(to bottom,
-                                    #e9e9e9,
-                                    #f5f5f5);
   border: 1px solid #ccc;
   border-radius: 4px;
-  box-shadow: 0 0 0 1px #888,
-              inset 0 1px 1px 1px #fff,
-              inset 0 -1px 1px 1px #eee;
+  box-shadow: 0 0 0 1px #222;
   color: #222;
   display: inline-block;
-  font-size: 14px;
-  font-weight: 600;
+  font-size: 16px;
   height: 38px;
   line-height: 38px;
   margin: 0 10px 0 0;
@@ -154,20 +148,15 @@
 }
 
 .bluetooth-keyboard-button.key-next {
-  background-image: -webkit-linear-gradient(top,
-                                            rgb(77, 144, 254),
-                                            rgb(71, 135, 237));
-  border: 1px solid rgb(77, 144, 254);
-  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.07),
-            inset 0 1px 1px 1px #fff,
-            inset 0 -1px 1px 1px rgb(77, 144, 254);
+  background: rgb(77, 144, 254);
+  background-image: none;
+  border: 2px solid rgb(77, 144, 254);
+  box-shadow: none;
   color: #fff;
 }
 
 .bluetooth-keyboard-button.key-untyped {
   border: 1px solid #d4d4d4;
-  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.07),
-              inset 0 1px 1px 1px #fff,
-              inset 0 -1px 1px 1px #ddd;
+  box-shadow: 0 0 0 1px #888;
   color: #666;
 }
diff --git a/chrome/browser/resources/options/search_page.js b/chrome/browser/resources/options/search_page.js
index cd72ba5..5d65f7c 100644
--- a/chrome/browser/resources/options/search_page.js
+++ b/chrome/browser/resources/options/search_page.js
@@ -269,10 +269,12 @@
       // Cleanup the search query string.
       text = SearchPage.canonicalizeQuery(text);
 
-      // Set the hash on the current page, and the enclosing uber page
+      // Set the hash on the current page, and the enclosing uber page. Only do
+      // this if the page is not current. See https://crbug.com/401004.
       var hash = text ? '#' + encodeURIComponent(text) : '';
       var path = text ? this.name : '';
-      uber.pushState({}, path + hash);
+      if (location.hash != hash || location.pathname != '/' + path)
+        uber.pushState({}, path + hash);
 
       // Toggle the search page if necessary.
       if (text) {
diff --git a/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.cc b/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.cc
index a382c49..126a469 100644
--- a/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.cc
+++ b/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.cc
@@ -15,6 +15,7 @@
 #include "ash/shell_delegate.h"
 #include "ash/shell_window_ids.h"
 #include "ash/system/tray/system_tray_notifier.h"
+#include "ash/wm/maximize_mode/maximize_mode_controller.h"
 #include "ash/wm/window_state.h"
 #include "base/auto_reset.h"
 #include "base/message_loop/message_loop.h"
@@ -692,6 +693,13 @@
     aura::Window* window,
     bool visible,
     int animation_time_in_ms) {
+  // The MaximizeModeWindowManager will not handle invisible windows since they
+  // are not user activatable. Since invisible windows are not being tracked,
+  // we tell it to maximize / track this window now before it gets shown, to
+  // reduce animation jank from multiple resizes.
+  if (visible)
+    ash::Shell::GetInstance()->maximize_mode_controller()->AddWindow(window);
+
   AnimationSetter animation_setter(
       window,
       GetAdjustedAnimationTimeInMS(animation_time_in_ms));
diff --git a/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc b/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc
index f425e0b..4f3ef97 100644
--- a/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc
+++ b/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc
@@ -8,6 +8,8 @@
 #include "ash/test/ash_test_base.h"
 #include "ash/test/test_session_state_delegate.h"
 #include "ash/test/test_shell_delegate.h"
+#include "ash/wm/maximize_mode/maximize_mode_controller.h"
+#include "ash/wm/maximize_mode/maximize_mode_window_manager.h"
 #include "ash/wm/window_state.h"
 #include "ash/wm/wm_event.h"
 #include "base/command_line.h"
@@ -130,6 +132,19 @@
         window);
   }
 
+  // Create a maximize mode window manager.
+  ash::MaximizeModeWindowManager* CreateMaximizeModeWindowManager() {
+    EXPECT_FALSE(maximize_mode_window_manager());
+    Shell::GetInstance()->maximize_mode_controller()->
+        EnableMaximizeModeWindowManager(true);
+    return maximize_mode_window_manager();
+  }
+
+  ash::MaximizeModeWindowManager* maximize_mode_window_manager() {
+    return Shell::GetInstance()->maximize_mode_controller()->
+        maximize_mode_window_manager_.get();
+  }
+
  private:
   // These get created for each session.
   std::vector<aura::Window*> window_;
@@ -140,6 +155,9 @@
   // The session state delegate.
   ash::test::TestSessionStateDelegate* session_state_delegate_;
 
+  // The maximized window manager (if enabled).
+  scoped_ptr<MaximizeModeWindowManager> maximize_mode_window_manager_;
+
   DISALLOW_COPY_AND_ASSIGN(MultiUserWindowManagerChromeOSTest);
 };
 
@@ -638,6 +656,30 @@
   EXPECT_EQ("H[A,B], H[A,B], S[B,A], H[B,A]", GetStatus());
 }
 
+// Test that in case of an activated maximize mode, windows from other users get
+// maximized after a user switch.
+TEST_F(MultiUserWindowManagerChromeOSTest, MaximizeModeInteraction) {
+  SetUpForThisManyWindows(2);
+
+  multi_user_window_manager()->SetWindowOwner(window(0), "A");
+  multi_user_window_manager()->SetWindowOwner(window(1), "B");
+
+  EXPECT_FALSE(wm::GetWindowState(window(0))->IsMaximized());
+  EXPECT_FALSE(wm::GetWindowState(window(1))->IsMaximized());
+
+  ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
+  ASSERT_TRUE(manager);
+
+  EXPECT_TRUE(wm::GetWindowState(window(0))->IsMaximized());
+  EXPECT_FALSE(wm::GetWindowState(window(1))->IsMaximized());
+
+  // After we start switching to B, the windows of user B should maximize.
+  StartUserTransitionAnimation("B");
+
+  EXPECT_TRUE(wm::GetWindowState(window(0))->IsMaximized());
+  EXPECT_TRUE(wm::GetWindowState(window(1))->IsMaximized());
+}
+
 // Test that a system modal dialog will switch to the desktop of the owning
 // user.
 TEST_F(MultiUserWindowManagerChromeOSTest, SwitchUsersUponModalityChange) {
diff --git a/chrome/browser/ui/startup/startup_browser_creator.cc b/chrome/browser/ui/startup/startup_browser_creator.cc
index 0dc07c9..dd3b244 100644
--- a/chrome/browser/ui/startup/startup_browser_creator.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator.cc
@@ -444,9 +444,12 @@
       if (policy->IsWebSafeScheme(url.scheme()) ||
           url.SchemeIs(url::kFileScheme) ||
 #if defined(OS_CHROMEOS)
-          // In ChromeOS, allow a settings page to be specified on the
-          // command line. See ExistingUserController::OnLoginSuccess.
+          // In ChromeOS, allow any settings page to be specified on the command
+          // line. See ExistingUserController::OnLoginSuccess.
           (url.spec().find(chrome::kChromeUISettingsURL) == 0) ||
+#else
+          ((url.spec().find(std::string(chrome::kChromeUISettingsURL) +
+                            chrome::kResetProfileSettingsSubPage) == 0)) ||
 #endif
           (url.spec().compare(url::kAboutBlankURL) == 0)) {
         urls.push_back(url);
diff --git a/chrome/browser/ui/views/tabs/tab.cc b/chrome/browser/ui/views/tabs/tab.cc
index 0ec6f31..ae9cf1b 100644
--- a/chrome/browser/ui/views/tabs/tab.cc
+++ b/chrome/browser/ui/views/tabs/tab.cc
@@ -174,6 +174,13 @@
       widget ? widget->GetNativeView() : NULL);
 }
 
+// Stop()s |animation| and then deletes it. We do this rather than just deleting
+// so that the delegate is notified before the destruction.
+void StopAndDeleteAnimation(scoped_ptr<gfx::Animation> animation) {
+  if (animation)
+    animation->Stop();
+}
+
 }  // namespace
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -470,10 +477,8 @@
   }
 
   if (old.mini != data_.mini) {
-    if (tab_animation_.get() && tab_animation_->is_animating()) {
-      tab_animation_->Stop();
-      tab_animation_.reset(NULL);
-    }
+    StopAndDeleteAnimation(
+        mini_title_change_animation_.PassAs<gfx::Animation>());
   }
 
   DataChanged(old);
@@ -496,27 +501,21 @@
 }
 
 void Tab::StartPulse() {
-  gfx::ThrobAnimation* animation = new gfx::ThrobAnimation(this);
-  animation->SetSlideDuration(kPulseDurationMs);
-  if (animation_container_.get())
-    animation->SetContainer(animation_container_.get());
-  animation->StartThrobbing(std::numeric_limits<int>::max());
-  tab_animation_.reset(animation);
+  pulse_animation_.reset(new gfx::ThrobAnimation(this));
+  pulse_animation_->SetSlideDuration(kPulseDurationMs);
+  if (animation_container_)
+    pulse_animation_->SetContainer(animation_container_.get());
+  pulse_animation_->StartThrobbing(std::numeric_limits<int>::max());
 }
 
 void Tab::StopPulse() {
-  if (!tab_animation_.get())
-    return;
-  tab_animation_->Stop();
-  tab_animation_.reset(NULL);
+  StopAndDeleteAnimation(pulse_animation_.PassAs<gfx::Animation>());
 }
 
 void Tab::StartMiniTabTitleAnimation() {
-  // We can only do this animation if the tab is mini because we will
-  // upcast tab_animation back to MultiAnimation when we draw.
   if (!data().mini)
     return;
-  if (!tab_animation_.get()) {
+  if (!mini_title_change_animation_) {
     gfx::MultiAnimation::Parts parts;
     parts.push_back(
         gfx::MultiAnimation::Part(kMiniTitleChangeAnimationDuration1MS,
@@ -533,20 +532,16 @@
     parts[2].end_time_ms = kMiniTitleChangeAnimationEnd3MS;
     base::TimeDelta timeout =
         base::TimeDelta::FromMilliseconds(kMiniTitleChangeAnimationIntervalMS);
-    gfx::MultiAnimation* animation = new gfx::MultiAnimation(parts, timeout);
-    if (animation_container_.get())
-      animation->SetContainer(animation_container_.get());
-    animation->set_delegate(this);
-    tab_animation_.reset(animation);
+    mini_title_change_animation_.reset(new gfx::MultiAnimation(parts, timeout));
+    if (animation_container_)
+      mini_title_change_animation_->SetContainer(animation_container_.get());
+    mini_title_change_animation_->set_delegate(this);
   }
-  tab_animation_->Start();
+  mini_title_change_animation_->Start();
 }
 
 void Tab::StopMiniTabTitleAnimation() {
-  if (!tab_animation_.get())
-    return;
-  tab_animation_->Stop();
-  tab_animation_.reset(NULL);
+  StopAndDeleteAnimation(mini_title_change_animation_.PassAs<gfx::Animation>());
 }
 
 // static
@@ -602,7 +597,7 @@
 void Tab::AnimationProgressed(const gfx::Animation* animation) {
   // Ignore if the pulse animation is being performed on active tab because
   // it repaints the same image. See |Tab::PaintTabBackground()|.
-  if (animation == tab_animation_.get() && IsActive())
+  if (animation == pulse_animation_.get() && IsActive())
     return;
   SchedulePaint();
 }
@@ -989,10 +984,8 @@
 void Tab::PaintImmersiveTab(gfx::Canvas* canvas) {
   // Use transparency for the draw-attention animation.
   int alpha = 255;
-  if (tab_animation_ &&
-      tab_animation_->is_animating() &&
-      !data().mini) {
-    alpha = tab_animation_->CurrentValueBetween(
+  if (pulse_animation_ && pulse_animation_->is_animating() && !data().mini) {
+    alpha = pulse_animation_->CurrentValueBetween(
         255, static_cast<int>(255 * kImmersiveTabMinThrobOpacity));
   }
 
@@ -1036,12 +1029,9 @@
   if (IsActive()) {
     PaintActiveTabBackground(canvas);
   } else {
-    if (tab_animation_.get() &&
-        tab_animation_->is_animating() &&
-        data().mini) {
-      gfx::MultiAnimation* animation =
-          static_cast<gfx::MultiAnimation*>(tab_animation_.get());
-      PaintInactiveTabBackgroundWithTitleChange(canvas, animation);
+    if (mini_title_change_animation_ &&
+        mini_title_change_animation_->is_animating()) {
+      PaintInactiveTabBackgroundWithTitleChange(canvas);
     } else {
       PaintInactiveTabBackground(canvas);
     }
@@ -1056,9 +1046,7 @@
   }
 }
 
-void Tab::PaintInactiveTabBackgroundWithTitleChange(
-    gfx::Canvas* canvas,
-    gfx::MultiAnimation* animation) {
+void Tab::PaintInactiveTabBackgroundWithTitleChange(gfx::Canvas* canvas) {
   // Render the inactive tab background. We'll use this for clipping.
   gfx::Canvas background_canvas(size(), canvas->image_scale(), false);
   PaintInactiveTabBackground(&background_canvas);
@@ -1072,12 +1060,12 @@
   int x1 = radius;
   int x2 = -radius;
   int x;
-  if (animation->current_part_index() == 0) {
-    x = animation->CurrentValueBetween(x0, x1);
-  } else if (animation->current_part_index() == 1) {
+  if (mini_title_change_animation_->current_part_index() == 0) {
+    x = mini_title_change_animation_->CurrentValueBetween(x0, x1);
+  } else if (mini_title_change_animation_->current_part_index() == 1) {
     x = x1;
   } else {
-    x = animation->CurrentValueBetween(x1, x2);
+    x = mini_title_change_animation_->CurrentValueBetween(x1, x2);
   }
   SkPoint center_point;
   center_point.iset(x, 0);
@@ -1100,8 +1088,8 @@
   canvas->DrawImageInt(background_image, 0, 0);
 
   // And then the gradient on top of that.
-  if (animation->current_part_index() == 2) {
-    uint8 alpha = animation->CurrentValueBetween(255, 0);
+  if (mini_title_change_animation_->current_part_index() == 2) {
+    uint8 alpha = mini_title_change_animation_->CurrentValueBetween(255, 0);
     canvas->DrawImageInt(hover_image, 0, 0, alpha);
   } else {
     canvas->DrawImageInt(hover_image, 0, 0);
@@ -1414,13 +1402,16 @@
 }
 
 double Tab::GetThrobValue() {
-  bool is_selected = IsSelected();
-  double min = is_selected ? kSelectedTabOpacity : 0;
-  double scale = is_selected ? kSelectedTabThrobScale : 1;
+  const bool is_selected = IsSelected();
+  const double min = is_selected ? kSelectedTabOpacity : 0;
+  const double scale = is_selected ? kSelectedTabThrobScale : 1;
 
-  if (!data().mini) {
-    if (tab_animation_.get() && tab_animation_->is_animating())
-      return tab_animation_->GetCurrentValue() * kHoverOpacity * scale + min;
+  // Showing both the pulse and title change animation at the same time is too
+  // much.
+  if (pulse_animation_ && pulse_animation_->is_animating() &&
+      (!mini_title_change_animation_ ||
+       !mini_title_change_animation_->is_animating())) {
+    return pulse_animation_->GetCurrentValue() * kHoverOpacity * scale + min;
   }
 
   if (hover_controller_.ShouldDraw()) {
diff --git a/chrome/browser/ui/views/tabs/tab.h b/chrome/browser/ui/views/tabs/tab.h
index 8d4f6e1..1275619 100644
--- a/chrome/browser/ui/views/tabs/tab.h
+++ b/chrome/browser/ui/views/tabs/tab.h
@@ -26,6 +26,7 @@
 class AnimationContainer;
 class LinearAnimation;
 class MultiAnimation;
+class ThrobAnimation;
 }
 namespace views {
 class ImageButton;
@@ -216,9 +217,7 @@
 
   // Paint various portions of the Tab
   void PaintTabBackground(gfx::Canvas* canvas);
-  void PaintInactiveTabBackgroundWithTitleChange(
-      gfx::Canvas* canvas,
-      gfx::MultiAnimation* animation);
+  void PaintInactiveTabBackgroundWithTitleChange(gfx::Canvas* canvas);
   void PaintInactiveTabBackground(gfx::Canvas* canvas);
   void PaintInactiveTabBackgroundUsingResourceId(gfx::Canvas* canvas,
                                                  int tab_id);
@@ -327,7 +326,9 @@
   bool should_display_crashed_favicon_;
 
   // Whole-tab throbbing "pulse" animation.
-  scoped_ptr<gfx::Animation> tab_animation_;
+  scoped_ptr<gfx::ThrobAnimation> pulse_animation_;
+
+  scoped_ptr<gfx::MultiAnimation> mini_title_change_animation_;
 
   // Crash icon animation (in place of favicon).
   scoped_ptr<gfx::LinearAnimation> crash_icon_animation_;
diff --git a/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
index 93925ae..a1eab10 100644
--- a/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc
@@ -71,13 +71,16 @@
       core_oobe_actor_(core_oobe_actor),
       show_on_init_(false),
       mouse_is_pairing_(false),
+      pointing_device_connect_type_(InputDeviceInfo::TYPE_UNKNOWN),
       keyboard_is_pairing_(false),
+      keyboard_device_connect_type_(InputDeviceInfo::TYPE_UNKNOWN),
       switch_on_adapter_when_ready_(false),
       first_time_screen_show_(true),
       weak_ptr_factory_(this) {
 }
 
 HIDDetectionScreenHandler::~HIDDetectionScreenHandler() {
+  adapter_initially_powered_.reset();
   if (adapter_.get())
     adapter_->RemoveObserver(this);
   input_service_proxy_.RemoveObserver(this);
@@ -96,6 +99,10 @@
   LOG(ERROR) << "Failed to power BT adapter";
 }
 
+void HIDDetectionScreenHandler::SetPoweredOffError() {
+  LOG(ERROR) << "Failed to power off BT adapter";
+}
+
 void HIDDetectionScreenHandler::FindDevicesError() {
   VLOG(1) << "Failed to start Bluetooth discovery.";
 }
@@ -177,6 +184,20 @@
         scenario_type,
         CONTINUE_SCENARIO_TYPE_SIZE);
   }
+  // Switch off BT adapter if it was off before the screen and no BT device
+  // connected.
+  if (adapter_ && adapter_->IsPresent() && adapter_->IsPowered() &&
+      !(pointing_device_connect_type_ == InputDeviceInfo::TYPE_BLUETOOTH ||
+        keyboard_device_connect_type_ == InputDeviceInfo::TYPE_BLUETOOTH) &&
+      adapter_initially_powered_ && !(*adapter_initially_powered_)) {
+    VLOG(1) << "Switching off BT adapter after HID OOBE screen as unused.";
+    adapter_->SetPowered(
+        false,
+        base::Bind(&base::DoNothing),
+        base::Bind(&HIDDetectionScreenHandler::SetPoweredOffError,
+                   weak_ptr_factory_.GetWeakPtr()));
+  }
+
   core_oobe_actor_->StopDemoModeDetection();
   if (delegate_)
     delegate_->OnExit();
@@ -267,6 +288,8 @@
 void HIDDetectionScreenHandler::AdapterPresentChanged(
     device::BluetoothAdapter* adapter, bool present) {
   if (present && switch_on_adapter_when_ready_) {
+    VLOG(1) << "Switching on BT adapter on HID OOBE screen.";
+    adapter_initially_powered_.reset(new bool(adapter_->IsPowered()));
     adapter_->SetPowered(
         true,
         base::Bind(&HIDDetectionScreenHandler::StartBTDiscoverySession,
@@ -415,6 +438,8 @@
       // Switch on BT adapter later when it's available.
       switch_on_adapter_when_ready_ = true;
     } else if (!adapter_->IsPowered()) {
+      VLOG(1) << "Switching on BT adapter on HID OOBE screen.";
+      adapter_initially_powered_.reset(new bool(false));
       adapter_->SetPowered(
           true,
           base::Bind(&HIDDetectionScreenHandler::StartBTDiscoverySession,
diff --git a/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h
index f990745..5aff3bb 100644
--- a/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/hid_detection_screen_handler.h
@@ -170,6 +170,10 @@
   // all necessary devices (mouse and keyboard) already connected.
   void GetDevicesFirstTime();
 
+  // Called by device::BluetoothAdapter in response to a failure to
+  // power off BT adapter.
+  void SetPoweredOffError();
+
   // Called for revision of active devices. If current-placement is available
   // for mouse or keyboard device, sets one of active devices as current or
   // tries to connect some BT device if no appropriate devices are connected.
@@ -214,6 +218,9 @@
 
   bool first_time_screen_show_;
 
+  // State of BT adapter before screen-initiated changes.
+  scoped_ptr<bool> adapter_initially_powered_;
+
   base::WeakPtrFactory<HIDDetectionScreenHandler> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(HIDDetectionScreenHandler);
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index 0e3721c..bdfcec7 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -966,6 +966,7 @@
         'browser/extensions/extension_garbage_collector_chromeos_unittest.cc',
         'browser/extensions/extension_gcm_app_handler_unittest.cc',
         'browser/extensions/extension_icon_manager_unittest.cc',
+        'browser/extensions/extension_install_prompt_unittest.cc',
         'browser/extensions/extension_message_bubble_controller_unittest.cc',
         'browser/extensions/extension_prefs_unittest.cc',
         'browser/extensions/extension_prefs_unittest.h',
diff --git a/chrome/installer/mac/app_resource_rules.plist.in b/chrome/installer/mac/app_resource_rules.plist.in
index d629044..6fc6246 100644
--- a/chrome/installer/mac/app_resource_rules.plist.in
+++ b/chrome/installer/mac/app_resource_rules.plist.in
@@ -51,5 +51,42 @@
 			<real>50</real>
 		</dict>
 	</dict>
+	<key>rules2</key>
+	<dict>
+		<key>^PkgInfo$</key>
+		<true/>
+		<key>^MacOS/</key>
+		<true/>
+		<key>^Resources/</key>
+		<true/>
+		<key>^Versions/</key>
+		<dict>
+			<key>omit</key>
+			<true/>
+			<key>weight</key>
+			<real>10</real>
+		</dict>
+		<key>^Versions/@VERSION_REGEX@/</key>
+		<dict>
+			<key>nested</key>
+			<true/>
+			<key>weight</key>
+			<real>20</real>
+		</dict>
+		<key>^Resources/.+\.lproj/</key>
+		<dict>
+			<key>optional</key>
+			<true/>
+			<key>weight</key>
+			<real>30</real>
+		</dict>
+		<key>/\.DS_Store$</key>
+		<dict>
+			<key>omit</key>
+			<true/>
+			<key>weight</key>
+			<real>50</real>
+		</dict>
+	</dict>
 </dict>
 </plist>
diff --git a/chrome/installer/mac/sign_app.sh.in b/chrome/installer/mac/sign_app.sh.in
index 4738ed7..326cb35 100644
--- a/chrome/installer/mac/sign_app.sh.in
+++ b/chrome/installer/mac/sign_app.sh.in
@@ -45,6 +45,17 @@
 helper_eh_app="${versioned_dir}/@MAC_PRODUCT_NAME@ Helper EH.app"
 helper_np_app="${versioned_dir}/@MAC_PRODUCT_NAME@ Helper NP.app"
 
+# libplugin_carbon_interpose.dylib was removed in r280670, but it's still
+# present on the 37.0.2062 branch (and earlier). Accounting for it here makes
+# it easier to merge the fix for http://crbug.com/399276 to other branches.
+#
+# TODO(mark): Remove this plugin_carbon_interpose code on the trunk as soon
+# as it lands.
+plugin_carbon_interpose="${versioned_dir}/libplugin_carbon_interpose.dylib"
+if [[ ! -e "${plugin_carbon_interpose}" ]]; then
+  plugin_carbon_interpose=
+fi
+
 requirement_string="\
 designated => \
 (identifier \"com.google.Chrome\" or identifier \"com.google.Chrome.canary\") \
@@ -62,3 +73,7 @@
 codesign -v "${helper_eh_app}"
 codesign -v "${helper_np_app}"
 codesign -v "${browser_app}"
+
+if [[ -n "${plugin_carbon_interpose}" ]]; then
+  codesign -v "${plugin_carbon_interpose}"
+fi
diff --git a/chrome/installer/mac/sign_versioned_dir.sh.in b/chrome/installer/mac/sign_versioned_dir.sh.in
index eb3ffb0..beddbe2 100644
--- a/chrome/installer/mac/sign_versioned_dir.sh.in
+++ b/chrome/installer/mac/sign_versioned_dir.sh.in
@@ -45,6 +45,17 @@
 helper_eh_app="${versioned_dir}/@MAC_PRODUCT_NAME@ Helper EH.app"
 helper_np_app="${versioned_dir}/@MAC_PRODUCT_NAME@ Helper NP.app"
 
+# libplugin_carbon_interpose.dylib was removed in r280670, but it's still
+# present on the 37.0.2062 branch (and earlier). Accounting for it here makes
+# it easier to merge the fix for http://crbug.com/399276 to other branches.
+#
+# TODO(mark): Remove this plugin_carbon_interpose code on the trunk as soon
+# as it lands.
+plugin_carbon_interpose="${versioned_dir}/libplugin_carbon_interpose.dylib"
+if [[ ! -e "${plugin_carbon_interpose}" ]]; then
+  plugin_carbon_interpose=
+fi
+
 requirement_suffix="\
 and certificate leaf = H\"85cee8254216185620ddc8851c7a9fc4dfe120ef\"\
 "
@@ -64,8 +75,21 @@
     -r="designated => identifier \"com.google.Chrome.helper.NP\" \
 ${requirement_suffix}"
 
+if [[ -n "${plugin_carbon_interpose}" ]]; then
+  plugin_carbon_interpose_identifier="com.google.Chrome.plugin_carbon_interpose"
+  codesign -s "${codesign_id}" --keychain "${codesign_keychain}" \
+      "${plugin_carbon_interpose}" \
+      -i "${plugin_carbon_interpose_identifier}" \
+      -r="designated => identifier \"${plugin_carbon_interpose_identifier}\" \
+${requirement_suffix}"
+fi
+
 # Verify everything.
 codesign -v "${framework}"
 codesign -v "${helper_app}"
 codesign -v "${helper_eh_app}"
 codesign -v "${helper_np_app}"
+
+if [[ -n "${plugin_carbon_interpose}" ]]; then
+  codesign -v "${plugin_carbon_interpose}"
+fi
diff --git a/chromeos/ime/input_method_manager.h b/chromeos/ime/input_method_manager.h
index c7b6477..5afe8f2 100644
--- a/chromeos/ime/input_method_manager.h
+++ b/chromeos/ime/input_method_manager.h
@@ -13,6 +13,8 @@
 #include "chromeos/chromeos_export.h"
 #include "chromeos/ime/input_method_descriptor.h"
 
+class Profile;
+
 namespace ui {
 class Accelerator;
 }  // namespace ui
@@ -139,11 +141,13 @@
   // Adds an input method extension. This function does not takes ownership of
   // |instance|.
   virtual void AddInputMethodExtension(
+      Profile* profile,
       const std::string& imm_id,
       InputMethodEngineInterface* instance) = 0;
 
   // Removes an input method extension.
-  virtual void RemoveInputMethodExtension(const std::string& id) = 0;
+  virtual void RemoveInputMethodExtension(Profile* profile,
+                                          const std::string& id) = 0;
 
   // Returns a list of descriptors for all Input Method Extensions.
   virtual void GetInputMethodExtensions(InputMethodDescriptors* result) = 0;
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb
index b6f4a72..a51b863 100644
--- a/components/policy/resources/policy_templates_cs.xtb
+++ b/components/policy/resources/policy_templates_cs.xtb
@@ -65,11 +65,11 @@
 
           Pokud zásadu nenastavíte, použije se pro všechny webové stránky globální výchozí hodnota buď ze zásady DefaultImagesSetting (pokud je nastavena), nebo z osobního nastavení uživatele.</translation>
 <translation id="4680961954980851756">Aktivovat Automatické vyplňování</translation>
-<translation id="5183383917553127163">Umožňuje určit rozšíření, kterých se netýká černá listina.
+<translation id="5183383917553127163">Umožňuje určit rozšíření, kterých se netýká seznam zakázaných rozšíření.
 
-          Pokud je na černé listině uvedena hodnota *, znamená to, že jsou na ní všechna rozšíření a uživatelé mohou instalovat pouze rozšíření uvedená na bílé listině.
+          Pokud je na seznamu zakázaných rozšíření uvedena hodnota *, znamená to, že jsou na ní všechna rozšíření a uživatelé mohou instalovat pouze rozšíření uvedená v seznamu povolených rozšíření.
 
-          Ve výchozím nastavení jsou všechna rozšíření na bílé listině. Pokud však byla všechna rozšíření pomocí zásady umístěna na černou listinu, lze tuto zásadu pomocí bílé listiny přepsat.</translation>
+          Ve výchozím nastavení jsou všechna rozšíření na seznamu povolených. Pokud však byla všechna rozšíření pomocí zásady umístěna na seznam zakázaných rozšíření, lze tuto zásadu pomocí seznamu povolených přepsat.</translation>
 <translation id="5921888683953999946">Nastavuje výchozí stav funkce usnadnění přístupu pomocí velkého kurzoru na přihlašovací obrazovce.
 
 Pokud je tato zásada nastavena na hodnotu true, bude při zobrazení přihlašovací obrazovky velký kurzor aktivní.
@@ -233,9 +233,9 @@
 <translation id="5966615072639944554">Rozšíření, která mohou používat rozhraní API vzdáleného ověření identity</translation>
 <translation id="1617235075406854669">Aktivovat smazání historie prohlížeče a stahování</translation>
 <translation id="5290940294294002042">Určete seznam pluginů, které uživatel může povolit nebo zakázat</translation>
-<translation id="3153348162326497318">Umožňuje určit rozšíření, která uživatelé NEMOHOU nainstalovat. Pokud se na černé listině vyskytne rozšíření, které již bylo nainstalováno, bude odebráno
+<translation id="3153348162326497318">Umožňuje určit rozšíření, která uživatelé NEMOHOU nainstalovat. Pokud se na seznamu zakázaných vyskytne rozšíření, které již bylo nainstalováno, bude odebráno.
 
-          Pokud je na černé listině uvedena hodnota *, znamená to, že jsou zakázána všechna rozšíření, která nejsou explicitně uvedena na bílé listině.
+          Pokud je na seznamu zakázaných rozšíření uvedena hodnota *, znamená to, že jsou zakázána všechna rozšíření, která nejsou explicitně uvedena na seznamu povolených rozšíření.
 
          Pokud zásadu nenastavíte, mohou uživatelé v aplikaci <ph name="PRODUCT_NAME"/> instalovat libovolná rozšíření.</translation>
 <translation id="3067188277482006117">Pokud má hodnotu true, uživatel může pomocí hardwaru, který je součástí zařízení Chrome, vzdáleně sdělit svou identitu funkci Privacy CA prostřednictvím rozhraní Enterprise Platform Keys API chrome.enterprise.platformKeysPrivate.challengeUserKey().
@@ -654,11 +654,11 @@
 
           Příklad: Zásada <ph name="EXTENSION_POLICY_EXAMPLE"/> nainstaluje rozšíření <ph name="EXTENSION_POLICY_EXAMPLE_EXTENSION_NAME"/> ze standardní adresy URL Internetového obchodu Chrome. Další informace o hostování rozšíření naleznete na adrese <ph name="LINK_TO_EXTENSION_DOC2"/>.
 
-          Rozšíření nainstalovaná pomocí této zásady nemohou uživatelé odinstalovat. Pokud rozšíření z tohoto seznamu odeberete, bude prohlížečem <ph name="PRODUCT_NAME"/> automaticky odinstalováno. Rozšíření uvedená v tomto seznamu jsou také automaticky přidána na bílou listinu a zásada ExtensionsInstallBlacklist je neovlivňuje.
+          Rozšíření nainstalovaná pomocí této zásady nemohou uživatelé odinstalovat. Pokud rozšíření z tohoto seznamu odeberete, bude prohlížečem <ph name="PRODUCT_NAME"/> automaticky odinstalováno. Rozšíření uvedená v tomto seznamu jsou také automaticky přidána na seznam povolených rozšíření a zásada ExtensionsInstallBlacklist je neovlivňuje.
 
           Není-li tato zásada nastavena na konkrétní hodnotu, uživatel může z prohlížeče <ph name="PRODUCT_NAME"/> odinstalovat libovolné rozšíření.</translation>
 <translation id="6899705656741990703">Zjistit nastavení proxy serveru automaticky</translation>
-<translation id="4639407427807680016">Názvy hostitelů zasílání nativních zpráv, kterým chcete udělit výjimku z černé listiny.</translation>
+<translation id="4639407427807680016">Názvy hostitelů zasílání nativních zpráv, kterým chcete udělit výjimku ze seznamu zakázaných položek.</translation>
 <translation id="8382184662529825177">Povolit použití vzdáleného ověření identity k ochraně obsahu v zařízení</translation>
 <translation id="7003334574344702284">Je-li tato zásada aktivovaná, vynucuje import uložených hesel z předchozího výchozího prohlížeče. Aktivace této zásady má také vliv na dialogové okno importu.
 
@@ -732,7 +732,7 @@
       Pokud toto nastavení aktivujete nebo deaktivujete, uživatelé je v aplikaci <ph name="PRODUCT_NAME"/> nebudou moci změnit ani přepsat.
 
       Pokud nastavení neupravíte, mohou si uživatelé vybrat, zda bude funkci používat, či nikoliv.</translation>
-<translation id="9035964157729712237">ID rozšíření, která mají být vyňata z černé listiny</translation>
+<translation id="9035964157729712237">ID rozšíření, která mají být vyňata ze seznamu zakázaných</translation>
 <translation id="8244525275280476362">Maximální zpoždění načítání po zneplatnění zásady</translation>
 <translation id="8587229956764455752">Povolit vytváření nových uživatelských účtů</translation>
 <translation id="7417972229667085380">Procento prodloužení prodlevy režimu nečinnosti v režimu prezentace (podpora ukončena)</translation>
@@ -749,11 +749,11 @@
       Pokud toto nastavení aktivujete nebo deaktivujete, uživatelé je nebudou moci změnit ani přepsat.
 
       Není-li zásada nastavena, mohou si uživatelé vybrat, zda chtějí být vyzváni k zadání hesla k odemčení zařízení, nebo nikoliv.</translation>
-<translation id="383466854578875212">Umožňuje určit, na které hostitele zasílání nativních zpráv se nebude vztahovat černá listina.
+<translation id="383466854578875212">Umožňuje určit, na které hostitele zasílání nativních zpráv se nebude vztahovat seznam zakázaných hostitelů.
 
-          Hodnota * v černé listině znamená, že jsou všichni hostitelé zasílání nativních zpráv zakázáni a že budou načteni pouze hostitelé uvedení na bílé listině.
+          Hodnota * v seznamu zakázaných znamená, že jsou všichni hostitelé zasílání nativních zpráv zakázáni a že budou načteni pouze hostitelé uvedení na seznamu povolených hostitelů.
 
-          Ve výchozím nastavení jsou povoleni všichni hostitelé zasílání nativních zpráv. Pokud však byly všichni hostitelé zasílání nativních zpráv pomocí zásady přidáni na černou listinu, je možné tuto zásadu pomocí bílé listiny přepsat.</translation>
+          Ve výchozím nastavení jsou povoleni všichni hostitelé zasílání nativních zpráv. Pokud však byly všichni hostitelé zasílání nativních zpráv pomocí zásady přidáni na seznam zakázaných, je možné tuto zásadu pomocí seznamu povolených hostitelů přepsat.</translation>
 <translation id="6022948604095165524">Akce při spuštění</translation>
 <translation id="9042911395677044526">Umožňuje přenést nastavení sítě, která se uplatní pro jednotlivé uživatele v zařízení se systémem <ph name="PRODUCT_OS_NAME"/>. Konfigurace sítě je řetězec ve formátu JSON, který se řídí definicí formátu Open Network Configuration popsanou na stránce <ph name="ONC_SPEC_URL"/>.</translation>
 <translation id="7128918109610518786">Seznam identifikátorů aplikací, které se v <ph name="PRODUCT_OS_NAME"/> zobrazují jako připnuté na liště spouštěče.
@@ -820,11 +820,11 @@
 <translation id="7912255076272890813">Konfigurovat povolené typy aplikací nebo rozšíření</translation>
 <translation id="817455428376641507">Povoluje přístup k adresám URL uvedeným v seznamu, které tedy představují výjimky ze seznamu zakázaných adres URL.
 
-      Formát položek v tomto seznamu naleznete v popisu zásady pro vytvoření černé listiny adres URL.
+      Formát položek v tomto seznamu naleznete v popisu zásady pro vytvoření seznamu zakázaných adres URL.
 
-      Pomocí této zásady můžete určit výjimky z omezující černé listiny. Příklad: Přidáním pravidla „*“ na černou listinu zablokujete všechny požadavky. Pomocí této zásady poté můžete povolit přístup omezenému seznamu adres URL. Můžete definovat výjimky v podobě schémat, subdomén, portů nebo konkrétních cest.
+      Pomocí této zásady můžete určit výjimky ze seznamu zakázaných adres. Příklad: Přidáním pravidla „*“ na seznam zakázaných zablokujete všechny požadavky. Pomocí této zásady poté můžete povolit přístup omezenému seznamu adres URL. Můžete definovat výjimky v podobě schémat, subdomén, portů nebo konkrétních cest.
 
-      Zda je adresa URL blokována nebo povolena, určuje vždy nejkonkrétnější filtr, přičemž bílá listina má přednost před černou listinou.
+      Zda je adresa URL blokována nebo povolena, určuje vždy nejkonkrétnější filtr, přičemž seznam povolených má přednost před seznamem zakázaných adres.
 
       Počet záznamů v této zásadě je omezen na 1000. Všechny další záznamy budou ignorovány.
 
@@ -838,7 +838,7 @@
 Pokud tuto zásadu nastavíte, uživatelé ji nebudou moci změnit ani přepsat.
 
 Pokud ji ponecháte nenastavenou, režim vysokého kontrastu bude ve výchozím nastavení deaktivován, ale uživatelé jej budou moci kdykoli aktivovat.</translation>
-<translation id="2201555246697292490">Konfigurace bílé listiny zasílání nativních zpráv</translation>
+<translation id="2201555246697292490">Konfigurace seznamu povolených hostitelů zasílání nativních zpráv</translation>
 <translation id="6177482277304066047">Nastavuje cílovou verzi automatické aktualizace.
 
       Určuje předponu cílové verze, na kterou se má <ph name="PRODUCT_OS_NAME"/> aktualizovat. Pokud zařízení obsahuje starší verzi, než jakou určuje předpona, bude systém aktualizován na poslední verzi s danou předponou. Jestliže zařízení již obsahuje novější verzi, nestane se nic (tj. nedojde k přechodu na nižší verzi) a zařízení zůstane u stávající verze. Formát předpony funguje na základě komponent, jak ukazuje následující příklad:
@@ -872,7 +872,7 @@
       Seznam rozšíření, která se automaticky nainstalují pro uživatele ukázky v zařízeních v režimu prodeje. Tato rozšíření se uloží v zařízení a po instalaci mohou být nainstalována v režimu offline.
 
       Každý záznam v seznamu obsahuje adresář, který musí zahrnovat ID rozšíření v poli „extension-id“ a jeho webovou adresu pro aktualizace v poli „update-url“.</translation>
-<translation id="9096086085182305205">Bílá listina serverů pro ověřování</translation>
+<translation id="9096086085182305205">Seznam povolených serverů pro ověřování</translation>
 <translation id="4980301635509504364">Povoluje nebo zakazuje záznam videa.
 
 Pokud je tato zásada aktivní nebo není nakonfigurována (výchozí nastavení), uživatel bude vyzván k udělení přístupu pro záznam videa (s výjimkou adres URL nakonfigurovaných v seznamu VideoCaptureAllowedUrls, kterým bude přístup udělen bez vyzvání).
@@ -958,7 +958,7 @@
 <translation id="5586942249556966598">Nedělat nic</translation>
 <translation id="131353325527891113">Zobrazit uživatelská jména na přihlašovací obrazovce</translation>
 <translation id="5365946944967967336">Zobrazit na liště tlačítko Domů</translation>
-<translation id="3709266154059827597">Konfigurace černé listiny instalace rozšíření</translation>
+<translation id="3709266154059827597">Konfigurace seznamu zakázaných položek instalace rozšíření</translation>
 <translation id="1933378685401357864">Obrázek tapety</translation>
 <translation id="8451988835943702790">Jako domovskou použít stránku Nová karta</translation>
 <translation id="4617338332148204752">Přeskočení kontroly metaznaček ve službě <ph name="PRODUCT_FRAME_NAME"/></translation>
@@ -1169,7 +1169,7 @@
 
       Pokud tuto zásadu nenastavíte, bude použita výchozí velikost a uživatel ji bude moci přepsat pomocí příznaku  „--disk-cache-size“.</translation>
 <translation id="5475361623548884387">Povolit tisk</translation>
-<translation id="7287359148642300270">Určuje, které servery mají být umístěny na bílou listinu pro integrované ověření. Integrované ověření je povoleno pouze v případě, že <ph name="PRODUCT_NAME"/> obdrží výzvu ověřování ze proxy serveru nebo jiného serveru, které jsou uvedeny v tomto seznamu povolených serverů. 
+<translation id="7287359148642300270">Určuje, které servery mají být umístěny na seznam povolených pro integrované ověření. Integrované ověření je povoleno pouze v případě, že <ph name="PRODUCT_NAME"/> obdrží výzvu ověřování ze proxy serveru nebo jiného serveru, které jsou uvedeny v tomto seznamu povolených serverů. 
           
           Chcete-li zadat několik názvů serverů, oddělte je čárkami. Zástupné znaky (*) jsou povoleny.
 
@@ -1254,7 +1254,7 @@
 
           Tato zásada je určena k internímu použití prohlížečem Chrome.</translation>
 <translation id="913195841488580904">Blokování přístupu k seznamu adres URL</translation>
-<translation id="5461308170340925511">Nakonfiguruje zásady související s rozšířeními. Uživatel nebude moci instalovat rozšíření na černé listině, pokud nebudou autorizována. U aplikace <ph name="PRODUCT_NAME"/> také můžete vynutit automatickou instalaci rozšíření jejich zadáním do zásady <ph name="EXTENSIONINSTALLFORCELIST_POLICY_NAME"/>. Rozšíření, jejichž instalace je vynucena, budou nainstalována bez ohledu na to, zda jsou uvedena na černé listině.</translation>
+<translation id="5461308170340925511">Nakonfiguruje zásady související s rozšířeními. Uživatel nebude moci instalovat rozšíření na seznamu zakázaných rozšíření, pokud nebudou autorizována. U aplikace <ph name="PRODUCT_NAME"/> také můžete vynutit automatickou instalaci rozšíření jejich zadáním do zásady <ph name="EXTENSIONINSTALLFORCELIST_POLICY_NAME"/>. Rozšíření, jejichž instalace je vynucena, budou nainstalována bez ohledu na to, zda jsou uvedena na seznamu zakázaných.</translation>
 <translation id="3292147213643666827">Umožňuje prohlížeči <ph name="PRODUCT_NAME"/> fungovat jako proxy server mezi službou <ph name="CLOUD_PRINT_NAME"/> a staršími tiskárnami připojenými k počítači.
 
       Pokud je toto nastavení aktivované nebo není nakonfigurované, mohou uživatelé proxy server pro tisk z cloudu aktivovat ověřením pomocí účtu Google.
@@ -1274,7 +1274,7 @@
 
       Táto zásada má umožnit striktní zakázání pluginů tam, kde seznam DisabledPlugins obsahuje zástupné znaky, jako například deaktivovat všechny pluginy „*“ nebo deaktivovat všechny pluginy Java „'*Java*“, avšak správce chce určité verze povolit (například „IcedTea Java 2.3“). Tuto konkrétní verzi lze určit v této zásadě.
 
-      Upozorňujeme, že je třeba zadat výjimku pro název pluginu i pro název skupiny pluginů. Jednotlivé skupiny pluginů se na stránce about:plugins zobrazují v samostatných sekcích a každá sekce může obsahovat jeden nebo více pluginů. Plugin Shockwave Flash například patří do skupiny Adobe Flash Player. Pokud má být vyloučen z černé listiny, musí být v seznamu výjimek uvedeny oba názvy.
+      Upozorňujeme, že je třeba zadat výjimku pro název pluginu i pro název skupiny pluginů. Jednotlivé skupiny pluginů se na stránce about:plugins zobrazují v samostatných sekcích a každá sekce může obsahovat jeden nebo více pluginů. Plugin Shockwave Flash například patří do skupiny Adobe Flash Player. Pokud má být vyloučen ze seznamu zakázaných, musí být v seznamu výjimek uvedeny oba názvy.
 
       Pokud tato zásada není nastavena, bude jakýkoliv plugin, který odpovídá vzoru v seznamu DisabledPlugins, uzamčen jako deaktivovaný a uživatelé jej nebudou moci aktivovat.</translation>
 <translation id="8951350807133946005">Nastavit adresář mezipaměti na disku</translation>
@@ -1382,7 +1382,7 @@
 
       Pokud je tato zásada ponechána nenastavená, uživatel si může zvolit, jaký obrázek bude mít zobrazený na ploše a na pozadí přihlašovací obrazovky.</translation>
 <translation id="2761483219396643566">Prodleva upozornění na nečinnost při napájení z baterie</translation>
-<translation id="6281043242780654992">Konfiguruje zásady pro zasílání nativních zpráv. Hostitelé zasílání nativních zpráv uvedení na černé listině nebudou povoleni (pokud nebudou uvedeni na bílé listině).</translation>
+<translation id="6281043242780654992">Konfiguruje zásady pro zasílání nativních zpráv. Hostitelé zasílání nativních zpráv uvedení na seznamu zakázaných nebudou povoleni (pokud nebudou uvedeni na seznamu povolených hostitelů).</translation>
 <translation id="1468307069016535757">Nastavuje výchozí stav funkce usnadnění přístupu pomocí režimu vysokého kontrastu na přihlašovací obrazovce.
 
 Pokud je tato zásada nastavena na hodnotu true, bude při zobrazení obrazovky přihlášení režim vysokého kontrastu aktivní.
@@ -1494,7 +1494,7 @@
           Pokud zásadu nenastavíte, použije se pro všechny webové stránky globální výchozí hodnota buď ze zásady DefaultNotificationsSetting (pokud je nastavena), nebo z osobního nastavení uživatele.</translation>
 <translation id="527237119693897329">Umožňuje zadat, kteří hostitelé zasílání nativních zpráv se nemají načítat.
 
-          Hodnota * v černé listině znamená, že jsou zakázáni všichni hostitelé zasílání nativních zpráv, kteří nejsou uvedeni na bílé listině.
+          Hodnota * v seznamu zakázaných hostitelů znamená, že jsou zakázáni všichni hostitelé zasílání nativních zpráv, kteří nejsou uvedeni na seznamu povolených.
 
           Pokud je tato zásada ponechána nenastavená, <ph name="PRODUCT_NAME"/> bude načítat všechny nainstalované hostitele zasílání nativních zpráv.</translation>
 <translation id="749556411189861380">Hlásí verzi operačního systému a firmwaru v registrovaných zařízeních.
@@ -1560,7 +1560,7 @@
 
       Pokud tuto zásadu nenastavíte, bude použita výchozí velikost a uživatel ji bude moci přepsat pomocí příznaku  „--media-cache-size“.</translation>
 <translation id="5142301680741828703">Následující vzory adres URL vykreslovat vždy v pluginu <ph name="PRODUCT_FRAME_NAME"/></translation>
-<translation id="4625915093043961294">Konfigurovat bílou listinu pro instalaci rozšíření</translation>
+<translation id="4625915093043961294">Konfigurovat seznam povolených pro instalaci rozšíření</translation>
 <translation id="5893553533827140852">Pokud je toto nastavení povoleno, žádosti gnubby o ověření budou zprostředkovány přes připojení ke vzdálenému hostiteli.
 
           Pokud je toto nastavení zakázáno nebo není nakonfigurováno, žádosti gnubby o ověření nebudou zprostředkovány.</translation>
@@ -1632,7 +1632,7 @@
           Zásada bude dodržována pouze v případě, že je aktivní zásada DefaultSearchProviderEnabled.</translation>
 <translation id="7194407337890404814">Název výchozího poskytovatele vyhledávání</translation>
 <translation id="1843117931376765605">Obnovovací frekvence zásad pro uživatele</translation>
-<translation id="5535973522252703021">Bílá listina serverů pro delegování ověření protokolu Kerberos</translation>
+<translation id="5535973522252703021">Seznam povolených serverů pro delegování ověření protokolu Kerberos</translation>
 <translation id="9187743794267626640">Zakázat připojení externího úložiště</translation>
 <translation id="6353901068939575220">Udává parametry, které budou použity při vyhledávání adresy URL pomocí metody POST. Sestává z párů název–hodnota oddělených čárkou. Pokud je hodnotou parametr šablony (např. {searchTerms} v příkladu výše), bude nahrazen skutečnými údaji vyhledávacích dotazů.
 
@@ -1812,7 +1812,7 @@
        Deaktivací tohoto nastavení umožníte, aby prvky webové stránky, které nepocházejí z domény uvedené v adresním řádku prohlížeče, mohly nastavovat soubory cookie.
 
      Pokud zásadu nenastavíte, budou soubory cookie třetích stran povoleny, uživatelé však budou moci toto nastavení změnit.</translation>
-<translation id="4604931264910482931">Konfigurace černé listiny zasílání nativních zpráv</translation>
+<translation id="4604931264910482931">Konfigurace seznamu zakázaných položek zasílání nativních zpráv</translation>
 <translation id="6810445994095397827">Blokovat JavaScript na těchto stránkách</translation>
 <translation id="6672934768721876104">Tato zásada se již nepoužívá. Namísto ní prosím použijte zásadu ProxyMode.
 
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb
index 843bb0b..09d1a3d 100644
--- a/components/policy/resources/policy_templates_da.xtb
+++ b/components/policy/resources/policy_templates_da.xtb
@@ -256,11 +256,11 @@
 
       Hvis denne politik ikke indstilles, vil den blive aktiveret, men brugeren vil være i stand til at ændre den.</translation>
 <translation id="268577405881275241">Aktivér proxyfunktionen for datakomprimering</translation>
-<translation id="3820526221169548563">Aktivér tilgængelighedsfunktionen Skærmtastatur.
+<translation id="3820526221169548563">Aktivér hjælpefunktionen Skærmtastatur.
 
-          Hvis denne politik er angivet til Sand, vil tilgængelighedsfunktionen Skærmtastatur altid være slået til.
+          Hvis denne politik er angivet som Sand, vil hjælpefunktionen Skærmtastatur altid være slået til.
 
-          Hvis denne politik er angivet til Falsk, vil tilgængelighedsfunktionen Skærmtastatur altid være slået fra.
+          Hvis denne politik er angivet som Falsk, vil hjælpefunktionen Skærmtastatur altid være slået fra.
 
           Hvis du indstiller denne politik, kan brugerne ikke ændre eller tilsidesætte den.
 
@@ -1141,11 +1141,11 @@
 <translation id="2805707493867224476">Tillad, at alle websites viser pop op-vinduer</translation>
 <translation id="1727394138581151779">Bloker alle plugins</translation>
 <translation id="8118665053362250806">Angiv størrelse på mediediskcache</translation>
-<translation id="6565312346072273043">Angiv standardtilstanden for tilgængelighedsfunktionen Skærmtastatur på loginskærmen.
+<translation id="6565312346072273043">Angiv standardtilstanden for hjælpefunktionen Skærmtastatur på loginskærmen.
 
-          Hvis denne politik er angivet til Sand, aktiveres skærmtastaturet, når loginskærmen vises.
+          Hvis denne politik er angivet som Sand, aktiveres skærmtastaturet, når loginskærmen vises.
 
-          Hvis denne politik er angivet til Falsk, deaktiveres skærmtastaturet, når loginskærmen vises.
+          Hvis denne politik er angivet som Falsk, deaktiveres skærmtastaturet, når loginskærmen vises.
 
           Hvis du har indstillet denne politik, kan brugerne midlertidigt tilsidesætte den ved at aktivere eller deaktivere skærmtastaturet. Brugerens valg er dog ikke permanent, og standardindstillingen gendannes, når loginskærmen vises på ny, eller når brugeren har været inaktiv på loginskærmen i et minut.
 
@@ -1397,11 +1397,11 @@
 <translation id="3891357445869647828">Aktiver JavaScript</translation>
 <translation id="2274864612594831715">Denne politik konfigurerer aktiveringen af det virtuelle tastatur som inputenhed i ChromeOS. Brugere kan ikke tilsidesætte denne politik.
 
-      Hvis politikken er indstillet til sand, vil det virtuelle tastatur på skærmen altid være aktiveret.
+      Hvis politikken er angivet som Sand, vil det virtuelle tastatur på skærmen altid være aktiveret.
 
-      Hvis den er sat til falsk, vil det virtuelle tastatur på skærmen altid være deaktiveret.
+      Hvis den er angivet som Falsk, vil det virtuelle tastatur på skærmen altid være deaktiveret.
 
-      Hvis du har indstillet denne politik, kan brugere ikke ændre eller tilsidesætte den. Brugere kan dog stadig aktivere/deaktivere et tilgængelighedstastatur på skærmen, som har forrang over det virtuelle tastatur, der kontrolleres af denne politik. Se mere om kontrol af tilgængelighedstastaturet på skærmen i politikken |VirtualKeyboardEnabled|.
+      Hvis du har indstillet denne politik, kan brugere ikke ændre eller tilsidesætte den. Brugere kan dog stadig aktivere/deaktivere et skærmtastatur som hjælpefunktion, som har forrang over det virtuelle tastatur, der kontrolleres af denne politik. Se mere om kontrol af skærmtastaturet som hjælpefunktion i politikken |VirtualKeyboardEnabled|.
 
       Hvis denne politik ikke indstilles, er tastaturet på skærmen slået fra til at starte med, men kan til enhver tid aktiveres af brugeren. Der kan også benyttes heuristiske regler til at bestemme, hvornår tastaturet skal vises.</translation>
 <translation id="6774533686631353488">Tillad indbyggede beskedhosts, der er installeret på brugerniveau (installeret uden administratortilladelser).</translation>
@@ -1629,15 +1629,15 @@
       Når denne politik er angivet, åbnes de administrerede bogmærker som standard, når visningen Bogmærker åbnes i Chrome.
 
       Administrerede bogmærker synkroniseres ikke med brugerkontoen.</translation>
-<translation id="6757375960964186754">Vis tilgængelighedsindstillingerne for <ph name="PRODUCT_OS_NAME"/> i systemmenuen.
+<translation id="6757375960964186754">Vis hjælpeindstillingerne for <ph name="PRODUCT_OS_NAME"/> i systemmenuen.
 
-          Hvis denne politik er angivet til Sand, vises tilgængelighedsindstillingerne altid i proceslinjemenuen.
+          Hvis denne politik er angivet som Sand, vises hjælpeindstillingerne altid i proceslinjemenuen.
 
-          Hvis denne politik er angivet til Falsk, vises tilgængelighedsindstillingerne aldrig i proceslinjemenuen.
+          Hvis denne politik er angivet som Falsk, vises hjælpeindstillingerne aldrig i proceslinjemenuen.
 
           Hvis du har indstillet denne politik, kan brugerne ikke ændre eller tilsidesætte den.
 
-          Hvis denne politik ikke er indstillet, vises tilgængelighedsindstillingerne ikke i proceslinjemenuen, men brugeren kan forårsage, at tilgængelighedsindstillingerne vises via siden Indstillinger.</translation>
+          Hvis denne politik ikke er indstillet, vises hjælpeindstillingerne ikke i proceslinjemenuen, men brugeren kan forårsage, at hjælpeindstillingerne vises via siden Indstillinger.</translation>
 <translation id="8303314579975657113">Angiver, hvilket GSSAPI-samling der skal bruges til HTTP-godkendelse. Du kan enten angive et samlingsnavn eller en hel sti. Hvis der ikke angives en indstilling, går <ph name="PRODUCT_NAME"/> tilbage til at bruge et standardsamlingsnavn.</translation>
 <translation id="8549772397068118889">Vis en advarsel, når du er på websites uden for indholdspakkerne</translation>
 <translation id="7749402620209366169">Aktiverer godkendelse med to faktorer for værter med fjernadgang i stedet for en brugerangivet pinkode.
@@ -1712,9 +1712,9 @@
           Hvis denne politik ikke indstilles, kan brugeren selv vælge sin startside, hvis HomepageIsNewTabPage heller ikke er indstillet.</translation>
 <translation id="3806576699227917885">Tillad lydafspilning.
 
-      Hvis denne politik er angivet til Falsk, vil lydoutput ikke være tilgængeligt på enheden, mens brugeren er logget ind.
+      Hvis denne politik er angivet som Falsk, vil lydoutput ikke være tilgængeligt på enheden, mens brugeren er logget ind.
 
-      Denne politik påvirker alle former for lydoutput, og ikke kun de indbyggede højttalere. Tilgængelighedsfunktioner for lyd forhindres også af denne politik. Hvis brugeren har behov for en skærmlæser, skal du ikke aktivere denne politik.
+      Denne politik påvirker alle former for lydoutput, og ikke kun de indbyggede højttalere. Hjælpefunktioner for lyd forhindres også af denne politik. Hvis brugeren har behov for en skærmlæser, skal du ikke aktivere denne politik.
 
       Hvis denne indstilling er angivet til Sand eller ikke er konfigureret, kan brugerne bruge alle understøttede former for lydoutput på deres enhed.</translation>
 <translation id="6517678361166251908">Tillad gnubby-godkendelse</translation>
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index ade005b..19dc4a3 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -810,7 +810,7 @@
 <translation id="1240643596769627465">Gibt die URL der Suchmaschine an, die zur Ausgabe von Instant-Ergebnissen verwendet wird. Die URL sollte den String <ph name="SEARCH_TERM_MARKER"/> enthalten. Dieser wird bei der Suchanfrage mit dem Text ersetzt, den der Nutzer bis dahin eingegeben hat. Diese Richtlinie ist optional. Wenn keine Festlegung erfolgt, so werden keine Instant-Ergebnisse ausgegeben. Diese Richtlinie wird nur dann umgesetzt, wenn die Richtlinie &quot;DefaultSearchProviderEnabled&quot; aktiviert ist.</translation>
 <translation id="6693751878507293182">Wenn Sie diese Einstellung aktivieren, wird die automatische Suche und Installation fehlender Plug-ins in <ph name="PRODUCT_NAME"/> deaktiviert. Ist sie deaktiviert oder nicht konfiguriert, so ist die Plug-in-Suche aktiv.</translation>
 <translation id="2650049181907741121">Auszuführende Aktion beim Zuklappen des Geräts</translation>
-<translation id="7880891067740158163">Ermöglicht Ihnen die Zusammenstellung einer Liste mit URL-Mustern, die Websites angeben, für die <ph name="PRODUCT_NAME"/> automatisch ein Client-Zertifikat auswählen soll, wenn die Website ein Zertifikat anfordert. Wenn diese Richtlinie nicht konfiguriert ist, erfolgt keine automatische Auswahl für Websites.</translation>
+<translation id="7880891067740158163">Ermöglicht Ihnen die Zusammenstellung einer Liste mit URL-Mustern, die Websites angeben, für die <ph name="PRODUCT_NAME"/> automatisch ein Clientzertifikat auswählen soll, wenn die Website ein Zertifikat anfordert. Wenn diese Richtlinie nicht konfiguriert ist, erfolgt keine automatische Auswahl für Websites.</translation>
 <translation id="3866249974567520381">Beschreibung</translation>
 <translation id="5192837635164433517">Aktiviert die Verwendung alternativer Fehlerseiten, die in <ph name="PRODUCT_NAME"/> integriert sind, etwa &quot;Seite nicht gefunden&quot;, und verhindert, dass die Einstellung durch Nutzer geändert wird. Wenn Sie diese Einstellung aktivieren, kommen alternative Fehlerseiten zum Einsatz. Sollten Sie sie deaktivieren, werden alternative Fehlerseiten grundsätzlich nicht verwendet. Ist diese Einstellung aktiviert oder deaktiviert, können Nutzer sie in <ph name="PRODUCT_NAME"/> nicht ändern oder außer Kraft setzen. Wird die Richtlinie nicht konfiguriert, so ist die Funktion aktiv, aber der Nutzer kann dies ändern.</translation>
 <translation id="2236488539271255289">Speichern von lokalen Daten für keine Website zulassen</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 8291a71..b703054 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -687,7 +687,7 @@
           Nilai kebijakan harus ditentukan dalam milidetik. Nilai dibatasi agar kurang dari atau sama dengan penundaan menganggur.</translation>
 <translation id="1327466551276625742">Aktifkan permintaan konfigurasi jaringan saat offline</translation>
 <translation id="7937766917976512374">Izinkan atau tolak penangkapan video</translation>
-<translation id="427632463972968153">Menentukan parameter yang digunakan saat melakukan penelusuran gambar dengan POST. Berisi pasangan nama/nilai yang dipisahkan koma. Jika nilai adalah parameter template, seperti {imageThumbnail} contoh di atas, akan diganti dengan data thumbnail gambar nyata.
+<translation id="427632463972968153">Menentukan parameter yang digunakan saat melakukan penelusuran gambar dengan POST. Berisi pasangan nama/nilai yang dipisahkan koma. Jika nilai adalah parameter template, seperti {imageGambar kecil} contoh di atas, akan diganti dengan data thumbnail gambar nyata.
 
           Kebijakan ini bersifat opsional. Jika tidak disetel, permintaan penelusuran akan dikirim menggunakan metode GET.
 
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 8dd5900..d9a5238 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -738,7 +738,7 @@
 
     列出系统自动为演示用户安装的扩展程序(它们将安装在零售模式下的设备上)。安装后,这些扩展程序保存在该设备中,并且可以在离线状态下安装。
 
-      每个列表条目都包含一个词典,其“extension-id”字段必须包含扩展程序 ID,而其“update-url”字段必须包含更新网址。</translation>
+      每个列表条目都包含一个字典,其“extension-id”字段必须包含扩展程序 ID,而其“update-url”字段必须包含更新网址。</translation>
 <translation id="9096086085182305205">身份验证服务器白名单</translation>
 <translation id="4980301635509504364">允许或拒绝视频捕获。
 
diff --git a/components/url_fixer/url_fixer_unittest.cc b/components/url_fixer/url_fixer_unittest.cc
index fa4e03c..68ca0c2 100644
--- a/components/url_fixer/url_fixer_unittest.cc
+++ b/components/url_fixer/url_fixer_unittest.cc
@@ -321,24 +321,41 @@
 
   // Check the TLD-appending functionality.
   FixupCase tld_cases[] = {
-    {"google", "http://www.google.com/"},
-    {"google.", "http://www.google.com/"},
-    {"google..", "http://www.google.com/"},
-    {".google", "http://www.google.com/"},
-    {"www.google", "http://www.google.com/"},
-    {"google.com", "http://google.com/"},
-    {"http://google", "http://www.google.com/"},
-    {"..google..", "http://www.google.com/"},
-    {"http://www.google", "http://www.google.com/"},
-    {"9999999999999999", "http://www.9999999999999999.com/"},
-    {"google/foo", "http://www.google.com/foo"},
-    {"google.com/foo", "http://google.com/foo"},
-    {"google/?foo=.com", "http://www.google.com/?foo=.com"},
-    {"www.google/?foo=www.", "http://www.google.com/?foo=www."},
-    {"google.com/?foo=.com", "http://google.com/?foo=.com"},
-    {"http://www.google.com", "http://www.google.com/"},
-    {"google:123", "http://www.google.com:123/"},
-    {"http://google:123", "http://www.google.com:123/"},
+      {"somedomainthatwillnotbeagtld",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {"somedomainthatwillnotbeagtld.",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {"somedomainthatwillnotbeagtld..",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {".somedomainthatwillnotbeagtld",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {"www.somedomainthatwillnotbeagtld",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {"somedomainthatwillnotbeagtld.com",
+       "http://somedomainthatwillnotbeagtld.com/"},
+      {"http://somedomainthatwillnotbeagtld",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {"..somedomainthatwillnotbeagtld..",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {"http://www.somedomainthatwillnotbeagtld",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {"9999999999999999", "http://www.9999999999999999.com/"},
+      {"somedomainthatwillnotbeagtld/foo",
+       "http://www.somedomainthatwillnotbeagtld.com/foo"},
+      {"somedomainthatwillnotbeagtld.com/foo",
+       "http://somedomainthatwillnotbeagtld.com/foo"},
+      {"somedomainthatwillnotbeagtld/?foo=.com",
+       "http://www.somedomainthatwillnotbeagtld.com/?foo=.com"},
+      {"www.somedomainthatwillnotbeagtld/?foo=www.",
+       "http://www.somedomainthatwillnotbeagtld.com/?foo=www."},
+      {"somedomainthatwillnotbeagtld.com/?foo=.com",
+       "http://somedomainthatwillnotbeagtld.com/?foo=.com"},
+      {"http://www.somedomainthatwillnotbeagtld.com",
+       "http://www.somedomainthatwillnotbeagtld.com/"},
+      {"somedomainthatwillnotbeagtld:123",
+       "http://www.somedomainthatwillnotbeagtld.com:123/"},
+      {"http://somedomainthatwillnotbeagtld:123",
+       "http://www.somedomainthatwillnotbeagtld.com:123/"},
   };
   for (size_t i = 0; i < arraysize(tld_cases); ++i) {
     FixupCase value = tld_cases[i];
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index d373f7b..85169bd 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -93,8 +93,27 @@
     filters->push_back(Filter(base::ASCIIToUTF16("*=''"), Filter::DENY));
   }
 
-  void ParseFilters(const std::string& test_html,
-                    std::vector<Filter>* filters) {
+  // Parse the test html file and parse special directives, usually
+  // beginning with an '@' and inside an HTML comment, that control how the
+  // test is run and how the results are interpreted.
+  //
+  // When the accessibility tree is dumped as text, each attribute is
+  // run through filters before being appended to the string. An "allow"
+  // filter specifies attribute strings that should be dumped, and a "deny"
+  // filter specifies strings that should be suppressed. As an example,
+  // @MAC-ALLOW:AXSubrole=* means that the AXSubrole attribute should be
+  // printed, while @MAC-ALLOW:AXSubrole=AXList* means that any subrole
+  // beginning with the text "AXList" should be printed.
+  //
+  // The @WAIT-FOR:text directive allows the test to specify that the document
+  // may dynamically change after initial load, and the test is to wait
+  // until the given string (e.g., "text") appears in the resulting dump.
+  // A test can make some changes to the document, then append a magic string
+  // indicating that the test is done, and this framework will wait for that
+  // string to appear before comparing the results.
+  void ParseHtmlForExtraDirectives(const std::string& test_html,
+                                   std::vector<Filter>* filters,
+                                   std::string* wait_for) {
     std::vector<std::string> lines;
     base::SplitString(test_html, '\n', &lines);
     for (std::vector<std::string>::const_iterator iter = lines.begin();
@@ -107,6 +126,7 @@
           AccessibilityTreeFormatter::GetAllowString();
       const std::string& deny_str =
           AccessibilityTreeFormatter::GetDenyString();
+      const std::string& wait_str = "@WAIT-FOR:";
       if (StartsWithASCII(line, allow_empty_str, true)) {
         filters->push_back(
           Filter(base::UTF8ToUTF16(line.substr(allow_empty_str.size())),
@@ -119,6 +139,8 @@
         filters->push_back(Filter(base::UTF8ToUTF16(
                                       line.substr(deny_str.size())),
                                   Filter::DENY));
+      } else if (StartsWithASCII(line, wait_str, true)) {
+        *wait_for = line.substr(wait_str.size());
       }
     }
   }
@@ -170,32 +192,52 @@
     return;
   }
 
+  // Parse filters and other directives in the test file.
+  std::vector<Filter> filters;
+  std::string wait_for;
+  AddDefaultFilters(&filters);
+  ParseHtmlForExtraDirectives(html_contents, &filters, &wait_for);
+
   // Load the page.
   base::string16 html_contents16;
   html_contents16 = base::UTF8ToUTF16(html_contents);
   GURL url = GetTestUrl("accessibility",
                         html_file.BaseName().MaybeAsASCII().c_str());
-  AccessibilityNotificationWaiter waiter(
-      shell(), AccessibilityModeComplete,
-      ui::AX_EVENT_LOAD_COMPLETE);
-  NavigateToURL(shell(), url);
-  waiter.WaitForNotification();
 
+  // If there's a @WAIT-FOR directive, set up an accessibility notification
+  // waiter that returns on any event; we'll stop when we get the text we're
+  // waiting for, or time out. Otherwise just wait specifically for
+  // the "load complete" event.
+  scoped_ptr<AccessibilityNotificationWaiter> waiter;
+  if (!wait_for.empty()) {
+    waiter.reset(new AccessibilityNotificationWaiter(
+        shell(), AccessibilityModeComplete, ui::AX_EVENT_NONE));
+  } else {
+    waiter.reset(new AccessibilityNotificationWaiter(
+        shell(), AccessibilityModeComplete, ui::AX_EVENT_LOAD_COMPLETE));
+  }
+
+  // Load the test html.
+  NavigateToURL(shell(), url);
+
+  // Wait for notifications. If there's a @WAIT-FOR directive, break when
+  // the text we're waiting for appears in the dump, otherwise break after
+  // the first notification, which will be a load complete.
   RenderWidgetHostViewBase* host_view = static_cast<RenderWidgetHostViewBase*>(
       shell()->web_contents()->GetRenderWidgetHostView());
-  AccessibilityTreeFormatter formatter(
-      host_view->GetBrowserAccessibilityManager()->GetRoot());
-
-  // Parse filters in the test file.
-  std::vector<Filter> filters;
-  AddDefaultFilters(&filters);
-  ParseFilters(html_contents, &filters);
-  formatter.SetFilters(filters);
+  std::string actual_contents;
+  do {
+    waiter->WaitForNotification();
+    base::string16 actual_contents_utf16;
+    AccessibilityTreeFormatter formatter(
+        host_view->GetBrowserAccessibilityManager()->GetRoot());
+    formatter.SetFilters(filters);
+    formatter.FormatAccessibilityTree(&actual_contents_utf16);
+    actual_contents = base::UTF16ToUTF8(actual_contents_utf16);
+  } while (!wait_for.empty() &&
+           actual_contents.find(wait_for) == std::string::npos);
 
   // Perform a diff (or write the initial baseline).
-  base::string16 actual_contents_utf16;
-  formatter.FormatAccessibilityTree(&actual_contents_utf16);
-  std::string actual_contents = base::UTF16ToUTF8(actual_contents_utf16);
   std::vector<std::string> actual_lines, expected_lines;
   Tokenize(actual_contents, "\n", &actual_lines);
   Tokenize(expected_contents, "\n", &expected_lines);
@@ -515,6 +557,10 @@
   RunTest(FILE_PATH_LITERAL("table-spans.html"));
 }
 
+IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityTransition) {
+  RunTest(FILE_PATH_LITERAL("transition.html"));
+}
+
 IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest,
                        AccessibilityToggleButton) {
   RunTest(FILE_PATH_LITERAL("togglebutton.html"));
diff --git a/content/browser/android/devtools_auth.cc b/content/browser/android/devtools_auth.cc
index c89cdc0..777a01e 100644
--- a/content/browser/android/devtools_auth.cc
+++ b/content/browser/android/devtools_auth.cc
@@ -4,6 +4,9 @@
 
 #include "content/public/browser/android/devtools_auth.h"
 
+#include <unistd.h>
+#include <sys/types.h>
+
 #include "base/logging.h"
 
 namespace content {
@@ -15,8 +18,9 @@
     return false;
   }
   if (gid == uid &&
-      (strcmp("root", creds->pw_name) == 0 ||  // For rooted devices
-       strcmp("shell", creds->pw_name) == 0)) {  // For non-rooted devices
+      (strcmp("root", creds->pw_name) == 0 ||   // For rooted devices
+       strcmp("shell", creds->pw_name) == 0 ||  // For non-rooted devices
+       uid == getuid())) {  // From processes signed with the same key
     return true;
   }
   LOG(WARNING) << "DevTools: connection attempt from " << creds->pw_name;
diff --git a/content/browser/renderer_host/input/touch_emulator.cc b/content/browser/renderer_host/input/touch_emulator.cc
index c7d5cc6..2ee0247 100644
--- a/content/browser/renderer_host/input/touch_emulator.cc
+++ b/content/browser/renderer_host/input/touch_emulator.cc
@@ -130,6 +130,11 @@
   if (!enabled_)
     return false;
 
+  if (mouse_event.button == WebMouseEvent::ButtonRight &&
+      mouse_event.type == WebInputEvent::MouseDown) {
+    client_->ShowContextMenuAtPoint(gfx::Point(mouse_event.x, mouse_event.y));
+  }
+
   if (mouse_event.button != WebMouseEvent::ButtonLeft)
     return true;
 
diff --git a/content/browser/renderer_host/input/touch_emulator_client.h b/content/browser/renderer_host/input/touch_emulator_client.h
index 92f382f..34ad109 100644
--- a/content/browser/renderer_host/input/touch_emulator_client.h
+++ b/content/browser/renderer_host/input/touch_emulator_client.h
@@ -19,6 +19,7 @@
   virtual void ForwardGestureEvent(const blink::WebGestureEvent& event) = 0;
   virtual void ForwardTouchEvent(const blink::WebTouchEvent& event) = 0;
   virtual void SetCursor(const WebCursor& cursor) = 0;
+  virtual void ShowContextMenuAtPoint(const gfx::Point& point) = 0;
 };
 
 }  // namespace content
diff --git a/content/browser/renderer_host/input/touch_emulator_unittest.cc b/content/browser/renderer_host/input/touch_emulator_unittest.cc
index 8fdfd54..cc6ec91 100644
--- a/content/browser/renderer_host/input/touch_emulator_unittest.cc
+++ b/content/browser/renderer_host/input/touch_emulator_unittest.cc
@@ -84,6 +84,8 @@
 
   virtual void SetCursor(const WebCursor& cursor) OVERRIDE {}
 
+  virtual void ShowContextMenuAtPoint(const gfx::Point& point) OVERRIDE {}
+
  protected:
   TouchEmulator* emulator() const {
     return emulator_.get();
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index eb03476..d281bdf 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -1072,6 +1072,11 @@
   view_->UpdateCursor(cursor);
 }
 
+void RenderWidgetHostImpl::ShowContextMenuAtPoint(const gfx::Point& point) {
+  Send(new ViewMsg_ShowContextMenu(
+      GetRoutingID(), ui::MENU_SOURCE_MOUSE, point));
+}
+
 void RenderWidgetHostImpl::SendCursorVisibilityState(bool is_visible) {
   Send(new InputMsg_CursorVisibilityChange(GetRoutingID(), is_visible));
 }
@@ -1195,7 +1200,6 @@
   // Reset some fields in preparation for recovering from a crash.
   ResetSizeAndRepaintPendingFlags();
   current_size_.SetSize(0, 0);
-  is_hidden_ = false;
 
   // Reset this to ensure the hung renderer mechanism is working properly.
   in_flight_event_count_ = 0;
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h
index 65fa860..e883502 100644
--- a/content/browser/renderer_host/render_widget_host_impl.h
+++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -295,6 +295,7 @@
   virtual void ForwardTouchEvent(
       const blink::WebTouchEvent& touch_event) OVERRIDE;
   virtual void SetCursor(const WebCursor& cursor) OVERRIDE;
+  virtual void ShowContextMenuAtPoint(const gfx::Point& point) OVERRIDE;
 
   // Queues a synthetic gesture for testing purposes.  Invokes the on_complete
   // callback when the gesture is finished running.
diff --git a/content/browser/web_contents/touch_editable_impl_aura.cc b/content/browser/web_contents/touch_editable_impl_aura.cc
index d28fa92..efcd1fc 100644
--- a/content/browser/web_contents/touch_editable_impl_aura.cc
+++ b/content/browser/web_contents/touch_editable_impl_aura.cc
@@ -280,7 +280,8 @@
   gfx::Point point = anchor;
   ConvertPointFromScreen(&point);
   RenderWidgetHost* host = rwhva_->GetRenderWidgetHost();
-  host->Send(new ViewMsg_ShowContextMenu(host->GetRoutingID(), point));
+  host->Send(new ViewMsg_ShowContextMenu(
+      host->GetRoutingID(), ui::MENU_SOURCE_TOUCH_EDIT_MENU, point));
   EndTouchEditing(false);
 }
 
diff --git a/content/common/view_messages.h b/content/common/view_messages.h
index 3815910..d12ba35 100644
--- a/content/common/view_messages.h
+++ b/content/common/view_messages.h
@@ -617,7 +617,8 @@
 
 // Sent to inform the renderer to invoke a context menu.
 // The parameter specifies the location in the render view's coordinates.
-IPC_MESSAGE_ROUTED1(ViewMsg_ShowContextMenu,
+IPC_MESSAGE_ROUTED2(ViewMsg_ShowContextMenu,
+                    ui::MenuSourceType,
                     gfx::Point /* location where menu should be shown */)
 
 IPC_MESSAGE_ROUTED0(ViewMsg_Stop)
diff --git a/content/content_renderer.gypi b/content/content_renderer.gypi
index 444a665..40f6cf2 100644
--- a/content/content_renderer.gypi
+++ b/content/content_renderer.gypi
@@ -683,8 +683,6 @@
       'renderer/media/rtc_video_encoder_factory.h',
       'renderer/media/rtc_video_renderer.cc',
       'renderer/media/rtc_video_renderer.h',
-      'renderer/media/video_frame_deliverer.cc',
-      'renderer/media/video_frame_deliverer.h',
       'renderer/media/video_source_handler.cc',
       'renderer/media/video_source_handler.h',
       'renderer/media/video_track_adapter.cc',
diff --git a/content/content_renderer.target.darwin-arm.mk b/content/content_renderer.target.darwin-arm.mk
index 9569521..a8eab80 100644
--- a/content/content_renderer.target.darwin-arm.mk
+++ b/content/content_renderer.target.darwin-arm.mk
@@ -269,7 +269,6 @@
 	content/renderer/media/rtc_video_encoder.cc \
 	content/renderer/media/rtc_video_encoder_factory.cc \
 	content/renderer/media/rtc_video_renderer.cc \
-	content/renderer/media/video_frame_deliverer.cc \
 	content/renderer/media/video_source_handler.cc \
 	content/renderer/media/video_track_adapter.cc \
 	content/renderer/media/webaudio_capturer_source.cc \
diff --git a/content/content_renderer.target.darwin-arm64.mk b/content/content_renderer.target.darwin-arm64.mk
index 54a6438..9873b87 100644
--- a/content/content_renderer.target.darwin-arm64.mk
+++ b/content/content_renderer.target.darwin-arm64.mk
@@ -269,7 +269,6 @@
 	content/renderer/media/rtc_video_encoder.cc \
 	content/renderer/media/rtc_video_encoder_factory.cc \
 	content/renderer/media/rtc_video_renderer.cc \
-	content/renderer/media/video_frame_deliverer.cc \
 	content/renderer/media/video_source_handler.cc \
 	content/renderer/media/video_track_adapter.cc \
 	content/renderer/media/webaudio_capturer_source.cc \
diff --git a/content/content_renderer.target.darwin-mips.mk b/content/content_renderer.target.darwin-mips.mk
index 762abf2..7ac7607 100644
--- a/content/content_renderer.target.darwin-mips.mk
+++ b/content/content_renderer.target.darwin-mips.mk
@@ -269,7 +269,6 @@
 	content/renderer/media/rtc_video_encoder.cc \
 	content/renderer/media/rtc_video_encoder_factory.cc \
 	content/renderer/media/rtc_video_renderer.cc \
-	content/renderer/media/video_frame_deliverer.cc \
 	content/renderer/media/video_source_handler.cc \
 	content/renderer/media/video_track_adapter.cc \
 	content/renderer/media/webaudio_capturer_source.cc \
diff --git a/content/content_renderer.target.darwin-x86.mk b/content/content_renderer.target.darwin-x86.mk
index 0d240d9..3340619 100644
--- a/content/content_renderer.target.darwin-x86.mk
+++ b/content/content_renderer.target.darwin-x86.mk
@@ -269,7 +269,6 @@
 	content/renderer/media/rtc_video_encoder.cc \
 	content/renderer/media/rtc_video_encoder_factory.cc \
 	content/renderer/media/rtc_video_renderer.cc \
-	content/renderer/media/video_frame_deliverer.cc \
 	content/renderer/media/video_source_handler.cc \
 	content/renderer/media/video_track_adapter.cc \
 	content/renderer/media/webaudio_capturer_source.cc \
diff --git a/content/content_renderer.target.darwin-x86_64.mk b/content/content_renderer.target.darwin-x86_64.mk
index c573a78..3742843 100644
--- a/content/content_renderer.target.darwin-x86_64.mk
+++ b/content/content_renderer.target.darwin-x86_64.mk
@@ -269,7 +269,6 @@
 	content/renderer/media/rtc_video_encoder.cc \
 	content/renderer/media/rtc_video_encoder_factory.cc \
 	content/renderer/media/rtc_video_renderer.cc \
-	content/renderer/media/video_frame_deliverer.cc \
 	content/renderer/media/video_source_handler.cc \
 	content/renderer/media/video_track_adapter.cc \
 	content/renderer/media/webaudio_capturer_source.cc \
diff --git a/content/content_renderer.target.linux-arm.mk b/content/content_renderer.target.linux-arm.mk
index 9569521..a8eab80 100644
--- a/content/content_renderer.target.linux-arm.mk
+++ b/content/content_renderer.target.linux-arm.mk
@@ -269,7 +269,6 @@
 	content/renderer/media/rtc_video_encoder.cc \
 	content/renderer/media/rtc_video_encoder_factory.cc \
 	content/renderer/media/rtc_video_renderer.cc \
-	content/renderer/media/video_frame_deliverer.cc \
 	content/renderer/media/video_source_handler.cc \
 	content/renderer/media/video_track_adapter.cc \
 	content/renderer/media/webaudio_capturer_source.cc \
diff --git a/content/content_renderer.target.linux-arm64.mk b/content/content_renderer.target.linux-arm64.mk
index 54a6438..9873b87 100644
--- a/content/content_renderer.target.linux-arm64.mk
+++ b/content/content_renderer.target.linux-arm64.mk
@@ -269,7 +269,6 @@
 	content/renderer/media/rtc_video_encoder.cc \
 	content/renderer/media/rtc_video_encoder_factory.cc \
 	content/renderer/media/rtc_video_renderer.cc \
-	content/renderer/media/video_frame_deliverer.cc \
 	content/renderer/media/video_source_handler.cc \
 	content/renderer/media/video_track_adapter.cc \
 	content/renderer/media/webaudio_capturer_source.cc \
diff --git a/content/content_renderer.target.linux-mips.mk b/content/content_renderer.target.linux-mips.mk
index 762abf2..7ac7607 100644
--- a/content/content_renderer.target.linux-mips.mk
+++ b/content/content_renderer.target.linux-mips.mk
@@ -269,7 +269,6 @@
 	content/renderer/media/rtc_video_encoder.cc \
 	content/renderer/media/rtc_video_encoder_factory.cc \
 	content/renderer/media/rtc_video_renderer.cc \
-	content/renderer/media/video_frame_deliverer.cc \
 	content/renderer/media/video_source_handler.cc \
 	content/renderer/media/video_track_adapter.cc \
 	content/renderer/media/webaudio_capturer_source.cc \
diff --git a/content/content_renderer.target.linux-x86.mk b/content/content_renderer.target.linux-x86.mk
index 0d240d9..3340619 100644
--- a/content/content_renderer.target.linux-x86.mk
+++ b/content/content_renderer.target.linux-x86.mk
@@ -269,7 +269,6 @@
 	content/renderer/media/rtc_video_encoder.cc \
 	content/renderer/media/rtc_video_encoder_factory.cc \
 	content/renderer/media/rtc_video_renderer.cc \
-	content/renderer/media/video_frame_deliverer.cc \
 	content/renderer/media/video_source_handler.cc \
 	content/renderer/media/video_track_adapter.cc \
 	content/renderer/media/webaudio_capturer_source.cc \
diff --git a/content/content_renderer.target.linux-x86_64.mk b/content/content_renderer.target.linux-x86_64.mk
index c573a78..3742843 100644
--- a/content/content_renderer.target.linux-x86_64.mk
+++ b/content/content_renderer.target.linux-x86_64.mk
@@ -269,7 +269,6 @@
 	content/renderer/media/rtc_video_encoder.cc \
 	content/renderer/media/rtc_video_encoder_factory.cc \
 	content/renderer/media/rtc_video_renderer.cc \
-	content/renderer/media/video_frame_deliverer.cc \
 	content/renderer/media/video_source_handler.cc \
 	content/renderer/media/video_track_adapter.cc \
 	content/renderer/media/webaudio_capturer_source.cc \
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java
index 3ff79ed..97949f3 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java
@@ -27,7 +27,6 @@
     // The native side of this object.
     private long mNativeContentViewRenderView;
     private SurfaceHolder.Callback mSurfaceCallback;
-    private DelayedSurfaceRunnable mDelayedSurfaceRunnable;
 
     private final SurfaceView mSurfaceView;
     protected ContentViewCore mContentViewCore;
@@ -35,40 +34,6 @@
     private ContentReadbackHandler mContentReadbackHandler;
 
     /**
-     * Constructing the SurfaceView early sends surface created notifications
-     * before the native library is loaded. This runnable sends the same signals after
-     * the library is loaded.
-     */
-    private class DelayedSurfaceRunnable implements Runnable {
-        private final SurfaceHolder mHolder;
-        private final int mFormat;
-        private final int mWidth;
-        private final int mHeight;
-
-        /**
-         * see https://developer.android.com/reference/android/view/SurfaceHolder.Callback.html#
-         * surfaceChanged(android.view.SurfaceHolder, int, int, int)
-         */
-        public DelayedSurfaceRunnable(SurfaceHolder holder, int format, int width, int height) {
-            mHolder = holder;
-            mFormat = format;
-            mWidth = width;
-            mHeight = height;
-        }
-
-        @Override
-        public void run() {
-            assert mNativeContentViewRenderView != 0;
-            nativeSurfaceCreated(mNativeContentViewRenderView);
-            nativeSurfaceChanged(mNativeContentViewRenderView, mFormat, mWidth, mHeight,
-                    mHolder.getSurface());
-            if (mContentViewCore != null) {
-                mContentViewCore.onPhysicalBackingSizeChanged(mWidth, mHeight);
-            }
-        }
-    }
-
-    /**
      * Constructs a new ContentViewRenderView.
      * This should be called and the {@link ContentViewRenderView} should be added to the view
      * hierarchy before the first draw to avoid a black flash that is seen every time a
@@ -82,34 +47,11 @@
         mSurfaceView.setZOrderMediaOverlay(true);
 
         setSurfaceViewBackgroundColor(Color.WHITE);
-
-        // Add a placeholder callback which will keep track of the last surfaceChanged call if we
-        // get any until the native libraries have been loaded.
-        mSurfaceCallback = new SurfaceHolder.Callback() {
-            @Override
-            public void surfaceDestroyed(SurfaceHolder holder) {
-                mDelayedSurfaceRunnable = null;
-            }
-
-            @Override
-            public void surfaceCreated(SurfaceHolder holder) {
-            }
-
-            @Override
-            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
-                if (mDelayedSurfaceRunnable == null) {
-                    mDelayedSurfaceRunnable =
-                            new DelayedSurfaceRunnable(holder, format, width, height);
-                }
-                return;
-            }
-        };
-        mSurfaceView.getHolder().addCallback(mSurfaceCallback);
-
         addView(mSurfaceView,
                 new FrameLayout.LayoutParams(
                         FrameLayout.LayoutParams.MATCH_PARENT,
                         FrameLayout.LayoutParams.MATCH_PARENT));
+        mSurfaceView.setVisibility(GONE);
     }
 
     /**
@@ -118,10 +60,11 @@
      * @param rootWindow The {@link WindowAndroid} this render view should be linked to.
      */
     public void onNativeLibraryLoaded(WindowAndroid rootWindow) {
+        assert !mSurfaceView.getHolder().getSurface().isValid() :
+                "Surface created before native library loaded.";
         assert rootWindow != null;
         mNativeContentViewRenderView = nativeInit(rootWindow.getNativePointer());
         assert mNativeContentViewRenderView != 0;
-        mSurfaceView.getHolder().removeCallback(mSurfaceCallback);
         mSurfaceCallback = new SurfaceHolder.Callback() {
             @Override
             public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
@@ -149,6 +92,7 @@
             }
         };
         mSurfaceView.getHolder().addCallback(mSurfaceCallback);
+        mSurfaceView.setVisibility(VISIBLE);
 
         mContentReadbackHandler = new ContentReadbackHandler() {
             @Override
@@ -157,10 +101,6 @@
             }
         };
         mContentReadbackHandler.initNativeContentReadbackHandler();
-        if (mDelayedSurfaceRunnable != null) {
-            mDelayedSurfaceRunnable.run();
-            mDelayedSurfaceRunnable = null;
-        }
     }
 
     /**
diff --git a/content/renderer/accessibility/renderer_accessibility_complete.cc b/content/renderer/accessibility/renderer_accessibility_complete.cc
index 2e72dde..e7765d4 100644
--- a/content/renderer/accessibility/renderer_accessibility_complete.cc
+++ b/content/renderer/accessibility/renderer_accessibility_complete.cc
@@ -177,16 +177,21 @@
   // Generate an event message from each Blink event.
   std::vector<AccessibilityHostMsg_EventParams> event_msgs;
 
+  // If there's a layout complete message, we need to send location changes.
+  bool had_layout_complete_messages = false;
+
   // Loop over each event and generate an updated event message.
   for (size_t i = 0; i < src_events.size(); ++i) {
-    AccessibilityHostMsg_EventParams& event =
-        src_events[i];
+    AccessibilityHostMsg_EventParams& event = src_events[i];
+    if (event.event_type == ui::AX_EVENT_LAYOUT_COMPLETE)
+      had_layout_complete_messages = true;
 
-    WebAXObject obj = document.accessibilityObjectFromID(
-        event.id);
+    WebAXObject obj = document.accessibilityObjectFromID(event.id);
+
     // Make sure the object still exists.
     if (!obj.updateBackingStoreAndCheckValidity())
       continue;
+
     // Make sure it's a descendant of our root node - exceptions include the
     // scroll area that's the parent of the main document (we ignore it), and
     // possibly nodes attached to a different document.
@@ -207,6 +212,13 @@
     serializer_.SerializeChanges(obj, &event_msg.update);
     event_msgs.push_back(event_msg);
 
+    // For each node in the update, set the location in our map from
+    // ids to locations.
+    for (size_t i = 0; i < event_msg.update.nodes.size(); ++i) {
+      locations_[event_msg.update.nodes[i].id] =
+          event_msg.update.nodes[i].location;
+    }
+
     VLOG(0) << "Accessibility event: " << ui::ToString(event.event_type)
             << " on node id " << event_msg.id
             << "\n" << event_msg.update.ToString();
@@ -214,7 +226,8 @@
 
   Send(new AccessibilityHostMsg_Events(routing_id(), event_msgs));
 
-  SendLocationChanges();
+  if (had_layout_complete_messages)
+    SendLocationChanges();
 }
 
 void RendererAccessibilityComplete::SendLocationChanges() {
@@ -246,6 +259,12 @@
 
     // Save the new location.
     new_locations[id] = new_location;
+
+    // Explore children of this object.
+    std::vector<blink::WebAXObject> children;
+    tree_source_.GetChildren(obj, &children);
+    for (size_t i = 0; i < children.size(); ++i)
+      objs_to_explore.push(children[i]);
   }
   locations_.swap(new_locations);
 
diff --git a/content/renderer/media/crypto/key_systems.cc b/content/renderer/media/crypto/key_systems.cc
index dace751..1684c27 100644
--- a/content/renderer/media/crypto/key_systems.cc
+++ b/content/renderer/media/crypto/key_systems.cc
@@ -209,14 +209,14 @@
 }
 
 void KeySystems::UpdateIfNeeded() {
-#if defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT)
+#if defined(WIDEVINE_CDM_AVAILABLE)
   DCHECK(thread_checker_.CalledOnValidThread());
   if (!needs_update_)
     return;
 
   // The update could involve a sync IPC to the browser process. Use a minimum
   // update interval to avoid unnecessary frequent IPC to the browser.
-  static const int kMinUpdateIntervalInSeconds = 5;
+  static const int kMinUpdateIntervalInSeconds = 1;
   base::Time now = base::Time::Now();
   if (now - last_update_time_ <
       base::TimeDelta::FromSeconds(kMinUpdateIntervalInSeconds)) {
diff --git a/content/renderer/media/media_stream_video_track.cc b/content/renderer/media/media_stream_video_track.cc
index 0ad7159..da26aac 100644
--- a/content/renderer/media/media_stream_video_track.cc
+++ b/content/renderer/media/media_stream_video_track.cc
@@ -4,86 +4,172 @@
 
 #include "content/renderer/media/media_stream_video_track.h"
 
+#include <utility>
+
 #include "base/bind.h"
-#include "content/renderer/media/video_frame_deliverer.h"
 #include "media/base/bind_to_current_loop.h"
 
 namespace content {
 
-// Helper class used for delivering video frames to MediaStreamSinks on the
-// IO-thread.
-// Frames are delivered to an instance of this class from a
-// MediaStreamVideoSource on the IO-thread to the method DeliverFrameOnIO.
-// Frames are only delivered to the sinks if the track is enabled.
-class MediaStreamVideoTrack::FrameDeliverer : public VideoFrameDeliverer {
+namespace {
+void ResetCallback(scoped_ptr<VideoCaptureDeliverFrameCB> callback) {
+  // |callback| will be deleted when this exits.
+}
+}  // namespace
+
+// MediaStreamVideoTrack::FrameDeliverer is a helper class used for registering
+// VideoCaptureDeliverFrameCB on the main render thread to receive video frames
+// on the IO-thread.
+// Frames are only delivered to the sinks if the track is enabled. If the track
+// is disabled, a black frame is instead forwarded to the sinks at the same
+// frame rate.
+class MediaStreamVideoTrack::FrameDeliverer
+    : public base::RefCountedThreadSafe<FrameDeliverer> {
  public:
   FrameDeliverer(
-      const scoped_refptr<base::MessageLoopProxy>& io_message_loop_proxy,
-      bool enabled)
-      : VideoFrameDeliverer(io_message_loop_proxy),
-        enabled_(enabled) {
-  }
+      const scoped_refptr<base::MessageLoopProxy>& io_message_loop,
+      bool enabled);
 
-  // Add |sink| to receive state changes on the main render thread.
-  // Video frames will be delivered to |callback| on the IO thread.
-  void AddSink(MediaStreamVideoSink* sink,
-               const VideoCaptureDeliverFrameCB& callback) {
-    DCHECK(thread_checker().CalledOnValidThread());
-    DCHECK(std::find(sinks_.begin(), sinks_.end(), sink) == sinks_.end());
-    sinks_.push_back(sink);
-    AddCallback(sink, callback);
-  }
+  void SetEnabled(bool enabled);
 
-  void RemoveSink(MediaStreamVideoSink* sink) {
-    DCHECK(thread_checker().CalledOnValidThread());
-    std::vector<MediaStreamVideoSink*>::iterator it =
-        std::find(sinks_.begin(), sinks_.end(), sink);
-    DCHECK(it != sinks_.end());
-    sinks_.erase(it);
-    RemoveCallback(sink);
-  }
+  // Add |callback| to receive video frames on the IO-thread.
+  // Must be called on the main render thread.
+  void AddCallback(void* id, const VideoCaptureDeliverFrameCB& callback);
 
-  void SetEnabled(bool enabled) {
-    DCHECK(thread_checker().CalledOnValidThread());
-    io_message_loop()->PostTask(
-        FROM_HERE,
-        base::Bind(&MediaStreamVideoTrack::FrameDeliverer::SetEnabledOnIO,
-                   this, enabled));
-  }
+  // Removes |callback| associated with |id| from receiving video frames if |id|
+  // has been added. It is ok to call RemoveCallback even if the |id| has not
+  // been added. Note that the added callback will be reset on the main thread.
+  // Must be called on the main render thread.
+  void RemoveCallback(void* id);
 
-  virtual void DeliverFrameOnIO(
-      const scoped_refptr<media::VideoFrame>& frame,
-      const media::VideoCaptureFormat& format,
-      const base::TimeTicks& estimated_capture_time) OVERRIDE {
-    DCHECK(io_message_loop()->BelongsToCurrentThread());
-    if (!enabled_)
-      return;
-    VideoFrameDeliverer::DeliverFrameOnIO(frame, format,
-                                          estimated_capture_time);
-  }
-
-  const std::vector<MediaStreamVideoSink*>& sinks() const { return sinks_; }
-
- protected:
-  virtual ~FrameDeliverer() {
-    DCHECK(sinks_.empty());
-  }
-
-  void SetEnabledOnIO(bool enabled) {
-    DCHECK(io_message_loop()->BelongsToCurrentThread());
-    enabled_ = enabled;
-  }
+  // Triggers all registered callbacks with |frame|, |format| and
+  // |estimated_capture_time| as parameters. Must be called on the IO-thread.
+  void DeliverFrameOnIO(const scoped_refptr<media::VideoFrame>& frame,
+                        const media::VideoCaptureFormat& format,
+                        const base::TimeTicks& estimated_capture_time);
 
  private:
-  // The below members are used on the main render thread.
-  std::vector<MediaStreamVideoSink*> sinks_;
+  friend class base::RefCountedThreadSafe<FrameDeliverer>;
+  virtual ~FrameDeliverer();
+  void AddCallbackOnIO(void* id, const VideoCaptureDeliverFrameCB& callback);
+  void RemoveCallbackOnIO(
+      void* id, const scoped_refptr<base::MessageLoopProxy>& message_loop);
 
-  // The below parameters are used on the IO-thread.
+  void SetEnabledOnIO(bool enabled);
+  // Returns |black_frame_| where the size and time stamp is set to the same as
+  // as in |reference_frame|.
+  const scoped_refptr<media::VideoFrame>& GetBlackFrame(
+      const scoped_refptr<media::VideoFrame>& reference_frame);
+
+  // Used to DCHECK that AddCallback and RemoveCallback are called on the main
+  // render thread.
+  base::ThreadChecker thread_checker_;
+  scoped_refptr<base::MessageLoopProxy> io_message_loop_;
+
   bool enabled_;
+  scoped_refptr<media::VideoFrame> black_frame_;
+
+  typedef std::pair<void*, VideoCaptureDeliverFrameCB> VideoIdCallbackPair;
+  std::vector<VideoIdCallbackPair> callbacks_;
 
   DISALLOW_COPY_AND_ASSIGN(FrameDeliverer);
 };
 
+MediaStreamVideoTrack::FrameDeliverer::FrameDeliverer(
+    const scoped_refptr<base::MessageLoopProxy>& io_message_loop, bool enabled)
+    : io_message_loop_(io_message_loop),
+      enabled_(enabled) {
+  DCHECK(io_message_loop_);
+}
+
+MediaStreamVideoTrack::FrameDeliverer::~FrameDeliverer() {
+  DCHECK(callbacks_.empty());
+}
+
+void MediaStreamVideoTrack::FrameDeliverer::AddCallback(
+    void* id,
+    const VideoCaptureDeliverFrameCB& callback) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  io_message_loop_->PostTask(
+      FROM_HERE,
+      base::Bind(&FrameDeliverer::AddCallbackOnIO,
+                 this, id, callback));
+}
+
+void MediaStreamVideoTrack::FrameDeliverer::AddCallbackOnIO(
+    void* id,
+    const VideoCaptureDeliverFrameCB& callback) {
+  DCHECK(io_message_loop_->BelongsToCurrentThread());
+  callbacks_.push_back(std::make_pair(id, callback));
+}
+
+void MediaStreamVideoTrack::FrameDeliverer::RemoveCallback(void* id) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  io_message_loop_->PostTask(
+      FROM_HERE,
+      base::Bind(&FrameDeliverer::RemoveCallbackOnIO,
+                 this, id, base::MessageLoopProxy::current()));
+}
+
+void MediaStreamVideoTrack::FrameDeliverer::RemoveCallbackOnIO(
+    void* id, const scoped_refptr<base::MessageLoopProxy>& message_loop) {
+  DCHECK(io_message_loop_->BelongsToCurrentThread());
+  std::vector<VideoIdCallbackPair>::iterator it = callbacks_.begin();
+  for (; it != callbacks_.end(); ++it) {
+    if (it->first == id) {
+      // Callback is copied to heap and then deleted on the target thread.
+      scoped_ptr<VideoCaptureDeliverFrameCB> callback;
+      callback.reset(new VideoCaptureDeliverFrameCB(it->second));
+      callbacks_.erase(it);
+      message_loop->PostTask(
+          FROM_HERE, base::Bind(&ResetCallback, base::Passed(&callback)));
+      return;
+    }
+  }
+}
+
+void MediaStreamVideoTrack::FrameDeliverer::SetEnabled(bool enabled) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  io_message_loop_->PostTask(
+      FROM_HERE,
+      base::Bind(&FrameDeliverer::SetEnabledOnIO,
+                 this, enabled));
+}
+
+void MediaStreamVideoTrack::FrameDeliverer::SetEnabledOnIO(bool enabled) {
+  DCHECK(io_message_loop_->BelongsToCurrentThread());
+  enabled_ = enabled;
+  if (enabled_)
+    black_frame_ = NULL;
+}
+
+void MediaStreamVideoTrack::FrameDeliverer::DeliverFrameOnIO(
+    const scoped_refptr<media::VideoFrame>& frame,
+    const media::VideoCaptureFormat& format,
+    const base::TimeTicks& estimated_capture_time) {
+  DCHECK(io_message_loop_->BelongsToCurrentThread());
+  const scoped_refptr<media::VideoFrame>& video_frame =
+      enabled_ ? frame : GetBlackFrame(frame);
+
+  for (std::vector<VideoIdCallbackPair>::iterator it = callbacks_.begin();
+       it != callbacks_.end(); ++it) {
+    it->second.Run(video_frame, format, estimated_capture_time);
+  }
+}
+
+const scoped_refptr<media::VideoFrame>&
+MediaStreamVideoTrack::FrameDeliverer::GetBlackFrame(
+    const scoped_refptr<media::VideoFrame>& reference_frame) {
+  DCHECK(io_message_loop_->BelongsToCurrentThread());
+  if (!black_frame_ ||
+      black_frame_->natural_size() != reference_frame->natural_size())
+    black_frame_ =
+        media::VideoFrame::CreateBlackFrame(reference_frame->natural_size());
+
+  black_frame_->set_timestamp(reference_frame->timestamp());
+  return black_frame_;
+}
+
 // static
 blink::WebMediaStreamTrack MediaStreamVideoTrack::CreateVideoTrack(
     MediaStreamVideoSource* source,
@@ -126,6 +212,7 @@
 
 MediaStreamVideoTrack::~MediaStreamVideoTrack() {
   DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(sinks_.empty());
   Stop();
   DVLOG(3) << "~MediaStreamVideoTrack()";
 }
@@ -133,12 +220,18 @@
 void MediaStreamVideoTrack::AddSink(
     MediaStreamVideoSink* sink, const VideoCaptureDeliverFrameCB& callback) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  frame_deliverer_->AddSink(sink, callback);
+  DCHECK(std::find(sinks_.begin(), sinks_.end(), sink) == sinks_.end());
+  sinks_.push_back(sink);
+  frame_deliverer_->AddCallback(sink, callback);
 }
 
 void MediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  frame_deliverer_->RemoveSink(sink);
+  std::vector<MediaStreamVideoSink*>::iterator it =
+      std::find(sinks_.begin(), sinks_.end(), sink);
+  DCHECK(it != sinks_.end());
+  sinks_.erase(it);
+  frame_deliverer_->RemoveCallback(sink);
 }
 
 void MediaStreamVideoTrack::SetEnabled(bool enabled) {
@@ -146,9 +239,8 @@
   MediaStreamTrack::SetEnabled(enabled);
 
   frame_deliverer_->SetEnabled(enabled);
-  const std::vector<MediaStreamVideoSink*>& sinks = frame_deliverer_->sinks();
-  for (std::vector<MediaStreamVideoSink*>::const_iterator it = sinks.begin();
-       it != sinks.end(); ++it) {
+  for (std::vector<MediaStreamVideoSink*>::const_iterator it = sinks_.begin();
+       it != sinks_.end(); ++it) {
     (*it)->OnEnabledChanged(enabled);
   }
 }
@@ -165,9 +257,8 @@
 void MediaStreamVideoTrack::OnReadyStateChanged(
     blink::WebMediaStreamSource::ReadyState state) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  const std::vector<MediaStreamVideoSink*>& sinks = frame_deliverer_->sinks();
-  for (std::vector<MediaStreamVideoSink*>::const_iterator it = sinks.begin();
-       it != sinks.end(); ++it) {
+  for (std::vector<MediaStreamVideoSink*>::const_iterator it = sinks_.begin();
+       it != sinks_.end(); ++it) {
     (*it)->OnReadyStateChanged(state);
   }
 }
diff --git a/content/renderer/media/media_stream_video_track.h b/content/renderer/media/media_stream_video_track.h
index 040686c..6fecbe1 100644
--- a/content/renderer/media/media_stream_video_track.h
+++ b/content/renderer/media/media_stream_video_track.h
@@ -41,12 +41,12 @@
   static MediaStreamVideoTrack* GetVideoTrack(
       const blink::WebMediaStreamTrack& track);
 
-  // Constructor for local video tracks.
-   MediaStreamVideoTrack(
-       MediaStreamVideoSource* source,
-       const blink::WebMediaConstraints& constraints,
-       const MediaStreamVideoSource::ConstraintsCallback& callback,
-       bool enabled);
+  // Constructor for video tracks.
+  MediaStreamVideoTrack(
+      MediaStreamVideoSource* source,
+      const blink::WebMediaConstraints& constraints,
+      const MediaStreamVideoSource::ConstraintsCallback& callback,
+      bool enabled);
   virtual ~MediaStreamVideoTrack();
 
   virtual void SetEnabled(bool enabled) OVERRIDE;
@@ -80,6 +80,8 @@
                const VideoCaptureDeliverFrameCB& callback);
   void RemoveSink(MediaStreamVideoSink* sink);
 
+  std::vector<MediaStreamVideoSink*> sinks_;
+
   // |FrameDeliverer| is an internal helper object used for delivering video
   // frames on the IO-thread using callbacks to all registered tracks.
   class FrameDeliverer;
diff --git a/content/renderer/media/media_stream_video_track_unittest.cc b/content/renderer/media/media_stream_video_track_unittest.cc
index 9b281a6..2571ee4 100644
--- a/content/renderer/media/media_stream_video_track_unittest.cc
+++ b/content/renderer/media/media_stream_video_track_unittest.cc
@@ -18,6 +18,9 @@
 
 namespace content {
 
+const uint8 kBlackValue = 0x00;
+const uint8 kColorValue = 0xAB;
+
 ACTION_P(RunClosure, closure) {
   closure.Run();
 }
@@ -43,9 +46,10 @@
     EXPECT_CALL(*sink, OnVideoFrame()).WillOnce(
         RunClosure(quit_closure));
     scoped_refptr<media::VideoFrame> frame =
-        media::VideoFrame::CreateBlackFrame(
+        media::VideoFrame::CreateColorFrame(
             gfx::Size(MediaStreamVideoSource::kDefaultWidth,
-                      MediaStreamVideoSource::kDefaultHeight));
+                      MediaStreamVideoSource::kDefaultHeight),
+            kColorValue, kColorValue, kColorValue, base::TimeDelta());
     mock_source()->DeliverVideoFrame(frame);
     run_loop.Run();
   }
@@ -163,24 +167,20 @@
 
   DeliverVideoFrameAndWaitForRenderer(&sink);
   EXPECT_EQ(1, sink.number_of_frames());
+  EXPECT_EQ(kColorValue, *sink.last_frame()->data(media::VideoFrame::kYPlane));
 
   video_track->SetEnabled(false);
   EXPECT_FALSE(sink.enabled());
 
-  scoped_refptr<media::VideoFrame> frame =
-      media::VideoFrame::CreateBlackFrame(
-          gfx::Size(MediaStreamVideoSource::kDefaultWidth,
-                    MediaStreamVideoSource::kDefaultHeight));
-  mock_source()->DeliverVideoFrame(frame);
-  // Wait for the IO thread to complete delivering frames.
-  io_message_loop()->RunUntilIdle();
-  EXPECT_EQ(1, sink.number_of_frames());
+  DeliverVideoFrameAndWaitForRenderer(&sink);
+  EXPECT_EQ(2, sink.number_of_frames());
+  EXPECT_EQ(kBlackValue, *sink.last_frame()->data(media::VideoFrame::kYPlane));
 
   video_track->SetEnabled(true);
   EXPECT_TRUE(sink.enabled());
-  mock_source()->DeliverVideoFrame(frame);
   DeliverVideoFrameAndWaitForRenderer(&sink);
-  EXPECT_EQ(2, sink.number_of_frames());
+  EXPECT_EQ(3, sink.number_of_frames());
+  EXPECT_EQ(kColorValue, *sink.last_frame()->data(media::VideoFrame::kYPlane));
   MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track);
 }
 
diff --git a/content/renderer/media/mock_media_stream_video_sink.cc b/content/renderer/media/mock_media_stream_video_sink.cc
index 347ca62..7a054ab 100644
--- a/content/renderer/media/mock_media_stream_video_sink.cc
+++ b/content/renderer/media/mock_media_stream_video_sink.cc
@@ -31,6 +31,7 @@
     const scoped_refptr<media::VideoFrame>& frame,
     const media::VideoCaptureFormat& format,
     const base::TimeTicks& estimated_capture_time) {
+  last_frame_ = frame;
   ++number_of_frames_;
   format_ = frame->format();
   frame_size_ = frame->natural_size();
diff --git a/content/renderer/media/mock_media_stream_video_sink.h b/content/renderer/media/mock_media_stream_video_sink.h
index 682a617..2f73761 100644
--- a/content/renderer/media/mock_media_stream_video_sink.h
+++ b/content/renderer/media/mock_media_stream_video_sink.h
@@ -32,6 +32,7 @@
   int number_of_frames() const { return number_of_frames_; }
   media::VideoFrame::Format format() const { return format_; }
   gfx::Size frame_size() const { return frame_size_; }
+  scoped_refptr<media::VideoFrame> last_frame() const { return last_frame_; };
 
   bool enabled() const { return enabled_; }
   blink::WebMediaStreamSource::ReadyState state() const { return state_; }
@@ -47,6 +48,7 @@
   media::VideoFrame::Format format_;
   blink::WebMediaStreamSource::ReadyState state_;
   gfx::Size frame_size_;
+  scoped_refptr<media::VideoFrame> last_frame_;
   base::WeakPtrFactory<MockMediaStreamVideoSink> weak_factory_;
 };
 
diff --git a/content/renderer/media/rtc_video_renderer.cc b/content/renderer/media/rtc_video_renderer.cc
index c45a24a..323f0a3 100644
--- a/content/renderer/media/rtc_video_renderer.cc
+++ b/content/renderer/media/rtc_video_renderer.cc
@@ -81,12 +81,6 @@
     RenderSignalingFrame();
 }
 
-void RTCVideoRenderer::OnEnabledChanged(bool enabled) {
-  DCHECK(message_loop_proxy_->BelongsToCurrentThread());
-  if (!enabled)
-    RenderSignalingFrame();
-}
-
 void RTCVideoRenderer::OnVideoFrame(
     const scoped_refptr<media::VideoFrame>& frame,
     const media::VideoCaptureFormat& format,
@@ -108,7 +102,7 @@
 
 void RTCVideoRenderer::RenderSignalingFrame() {
   // This is necessary to make sure audio can play if the video tag src is
-  // a MediaStream video track that has been rejected, ended or disabled.
+  // a MediaStream video track that has been rejected or ended.
   // It also ensure that the renderer don't hold a reference to a real video
   // frame if no more frames are provided. This is since there might be a
   // finite number of available buffers. E.g, video that
diff --git a/content/renderer/media/rtc_video_renderer.h b/content/renderer/media/rtc_video_renderer.h
index e205b6b..6add0df 100644
--- a/content/renderer/media/rtc_video_renderer.h
+++ b/content/renderer/media/rtc_video_renderer.h
@@ -61,7 +61,6 @@
   // VideoTrackSink implementation. Called on the main thread.
   virtual void OnReadyStateChanged(
       blink::WebMediaStreamSource::ReadyState state) OVERRIDE;
-  virtual void OnEnabledChanged(bool enabled) OVERRIDE;
 
   void RenderSignalingFrame();
 
diff --git a/content/renderer/media/video_frame_deliverer.cc b/content/renderer/media/video_frame_deliverer.cc
deleted file mode 100644
index 05c7749..0000000
--- a/content/renderer/media/video_frame_deliverer.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/media/video_frame_deliverer.h"
-
-#include "base/bind.h"
-#include "base/location.h"
-
-namespace content {
-namespace {
-void ResetCallback(scoped_ptr<VideoCaptureDeliverFrameCB> callback) {
-  // |callback| will be deleted when this exits.
-}
-}  // namespace
-
-VideoFrameDeliverer::VideoFrameDeliverer(
-    const scoped_refptr<base::MessageLoopProxy>& io_message_loop)
-    : io_message_loop_(io_message_loop) {
-  DCHECK(io_message_loop_);
-}
-
-VideoFrameDeliverer::~VideoFrameDeliverer() {
-  DCHECK(callbacks_.empty());
-}
-
-void VideoFrameDeliverer::AddCallback(
-    void* id,
-    const VideoCaptureDeliverFrameCB& callback) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  io_message_loop_->PostTask(
-      FROM_HERE,
-      base::Bind(&VideoFrameDeliverer::AddCallbackOnIO,
-                 this, id, callback));
-}
-
-void VideoFrameDeliverer::AddCallbackOnIO(
-    void* id,
-    const VideoCaptureDeliverFrameCB& callback) {
-  DCHECK(io_message_loop_->BelongsToCurrentThread());
-  callbacks_.push_back(std::make_pair(id, callback));
-}
-
-void VideoFrameDeliverer::RemoveCallback(void* id) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  io_message_loop_->PostTask(
-      FROM_HERE,
-      base::Bind(&VideoFrameDeliverer::RemoveCallbackOnIO,
-                 this, id, base::MessageLoopProxy::current()));
-}
-
-void VideoFrameDeliverer::RemoveCallbackOnIO(
-    void* id, const scoped_refptr<base::MessageLoopProxy>& message_loop) {
-  DCHECK(io_message_loop_->BelongsToCurrentThread());
-  std::vector<VideoIdCallbackPair>::iterator it = callbacks_.begin();
-  for (; it != callbacks_.end(); ++it) {
-    if (it->first == id) {
-      // Callback is copied to heap and then deleted on the target thread.
-      // The following code ensures that the callback is not referenced on
-      // the stack.
-      scoped_ptr<VideoCaptureDeliverFrameCB> callback;
-      {
-        callback.reset(new VideoCaptureDeliverFrameCB(it->second));
-        callbacks_.erase(it);
-      }
-      message_loop->PostTask(
-          FROM_HERE, base::Bind(&ResetCallback, base::Passed(&callback)));
-      return;
-    }
-  }
-}
-
-void VideoFrameDeliverer::DeliverFrameOnIO(
-    const scoped_refptr<media::VideoFrame>& frame,
-    const media::VideoCaptureFormat& format,
-    const base::TimeTicks& estimated_capture_time) {
-  DCHECK(io_message_loop_->BelongsToCurrentThread());
-  for (std::vector<VideoIdCallbackPair>::iterator it = callbacks_.begin();
-       it != callbacks_.end(); ++it) {
-    it->second.Run(frame, format, estimated_capture_time);
-  }
-}
-
-}  // namespace content
diff --git a/content/renderer/media/video_frame_deliverer.h b/content/renderer/media/video_frame_deliverer.h
deleted file mode 100644
index a1f4b9d..0000000
--- a/content/renderer/media/video_frame_deliverer.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_MEDIA_VIDEO_FRAME_DELIVERER_H_
-#define CONTENT_RENDERER_MEDIA_VIDEO_FRAME_DELIVERER_H_
-
-#include <utility>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop_proxy.h"
-#include "base/threading/thread_checker.h"
-#include "content/common/media/video_capture.h"
-#include "content/public/renderer/media_stream_video_sink.h"
-#include "media/base/video_frame.h"
-
-namespace content {
-
-// VideoFrameDeliverer is a helper class used for registering
-// VideoCaptureDeliverFrameCB on the main render thread to receive video frames
-// on the IO-thread.
-// Its used by MediaStreamVideoTrack.
-class VideoFrameDeliverer
-    : public base::RefCountedThreadSafe<VideoFrameDeliverer> {
- public:
-  explicit VideoFrameDeliverer(
-      const scoped_refptr<base::MessageLoopProxy>& io_message_loop);
-
-  // Add |callback| to receive video frames on the IO-thread.
-  // Must be called on the main render thread.
-  void AddCallback(void* id, const VideoCaptureDeliverFrameCB& callback);
-
-  // Removes |callback| associated with |id| from receiving video frames if |id|
-  // has been added. It is ok to call RemoveCallback even if the |id| has not
-  // been added. Note that the added callback will be reset on the main thread.
-  // Must be called on the main render thread.
-  void RemoveCallback(void* id);
-
-  // Triggers all registered callbacks with |frame|, |format| and
-  // |estimated_capture_time| as parameters. Must be called on the IO-thread.
-  virtual void DeliverFrameOnIO(
-      const scoped_refptr<media::VideoFrame>& frame,
-      const media::VideoCaptureFormat& format,
-      const base::TimeTicks& estimated_capture_time);
-
-  const scoped_refptr<base::MessageLoopProxy>& io_message_loop() const {
-    return io_message_loop_;
-  }
-
- protected:
-  void AddCallbackOnIO(void* id, const VideoCaptureDeliverFrameCB& callback);
-
-  // Callback will be removed and then reset on the designated message loop.
-  // It is ok to call RemoveCallback even if |id| has not been added.
-  void RemoveCallbackOnIO(
-      void* id, const scoped_refptr<base::MessageLoopProxy>& message_loop);
-
- protected:
-  virtual ~VideoFrameDeliverer();
-  const base::ThreadChecker& thread_checker() const {
-    return thread_checker_;
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<VideoFrameDeliverer>;
-
-  // Used to DCHECK that AddCallback and RemoveCallback are called on the main
-  // render thread.
-  base::ThreadChecker thread_checker_;
-  scoped_refptr<base::MessageLoopProxy> io_message_loop_;
-
-  typedef std::pair<void*, VideoCaptureDeliverFrameCB> VideoIdCallbackPair;
-  std::vector<VideoIdCallbackPair> callbacks_;
-
-  DISALLOW_COPY_AND_ASSIGN(VideoFrameDeliverer);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_MEDIA_VIDEO_FRAME_DELIVERER_H_
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 65c8b7a..bd7acdf 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -2269,11 +2269,11 @@
 void RenderFrameImpl::showContextMenu(const blink::WebContextMenuData& data) {
   ContextMenuParams params = ContextMenuParamsBuilder::Build(data);
   params.source_type = GetRenderWidget()->context_menu_source_type();
-  if (params.source_type == ui::MENU_SOURCE_TOUCH_EDIT_MENU) {
-    params.x = GetRenderWidget()->touch_editing_context_menu_location().x();
-    params.y = GetRenderWidget()->touch_editing_context_menu_location().y();
-  }
   GetRenderWidget()->OnShowHostContextMenu(&params);
+  if (GetRenderWidget()->has_host_context_menu_location()) {
+    params.x = GetRenderWidget()->host_context_menu_location().x();
+    params.y = GetRenderWidget()->host_context_menu_location().y();
+  }
 
   // Plugins, e.g. PDF, don't currently update the render view when their
   // selected text changes, but the context menu params do contain the updated
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index 0c46345..3c51f84 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -172,6 +172,12 @@
 const int kMinRasterThreads = 1;
 const int kMaxRasterThreads = 64;
 
+// Maximum allocation size allowed for image scaling filters that
+// require pre-scaling. Skia will fallback to a filter that doesn't
+// require pre-scaling if the default filter would require an
+// allocation that exceeds this limit.
+const size_t kImageCacheSingleAllocationByteLimit = 64 * 1024 * 1024;
+
 // Keep the global RenderThreadImpl in a TLS slot so it is impossible to access
 // incorrectly from the wrong thread.
 base::LazyInstance<base::ThreadLocalPointer<RenderThreadImpl> >
@@ -827,6 +833,9 @@
   if (!command_line.HasSwitch(switches::kEnableDeferredImageDecoding) &&
       !is_impl_side_painting_enabled_)
     SkGraphics::SetImageCacheByteLimit(0u);
+
+  SkGraphics::SetImageCacheSingleAllocationByteLimit(
+      kImageCacheSingleAllocationByteLimit);
 }
 
 void RenderThreadImpl::RegisterSchemes() {
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index f5bd5eb..3a68a86 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -3779,11 +3779,14 @@
 }
 #endif
 
-void RenderViewImpl::OnShowContextMenu(const gfx::Point& location) {
-  context_menu_source_type_ = ui::MENU_SOURCE_TOUCH_EDIT_MENU;
-  touch_editing_context_menu_location_ = location;
+void RenderViewImpl::OnShowContextMenu(
+    ui::MenuSourceType source_type, const gfx::Point& location) {
+  context_menu_source_type_ = source_type;
+  has_host_context_menu_location_ = true;
+  host_context_menu_location_ = location;
   if (webview())
     webview()->showContextMenu();
+  has_host_context_menu_location_ = false;
 }
 
 void RenderViewImpl::OnEnableViewSourceMode() {
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index 324c4c7..4827abb 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -685,7 +685,8 @@
   void OnCancelDownload(int32 download_id);
   void OnClearFocusedElement();
   void OnClosePage();
-  void OnShowContextMenu(const gfx::Point& location);
+  void OnShowContextMenu(ui::MenuSourceType source_type,
+                         const gfx::Point& location);
   void OnCopyImageAt(int x, int y);
   void OnSaveImageAt(int x, int y);
   void OnDeterminePageLanguage();
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index d91647e..8dfd4aa 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -397,7 +397,8 @@
 #endif
       popup_origin_scale_for_emulation_(0.f),
       resizing_mode_selector_(new ResizingModeSelector()),
-      context_menu_source_type_(ui::MENU_SOURCE_MOUSE) {
+      context_menu_source_type_(ui::MENU_SOURCE_MOUSE),
+      has_host_context_menu_location_(false) {
   if (!swapped_out)
     RenderProcess::current()->AddRefProcess();
   DCHECK(RenderThread::Get());
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index cfba42a..7dd43c9 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -105,9 +105,13 @@
   bool closing() const { return closing_; }
   bool is_swapped_out() { return is_swapped_out_; }
   ui::MenuSourceType context_menu_source_type() {
-    return context_menu_source_type_; }
-  gfx::Point touch_editing_context_menu_location() {
-    return touch_editing_context_menu_location_;
+    return context_menu_source_type_;
+  }
+  bool has_host_context_menu_location() {
+    return has_host_context_menu_location_;
+  }
+  gfx::Point host_context_menu_location() {
+    return host_context_menu_location_;
   }
 
   // Functions to track out-of-process frames for special notifications.
@@ -704,7 +708,8 @@
   ObserverList<RenderFrameImpl> render_frames_;
 
   ui::MenuSourceType context_menu_source_type_;
-  gfx::Point touch_editing_context_menu_location_;
+  bool has_host_context_menu_location_;
+  gfx::Point host_context_menu_location_;
 
   DISALLOW_COPY_AND_ASSIGN(RenderWidget);
 };
diff --git a/content/test/accessibility_browser_test_utils.cc b/content/test/accessibility_browser_test_utils.cc
index ba0331c..deb3deb 100644
--- a/content/test/accessibility_browser_test_utils.cc
+++ b/content/test/accessibility_browser_test_utils.cc
@@ -56,6 +56,10 @@
 
 void AccessibilityNotificationWaiter::WaitForNotification() {
   loop_runner_->Run();
+
+  // Each loop runner can only be called once. Create a new one in case
+  // the caller wants to call this again to wait for the next notification.
+  loop_runner_ = new MessageLoopRunner();
 }
 
 const ui::AXTree& AccessibilityNotificationWaiter::GetAXTree() const {
@@ -64,7 +68,7 @@
 
 void AccessibilityNotificationWaiter::OnAccessibilityEvent(
     ui::AXEvent event_type, int event_target_id) {
-  if (!IsAboutBlank() && (event_to_wait_for_ == ui::AX_EVENT_NONE ||
+   if (!IsAboutBlank() && (event_to_wait_for_ == ui::AX_EVENT_NONE ||
                           event_to_wait_for_ == event_type)) {
     event_target_id_ = event_target_id;
     loop_runner_->Quit();
diff --git a/content/test/accessibility_browser_test_utils.h b/content/test/accessibility_browser_test_utils.h
index 5111e3c..3c134ea 100644
--- a/content/test/accessibility_browser_test_utils.h
+++ b/content/test/accessibility_browser_test_utils.h
@@ -24,7 +24,6 @@
 class AccessibilityNotificationWaiter {
  public:
   explicit AccessibilityNotificationWaiter(Shell* shell);
-
   AccessibilityNotificationWaiter(
       Shell* shell,
       AccessibilityMode accessibility_mode,
diff --git a/content/test/data/accessibility/transition-expected-android.txt b/content/test/data/accessibility/transition-expected-android.txt
new file mode 100644
index 0000000..37ef40e
--- /dev/null
+++ b/content/test/data/accessibility/transition-expected-android.txt
@@ -0,0 +1,5 @@
+#<skip - Android doesn't output the location and size of objects.>
+android.webkit.WebView focusable scrollable
+    android.view.View
+        android.widget.Button clickable focusable focused name='GrowButton'
+        android.view.View clickable name='Done'
diff --git a/content/test/data/accessibility/transition-expected-mac.txt b/content/test/data/accessibility/transition-expected-mac.txt
new file mode 100644
index 0000000..f2043b1
--- /dev/null
+++ b/content/test/data/accessibility/transition-expected-mac.txt
@@ -0,0 +1,4 @@
+AXWebArea
+    AXGroup
+        AXButton AXTitle='GrowButton' size=(600, 300)
+        AXStaticText AXValue='Done'
diff --git a/content/test/data/accessibility/transition-expected-win.txt b/content/test/data/accessibility/transition-expected-win.txt
new file mode 100644
index 0000000..743cb39
--- /dev/null
+++ b/content/test/data/accessibility/transition-expected-win.txt
@@ -0,0 +1,4 @@
+ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
+    IA2_ROLE_SECTION READONLY
+        ROLE_SYSTEM_PUSHBUTTON name='GrowButton' FOCUSABLE size=(600, 300)
+        ROLE_SYSTEM_STATICTEXT name='Done'
diff --git a/content/test/data/accessibility/transition.html b/content/test/data/accessibility/transition.html
new file mode 100644
index 0000000..df42c6a
--- /dev/null
+++ b/content/test/data/accessibility/transition.html
@@ -0,0 +1,58 @@
+<!doctype html>
+<!--
+This tests that location changes are sent when an element animates
+using CSS transitions. The test animates the size of a button when
+focused, then adds the magic text "Done" to the document when
+the transition finishes. The WAIT-FOR directive below instructs
+the test framework to keep waiting for accessibility events and
+not diff the dump against the expectations until the text "Done"
+appears in the dump.
+
+@MAC-ALLOW:size=(400, 200)
+@MAC-ALLOW:size=(600, 300)
+@WIN-ALLOW:size=(400, 200)
+@WIN-ALLOW:size=(600, 300)
+@WAIT-FOR:Done
+-->
+<html>
+<head>
+<style>
+body {
+  width: 800px;
+  height: 600px;
+  margin: 0;
+  padding: 0;
+  border: 0;
+  overflow: hidden;
+}
+#growbutton {
+  width: 400px;
+  height: 200px;
+  margin: 0;
+  padding: 0;
+}
+#growbutton:focus {
+  width: 600px;
+  height: 300px;
+  transition: all 0.1s ease-in-out;
+}
+</style>
+</head>
+<body>
+
+<button id="growbutton">GrowButton</button>
+
+<script>
+  var growButton = document.getElementById('growbutton');
+  var done = false;
+  growButton.addEventListener('webkitTransitionEnd', function() {
+    if (!done) {
+      document.body.appendChild(document.createTextNode('Done'));
+      done = true;
+    }
+  }, false);
+  growButton.focus();  
+</script>
+
+</body>
+</html>
diff --git a/extensions/common/permissions/permissions_data.cc b/extensions/common/permissions/permissions_data.cc
index 1b160ca..b6c87d4 100644
--- a/extensions/common/permissions/permissions_data.cc
+++ b/extensions/common/permissions/permissions_data.cc
@@ -25,12 +25,6 @@
 
 PermissionsData::PolicyDelegate* g_policy_delegate = NULL;
 
-// Returns true if this extension id is from a trusted provider.
-bool ShouldSkipPermissionWarnings(const std::string& extension_id) {
-  // See http://b/4946060 for more details.
-  return extension_id == std::string("nckgahadagoaajjgafhacjanaoiihapd");
-}
-
 }  // namespace
 
 PermissionsData::PermissionsData(const Extension* extension)
@@ -71,6 +65,12 @@
          whitelist.end();
 }
 
+bool PermissionsData::ShouldSkipPermissionWarnings(
+    const std::string& extension_id) {
+  // See http://b/4946060 for more details.
+  return extension_id == std::string("nckgahadagoaajjgafhacjanaoiihapd");
+}
+
 // static
 bool PermissionsData::IsRestrictedUrl(const GURL& document_url,
                                       const GURL& top_frame_url,
diff --git a/extensions/common/permissions/permissions_data.h b/extensions/common/permissions/permissions_data.h
index 9470d58..bcdc7c3 100644
--- a/extensions/common/permissions/permissions_data.h
+++ b/extensions/common/permissions/permissions_data.h
@@ -68,6 +68,10 @@
   // whitelist of extensions that can script all pages.
   static bool CanExecuteScriptEverywhere(const Extension* extension);
 
+  // Returns true if we should skip the permisisons warning for the extension
+  // with the given |extension_id|.
+  static bool ShouldSkipPermissionWarnings(const std::string& extension_id);
+
   // Returns true if the given |url| is restricted for the given |extension|,
   // as is commonly the case for chrome:// urls.
   // NOTE: You probably want to use CanAccessPage().
diff --git a/extensions/strings/extensions_strings_da.xtb b/extensions/strings/extensions_strings_da.xtb
index 8d23df1..a1719ab 100644
--- a/extensions/strings/extensions_strings_da.xtb
+++ b/extensions/strings/extensions_strings_da.xtb
@@ -6,27 +6,27 @@
 <translation id="8978038008714088448">Læse og redigere dine data på <ph name="WEBSITE_1"/></translation>
 <translation id="4205302772098850608">Læse og redigere dine data på <ph name="WEBSITE_1"/>, <ph name="WEBSITE_2"/> og <ph name="WEBSITE_3"/></translation>
 <translation id="3828484226910527078">Få adgang til USB-enheden</translation>
-<translation id="6384275966486438344">Skift dine søgeindstillinger til: <ph name="SEARCH_HOST"/></translation>
-<translation id="5911798608827489036">Udveksl data med en computer på det lokale netværk eller internettet</translation>
+<translation id="6384275966486438344">Skifte dine søgeindstillinger til: <ph name="SEARCH_HOST"/></translation>
+<translation id="5911798608827489036">Udveksle data med en computer på det lokale netværk eller internettet</translation>
 <translation id="4719685943208231314">Få adgang til USB-enheden fra <ph name="VENDOR_NAME"/></translation>
 <translation id="657064425229075395">Baggrundsscriptet  &quot;<ph name="BACKGROUND_SCRIPT"/>&quot; kunne ikke indlæses.</translation>
-<translation id="8597109877291678953">Udveksl data med den computer, der er navngivet <ph name="HOSTNAME"/></translation>
+<translation id="8597109877291678953">Udveksle data med computeren ved navn <ph name="HOSTNAME"/></translation>
 <translation id="5456409301717116725">Denne udvidelse inkluderer nøglefilen &quot;<ph name="KEY_PATH"/>&quot;. Det ønsker du sandsynligvis ikke at gøre.</translation>
 <translation id="2350172092385603347">Lokalisering anvendt, men default_locale blev ikke angivet i manifestet.</translation>
 <translation id="8058376558882514200">Få adgang til USB-enheden <ph name="PRODUCT_NAME"/> fra <ph name="VENDOR_NAME"/></translation>
 <translation id="8774379383902544371">Få adgang til USB-enheder</translation>
 <translation id="149347756975725155">Udvidelsesikonet '<ph name="ICON"/>' kunne ikke indlæses.</translation>
 <translation id="6344170822609224263">Få adgang til listen over netværksforbindelser</translation>
-<translation id="2518849872271000461">Udveksl data med computerne, der er navngivet: <ph name="HOSTNAMES"/></translation>
+<translation id="2518849872271000461">Udveksle data med computerne ved navn: <ph name="HOSTNAMES"/></translation>
 <translation id="1389014510128217152">– <ph name="WEBSITE_1"/></translation>
-<translation id="961805664415579088">Udveksl data med en computer på domænet <ph name="DOMAIN"/></translation>
-<translation id="4968399700653439437">Udveksl data med en computer på domænerne: <ph name="DOMAINS"/></translation>
-<translation id="8662911384982557515">Skift din startside til: <ph name="HOME_PAGE"/></translation>
+<translation id="961805664415579088">Udveksle data med en computer på domænet <ph name="DOMAIN"/></translation>
+<translation id="4968399700653439437">Udveksle data med en computer på domænerne: <ph name="DOMAINS"/></translation>
+<translation id="8662911384982557515">Skifte din startside til: <ph name="HOME_PAGE"/></translation>
 <translation id="8114679593444120202">Læse og redigere dine data på <ph name="NUMBER_OF_WEBSITES"/> websites</translation>
 <translation id="8602184400052594090">Manifestfil mangler eller er ulæselig.</translation>
-<translation id="7893008570150657497">få adgang til billeder, musik og andre medier fra din computer</translation>
+<translation id="7893008570150657497">Få adgang til billeder, musik og andre medier fra din computer</translation>
 <translation id="7217838517480956708">Administratoren af denne computer kræver, at <ph name="EXTENSION_NAME"/> skal installeres. Den kan ikke fjernes eller ændres.</translation>
-<translation id="7154130902455071009">Skift din startside til: <ph name="START_PAGE"/></translation>
+<translation id="7154130902455071009">Skifte din startside til: <ph name="START_PAGE"/></translation>
 <translation id="6094507746643187368">Læse og redigere dine data på <ph name="WEBSITE_1"/> og <ph name="WEBSITE_2"/></translation>
 <translation id="1803557475693955505">Baggrundssiden '<ph name="BACKGROUND_PAGE"/>' kunne ikke indlæses.</translation>
 <translation id="8207052894957937969">Læse og redigere dine data på <ph name="NUMBER_OF_WEBSITES"/> websites</translation>
diff --git a/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java b/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java
index 8005ddc..cb03a56 100644
--- a/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java
+++ b/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java
@@ -664,6 +664,11 @@
             btAdapter = BluetoothAdapter.getDefaultAdapter();
         }
 
+        if (btAdapter == null) {
+            // Bluetooth not supported on this platform.
+            return false;
+        }
+
         int profileConnectionState;
         profileConnectionState = btAdapter.getProfileConnectionState(
                 android.bluetooth.BluetoothProfile.HEADSET);
diff --git a/media/cast/cast_defines.h b/media/cast/cast_defines.h
index 64b20c9..6e587ae 100644
--- a/media/cast/cast_defines.h
+++ b/media/cast/cast_defines.h
@@ -27,7 +27,7 @@
 // This is an important system-wide constant.  This limits how much history the
 // implementation must retain in order to process the acknowledgements of past
 // frames.
-const int kMaxUnackedFrames = 255;
+const int kMaxUnackedFrames = 60;
 
 const size_t kMaxIpPacketSize = 1500;
 const int kStartRttMs = 20;
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc
index f5b4fdd..62b39c1 100644
--- a/media/filters/ffmpeg_demuxer.cc
+++ b/media/filters/ffmpeg_demuxer.cc
@@ -67,6 +67,7 @@
       type_(UNKNOWN),
       end_of_stream_(false),
       last_packet_timestamp_(kNoTimestamp()),
+      last_packet_duration_(kNoTimestamp()),
       bitstream_converter_enabled_(false) {
   DCHECK(demuxer_);
 
@@ -230,13 +231,41 @@
       stream_->time_base, packet->pts));
   buffer->set_duration(ConvertStreamTimestamp(
       stream_->time_base, packet->duration));
-  if (buffer->timestamp() != kNoTimestamp() &&
-      last_packet_timestamp_ != kNoTimestamp() &&
-      last_packet_timestamp_ < buffer->timestamp()) {
-    buffered_ranges_.Add(last_packet_timestamp_, buffer->timestamp());
-    demuxer_->NotifyBufferingChanged();
+
+  if (last_packet_timestamp_ != kNoTimestamp()) {
+    // FFmpeg doesn't support chained ogg correctly.  Instead of guaranteeing
+    // continuity across links in the chain it uses the timestamp information
+    // from each link directly.  Doing so can lead to timestamps which appear to
+    // go backwards in time.
+    //
+    // If the new link starts with a negative timestamp or a timestamp less than
+    // the original (positive) |start_time|, we will get a negative timestamp
+    // here.  It's also possible FFmpeg returns kNoTimestamp() here if it's not
+    // able to work out a timestamp using the previous link and the next.
+    //
+    // Fixing chained ogg is non-trivial, so for now just reuse the last good
+    // timestamp.  The decoder will rewrite the timestamps to be sample accurate
+    // later.  See http://crbug.com/396864.
+    if (buffer->timestamp() == kNoTimestamp() ||
+        buffer->timestamp() < last_packet_timestamp_) {
+      buffer->set_timestamp(last_packet_timestamp_ +
+                            (last_packet_duration_ != kNoTimestamp()
+                                 ? last_packet_duration_
+                                 : base::TimeDelta::FromMicroseconds(1)));
+    }
+
+    // The demuxer should always output positive timestamps.
+    DCHECK(buffer->timestamp() >= base::TimeDelta());
+    DCHECK(buffer->timestamp() != kNoTimestamp());
+
+    if (last_packet_timestamp_ < buffer->timestamp()) {
+      buffered_ranges_.Add(last_packet_timestamp_, buffer->timestamp());
+      demuxer_->NotifyBufferingChanged();
+    }
   }
+
   last_packet_timestamp_ = buffer->timestamp();
+  last_packet_duration_ = buffer->duration();
 
   buffer_queue_.Push(buffer);
   SatisfyPendingRead();
@@ -254,6 +283,7 @@
   buffer_queue_.Clear();
   end_of_stream_ = false;
   last_packet_timestamp_ = kNoTimestamp();
+  last_packet_duration_ = kNoTimestamp();
 }
 
 void FFmpegDemuxerStream::Stop() {
diff --git a/media/filters/ffmpeg_demuxer.h b/media/filters/ffmpeg_demuxer.h
index 02682bb..d5cff8c 100644
--- a/media/filters/ffmpeg_demuxer.h
+++ b/media/filters/ffmpeg_demuxer.h
@@ -124,6 +124,7 @@
   base::TimeDelta duration_;
   bool end_of_stream_;
   base::TimeDelta last_packet_timestamp_;
+  base::TimeDelta last_packet_duration_;
   Ranges<base::TimeDelta> buffered_ranges_;
 
   DecoderBufferQueue buffer_queue_;
diff --git a/net/base/registry_controlled_domains/OWNERS b/net/base/registry_controlled_domains/OWNERS
index 9f8b179..2ba05a6 100644
--- a/net/base/registry_controlled_domains/OWNERS
+++ b/net/base/registry_controlled_domains/OWNERS
@@ -1,2 +1,3 @@
 pam@chromium.org
 pkasting@chromium.org
+rsleevi@chromium.org
diff --git a/net/base/registry_controlled_domains/effective_tld_names.dat b/net/base/registry_controlled_domains/effective_tld_names.dat
index 4a86643..19881bf 100644
--- a/net/base/registry_controlled_domains/effective_tld_names.dat
+++ b/net/base/registry_controlled_domains/effective_tld_names.dat
@@ -7992,6 +7992,171 @@
 // cern : 2014-06-05 European Organization for Nuclear Research ("CERN") 
 cern
 
+// healthcare : 2014-06-13 Silver Glen, LLC
+healthcare
+
+// xn--30rr7y : 2014-06-13 Excellent First Limited
+xn--30rr7y
+
+// band : 2014-06-13 Auburn Hollow, LLC
+band
+
+// xn--9et52u : 2014-06-13 RISE VICTORY LIMITED
+xn--9et52u
+
+// world : 2014-06-13 Bitter Fields, LLC
+world
+
+// latrobe : 2014-06-16 La Trobe University
+latrobe
+
+// bible : 2014-06-19 American Bible Society
+bible
+
+// java : 2014-06-19 Oracle Corporation
+java
+
+// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch
+sky
+
+// oracle : 2014-06-19 Oracle Corporation
+oracle
+
+// pharmacy : 2014-06-19 National Association of Boards of Pharmacy
+pharmacy
+
+// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
+dvag
+
+// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
+xn--vermgensberater-ctb
+
+// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
+xn--vermgensberatung-pwb
+
+// montblanc : 2014-06-23 Richemont DNS Inc.
+montblanc
+
+// iwc : 2014-06-23 Richemont DNS Inc.
+iwc
+
+// cartier : 2014-06-23 Richemont DNS Inc.
+cartier
+
+// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
+pohl
+
+// diet : 2014-06-26 Uniregistry, Corp.
+diet
+
+// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA
+cba
+
+// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA
+netbank
+
+// pictet : 2014-06-26 Pictet Europe S.A.
+pictet
+
+// help : 2014-06-26 Uniregistry, Corp.
+help
+
+// pizza : 2014-06-26 Foggy Moon, LLC
+pizza
+
+// garden : 2014-06-26 Top Level Domain Holdings Limited
+garden
+
+// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA
+commbank
+
+// gifts : 2014-07-03 Goose Sky, LLC
+gifts
+
+// fashion : 2014-07-03 Top Level Domain Holdings Limited
+fashion
+
+// tui : 2014-07-03 TUI AG
+tui
+
+// iinet : 2014-07-03 Connect West Pty. Ltd.
+iinet
+
+// restaurant : 2014-07-03 Snow Avenue, LLC
+restaurant
+
+// alsace : 2014-07-02 REGION D ALSACE
+alsace
+
+// poker : 2014-07-03 Afilias Domains No. 5 Limited
+poker
+
+// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft
+allfinanz
+
+// sarl : 2014-07-03 Delta Orchard, LLC
+sarl
+
+// taipei : 2014-07-10 Taipei City Government
+taipei
+
+// immo : 2014-07-10 Auburn Bloom, LLC
+immo
+
+// hermes : 2014-07-10 HERMES INTERNATIONAL
+hermes
+
+// rip : 2014-07-10 United TLD Holdco Ltd.
+rip
+
+// gbiz : 2014-07-17 Charleston Road Registry Inc.
+gbiz
+
+// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC
+bloomberg
+
+// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG
+sew
+
+// prof : 2014-07-24 Charleston Road Registry Inc.
+prof
+
+// gle : 2014-07-24 Charleston Road Registry Inc.
+gle
+
+// amsterdam : 2014-07-24 Gemeente Amsterdam
+amsterdam
+
+// aquarelle : 2014-07-24 Aquarelle.com
+aquarelle
+
+// nexus : 2014-07-24 Charleston Road Registry Inc.
+nexus
+
+// flsmidth : 2014-07-24 FLSmidth A/S
+flsmidth
+
+// bnl : 2014-07-24 Banca Nazionale del Lavoro
+bnl
+
+// bcn : 2014-07-24 Municipi de Barcelona
+bcn
+
+// chrome : 2014-07-24 Charleston Road Registry Inc.
+chrome
+
+// google : 2014-07-24 Charleston Road Registry Inc.
+google
+
+// barcelona : 2014-07-24 Municipi de Barcelona
+barcelona
+
+// cal : 2014-07-24 Charleston Road Registry Inc.
+cal
+
+// abbott : 2014-07-24 Abbott Laboratories, Inc.
+abbott
+
 // ===END ICANN DOMAINS===
 // ===BEGIN PRIVATE DOMAINS===
 
diff --git a/net/base/registry_controlled_domains/effective_tld_names.gperf b/net/base/registry_controlled_domains/effective_tld_names.gperf
index 6bee195..f131a98 100644
--- a/net/base/registry_controlled_domains/effective_tld_names.gperf
+++ b/net/base/registry_controlled_domains/effective_tld_names.gperf
@@ -31,6 +31,7 @@
 aarborte.no, 0
 ab.ca, 0
 abashiri.hokkaido.jp, 0
+abbott, 0
 abeno.osaka.jp, 0
 abiko.chiba.jp, 0
 abira.hokkaido.jp, 0
@@ -169,6 +170,8 @@
 alessandria.it, 0
 alesund.no, 0
 algard.no, 0
+allfinanz, 0
+alsace, 0
 alstahaug.no, 0
 alta.no, 0
 altai.ru, 0
@@ -192,6 +195,7 @@
 ami.ibaraki.jp, 0
 amli.no, 0
 amot.no, 0
+amsterdam, 0
 amsterdam.museum, 0
 amur.ru, 0
 amursk.ru, 0
@@ -236,6 +240,7 @@
 appspot.com, 4
 aq, 0
 aq.it, 0
+aquarelle, 0
 aquarium.museum, 0
 aquila.it, 0
 ar, 0
@@ -410,10 +415,12 @@
 balsfjord.no, 0
 baltimore.museum, 0
 bamble.no, 0
+band, 0
 bandai.fukushima.jp, 0
 bando.ibaraki.jp, 0
 bar, 0
 bar.pro, 0
+barcelona, 0
 barcelona.museum, 0
 bardu.no, 0
 bargains, 0
@@ -437,6 +444,7 @@
 bayern, 0
 bb, 0
 bc.ca, 0
+bcn, 0
 bd, 2
 bd.se, 0
 be, 0
@@ -475,6 +483,7 @@
 bialowieza.pl, 0
 bialystok.pl, 0
 bibai.hokkaido.jp, 0
+bible, 0
 bible.museum, 0
 bid, 0
 biei.hokkaido.jp, 0
@@ -564,11 +573,13 @@
 blogspot.sk, 4
 blogspot.td, 4
 blogspot.tw, 4
+bloomberg, 0
 blue, 0
 bm, 0
 bmd.br, 0
 bn, 2
 bn.it, 0
+bnl, 0
 bnpparibas, 0
 bo, 0
 bo.it, 0
@@ -662,6 +673,7 @@
 cadaques.museum, 0
 cagliari.it, 0
 cahcesuolo.no, 0
+cal, 0
 cal.it, 0
 calabria.it, 0
 california.museum, 0
@@ -690,6 +702,7 @@
 carrara-massa.it, 0
 carraramassa.it, 0
 carrier.museum, 0
+cartier, 0
 cartoonart.museum, 0
 casa, 0
 casadelamoneda.museum, 0
@@ -704,6 +717,7 @@
 catering, 0
 catering.aero, 0
 cb.it, 0
+cba, 0
 cbg.ru, 0
 cc, 0
 cc.ak.us, 0
@@ -831,6 +845,7 @@
 choyo.kumamoto.jp, 0
 christiansburg.museum, 0
 christmas, 0
+chrome, 0
 chtr.k12.ma.us, 0
 chukotka.ru, 0
 chungbuk.kr, 0
@@ -1086,6 +1101,7 @@
 com.vn, 0
 com.vu, 0
 com.ws, 0
+commbank, 0
 communication.museum, 0
 communications.museum, 0
 community, 0
@@ -1221,6 +1237,7 @@
 dgca.aero, 0
 diamonds, 0
 dielddanuorri.no, 0
+diet, 0
 digital, 0
 dinosaur.museum, 0
 direct, 0
@@ -1271,6 +1288,7 @@
 dudinka.ru, 0
 durban, 0
 durham.museum, 0
+dvag, 0
 dvrdns.org, 4
 dyn-o-saur.com, 4
 dynalias.com, 4
@@ -1552,6 +1570,7 @@
 farmers.museum, 0
 farmstead.museum, 0
 farsund.no, 0
+fashion, 0
 fauske.no, 0
 fc.it, 0
 fe.it, 0
@@ -1618,6 +1637,7 @@
 florida.museum, 0
 florist, 0
 floro.no, 0
+flsmidth, 0
 fly, 0
 fm, 0
 fm.br, 0
@@ -1816,6 +1836,7 @@
 gamvik.no, 0
 gangaviika.no, 0
 gangwon.kr, 0
+garden, 0
 garden.museum, 0
 gateway.museum, 0
 gaular.no, 0
@@ -1823,6 +1844,7 @@
 gb, 0
 gb.com, 4
 gb.net, 4
+gbiz, 0
 gc.ca, 0
 gd, 0
 gd.cn, 0
@@ -1855,6 +1877,7 @@
 giehtavuoatna.no, 0
 giessen.museum, 0
 gift, 0
+gifts, 0
 gifu.gifu.jp, 0
 gifu.jp, 0
 gildeskal.no, 0
@@ -1874,6 +1897,7 @@
 glas.museum, 0
 glass, 0
 glass.museum, 0
+gle, 0
 gliding.aero, 0
 gliwice.pl, 0
 global, 0
@@ -1922,6 +1946,7 @@
 gol.no, 0
 gon.pk, 0
 gonohe.aomori.jp, 0
+google, 0
 googleapis.com, 4
 googlecode.com, 4
 gop, 0
@@ -2215,10 +2240,12 @@
 health.museum, 0
 health.nz, 0
 health.vn, 0
+healthcare, 0
 heguri.nara.jp, 0
 heimatunduhren.museum, 0
 hekinan.aichi.jp, 0
 hellas.museum, 0
+help, 0
 helsinki.museum, 0
 hembygdsforbund.museum, 0
 hemne.no, 0
@@ -2228,6 +2255,7 @@
 here, 0
 here-for-more.info, 4
 heritage.museum, 0
+hermes, 0
 herokuapp.com, 4
 herokussl.com, 4
 heroy.more-og-romsdal.no, 0
@@ -2430,6 +2458,7 @@
 iida.nagano.jp, 0
 iide.yamagata.jp, 0
 iijima.nagano.jp, 0
+iinet, 0
 iitate.fukushima.jp, 0
 iiyama.nagano.jp, 0
 iizuka.fukuoka.jp, 0
@@ -2458,6 +2487,7 @@
 imari.saga.jp, 0
 imb.br, 0
 imizu.toyama.jp, 0
+immo, 0
 immobilien, 0
 imperia.it, 0
 in, 0
@@ -2697,6 +2727,7 @@
 iwate.iwate.jp, 0
 iwate.jp, 0
 iwatsuki.saitama.jp, 0
+iwc, 0
 iwi.nz, 0
 iyo.ehime.jp, 0
 iz.hr, 0
@@ -2716,6 +2747,7 @@
 jamison.museum, 0
 jan-mayen.no, 0
 jar.ru, 0
+java, 0
 jaworzno.pl, 0
 je, 0
 jefferson.museum, 0
@@ -3249,6 +3281,7 @@
 larvik.no, 0
 laspezia.it, 0
 latina.it, 0
+latrobe, 0
 lavagis.no, 0
 lavangen.no, 0
 law.pro, 0
@@ -3772,6 +3805,7 @@
 monash, 0
 money.museum, 0
 monmouth.museum, 0
+montblanc, 0
 monticello.museum, 0
 montreal.museum, 0
 monza-brianza.it, 0
@@ -4132,6 +4166,7 @@
 net.vn, 0
 net.vu, 0
 net.ws, 0
+netbank, 0
 network, 0
 neues.museum, 0
 neustar, 0
@@ -4143,6 +4178,7 @@
 news.hu, 0
 newspaper.museum, 0
 newyork.museum, 0
+nexus, 0
 neyagawa.osaka.jp, 0
 nf, 0
 nf.ca, 0
@@ -4446,6 +4482,7 @@
 or.ug, 0
 or.us, 0
 ora.gunma.jp, 0
+oracle, 0
 oregon.museum, 0
 oregontrail.museum, 0
 orenburg.ru, 0
@@ -4709,6 +4746,7 @@
 ph, 0
 pharmacien.fr, 0
 pharmaciens.km, 0
+pharmacy, 0
 pharmacy.museum, 0
 philadelphia.museum, 0
 philadelphiaarea.museum, 0
@@ -4722,6 +4760,7 @@
 pi.it, 0
 piacenza.it, 0
 pics, 0
+pictet, 0
 pictures, 0
 piedmont.it, 0
 piemonte.it, 0
@@ -4734,6 +4773,7 @@
 pistoia.it, 0
 pisz.pl, 0
 pittsburgh.museum, 0
+pizza, 0
 pk, 0
 pl, 0
 pl.ua, 0
@@ -4757,6 +4797,8 @@
 podlasie.pl, 0
 podzone.net, 4
 podzone.org, 4
+pohl, 0
+poker, 0
 pol.dz, 0
 pol.ht, 0
 police.uk, 0
@@ -4823,6 +4865,7 @@
 prod, 0
 production.aero, 0
 productions, 0
+prof, 0
 prof.pr, 0
 project.museum, 0
 properties, 0
@@ -4928,6 +4971,7 @@
 research.museum, 0
 resistance.museum, 0
 rest, 0
+restaurant, 0
 reviews, 0
 rg.it, 0
 rhcloud.com, 4
@@ -4946,6 +4990,7 @@
 ringsaker.no, 0
 rio, 0
 riodejaneiro.museum, 0
+rip, 0
 rishiri.hokkaido.jp, 0
 rishirifuji.hokkaido.jp, 0
 risor.no, 0
@@ -5107,6 +5152,7 @@
 saratov.ru, 0
 sardegna.it, 0
 sardinia.it, 0
+sarl, 0
 saroma.hokkaido.jp, 0
 sarpsborg.no, 0
 sarufutsu.hokkaido.jp, 0
@@ -5226,6 +5272,7 @@
 settlers.museum, 0
 settsu.osaka.jp, 0
 sevastopol.ua, 0
+sew, 0
 sex.hu, 0
 sex.pl, 0
 sexy, 0
@@ -5373,6 +5420,7 @@
 skoczow.pl, 0
 skodje.no, 0
 skole.museum, 0
+sky, 0
 skydiving.aero, 0
 sl, 0
 slask.pl, 0
@@ -5577,6 +5625,7 @@
 taiki.hokkaido.jp, 0
 taiki.mie.jp, 0
 tainai.niigata.jp, 0
+taipei, 0
 taira.toyama.jp, 0
 taishi.hyogo.jp, 0
 taishi.osaka.jp, 0
@@ -5915,6 +5964,7 @@
 tsuyama.okayama.jp, 0
 tt, 0
 tt.im, 0
+tui, 0
 tula.ru, 0
 tur.ar, 0
 tur.br, 0
@@ -6257,6 +6307,7 @@
 works, 0
 works.aero, 0
 workshop.museum, 0
+world, 0
 worse-than.tv, 4
 writesthisblog.com, 4
 wroc.pl, 0
@@ -6273,6 +6324,7 @@
 x.se, 0
 xj.cn, 0
 xn--1qqw23a, 0
+xn--30rr7y, 0
 xn--3bst00m, 0
 xn--3ds443g, 0
 xn--3e0b707e, 0
@@ -6294,6 +6346,7 @@
 xn--90a3ac, 0
 xn--90azh.xn--90a3ac, 0
 xn--9dbhblg6di.museum, 0
+xn--9et52u, 0
 xn--andy-ira.no, 0
 xn--aroport-bya.ci, 0
 xn--asky-ira.no, 0
@@ -6539,6 +6592,8 @@
 xn--vads-jra.no, 0
 xn--vard-jra.no, 0
 xn--vegrshei-c0a.no, 0
+xn--vermgensberater-ctb, 0
+xn--vermgensberatung-pwb, 0
 xn--vestvgy-ixa6o.no, 0
 xn--vg-yiab.no, 0
 xn--vgan-qoa.no, 0
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index b4e373e..75c8ee4 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -117,6 +117,7 @@
                                net::ClientSocketFactory::GetDefaultFactory(),
                            params.http_server_properties,
                            params.cert_verifier,
+                           params.transport_security_state,
                            params.quic_crypto_client_stream_factory,
                            params.quic_random ? params.quic_random :
                                QuicRandom::GetInstance(),
diff --git a/net/http/http_stream_factory_impl_job.cc b/net/http/http_stream_factory_impl_job.cc
index 79a9536..1d8237c 100644
--- a/net/http/http_stream_factory_impl_job.cc
+++ b/net/http/http_stream_factory_impl_job.cc
@@ -1124,13 +1124,14 @@
   // HttpStreamFactoryImpl will be creating all the SpdyHttpStreams, since it
   // will know when SpdySessions become available.
 
-  if (stream_factory_->for_websockets_) {
-    // TODO(ricea): Restore this code when WebSockets over SPDY is implemented.
-    NOTREACHED();
-  } else {
-    bool use_relative_url = direct || request_info_.url.SchemeIs("https");
-    stream_.reset(new SpdyHttpStream(spdy_session, use_relative_url));
-  }
+  // TODO(ricea): Restore the code for WebSockets over SPDY once it's
+  // implemented.
+  if (stream_factory_->for_websockets_)
+    return ERR_NOT_IMPLEMENTED;
+
+  bool use_relative_url = direct || request_info_.url.SchemeIs("https");
+  stream_.reset(new SpdyHttpStream(spdy_session, use_relative_url));
+
   return OK;
 }
 
diff --git a/net/quic/crypto/proof_verifier_chromium.cc b/net/quic/crypto/proof_verifier_chromium.cc
index 4b118da..a1365c5 100644
--- a/net/quic/crypto/proof_verifier_chromium.cc
+++ b/net/quic/crypto/proof_verifier_chromium.cc
@@ -9,6 +9,7 @@
 #include "base/callback_helpers.h"
 #include "base/compiler_specific.h"
 #include "base/logging.h"
+#include "base/metrics/histogram.h"
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
 #include "crypto/signature_verifier.h"
@@ -21,6 +22,7 @@
 #include "net/cert/single_request_cert_verifier.h"
 #include "net/cert/x509_certificate.h"
 #include "net/cert/x509_util.h"
+#include "net/http/transport_security_state.h"
 #include "net/quic/crypto/crypto_protocol.h"
 #include "net/ssl/ssl_config_service.h"
 
@@ -38,6 +40,7 @@
  public:
   Job(ProofVerifierChromium* proof_verifier,
       CertVerifier* cert_verifier,
+      TransportSecurityState* transport_security_state,
       const BoundNetLog& net_log);
 
   // Starts the proof verification.  If |QUIC_PENDING| is returned, then
@@ -72,6 +75,8 @@
   // The underlying verifier used for verifying certificates.
   scoped_ptr<SingleRequestCertVerifier> verifier_;
 
+  TransportSecurityState* transport_security_state_;
+
   // |hostname| specifies the hostname for which |certs| is a valid chain.
   std::string hostname_;
 
@@ -89,11 +94,14 @@
   DISALLOW_COPY_AND_ASSIGN(Job);
 };
 
-ProofVerifierChromium::Job::Job(ProofVerifierChromium* proof_verifier,
-                                CertVerifier* cert_verifier,
-                                const BoundNetLog& net_log)
+ProofVerifierChromium::Job::Job(
+    ProofVerifierChromium* proof_verifier,
+    CertVerifier* cert_verifier,
+    TransportSecurityState* transport_security_state,
+    const BoundNetLog& net_log)
     : proof_verifier_(proof_verifier),
       verifier_(new SingleRequestCertVerifier(cert_verifier)),
+      transport_security_state_(transport_security_state),
       next_state_(STATE_NONE),
       net_log_(net_log) {
 }
@@ -222,6 +230,59 @@
 int ProofVerifierChromium::Job::DoVerifyCertComplete(int result) {
   verifier_.reset();
 
+#if defined(OFFICIAL_BUILD) && !defined(OS_ANDROID) && !defined(OS_IOS)
+  // TODO(wtc): The following code was copied from ssl_client_socket_nss.cc.
+  // Convert it to a new function that can be called by both files. These
+  // variables simulate the arguments to the new function.
+  const CertVerifyResult& cert_verify_result =
+      verify_details_->cert_verify_result;
+  bool sni_available = true;
+  const std::string& host = hostname_;
+  TransportSecurityState* transport_security_state = transport_security_state_;
+  std::string* pinning_failure_log = &verify_details_->pinning_failure_log;
+
+  // Take care of any mandates for public key pinning.
+  //
+  // Pinning is only enabled for official builds to make sure that others don't
+  // end up with pins that cannot be easily updated.
+  //
+  // TODO(agl): We might have an issue here where a request for foo.example.com
+  // merges into a SPDY connection to www.example.com, and gets a different
+  // certificate.
+
+  // Perform pin validation if, and only if, all these conditions obtain:
+  //
+  // * a TransportSecurityState object is available;
+  // * the server's certificate chain is valid (or suffers from only a minor
+  //   error);
+  // * the server's certificate chain chains up to a known root (i.e. not a
+  //   user-installed trust anchor); and
+  // * the build is recent (very old builds should fail open so that users
+  //   have some chance to recover).
+  //
+  const CertStatus cert_status = cert_verify_result.cert_status;
+  if (transport_security_state &&
+      (result == OK ||
+       (IsCertificateError(result) && IsCertStatusMinorError(cert_status))) &&
+      cert_verify_result.is_issued_by_known_root &&
+      TransportSecurityState::IsBuildTimely()) {
+    if (transport_security_state->HasPublicKeyPins(host, sni_available)) {
+      if (!transport_security_state->CheckPublicKeyPins(
+              host,
+              sni_available,
+              cert_verify_result.public_key_hashes,
+              pinning_failure_log)) {
+        LOG(ERROR) << *pinning_failure_log;
+        result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
+        UMA_HISTOGRAM_BOOLEAN("Net.PublicKeyPinSuccess", false);
+        TransportSecurityState::ReportUMAOnPinFailure(host);
+      } else {
+        UMA_HISTOGRAM_BOOLEAN("Net.PublicKeyPinSuccess", true);
+      }
+    }
+  }
+#endif
+
   if (result <= ERR_FAILED) {
     error_details_ = StringPrintf("Failed to verify certificate chain: %s",
                                   ErrorToString(result));
@@ -310,8 +371,12 @@
   return true;
 }
 
-ProofVerifierChromium::ProofVerifierChromium(CertVerifier* cert_verifier)
-    : cert_verifier_(cert_verifier) {}
+ProofVerifierChromium::ProofVerifierChromium(
+    CertVerifier* cert_verifier,
+    TransportSecurityState* transport_security_state)
+    : cert_verifier_(cert_verifier),
+      transport_security_state_(transport_security_state) {
+}
 
 ProofVerifierChromium::~ProofVerifierChromium() {
   STLDeleteElements(&active_jobs_);
@@ -332,7 +397,10 @@
   }
   const ProofVerifyContextChromium* chromium_context =
       reinterpret_cast<const ProofVerifyContextChromium*>(verify_context);
-  scoped_ptr<Job> job(new Job(this, cert_verifier_, chromium_context->net_log));
+  scoped_ptr<Job> job(new Job(this,
+                              cert_verifier_,
+                              transport_security_state_,
+                              chromium_context->net_log));
   QuicAsyncStatus status = job->VerifyProof(hostname, server_config, certs,
                                             signature, error_details,
                                             verify_details, callback);
diff --git a/net/quic/crypto/proof_verifier_chromium.h b/net/quic/crypto/proof_verifier_chromium.h
index 6f8a231..46632fb 100644
--- a/net/quic/crypto/proof_verifier_chromium.h
+++ b/net/quic/crypto/proof_verifier_chromium.h
@@ -22,12 +22,18 @@
 
 class CertVerifier;
 class SingleRequestCertVerifier;
+class TransportSecurityState;
 
 // ProofVerifyDetailsChromium is the implementation-specific information that a
 // ProofVerifierChromium returns about a certificate verification.
 struct ProofVerifyDetailsChromium : public ProofVerifyDetails {
  public:
   CertVerifyResult cert_verify_result;
+
+  // pinning_failure_log contains a message produced by
+  // TransportSecurityState::DomainState::CheckPublicKeyPins in the event of a
+  // pinning failure. It is a (somewhat) human-readable string.
+  std::string pinning_failure_log;
 };
 
 // ProofVerifyContextChromium is the implementation-specific information that a
@@ -44,7 +50,8 @@
 // capable of handling multiple simultaneous requests.
 class NET_EXPORT_PRIVATE ProofVerifierChromium : public ProofVerifier {
  public:
-  explicit ProofVerifierChromium(CertVerifier* cert_verifier);
+  ProofVerifierChromium(CertVerifier* cert_verifier,
+                        TransportSecurityState* transport_security_state);
   virtual ~ProofVerifierChromium();
 
   // ProofVerifier interface
@@ -70,6 +77,8 @@
   // Underlying verifier used to verify certificates.
   CertVerifier* const cert_verifier_;
 
+  TransportSecurityState* transport_security_state_;
+
   DISALLOW_COPY_AND_ASSIGN(ProofVerifierChromium);
 };
 
diff --git a/net/quic/quic_client_session.cc b/net/quic/quic_client_session.cc
index 745692c..40b22cd 100644
--- a/net/quic/quic_client_session.cc
+++ b/net/quic/quic_client_session.cc
@@ -427,6 +427,7 @@
   ssl_info->channel_id_sent = false;
   ssl_info->security_bits = security_bits;
   ssl_info->handshake_type = SSLInfo::HANDSHAKE_FULL;
+  ssl_info->pinning_failure_log = pinning_failure_log_;
   return true;
 }
 
@@ -654,12 +655,12 @@
 
 void QuicClientSession::OnProofVerifyDetailsAvailable(
     const ProofVerifyDetails& verify_details) {
-  const CertVerifyResult* cert_verify_result_other =
-      &(reinterpret_cast<const ProofVerifyDetailsChromium*>(
-          &verify_details))->cert_verify_result;
+  const ProofVerifyDetailsChromium* verify_details_chromium =
+      reinterpret_cast<const ProofVerifyDetailsChromium*>(&verify_details);
   CertVerifyResult* result_copy = new CertVerifyResult;
-  result_copy->CopyFrom(*cert_verify_result_other);
+  result_copy->CopyFrom(verify_details_chromium->cert_verify_result);
   cert_verify_result_.reset(result_copy);
+  pinning_failure_log_ = verify_details_chromium->pinning_failure_log;
 }
 
 void QuicClientSession::StartReading() {
diff --git a/net/quic/quic_client_session.h b/net/quic/quic_client_session.h
index 7fbe3db..29281b0 100644
--- a/net/quic/quic_client_session.h
+++ b/net/quic/quic_client_session.h
@@ -227,6 +227,7 @@
   scoped_refptr<IOBufferWithSize> read_buffer_;
   scoped_ptr<QuicServerInfo> server_info_;
   scoped_ptr<CertVerifyResult> cert_verify_result_;
+  std::string pinning_failure_log_;
   ObserverSet observers_;
   StreamRequestQueue stream_requests_;
   bool read_pending_;
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc
index 2fc1b9e..5462d2a 100644
--- a/net/quic/quic_stream_factory.cc
+++ b/net/quic/quic_stream_factory.cc
@@ -450,6 +450,7 @@
     ClientSocketFactory* client_socket_factory,
     base::WeakPtr<HttpServerProperties> http_server_properties,
     CertVerifier* cert_verifier,
+    TransportSecurityState* transport_security_state,
     QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory,
     QuicRandom* random_generator,
     QuicClock* clock,
@@ -479,7 +480,8 @@
   crypto_config_.set_user_agent_id(user_agent_id);
   crypto_config_.AddCanonicalSuffix(".c.youtube.com");
   crypto_config_.AddCanonicalSuffix(".googlevideo.com");
-  crypto_config_.SetProofVerifier(new ProofVerifierChromium(cert_verifier));
+  crypto_config_.SetProofVerifier(
+      new ProofVerifierChromium(cert_verifier, transport_security_state));
   base::CPU cpu;
   if (cpu.has_aesni() && cpu.has_avx())
     crypto_config_.PreferAesGcm();
diff --git a/net/quic/quic_stream_factory.h b/net/quic/quic_stream_factory.h
index eb82659..b0280e2 100644
--- a/net/quic/quic_stream_factory.h
+++ b/net/quic/quic_stream_factory.h
@@ -38,6 +38,7 @@
 class QuicServerInfoFactory;
 class QuicServerId;
 class QuicStreamFactory;
+class TransportSecurityState;
 
 namespace test {
 class QuicStreamFactoryPeer;
@@ -91,6 +92,7 @@
       ClientSocketFactory* client_socket_factory,
       base::WeakPtr<HttpServerProperties> http_server_properties,
       CertVerifier* cert_verifier,
+      TransportSecurityState* transport_security_state,
       QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory,
       QuicRandom* random_generator,
       QuicClock* clock,
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
index e88ea4b..ff8e4ce 100644
--- a/net/quic/quic_stream_factory_test.cc
+++ b/net/quic/quic_stream_factory_test.cc
@@ -12,6 +12,7 @@
 #include "net/http/http_response_headers.h"
 #include "net/http/http_response_info.h"
 #include "net/http/http_util.h"
+#include "net/http/transport_security_state.h"
 #include "net/quic/crypto/crypto_handshake.h"
 #include "net/quic/crypto/proof_verifier_chromium.h"
 #include "net/quic/crypto/quic_decrypter.h"
@@ -91,6 +92,7 @@
         cert_verifier_(CertVerifier::CreateDefault()),
         factory_(&host_resolver_, &socket_factory_,
                  base::WeakPtr<HttpServerProperties>(), cert_verifier_.get(),
+                 &transport_security_state_,
                  &crypto_client_stream_factory_, &random_generator_, clock_,
                  kDefaultMaxPacketSize, std::string(),
                  SupportedVersions(GetParam()), true, true, true),
@@ -181,6 +183,7 @@
   QuicTestPacketMaker maker_;
   MockClock* clock_;  // Owned by factory_.
   scoped_ptr<CertVerifier> cert_verifier_;
+  TransportSecurityState transport_security_state_;
   QuicStreamFactory factory_;
   HostPortPair host_port_pair_;
   bool is_https_;
diff --git a/net/quic/test_tools/crypto_test_utils_chromium.cc b/net/quic/test_tools/crypto_test_utils_chromium.cc
index 9deee83..a3c85fb 100644
--- a/net/quic/test_tools/crypto_test_utils_chromium.cc
+++ b/net/quic/test_tools/crypto_test_utils_chromium.cc
@@ -10,6 +10,7 @@
 #include "net/cert/cert_verifier.h"
 #include "net/cert/test_root_certs.h"
 #include "net/cert/x509_certificate.h"
+#include "net/http/transport_security_state.h"
 #include "net/quic/crypto/proof_source_chromium.h"
 #include "net/quic/crypto/proof_verifier_chromium.h"
 #include "net/test/cert_test_util.h"
@@ -21,9 +22,11 @@
 class TestProofVerifierChromium : public ProofVerifierChromium {
  public:
   TestProofVerifierChromium(CertVerifier* cert_verifier,
+                            TransportSecurityState* transport_security_state,
                             const std::string& cert_file)
-      : ProofVerifierChromium(cert_verifier),
-        cert_verifier_(cert_verifier) {
+      : ProofVerifierChromium(cert_verifier, transport_security_state),
+        cert_verifier_(cert_verifier),
+        transport_security_state_(transport_security_state) {
     // Load and install the root for the validated chain.
     scoped_refptr<X509Certificate> root_cert =
         ImportCertFromFile(GetTestCertsDirectory(), cert_file);
@@ -34,6 +37,7 @@
  private:
   ScopedTestRoot scoped_root_;
   scoped_ptr<CertVerifier> cert_verifier_;
+  scoped_ptr<TransportSecurityState> transport_security_state_;
 };
 
 // static
@@ -43,8 +47,10 @@
 
 // static
 ProofVerifier* CryptoTestUtils::ProofVerifierForTesting() {
-  TestProofVerifierChromium* proof_verifier = new TestProofVerifierChromium(
-      CertVerifier::CreateDefault(), "quic_root.crt");
+  TestProofVerifierChromium* proof_verifier =
+      new TestProofVerifierChromium(CertVerifier::CreateDefault(),
+                                    new TransportSecurityState,
+                                    "quic_root.crt");
   return proof_verifier;
 }
 
diff --git a/pdf/instance.cc b/pdf/instance.cc
index 5c71bbf..8cd41df 100644
--- a/pdf/instance.cc
+++ b/pdf/instance.cc
@@ -958,11 +958,6 @@
   DCHECK(!image_data_.is_null());
   widget->Paint(location_dip, &image_data_);
 
-  // Re-scale the rectangle from DIPs to device pixels, so we ensure that we
-  // don't miss any pixels due to rounding outwards in ScaleRect.
-  location = location_dip;
-  ScaleRect(device_scale_, &location);
-
   ready->push_back(PaintManager::ReadyRect(location, image_data_, true));
 }
 
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 e461fd9..fdf26f9 100644
--- a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
+++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
@@ -20,6 +20,7 @@
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/display.h"
 #include "ui/gfx/point_conversions.h"
+#include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/screen.h"
 #include "ui/gfx/size_conversions.h"
 #include "ui/native_theme/native_theme.h"
@@ -709,9 +710,8 @@
     scale = gfx::Screen::GetScreenFor(root)->
         GetDisplayNearestWindow(root).device_scale_factor();
   }
-  gfx::Rect bounds_in_pixels(
-      gfx::ToCeiledPoint(gfx::ScalePoint(bounds.origin(), scale)),
-      gfx::ToFlooredSize(gfx::ScaleSize(bounds.size(), scale)));
+  gfx::Rect bounds_in_pixels =
+    gfx::ScaleToEnclosingRect(bounds, scale, scale);
   desktop_window_tree_host_->AsWindowTreeHost()->SetBounds(bounds_in_pixels);
 }