diff --git a/DEPS b/DEPS
index 7452e52d9..8658fc0 100644
--- a/DEPS
+++ b/DEPS
@@ -40,11 +40,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': 'a3091099fa19da32e60433c0da835e9de3dd8ee9',
+  'skia_revision': 'edee1ae9e3b87983ed0ff0ea55b3c49892901260',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': 'f42bac69be04b747319e124cece6d277b9d38a67',
+  'v8_revision': 'b7babbd9977c15a991c601eec24fb33e67177bd0',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
diff --git a/chrome/browser/apps/app_browsertest.cc b/chrome/browser/apps/app_browsertest.cc
index 36b4e308..828ce31 100644
--- a/chrome/browser/apps/app_browsertest.cc
+++ b/chrome/browser/apps/app_browsertest.cc
@@ -1131,8 +1131,10 @@
 
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
 
+// Disabled due to flakiness. See crbug.com/693305.
+// TODO(rbpotter): Investigate and re-enable this test.
 IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
-                       WindowDotPrintShouldBringUpPrintPreview) {
+                       DISABLED_WindowDotPrintShouldBringUpPrintPreview) {
   ScopedPreviewTestingDelegate preview_delegate;
   ASSERT_TRUE(RunPlatformAppTest("platform_apps/print_api")) << message_;
   preview_delegate.WaitUntilPreviewIsReady();
diff --git a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.cc b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.cc
index 34b7652..6b79bca 100644
--- a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.cc
+++ b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.cc
@@ -49,8 +49,8 @@
 QuickUnlockModeList ComputeActiveModes(Profile* profile) {
   QuickUnlockModeList modes;
 
-  chromeos::PinStorage* pin_storage =
-      chromeos::PinStorageFactory::GetForProfile(profile);
+  chromeos::quick_unlock::PinStorage* pin_storage =
+      chromeos::quick_unlock::PinStorageFactory::GetForProfile(profile);
   if (pin_storage && pin_storage->IsPinSet())
     modes.push_back(quick_unlock_private::QUICK_UNLOCK_MODE_PIN);
 
@@ -400,8 +400,8 @@
   // Apply changes.
   if (update_pin) {
     Profile* profile = chrome_details_.GetProfile();
-    chromeos::PinStorage* pin_storage =
-        chromeos::PinStorageFactory::GetForProfile(profile);
+    chromeos::quick_unlock::PinStorage* pin_storage =
+        chromeos::quick_unlock::PinStorageFactory::GetForProfile(profile);
 
     if (pin_credential.empty()) {
       pin_storage->RemovePin();
diff --git a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc
index f628dad..67d2d5ae4 100644
--- a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc
+++ b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc
@@ -38,15 +38,14 @@
 const char* kValidPassword = "valid";
 const char* kInvalidPassword = "invalid";
 
-chromeos::ExtendedAuthenticator* CreateFakeAuthenticator(
-    chromeos::AuthStatusConsumer* auth_status_consumer) {
+ExtendedAuthenticator* CreateFakeAuthenticator(
+    AuthStatusConsumer* auth_status_consumer) {
   AccountId account_id = AccountId::FromUserEmail(kTestUserEmail);
-  chromeos::UserContext expected_context(account_id);
+  UserContext expected_context(account_id);
   expected_context.SetKey(Key(kValidPassword));
 
-  chromeos::ExtendedAuthenticator* authenticator =
-      new chromeos::FakeExtendedAuthenticator(auth_status_consumer,
-                                              expected_context);
+  ExtendedAuthenticator* authenticator =
+      new FakeExtendedAuthenticator(auth_status_consumer, expected_context);
   return authenticator;
 }
 
@@ -77,7 +76,7 @@
   void SetUp() override {
     ExtensionApiUnittest::SetUp();
 
-    EnableQuickUnlockForTesting();
+    quick_unlock::EnableForTesting();
 
     // Setup a primary user.
     auto test_account = AccountId::FromUserEmail(kTestUserEmail);
@@ -355,7 +354,8 @@
 // Ensures that quick unlock can be enabled and disabled by checking the result
 // of quickUnlockPrivate.GetActiveModes and PinStorage::IsPinSet.
 TEST_F(QuickUnlockPrivateUnitTest, SetModesAndGetActiveModes) {
-  PinStorage* pin_storage = PinStorageFactory::GetForProfile(profile());
+  quick_unlock::PinStorage* pin_storage =
+      quick_unlock::PinStorageFactory::GetForProfile(profile());
 
   // Update mode to PIN raises an event and updates GetActiveModes.
   ExpectModesChanged(
@@ -375,7 +375,8 @@
 
 // Verifies that enabling PIN quick unlock actually talks to the PIN subsystem.
 TEST_F(QuickUnlockPrivateUnitTest, VerifyAuthenticationAgainstPIN) {
-  PinStorage* pin_storage = PinStorageFactory::GetForProfile(profile());
+  quick_unlock::PinStorage* pin_storage =
+      quick_unlock::PinStorageFactory::GetForProfile(profile());
 
   EXPECT_TRUE(SetModes(QuickUnlockModeList{}, CredentialList{}));
   EXPECT_FALSE(pin_storage->IsPinSet());
diff --git a/chrome/browser/chromeos/login/lock/screen_locker.cc b/chrome/browser/chromeos/login/lock/screen_locker.cc
index 7cc892b..8f0715db 100644
--- a/chrome/browser/chromeos/login/lock/screen_locker.cc
+++ b/chrome/browser/chromeos/login/lock/screen_locker.cc
@@ -113,7 +113,8 @@
       // strong authentication to allow them to use PIN to unlock the device.
       user_manager::User* user =
           content::Details<user_manager::User>(details).ptr();
-      PinStorage* pin_storage = PinStorageFactory::GetForUser(user);
+      quick_unlock::PinStorage* pin_storage =
+          quick_unlock::PinStorageFactory::GetForUser(user);
       if (pin_storage)
         pin_storage->MarkStrongAuth();
     } else {
@@ -244,7 +245,8 @@
     // 2. If the user signed in with cryptohome keys, then the PIN timeout is
     //    going to be reset as well, so it is safe to reset the unlock attempt
     //    count.
-    PinStorage* pin_storage = PinStorageFactory::GetForUser(user);
+    quick_unlock::PinStorage* pin_storage =
+        quick_unlock::PinStorageFactory::GetForUser(user);
     if (pin_storage)
       pin_storage->ResetUnlockAttemptCount();
 
@@ -267,8 +269,9 @@
 
 void ScreenLocker::OnPasswordAuthSuccess(const UserContext& user_context) {
   // The user has signed in using their password, so reset the PIN timeout.
-  PinStorage* pin_storage =
-      PinStorageFactory::GetForAccountId(user_context.GetAccountId());
+  quick_unlock::PinStorage* pin_storage =
+      quick_unlock::PinStorageFactory::GetForAccountId(
+          user_context.GetAccountId());
   if (pin_storage)
     pin_storage->MarkStrongAuth();
 }
@@ -309,8 +312,8 @@
     // incorrectly more than a few times.
     int dummy_value;
     if (is_pin_attempt_ && base::StringToInt(pin, &dummy_value)) {
-      chromeos::PinStorage* pin_storage =
-          chromeos::PinStorageFactory::GetForUser(user);
+      quick_unlock::PinStorage* pin_storage =
+          quick_unlock::PinStorageFactory::GetForUser(user);
       if (pin_storage && pin_storage->TryAuthenticatePin(pin)) {
         OnAuthSuccess(user_context);
         return;
diff --git a/chrome/browser/chromeos/login/quick_unlock/pin_storage.cc b/chrome/browser/chromeos/login/quick_unlock/pin_storage.cc
index 86058df..bc4e2f79 100644
--- a/chrome/browser/chromeos/login/quick_unlock/pin_storage.cc
+++ b/chrome/browser/chromeos/login/quick_unlock/pin_storage.cc
@@ -14,6 +14,7 @@
 #include "crypto/random.h"
 
 namespace chromeos {
+namespace quick_unlock {
 
 namespace {
 
@@ -37,16 +38,16 @@
   return key.GetSecret();
 }
 
-base::TimeDelta QuickUnlockPasswordConfirmationFrequencyToTimeDelta(
-    QuickUnlockPasswordConfirmationFrequency frequency) {
+base::TimeDelta PasswordConfirmationFrequencyToTimeDelta(
+    PasswordConfirmationFrequency frequency) {
   switch (frequency) {
-    case QuickUnlockPasswordConfirmationFrequency::SIX_HOURS:
+    case PasswordConfirmationFrequency::SIX_HOURS:
       return base::TimeDelta::FromHours(6);
-    case QuickUnlockPasswordConfirmationFrequency::TWELVE_HOURS:
+    case PasswordConfirmationFrequency::TWELVE_HOURS:
       return base::TimeDelta::FromHours(12);
-    case QuickUnlockPasswordConfirmationFrequency::DAY:
+    case PasswordConfirmationFrequency::DAY:
       return base::TimeDelta::FromDays(1);
-    case QuickUnlockPasswordConfirmationFrequency::WEEK:
+    case PasswordConfirmationFrequency::WEEK:
       return base::TimeDelta::FromDays(7);
   }
   NOTREACHED();
@@ -75,11 +76,11 @@
   if (last_strong_auth_.is_null())
     return false;
 
-  QuickUnlockPasswordConfirmationFrequency strong_auth_interval =
-      static_cast<QuickUnlockPasswordConfirmationFrequency>(
+  PasswordConfirmationFrequency strong_auth_interval =
+      static_cast<PasswordConfirmationFrequency>(
           pref_service_->GetInteger(prefs::kQuickUnlockTimeout));
   base::TimeDelta strong_auth_timeout =
-      QuickUnlockPasswordConfirmationFrequencyToTimeDelta(strong_auth_interval);
+      PasswordConfirmationFrequencyToTimeDelta(strong_auth_interval);
 
   return TimeSinceLastStrongAuth() < strong_auth_timeout;
 }
@@ -126,7 +127,7 @@
   const bool exceeded_unlock_attempts =
       unlock_attempt_count() >= kMaximumUnlockAttempts;
 
-  return IsPinUnlockEnabled(pref_service_) && IsPinSet() && HasStrongAuth() &&
+  return IsPinEnabled(pref_service_) && IsPinSet() && HasStrongAuth() &&
          !exceeded_unlock_attempts;
 }
 
@@ -138,4 +139,5 @@
   return ComputeSecret(pin, PinSalt()) == PinSecret();
 }
 
+}  // namespace quick_unlock
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/quick_unlock/pin_storage.h b/chrome/browser/chromeos/login/quick_unlock/pin_storage.h
index f3c88c4..56333fd4 100644
--- a/chrome/browser/chromeos/login/quick_unlock/pin_storage.h
+++ b/chrome/browser/chromeos/login/quick_unlock/pin_storage.h
@@ -14,9 +14,11 @@
 class PrefRegistrySimple;
 class PrefService;
 
+namespace chromeos {
+
 class PinStorageTestApi;
 
-namespace chromeos {
+namespace quick_unlock {
 
 class PinStorage : public KeyedService {
  public:
@@ -65,7 +67,7 @@
   std::string PinSalt() const;
   std::string PinSecret() const;
 
-  friend class ::PinStorageTestApi;
+  friend class chromeos::PinStorageTestApi;
 
   PrefService* pref_service_;
   int unlock_attempt_count_ = 0;
@@ -74,6 +76,7 @@
   DISALLOW_COPY_AND_ASSIGN(PinStorage);
 };
 
+}  // namespace quick_unlock
 }  // namespace chromeos
 
 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_QUICK_UNLOCK_PIN_STORAGE_H_
diff --git a/chrome/browser/chromeos/login/quick_unlock/pin_storage_factory.cc b/chrome/browser/chromeos/login/quick_unlock/pin_storage_factory.cc
index 4548dbb..773bdf3 100644
--- a/chrome/browser/chromeos/login/quick_unlock/pin_storage_factory.cc
+++ b/chrome/browser/chromeos/login/quick_unlock/pin_storage_factory.cc
@@ -12,6 +12,7 @@
 #include "components/user_manager/user_manager.h"
 
 namespace chromeos {
+namespace quick_unlock {
 
 // static
 PinStorage* PinStorageFactory::GetForProfile(Profile* profile) {
@@ -55,4 +56,5 @@
   return new PinStorage(Profile::FromBrowserContext(context)->GetPrefs());
 }
 
+}  // namespace quick_unlock
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/quick_unlock/pin_storage_factory.h b/chrome/browser/chromeos/login/quick_unlock/pin_storage_factory.h
index 505d6a6..e2d8bdc 100644
--- a/chrome/browser/chromeos/login/quick_unlock/pin_storage_factory.h
+++ b/chrome/browser/chromeos/login/quick_unlock/pin_storage_factory.h
@@ -16,6 +16,7 @@
 }
 
 namespace chromeos {
+namespace quick_unlock {
 
 class PinStorage;
 
@@ -50,6 +51,7 @@
   DISALLOW_COPY_AND_ASSIGN(PinStorageFactory);
 };
 
+}  // namespace quick_unlock
 }  // namespace chromeos
 
 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_QUICK_UNLOCK_PIN_STORAGE_FACTORY_H_
diff --git a/chrome/browser/chromeos/login/quick_unlock/pin_storage_unittest.cc b/chrome/browser/chromeos/login/quick_unlock/pin_storage_unittest.cc
index b3a937a..37ce31a 100644
--- a/chrome/browser/chromeos/login/quick_unlock/pin_storage_unittest.cc
+++ b/chrome/browser/chromeos/login/quick_unlock/pin_storage_unittest.cc
@@ -12,11 +12,12 @@
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+namespace chromeos {
 namespace {
 
 void SetConfirmationFrequency(
     PrefService* pref_service,
-    chromeos::QuickUnlockPasswordConfirmationFrequency frequency) {
+    quick_unlock::PasswordConfirmationFrequency frequency) {
   pref_service->SetInteger(prefs::kQuickUnlockTimeout,
                            static_cast<int>(frequency));
 }
@@ -27,7 +28,7 @@
   ~PinStorageUnitTest() override {}
 
   // testing::Test:
-  void SetUp() override { chromeos::EnableQuickUnlockForTesting(); }
+  void SetUp() override { quick_unlock::EnableForTesting(); }
 
   content::TestBrowserThreadBundle thread_bundle_;
   std::unique_ptr<TestingProfile> profile_;
@@ -41,7 +42,7 @@
 class PinStorageTestApi {
  public:
   // Does *not* take ownership over |pin_storage|.
-  explicit PinStorageTestApi(chromeos::PinStorage* pin_storage)
+  explicit PinStorageTestApi(quick_unlock::PinStorage* pin_storage)
       : pin_storage_(pin_storage) {}
 
   // Reduces the amount of strong auth time available by |time_delta|.
@@ -58,7 +59,7 @@
   std::string PinSecret() const { return pin_storage_->PinSecret(); }
 
  private:
-  chromeos::PinStorage* pin_storage_;
+  quick_unlock::PinStorage* pin_storage_;
 
   DISALLOW_COPY_AND_ASSIGN(PinStorageTestApi);
 };
@@ -73,8 +74,8 @@
   EXPECT_EQ("", prefs->GetString(prefs::kQuickUnlockPinSalt));
   EXPECT_EQ("", prefs->GetString(prefs::kQuickUnlockPinSecret));
 
-  chromeos::PinStorage* pin_storage =
-      chromeos::PinStorageFactory::GetForProfile(profile_.get());
+  quick_unlock::PinStorage* pin_storage =
+      quick_unlock::PinStorageFactory::GetForProfile(profile_.get());
   PinStorageTestApi pin_storage_test(pin_storage);
 
   pin_storage->SetPin("1111");
@@ -97,8 +98,8 @@
 // 2. Attempting unlock attempts correctly increases unlock attempt count.
 // 3. Resetting unlock attempt count correctly sets attempt count to 0.
 TEST_F(PinStorageUnitTest, UnlockAttemptCount) {
-  chromeos::PinStorage* pin_storage =
-      chromeos::PinStorageFactory::GetForProfile(profile_.get());
+  quick_unlock::PinStorage* pin_storage =
+      quick_unlock::PinStorageFactory::GetForProfile(profile_.get());
 
   EXPECT_EQ(0, pin_storage->unlock_attempt_count());
 
@@ -114,8 +115,8 @@
 // Verifies that marking the strong auth makes TimeSinceLastStrongAuth a > zero
 // value.
 TEST_F(PinStorageUnitTest, TimeSinceLastStrongAuthReturnsPositiveValue) {
-  chromeos::PinStorage* pin_storage =
-      chromeos::PinStorageFactory::GetForProfile(profile_.get());
+  quick_unlock::PinStorage* pin_storage =
+      quick_unlock::PinStorageFactory::GetForProfile(profile_.get());
   PinStorageTestApi pin_storage_test(pin_storage);
 
   EXPECT_FALSE(pin_storage_test.HasStrongAuthInfo());
@@ -133,8 +134,8 @@
 // Verifies that by altering the password confirmation preference, the pin
 // storage will request password reconfirmation as expected.
 TEST_F(PinStorageUnitTest, QuickUnlockPasswordConfirmationFrequencyPreference) {
-  chromeos::PinStorage* pin_storage =
-      chromeos::PinStorageFactory::GetForProfile(profile_.get());
+  quick_unlock::PinStorage* pin_storage =
+      quick_unlock::PinStorageFactory::GetForProfile(profile_.get());
   PrefService* pref_service = profile_->GetPrefs();
   PinStorageTestApi test_api(pin_storage);
 
@@ -155,8 +156,7 @@
   // will.
   pin_storage->MarkStrongAuth();
   SetConfirmationFrequency(
-      pref_service,
-      chromeos::QuickUnlockPasswordConfirmationFrequency::SIX_HOURS);
+      pref_service, quick_unlock::PasswordConfirmationFrequency::SIX_HOURS);
   test_api.ReduceRemainingStrongAuthTimeBy(base::TimeDelta::FromHours(4));
   EXPECT_TRUE(pin_storage->HasStrongAuth());
   test_api.ReduceRemainingStrongAuthTimeBy(base::TimeDelta::FromHours(4));
@@ -166,35 +166,31 @@
   // shortened to less than the expiration time.
   pin_storage->MarkStrongAuth();
   SetConfirmationFrequency(
-      pref_service,
-      chromeos::QuickUnlockPasswordConfirmationFrequency::TWELVE_HOURS);
+      pref_service, quick_unlock::PasswordConfirmationFrequency::TWELVE_HOURS);
   EXPECT_TRUE(pin_storage->HasStrongAuth());
   test_api.ReduceRemainingStrongAuthTimeBy(base::TimeDelta::FromHours(8));
   EXPECT_TRUE(pin_storage->HasStrongAuth());
   SetConfirmationFrequency(
-      pref_service,
-      chromeos::QuickUnlockPasswordConfirmationFrequency::SIX_HOURS);
+      pref_service, quick_unlock::PasswordConfirmationFrequency::SIX_HOURS);
   EXPECT_FALSE(pin_storage->HasStrongAuth());
 
   // An expired strong auth becomes usable if the confirmation frequency gets
   // extended past the expiration time.
   pin_storage->MarkStrongAuth();
   SetConfirmationFrequency(
-      pref_service,
-      chromeos::QuickUnlockPasswordConfirmationFrequency::SIX_HOURS);
+      pref_service, quick_unlock::PasswordConfirmationFrequency::SIX_HOURS);
   EXPECT_TRUE(pin_storage->HasStrongAuth());
   test_api.ReduceRemainingStrongAuthTimeBy(base::TimeDelta::FromHours(8));
   EXPECT_FALSE(pin_storage->HasStrongAuth());
   SetConfirmationFrequency(
-      pref_service,
-      chromeos::QuickUnlockPasswordConfirmationFrequency::TWELVE_HOURS);
+      pref_service, quick_unlock::PasswordConfirmationFrequency::TWELVE_HOURS);
   EXPECT_TRUE(pin_storage->HasStrongAuth());
 }
 
 // Verifies that the correct pin can be used to authenticate.
 TEST_F(PinStorageUnitTest, AuthenticationSucceedsWithRightPin) {
-  chromeos::PinStorage* pin_storage =
-      chromeos::PinStorageFactory::GetForProfile(profile_.get());
+  quick_unlock::PinStorage* pin_storage =
+      quick_unlock::PinStorageFactory::GetForProfile(profile_.get());
 
   pin_storage->SetPin("1111");
 
@@ -205,15 +201,15 @@
 // Verifies that the correct pin will fail to authenticate if too many
 // authentication attempts have been made.
 TEST_F(PinStorageUnitTest, AuthenticationFailsFromTooManyAttempts) {
-  chromeos::PinStorage* pin_storage =
-      chromeos::PinStorageFactory::GetForProfile(profile_.get());
+  quick_unlock::PinStorage* pin_storage =
+      quick_unlock::PinStorageFactory::GetForProfile(profile_.get());
 
   pin_storage->SetPin("1111");
 
   // Use up all of the authentication attempts so authentication fails.
   pin_storage->MarkStrongAuth();
   EXPECT_TRUE(pin_storage->IsPinAuthenticationAvailable());
-  for (int i = 0; i < chromeos::PinStorage::kMaximumUnlockAttempts; ++i)
+  for (int i = 0; i < quick_unlock::PinStorage::kMaximumUnlockAttempts; ++i)
     EXPECT_FALSE(pin_storage->TryAuthenticatePin("foobar"));
 
   // We used up all of the attempts, so entering the right PIN will still fail.
@@ -224,8 +220,8 @@
 // Verifies that the correct pin will fail to authenticate if it has been too
 // long since a strong-auth/password authentication.
 TEST_F(PinStorageUnitTest, AuthenticationFailsFromTimeout) {
-  chromeos::PinStorage* pin_storage =
-      chromeos::PinStorageFactory::GetForProfile(profile_.get());
+  quick_unlock::PinStorage* pin_storage =
+      quick_unlock::PinStorageFactory::GetForProfile(profile_.get());
   PinStorageTestApi pin_storage_test(pin_storage);
 
   pin_storage->SetPin("1111");
@@ -238,3 +234,4 @@
 
   EXPECT_FALSE(pin_storage->IsPinAuthenticationAvailable());
 }
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/quick_unlock/quick_unlock_notification_controller.cc b/chrome/browser/chromeos/login/quick_unlock/quick_unlock_notification_controller.cc
index 7525f895..d3b7cc16 100644
--- a/chrome/browser/chromeos/login/quick_unlock/quick_unlock_notification_controller.cc
+++ b/chrome/browser/chromeos/login/quick_unlock/quick_unlock_notification_controller.cc
@@ -39,6 +39,7 @@
 }  // namespace
 
 namespace chromeos {
+namespace quick_unlock {
 
 QuickUnlockNotificationController::QuickUnlockNotificationController(
     Profile* profile)
@@ -154,4 +155,5 @@
       GURL(), kNotificationId, message_center::RichNotificationData(), this);
 }
 
+}  // namespace quick_unlock
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/quick_unlock/quick_unlock_notification_controller.h b/chrome/browser/chromeos/login/quick_unlock/quick_unlock_notification_controller.h
index e931871..d72eaa1 100644
--- a/chrome/browser/chromeos/login/quick_unlock/quick_unlock_notification_controller.h
+++ b/chrome/browser/chromeos/login/quick_unlock/quick_unlock_notification_controller.h
@@ -15,6 +15,7 @@
 class Notification;
 
 namespace chromeos {
+namespace quick_unlock {
 
 // Quick Unlock feature notification controller is responsible for managing the
 // new feature notification displayed to the user.
@@ -49,6 +50,7 @@
   DISALLOW_COPY_AND_ASSIGN(QuickUnlockNotificationController);
 };
 
+}  // namespace quick_unlock
 }  // namespace chromeos
 
 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_QUICK_UNLOCK_QUICK_UNLOCK_NOTIFICATION_CONTROLLER_H_
diff --git a/chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.cc b/chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.cc
index bb7b4ebd..8af3c1f 100644
--- a/chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.cc
+++ b/chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.cc
@@ -14,6 +14,7 @@
 #include "components/user_manager/user_manager.h"
 
 namespace chromeos {
+namespace quick_unlock {
 
 namespace {
 bool enable_for_testing_ = false;
@@ -24,14 +25,14 @@
 constexpr int kDefaultMinimumPinLength = 6;
 }  // namespace
 
-void RegisterQuickUnlockProfilePrefs(PrefRegistrySimple* registry) {
+void RegisterProfilePrefs(PrefRegistrySimple* registry) {
   base::ListValue quick_unlock_whitelist_default;
   quick_unlock_whitelist_default.AppendString(kQuickUnlockWhitelistOptionPin);
   registry->RegisterListPref(prefs::kQuickUnlockModeWhitelist,
                              quick_unlock_whitelist_default.DeepCopy());
   registry->RegisterIntegerPref(
       prefs::kQuickUnlockTimeout,
-      static_cast<int>(QuickUnlockPasswordConfirmationFrequency::DAY));
+      static_cast<int>(PasswordConfirmationFrequency::DAY));
 
   // Preferences related the lock screen pin unlock.
   registry->RegisterIntegerPref(prefs::kPinUnlockMinimumLength,
@@ -43,7 +44,7 @@
   registry->RegisterBooleanPref(prefs::kEnableQuickUnlockFingerprint, false);
 }
 
-bool IsPinUnlockEnabled(PrefService* pref_service) {
+bool IsPinEnabled(PrefService* pref_service) {
   if (enable_for_testing_)
     return true;
 
@@ -69,13 +70,14 @@
   return base::FeatureList::IsEnabled(features::kQuickUnlockPin);
 }
 
-bool IsFingerprintUnlockEnabled() {
+bool IsFingerprintEnabled() {
   // Enable fingerprint unlock only if the switch is present.
   return base::FeatureList::IsEnabled(features::kQuickUnlockFingerprint);
 }
 
-void EnableQuickUnlockForTesting() {
+void EnableForTesting() {
   enable_for_testing_ = true;
 }
 
+}  // namespace quick_unlock
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h b/chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h
index 979d4eec..626aef1 100644
--- a/chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h
+++ b/chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h
@@ -9,12 +9,13 @@
 class PrefService;
 
 namespace chromeos {
+namespace quick_unlock {
 
 // Enumeration specifiying the possible intervals before a strong auth
 // (password) is required to use quick unlock. These values correspond to the
 // policy items of QuickUnlockTimeout (policy ID 352) in policy_templates.json,
 // and should be updated accordingly.
-enum class QuickUnlockPasswordConfirmationFrequency {
+enum class PasswordConfirmationFrequency {
   SIX_HOURS = 0,
   TWELVE_HOURS = 1,
   DAY = 2,
@@ -22,18 +23,19 @@
 };
 
 // Register quick unlock prefs.
-void RegisterQuickUnlockProfilePrefs(PrefRegistrySimple* registry);
+void RegisterProfilePrefs(PrefRegistrySimple* registry);
 
 // Returns true if PIN unlock is allowed by policy and the quick unlock feature
 // flag is present.
-bool IsPinUnlockEnabled(PrefService* pref_service);
+bool IsPinEnabled(PrefService* pref_service);
 
 // Returns true if the fingerprint unlock feature flag is present.
-bool IsFingerprintUnlockEnabled();
+bool IsFingerprintEnabled();
 
 // Forcibly enable quick-unlock for testing.
-void EnableQuickUnlockForTesting();
+void EnableForTesting();
 
+}  // namespace quick_unlock
 }  // namespace chromeos
 
 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_QUICK_UNLOCK_QUICK_UNLOCK_UTILS_H_
diff --git a/chrome/browser/chromeos/login/screens/user_selection_screen.cc b/chrome/browser/chromeos/login/screens/user_selection_screen.cc
index cb074247..fb655e17 100644
--- a/chrome/browser/chromeos/login/screens/user_selection_screen.cc
+++ b/chrome/browser/chromeos/login/screens/user_selection_screen.cc
@@ -123,7 +123,8 @@
   if (!user->is_logged_in())
     return false;
 
-  PinStorage* pin_storage = PinStorageFactory::GetForUser(user);
+  quick_unlock::PinStorage* pin_storage =
+      quick_unlock::PinStorageFactory::GetForUser(user);
   if (!pin_storage)
     return false;
 
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc
index 6c6b6c4..2a78309 100644
--- a/chrome/browser/chromeos/login/session/user_session_manager.cc
+++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -1775,11 +1775,11 @@
   if (HatsNotificationController::ShouldShowSurveyToProfile(profile))
     hats_notification_controller_ = new HatsNotificationController(profile);
 
-  if (QuickUnlockNotificationController::ShouldShow(profile) &&
+  if (quick_unlock::QuickUnlockNotificationController::ShouldShow(profile) &&
       quick_unlock_notification_handler_.find(profile) ==
           quick_unlock_notification_handler_.end()) {
     auto* qu_feature_notification_controller =
-        new QuickUnlockNotificationController(profile);
+        new quick_unlock::QuickUnlockNotificationController(profile);
     quick_unlock_notification_handler_.insert(
         std::make_pair(profile, qu_feature_notification_controller));
   }
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.h b/chrome/browser/chromeos/login/session/user_session_manager.h
index d406a10..604dd3e 100644
--- a/chrome/browser/chromeos/login/session/user_session_manager.h
+++ b/chrome/browser/chromeos/login/session/user_session_manager.h
@@ -485,7 +485,7 @@
 
   // Per-user-session Quick Unlock Feature Notification
   std::map<Profile*,
-           scoped_refptr<QuickUnlockNotificationController>,
+           scoped_refptr<quick_unlock::QuickUnlockNotificationController>,
            ProfileCompare>
       quick_unlock_notification_handler_;
 
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 61599a0..7e8126b 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -580,10 +580,10 @@
   chromeos::file_system_provider::RegisterProfilePrefs(registry);
   chromeos::KeyPermissions::RegisterProfilePrefs(registry);
   chromeos::MultiProfileUserController::RegisterProfilePrefs(registry);
-  chromeos::PinStorage::RegisterProfilePrefs(registry);
+  chromeos::quick_unlock::PinStorage::RegisterProfilePrefs(registry);
   chromeos::Preferences::RegisterProfilePrefs(registry);
   chromeos::PrintersManager::RegisterProfilePrefs(registry);
-  chromeos::RegisterQuickUnlockProfilePrefs(registry);
+  chromeos::quick_unlock::RegisterProfilePrefs(registry);
   chromeos::SAMLOfflineSigninLimiter::RegisterProfilePrefs(registry);
   chromeos::ServicesCustomizationDocument::RegisterProfilePrefs(registry);
   chromeos::system::InputDeviceSettings::RegisterProfilePrefs(registry);
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
index d939564..cf02376 100644
--- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -949,8 +949,8 @@
     for (user_manager::User* user :
          user_manager::UserManager::Get()->GetLoggedInUsers()) {
 
-      chromeos::PinStorage* pin_storage =
-          chromeos::PinStorageFactory::GetForUser(user);
+      chromeos::quick_unlock::PinStorage* pin_storage =
+          chromeos::quick_unlock::PinStorageFactory::GetForUser(user);
       if (pin_storage && pin_storage->IsPinAuthenticationAvailable()) {
         CallJS("cr.ui.Oobe.preloadPinKeyboard");
         break;
@@ -996,8 +996,8 @@
 }
 
 void SigninScreenHandler::HidePinKeyboardIfNeeded(const AccountId& account_id) {
-  chromeos::PinStorage* pin_storage =
-      chromeos::PinStorageFactory::GetForAccountId(account_id);
+  chromeos::quick_unlock::PinStorage* pin_storage =
+      chromeos::quick_unlock::PinStorageFactory::GetForAccountId(account_id);
   if (pin_storage && !pin_storage->IsPinAuthenticationAvailable())
     CallJS("login.AccountPickerScreen.disablePinKeyboardForUser", account_id);
 }
@@ -1151,8 +1151,8 @@
     return;
   DCHECK_EQ(account_id.GetUserEmail(),
             gaia::SanitizeEmail(account_id.GetUserEmail()));
-  chromeos::PinStorage* pin_storage =
-    chromeos::PinStorageFactory::GetForAccountId(account_id);
+  chromeos::quick_unlock::PinStorage* pin_storage =
+      chromeos::quick_unlock::PinStorageFactory::GetForAccountId(account_id);
   // If pin storage is unavailable, authenticated by PIN must be false.
   DCHECK(!pin_storage || pin_storage->IsPinAuthenticationAvailable() ||
          !authenticated_by_pin);
diff --git a/chrome/browser/ui/webui/options/browser_options_handler.cc b/chrome/browser/ui/webui/options/browser_options_handler.cc
index 1088902..c2898b6 100644
--- a/chrome/browser/ui/webui/options/browser_options_handler.cc
+++ b/chrome/browser/ui/webui/options/browser_options_handler.cc
@@ -816,10 +816,10 @@
   values->SetBoolean("allowBluetooth", allow_bluetooth);
 
   values->SetBoolean("showQuickUnlockSettings",
-                     chromeos::IsPinUnlockEnabled(profile->GetPrefs()));
+                     chromeos::quick_unlock::IsPinEnabled(profile->GetPrefs()));
   values->SetBoolean("fingerprintUnlockEnabled",
-                     chromeos::IsFingerprintUnlockEnabled());
-  if (chromeos::IsPinUnlockEnabled(profile->GetPrefs())) {
+                     chromeos::quick_unlock::IsFingerprintEnabled());
+  if (chromeos::quick_unlock::IsPinEnabled(profile->GetPrefs())) {
     values->SetString(
         "enableScreenlock",
         l10n_util::GetStringUTF16(
diff --git a/chrome/browser/ui/webui/settings/md_settings_ui.cc b/chrome/browser/ui/webui/settings/md_settings_ui.cc
index 2cd4c0b..1d05b1e 100644
--- a/chrome/browser/ui/webui/settings/md_settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_ui.cc
@@ -161,10 +161,11 @@
 
   AddSettingsPageUIHandler(
       base::MakeUnique<chromeos::settings::StylusHandler>());
-  html_source->AddBoolean("pinUnlockEnabled",
-                          chromeos::IsPinUnlockEnabled(profile->GetPrefs()));
+  html_source->AddBoolean(
+      "pinUnlockEnabled",
+      chromeos::quick_unlock::IsPinEnabled(profile->GetPrefs()));
   html_source->AddBoolean("fingerprintUnlockEnabled",
-                          chromeos::IsFingerprintUnlockEnabled());
+                          chromeos::quick_unlock::IsFingerprintEnabled());
   html_source->AddBoolean("androidAppsAllowed",
                           arc::IsArcAllowedForProfile(profile) &&
                               !arc::IsArcOptInVerificationDisabled());
diff --git a/content/browser/media/audio_stream_monitor.cc b/content/browser/media/audio_stream_monitor.cc
index f2782a6b..bab83477 100644
--- a/content/browser/media/audio_stream_monitor.cc
+++ b/content/browser/media/audio_stream_monitor.cc
@@ -48,8 +48,7 @@
     : web_contents_(contents),
       clock_(&default_tick_clock_),
       was_recently_audible_(false),
-      is_audible_(false),
-      active_streams_(0) {
+      is_audible_(false) {
   DCHECK(web_contents_);
 }
 
@@ -65,6 +64,28 @@
   return is_audible_;
 }
 
+void AudioStreamMonitor::RenderProcessGone(int render_process_id) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+
+  // Note: It's possible for the RenderProcessHost and WebContents (and thus
+  // this class) to survive the death of the render process and subsequently be
+  // reused. During this period StartStopMonitoringHelper() will be unable to
+  // lookup the WebContents using the now-dead |render_frame_id|. We must thus
+  // have this secondary mechanism for clearing stale callbacks.
+
+  for (auto it = poll_callbacks_.begin(); it != poll_callbacks_.end();) {
+    if (it->first.first == render_process_id) {
+      it = poll_callbacks_.erase(it);
+      OnStreamRemoved();
+    } else {
+      ++it;
+    }
+  }
+
+  if (poll_callbacks_.empty())
+    poll_timer_.Stop();
+}
+
 // static
 void AudioStreamMonitor::StartMonitoringStream(
     int render_process_id,
@@ -101,12 +122,8 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (AudioStreamMonitor* monitor = StartStopMonitoringHelper(
           ActionType::STARTING, render_process_id, render_frame_id)) {
-    if (!power_level_monitoring_available()) {
-      monitor->OnStreamAdded();
-    } else {
-      monitor->StartMonitoringStreamOnUIThread(render_process_id, stream_id,
-                                               read_power_callback);
-    }
+    monitor->StartMonitoringStreamOnUIThread(render_process_id, stream_id,
+                                             read_power_callback);
   }
 }
 
@@ -117,10 +134,7 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (AudioStreamMonitor* monitor = StartStopMonitoringHelper(
           ActionType::STOPPING, render_process_id, render_frame_id)) {
-    if (!power_level_monitoring_available())
-      monitor->OnStreamRemoved();
-    else
-      monitor->StopMonitoringStreamOnUIThread(render_process_id, stream_id);
+    monitor->StopMonitoringStreamOnUIThread(render_process_id, stream_id);
   }
 }
 
@@ -133,26 +147,22 @@
 
   const StreamID qualified_id(render_process_id, stream_id);
   DCHECK(poll_callbacks_.find(qualified_id) == poll_callbacks_.end());
-  poll_callbacks_[qualified_id] = read_power_callback;
 
-  if (!poll_timer_.IsRunning()) {
-    poll_timer_.Start(
-        FROM_HERE, base::TimeDelta::FromSeconds(1) /
-                       static_cast<int>(kPowerMeasurementsPerSecond),
-        base::Bind(&AudioStreamMonitor::Poll, base::Unretained(this)));
-  }
+  poll_callbacks_[qualified_id] = read_power_callback;
+  OnStreamAdded();
 }
 
 void AudioStreamMonitor::StopMonitoringStreamOnUIThread(int render_process_id,
                                                         int stream_id) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  const StreamID qualified_id(render_process_id, stream_id);
-  DCHECK(poll_callbacks_.find(qualified_id) != poll_callbacks_.end());
-  poll_callbacks_.erase(qualified_id);
+  // In the event of render process death, these may have already been cleared.
+  auto it = poll_callbacks_.find(StreamID(render_process_id, stream_id));
+  if (it == poll_callbacks_.end())
+    return;
 
-  if (poll_callbacks_.empty())
-    poll_timer_.Stop();
+  poll_callbacks_.erase(it);
+  OnStreamRemoved();
 }
 
 void AudioStreamMonitor::Poll() {
@@ -204,22 +214,32 @@
 
 void AudioStreamMonitor::OnStreamAdded() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK(!power_level_monitoring_available());
-  if (++active_streams_ == 1u) {
+  if (poll_callbacks_.size() != 1u)
+    return;
+
+  if (!power_level_monitoring_available()) {
     is_audible_ = true;
     web_contents_->OnAudioStateChanged(true);
     MaybeToggle();
+  } else if (!poll_timer_.IsRunning()) {
+    poll_timer_.Start(
+        FROM_HERE, base::TimeDelta::FromSeconds(1) /
+                       static_cast<int>(kPowerMeasurementsPerSecond),
+        base::Bind(&AudioStreamMonitor::Poll, base::Unretained(this)));
   }
 }
 
 void AudioStreamMonitor::OnStreamRemoved() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK(!power_level_monitoring_available());
-  DCHECK_GT(active_streams_, 0u);
-  if (--active_streams_ == 0u) {
+  if (!poll_callbacks_.empty())
+    return;
+
+  if (!power_level_monitoring_available()) {
     is_audible_ = false;
     web_contents_->OnAudioStateChanged(false);
     MaybeToggle();
+  } else {
+    poll_timer_.Stop();
   }
 }
 
diff --git a/content/browser/media/audio_stream_monitor.h b/content/browser/media/audio_stream_monitor.h
index ced46683..f925c91 100644
--- a/content/browser/media/audio_stream_monitor.h
+++ b/content/browser/media/audio_stream_monitor.h
@@ -54,6 +54,10 @@
   // false as soon as the WebContents stop producing sound.
   bool IsCurrentlyAudible() const;
 
+  // Called by the WebContentsImpl if |render_process_id| dies; used to clear
+  // any outstanding poll callbacks.
+  void RenderProcessGone(int render_process_id);
+
   // Starts or stops audio level monitoring respectively for the stream owned by
   // the specified renderer.  Safe to call from any thread.
   //
@@ -142,8 +146,8 @@
 
   // The callbacks to read power levels for each stream.  Only playing (i.e.,
   // not paused) streams will have an entry in this map.
-  typedef std::pair<int, int> StreamID;
-  typedef std::map<StreamID, ReadPowerAndClipCallback> StreamPollCallbackMap;
+  using StreamID = std::pair<int, int>;
+  using StreamPollCallbackMap = std::map<StreamID, ReadPowerAndClipCallback>;
   StreamPollCallbackMap poll_callbacks_;
 
   // Records the last time at which sound was audible from any stream.
@@ -163,10 +167,6 @@
   // future.
   base::OneShotTimer off_timer_;
 
-  // Number of active streams to be used as a proxy for audibility when power
-  // level monitoring is not available.
-  size_t active_streams_;
-
   DISALLOW_COPY_AND_ASSIGN(AudioStreamMonitor);
 };
 
diff --git a/content/browser/media/audio_stream_monitor_unittest.cc b/content/browser/media/audio_stream_monitor_unittest.cc
index f1d5103d..95f28b9 100644
--- a/content/browser/media/audio_stream_monitor_unittest.cc
+++ b/content/browser/media/audio_stream_monitor_unittest.cc
@@ -78,11 +78,12 @@
 
   void ExpectIsPolling(int render_process_id, int stream_id, bool is_polling) {
     const AudioStreamMonitor::StreamID key(render_process_id, stream_id);
-    EXPECT_EQ(
-        is_polling,
-        monitor_->poll_callbacks_.find(key) != monitor_->poll_callbacks_.end());
+    EXPECT_EQ(is_polling, monitor_->poll_callbacks_.find(key) !=
+                              monitor_->poll_callbacks_.end());
     EXPECT_EQ(!monitor_->poll_callbacks_.empty(),
-              monitor_->poll_timer_.IsRunning());
+              power_level_monitoring_available()
+                  ? monitor_->poll_timer_.IsRunning()
+                  : monitor_->IsCurrentlyAudible());
   }
 
   void ExpectTabWasRecentlyAudible(bool was_audible,
@@ -141,14 +142,26 @@
       int render_process_id,
       int stream_id,
       const AudioStreamMonitor::ReadPowerAndClipCallback& callback) {
-    monitor_->StartMonitoringStreamOnUIThread(
-        render_process_id, stream_id, callback);
+    if (!power_level_monitoring_available() &&
+        monitor_->poll_callbacks_.empty()) {
+      ExpectCurrentlyAudibleChangeNotification(true);
+    }
+    monitor_->StartMonitoringStreamOnUIThread(render_process_id, stream_id,
+                                              callback);
   }
 
   void StopMonitoring(int render_process_id, int stream_id) {
+    if (!power_level_monitoring_available() &&
+        monitor_->poll_callbacks_.size() == 1u) {
+      ExpectCurrentlyAudibleChangeNotification(false);
+    }
     monitor_->StopMonitoringStreamOnUIThread(render_process_id, stream_id);
   }
 
+  bool power_level_monitoring_available() {
+    return AudioStreamMonitor::power_level_monitoring_available();
+  }
+
  protected:
   AudioStreamMonitor* monitor_;
 
@@ -175,6 +188,9 @@
 // Tests that AudioStreamMonitor is polling while it has a
 // ReadPowerAndClipCallback, and is not polling at other times.
 TEST_F(AudioStreamMonitorTest, PollsWhenProvidedACallback) {
+  if (!power_level_monitoring_available())
+    return;
+
   EXPECT_FALSE(monitor_->WasRecentlyAudible());
   ExpectNotCurrentlyAudible();
   ExpectIsPolling(kRenderProcessId, kStreamId, false);
@@ -195,6 +211,9 @@
 // threshold.  See comments in audio_stream_monitor.h for expected behavior.
 TEST_F(AudioStreamMonitorTest,
        ImpulsesKeepIndicatorOnUntilHoldingPeriodHasPassed) {
+  if (!power_level_monitoring_available())
+    return;
+
   StartMonitoring(kRenderProcessId, kStreamId, CreatePollCallback(kStreamId));
 
   // Expect WebContents will get one call form AudioStreamMonitor to toggle the
@@ -247,6 +266,9 @@
 // Tests that the AudioStreamMonitor correctly processes the blurts from two
 // different streams in the same tab.
 TEST_F(AudioStreamMonitorTest, HandlesMultipleStreamsBlurting) {
+  if (!power_level_monitoring_available())
+    return;
+
   StartMonitoring(kRenderProcessId, kStreamId, CreatePollCallback(kStreamId));
   StartMonitoring(
       kRenderProcessId, kAnotherStreamId, CreatePollCallback(kAnotherStreamId));
@@ -343,4 +365,38 @@
   ExpectIsPolling(kAnotherRenderProcessId, kStreamId, false);
 }
 
+TEST_F(AudioStreamMonitorTest, RenderProcessGone) {
+  StartMonitoring(kRenderProcessId, kStreamId, CreatePollCallback(kStreamId));
+  StartMonitoring(kAnotherRenderProcessId, kStreamId,
+                  CreatePollCallback(kStreamId));
+  ExpectIsPolling(kRenderProcessId, kStreamId, true);
+  ExpectIsPolling(kAnotherRenderProcessId, kStreamId, true);
+  monitor_->RenderProcessGone(kRenderProcessId);
+  ExpectIsPolling(kRenderProcessId, kStreamId, false);
+  if (!power_level_monitoring_available())
+    ExpectCurrentlyAudibleChangeNotification(false);
+  monitor_->RenderProcessGone(kAnotherRenderProcessId);
+  ExpectIsPolling(kAnotherRenderProcessId, kStreamId, false);
+}
+
+TEST_F(AudioStreamMonitorTest, NoPowerLevelMonitoring) {
+  if (power_level_monitoring_available())
+    return;
+
+  ExpectNotCurrentlyAudible();
+  StartMonitoring(kRenderProcessId, kStreamId, CreatePollCallback(kStreamId));
+  ExpectIsCurrentlyAudible();
+  ExpectIsPolling(kRenderProcessId, kStreamId, true);
+
+  StartMonitoring(kAnotherRenderProcessId, kStreamId,
+                  CreatePollCallback(kStreamId));
+  ExpectIsCurrentlyAudible();
+  ExpectIsPolling(kAnotherRenderProcessId, kStreamId, true);
+
+  StopMonitoring(kRenderProcessId, kStreamId);
+  ExpectIsCurrentlyAudible();
+  StopMonitoring(kAnotherRenderProcessId, kStreamId);
+  ExpectNotCurrentlyAudible();
+}
+
 }  // namespace content
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 87b9b7b..2daf76a0 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -4398,6 +4398,8 @@
   if (delegate_)
     delegate_->HideValidationMessage(this);
 
+  audio_stream_monitor_.RenderProcessGone(rvh->GetProcess()->GetID());
+
   // Reset the loading progress. TODO(avi): What does it mean to have a
   // "renderer crash" when there is more than one renderer process serving a
   // webpage? Once this function is called at a more granular frame level, we
diff --git a/media/audio/win/audio_low_latency_input_win.cc b/media/audio/win/audio_low_latency_input_win.cc
index df491b1..14a2f0d9 100644
--- a/media/audio/win/audio_low_latency_input_win.cc
+++ b/media/audio/win/audio_low_latency_input_win.cc
@@ -356,13 +356,18 @@
   // However if the buffer ratio is imperfect, we will need 3 buffers to safely
   // be able to buffer up data in cases where a conversion requires two audio
   // buffers (and we need to be able to write to the third one).
+  size_t capture_buffer_size =
+      std::max(2 * endpoint_buffer_size_frames_ * frame_size_,
+               2 * packet_size_frames_ * frame_size_);
+  int buffers_required = capture_buffer_size / packet_size_bytes_;
+  if (converter_ && imperfect_buffer_size_conversion_)
+    ++buffers_required;
+
   DCHECK(!fifo_);
-  const int buffers_required =
-      converter_ && imperfect_buffer_size_conversion_ ? 3 : 2;
   fifo_.reset(new AudioBlockFifo(format_.nChannels, packet_size_frames_,
                                  buffers_required));
 
-  DVLOG(1) << "AudioBlockFifo needs " << buffers_required << " buffers";
+  DVLOG(1) << "AudioBlockFifo buffer count: " << buffers_required;
 
   LARGE_INTEGER now_count = {};
   bool recording = true;
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 4fd4294..6a9ef5c6 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -134,6 +134,7 @@
 crbug.com/664852 virtual/gpu/fast/canvas/canvas-lose-restore-googol-size.html [ Pass Failure ]
 crbug.com/664852 virtual/gpu/fast/canvas/canvas-lost-gpu-context.html [ Pass Failure ]
 crbug.com/664852 virtual/gpu/fast/canvas/OffscreenCanvas-2d-drawImage.html [ Pass Failure ]
+crbug.com/692400 fast/css/first-letter-rtc-crash.html [ NeedsRebaseline ]
 
 # Added 2016-12-14
 crbug.com/674396 [ Win ] compositing/reflections/nested-reflection-transition.html [ Pass Failure ]
diff --git a/third_party/WebKit/LayoutTests/external/wpt/MANIFEST.json b/third_party/WebKit/LayoutTests/external/wpt/MANIFEST.json
index 4244315..4f71777 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/MANIFEST.json
+++ b/third_party/WebKit/LayoutTests/external/wpt/MANIFEST.json
@@ -21318,11 +21318,6 @@
      {}
     ]
    ],
-   "selection/addRange-08-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "selection/addRange-12-expected.txt": [
     [
      {}
@@ -21358,31 +21353,6 @@
      {}
     ]
    ],
-   "selection/addRange-40-expected.txt": [
-    [
-     {}
-    ]
-   ],
-   "selection/addRange-44-expected.txt": [
-    [
-     {}
-    ]
-   ],
-   "selection/addRange-48-expected.txt": [
-    [
-     {}
-    ]
-   ],
-   "selection/addRange-52-expected.txt": [
-    [
-     {}
-    ]
-   ],
-   "selection/addRange-56-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "selection/addRange.js": [
     [
      {}
@@ -21413,11 +21383,6 @@
      {}
     ]
    ],
-   "selection/deleteFromDocument-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "selection/extend-00-expected.txt": [
     [
      {}
@@ -54647,7 +54612,7 @@
    "support"
   ],
   "./MANIFEST.json": [
-   "7cfcce7a806a8848409b9dbea851fadd3544d834",
+   "1ba6d9d96ac2726755be2db4cfbae75877b16384",
    "support"
   ],
   "./README.md": [
@@ -73655,11 +73620,11 @@
    "support"
   ],
   "media-capabilities/idlharness.html": [
-   "4ee7d3eb90c352a0888468578e49bbd49f91b789",
+   "d9a80463af2e0fc7bda0a4370a3ba0bbbb791897",
    "testharness"
   ],
   "media-capabilities/query.html": [
-   "11afd4ba4eb40a5ff89c06ecf375eb16df65faaa",
+   "a83f2c7a7d9c38c707c4f96c3cd74f77185b7e43",
    "testharness"
   ],
   "media/2048x1360-random.jpg": [
@@ -82831,7 +82796,7 @@
    "testharness"
   ],
   "selection/addRange-00-expected.txt": [
-   "0aae2514f1f873b47e60d4c9ea005774afa280ab",
+   "eedac4c59c749216666bcd60a08711810db36e73",
    "support"
   ],
   "selection/addRange-00.html": [
@@ -82839,23 +82804,19 @@
    "testharness"
   ],
   "selection/addRange-04-expected.txt": [
-   "aed11682eea7bed0ef6fc44a5dc68762c13c7394",
+   "cdd195d7aadd66603ca9c0f5bf2b52cf054b92f2",
    "support"
   ],
   "selection/addRange-04.html": [
    "c241e1c3a82f09c14bbf217350b2ee0b58c17178",
    "testharness"
   ],
-  "selection/addRange-08-expected.txt": [
-   "e04b8a016042cc38a748f272cb9d291ba38808c9",
-   "support"
-  ],
   "selection/addRange-08.html": [
    "6d51d9f4042e5590483fae60d19351602d6b0aa2",
    "testharness"
   ],
   "selection/addRange-12-expected.txt": [
-   "b600b87e861e8d4ab6a978e4069bae3e893ac9c3",
+   "c37408236a59467912d31966c48e105b372be787",
    "support"
   ],
   "selection/addRange-12.html": [
@@ -82863,7 +82824,7 @@
    "testharness"
   ],
   "selection/addRange-16-expected.txt": [
-   "e7e68788a479995e679bf6687a69acde4d831f65",
+   "d8e9f67a786aea3ea8b94f942663ad69a419c52a",
    "support"
   ],
   "selection/addRange-16.html": [
@@ -82871,7 +82832,7 @@
    "testharness"
   ],
   "selection/addRange-20-expected.txt": [
-   "72fd62612f49950a11e9d3f98075d763b14fa5e3",
+   "2bc82fd38cd3bd635d3bda05fe3d92bc99f5e98a",
    "support"
   ],
   "selection/addRange-20.html": [
@@ -82879,7 +82840,7 @@
    "testharness"
   ],
   "selection/addRange-24-expected.txt": [
-   "035a0d5cbaac0dba45eb8d446ba5884b9e4cb211",
+   "fd4aabd6d0ed1531e3adc99411095b501e2be0de",
    "support"
   ],
   "selection/addRange-24.html": [
@@ -82887,7 +82848,7 @@
    "testharness"
   ],
   "selection/addRange-28-expected.txt": [
-   "2fd759a58f01cfcdce1f661fa0099a4cd67cb708",
+   "a0eb6bab0cdc1093ccad3c96eef6e99895d1a537",
    "support"
   ],
   "selection/addRange-28.html": [
@@ -82895,7 +82856,7 @@
    "testharness"
   ],
   "selection/addRange-32-expected.txt": [
-   "094c8213b11fab4ee9176ddea024f45c4b64cda7",
+   "c5bc03594b1095dedab19073232291b45f73a31a",
    "support"
   ],
   "selection/addRange-32.html": [
@@ -82903,55 +82864,35 @@
    "testharness"
   ],
   "selection/addRange-36-expected.txt": [
-   "529279feec4f7f6e1141452c032194a397dd5c23",
+   "fbed318b78eb54ba405d9b055d92f66bf899cf0a",
    "support"
   ],
   "selection/addRange-36.html": [
    "9572f7b20ee6891157025e576cf837e496a61669",
    "testharness"
   ],
-  "selection/addRange-40-expected.txt": [
-   "98d62124fc16e591af0d46c8c180db9b44e635e5",
-   "support"
-  ],
   "selection/addRange-40.html": [
    "a58732345d1fdc0b833bf0b9062e44247e0a9592",
    "testharness"
   ],
-  "selection/addRange-44-expected.txt": [
-   "adc6b32fb40a6eb502724c5ad9b789e9bc9075cd",
-   "support"
-  ],
   "selection/addRange-44.html": [
    "7119f750a423fcfed1ddd1b92a48ae28cdaa0f02",
    "testharness"
   ],
-  "selection/addRange-48-expected.txt": [
-   "13233557c60ff6324d2189b88185c0c9bccfd8da",
-   "support"
-  ],
   "selection/addRange-48.html": [
    "c9fdeebfd75735480d07500faf217aae98ec12f1",
    "testharness"
   ],
-  "selection/addRange-52-expected.txt": [
-   "d206db9236166700549a58bb26bef1b48a9e25a1",
-   "support"
-  ],
   "selection/addRange-52.html": [
    "682150b475f15c8cef9e80a0a48e4a80a3a15a48",
    "testharness"
   ],
-  "selection/addRange-56-expected.txt": [
-   "181678d34295b8d870156a35d027995360b46405",
-   "support"
-  ],
   "selection/addRange-56.html": [
    "adcc65d54d59715ee740b2436486058ec578b63a",
    "testharness"
   ],
   "selection/addRange.js": [
-   "df6dcd50618466c323d4343a8a2a55b2443e4498",
+   "67bd52a4653938061f121ed57ead8d768acdde2b",
    "support"
   ],
   "selection/collapse-00-expected.txt": [
@@ -82983,11 +82924,7 @@
    "testharness"
   ],
   "selection/common.js": [
-   "5c8f81d534759a0fa20a78f9643168a6d84d80b3",
-   "support"
-  ],
-  "selection/deleteFromDocument-expected.txt": [
-   "a9c488204dc4254c8dc131859eaff3ef2e0c5429",
+   "279c4bf2f03cb1caa26b83a5898adfbf8bef2a5f",
    "support"
   ],
   "selection/deleteFromDocument.html": [
@@ -82999,7 +82936,7 @@
    "manual"
   ],
   "selection/extend-00-expected.txt": [
-   "b7d26aa46cad23b202e463701295a881785b569d",
+   "3c68a9961b52dbedf5eea97287db485236d34221",
    "support"
   ],
   "selection/extend-00.html": [
@@ -83007,7 +82944,7 @@
    "testharness"
   ],
   "selection/extend-20-expected.txt": [
-   "4d818e9dd9a326818a6defb25579c7ace9c10821",
+   "9acbe1d83b64ae83252fb896a21668944def8f5f",
    "support"
   ],
   "selection/extend-20.html": [
@@ -83015,7 +82952,7 @@
    "testharness"
   ],
   "selection/extend-40-expected.txt": [
-   "42e7a1c1a268ac5d625993d50fce8ecaf52881fa",
+   "0160a1d69f15c454ec0386418f10e8b07daa4fd9",
    "support"
   ],
   "selection/extend-40.html": [
@@ -83023,7 +82960,7 @@
    "testharness"
   ],
   "selection/extend.js": [
-   "6da1fb629a8323f7d45c952e7ff3ce5554f7d722",
+   "21daf8d7634f3c325bf9e5564d21701264497a38",
    "support"
   ],
   "selection/getRangeAt.html": [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.html
index 1fa20c6..af0669b 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.html
@@ -32,11 +32,11 @@
 
 enum MediaConfigurationType {
   "file",
-  "MediaSource",
+  "media-source",
 };
 
 dictionary VideoConfiguration {
-  required DOMString type;
+  required DOMString contentType;
   required unsigned long width;
   required unsigned long height;
   required unsigned long bitrate;
@@ -44,7 +44,7 @@
 };
 
 dictionary AudioConfiguration {
-  required DOMString type;
+  required DOMString contentType;
   DOMString channels;
   unsigned long bitrate;
   unsigned long samplerate;
@@ -58,12 +58,12 @@
 
 [Exposed=(Window)]
 partial interface Navigator {
-  readonly attribute MediaCapabilities mediaCapabilities;
+  [SameObject] readonly attribute MediaCapabilities mediaCapabilities;
 };
 
 [Exposed=(Worker)]
 partial interface WorkerNavigator {
-  readonly attribute MediaCapabilities mediaCapabilities;
+  [SameObject] readonly attribute MediaCapabilities mediaCapabilities;
 };
 
 [Exposed=(Window, Worker)]
diff --git a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/query.html b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/query.html
index 809fbc6..f1bd22b 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/query.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/query.html
@@ -4,6 +4,22 @@
 <script src="/resources/testharnessreport.js"></script>
 <script>
 
+// Minimal VideoConfiguration that will be allowed per spec. All optional
+// properties are missing.
+var minimalVideoConfiguration = {
+  contentType: 'video/webm; codecs="vp9"',
+  width: 800,
+  height: 600,
+  bitrate: 3000,
+  framerate: 24,
+};
+
+// Minimal AudioConfiguration that will be allowed per spec. All optional
+// properties are missing.
+var minimalAudioConfiguration = {
+  contentType: 'audio/webm; codecs="opus"',
+};
+
 promise_test(t => {
   return promise_rejects(t, new TypeError(), navigator.mediaCapabilities.query());
 }, "Test that query rejects if it doesn't get a configuration");
@@ -13,18 +29,17 @@
 }, "Test that query rejects if the MediaConfiguration isn't valid");
 
 promise_test(t => {
+  return promise_rejects(t, new TypeError(), navigator.mediaCapabilities.query({
+    video: minimalVideoConfiguration,
+    audio: minimalAudioConfiguration,
+  }));
+}, "Test that query rejects if the MediaConfiguration does not have a type");
+
+promise_test(t => {
   return navigator.mediaCapabilities.query({
     type: 'file',
-    video: {
-      type: 'video/webm',
-      width: 800,
-      height: 600,
-      bitrate: 3000,
-      framerate: 24,
-    },
-    audio: {
-      type: 'audio/webm',
-    },
+    video: minimalVideoConfiguration,
+    audio: minimalAudioConfiguration,
   }).then(ability => {
     assert_idl_attribute(ability, 'supported');
     assert_idl_attribute(ability, 'smooth');
@@ -32,4 +47,39 @@
   });
 }, "Test that query returns a valid MediaDecodingAbility objects");
 
+async_test(t => {
+  var validTypes = [ 'file', 'media-source' ];
+  var invalidTypes = [ undefined, null, '', 'foobar', 'mse', 'MediaSource' ];
+
+  var validPromises = [];
+  var invalidCaught = 0;
+
+  validTypes.forEach(type => {
+    validPromises.push(navigator.mediaCapabilities.query({
+      type: type,
+      video: minimalVideoConfiguration,
+      audio: minimalAudioConfiguration,
+    }));
+  });
+
+  // validTypes are tested via Promise.all(validPromises) because if one of the
+  // promises fail, Promise.all() will reject. This mechanism can't be used for
+  // invalid types which will be tested individually and increment invalidCaught
+  // when rejected until the amount of rejection matches the expectation.
+  Promise.all(validPromises).then(t.step_func(() => {
+    for (var i = 0; i < invalidTypes.length; ++i) {
+      navigator.mediaCapabilities.query({
+        type: invalidTypes[i],
+        video: minimalVideoConfiguration,
+        audio: minimalAudioConfiguration,
+      }).then(t.unreached_func(), t.step_func(e => {
+        assert_equals(e.name, 'TypeError');
+        ++invalidCaught;
+        if (invalidCaught == invalidTypes.length)
+          t.done();
+      }));
+    }
+  }), t.unreached_func('Promise.all should not reject for valid types'));
+}, "Test that query rejects if the MediaConfiguration does not have a valid type");
+
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/collapseToStartEnd-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/collapseToStartEnd-expected.txt
index a554a4e..5ab3c0d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/collapseToStartEnd-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/collapseToStartEnd-expected.txt
@@ -17,33 +17,25 @@
 CONSOLE ERROR: line 27: The given range isn't in document.
 CONSOLE ERROR: line 80: The given range isn't in document.
 This is a testharness.js-based test.
-Found 118 tests; 12 PASS, 106 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 118 tests; 58 PASS, 60 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Range 0 [] collapseToStart() 
 PASS Range 0 [] collapseToEnd() 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] collapseToStart() 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] collapseToEnd() 
 PASS Range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] collapseToStart() 
-FAIL Range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] collapseToEnd() assert_equals: focusOffset must equal the original end offset expected 1 but got 2
+PASS Range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] collapseToEnd() 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] collapseToStart() 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] collapseToEnd() 
 PASS Range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] collapseToStart() 
-FAIL Range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] collapseToEnd() assert_equals: focusOffset must equal the original end offset expected 9 but got 10
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] collapseToStart() assert_equals: focusNode must equal the original start node expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] collapseToEnd() assert_equals: focusNode must equal the original end node expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL Range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] collapseToStart() assert_equals: focusNode must equal the original start node expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL Range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] collapseToEnd() assert_equals: focusNode must equal the original end node expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] collapseToStart() assert_equals: focusNode must equal the original start node expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] collapseToEnd() assert_equals: focusNode must equal the original end node expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL Range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] collapseToStart() assert_equals: focusNode must equal the original start node expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL Range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] collapseToEnd() assert_equals: focusNode must equal the original end node expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS Range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] collapseToEnd() 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] collapseToStart() 
+PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] collapseToEnd() 
+PASS Range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] collapseToStart() 
+PASS Range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] collapseToEnd() 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] collapseToStart() 
+PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] collapseToEnd() 
+PASS Range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] collapseToStart() 
+PASS Range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] collapseToEnd() 
 FAIL Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0] collapseToStart() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
 FAIL Range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0] collapseToEnd() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
 FAIL Range 10 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 1] collapseToStart() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
