diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
index 34089a8..c22161d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -223,7 +223,6 @@
     public static final String NTP_MODERN_LAYOUT = "NTPModernLayout";
     public static final String NTP_FOREIGN_SESSIONS_SUGGESTIONS = "NTPForeignSessionsSuggestions";
     public static final String NTP_LAUNCH_AFTER_INACTIVITY = "NTPLaunchAfterInactivity";
-    public static final String NTP_OFFLINE_PAGES_FEATURE_NAME = "NTPOfflinePages";
     public static final String NTP_SHOW_GOOGLE_G_IN_OMNIBOX = "NTPShowGoogleGInOmnibox";
     public static final String NTP_SNIPPETS_INCREASED_VISIBILITY = "NTPSnippetsIncreasedVisibility";
     public static final String OMNIBOX_SPARE_RENDERER = "OmniboxSpareRenderer";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsCarouselAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsCarouselAdapter.java
index 8cca410..d1698bf5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsCarouselAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsCarouselAdapter.java
@@ -4,11 +4,9 @@
 
 package org.chromium.chrome.browser.suggestions;
 
-import android.support.annotation.Nullable;
 import android.support.v7.widget.RecyclerView;
 import android.view.ViewGroup;
 
-import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ntp.ContextMenuManager;
 import org.chromium.chrome.browser.ntp.snippets.SnippetArticle;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
@@ -33,11 +31,7 @@
     /** The list of suggestions held in the carousel currently. */
     private final List<SnippetArticle> mSuggestionsList;
 
-    /**
-     * Access point to offline related features. Will be {@code null} when the badges are disabled.
-     * @see ChromeFeatureList#NTP_OFFLINE_PAGES_FEATURE_NAME
-     */
-    @Nullable
+    /** Access point to offline related features. */
     private final OfflineModelObserver mObserver;
 
     public SuggestionsCarouselAdapter(UiConfig uiConfig, SuggestionsUiDelegate uiDelegate,
@@ -46,13 +40,8 @@
         mUiConfig = uiConfig;
         mContextMenuManager = contextMenuManager;
         mSuggestionsList = new ArrayList<>();
-
-        if (ChromeFeatureList.isEnabled(ChromeFeatureList.NTP_OFFLINE_PAGES_FEATURE_NAME)) {
-            mObserver = new OfflineModelObserver(offlinePageBridge);
-            mUiDelegate.addDestructionObserver(mObserver);
-        } else {
-            mObserver = null;
-        }
+        mObserver = new OfflineModelObserver(offlinePageBridge);
+        mUiDelegate.addDestructionObserver(mObserver);
     }
 
     @Override
@@ -85,10 +74,8 @@
         mSuggestionsList.clear();
         mSuggestionsList.addAll(suggestions);
 
-        if (mObserver != null) {
-            mObserver.updateAllSuggestionsOfflineAvailability(
-                    /* reportPrefetchedSuggestionsCount = */ false);
-        }
+        mObserver.updateAllSuggestionsOfflineAvailability(
+                /* reportPrefetchedSuggestionsCount = */ false);
 
         notifyDataSetChanged();
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/TileGroup.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/TileGroup.java
index ebd8486..3ffbf05 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/TileGroup.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/TileGroup.java
@@ -16,7 +16,6 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.VisibleForTesting;
-import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.favicon.IconType;
 import org.chromium.chrome.browser.favicon.LargeIconBridge;
 import org.chromium.chrome.browser.ntp.ContextMenuManager;
@@ -154,11 +153,7 @@
      */
     private final Collection<Integer> mPendingTasks = new ArrayList<>();
 
-    /**
-     * Access point to offline related features. Will be {@code null} when the badges are disabled.
-     * @see ChromeFeatureList#NTP_OFFLINE_PAGES_FEATURE_NAME
-     */
-    @Nullable
+    /** Access point to offline related features. */
     private final OfflineModelObserver mOfflineModelObserver;
 
     /**
@@ -225,13 +220,8 @@
         mTileGroupDelegate = tileGroupDelegate;
         mObserver = observer;
         mTileRenderer = tileRenderer;
-
-        if (ChromeFeatureList.isEnabled(ChromeFeatureList.NTP_OFFLINE_PAGES_FEATURE_NAME)) {
-            mOfflineModelObserver = new OfflineModelObserver(offlinePageBridge);
-            mUiDelegate.addDestructionObserver(mOfflineModelObserver);
-        } else {
-            mOfflineModelObserver = null;
-        }
+        mOfflineModelObserver = new OfflineModelObserver(offlinePageBridge);
+        mUiDelegate.addDestructionObserver(mOfflineModelObserver);
     }
 
     @Override
@@ -366,10 +356,8 @@
 
         if (!dataChanged) return;
 
-        if (mOfflineModelObserver != null) {
-            mOfflineModelObserver.updateAllSuggestionsOfflineAvailability(
-                    /* reportPrefetchedSuggestionsCount = */ false);
-        }
+        mOfflineModelObserver.updateAllSuggestionsOfflineAvailability(
+                /* reportPrefetchedSuggestionsCount = */ false);
 
         if (countChanged) mObserver.onTileCountChanged();
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/TileGroupDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/TileGroupDelegateImpl.java
index 99d0566..7c517e9a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/TileGroupDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/TileGroupDelegateImpl.java
@@ -10,7 +10,6 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ntp.NewTabPageUma;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.snackbar.Snackbar;
@@ -84,11 +83,9 @@
 
         mMostVisitedSites.recordPageImpression(tiles.size());
 