@@ -56,90 +48,58 @@
 FAIL Range 13 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1] collapseToEnd() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
 FAIL Range 14 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8] collapseToStart() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
 FAIL Range 14 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8] collapseToEnd() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 1] collapseToStart() assert_equals: focusNode must equal the original start node expected Element node <html><head><title>Selection.collapseTo(Start|End)() test... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 1] collapseToEnd() assert_equals: focusNode must equal the original end node expected Element node <html><head><title>Selection.collapseTo(Start|End)() test... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 16 [document.documentElement, 0, document.documentElement, 2] collapseToStart() assert_equals: focusNode must equal the original start node expected Element node <html><head><title>Selection.collapseTo(Start|End)() test... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 16 [document.documentElement, 0, document.documentElement, 2] collapseToEnd() assert_equals: focusNode must equal the original end node expected Element node <html><head><title>Selection.collapseTo(Start|End)() test... but got Text node "Qrstuvwx"
-FAIL Range 17 [document.documentElement, 1, document.documentElement, 2] collapseToStart() assert_equals: focusNode must equal the original start node expected Element node <html><head><title>Selection.collapseTo(Start|End)() test... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 17 [document.documentElement, 1, document.documentElement, 2] collapseToEnd() assert_equals: focusNode must equal the original end node expected Element node <html><head><title>Selection.collapseTo(Start|End)() test... but got Text node "Qrstuvwx"
-FAIL Range 18 [document.head, 1, document.head, 1] collapseToStart() assert_equals: focusNode must equal the original start node expected Element node <head><title>Selection.collapseTo(Start|End)() tests</tit... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 18 [document.head, 1, document.head, 1] collapseToEnd() assert_equals: focusNode must equal the original end node expected Element node <head><title>Selection.collapseTo(Start|End)() tests</tit... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 19 [document.body, 0, document.body, 1] collapseToStart() assert_equals: focusNode must equal the original start node expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 19 [document.body, 0, document.body, 1] collapseToEnd() assert_equals: focusNode must equal the original end node expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id... but got Text node "Qrstuvwx"
+PASS Range 15 [document.documentElement, 0, document.documentElement, 1] collapseToStart() 
+PASS Range 15 [document.documentElement, 0, document.documentElement, 1] collapseToEnd() 
+PASS Range 16 [document.documentElement, 0, document.documentElement, 2] collapseToStart() 
+PASS Range 16 [document.documentElement, 0, document.documentElement, 2] collapseToEnd() 
+PASS Range 17 [document.documentElement, 1, document.documentElement, 2] collapseToStart() 
+PASS Range 17 [document.documentElement, 1, document.documentElement, 2] collapseToEnd() 
+PASS Range 18 [document.head, 1, document.head, 1] collapseToStart() 
+PASS Range 18 [document.head, 1, document.head, 1] collapseToEnd() 
+PASS Range 19 [document.body, 0, document.body, 1] collapseToStart() 
+PASS Range 19 [document.body, 0, document.body, 1] collapseToEnd() 
 FAIL Range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] collapseToStart() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
 FAIL Range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] collapseToEnd() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
 FAIL Range 21 [foreignDoc.head, 1, foreignDoc.head, 1] collapseToStart() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
 FAIL Range 21 [foreignDoc.head, 1, foreignDoc.head, 1] collapseToEnd() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
 FAIL Range 22 [foreignDoc.body, 0, foreignDoc.body, 0] collapseToStart() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
 FAIL Range 22 [foreignDoc.body, 0, foreignDoc.body, 0] collapseToEnd() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