-        if (ChromeFeatureList.isEnabled(ChromeFeatureList.NTP_OFFLINE_PAGES_FEATURE_NAME)) {
-            for (Tile tile : tiles) {
-                if (tile.isOfflineAvailable()) {
-                    SuggestionsMetrics.recordTileOfflineAvailability(tile.getIndex());
-                }
+        for (Tile tile : tiles) {
+            if (tile.isOfflineAvailable()) {
+                SuggestionsMetrics.recordTileOfflineAvailability(tile.getIndex());
             }
         }
     }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/SuggestionsCarouselTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/SuggestionsCarouselTest.java
index bb26554..180a6a7 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/SuggestionsCarouselTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/SuggestionsCarouselTest.java
@@ -41,8 +41,7 @@
  */
 @RunWith(LocalRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
-@EnableFeatures({ChromeFeatureList.CHROME_HOME, ChromeFeatureList.CONTEXTUAL_SUGGESTIONS_CAROUSEL,
-        ChromeFeatureList.NTP_OFFLINE_PAGES_FEATURE_NAME})
+@EnableFeatures({ChromeFeatureList.CHROME_HOME, ChromeFeatureList.CONTEXTUAL_SUGGESTIONS_CAROUSEL})
 public class SuggestionsCarouselTest {
     private static final String URL_STRING = "http://www.test.com";
     private static final String INVALID_URL = "file://URL";
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/TileGroupUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/TileGroupUnitTest.java
index 0c9b9531..0b390a3 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/TileGroupUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/TileGroupUnitTest.java
@@ -52,7 +52,6 @@
 import org.chromium.chrome.test.util.browser.ChromeHome;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
-import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.chrome.test.util.browser.suggestions.FakeMostVisitedSites;
 import org.chromium.testing.local.LocalRobolectricTestRunner;
 
@@ -65,7 +64,6 @@
  */
 @RunWith(LocalRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
-@EnableFeatures(ChromeFeatureList.NTP_OFFLINE_PAGES_FEATURE_NAME)
 @DisableFeatures({ChromeFeatureList.NTP_MODERN_LAYOUT})
 @ChromeHome.Enable
 public class TileGroupUnitTest {
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 7dde218..3011f82 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2602,9 +2602,6 @@
      FEATURE_VALUE_TYPE(content::kWebRtcH264WithOpenH264FFmpeg)},
 #endif  // ENABLE_WEBRTC && BUILDFLAG(RTC_USE_H264) && !MEDIA_DISABLE_FFMPEG
 #if defined(OS_ANDROID)
-    {"offline-pages-ntp", flag_descriptions::kNtpOfflinePagesName,
-     flag_descriptions::kNtpOfflinePagesDescription, kOsAndroid,
-     FEATURE_VALUE_TYPE(chrome::android::kNTPOfflinePagesFeature)},
     {"offlining-recent-pages", flag_descriptions::kOffliningRecentPagesName,
      flag_descriptions::kOffliningRecentPagesDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(offline_pages::kOffliningRecentPagesFeature)},
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
index 0fa76ec1..7f0dd14 100644
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
@@ -102,7 +102,6 @@
     &kNTPCondensedTileLayoutFeature,
     &kNTPModernLayoutFeature,
     &kNTPLaunchAfterInactivity,
-    &kNTPOfflinePagesFeature,
     &NTPShowGoogleGInOmniboxFeature,
     &kOmniboxSpareRenderer,
     &kPayWithGoogleV1,
@@ -309,9 +308,6 @@
 const base::Feature kNTPLaunchAfterInactivity{
     "NTPLaunchAfterInactivity", base::FEATURE_DISABLED_BY_DEFAULT};
 
-const base::Feature kNTPOfflinePagesFeature{"NTPOfflinePages",
-                                            base::FEATURE_ENABLED_BY_DEFAULT};
-
 const base::Feature NTPShowGoogleGInOmniboxFeature{
     "NTPShowGoogleGInOmnibox", base::FEATURE_DISABLED_BY_DEFAULT};
 
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h
index ceef8e6..1b09a01 100644
--- a/chrome/browser/android/chrome_feature_list.h
+++ b/chrome/browser/android/chrome_feature_list.h
@@ -62,7 +62,6 @@
 extern const base::Feature kNTPCondensedTileLayoutFeature;
 extern const base::Feature kNTPModernLayoutFeature;
 extern const base::Feature kNTPLaunchAfterInactivity;
-extern const base::Feature kNTPOfflinePagesFeature;
 extern const base::Feature NTPShowGoogleGInOmniboxFeature;
 extern const base::Feature kOmniboxSpareRenderer;
 extern const base::Feature kPayWithGoogleV1;
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 18597687..302fe34 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1992,11 +1992,6 @@
 const char kNtpGoogleGInOmniboxDescription[] =
     "Show a Google G in the omnibox on the New Tab Page.";
 
-const char kNtpOfflinePagesName[] = "Enable NTP offline pages";
-const char kNtpOfflinePagesDescription[] =
-    "Enables badging of offline pages on the New Tab page. Only relevant if "
-    "offline pages are enabled.";
-
 const char kNtpPopularSitesName[] = "Show popular sites on the New Tab page";
 const char kNtpPopularSitesDescription[] =
     "Pre-populate the New Tab page with popular sites.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index e0898576..56c1f2f 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1221,9 +1221,6 @@
 extern const char kNtpGoogleGInOmniboxName[];
 extern const char kNtpGoogleGInOmniboxDescription[];
 
-extern const char kNtpOfflinePagesName[];
-extern const char kNtpOfflinePagesDescription[];
-
 extern const char kNtpPopularSitesName[];
 extern const char kNtpPopularSitesDescription[];
 
diff --git a/chrome/browser/signin/dice_tab_helper.cc b/chrome/browser/signin/dice_tab_helper.cc
index b9e98a5..5897268 100644
--- a/chrome/browser/signin/dice_tab_helper.cc
+++ b/chrome/browser/signin/dice_tab_helper.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/signin/dice_tab_helper.h"
 
 #include "base/logging.h"
+#include "base/metrics/user_metrics.h"
 #include "chrome/browser/signin/dice_tab_helper.h"
 #include "chrome/browser/signin/signin_util.h"
 #include "chrome/browser/ui/browser_finder.h"
@@ -15,13 +16,9 @@
 DEFINE_WEB_CONTENTS_USER_DATA_KEY(DiceTabHelper);
 
 DiceTabHelper::DiceTabHelper(content::WebContents* web_contents)
-    : content::WebContentsObserver(web_contents),
-      signin_access_point_(signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN),
-      signin_reason_(signin_metrics::Reason::REASON_UNKNOWN_REASON),
-      should_start_sync_after_web_signin_(true) {
-}
+    : content::WebContentsObserver(web_contents) {}
 
-DiceTabHelper::~DiceTabHelper() {}
+DiceTabHelper::~DiceTabHelper() = default;
 
 void DiceTabHelper::InitializeSigninFlow(
     signin_metrics::AccessPoint access_point,
@@ -29,6 +26,13 @@
   signin_access_point_ = access_point;
   signin_reason_ = reason;
   should_start_sync_after_web_signin_ = true;
+  did_finish_loading_signin_page_ = false;
+
+  if (signin_reason_ == signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT) {
+    signin_metrics::LogSigninAccessPointStarted(access_point);
+    signin_metrics::RecordSigninUserActionForAccessPoint(access_point);
+    base::RecordAction(base::UserMetricsAction("Signin_SigninPage_Loading"));
+  }
 }
 
 void DiceTabHelper::DidStartNavigation(
@@ -56,11 +60,16 @@
     should_start_sync_after_web_signin_ = false;
     return;
   }
+}
 
-  // TODO(msarda): Figure out if this condition can be restricted even more
-  // (e.g. avoid starting sync after a browser initiated navigation).
-  // if (!navigation_handle->IsRendererInitiated()) {
-  //  // Avoid starting sync if the navigations comes from the browser.
-  //  should_start_sync_after_web_signin_ = false;
-  //}
+void DiceTabHelper::DidFinishLoad(content::RenderFrameHost* render_frame_host,
+                                  const GURL& validated_url) {
+  if (!should_start_sync_after_web_signin_ || did_finish_loading_signin_page_)
+    return;
+
+  if (validated_url.GetOrigin() == GaiaUrls::GetInstance()->gaia_url()) {
+    VLOG(1) << "Finished loading sign-in page: " << validated_url.spec();
+    did_finish_loading_signin_page_ = true;
+    base::RecordAction(base::UserMetricsAction("Signin_SigninPage_Shown"));
+  }
 }
diff --git a/chrome/browser/signin/dice_tab_helper.h b/chrome/browser/signin/dice_tab_helper.h
index 8e9aecf..c336b0cf 100644
--- a/chrome/browser/signin/dice_tab_helper.h
+++ b/chrome/browser/signin/dice_tab_helper.h
@@ -10,6 +10,9 @@
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents_user_data.h"
 
+namespace content {
+class RenderFrameHost;
+}
 // Tab helper used for DICE to mark that sync should start after a web sign-in
 // with a Google account.
 class DiceTabHelper : public content::WebContentsUserData<DiceTabHelper>,
@@ -36,14 +39,19 @@
   // content::WebContentsObserver:
   void DidStartNavigation(
       content::NavigationHandle* navigation_handle) override;
+  void DidFinishLoad(content::RenderFrameHost* render_frame_host,
+                     const GURL& validated_url) override;
 
  private:
   friend class content::WebContentsUserData<DiceTabHelper>;
   explicit DiceTabHelper(content::WebContents* web_contents);
 
-  signin_metrics::AccessPoint signin_access_point_;
-  signin_metrics::Reason signin_reason_;
-  bool should_start_sync_after_web_signin_;
+  signin_metrics::AccessPoint signin_access_point_ =
+      signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN;
+  signin_metrics::Reason signin_reason_ =
+      signin_metrics::Reason::REASON_UNKNOWN_REASON;
+  bool should_start_sync_after_web_signin_ = true;
+  bool did_finish_loading_signin_page_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(DiceTabHelper);
 };
diff --git a/chrome/browser/signin/dice_tab_helper_unittest.cc b/chrome/browser/signin/dice_tab_helper_unittest.cc
index 0c66541..a6b01e97 100644
--- a/chrome/browser/signin/dice_tab_helper_unittest.cc
+++ b/chrome/browser/signin/dice_tab_helper_unittest.cc
@@ -4,10 +4,13 @@
 
 #include "chrome/browser/signin/dice_tab_helper.h"
 
+#include "base/test/histogram_tester.h"
+#include "base/test/user_action_tester.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/signin/core/browser/signin_metrics.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "content/public/test/test_web_contents_factory.h"
+#include "google_apis/gaia/gaia_urls.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 // Tests DiceTabHelper intialization.
@@ -35,3 +38,55 @@
   EXPECT_EQ(access_point, dice_tab_helper->signin_access_point());
   EXPECT_EQ(reason, dice_tab_helper->signin_reason());
 }
+
+// Tests DiceTabHelper metrics.
+TEST(DiceTabHelperTest, Metrics) {
+  base::UserActionTester ua_tester;
+  base::HistogramTester h_tester;
+  content::TestBrowserThreadBundle thread_bundle;
+  TestingProfile profile;
+  content::TestWebContentsFactory factory;
+  content::WebContents* web_contents = factory.CreateWebContents(&profile);
+  DiceTabHelper::CreateForWebContents(web_contents);
+  DiceTabHelper* dice_tab_helper = DiceTabHelper::FromWebContents(web_contents);
+
+  // No metrics are logged when the Dice tab helper is created.
+  EXPECT_EQ(0, ua_tester.GetActionCount("Signin_Signin_FromStartPage"));
+  EXPECT_EQ(0, ua_tester.GetActionCount("Signin_SigninPage_Loading"));
+  EXPECT_EQ(0, ua_tester.GetActionCount("Signin_SigninPage_Shown"));
+
+  // Check metrics logged when the Dice tab helper is initialized.
+  dice_tab_helper->InitializeSigninFlow(
+      signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE,
+      signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT);
+  EXPECT_EQ(1, ua_tester.GetActionCount("Signin_Signin_FromStartPage"));
+  EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Loading"));
+  EXPECT_EQ(0, ua_tester.GetActionCount("Signin_SigninPage_Shown"));
+  EXPECT_EQ(1, h_tester.GetBucketCount(
+                   "Signin.SigninStartedAccessPoint",
+                   static_cast<int>(
+                       signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE)));
+
+  // First call to did finish load does logs any Signin_SigninPage_Shown user
+  // action.
+  GURL signin_page_url = GaiaUrls::GetInstance()->gaia_url();
+  dice_tab_helper->DidFinishLoad(nullptr, signin_page_url);
+  EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Loading"));
+  EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Shown"));
+
+  // Second call to did finish load does not log any metrics.
+  dice_tab_helper->DidFinishLoad(nullptr, signin_page_url);
+  EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Loading"));
+  EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Shown"));
+
+  // Check metrics are logged again when the Dice tab helper is re-initialized.
+  dice_tab_helper->InitializeSigninFlow(
+      signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE,
+      signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT);
+  EXPECT_EQ(2, ua_tester.GetActionCount("Signin_Signin_FromStartPage"));
+  EXPECT_EQ(2, ua_tester.GetActionCount("Signin_SigninPage_Loading"));
+  EXPECT_EQ(2, h_tester.GetBucketCount(
+                   "Signin.SigninStartedAccessPoint",
+                   static_cast<int>(
+                       signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE)));
+}
diff --git a/chrome/browser/ui/signin_view_controller.cc b/chrome/browser/ui/signin_view_controller.cc
index 83a94507..201e8ce 100644
--- a/chrome/browser/ui/signin_view_controller.cc
+++ b/chrome/browser/ui/signin_view_controller.cc
@@ -155,11 +155,6 @@
   DiceTabHelper::CreateForWebContents(active_contents);
   DiceTabHelper* tab_helper = DiceTabHelper::FromWebContents(active_contents);
   tab_helper->InitializeSigninFlow(access_point, signin_reason);
-
-  if (signin_reason == signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT) {
-    signin_metrics::LogSigninAccessPointStarted(access_point);
-    signin_metrics::RecordSigninUserActionForAccessPoint(access_point);
-  }
 }
 
 content::WebContents*
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.mm
index c3be8806..eab84bfb 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.mm
@@ -34,6 +34,7 @@
 #import "ios/chrome/browser/ui/bookmarks/bookmark_promo_controller.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_table_view.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h"