-FAIL Range 23 [paras[0], 0, paras[0], 0] collapseToStart() assert_equals: focusNode must equal the original start node expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 23 [paras[0], 0, paras[0], 0] collapseToEnd() assert_equals: focusNode must equal the original end node expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 24 [paras[0], 0, paras[0], 1] collapseToStart() assert_equals: focusNode must equal the original start node expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 24 [paras[0], 0, paras[0], 1] collapseToEnd() assert_equals: focusNode must equal the original end node expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS Range 23 [paras[0], 0, paras[0], 0] collapseToStart() 
+PASS Range 23 [paras[0], 0, paras[0], 0] collapseToEnd() 
+PASS Range 24 [paras[0], 0, paras[0], 1] collapseToStart() 
+PASS Range 24 [paras[0], 0, paras[0], 1] collapseToEnd() 
 FAIL Range 25 [detachedPara1, 0, detachedPara1, 0] collapseToStart() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
 FAIL Range 25 [detachedPara1, 0, detachedPara1, 0] collapseToEnd() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
 FAIL Range 26 [detachedPara1, 0, detachedPara1, 1] collapseToStart() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
 FAIL Range 26 [detachedPara1, 0, detachedPara1, 1] collapseToEnd() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] collapseToStart() 
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] collapseToEnd() assert_equals: focusNode must equal the original end node expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] collapseToEnd() 
 PASS Range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] collapseToStart() 
-FAIL Range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] collapseToEnd() assert_equals: focusNode must equal the original end node expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL Range 29 [paras[0].firstChild, 3, paras[3], 1] collapseToStart() assert_equals: focusOffset must equal the original start offset expected 3 but got 4
-FAIL Range 29 [paras[0].firstChild, 3, paras[3], 1] collapseToEnd() assert_equals: focusNode must equal the original end node expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL Range 30 [paras[0], 0, paras[0].firstChild, 7] collapseToStart() assert_equals: focusNode must equal the original start node expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 30 [paras[0], 0, paras[0].firstChild, 7] collapseToEnd() assert_equals: focusOffset must equal the original end offset expected 7 but got 8
-FAIL Range 31 [testDiv, 2, paras[4], 1] collapseToStart() assert_equals: focusNode must equal the original start node expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL Range 31 [testDiv, 2, paras[4], 1] collapseToEnd() assert_equals: focusNode must equal the original end node expected Element node <p id="e" style="display:none">Ghijklmn</p> but got Text node "Qrstuvwx"
-FAIL Range 32 [testDiv, 1, paras[2].firstChild, 5] collapseToStart() assert_equals: focusNode must equal the original start node expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
+PASS Range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] collapseToEnd() 
+PASS Range 29 [paras[0].firstChild, 3, paras[3], 1] collapseToStart() 
+PASS Range 29 [paras[0].firstChild, 3, paras[3], 1] collapseToEnd() 
+PASS Range 30 [paras[0], 0, paras[0].firstChild, 7] collapseToStart() 
+PASS Range 30 [paras[0], 0, paras[0].firstChild, 7] collapseToEnd() 
+PASS Range 31 [testDiv, 2, paras[4], 1] collapseToStart() 
+PASS Range 31 [testDiv, 2, paras[4], 1] collapseToEnd() 
+PASS Range 32 [testDiv, 1, paras[2].firstChild, 5] collapseToStart() 
 PASS Range 32 [testDiv, 1, paras[2].firstChild, 5] collapseToEnd() 