+#import "ios/chrome/browser/ui/keyboard/UIKeyCommand+Chrome.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
@@ -167,6 +168,16 @@
   return NO;
 }
 
+- (NSArray*)keyCommands {
+  __weak BookmarkHomeHandsetViewController* weakSelf = self;
+  return @[ [UIKeyCommand cr_keyCommandWithInput:UIKeyInputEscape
+                                   modifierFlags:Cr_UIKeyModifierNone
+                                           title:nil
+                                          action:^{
+                                            [weakSelf navigationBarCancel:nil];
+                                          }] ];
+}
+
 #pragma mark - Superclass overrides
 
 - (void)loadBookmarkViews {
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/BUILD.gn b/ios/chrome/browser/ui/ntp/recent_tabs/BUILD.gn
index 0e94a3d..b33f877 100644
--- a/ios/chrome/browser/ui/ntp/recent_tabs/BUILD.gn
+++ b/ios/chrome/browser/ui/ntp/recent_tabs/BUILD.gn
@@ -36,6 +36,7 @@
     "//ios/chrome/browser/ui/authentication:authentication_ui",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/context_menu",
+    "//ios/chrome/browser/ui/keyboard",
     "//ios/chrome/browser/ui/ntp",
     "//ios/chrome/browser/ui/ntp/recent_tabs/views",
     "//ios/chrome/browser/ui/settings/sync_utils",
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_view_controller.mm b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_view_controller.mm
index 382176a..744148f 100644
--- a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_view_controller.mm
+++ b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_view_controller.mm
@@ -5,6 +5,7 @@
 #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_view_controller.h"
 
 #include "base/logging.h"
+#import "ios/chrome/browser/ui/keyboard/UIKeyCommand+Chrome.h"
 #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_coordinator.h"
 #import "ios/chrome/browser/ui/ntp/recent_tabs/views/panel_bar_view.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
@@ -83,6 +84,16 @@
   return NO;
 }
 