-FAIL Range 33 [document.documentElement, 1, document.body, 0] collapseToStart() assert_equals: focusNode must equal the original start node expected Element node <html><head><title>Selection.collapseTo(Start|End)() test... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 33 [document.documentElement, 1, document.body, 0] collapseToEnd() assert_equals: focusNode must equal the original end node expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS Range 33 [document.documentElement, 1, document.body, 0] collapseToStart() 
+PASS Range 33 [document.documentElement, 1, document.body, 0] collapseToEnd() 
 FAIL Range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] collapseToStart() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
 FAIL Range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] collapseToEnd() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
-FAIL Range 35 [document, 0, document, 1] collapseToStart() assert_equals: focusNode must equal the original start node expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 35 [document, 0, document, 1] collapseToEnd() assert_equals: focusNode must equal the original end node expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 36 [document, 0, document, 2] collapseToStart() assert_equals: focusNode must equal the original start node expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 36 [document, 0, document, 2] collapseToEnd() assert_equals: focusNode must equal the original end node expected Document node with 2 children but got Text node "Qrstuvwx"
-FAIL Range 37 [document, 1, document, 2] collapseToStart() assert_equals: focusNode must equal the original start node expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 37 [document, 1, document, 2] collapseToEnd() assert_equals: focusNode must equal the original end node expected Document node with 2 children but got Text node "Qrstuvwx"
-FAIL Range 38 [testDiv, 0, comment, 5] collapseToStart() assert_equals: focusNode must equal the original start node expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 38 [testDiv, 0, comment, 5] collapseToEnd() assert_equals: focusNode must equal the original end node expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
+PASS Range 35 [document, 0, document, 1] collapseToStart() 
+PASS Range 35 [document, 0, document, 1] collapseToEnd() 
+PASS Range 36 [document, 0, document, 2] collapseToStart() 
+PASS Range 36 [document, 0, document, 2] collapseToEnd() 
+PASS Range 37 [document, 1, document, 2] collapseToStart() 
+PASS Range 37 [document, 1, document, 2] collapseToEnd() 
+PASS Range 38 [testDiv, 0, comment, 5] collapseToStart() 
+PASS Range 38 [testDiv, 0, comment, 5] collapseToEnd() 
 PASS Range 39 [paras[2].firstChild, 4, comment, 2] collapseToStart() 
-FAIL Range 39 [paras[2].firstChild, 4, comment, 2] collapseToEnd() assert_equals: focusNode must equal the original end node expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL Range 40 [paras[3], 1, comment, 8] collapseToStart() assert_equals: focusNode must equal the original start node expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL Range 40 [paras[3], 1, comment, 8] collapseToEnd() assert_equals: focusNode must equal the original end node expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
+PASS Range 39 [paras[2].firstChild, 4, comment, 2] collapseToEnd() 
+PASS Range 40 [paras[3], 1, comment, 8] collapseToStart() 
+PASS Range 40 [paras[3], 1, comment, 8] collapseToEnd() 
 FAIL Range 41 [foreignDoc, 0, foreignDoc, 0] collapseToStart() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
 FAIL Range 41 [foreignDoc, 0, foreignDoc, 0] collapseToEnd() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
 FAIL Range 42 [foreignDoc, 1, foreignComment, 2] collapseToStart() assert_equals: Sanity check: rangeCount must equal 1 after addRange() expected 1 but got 0
diff --git a/third_party/WebKit/LayoutTests/fast/css-intrinsic-dimensions/height-css-tables-expected.html b/third_party/WebKit/LayoutTests/fast/css-intrinsic-dimensions/height-css-tables-expected.html
index 5f4d437..1e3c7f2 100644
--- a/third_party/WebKit/LayoutTests/fast/css-intrinsic-dimensions/height-css-tables-expected.html
+++ b/third_party/WebKit/LayoutTests/fast/css-intrinsic-dimensions/height-css-tables-expected.html
@@ -28,9 +28,10 @@
   </div>
 </div>
 
-
-<div class="table container" style="display: block; float: left; height: 98px;">
-  <div class="td" style="height: 90px;" style="display: block;">
+<!-- crbug.com/690087: We use 99px instead of 100px because we end up discarding 1px when trying
+     to allocate the spare pixels to the table. -->
+<div class="table container" style="display: block; float: left; height: 99px;">
+  <div class="td" style="height: 91px;" style="display: block;">
     <div class="item"></div>
   </div>
 </div>
diff --git a/third_party/WebKit/LayoutTests/fast/css/first-letter-rtc-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/css/first-letter-rtc-crash-expected.txt
index 594e02e..aef377a0 100644
--- a/third_party/WebKit/LayoutTests/fast/css/first-letter-rtc-crash-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css/first-letter-rtc-crash-expected.txt
@@ -1,4 +1,5 @@
 CONSOLE WARNING: line 21: The behavior that Selection.addRange() merges existing Range and the specified Range was removed. See https://www.chromestatus.com/features/6680566019653632 for more details.
-CONSOLE ERROR: line 38: Uncaught HierarchyRequestError: Failed to execute 'insertNode' on 'Range': The node to be inserted contains the insertion point; it may not be inserted into itself.
+CONSOLE ERROR: line 56: Uncaught HierarchyRequestError: Failed to execute 'insertNode' on 'Range': The node to be inserted contains the insertion point; it may not be inserted into itself.
+text
 a
 Test passes if it does not CRASH.
diff --git a/third_party/WebKit/LayoutTests/fast/table/layout-section-when-table-height-changes-2.html b/third_party/WebKit/LayoutTests/fast/table/layout-section-when-table-height-changes-2.html
new file mode 100644
index 0000000..a672749a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/table/layout-section-when-table-height-changes-2.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<p>crbug.com/691968: There should be a blue square below.</p>
+<table id="table" style="border-spacing:0; width:100px; height:200px; background:blue;" data-expected-height=100>
+    <tr>
+        <td></td>
+    </tr>
+</table>
+<div id="results"></div>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/check-layout-th.js"></script>
+<script>
+    document.body.offsetTop;
+    document.getElementById("table").style.height = "100px";
+    checkLayout('#table', results);
+</script>
diff --git a/third_party/WebKit/LayoutTests/fast/table/layout-section-when-table-height-changes-3.html b/third_party/WebKit/LayoutTests/fast/table/layout-section-when-table-height-changes-3.html
new file mode 100644
index 0000000..7090f188
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/table/layout-section-when-table-height-changes-3.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<style>
+table {
+  height: 100%;
+  width: 100%;
+}
+</style>
+<p> crbug.com/691968: There should be no scrollbar. </p>
+<div id="container" style="width: 400px; height: 400px; overflow: auto; overflow-x: hidden;">
+  <table id="table" data-expected-height=200>
+    <colgroup>
+      <col style="width: 1161px;">
+    </colgroup>
+    <tbody>
+      <tr>
+        <td></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+<div id="results"></div>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/check-layout-th.js"></script>
+<script>
+  document.body.offsetTop;
+  document.getElementById("container").style.height = "200px";
+  checkLayout('#table', results);
+</script>
diff --git a/third_party/WebKit/LayoutTests/fast/table/layout-section-when-table-height-changes.html b/third_party/WebKit/LayoutTests/fast/table/layout-section-when-table-height-changes.html
new file mode 100644
index 0000000..4b94b91
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/table/layout-section-when-table-height-changes.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<style>
+table {
+  table-layout: fixed;
+  height: 100%;
+  width: 100%;
+}
+</style>
+<p> crbug.com/691968: There should be no scrollbar. </p>
+<div id="container" style="width: 400px; height: 400px; overflow: auto; overflow-x: hidden;">
+  <table id="table" data-expected-height=200>
+    <colgroup>
+      <col style="width: 1161px;">
+    </colgroup>
+    <tbody>
+      <tr>
+        <td></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+<div id="results"></div>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/check-layout-th.js"></script>
+<script>
+  document.body.offsetTop;
+  document.getElementById("container").style.height = "200px";
+  checkLayout('#table', results);
+</script>
diff --git a/third_party/WebKit/LayoutTests/html/text-level-semantics/abbr-acronym-rendering-expected.html b/third_party/WebKit/LayoutTests/html/text-level-semantics/abbr-acronym-rendering-expected.html
new file mode 100644
index 0000000..13c7e2b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/html/text-level-semantics/abbr-acronym-rendering-expected.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<html>
+<body>
+<span style="text-decoration: dotted underline;">Cr</span>
+<span style="text-decoration: dotted underline;">Pt</span>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/html/text-level-semantics/abbr-acronym-rendering.html b/third_party/WebKit/LayoutTests/html/text-level-semantics/abbr-acronym-rendering.html
new file mode 100644
index 0000000..1d74ce17
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/html/text-level-semantics/abbr-acronym-rendering.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<html>
+<body>
+<abbr title="Chromium">Cr</abbr>
+<acronym title="Platinum">Pt</acronym>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index 5c52844..4553b0d 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -236,6 +236,28 @@
     method constructor
     method matrixTransform
     method toJSON
+interface DOMRect : DOMRectReadOnly
+    getter height
+    getter width
+    getter x
+    getter y
+    method constructor
+    setter height
+    setter width
+    setter x
+    setter y
+interface DOMRectReadOnly
+    static method fromRect
+    getter bottom
+    getter height
+    getter left
+    getter right
+    getter top
+    getter width
+    getter x
+    getter y
+    method constructor
+    method toJSON
 interface DOMStringList
     getter length
     method constructor
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/table-two-pass-layout-overpaint-expected.html b/third_party/WebKit/LayoutTests/paint/invalidation/table-two-pass-layout-overpaint-expected.html
index 013c379..6c8da19 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/table-two-pass-layout-overpaint-expected.html
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/table-two-pass-layout-overpaint-expected.html
@@ -11,8 +11,14 @@
     <tr>
         <td>
             <div id="target"></div>
+            <div id="dummy"></div>
         </td>
     </tr>
 </table>
 </body>
 </html>
+<!-- crbug.com/690087: We do this to force a two-pass layout so that we get the same height on the table as the reference. -->
+<script>
+  document.body.offsetTop;
+  document.getElementById("dummy").style.display = "none";
+</script>
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/table-two-pass-layout-overpaint-expected.txt b/third_party/WebKit/LayoutTests/paint/invalidation/table-two-pass-layout-overpaint-expected.txt
index a3de9dc..f4575e4d 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/table-two-pass-layout-overpaint-expected.txt
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/table-two-pass-layout-overpaint-expected.txt
@@ -7,17 +7,40 @@
       "drawsContent": true,
       "paintInvalidations": [
         {
-          "object": "LayoutBlockFlow DIV id='target'",
-          "rect": [61, 44, 50, 25],
+          "object": "LayoutTable TABLE",
+          "rect": [8, 106, 106, 1],
           "reason": "incremental"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [10, 104, 102, 1],
+          "reason": "incremental"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [11, 45, 100, 25],
+          "reason": "bounds change"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [11, 44, 50, 25],
+          "reason": "bounds change"
         }
       ]
     }
   ],
   "objectPaintInvalidations": [
     {
-      "object": "LayoutBlockFlow DIV id='target'",
+      "object": "LayoutTable TABLE",
       "reason": "incremental"
+    },
+    {
+      "object": "LayoutTableCell TD",
+      "reason": "incremental"
+    },
+    {
+      "object": "LayoutBlockFlow DIV id='target'",
+      "reason": "bounds change"
     }
   ]
 }
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
index 21e61911..17874fc 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index 0c3bd4f9..1db384c 100644
--- a/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -236,6 +236,28 @@
     method constructor
     method matrixTransform
     method toJSON
+interface DOMRect : DOMRectReadOnly
+    getter height
+    getter width
+    getter x
+    getter y
+    method constructor
+    setter height
+    setter width
+    setter x
+    setter y
+interface DOMRectReadOnly
+    static method fromRect
+    getter bottom
+    getter height
+    getter left
+    getter right
+    getter top
+    getter width
+    getter x
+    getter y
+    method constructor
+    method toJSON
 interface DOMStringList
     getter length
     method constructor
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
index c1ec130..76c8ece 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -249,6 +249,30 @@
 [Worker]     method constructor
 [Worker]     method matrixTransform
 [Worker]     method toJSON
+[Worker] interface DOMRect : DOMRectReadOnly
+[Worker]     attribute @@toStringTag
+[Worker]     getter height
+[Worker]     getter width
+[Worker]     getter x
+[Worker]     getter y
+[Worker]     method constructor
+[Worker]     setter height
+[Worker]     setter width
+[Worker]     setter x
+[Worker]     setter y
+[Worker] interface DOMRectReadOnly
+[Worker]     static method fromRect
+[Worker]     attribute @@toStringTag
+[Worker]     getter bottom
+[Worker]     getter height
+[Worker]     getter left
+[Worker]     getter right
+[Worker]     getter top
+[Worker]     getter width
+[Worker]     getter x
+[Worker]     getter y
+[Worker]     method constructor
+[Worker]     method toJSON
 [Worker] interface DOMStringList
 [Worker]     attribute @@toStringTag
 [Worker]     getter length
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
index 97aced3..2b59c05 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -249,6 +249,30 @@
 [Worker]     method constructor
 [Worker]     method matrixTransform
 [Worker]     method toJSON
+[Worker] interface DOMRect : DOMRectReadOnly
+[Worker]     attribute @@toStringTag
+[Worker]     getter height
+[Worker]     getter width
+[Worker]     getter x
+[Worker]     getter y
+[Worker]     method constructor
+[Worker]     setter height
+[Worker]     setter width
+[Worker]     setter x
+[Worker]     setter y
+[Worker] interface DOMRectReadOnly
+[Worker]     static method fromRect
+[Worker]     attribute @@toStringTag
+[Worker]     getter bottom
+[Worker]     getter height
+[Worker]     getter left
+[Worker]     getter right
+[Worker]     getter top
+[Worker]     getter width
+[Worker]     getter x
+[Worker]     getter y
+[Worker]     method constructor
+[Worker]     method toJSON
 [Worker] interface DOMStringList
 [Worker]     attribute @@toStringTag
 [Worker]     getter length
diff --git a/third_party/WebKit/PerformanceTests/Layout/nested-percent-height-tables.html b/third_party/WebKit/PerformanceTests/Layout/nested-percent-height-tables.html
new file mode 100644
index 0000000..934ed15
--- /dev/null
+++ b/third_party/WebKit/PerformanceTests/Layout/nested-percent-height-tables.html
@@ -0,0 +1,94 @@
+<!DOCTYPE HTML>
+<style>
+.body { margin:0; }
+.maxHeight { width:100%; height:100%; }
+.overflowDiv { overflow:hidden; display:inline-block }
+.overflowAuto { overflow:auto; }
+</style>
+<html id="top">
+  <body class="body" style="height:100%;">
+    <table class="maxHeight">
+      <tr>
+        <td style="height:100%;">
+          <div class="maxHeight">
+            <table class="maxHeight">
+              <tr>
+                <td class="maxHeight">
+                  <table class="maxHeight">
+                    <tr>
+                      <td style="height:100%;">
+                        <div class="maxHeight">
+                          <table id="top" class="maxHeight">
+                            <colgroup>
+                              <col/>
+                              <col />
+                              <col  style="width:100%;"/>
+                            </colgroup>
+                            <tr  style="height:100%;">
+                              <td style="height:100%;">
+                                <div class="overflowAuto maxHeight" style="position:relative;">
+                              </td>
+                              <td rowspan="1">
+                                <div class="overflowDiv" >
+                                </div>
+                              </td>
+                              <td style="height:100%;">
+                                <div class="overflowAuto maxHeight" style="position:relative;">
+                                  <div class="maxHeight">
+                                    <table class="maxHeight">
+                                      <tr>
+                                        <td class="maxHeight">
+                                          <table class="maxHeight">
+                                            <tr>
+                                              <td  style="height:100%;">
+                                                <table  class="maxHeight">
+                                                  <tr>
+                                                    <td colspan="2" class="maxHeight">
+                                                      <div class=" maxHeight">
+                                                        <table class="maxHeight">
+                                                          <tr>
+                                                            <td class="maxHeight">
+                                                              <table class="maxHeight">
+                                                                <tr>
+                                                                  <td  style="height:100%;">
+                                                                    <table class="maxHeight">
+                                                                      <tr>
+                                                                        <td class="maxHeight">
+                                                                          <table class="maxHeight">
+                                                                            <tr>
+                                                                              <td class="maxHeight">
+                                                                                <div class="maxHeight">
+                                                                                  <table class="maxHeight">
+                                                                                    <tr>
+                                                                                      <td class="maxHeight">
+                                                                                        <table class="maxHeight">
+                                                                                          <tr>
+                                                                                            <td  class="maxHeight">
+                                                                                              <table class="maxHeight">
+                                                                                                <tr>
+                                                                                                  <td class="maxHeight">
+                                                                                                    <table class="maxHeight">
+                                                                                                      <tr>
+                                                                                                        <td class="maxHeight">
+                                                                                                          <table class="maxHeight">
+                                                                                                            <tr>
+                                                                                                              <td class="maxHeight">
+                                                                                                                <table class="maxHeight">
+                                                                                                                  <tr>
+                                                                                                                    <td class="maxHeight">
+                                                                                                                      <table class="maxHeight">
+                                                                                                                        <tr>
+                                                                                                                          <td class="maxHeight">
+<script src="../resources/runner.js"></script>
+<script>
+function test() {
+  PerfTestRunner.forceLayout();
+  document.getElementById("top").style.height = "100%";
+  PerfTestRunner.forceLayout();
+  document.getElementById("top").style.height = "auto";
+}
+PerfTestRunner.measureRunsPerSecond({
+  description: "Measures performance of nested tables with percent height.",
+  run: test,
+});
+</script>
diff --git a/third_party/WebKit/Source/build/scripts/templates/ComputedStyleBase.h.tmpl b/third_party/WebKit/Source/build/scripts/templates/ComputedStyleBase.h.tmpl
index 8c7a5c4..ef2ec6f 100644
--- a/third_party/WebKit/Source/build/scripts/templates/ComputedStyleBase.h.tmpl
+++ b/third_party/WebKit/Source/build/scripts/templates/ComputedStyleBase.h.tmpl
@@ -77,12 +77,6 @@
         ;
   }
 