+- (NSArray*)keyCommands {
+  __weak RecentTabsHandsetViewController* weakSelf = self;
+  return @[ [UIKeyCommand cr_keyCommandWithInput:UIKeyInputEscape
+                                   modifierFlags:Cr_UIKeyModifierNone
+                                           title:nil
+                                          action:^{
+                                            [weakSelf didFinish];
+                                          }] ];
+}
+
 #pragma mark Accessibility
 
 - (BOOL)accessibilityPerformEscape {
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm
index b12b9702..ab6fa6c 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm
@@ -60,8 +60,11 @@
 @property(nonatomic, assign) BOOL voiceSearchEnabled;
 @property(nonatomic, strong) MDCProgressView* progressBar;
 @property(nonatomic, strong) UIStackView* locationBarContainerStackView;
-// The shadow below the toolbar. Lazily instantiated.
+// The shadow below the toolbar when the omnibox is contracted. Lazily
+// instantiated.
 @property(nonatomic, strong) UIImageView* shadowView;
+// The shadow below the expanded omnibox. Lazily instantiated.
+@property(nonatomic, strong) UIImageView* fullBleedShadowView;
 // Background view, used to display the incognito NTP background color on the
 // toolbar.
 @property(nonatomic, strong) UIView* backgroundView;
@@ -110,6 +113,7 @@
 @synthesize progressBar = _progressBar;
 @synthesize locationBarContainerStackView = _locationBarContainerStackView;
 @synthesize shadowView = _shadowView;
+@synthesize fullBleedShadowView = _fullBleedShadowView;
 @synthesize expandedToolbarConstraints = _expandedToolbarConstraints;
 @synthesize topSafeAnchor = _topSafeAnchor;
 @synthesize regularToolbarConstraints = _regularToolbarConstraints;
@@ -164,6 +168,8 @@
 
   [animator addAnimations:^{
     [self.view layoutIfNeeded];
+    self.shadowView.alpha = 0;
+    self.fullBleedShadowView.alpha = 1;
   }];
   // When the locationBarContainer has been expanded the Contract button will
   // fade in.
@@ -208,6 +214,8 @@
     [self.view layoutIfNeeded];
     self.contractButton.hidden = YES;
     self.contractButton.alpha = 0;
+    self.shadowView.alpha = 1;
+    self.fullBleedShadowView.alpha = 0;
   }];
   // Once the locationBarContainer has been contracted fade in ToolbarButtons.
   [animator addCompletion:^(UIViewAnimatingPosition finalPosition) {
@@ -254,6 +262,7 @@
 
 - (void)setBackgroundToIncognitoNTPColorWithAlpha:(CGFloat)alpha {
   self.backgroundView.alpha = alpha;
+  self.shadowView.alpha = 1 - alpha;
 }
 
 - (void)showPrerenderingAnimation {
@@ -296,6 +305,7 @@
   // Z order.
   [self.view addSubview:self.locationBarContainer];
   [self.view addSubview:self.shadowView];
+  [self.view addSubview:self.fullBleedShadowView];
   [self.view addSubview:self.progressBar];
   [self setConstraints];
 }
@@ -364,7 +374,7 @@
         constraintEqualToConstant:kProgressBarHeight],
   ]];
 