-  void setBitDefaults() {
-    {% for field in fields %}
-    {{field.resetter_method_name}}();
-    {% endfor %}
-  }
-
   enum IsAtShadowBoundary {
     AtShadowBoundary,
     NotAtShadowBoundary,
diff --git a/third_party/WebKit/Source/core/css/html.css b/third_party/WebKit/Source/core/css/html.css
index 99c3ae22..a0f1d95 100644
--- a/third_party/WebKit/Source/core/css/html.css
+++ b/third_party/WebKit/Source/core/css/html.css
@@ -909,6 +909,10 @@
     text-decoration: underline
 }
 
+abbr[title], acronym[title] {
+    text-decoration: dotted underline;
+}
+
 strong, b {
     font-weight: bold
 }
diff --git a/third_party/WebKit/Source/core/dom/DOMRect.idl b/third_party/WebKit/Source/core/dom/DOMRect.idl
index 782cc41..dfda1bf 100644
--- a/third_party/WebKit/Source/core/dom/DOMRect.idl
+++ b/third_party/WebKit/Source/core/dom/DOMRect.idl
@@ -9,7 +9,7 @@
                 optional unrestricted double y = 0,
                 optional unrestricted double width = 0,
                 optional unrestricted double height = 0),
-    // FIXME: Exposed=(Window,Worker)
+    Exposed=(Window,Worker),
     RuntimeEnabled=GeometryInterfaces,
 ] interface DOMRect : DOMRectReadOnly {
     [NewObject] static DOMRect fromRect(optional DOMRectInit other);
diff --git a/third_party/WebKit/Source/core/dom/DOMRectReadOnly.idl b/third_party/WebKit/Source/core/dom/DOMRectReadOnly.idl
index 859ecb6..e74e3c9 100644
--- a/third_party/WebKit/Source/core/dom/DOMRectReadOnly.idl
+++ b/third_party/WebKit/Source/core/dom/DOMRectReadOnly.idl
@@ -7,7 +7,7 @@
 [
     Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
                 optional unrestricted double width = 0, optional unrestricted double height = 0),
-    // FIXME: Exposed=(Window,Worker)
+    Exposed=(Window,Worker),
     RuntimeEnabled=GeometryInterfaces,
 ] interface DOMRectReadOnly {
     [NewObject] static DOMRectReadOnly fromRect(optional DOMRectInit other);
diff --git a/third_party/WebKit/Source/core/editing/BUILD.gn b/third_party/WebKit/Source/core/editing/BUILD.gn
index 01bb06b5..ac3beb0f 100644
--- a/third_party/WebKit/Source/core/editing/BUILD.gn
+++ b/third_party/WebKit/Source/core/editing/BUILD.gn
@@ -236,7 +236,6 @@
     "InputMethodControllerTest.cpp",
     "PositionTest.cpp",
     "RelocatablePositionTest.cpp",
-    "SelectionAdjusterTest.cpp",
     "SelectionControllerTest.cpp",
     "SelectionTemplateTest.cpp",
     "SurroundingTextTest.cpp",
diff --git a/third_party/WebKit/Source/core/editing/DOMSelection.cpp b/third_party/WebKit/Source/core/editing/DOMSelection.cpp
index 3ab41952..e38f0d7 100644
--- a/third_party/WebKit/Source/core/editing/DOMSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/DOMSelection.cpp
@@ -258,40 +258,54 @@
   cacheRangeIfSelectionOfDocument(newRange);
 }
 