-  // Shadow constraints.
+  // Shadows constraints.
   [NSLayoutConstraint activateConstraints:@[
     [self.shadowView.topAnchor constraintEqualToAnchor:self.view.bottomAnchor],
     [self.shadowView.leadingAnchor
@@ -373,6 +383,14 @@
         constraintEqualToAnchor:self.view.trailingAnchor],
     [self.shadowView.heightAnchor
         constraintEqualToConstant:kToolbarShadowHeight],
+    [self.fullBleedShadowView.topAnchor
+        constraintEqualToAnchor:self.view.bottomAnchor],
+    [self.fullBleedShadowView.leadingAnchor
+        constraintEqualToAnchor:self.view.leadingAnchor],
+    [self.fullBleedShadowView.trailingAnchor
+        constraintEqualToAnchor:self.view.trailingAnchor],
+    [self.fullBleedShadowView.heightAnchor
+        constraintEqualToConstant:kToolbarFullBleedShadowHeight],
   ]];
 
   // Stack views constraints.
@@ -917,6 +935,17 @@
   return _shadowView;
 }
 
+- (UIImageView*)fullBleedShadowView {
+  if (!_fullBleedShadowView) {
+    _fullBleedShadowView = [[UIImageView alloc] init];
+    _fullBleedShadowView.translatesAutoresizingMaskIntoConstraints = NO;
+    _fullBleedShadowView.userInteractionEnabled = NO;
+    _fullBleedShadowView.alpha = 0;
+    _fullBleedShadowView.image = NativeImage(IDR_IOS_TOOLBAR_SHADOW_FULL_BLEED);
+  }
+  return _fullBleedShadowView;
+}
+
 #pragma mark - Private
 
 // Sets the progress of the progressBar to 1 then hides it.