+// https://www.w3.org/TR/selection-api/#dom-selection-collapsetoend
 void DOMSelection::collapseToEnd(ExceptionState& exceptionState) {
   if (!isAvailable())
     return;
 
-  const VisibleSelection& selection =
-      frame()->selection().computeVisibleSelectionInDOMTreeDeprecated();
-
-  if (selection.isNone()) {
+  // The method must throw InvalidStateError exception if the context object is
+  // empty.
+  if (rangeCount() == 0) {
     exceptionState.throwDOMException(InvalidStateError,
                                      "there is no selection.");
     return;
   }
 
+  // Otherwise, it must create a new range, set both its start and end to the
+  // end of the context object's range,
+  Range* newRange = getRangeAt(0, ASSERT_NO_EXCEPTION)->cloneRange();
+  newRange->collapse(false);
+
+  // and then set the context object's range to the newly-created range.
   SelectionInDOMTree::Builder builder;
-  builder.collapse(selection.end());
+  builder.collapse(newRange->endPosition());
   frame()->selection().setSelection(builder.build());
+  cacheRangeIfSelectionOfDocument(newRange);
 }
 
+// https://www.w3.org/TR/selection-api/#dom-selection-collapsetostart
 void DOMSelection::collapseToStart(ExceptionState& exceptionState) {
   if (!isAvailable())
     return;
 
-  const VisibleSelection& selection =
-      frame()->selection().computeVisibleSelectionInDOMTreeDeprecated();
-
-  if (selection.isNone()) {
+  // The method must throw InvalidStateError ([DOM4]) exception if the context
+  // object is empty.
+  if (rangeCount() == 0) {
     exceptionState.throwDOMException(InvalidStateError,
                                      "there is no selection.");
     return;
   }
 
+  // Otherwise, it must create a new range, set both its start and end to the
+  // start of the context object's range,
+  Range* newRange = getRangeAt(0, ASSERT_NO_EXCEPTION)->cloneRange();
+  newRange->collapse(true);
+
+  // and then set the context object's range to the newly-created range.
   SelectionInDOMTree::Builder builder;
-  builder.collapse(selection.start());
+  builder.collapse(newRange->startPosition());
   frame()->selection().setSelection(builder.build());
+  cacheRangeIfSelectionOfDocument(newRange);
 }
 
 void DOMSelection::empty() {
diff --git a/third_party/WebKit/Source/core/editing/SelectionAdjuster.cpp b/third_party/WebKit/Source/core/editing/SelectionAdjuster.cpp
index 450fe18..4d77b44 100644
--- a/third_party/WebKit/Source/core/editing/SelectionAdjuster.cpp
+++ b/third_party/WebKit/Source/core/editing/SelectionAdjuster.cpp
@@ -153,100 +153,6 @@
 
 }  // namespace
 
-// Updates |selectionInFlatTree| to match with |selection|.
-void SelectionAdjuster::adjustSelectionInFlatTree(
-    VisibleSelectionInFlatTree* selectionInFlatTree,
-    const VisibleSelection& selection) {
-  if (selection.isNone()) {
-    *selectionInFlatTree = VisibleSelectionInFlatTree();
-    return;
-  }
-
-  const PositionInFlatTree& base = toPositionInFlatTree(selection.base());
-  const PositionInFlatTree& extent = toPositionInFlatTree(selection.extent());
-  const PositionInFlatTree& position1 = toPositionInFlatTree(selection.start());
-  const PositionInFlatTree& position2 = toPositionInFlatTree(selection.end());
-  position1.anchorNode()->updateDistribution();
-  position2.anchorNode()->updateDistribution();
-  selectionInFlatTree->m_base = base;
-  selectionInFlatTree->m_extent = extent;
-  selectionInFlatTree->m_affinity = selection.m_affinity;
-  selectionInFlatTree->m_isDirectional = selection.m_isDirectional;
-  selectionInFlatTree->m_granularity = selection.m_granularity;
-  selectionInFlatTree->m_hasTrailingWhitespace =
-      selection.m_hasTrailingWhitespace;
-  selectionInFlatTree->m_baseIsFirst =
-      base.isNull() || base.compareTo(extent) <= 0;
-  if (position1.compareTo(position2) <= 0) {
-    selectionInFlatTree->m_start = position1;
-    selectionInFlatTree->m_end = position2;
-  } else {
-    selectionInFlatTree->m_start = position2;
-    selectionInFlatTree->m_end = position1;
-  }
-  selectionInFlatTree->updateSelectionType();
-}
-
-static bool isCrossingShadowBoundaries(
-    const VisibleSelectionInFlatTree& selection) {
-  if (!selection.isRange())
-    return false;
-  TreeScope& treeScope = selection.base().anchorNode()->treeScope();
-  return selection.extent().anchorNode()->treeScope() != treeScope ||
-         selection.start().anchorNode()->treeScope() != treeScope ||
-         selection.end().anchorNode()->treeScope() != treeScope;
-}
-
-// TODO(yosin): We should make |adjustSelectionInDOMTree()| to return
-// |VisibleSelection| once |VisibleSelection| constructor doesn't call
-// |validate()|.
-void SelectionAdjuster::adjustSelectionInDOMTree(
-    VisibleSelection* selection,
-    const VisibleSelectionInFlatTree& selectionInFlatTree) {
-  if (selectionInFlatTree.isNone()) {
-    *selection = VisibleSelection();
-    return;
-  }
-
-  const Position& base = toPositionInDOMTree(selectionInFlatTree.base());
-  const Position& extent = toPositionInDOMTree(selectionInFlatTree.extent());
-
-  if (isCrossingShadowBoundaries(selectionInFlatTree)) {
-    DCHECK(base.document());
-
-    // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets
-    // needs to be audited.  See http://crbug.com/590369 for more details.
-    // This layout update call cannot be hoisted out of the |if|, otherwise it's
-    // going to cause performance regression (http://crbug.com/652301).
-    // TODO(yosin): Implement and apply lazy visible selection validation so
-    // that we don't need to update layout here.
-    base.document()->updateStyleAndLayoutIgnorePendingStylesheets();
-
-    *selection = createVisibleSelection(
-        SelectionInDOMTree::Builder().setBaseAndExtent(base, extent).build());
-    return;
-  }
-
-  const Position& position1 = toPositionInDOMTree(selectionInFlatTree.start());
-  const Position& position2 = toPositionInDOMTree(selectionInFlatTree.end());
-  selection->m_base = base;
-  selection->m_extent = extent;
-  selection->m_affinity = selectionInFlatTree.m_affinity;
-  selection->m_isDirectional = selectionInFlatTree.m_isDirectional;
-  selection->m_granularity = selectionInFlatTree.m_granularity;
-  selection->m_hasTrailingWhitespace =
-      selectionInFlatTree.m_hasTrailingWhitespace;
-  selection->m_baseIsFirst = base.isNull() || base.compareTo(extent) <= 0;
-  if (position1.compareTo(position2) <= 0) {
-    selection->m_start = position1;
-    selection->m_end = position2;
-  } else {
-    selection->m_start = position2;
-    selection->m_end = position1;
-  }
-  selection->updateSelectionType();
-}
-
 void SelectionAdjuster::adjustSelectionToAvoidCrossingShadowBoundaries(
     VisibleSelection* selection) {
   // Note: |m_selectionType| isn't computed yet.
diff --git a/third_party/WebKit/Source/core/editing/SelectionAdjuster.h b/third_party/WebKit/Source/core/editing/SelectionAdjuster.h
index 37d11e6..92df242a 100644
--- a/third_party/WebKit/Source/core/editing/SelectionAdjuster.h
+++ b/third_party/WebKit/Source/core/editing/SelectionAdjuster.h
@@ -17,10 +17,6 @@
   STATIC_ONLY(SelectionAdjuster);
 
  public:
-  static void adjustSelectionInFlatTree(VisibleSelectionInFlatTree*,
-                                        const VisibleSelection&);
-  static void adjustSelectionInDOMTree(VisibleSelection*,
-                                       const VisibleSelectionInFlatTree&);
   static void adjustSelectionToAvoidCrossingShadowBoundaries(VisibleSelection*);
   static void adjustSelectionToAvoidCrossingShadowBoundaries(
       VisibleSelectionInFlatTree*);
diff --git a/third_party/WebKit/Source/core/editing/SelectionAdjusterTest.cpp b/third_party/WebKit/Source/core/editing/SelectionAdjusterTest.cpp
deleted file mode 100644
index 1e60262..0000000
--- a/third_party/WebKit/Source/core/editing/SelectionAdjusterTest.cpp
+++ /dev/null
@@ -1,47 +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 "core/editing/SelectionAdjuster.h"
-
-#include "core/editing/EditingTestBase.h"
-
-namespace blink {
-
-class SelectionAdjusterTest : public EditingTestBase {};
-
-TEST_F(SelectionAdjusterTest, adjustSelectionInFlatTree) {
-  setBodyContent("<div id=sample>foo</div>");
-  VisibleSelectionInFlatTree selectionInFlatTree;
-
-  Node* const sample = document().getElementById("sample");
-  Node* const foo = sample->firstChild();
-  // Select "foo"
-  VisibleSelection selection =
-      createVisibleSelection(SelectionInDOMTree::Builder()
-                                 .collapse(Position(foo, 0))
-                                 .extend(Position(foo, 3))
-                                 .build());
-  SelectionAdjuster::adjustSelectionInFlatTree(&selectionInFlatTree, selection);
-  EXPECT_EQ(PositionInFlatTree(foo, 0), selectionInFlatTree.start());
-  EXPECT_EQ(PositionInFlatTree(foo, 3), selectionInFlatTree.end());
-}
-
-TEST_F(SelectionAdjusterTest, adjustSelectionInDOMTree) {
-  setBodyContent("<div id=sample>foo</div>");
-  VisibleSelection selection;
-
-  Node* const sample = document().getElementById("sample");
-  Node* const foo = sample->firstChild();
-  // Select "foo"
-  VisibleSelectionInFlatTree selectionInFlatTree =
-      createVisibleSelection(SelectionInFlatTree::Builder()
-                                 .collapse(PositionInFlatTree(foo, 0))
-                                 .extend(PositionInFlatTree(foo, 3))
-                                 .build());
-  SelectionAdjuster::adjustSelectionInDOMTree(&selection, selectionInFlatTree);
-  EXPECT_EQ(Position(foo, 0), selection.start());
-  EXPECT_EQ(Position(foo, 3), selection.end());
-}
-
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp b/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp
index 1ab7b726..549b61c 100644
--- a/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp
+++ b/third_party/WebKit/Source/core/editing/VisibleSelectionTest.cpp
@@ -481,11 +481,6 @@
   // Simulates to restore selection from undo stack.
   selection.updateIfNeeded();
   EXPECT_EQ(Position(sample->firstChild(), 0), selection.start());
-
-  VisibleSelectionInFlatTree selectionInFlatTree;
-  SelectionAdjuster::adjustSelectionInFlatTree(&selectionInFlatTree, selection);
-  EXPECT_EQ(PositionInFlatTree(sample->firstChild(), 0),
-            selectionInFlatTree.start());
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
index 2c123d2..7587722 100644
--- a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
@@ -832,7 +832,7 @@
                                  const String&) {
   return targetFrame(frame, event)
       ->eventHandler()
-      .handleTextInputEvent("\t", event, TextEventInputBackTab);
+      .handleTextInputEvent("\t", event);
 }
 
 static bool executeInsertHorizontalRule(LocalFrame& frame,
diff --git a/third_party/WebKit/Source/core/events/TextEventInputType.h b/third_party/WebKit/Source/core/events/TextEventInputType.h
index a86270f..0c035ae 100644
--- a/third_party/WebKit/Source/core/events/TextEventInputType.h
+++ b/third_party/WebKit/Source/core/events/TextEventInputType.h
@@ -35,12 +35,9 @@
   // Any tab characters in the text are backtabs.
   TextEventInputLineBreak,
   TextEventInputComposition,
-  TextEventInputBackTab,
   TextEventInputPaste,
   TextEventInputDrop,
-  TextEventInputDictation,
   TextEventInputIncrementalInsertion,
-  TextEventInputOther,
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/html/TextControlElement.cpp b/third_party/WebKit/Source/core/html/TextControlElement.cpp
index 0ed399f2..273579c 100644
--- a/third_party/WebKit/Source/core/html/TextControlElement.cpp
+++ b/third_party/WebKit/Source/core/html/TextControlElement.cpp
@@ -434,15 +434,14 @@
     DCHECK_EQ(endPosition.anchorNode()->ownerShadowHost(), this);
   }
 #endif  // DCHECK_IS_ON()
-  VisibleSelection newSelection;
-  if (direction == SelectionHasBackwardDirection)
-    newSelection.setWithoutValidation(endPosition, startPosition);
-  else
-    newSelection.setWithoutValidation(startPosition, endPosition);
-  newSelection.setIsDirectional(direction != SelectionHasNoDirection);
-
   frame->selection().setSelection(
-      newSelection,
+      SelectionInDOMTree::Builder()
+          .collapse(direction == SelectionHasBackwardDirection ? endPosition
+                                                               : startPosition)
+          .extend(direction == SelectionHasBackwardDirection ? startPosition
+                                                             : endPosition)
+          .setIsDirectional(direction != SelectionHasNoDirection)
+          .build(),
       FrameSelection::DoNotAdjustInFlatTree | FrameSelection::CloseTyping |
           FrameSelection::ClearTypingStyle | FrameSelection::DoNotSetFocus);
   return true;
diff --git a/third_party/WebKit/Source/core/layout/LayoutTable.cpp b/third_party/WebKit/Source/core/layout/LayoutTable.cpp
index c497b9f0..ea658b4 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTable.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutTable.cpp
@@ -445,18 +445,22 @@
 
 void LayoutTable::layoutSection(LayoutTableSection& section,
                                 SubtreeLayoutScope& layouter,
-                                LayoutUnit logicalLeft) {
+                                LayoutUnit logicalLeft,
+                                TableHeightChangingValue tableHeightChanging) {
   section.setLogicalLocation(LayoutPoint(logicalLeft, logicalHeight()));
   if (m_columnLogicalWidthChanged)
     layouter.setChildNeedsLayout(&section);
   if (!section.needsLayout())
     markChildForPaginationRelayoutIfNeeded(section, layouter);
-  section.layoutIfNeeded();
-  int sectionLogicalHeight = section.calcRowLogicalHeight();
-  section.setLogicalHeight(LayoutUnit(sectionLogicalHeight));
+  bool neededLayout = section.needsLayout();
+  if (neededLayout)
+    section.layout();
+  if (neededLayout || tableHeightChanging == TableHeightChanging)
+    section.setLogicalHeight(LayoutUnit(section.calcRowLogicalHeight()));
+
   if (view()->layoutState()->isPaginated())
     updateFragmentationInfoForChild(section);
-  setLogicalHeight(logicalHeight() + sectionLogicalHeight);
+  setLogicalHeight(logicalHeight() + section.logicalHeight());
 }
 
 LayoutUnit LayoutTable::logicalHeightFromStyle() const {
@@ -501,8 +505,8 @@
     extraLogicalHeight -=
         section->distributeExtraLogicalHeightToRows(extraLogicalHeight);
 
-  // FIXME: We really would like to enable this ASSERT to ensure that all the
-  // extra space has been distributed.
+  // crbug.com/690087: We really would like to enable this ASSERT to ensure that
+  // all the extra space has been distributed.
   // However our current distribution algorithm does not round properly and thus
   // we can have some remaining height.
   // ASSERT(!topSection() || !extraLogicalHeight);
@@ -623,10 +627,19 @@
       sectionLogicalLeft +=
           style()->isLeftToRightDirection() ? paddingStart() : paddingEnd();
     }
+    LayoutUnit currentAvailableLogicalHeight =
+        availableLogicalHeight(IncludeMarginBorderPadding);
+    TableHeightChangingValue tableHeightChanging =
+        m_oldAvailableLogicalHeight &&
+                m_oldAvailableLogicalHeight != currentAvailableLogicalHeight
+            ? TableHeightChanging
+            : TableHeightNotChanging;
+    m_oldAvailableLogicalHeight = currentAvailableLogicalHeight;
 
     // Lay out table header group.
     if (LayoutTableSection* section = header()) {
-      layoutSection(*section, layouter, sectionLogicalLeft);
+      layoutSection(*section, layouter, sectionLogicalLeft,
+                    tableHeightChanging);
       if (state.isPaginated()) {
         // If the repeating header group allows at least one row of content,
         // then store the offset for other sections to offset their rows
@@ -651,7 +664,8 @@
       if (child->isTableSection()) {
         if (child != header() && child != footer()) {
           LayoutTableSection& section = *toLayoutTableSection(child);
-          layoutSection(section, layouter, sectionLogicalLeft);
+          layoutSection(section, layouter, sectionLogicalLeft,
+                        tableHeightChanging);
         }
       } else if (child->isLayoutTableCol()) {
         child->layoutIfNeeded();
@@ -661,8 +675,10 @@
     }
 
     // Lay out table footer.
-    if (LayoutTableSection* section = footer())
-      layoutSection(*section, layouter, sectionLogicalLeft);
+    if (LayoutTableSection* section = footer()) {
+      layoutSection(*section, layouter, sectionLogicalLeft,
+                    tableHeightChanging);
+    }
 
     setLogicalHeight(tableBoxLogicalTop + borderAndPaddingBefore);
 
diff --git a/third_party/WebKit/Source/core/layout/LayoutTable.h b/third_party/WebKit/Source/core/layout/LayoutTable.h
index b2f86d6..26b7755 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTable.h
+++ b/third_party/WebKit/Source/core/layout/LayoutTable.h
@@ -42,6 +42,7 @@
 class TableLayoutAlgorithm;
 
 enum SkipEmptySectionsValue { DoNotSkipEmptySections, SkipEmptySections };
+enum TableHeightChangingValue { TableHeightNotChanging, TableHeightChanging };
 
 // LayoutTable is the LayoutObject associated with
 // display: table or inline-table.
@@ -515,7 +516,8 @@
   void layoutCaption(LayoutTableCaption&, SubtreeLayoutScope&);
   void layoutSection(LayoutTableSection&,
                      SubtreeLayoutScope&,
-                     LayoutUnit logicalLeft);
+                     LayoutUnit logicalLeft,
+                     TableHeightChangingValue);
 
   // Return the logical height based on the height, min-height and max-height
   // properties from CSS. Will return 0 if auto.
@@ -599,6 +601,7 @@
 
   LayoutUnit m_blockOffsetToFirstRepeatableHeader;
   LayoutUnit m_rowOffsetFromRepeatingHeader;
+  LayoutUnit m_oldAvailableLogicalHeight;
 };
 
 inline LayoutTableSection* LayoutTable::topSection() const {
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableSection.h b/third_party/WebKit/Source/core/layout/LayoutTableSection.h
index f7d6d1d..0254244 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTableSection.h
+++ b/third_party/WebKit/Source/core/layout/LayoutTableSection.h
@@ -329,6 +329,8 @@
 
   bool isRepeatingHeaderGroup() const;
 
+  void layout() override;
+
  protected:
   void styleDidChange(StyleDifference, const ComputedStyle* oldStyle) override;
   bool nodeAtPoint(HitTestResult&,
@@ -343,8 +345,6 @@
 
   void willBeRemovedFromTree() override;
 
-  void layout() override;
-
   int borderSpacingForRow(unsigned row) const {
     return m_grid[row].rowLayoutObject ? table()->vBorderSpacing() : 0;
   }
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.cpp b/third_party/WebKit/Source/core/style/ComputedStyle.cpp
index bc38abc..08720ae 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyle.cpp
+++ b/third_party/WebKit/Source/core/style/ComputedStyle.cpp
@@ -124,7 +124,8 @@
       m_rareInheritedData(initialStyle().m_rareInheritedData),
       m_styleInheritedData(initialStyle().m_styleInheritedData),
       m_svgStyle(initialStyle().m_svgStyle) {
-  setBitDefaults();  // Would it be faster to copy this from the default style?
+  initializeBitDefaults();  // Would it be faster to copy this from the default
+                            // style?
   static_assert((sizeof(InheritedData) <= 8), "InheritedData should not grow");
   static_assert((sizeof(NonInheritedData) <= 12),
                 "NonInheritedData should not grow");
@@ -132,7 +133,7 @@
 
 ALWAYS_INLINE ComputedStyle::ComputedStyle(InitialStyleTag)
     : ComputedStyleBase(), RefCounted<ComputedStyle>() {
-  setBitDefaults();
+  initializeBitDefaults();
 
   m_box.init();
   m_visual.init();
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.h b/third_party/WebKit/Source/core/style/ComputedStyle.h
index 37acb41..a297c51 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyle.h
+++ b/third_party/WebKit/Source/core/style/ComputedStyle.h
@@ -290,9 +290,9 @@
 
   // !END SYNC!
 
-  void setBitDefaults() {
-    // Generated properties are updated in ComputedStyleBase
-    ComputedStyleBase::setBitDefaults();
+  // Only call inside the constructor. Generated properties in the base class
+  // are not initialized in this method.
+  void initializeBitDefaults() {
     m_inheritedData.m_hasSimpleUnderline = false;
     m_inheritedData.m_cursorStyle = static_cast<unsigned>(initialCursor());
     m_inheritedData.m_insideLink =
diff --git a/third_party/WebKit/Source/modules/mediacapabilities/AudioConfiguration.idl b/third_party/WebKit/Source/modules/mediacapabilities/AudioConfiguration.idl
index 3c4128b..cd9fcfc 100644
--- a/third_party/WebKit/Source/modules/mediacapabilities/AudioConfiguration.idl
+++ b/third_party/WebKit/Source/modules/mediacapabilities/AudioConfiguration.idl
@@ -5,7 +5,7 @@
 // https://wicg.github.io/media-capabilities/#dictdef-audioconfiguration
 
 dictionary AudioConfiguration {
-    required DOMString type;
+    required DOMString contentType;
 
     DOMString channels;
     unsigned long bitrate;
diff --git a/third_party/WebKit/Source/modules/mediacapabilities/MediaConfiguration.idl b/third_party/WebKit/Source/modules/mediacapabilities/MediaConfiguration.idl
index 5d82f14..aa3da1d 100644
--- a/third_party/WebKit/Source/modules/mediacapabilities/MediaConfiguration.idl
+++ b/third_party/WebKit/Source/modules/mediacapabilities/MediaConfiguration.idl
@@ -6,7 +6,7 @@
 
 enum MediaConfigurationType {
     "file",
-    "MediaSource",
+    "media-source",
 };
 
 dictionary MediaConfiguration {
diff --git a/third_party/WebKit/Source/modules/mediacapabilities/VideoConfiguration.idl b/third_party/WebKit/Source/modules/mediacapabilities/VideoConfiguration.idl
index bf4f615..af63d0b 100644
--- a/third_party/WebKit/Source/modules/mediacapabilities/VideoConfiguration.idl
+++ b/third_party/WebKit/Source/modules/mediacapabilities/VideoConfiguration.idl
@@ -5,7 +5,7 @@
 // https://wicg.github.io/media-capabilities/#dictdef-videoconfiguration
 
 dictionary VideoConfiguration {
-    required DOMString type;
+    required DOMString contentType;
     required unsigned long width;
     required unsigned long height;
     required unsigned long bitrate;
diff --git a/ui/base/x/x11_util.cc b/ui/base/x/x11_util.cc
index 43bb7d7..dbb489fa 100644
--- a/ui/base/x/x11_util.cc
+++ b/ui/base/x/x11_util.cc
@@ -288,7 +288,9 @@
 
 XcursorImage* SkBitmapToXcursorImage(const SkBitmap* cursor_image,
                                      const gfx::Point& hotspot) {
-  DCHECK(cursor_image->colorType() == kN32_SkColorType);
+  // TODO(crbug.com/596782): It is possible for cursor_image to be zeroed out
+  // at this point, which leads to benign debug errors. Once this is fixed, we
+  // should  DCHECK_EQ(cursor_image->colorType(), kN32_SkColorType).
   gfx::Point hotspot_point = hotspot;
   SkBitmap scaled;