diff --git a/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h b/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h
index d0bbbdd..206c339 100644
--- a/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h
+++ b/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h
@@ -67,8 +67,12 @@
 // a popover anchored to it.
 extern const CGFloat kPopoverAnchorHorizontalPadding;
 
-// Height of the shadow displayed below the toolbar.
+// Height of the shadow displayed below the toolbar when the omnibox is
+// contracted.
 extern const CGFloat kToolbarShadowHeight;
+// Height of the shadow displayed below the toolbar when the omnibox is
+// expanded.
+extern const CGFloat kToolbarFullBleedShadowHeight;
 
 // Toolbar style.  Determines which button images are used.
 enum ToolbarControllerStyle {
diff --git a/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.mm b/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.mm
index ae52172..23a5f05 100644
--- a/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.mm
+++ b/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.mm
@@ -29,6 +29,7 @@
 const NSUInteger kTransitionLayerCapacity = 11;
 
 const CGFloat kToolbarShadowHeight = 2;
+const CGFloat kToolbarFullBleedShadowHeight = 10;
 
 // Macros for creating CGRects of height H, origin (0,0), with the portrait
 // width of phone/pad devices.
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index dae133ac..6ad8e520 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -2327,21 +2327,6 @@
             ]
         }
     ],
-    "OfflinePages": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "EnabledAsBookmarks",
-                    "enable_features": [
-                        "NTPOfflinePages"
-                    ]
-                }
-            ]
-        }
-    ],
     "OfflinePagesAsyncLoading": [
         {
             "platforms": [
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 517f633..15a74ba 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2425,7 +2425,7 @@
 crbug.com/626703 [ Win ] external/wpt/css/css-writing-modes/box-offsets-rel-pos-vlr-005.xht [ Failure ]
 crbug.com/626703 [ Win ] external/wpt/css/css-writing-modes/box-offsets-rel-pos-vrl-004.xht [ Failure ]
 
-# css-multicol tests failing on initial import from web-platform-tests
+# css-multicol tests are failing or flaky on initial import from web-platform-tests
 crbug.com/788337 external/wpt/css/css-multicol/multicol-block-no-clip-001.xht [ Failure ]
 crbug.com/788337 external/wpt/css/css-multicol/multicol-block-no-clip-002.xht [ Failure ]
 crbug.com/788337 external/wpt/css/css-multicol/multicol-count-computed-003.xht [ Failure ]
@@ -2440,6 +2440,14 @@
 crbug.com/788337 external/wpt/css/css-multicol/multicol-span-float-001.xht [ Failure ]
 crbug.com/788337 external/wpt/css/css-multicol/multicol-width-small-001.xht [ Failure ]
 crbug.com/788337 external/wpt/css/css-multicol/multicol-zero-height-001.xht [ Failure ]
+crbug.com/788337 external/wpt/css/css-multicol/multicol-fill-balance-001.xht [ Pass Failure ]
+crbug.com/788337 external/wpt/css/css-multicol/multicol-gap-negative-001.xht [ Pass Failure ]
+crbug.com/788337 external/wpt/css/css-multicol/multicol-overflow-000.xht [ Pass Failure ]
+crbug.com/788337 external/wpt/css/css-multicol/multicol-overflowing-001.xht [ Pass Failure ]
+crbug.com/788337 external/wpt/css/css-multicol/multicol-rule-002.xht [ Pass Failure ]
+crbug.com/788337 external/wpt/css/css-multicol/multicol-rule-shorthand-2.xht [ Pass Failure ]
+crbug.com/788337 external/wpt/css/css-multicol/multicol-rule-stacking-001.xht [ Pass Failure ]
+crbug.com/788337 external/wpt/css/css-multicol/multicol-width-001.xht [ Pass Failure ]
 
 # This test times out on debug builds, see https://crbug.com/755810
 crbug.com/626703 [ Debug ] external/wpt/html/semantics/tabular-data/processing-model-1/span-limits.html [ Skip ]
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
index fe725b46..d966c7c 100644
--- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
+++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -43709,6 +43709,18 @@
      {}
     ]
    ],
+   "css/css-multicol/multicol-width-ch-001.xht": [
+    [
+     "/css/css-multicol/multicol-width-ch-001.xht",
+     [
+      [
+       "/css/css-multicol/multicol-width-ch-ref.xht",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-multicol/multicol-width-count-001.xht": [
     [
      "/css/css-multicol/multicol-width-count-001.xht",
@@ -43733,18 +43745,6 @@
      {}
     ]
    ],
-   "css/css-multicol/multicol-width-ems-001.xht": [
-    [
-     "/css/css-multicol/multicol-width-ems-001.xht",
-     [
-      [
-       "/css/css-multicol/multicol-width-ems-ref.xht",
-       "=="
-      ]
-     ],
-     {}
-    ]
-   ],
    "css/css-multicol/multicol-width-invalid-001.xht": [
     [
      "/css/css-multicol/multicol-width-invalid-001.xht",
@@ -109976,7 +109976,7 @@
      {}
     ]
    ],
-   "css/css-multicol/multicol-width-ems-ref.xht": [
+   "css/css-multicol/multicol-width-ch-ref.xht": [
     [
      {}
     ]
@@ -136166,6 +136166,26 @@
      {}
     ]
    ],
+   "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-id-error.vtt": [
+    [
+     {}
+    ]
+   ],
+   "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-id.vtt": [
+    [
+     {}
+    ]
+   ],
+   "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-no-id-error.vtt": [
+    [
+     {}
+    ]
+   ],
+   "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-no-id.vtt": [
+    [
+     {}
+    ]
+   ],
    "html/semantics/embedded-content/media-elements/track/track-element/resources/default-styles.vtt": [
     [
      {}
@@ -136186,11 +136206,36 @@
      {}
     ]
    ],
+   "html/semantics/embedded-content/media-elements/track/track-element/resources/no-timings.vtt": [
+    [
+     {}
+    ]
+   ],
    "html/semantics/embedded-content/media-elements/track/track-element/resources/no-webvtt.vtt": [
     [
      {}
     ]
    ],
+   "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-hour-error.vtt": [
+    [
+     {}
+    ]
+   ],
+   "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-hour.vtt": [
+    [
+     {}
+    ]
+   ],
+   "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-no-hour-errors.vtt": [
+    [
+     {}
+    ]
+   ],
+   "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-no-hour.vtt": [
+    [
+     {}
+    ]
+   ],
    "html/semantics/embedded-content/media-elements/track/track-element/resources/track.de.vtt": [
     [
      {}
@@ -181663,6 +181708,18 @@
      {}
     ]
    ],
+   "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-identifiers.html": [
+    [
+     "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-identifiers.html",
+     {}
+    ]
+   ],
+   "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-no-id.html": [
+    [
+     "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-no-id.html",
+     {}
+    ]
+   ],
    "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-header-comment.html": [
     [
      "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-header-comment.html",
@@ -181681,6 +181738,24 @@
      {}
     ]
    ],
+   "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-no-timings.html": [
+    [
+     "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-no-timings.html",
+     {}
+    ]
+   ],
+   "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-hour.html": [
+    [
+     "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-hour.html",
+     {}
+    ]
+   ],
+   "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-no-hours.html": [
+    [
+     "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-no-hours.html",
+     {}
+    ]
+   ],
    "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-utf8.html": [
     [
      "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-utf8.html",
@@ -184003,6 +184078,12 @@
      {}
     ]
    ],
+   "html/semantics/forms/the-select-element/select-add.html": [
+    [
+     "/html/semantics/forms/the-select-element/select-add.html",
+     {}
+    ]
+   ],
    "html/semantics/forms/the-select-element/select-ask-for-reset.html": [
     [
      "/html/semantics/forms/the-select-element/select-ask-for-reset.html",
@@ -267308,6 +267389,14 @@
    "39784428d2c56586d65f81a413aba4002d6ee752",
    "reftest"
   ],
+  "css/css-multicol/multicol-width-ch-001.xht": [
+   "28b3c4f81e92185bbc9f26c9e594bdfb8cc994df",
+   "reftest"
+  ],
+  "css/css-multicol/multicol-width-ch-ref.xht": [
+   "0a6035ffd02299dfd16336d6c8919c54b2293e21",
+   "support"
+  ],
   "css/css-multicol/multicol-width-count-001.xht": [
    "4d09efe797f9b164e19fda16d6491fa99a855141",
    "reftest"
@@ -267316,14 +267405,6 @@
    "3fd4fd27cd2432bf388f08fb009cd5cd7cded59f",
    "reftest"
   ],
-  "css/css-multicol/multicol-width-ems-001.xht": [
-   "1de2ecbb10805a48b831091cbee976b653899316",
-   "reftest"
-  ],
-  "css/css-multicol/multicol-width-ems-ref.xht": [
-   "16f14c6750b7afa4deb8b2c0e70a602723753794",
-   "support"
-  ],
   "css/css-multicol/multicol-width-invalid-001-ref.xht": [
    "da0d8783395284175b7f7b2ece6f8050aae10829",
    "support"
@@ -306289,7 +306370,7 @@
    "support"
   ],
   "html/dom/interfaces-expected.txt": [
-   "7d8e224ad8944e40d251576b26468881b1852a55",
+   "5ca1ec15b0807e18d43c436c016c8d7bbe8728cb",
    "support"
   ],
   "html/dom/interfaces.html": [
@@ -312864,6 +312945,22 @@
    "68ae570e941a5b8993c163a84aca0f758d65ab01",
    "support"
   ],
+  "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-id-error.vtt": [
+   "e1e8e96b61a5ef48aec96a6c605929f39300e9d9",
+   "support"
+  ],
+  "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-id.vtt": [
+   "f67139c3fea2a888cd10500ee4ac1d3882d5df01",
+   "support"
+  ],
+  "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-no-id-error.vtt": [
+   "4353f327dbfcfec5bcf99aaad28fde328b0c34a8",
+   "support"
+  ],
+  "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-no-id.vtt": [
+   "6954c71972bfbdab36c94c44190cc2259971adb0",
+   "support"
+  ],
   "html/semantics/embedded-content/media-elements/track/track-element/resources/default-styles.vtt": [
    "db041f1a659ab39530144bb68e0ab76d14ca9b90",
    "support"
@@ -312880,10 +312977,30 @@
    "9cc9424c093198fedb44a2361f704ce299288f71",
    "support"
   ],
+  "html/semantics/embedded-content/media-elements/track/track-element/resources/no-timings.vtt": [
+   "63bb8c56d7e75cc84b4e6b06b476fb4d9b395316",
+   "support"
+  ],
   "html/semantics/embedded-content/media-elements/track/track-element/resources/no-webvtt.vtt": [
    "9d5d51eddc30891a0b25a628fffad6bc19d720de",
    "support"
   ],
+  "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-hour-error.vtt": [
+   "e2cf1290a06473ac1592e8da4d8261d392f14606",
+   "support"
+  ],
+  "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-hour.vtt": [
+   "a846d7e878ab08d111e4d68dd67b02d210db0273",
+   "support"
+  ],
+  "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-no-hour-errors.vtt": [
+   "4c80839a264bc93e3787211790e6062f35ad1f22",
+   "support"
+  ],
+  "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-no-hour.vtt": [
+   "09948fb59cd9e1702ba869f0b444ca36d1ec0bf2",
+   "support"
+  ],
   "html/semantics/embedded-content/media-elements/track/track-element/resources/track.de.vtt": [
    "f83f36449d6a7e9db28bba9e39dc7a4bf7458927",
    "support"
@@ -312952,6 +313069,14 @@
    "26343f09d663d1558881507f89eecc606304b41f",
    "testharness"
   ],
+  "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-identifiers.html": [
+   "d21e8cd62cc5a7bf9275b2f46282cd3f73714c21",
+   "testharness"
+  ],
+  "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-no-id.html": [
+   "f12b9b7384f445b817f1d049d7bff05ec0f2d3d9",
+   "testharness"
+  ],
   "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-header-comment.html": [
    "3e83c514cb2d18b2238f03e3d85a21f69a60d5c0",
    "testharness"
@@ -312964,6 +313089,18 @@
    "24d79495469c698e1e0296b503e44a3ee6b5db34",
    "testharness"
   ],
+  "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-no-timings.html": [
+   "baa44683fe0d00e691f536309a7772347301d57a",
+   "testharness"
+  ],
+  "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-hour.html": [
+   "b52de7d267cce4c480353c188173c6bbc5e3e70e",
+   "testharness"
+  ],
+  "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-no-hours.html": [
+   "ebae3e9d5dc11b91b53439ee4871df86c3a80822",
+   "testharness"
+  ],
   "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-utf8.html": [
    "65241920becf512c35f78b335de90c00af03195d",
    "testharness"
@@ -315488,6 +315625,10 @@
    "b5a01e973e4d4c97c6fa06bd9fd1e535e8c622e8",
    "testharness"
   ],
+  "html/semantics/forms/the-select-element/select-add.html": [
+   "1ce71758263439d50dbabb5f1e78fafa6c7ba35b",
+   "testharness"
+  ],
   "html/semantics/forms/the-select-element/select-ask-for-reset.html": [
    "e9689464e9ffa86ac5cd9364a4e8fb9ed6af065e",
    "testharness"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/the-select-element/select-add.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/the-select-element/select-add.html
new file mode 100644
index 0000000..84a5442
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/the-select-element/select-add.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>HTMLSelectElement Test: add()</title>
+<link rel="author" title="Intel" href="http://www.intel.com/">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/form-elements.html#dom-select-add-dev">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<form style="display:none">
+  <option id="testoption">
+    <select id="testselect1">
+    </select>
+    <select id="testselect2">
+      <option>TEST</option>
+    </select>
+  </option>
+</form>
+
+<script>
+
+test(() => {
+  let testselect1 = document.getElementById("testselect1");
+  let opt1 = new Option("Marry","1");
+  testselect1.add(opt1);
+  assert_equals(testselect1.options[0].value, "1");
+}, "test that HTMLSelectElement.add method can add option element");
+
+test(() => {
+  let testselect2 = document.getElementById("testselect2");
+  let opt2 = document.getElementById("testoption");
+  assert_throws("HierarchyRequestError", () => {
+    testselect2.add(opt2);
+  });
+}, "test that HierarchyRequestError exception must be thrown when element is an ancestor of the element into which it is to be inserted");
+
+</script>