diff --git a/chrome/browser/autocomplete/search_provider_unittest.cc b/chrome/browser/autocomplete/search_provider_unittest.cc
index a9b23d6..464d88b 100644
--- a/chrome/browser/autocomplete/search_provider_unittest.cc
+++ b/chrome/browser/autocomplete/search_provider_unittest.cc
@@ -2816,92 +2816,6 @@
             match.contents_class[2].style);
 }
 
-// Verifies that "http://" is trimmed in the general case.
-TEST_F(SearchProviderTest, DoTrimHttpScheme) {
-  const base::string16 input(ASCIIToUTF16("face book"));
-  const base::string16 url(ASCIIToUTF16("http://www.facebook.com"));
-  SearchSuggestionParser::NavigationResult result(
-      ChromeAutocompleteSchemeClassifier(&profile_), GURL(url),
-      AutocompleteMatchType::NAVSUGGEST, 0, base::string16(), std::string(),
-      false, 0, false, input);
-
-  // Generate the contents and check for the presence of a scheme.
-  QueryForInput(input, false, false);
-  AutocompleteMatch match_inline(provider_->NavigationToMatch(result));
-  EXPECT_EQ(ASCIIToUTF16("www.facebook.com"), match_inline.contents);
-}
-
-// Verifies that "http://" is not trimmed for input that has a scheme, even if
-// the input doesn't match the URL.
-TEST_F(SearchProviderTest, DontTrimHttpSchemeIfInputHasScheme) {
-  const base::string16 input(ASCIIToUTF16("https://face book"));
-  const base::string16 url(ASCIIToUTF16("http://www.facebook.com"));
-  SearchSuggestionParser::NavigationResult result(
-      ChromeAutocompleteSchemeClassifier(&profile_), GURL(url),
-      AutocompleteMatchType::NAVSUGGEST, 0, base::string16(), std::string(),
-      false, 0, false, input);
-
-  // Generate the contents and check for the presence of a scheme.
-  QueryForInput(input, false, false);
-  AutocompleteMatch match_inline(provider_->NavigationToMatch(result));
-  EXPECT_EQ(url, match_inline.contents);
-}
-
-// Verifies that "https://" is not trimmed for input in the general case.
-TEST_F(SearchProviderTest, DontTrimHttpsScheme) {
-  const base::string16 input(ASCIIToUTF16("face book"));
-  const base::string16 url(ASCIIToUTF16("https://www.facebook.com"));
-  SearchSuggestionParser::NavigationResult result(
-      ChromeAutocompleteSchemeClassifier(&profile_), GURL(url),
-      AutocompleteMatchType::NAVSUGGEST, 0, base::string16(), std::string(),
-      false, 0, false, input);
-
-  // Generate the contents and check for the presence of a scheme.
-  QueryForInput(input, false, false);
-  AutocompleteMatch match_inline(provider_->NavigationToMatch(result));
-  EXPECT_EQ(url, match_inline.contents);
-}
-
-// Verifies that "https://" is not trimmed for input that has a (non-matching)
-// scheme, even if flag requests it.
-TEST_F(SearchProviderTest, DontTrimHttpsSchemeDespiteFlag) {
-  auto feature_list = std::make_unique<base::test::ScopedFeatureList>();
-  feature_list->InitAndEnableFeature(
-      omnibox::kUIExperimentHideSuggestionUrlScheme);
-
-  const base::string16 input(ASCIIToUTF16("http://face book"));
-  const base::string16 url(ASCIIToUTF16("https://www.facebook.com"));
-  SearchSuggestionParser::NavigationResult result(
-      ChromeAutocompleteSchemeClassifier(&profile_), GURL(url),
-      AutocompleteMatchType::NAVSUGGEST, 0, base::string16(), std::string(),
-      false, 0, false, input);
-
-  // Generate the contents and check for the presence of a scheme.
-  QueryForInput(input, false, false);
-  AutocompleteMatch match_inline(provider_->NavigationToMatch(result));
-  EXPECT_EQ(url, match_inline.contents);
-}
-
-// Verifies that "https://" is trimmed if the flag requests it, and
-// nothing else would prevent it.
-TEST_F(SearchProviderTest, DoTrimHttpsSchemeIfFlag) {
-  auto feature_list = std::make_unique<base::test::ScopedFeatureList>();
-  feature_list->InitAndEnableFeature(
-      omnibox::kUIExperimentHideSuggestionUrlScheme);
-
-  const base::string16 input(ASCIIToUTF16("face book"));
-  const base::string16 url(ASCIIToUTF16("https://www.facebook.com"));
-  SearchSuggestionParser::NavigationResult result(
-      ChromeAutocompleteSchemeClassifier(&profile_), GURL(url),
-      AutocompleteMatchType::NAVSUGGEST, 0, base::string16(), std::string(),
-      false, 0, false, input);
-
-  // Generate the contents and check for the presence of a scheme.
-  QueryForInput(input, false, false);
-  AutocompleteMatch match_inline(provider_->NavigationToMatch(result));
-  EXPECT_EQ(ASCIIToUTF16("www.facebook.com"), match_inline.contents);
-}
-
 #if !defined(OS_WIN)
 // Verify entity suggestion parsing.
 TEST_F(SearchProviderTest, ParseEntitySuggestion) {
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc
index 55e5e14..a3a4513 100644
--- a/chrome/browser/devtools/devtools_window.cc
+++ b/chrome/browser/devtools/devtools_window.cc
@@ -1128,7 +1128,7 @@
 content::ColorChooser* DevToolsWindow::OpenColorChooser(
     WebContents* web_contents,
     SkColor initial_color,
-    const std::vector<content::ColorSuggestion>& suggestions) {
+    const std::vector<content::mojom::ColorSuggestionPtr>& suggestions) {
   return chrome::ShowColorChooser(web_contents, initial_color);
 }
 
diff --git a/chrome/browser/devtools/devtools_window.h b/chrome/browser/devtools/devtools_window.h
index a12f2d54..7659ef7 100644
--- a/chrome/browser/devtools/devtools_window.h
+++ b/chrome/browser/devtools/devtools_window.h
@@ -307,7 +307,8 @@
   content::ColorChooser* OpenColorChooser(
       content::WebContents* web_contents,
       SkColor color,
-      const std::vector<content::ColorSuggestion>& suggestions) override;
+      const std::vector<content::mojom::ColorSuggestionPtr>& suggestions)
+      override;
   void RunFileChooser(content::RenderFrameHost* render_frame_host,
                       const content::FileChooserParams& params) override;
   bool PreHandleGestureEvent(content::WebContents* source,
diff --git a/chrome/browser/extensions/extension_view_host.cc b/chrome/browser/extensions/extension_view_host.cc
index ae20256a..16525738 100644
--- a/chrome/browser/extensions/extension_view_host.cc
+++ b/chrome/browser/extensions/extension_view_host.cc
@@ -214,7 +214,7 @@
 content::ColorChooser* ExtensionViewHost::OpenColorChooser(
     WebContents* web_contents,
     SkColor initial_color,
-    const std::vector<content::ColorSuggestion>& suggestions) {
+    const std::vector<content::mojom::ColorSuggestionPtr>& suggestions) {
   // Similar to the file chooser below, opening a color chooser requires a
   // visible <input> element to click on. Therefore this code only exists for
   // extensions with a view.
diff --git a/chrome/browser/extensions/extension_view_host.h b/chrome/browser/extensions/extension_view_host.h
index 59cb1b08..af9a69b 100644
--- a/chrome/browser/extensions/extension_view_host.h
+++ b/chrome/browser/extensions/extension_view_host.h
@@ -79,7 +79,8 @@
   content::ColorChooser* OpenColorChooser(
       content::WebContents* web_contents,
       SkColor color,
-      const std::vector<content::ColorSuggestion>& suggestions) override;
+      const std::vector<content::mojom::ColorSuggestionPtr>& suggestions)
+      override;
   void RunFileChooser(content::RenderFrameHost* render_frame_host,
                       const content::FileChooserParams& params) override;
   void ResizeDueToAutoResize(content::WebContents* source,
diff --git a/chrome/browser/ui/app_list/custom_launcher_page_contents.cc b/chrome/browser/ui/app_list/custom_launcher_page_contents.cc
index 352cbc4..7bfcac9f 100644
--- a/chrome/browser/ui/app_list/custom_launcher_page_contents.cc
+++ b/chrome/browser/ui/app_list/custom_launcher_page_contents.cc
@@ -93,7 +93,7 @@
 content::ColorChooser* CustomLauncherPageContents::OpenColorChooser(
     content::WebContents* web_contents,
     SkColor initial_color,
-    const std::vector<content::ColorSuggestion>& suggestionss) {
+    const std::vector<content::mojom::ColorSuggestionPtr>& suggestionss) {
   return app_delegate_->ShowColorChooser(web_contents, initial_color);
 }
 
diff --git a/chrome/browser/ui/app_list/custom_launcher_page_contents.h b/chrome/browser/ui/app_list/custom_launcher_page_contents.h
index 3528de6..9fef271 100644
--- a/chrome/browser/ui/app_list/custom_launcher_page_contents.h
+++ b/chrome/browser/ui/app_list/custom_launcher_page_contents.h
@@ -55,7 +55,8 @@
   content::ColorChooser* OpenColorChooser(
       content::WebContents* web_contents,
       SkColor color,
-      const std::vector<content::ColorSuggestion>& suggestions) override;
+      const std::vector<content::mojom::ColorSuggestionPtr>& suggestions)
+      override;
   void RunFileChooser(content::RenderFrameHost* render_frame_host,
                       const content::FileChooserParams& params) override;
   void RequestToLockMouse(content::WebContents* web_contents,
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 938fa9d..34dfc31 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -1700,9 +1700,9 @@
 }
 
 content::ColorChooser* Browser::OpenColorChooser(
-      WebContents* web_contents,
-      SkColor initial_color,
-      const std::vector<content::ColorSuggestion>& suggestions) {
+    WebContents* web_contents,
+    SkColor initial_color,
+    const std::vector<content::mojom::ColorSuggestionPtr>& suggestions) {
   return chrome::ShowColorChooser(web_contents, initial_color);
 }
 
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h
index 5048162..c7b40094 100644
--- a/chrome/browser/ui/browser.h
+++ b/chrome/browser/ui/browser.h
@@ -629,7 +629,8 @@
   content::ColorChooser* OpenColorChooser(
       content::WebContents* web_contents,
       SkColor color,
-      const std::vector<content::ColorSuggestion>& suggestions) override;
+      const std::vector<content::mojom::ColorSuggestionPtr>& suggestions)
+      override;
   void RunFileChooser(content::RenderFrameHost* render_frame_host,
                       const content::FileChooserParams& params) override;
   void EnumerateDirectory(content::WebContents* web_contents,
diff --git a/components/guest_view/browser/guest_view_base.cc b/components/guest_view/browser/guest_view_base.cc
index e4bf514..e4cbdb2 100644
--- a/components/guest_view/browser/guest_view_base.cc
+++ b/components/guest_view/browser/guest_view_base.cc
@@ -642,7 +642,7 @@
 content::ColorChooser* GuestViewBase::OpenColorChooser(
     WebContents* web_contents,
     SkColor color,
-    const std::vector<content::ColorSuggestion>& suggestions) {
+    const std::vector<content::mojom::ColorSuggestionPtr>& suggestions) {
   if (!attached() || !embedder_web_contents()->GetDelegate())
     return nullptr;
 
diff --git a/components/guest_view/browser/guest_view_base.h b/components/guest_view/browser/guest_view_base.h
index ae27d9f..c12f4dc4 100644
--- a/components/guest_view/browser/guest_view_base.h
+++ b/components/guest_view/browser/guest_view_base.h
@@ -357,7 +357,7 @@
   content::ColorChooser* OpenColorChooser(
       content::WebContents* web_contents,
       SkColor color,
-      const std::vector<content::ColorSuggestion>& suggestions) final;
+      const std::vector<content::mojom::ColorSuggestionPtr>& suggestions) final;
   void ResizeDueToAutoResize(content::WebContents* web_contents,
                              const gfx::Size& new_size) final;
   void RunFileChooser(content::RenderFrameHost* render_frame_host,
diff --git a/components/omnibox/browser/history_quick_provider.cc b/components/omnibox/browser/history_quick_provider.cc
index b88bcef2..e6810d4 100644
--- a/components/omnibox/browser/history_quick_provider.cc
+++ b/components/omnibox/browser/history_quick_provider.cc
@@ -244,10 +244,9 @@
       OffsetsFromTermMatches(history_match.url_matches);
   match.contents = url_formatter::FormatUrlWithOffsets(
       info.url(),
-      AutocompleteMatch::GetFormatTypes(
-          autocomplete_input_.parts().scheme.len > 0 ||
-              history_match.match_in_scheme,
-          history_match.match_in_subdomain, history_match.match_after_host),
+      AutocompleteMatch::GetFormatTypes(history_match.match_in_scheme,
+                                        history_match.match_in_subdomain,
+                                        history_match.match_after_host),
       net::UnescapeRule::SPACES, nullptr, nullptr, &offsets);
 
   TermMatches new_matches =
diff --git a/components/omnibox/browser/history_quick_provider.h b/components/omnibox/browser/history_quick_provider.h
index c93fb9e..2b1f0fcc 100644
--- a/components/omnibox/browser/history_quick_provider.h
+++ b/components/omnibox/browser/history_quick_provider.h
@@ -41,15 +41,6 @@
   friend class HistoryQuickProviderTest;
   FRIEND_TEST_ALL_PREFIXES(HistoryQuickProviderTest, Spans);
   FRIEND_TEST_ALL_PREFIXES(HistoryQuickProviderTest, Relevance);
-  FRIEND_TEST_ALL_PREFIXES(HistoryQuickProviderTest, DoTrimHttpScheme);
-  FRIEND_TEST_ALL_PREFIXES(HistoryQuickProviderTest,
-                           DontTrimHttpSchemeIfInputHasScheme);
-  FRIEND_TEST_ALL_PREFIXES(HistoryQuickProviderTest,
-                           DontTrimHttpSchemeIfInputMatches);
-  FRIEND_TEST_ALL_PREFIXES(HistoryQuickProviderTest, DontTrimHttpsScheme);
-  FRIEND_TEST_ALL_PREFIXES(HistoryQuickProviderTest,
-                           DontTrimHttpsSchemeDespiteFlag);
-  FRIEND_TEST_ALL_PREFIXES(HistoryQuickProviderTest, DoTrimHttpsSchemeIfFlag);
 
   ~HistoryQuickProvider() override;
 
diff --git a/components/omnibox/browser/history_quick_provider_unittest.cc b/components/omnibox/browser/history_quick_provider_unittest.cc
index 84ec7631..5811e04 100644
--- a/components/omnibox/browser/history_quick_provider_unittest.cc
+++ b/components/omnibox/browser/history_quick_provider_unittest.cc
@@ -17,7 +17,6 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/test/scoped_task_environment.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/test/bookmark_test_helpers.h"
@@ -748,103 +747,6 @@
   EXPECT_TRUE(provider().matches().empty());
 }
 
-ScoredHistoryMatch BuildScoredHistoryMatch(const std::string& url_text) {
-  return ScoredHistoryMatch(
-      history::URLRow(GURL(url_text)), VisitInfoVector(), ASCIIToUTF16(""),
-      String16Vector(1, ASCIIToUTF16("")), WordStarts(1, 0), RowWordStarts(),
-      false, 0, base::Time());
-}
-
-// Trim the http:// scheme from the contents in the general case.
-TEST_F(HistoryQuickProviderTest, DoTrimHttpScheme) {
-  AutocompleteInput input(ASCIIToUTF16("face"),
-                          metrics::OmniboxEventProto::OTHER,
-                          TestSchemeClassifier());
-  provider().Start(input, false);
-  ScoredHistoryMatch history_match =
-      BuildScoredHistoryMatch("http://www.facebook.com");
-
-  AutocompleteMatch match = provider().QuickMatchToACMatch(history_match, 100);
-  EXPECT_EQ(ASCIIToUTF16("www.facebook.com"), match.contents);
-}
-
-// Don't trim the http:// scheme from the match contents if
-// the user input included a scheme.
-TEST_F(HistoryQuickProviderTest, DontTrimHttpSchemeIfInputHasScheme) {
-  AutocompleteInput input(ASCIIToUTF16("http://face"),
-                          metrics::OmniboxEventProto::OTHER,
-                          TestSchemeClassifier());
-  provider().Start(input, false);
-  ScoredHistoryMatch history_match =
-      BuildScoredHistoryMatch("http://www.facebook.com");
-
-  AutocompleteMatch match = provider().QuickMatchToACMatch(history_match, 100);
-  EXPECT_EQ(ASCIIToUTF16("http://www.facebook.com"), match.contents);
-}
-
-// Don't trim the http:// scheme from the match contents if
-// the user input matched it.
-TEST_F(HistoryQuickProviderTest, DontTrimHttpSchemeIfInputMatches) {
-  AutocompleteInput input(ASCIIToUTF16("ht"), metrics::OmniboxEventProto::OTHER,
-                          TestSchemeClassifier());
-  provider().Start(input, false);
-  ScoredHistoryMatch history_match =
-      BuildScoredHistoryMatch("http://www.facebook.com");
-  history_match.match_in_scheme = true;
-
-  AutocompleteMatch match = provider().QuickMatchToACMatch(history_match, 100);
-  EXPECT_EQ(ASCIIToUTF16("http://www.facebook.com"), match.contents);
-}
-
-// Don't trim the https:// scheme from the match contents in the general case.
-TEST_F(HistoryQuickProviderTest, DontTrimHttpsScheme) {
-  AutocompleteInput input(ASCIIToUTF16("face"),
-                          metrics::OmniboxEventProto::OTHER,
-                          TestSchemeClassifier());
-  provider().Start(input, false);
-  ScoredHistoryMatch history_match =
-      BuildScoredHistoryMatch("https://www.facebook.com");
-
-  AutocompleteMatch match = provider().QuickMatchToACMatch(history_match, 100);
-  EXPECT_EQ(ASCIIToUTF16("https://www.facebook.com"), match.contents);
-}
-
-// Don't trim the https:// scheme from the match contents, if the feature
-// to do so is enabled, if the user input included a scheme.
-TEST_F(HistoryQuickProviderTest, DontTrimHttpsSchemeDespiteFlag) {
-  auto feature_list = std::make_unique<base::test::ScopedFeatureList>();
-  feature_list->InitAndEnableFeature(
-      omnibox::kUIExperimentHideSuggestionUrlScheme);
-
-  AutocompleteInput input(ASCIIToUTF16("https://face"),
-                          metrics::OmniboxEventProto::OTHER,
-                          TestSchemeClassifier());
-  provider().Start(input, false);
-  ScoredHistoryMatch history_match =
-      BuildScoredHistoryMatch("https://www.facebook.com");
-
-  AutocompleteMatch match = provider().QuickMatchToACMatch(history_match, 100);
-  EXPECT_EQ(ASCIIToUTF16("https://www.facebook.com"), match.contents);
-}
-
-// Trim the https:// scheme from the match contents, if the feature
-// to do so is enabled, and nothing else prevents it.
-TEST_F(HistoryQuickProviderTest, DoTrimHttpsSchemeIfFlag) {
-  auto feature_list = std::make_unique<base::test::ScopedFeatureList>();
-  feature_list->InitAndEnableFeature(
-      omnibox::kUIExperimentHideSuggestionUrlScheme);
-
-  AutocompleteInput input(ASCIIToUTF16("face"),
-                          metrics::OmniboxEventProto::OTHER,
-                          TestSchemeClassifier());
-  provider().Start(input, false);
-  ScoredHistoryMatch history_match =
-      BuildScoredHistoryMatch("https://www.facebook.com");
-
-  AutocompleteMatch match = provider().QuickMatchToACMatch(history_match, 100);
-  EXPECT_EQ(ASCIIToUTF16("www.facebook.com"), match.contents);
-}
-
 // HQPOrderingTest -------------------------------------------------------------
 
 class HQPOrderingTest : public HistoryQuickProviderTest {
diff --git a/components/omnibox/browser/history_url_provider.cc b/components/omnibox/browser/history_url_provider.cc
index 0bcd66d..d925450 100644
--- a/components/omnibox/browser/history_url_provider.cc
+++ b/components/omnibox/browser/history_url_provider.cc
@@ -1226,8 +1226,7 @@
       history_match.input_location + params.input.text().length()};
 
   const auto format_types = AutocompleteMatch::GetFormatTypes(
-      params.input.parts().scheme.len > 0 || !params.trim_http ||
-          history_match.match_in_scheme,
+      !params.trim_http || history_match.match_in_scheme,
       history_match.match_in_subdomain, history_match.match_after_host);
   match.contents = url_formatter::FormatUrlWithOffsets(
       info.url(), format_types, net::UnescapeRule::SPACES, nullptr, nullptr,
diff --git a/components/omnibox/browser/history_url_provider.h b/components/omnibox/browser/history_url_provider.h
index df943c4..8498098 100644
--- a/components/omnibox/browser/history_url_provider.h
+++ b/components/omnibox/browser/history_url_provider.h
@@ -221,15 +221,6 @@
 
  private:
   FRIEND_TEST_ALL_PREFIXES(HistoryURLProviderTest, HUPScoringExperiment);
-  FRIEND_TEST_ALL_PREFIXES(HistoryURLProviderTest, DoTrimHttpScheme);
-  FRIEND_TEST_ALL_PREFIXES(HistoryURLProviderTest,
-                           DontTrimHttpSchemeIfInputHasScheme);
-  FRIEND_TEST_ALL_PREFIXES(HistoryURLProviderTest,
-                           DontTrimHttpSchemeIfInputMatchesInScheme);
-  FRIEND_TEST_ALL_PREFIXES(HistoryURLProviderTest, DontTrimHttpsScheme);
-  FRIEND_TEST_ALL_PREFIXES(HistoryURLProviderTest,
-                           DontTrimHttpsSchemeDespiteFlag);
-  FRIEND_TEST_ALL_PREFIXES(HistoryURLProviderTest, DoTrimHttpsSchemeIfFlag);
 
   enum MatchType {
     NORMAL,
diff --git a/components/omnibox/browser/history_url_provider_unittest.cc b/components/omnibox/browser/history_url_provider_unittest.cc
index 5b66e34..69c16ad 100644
--- a/components/omnibox/browser/history_url_provider_unittest.cc
+++ b/components/omnibox/browser/history_url_provider_unittest.cc
@@ -1246,84 +1246,3 @@
       omnibox::kUIExperimentElideSuggestionUrlAfterHost);
   ExpectFormattedFullMatch("hij", L"https://www.hij.com/\x2026\x0000", 12, 3);
 }
-
-std::unique_ptr<HistoryURLProviderParams> BuildHistoryURLProviderParams(
-    const std::string& input_text,
-    const std::string& url_text,
-    bool match_in_scheme) {
-  AutocompleteInput input(ASCIIToUTF16(input_text),
-                          metrics::OmniboxEventProto::OTHER,
-                          TestSchemeClassifier());
-  history::HistoryMatch history_match;
-  history_match.url_info.set_url(GURL(url_text));
-  history_match.match_in_scheme = match_in_scheme;
-  auto params = std::make_unique<HistoryURLProviderParams>(
-      input, true, AutocompleteMatch(), nullptr, SearchTermsData());
-  params->matches.push_back(history_match);
-
-  return params;
-}
-
-// Make sure "http://" scheme is generally trimmed.
-TEST_F(HistoryURLProviderTest, DoTrimHttpScheme) {
-  auto params =
-      BuildHistoryURLProviderParams("face", "http://www.facebook.com", false);
-
-  AutocompleteMatch match = autocomplete_->HistoryMatchToACMatch(*params, 0, 0);
-  EXPECT_EQ(ASCIIToUTF16("www.facebook.com"), match.contents);
-}
-
-// Make sure "http://" scheme is not trimmed if input has a scheme too.
-TEST_F(HistoryURLProviderTest, DontTrimHttpSchemeIfInputHasScheme) {
-  auto params = BuildHistoryURLProviderParams("http://face",
-                                              "http://www.facebook.com", false);
-
-  AutocompleteMatch match = autocomplete_->HistoryMatchToACMatch(*params, 0, 0);
-  EXPECT_EQ(ASCIIToUTF16("http://www.facebook.com"), match.contents);
-}
-
-// Make sure "http://" scheme is not trimmed if input matches in scheme.
-TEST_F(HistoryURLProviderTest, DontTrimHttpSchemeIfInputMatchesInScheme) {
-  auto params =
-      BuildHistoryURLProviderParams("ht face", "http://www.facebook.com", true);
-
-  AutocompleteMatch match = autocomplete_->HistoryMatchToACMatch(*params, 0, 0);
-  EXPECT_EQ(ASCIIToUTF16("http://www.facebook.com"), match.contents);
-}
-
-// Make sure "https://" scheme is generally not trimmed.
-TEST_F(HistoryURLProviderTest, DontTrimHttpsScheme) {
-  auto params =
-      BuildHistoryURLProviderParams("face", "https://www.facebook.com", false);
-
-  AutocompleteMatch match = autocomplete_->HistoryMatchToACMatch(*params, 0, 0);
-  EXPECT_EQ(ASCIIToUTF16("https://www.facebook.com"), match.contents);
-}
-
-// Make sure "https://" scheme is not trimmed even when requested by flag
-// if the input has a scheme.
-TEST_F(HistoryURLProviderTest, DontTrimHttpsSchemeDespiteFlag) {
-  auto feature_list = std::make_unique<base::test::ScopedFeatureList>();
-  feature_list->InitWithFeatures(
-      {omnibox::kUIExperimentHideSuggestionUrlScheme}, {});
-
-  auto params = BuildHistoryURLProviderParams(
-      "https://face", "https://www.facebook.com", false);
-
-  AutocompleteMatch match = autocomplete_->HistoryMatchToACMatch(*params, 0, 0);
-  EXPECT_EQ(ASCIIToUTF16("https://www.facebook.com"), match.contents);
-}
-
-// Make sure "https://" scheme is trimmed if requested by flag, and nothing
-// else prevents it.
-TEST_F(HistoryURLProviderTest, DoTrimHttpsSchemeIfFlag) {
-  auto feature_list = std::make_unique<base::test::ScopedFeatureList>();
-  feature_list->InitWithFeatures(
-      {omnibox::kUIExperimentHideSuggestionUrlScheme}, {});
-
-  auto params =
-      BuildHistoryURLProviderParams("face", "https://www.facebook.com", false);
-
-  AutocompleteMatch match = autocomplete_->HistoryMatchToACMatch(*params, 0, 0);
-  EXPECT_EQ(ASCIIToUTF16("www.facebook.com"), match.contents);
-}
diff --git a/components/omnibox/browser/search_provider.h b/components/omnibox/browser/search_provider.h
index 1802419..1012bb5 100644
--- a/components/omnibox/browser/search_provider.h
+++ b/components/omnibox/browser/search_provider.h
@@ -98,12 +98,6 @@
   FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, RemoveExtraAnswers);
   FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, DoesNotProvideOnFocus);
   FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, SendsWarmUpRequestOnFocus);
-  FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, DoTrimHttpScheme);
-  FRIEND_TEST_ALL_PREFIXES(SearchProviderTest,
-                           DontTrimHttpSchemeIfInputHasScheme);
-  FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, DontTrimHttpsScheme);
-  FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, DontTrimHttpsSchemeDespiteFlag);
-  FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, DoTrimHttpsSchemeIfFlag);
   FRIEND_TEST_ALL_PREFIXES(InstantExtendedPrefetchTest, ClearPrefetchedResults);
   FRIEND_TEST_ALL_PREFIXES(InstantExtendedPrefetchTest, SetPrefetchQuery);
 
diff --git a/components/omnibox/browser/search_suggestion_parser.cc b/components/omnibox/browser/search_suggestion_parser.cc
index 674e7d2..95a6031 100644
--- a/components/omnibox/browser/search_suggestion_parser.cc
+++ b/components/omnibox/browser/search_suggestion_parser.cc
@@ -288,8 +288,7 @@
       GURL(formatted_url_), {{match_start, match_start + input_text.length()}},
       &match_in_scheme, &match_in_subdomain, &match_after_host);
   auto format_types = AutocompleteMatch::GetFormatTypes(
-      GURL(input_text).has_scheme() || match_in_scheme, match_in_subdomain,
-      match_after_host);
+      match_in_scheme, match_in_subdomain, match_after_host);
 
   base::string16 match_contents =
       url_formatter::FormatUrl(url_, format_types, net::UnescapeRule::SPACES,
diff --git a/components/omnibox/browser/titled_url_match_utils.cc b/components/omnibox/browser/titled_url_match_utils.cc
index f567d1b3..08c6139 100644
--- a/components/omnibox/browser/titled_url_match_utils.cc
+++ b/components/omnibox/browser/titled_url_match_utils.cc
@@ -79,8 +79,7 @@
       url, titled_url_match.url_match_positions, &match_in_scheme,
       &match_in_subdomain, &match_after_host);
   auto format_types = AutocompleteMatch::GetFormatTypes(
-      input.parts().scheme.len > 0 || match_in_scheme, match_in_subdomain,
-      match_after_host);
+      match_in_scheme, match_in_subdomain, match_after_host);
 
   std::vector<size_t> offsets = TitledUrlMatch::OffsetsFromMatchPositions(
       titled_url_match.url_match_positions);
diff --git a/components/omnibox/browser/titled_url_match_utils_unittest.cc b/components/omnibox/browser/titled_url_match_utils_unittest.cc
index 8976d6ac..4b5095d 100644
--- a/components/omnibox/browser/titled_url_match_utils_unittest.cc
+++ b/components/omnibox/browser/titled_url_match_utils_unittest.cc
@@ -7,13 +7,11 @@
 #include <memory>
 
 #include "base/strings/utf_string_conversions.h"
-#include "base/test/scoped_feature_list.h"
 #include "components/bookmarks/browser/titled_url_match.h"
 #include "components/bookmarks/browser/titled_url_node.h"
 #include "components/omnibox/browser/autocomplete_input.h"
 #include "components/omnibox/browser/autocomplete_match.h"
 #include "components/omnibox/browser/autocomplete_provider.h"
-#include "components/omnibox/browser/omnibox_field_trial.h"
 #include "components/omnibox/browser/test_scheme_classifier.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
@@ -112,121 +110,6 @@
             autocomplete_match.inline_autocompletion);
 }
 
-AutocompleteMatch BuildTestAutocompleteMatch(
-    const std::string& input_text_s,
-    const GURL& match_url,
-    const bookmarks::TitledUrlMatch::MatchPositions& match_positions) {
-  base::string16 input_text(base::ASCIIToUTF16(input_text_s));
-  base::string16 match_title(base::ASCIIToUTF16("The Facebook"));
-  AutocompleteMatchType::Type type = AutocompleteMatchType::BOOKMARK_TITLE;
-  int relevance = 123;
-
-  MockTitledUrlNode node(match_title, match_url);
-  bookmarks::TitledUrlMatch titled_url_match;
-  titled_url_match.node = &node;
-  titled_url_match.title_match_positions = {{0, 3}};
-  // Don't capture the scheme, so that it doesn't match.
-  titled_url_match.url_match_positions = match_positions;
-
-  scoped_refptr<MockAutocompleteProvider> provider =
-      new MockAutocompleteProvider(AutocompleteProvider::Type::TYPE_BOOKMARK);
-  TestSchemeClassifier classifier;
-  AutocompleteInput input(input_text, metrics::OmniboxEventProto::NTP,
-                          classifier);
-  const base::string16 fixed_up_input(input_text);
-
-  return TitledUrlMatchToAutocompleteMatch(titled_url_match, type, relevance,
-                                           provider.get(), classifier, input,
-                                           fixed_up_input);
-}
-
-TEST(TitledUrlMatchUtilsTest, DoTrimHttpScheme) {
-  GURL match_url("http://www.facebook.com/");
-  AutocompleteMatch autocomplete_match =
-      BuildTestAutocompleteMatch("face", match_url, {{11, 15}});
-
-  ACMatchClassifications expected_contents_class = {
-      {0, ACMatchClassification::URL},
-      {4, ACMatchClassification::URL | ACMatchClassification::MATCH},
-      {8, ACMatchClassification::URL},
-  };
-  base::string16 expected_contents(base::ASCIIToUTF16("www.facebook.com"));
-
-  EXPECT_EQ(match_url, autocomplete_match.destination_url);
-  EXPECT_EQ(expected_contents, autocomplete_match.contents);
-  EXPECT_TRUE(std::equal(expected_contents_class.begin(),
-                         expected_contents_class.end(),
-                         autocomplete_match.contents_class.begin()));
-  EXPECT_TRUE(autocomplete_match.allowed_to_be_default_match);
-}
-
-TEST(TitledUrlMatchUtilsTest, DontTrimHttpSchemeIfInputHasScheme) {
-  GURL match_url("http://www.facebook.com/");
-  AutocompleteMatch autocomplete_match =
-      BuildTestAutocompleteMatch("http://face", match_url, {{11, 15}});
-
-  ACMatchClassifications expected_contents_class = {
-      {0, ACMatchClassification::URL},
-      {11, ACMatchClassification::URL | ACMatchClassification::MATCH},
-      {15, ACMatchClassification::URL},
-  };
-  base::string16 expected_contents(
-      base::ASCIIToUTF16("http://www.facebook.com"));
-
-  EXPECT_EQ(match_url, autocomplete_match.destination_url);
-  EXPECT_EQ(expected_contents, autocomplete_match.contents);
-  EXPECT_TRUE(std::equal(expected_contents_class.begin(),
-                         expected_contents_class.end(),
-                         autocomplete_match.contents_class.begin()));
-  EXPECT_FALSE(autocomplete_match.allowed_to_be_default_match);
-}
-
-TEST(TitledUrlMatchUtilsTest, DontTrimHttpsScheme) {
-  GURL match_url("https://www.facebook.com/");
-  AutocompleteMatch autocomplete_match =
-      BuildTestAutocompleteMatch("face", match_url, {{12, 16}});
-
-  ACMatchClassifications expected_contents_class = {
-      {0, ACMatchClassification::URL},
-      {12, ACMatchClassification::URL | ACMatchClassification::MATCH},
-      {16, ACMatchClassification::URL},
-  };
-  base::string16 expected_contents(
-      base::ASCIIToUTF16("https://www.facebook.com"));
-
-  EXPECT_EQ(match_url, autocomplete_match.destination_url);
-  EXPECT_EQ(expected_contents, autocomplete_match.contents);
-  EXPECT_TRUE(std::equal(expected_contents_class.begin(),
-                         expected_contents_class.end(),
-                         autocomplete_match.contents_class.begin()));
-  EXPECT_TRUE(autocomplete_match.allowed_to_be_default_match);
-}
-
-TEST(TitledUrlMatchUtilsTest, DontTrimHttpsSchemeDespiteFlag) {
-  auto feature_list = std::make_unique<base::test::ScopedFeatureList>();
-  feature_list->InitAndEnableFeature(
-      omnibox::kUIExperimentHideSuggestionUrlScheme);
-
-  GURL match_url("https://www.facebook.com/");
-  AutocompleteMatch autocomplete_match =
-      BuildTestAutocompleteMatch("https://face", match_url, {{12, 16}});
-
-  ACMatchClassifications expected_contents_class = {
-      {0, ACMatchClassification::URL},
-      {12, ACMatchClassification::URL | ACMatchClassification::MATCH},
-      {16, ACMatchClassification::URL},
-  };
-  base::string16 expected_contents(
-      base::ASCIIToUTF16("https://www.facebook.com"));
-
-  EXPECT_EQ(match_url, autocomplete_match.destination_url);
-  EXPECT_EQ(expected_contents, autocomplete_match.contents);
-  EXPECT_TRUE(std::equal(expected_contents_class.begin(),
-                         expected_contents_class.end(),
-                         autocomplete_match.contents_class.begin()));
-  EXPECT_FALSE(autocomplete_match.allowed_to_be_default_match);
-}
-
 TEST(TitledUrlMatchUtilsTest, EmptyInlineAutocompletion) {
   // The search term matches the title but not the URL. Since there is no URL
   // match, the inline autocompletion string will be empty.
diff --git a/components/web_contents_delegate_android/color_chooser_android.cc b/components/web_contents_delegate_android/color_chooser_android.cc
index 4c31f39..42b6fe1 100644
--- a/components/web_contents_delegate_android/color_chooser_android.cc
+++ b/components/web_contents_delegate_android/color_chooser_android.cc
@@ -9,11 +9,10 @@
 #include "base/android/jni_array.h"
 #include "base/android/jni_string.h"
 #include "content/public/browser/web_contents.h"
-#include "content/public/common/color_suggestion.h"
 #include "jni/ColorChooserAndroid_jni.h"
 #include "ui/android/window_android.h"
 
-using base::android::ConvertUTF16ToJavaString;
+using base::android::ConvertUTF8ToJavaString;
 using base::android::JavaRef;
 
 namespace web_contents_delegate_android {
@@ -21,7 +20,7 @@
 ColorChooserAndroid::ColorChooserAndroid(
     content::WebContents* web_contents,
     SkColor initial_color,
-    const std::vector<content::ColorSuggestion>& suggestions)
+    const std::vector<content::mojom::ColorSuggestionPtr>& suggestions)
     : web_contents_(web_contents) {
   JNIEnv* env = AttachCurrentThread();
   ScopedJavaLocalRef<jobjectArray> suggestions_array;
@@ -31,9 +30,9 @@
         env, suggestions.size());
 
     for (size_t i = 0; i < suggestions.size(); ++i) {
-      const content::ColorSuggestion& suggestion = suggestions[i];
-      ScopedJavaLocalRef<jstring> label = ConvertUTF16ToJavaString(
-          env, suggestion.label);
+      const auto& suggestion = *suggestions[i];
+      ScopedJavaLocalRef<jstring> label =
+          ConvertUTF8ToJavaString(env, suggestion.label);
       Java_ColorChooserAndroid_addToColorSuggestionArray(
           env, suggestions_array, i, suggestion.color, label);
     }
diff --git a/components/web_contents_delegate_android/color_chooser_android.h b/components/web_contents_delegate_android/color_chooser_android.h
index f3a6e99..5432448 100644
--- a/components/web_contents_delegate_android/color_chooser_android.h
+++ b/components/web_contents_delegate_android/color_chooser_android.h
@@ -12,13 +12,13 @@
 #include "base/macros.h"
 #include "base/strings/string16.h"
 #include "content/public/browser/color_chooser.h"
+#include "content/public/common/color_suggestion.mojom.h"
 
 using base::android::AttachCurrentThread;
 using base::android::ScopedJavaLocalRef;
 
 namespace content {
 class WebContents;
-struct ColorSuggestion;
 }
 
 namespace web_contents_delegate_android {
@@ -26,9 +26,10 @@
 // Glues the Java (ColorPickerChooser.java) picker with the native part.
 class ColorChooserAndroid : public content::ColorChooser {
  public:
-  ColorChooserAndroid(content::WebContents* tab,
-                      SkColor initial_color,
-                      const std::vector<content::ColorSuggestion>& suggestions);
+  ColorChooserAndroid(
+      content::WebContents* tab,
+      SkColor initial_color,
+      const std::vector<content::mojom::ColorSuggestionPtr>& suggestions);
   ~ColorChooserAndroid() override;
 
   void OnColorChosen(JNIEnv* env,
diff --git a/components/web_contents_delegate_android/web_contents_delegate_android.cc b/components/web_contents_delegate_android/web_contents_delegate_android.cc
index 65ffe50..f601cd2 100644
--- a/components/web_contents_delegate_android/web_contents_delegate_android.cc
+++ b/components/web_contents_delegate_android/web_contents_delegate_android.cc
@@ -54,9 +54,9 @@
 // ----------------------------------------------------------------------------
 
 ColorChooser* WebContentsDelegateAndroid::OpenColorChooser(
-      WebContents* source,
-      SkColor color,
-      const std::vector<content::ColorSuggestion>& suggestions)  {
+    WebContents* source,
+    SkColor color,
+    const std::vector<content::mojom::ColorSuggestionPtr>& suggestions) {
   return new ColorChooserAndroid(source, color, suggestions);
 }
 
diff --git a/components/web_contents_delegate_android/web_contents_delegate_android.h b/components/web_contents_delegate_android/web_contents_delegate_android.h
index 10f98037..99d7a4f 100644
--- a/components/web_contents_delegate_android/web_contents_delegate_android.h
+++ b/components/web_contents_delegate_android/web_contents_delegate_android.h
@@ -53,7 +53,8 @@
   content::ColorChooser* OpenColorChooser(
       content::WebContents* source,
       SkColor color,
-      const std::vector<content::ColorSuggestion>& suggestions) override;
+      const std::vector<content::mojom::ColorSuggestionPtr>& suggestions)
+      override;
   void NavigationStateChanged(content::WebContents* source,
                               content::InvalidateTypes changed_flags) override;
   void VisibleSecurityStateChanged(content::WebContents* source) override;
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index f22cf700..47657d0 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -393,26 +393,40 @@
   DISALLOW_COPY_AND_ASSIGN(DestructionObserver);
 };
 
-WebContentsImpl::ColorChooserInfo::ColorChooserInfo(int render_process_id,
-                                                    int render_frame_id,
-                                                    ColorChooser* chooser,
-                                                    int identifier)
-    : render_process_id(render_process_id),
-      render_frame_id(render_frame_id),
-      chooser(chooser),
-      identifier(identifier) {
-}
+// WebContentsImpl::ColorChooser ----------------------------------------------
+class WebContentsImpl::ColorChooser : public mojom::ColorChooser {
+ public:
+  ColorChooser(content::ColorChooser* chooser,
+               mojom::ColorChooserRequest request,
+               mojom::ColorChooserClientPtr client)
+      : chooser_(chooser),
+        binding_(this, std::move(request)),
+        client_(std::move(client)) {
+    binding_.set_connection_error_handler(
+        base::BindOnce([](content::ColorChooser* chooser) { chooser->End(); },
+                       base::Unretained(chooser)));
+  }
 
-WebContentsImpl::ColorChooserInfo::~ColorChooserInfo() {
-}
+  ~ColorChooser() override { chooser_->End(); }
 
-bool WebContentsImpl::ColorChooserInfo::Matches(
-    RenderFrameHostImpl* render_frame_host,
-    int color_chooser_id) {
-  return this->render_process_id == render_frame_host->GetProcess()->GetID() &&
-         this->render_frame_id == render_frame_host->GetRoutingID() &&
-         this->identifier == color_chooser_id;
-}
+  void SetSelectedColor(SkColor color) override {
+    chooser_->SetSelectedColor(color);
+  }
+
+  void DidChooseColorInColorChooser(SkColor color) {
+    client_->DidChooseColor(color);
+  }
+
+ private:
+  // Color chooser that was opened by this tab.
+  std::unique_ptr<content::ColorChooser> chooser_;
+
+  // mojo bindings.
+  mojo::Binding<mojom::ColorChooser> binding_;
+
+  // mojo renderer client.
+  content::mojom::ColorChooserClientPtr client_;
+};
 
 // WebContentsImpl::WebContentsTreeNode ----------------------------------------
 WebContentsImpl::WebContentsTreeNode::WebContentsTreeNode(
@@ -569,6 +583,9 @@
 #if !defined(OS_ANDROID)
   host_zoom_map_observer_.reset(new HostZoomMapObserver(this));
 #endif  // !defined(OS_ANDROID)
+
+  registry_.AddInterface(base::BindRepeating(
+      &WebContentsImpl::OnColorChooserFactoryRequest, base::Unretained(this)));
 }
 
 WebContentsImpl::~WebContentsImpl() {
@@ -612,8 +629,7 @@
     dialog_manager_->CancelDialogs(this, /*reset_state=*/true);
   }
 
-  if (color_chooser_info_.get())
-    color_chooser_info_->chooser->End();
+  color_chooser_.reset();
 
   NotifyDisconnected();
 
@@ -837,10 +853,6 @@
     IPC_MESSAGE_HANDLER(FrameHostMsg_DidFinishDocumentLoad,
                         OnDocumentLoadedInFrame)
     IPC_MESSAGE_HANDLER(FrameHostMsg_DidFinishLoad, OnDidFinishLoad)
-    IPC_MESSAGE_HANDLER(FrameHostMsg_OpenColorChooser, OnOpenColorChooser)
-    IPC_MESSAGE_HANDLER(FrameHostMsg_EndColorChooser, OnEndColorChooser)
-    IPC_MESSAGE_HANDLER(FrameHostMsg_SetSelectedColorInColorChooser,
-                        OnSetSelectedColorInColorChooser)
     IPC_MESSAGE_HANDLER(FrameHostMsg_DidLoadResourceFromMemoryCache,
                         OnDidLoadResourceFromMemoryCache)
     IPC_MESSAGE_HANDLER(FrameHostMsg_DidDisplayInsecureContent,
@@ -3513,30 +3525,11 @@
 }
 
 void WebContentsImpl::DidChooseColorInColorChooser(SkColor color) {
-  if (!color_chooser_info_.get())
-    return;
-  RenderFrameHost* rfh = RenderFrameHost::FromID(
-      color_chooser_info_->render_process_id,
-      color_chooser_info_->render_frame_id);
-  if (!rfh)
-    return;
-
-  rfh->Send(new FrameMsg_DidChooseColorResponse(
-      rfh->GetRoutingID(), color_chooser_info_->identifier, color));
+  color_chooser_->DidChooseColorInColorChooser(color);
 }
 
 void WebContentsImpl::DidEndColorChooser() {
-  if (!color_chooser_info_.get())
-    return;
-  RenderFrameHost* rfh = RenderFrameHost::FromID(
-      color_chooser_info_->render_process_id,
-      color_chooser_info_->render_frame_id);
-  if (!rfh)
-    return;
-
-  rfh->Send(new FrameMsg_DidEndColorChooser(
-      rfh->GetRoutingID(), color_chooser_info_->identifier));
-  color_chooser_info_.reset();
+  color_chooser_.reset();
 }
 
 int WebContentsImpl::DownloadImage(
@@ -4212,38 +4205,25 @@
     observer.AppCacheAccessed(manifest_url, blocked_by_policy);
 }
 
-void WebContentsImpl::OnOpenColorChooser(
-    RenderFrameHostImpl* source,
-    int color_chooser_id,
+void WebContentsImpl::OnColorChooserFactoryRequest(
+    mojom::ColorChooserFactoryRequest request) {
+  color_chooser_factory_bindings_.AddBinding(this, std::move(request));
+}
+
+void WebContentsImpl::OpenColorChooser(
+    mojom::ColorChooserRequest chooser_request,
+    mojom::ColorChooserClientPtr client,
     SkColor color,
-    const std::vector<ColorSuggestion>& suggestions) {
-  ColorChooser* new_color_chooser =
+    std::vector<mojom::ColorSuggestionPtr> suggestions) {
+  content::ColorChooser* new_color_chooser =
       delegate_ ? delegate_->OpenColorChooser(this, color, suggestions)
                 : nullptr;
   if (!new_color_chooser)
     return;
-  if (color_chooser_info_.get())
-    color_chooser_info_->chooser->End();
 
-  color_chooser_info_.reset(new ColorChooserInfo(
-      source->GetProcess()->GetID(), source->GetRoutingID(), new_color_chooser,
-      color_chooser_id));
-}
-
-void WebContentsImpl::OnEndColorChooser(RenderFrameHostImpl* source,
-                                        int color_chooser_id) {
-  if (color_chooser_info_ &&
-      color_chooser_info_->Matches(source, color_chooser_id))
-    color_chooser_info_->chooser->End();
-}
-
-void WebContentsImpl::OnSetSelectedColorInColorChooser(
-    RenderFrameHostImpl* source,
-    int color_chooser_id,
-    SkColor color) {
-  if (color_chooser_info_ &&
-      color_chooser_info_->Matches(source, color_chooser_id))
-    color_chooser_info_->chooser->SetSelectedColor(color);
+  color_chooser_.reset();
+  color_chooser_ = std::make_unique<ColorChooser>(
+      new_color_chooser, std::move(chooser_request), std::move(client));
 }
 
 #if BUILDFLAG(ENABLE_PLUGINS)
@@ -4563,6 +4543,7 @@
     RenderFrameHost* render_frame_host,
     const std::string& interface_name,
     mojo::ScopedMessagePipeHandle* interface_pipe) {
+  registry_.TryBindInterface(interface_name, interface_pipe);
   for (auto& observer : observers_) {
     observer.OnInterfaceRequestFromFrame(render_frame_host, interface_name,
                                          interface_pipe);
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index b4ca68a..f66256f 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -35,6 +35,7 @@
 #include "content/browser/renderer_host/render_view_host_impl.h"
 #include "content/browser/renderer_host/render_widget_host_delegate.h"
 #include "content/browser/wake_lock/wake_lock_context_host.h"
+#include "content/common/color_chooser.mojom.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/color_chooser.h"
 #include "content/public/browser/download_url_parameters.h"
@@ -96,7 +97,6 @@
 class WebContentsView;
 class WebContentsViewDelegate;
 struct AXEventNotificationDetails;
-struct ColorSuggestion;
 struct FaviconURL;
 struct LoadNotificationDetails;
 struct MHTMLGenerationParams;
@@ -127,6 +127,7 @@
                                        public RenderViewHostDelegate,
                                        public RenderWidgetHostDelegate,
                                        public RenderFrameHostManager::Delegate,
+                                       public mojom::ColorChooserFactory,
                                        public NotificationObserver,
                                        public NavigationControllerDelegate,
                                        public NavigatorDelegate {
@@ -771,6 +772,15 @@
   int GetOuterDelegateFrameTreeNodeId() override;
   RenderWidgetHostImpl* GetFullscreenRenderWidgetHost() const override;
 
+  // content::mojom::ColorChooserFactory ---------------------------------------
+
+  void OnColorChooserFactoryRequest(mojom::ColorChooserFactoryRequest request);
+  void OpenColorChooser(
+      mojom::ColorChooserRequest chooser,
+      mojom::ColorChooserClientPtr client,
+      SkColor color,
+      std::vector<mojom::ColorSuggestionPtr> suggestions) override;
+
   // NotificationObserver ------------------------------------------------------
 
   void Observe(int type,
@@ -1119,14 +1129,6 @@
   void OnAppCacheAccessed(RenderViewHostImpl* source,
                           const GURL& manifest_url,
                           bool blocked_by_policy);
-  void OnOpenColorChooser(RenderFrameHostImpl* source,
-                          int color_chooser_id,
-                          SkColor color,
-                          const std::vector<ColorSuggestion>& suggestions);
-  void OnEndColorChooser(RenderFrameHostImpl* source, int color_chooser_id);
-  void OnSetSelectedColorInColorChooser(RenderFrameHostImpl* source,
-                                        int color_chooser_id,
-                                        SkColor color);
   void OnUpdatePageImportanceSignals(RenderFrameHostImpl* source,
                                      const PageImportanceSignals& signals);
 #if BUILDFLAG(ENABLE_PLUGINS)
@@ -1522,32 +1524,8 @@
 #endif
 
   // Holds information about a current color chooser dialog, if one is visible.
-  struct ColorChooserInfo {
-    ColorChooserInfo(int render_process_id,
-                     int render_frame_id,
-                     ColorChooser* chooser,
-                     int identifier);
-    ~ColorChooserInfo();
-
-    bool Matches(RenderFrameHostImpl* render_frame_host, int color_chooser_id);
-
-    int render_process_id;
-    int render_frame_id;
-
-    // Color chooser that was opened by this tab.
-    std::unique_ptr<ColorChooser> chooser;
-
-    // A unique identifier for the current color chooser.  Identifiers are
-    // unique across a renderer process.  This avoids race conditions in
-    // synchronizing the browser and renderer processes.  For example, if a
-    // renderer closes one chooser and opens another, and simultaneously the
-    // user picks a color in the first chooser, the IDs can be used to drop the
-    // "chose a color" message rather than erroneously tell the renderer that
-    // the user picked a color in the second chooser.
-    int identifier;
-  };
-
-  std::unique_ptr<ColorChooserInfo> color_chooser_info_;
+  class ColorChooser;
+  std::unique_ptr<ColorChooser> color_chooser_;
 
   // Manages the embedder state for browser plugins, if this WebContents is an
   // embedder; NULL otherwise.
@@ -1603,6 +1581,10 @@
 
   device::mojom::WakeLockPtr renderer_wake_lock_;
 
+  service_manager::BinderRegistry registry_;
+
+  mojo::BindingSet<mojom::ColorChooserFactory> color_chooser_factory_bindings_;
+
 #if defined(OS_ANDROID)
   std::unique_ptr<NFCHost> nfc_host_;
 #endif
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index e6f70f0..e5d366fb 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -544,6 +544,7 @@
     "child_control.mojom",
     "child_memory_coordinator.mojom",
     "clipboard.mojom",
+    "color_chooser.mojom",
     "devtools.mojom",
     "field_trial_recorder.mojom",
     "file_utilities.mojom",
diff --git a/content/common/color_chooser.mojom b/content/common/color_chooser.mojom
new file mode 100644
index 0000000..6e701fb
--- /dev/null
+++ b/content/common/color_chooser.mojom
@@ -0,0 +1,27 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module content.mojom;
+
+import "content/public/common/color_suggestion.mojom";
+
+// A ColorChooser window is shown for <input type="color">.
+interface ColorChooserFactory {
+  OpenColorChooser(
+      ColorChooser& chooser,
+      ColorChooserClient client,
+      uint32 color,
+      array<ColorSuggestion> suggestions);
+};
+
+interface ColorChooser {
+  // Notifies browser of the selected color.
+  SetSelectedColor(uint32 color);
+};
+
+interface ColorChooserClient {
+  // Notifies the renderer that the user selected a color.
+  DidChooseColor(uint32 color);
+};
+
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index 2f4e41d7..636f789 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -32,7 +32,6 @@
 #include "content/common/navigation_gesture.h"
 #include "content/common/navigation_params.h"
 #include "content/common/savable_subframe.h"
-#include "content/public/common/color_suggestion.h"
 #include "content/public/common/common_param_traits.h"
 #include "content/public/common/console_message_level.h"
 #include "content/public/common/context_menu_params.h"
@@ -151,11 +150,6 @@
   IPC_STRUCT_TRAITS_MEMBER(is_for_scroll_sequence)
 IPC_STRUCT_TRAITS_END()
 
-IPC_STRUCT_TRAITS_BEGIN(content::ColorSuggestion)
-  IPC_STRUCT_TRAITS_MEMBER(color)
-  IPC_STRUCT_TRAITS_MEMBER(label)
-IPC_STRUCT_TRAITS_END()
-
 IPC_STRUCT_TRAITS_BEGIN(content::ContextMenuParams)
   IPC_STRUCT_TRAITS_MEMBER(media_type)
   IPC_STRUCT_TRAITS_MEMBER(x)
@@ -830,12 +824,6 @@
 IPC_MESSAGE_ROUTED1(FrameMsg_Reload,
                     bool /* bypass_cache */)
 
-// Notifies the color chooser client that the user selected a color.
-IPC_MESSAGE_ROUTED2(FrameMsg_DidChooseColorResponse, unsigned, SkColor)
-
-// Notifies the color chooser client that the color chooser has ended.
-IPC_MESSAGE_ROUTED1(FrameMsg_DidEndColorChooser, unsigned)
-
 // Requests the corresponding RenderFrameProxy to be deleted and removed from
 // the frame tree.
 IPC_MESSAGE_ROUTED0(FrameMsg_DeleteProxy)
@@ -1508,20 +1496,6 @@
                            bool            /* out - success */,
                            base::string16  /* out - This is ignored.*/)
 
-// Asks the browser to open the color chooser.
-IPC_MESSAGE_ROUTED3(FrameHostMsg_OpenColorChooser,
-                    int /* id */,
-                    SkColor /* color */,
-                    std::vector<content::ColorSuggestion> /* suggestions */)
-
-// Asks the browser to end the color chooser.
-IPC_MESSAGE_ROUTED1(FrameHostMsg_EndColorChooser, int /* id */)
-
-// Change the selected color in the color chooser.
-IPC_MESSAGE_ROUTED2(FrameHostMsg_SetSelectedColorInColorChooser,
-                    int /* id */,
-                    SkColor /* color */)
-
 // Notify browser the theme color has been changed.
 IPC_MESSAGE_ROUTED1(FrameHostMsg_DidChangeThemeColor,
                     SkColor /* theme_color */)
diff --git a/content/public/app/mojo/content_browser_manifest.json b/content/public/app/mojo/content_browser_manifest.json
index ed0ec71..b28c5e2 100644
--- a/content/public/app/mojo/content_browser_manifest.json
+++ b/content/public/app/mojo/content_browser_manifest.json
@@ -141,6 +141,8 @@
           // TODO(beng): figure out how to overlay test interfaces like this.
           "content::mojom::BrowserTarget",
 
+          "content::mojom::ColorChooserFactory",
+
           // InputInjector is only exposed when gpu benchmarking is enabled.
           "content::mojom::InputInjector",
 
diff --git a/content/public/browser/web_contents_delegate.cc b/content/public/browser/web_contents_delegate.cc
index 2ef566f7..62a674c1 100644
--- a/content/public/browser/web_contents_delegate.cc
+++ b/content/public/browser/web_contents_delegate.cc
@@ -157,7 +157,7 @@
 content::ColorChooser* WebContentsDelegate::OpenColorChooser(
     WebContents* web_contents,
     SkColor color,
-    const std::vector<ColorSuggestion>& suggestions) {
+    const std::vector<mojom::ColorSuggestionPtr>& suggestions) {
   return nullptr;
 }
 
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h
index 37db677..0f7cd74 100644
--- a/content/public/browser/web_contents_delegate.h
+++ b/content/public/browser/web_contents_delegate.h
@@ -18,6 +18,7 @@
 #include "content/common/content_export.h"
 #include "content/public/browser/bluetooth_chooser.h"
 #include "content/public/browser/invalidate_type.h"
+#include "content/public/common/color_suggestion.mojom.h"
 #include "content/public/common/media_stream_request.h"
 #include "content/public/common/previews_state.h"
 #include "content/public/common/window_container_type.mojom.h"
@@ -48,7 +49,6 @@
 class SiteInstance;
 class WebContents;
 class WebContentsImpl;
-struct ColorSuggestion;
 struct ContextMenuParams;
 struct DropData;
 struct FileChooserParams;
@@ -340,7 +340,7 @@
   virtual ColorChooser* OpenColorChooser(
       WebContents* web_contents,
       SkColor color,
-      const std::vector<ColorSuggestion>& suggestions);
+      const std::vector<content::mojom::ColorSuggestionPtr>& suggestions);
 
   // Called when a file selection is to be done.
   virtual void RunFileChooser(RenderFrameHost* render_frame_host,
diff --git a/content/public/common/BUILD.gn b/content/public/common/BUILD.gn
index 46f2aef..bcd2ce0 100644
--- a/content/public/common/BUILD.gn
+++ b/content/public/common/BUILD.gn
@@ -118,8 +118,6 @@
     "child_process_host.h",
     "child_process_host_delegate.cc",
     "child_process_host_delegate.h",
-    "color_suggestion.cc",
-    "color_suggestion.h",
     "common_param_traits.cc",
     "common_param_traits.h",
     "common_param_traits_macros.h",
@@ -359,6 +357,7 @@
 
   sources = [
     "appcache_info.mojom",
+    "color_suggestion.mojom",
     "download_stream.mojom",
     "network_service.mojom",
     "network_service_test.mojom",
diff --git a/content/public/common/color_suggestion.cc b/content/public/common/color_suggestion.cc
deleted file mode 100644
index 807b4ac..0000000
--- a/content/public/common/color_suggestion.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/public/common/color_suggestion.h"
-
-namespace content {
-
-ColorSuggestion::ColorSuggestion(const SkColor& color,
-                                 const base::string16& label)
-    : color(color), label(label) {}
-
-}  // namespace content
diff --git a/content/public/common/color_suggestion.h b/content/public/common/color_suggestion.h
deleted file mode 100644
index d54143041..0000000
--- a/content/public/common/color_suggestion.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_PUBLIC_COMMON_COLOR_SUGGESTION_H_
-#define CONTENT_PUBLIC_COMMON_COLOR_SUGGESTION_H_
-
-#include "base/strings/string16.h"
-#include "content/common/content_export.h"
-#include "third_party/skia/include/core/SkColor.h"
-
-namespace content {
-
-// Container for information about datalist suggestion for the color input
-// control.
-struct CONTENT_EXPORT ColorSuggestion {
-  ColorSuggestion() {}
-  ColorSuggestion(const SkColor& color, const base::string16& label);
-
-  SkColor color;
-  base::string16 label;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_PUBLIC_COMMON_COLOR_SUGGESTION_H_
diff --git a/content/public/common/color_suggestion.mojom b/content/public/common/color_suggestion.mojom
new file mode 100644
index 0000000..a7fe420
--- /dev/null
+++ b/content/public/common/color_suggestion.mojom
@@ -0,0 +1,10 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module content.mojom;
+
+struct ColorSuggestion {
+  uint32 color;
+  string label;
+};
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 9e7102b7..4e717e2 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -4427,12 +4427,14 @@
     const blink::WebVector<blink::WebColorSuggestion>& suggestions) {
   RendererWebColorChooserImpl* color_chooser =
       new RendererWebColorChooserImpl(this, client);
-  std::vector<ColorSuggestion> color_suggestions;
-  for (size_t i = 0; i < suggestions.size(); i++) {
-    color_suggestions.push_back(
-        ColorSuggestion(suggestions[i].color, suggestions[i].label.Utf16()));
+  std::vector<mojom::ColorSuggestionPtr> color_suggestions;
+  color_suggestions.reserve(suggestions.size());
+  for (const auto& suggestion : suggestions) {
+    color_suggestions.emplace_back(base::in_place, suggestion.color,
+                                   suggestion.label.Utf8());
   }
-  color_chooser->Open(static_cast<SkColor>(initial_color), color_suggestions);
+  color_chooser->Open(static_cast<SkColor>(initial_color),
+                      std::move(color_suggestions));
   return color_chooser;
 }
 
diff --git a/content/renderer/renderer_webcolorchooser_impl.cc b/content/renderer/renderer_webcolorchooser_impl.cc
index 98b16dd..c5128fa 100644
--- a/content/renderer/renderer_webcolorchooser_impl.cc
+++ b/content/renderer/renderer_webcolorchooser_impl.cc
@@ -4,67 +4,48 @@
 
 #include "content/renderer/renderer_webcolorchooser_impl.h"
 
-#include "content/common/frame_messages.h"
+#include "content/public/renderer/render_frame.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
 
 namespace content {
 
-static int GenerateColorChooserIdentifier() {
-  static int next = 0;
-  return ++next;
-}
-
 RendererWebColorChooserImpl::RendererWebColorChooserImpl(
     RenderFrame* render_frame,
-    blink::WebColorChooserClient* client)
+    blink::WebColorChooserClient* blink_client)
     : RenderFrameObserver(render_frame),
-      identifier_(GenerateColorChooserIdentifier()),
-      client_(client) {
+      blink_client_(blink_client),
+      mojo_client_binding_(this) {
+  render_frame->GetRemoteInterfaces()->GetInterface(&color_chooser_factory_);
 }
 
 RendererWebColorChooserImpl::~RendererWebColorChooserImpl() {
 }
 
-bool RendererWebColorChooserImpl::OnMessageReceived(
-    const IPC::Message& message) {
-  bool handled = true;
-  IPC_BEGIN_MESSAGE_MAP(RendererWebColorChooserImpl, message)
-    IPC_MESSAGE_HANDLER(FrameMsg_DidChooseColorResponse,
-                        OnDidChooseColorResponse)
-    IPC_MESSAGE_HANDLER(FrameMsg_DidEndColorChooser, OnDidEndColorChooser)
-    IPC_MESSAGE_UNHANDLED(handled = false)
-  IPC_END_MESSAGE_MAP()
-  return handled;
-}
-
 void RendererWebColorChooserImpl::SetSelectedColor(blink::WebColor color) {
-  Send(new FrameHostMsg_SetSelectedColorInColorChooser(
-      routing_id(), identifier_, static_cast<SkColor>(color)));
+  color_chooser_->SetSelectedColor(color);
 }
 
 void RendererWebColorChooserImpl::EndChooser() {
-  Send(new FrameHostMsg_EndColorChooser(routing_id(), identifier_));
+  color_chooser_.reset();
 }
 
 void RendererWebColorChooserImpl::Open(
-      SkColor initial_color,
-      const std::vector<content::ColorSuggestion>& suggestions) {
-  Send(new FrameHostMsg_OpenColorChooser(routing_id(),
-                                         identifier_,
-                                         initial_color,
-                                         suggestions));
+    SkColor initial_color,
+    std::vector<mojom::ColorSuggestionPtr> suggestions) {
+  content::mojom::ColorChooserClientPtr mojo_client;
+  mojo_client_binding_.Bind(mojo::MakeRequest(&mojo_client));
+  mojo_client_binding_.set_connection_error_handler(base::BindOnce(
+      [](blink::WebColorChooserClient* blink_client) {
+        blink_client->DidEndChooser();
+      },
+      base::Unretained(blink_client_)));
+  color_chooser_factory_->OpenColorChooser(
+      mojo::MakeRequest(&color_chooser_), std::move(mojo_client), initial_color,
+      std::move(suggestions));
 }
 
-void RendererWebColorChooserImpl::OnDidChooseColorResponse(int color_chooser_id,
-                                                           SkColor color) {
-  DCHECK(identifier_ == color_chooser_id);
-
-  client_->DidChooseColor(static_cast<blink::WebColor>(color));
-}
-
-void RendererWebColorChooserImpl::OnDidEndColorChooser(int color_chooser_id) {
-  if (identifier_ != color_chooser_id)
-    return;
-  client_->DidEndChooser();
+void RendererWebColorChooserImpl::DidChooseColor(SkColor color) {
+  blink_client_->DidChooseColor(static_cast<blink::WebColor>(color));
 }
 
 }  // namespace content
diff --git a/content/renderer/renderer_webcolorchooser_impl.h b/content/renderer/renderer_webcolorchooser_impl.h
index 4c43934..240c08c4 100644
--- a/content/renderer/renderer_webcolorchooser_impl.h
+++ b/content/renderer/renderer_webcolorchooser_impl.h
@@ -9,8 +9,9 @@
 
 #include "base/compiler_specific.h"
 #include "base/macros.h"
-#include "content/public/common/color_suggestion.h"
+#include "content/common/color_chooser.mojom.h"
 #include "content/public/renderer/render_frame_observer.h"
+#include "mojo/public/cpp/bindings/binding.h"
 #include "third_party/WebKit/public/web/WebColorChooser.h"
 #include "third_party/WebKit/public/web/WebColorChooserClient.h"
 #include "third_party/skia/include/core/SkColor.h"
@@ -18,6 +19,7 @@
 namespace content {
 
 class RendererWebColorChooserImpl : public blink::WebColorChooser,
+                                    public mojom::ColorChooserClient,
                                     public RenderFrameObserver {
  public:
   explicit RendererWebColorChooserImpl(RenderFrame* render_frame,
@@ -29,9 +31,7 @@
   void EndChooser() override;
 
   void Open(SkColor initial_color,
-            const std::vector<content::ColorSuggestion>& suggestions);
-
-  blink::WebColorChooserClient* client() { return client_; }
+            std::vector<mojom::ColorSuggestionPtr> suggestions);
 
  private:
   // RenderFrameObserver implementation:
@@ -39,13 +39,14 @@
   // away. RendererWebColorChooserImpl is owned by
   // blink::ColorChooserUIController.
   void OnDestruct() override {}
-  bool OnMessageReceived(const IPC::Message& message) override;
 
-  void OnDidChooseColorResponse(int color_chooser_id, SkColor color);
-  void OnDidEndColorChooser(int color_chooser_id);
+  // content::mojom::ColorChooserClient
+  void DidChooseColor(SkColor color) override;
 
-  int identifier_;
-  blink::WebColorChooserClient* client_;
+  blink::WebColorChooserClient* blink_client_;
+  mojom::ColorChooserFactoryPtr color_chooser_factory_;
+  mojom::ColorChooserPtr color_chooser_;
+  mojo::Binding<mojom::ColorChooserClient> mojo_client_binding_;
 
   DISALLOW_COPY_AND_ASSIGN(RendererWebColorChooserImpl);
 };
diff --git a/extensions/browser/app_window/app_window.cc b/extensions/browser/app_window/app_window.cc
index 82538ac..a8d3d8b 100644
--- a/extensions/browser/app_window/app_window.cc
+++ b/extensions/browser/app_window/app_window.cc
@@ -869,7 +869,7 @@
 content::ColorChooser* AppWindow::OpenColorChooser(
     WebContents* web_contents,
     SkColor initial_color,
-    const std::vector<content::ColorSuggestion>& suggestions) {
+    const std::vector<content::mojom::ColorSuggestionPtr>& suggestions) {
   return app_delegate_->ShowColorChooser(web_contents, initial_color);
 }
 
diff --git a/extensions/browser/app_window/app_window.h b/extensions/browser/app_window/app_window.h
index 66c0674..f554ec21f 100644
--- a/extensions/browser/app_window/app_window.h
+++ b/extensions/browser/app_window/app_window.h
@@ -399,7 +399,8 @@
   content::ColorChooser* OpenColorChooser(
       content::WebContents* web_contents,
       SkColor color,
-      const std::vector<content::ColorSuggestion>& suggestions) override;
+      const std::vector<content::mojom::ColorSuggestionPtr>& suggestions)
+      override;
   void RunFileChooser(content::RenderFrameHost* render_frame_host,
                       const content::FileChooserParams& params) override;
   bool IsPopupOrPanel(const content::WebContents* source) const override;
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm
index 0831eed9..0363ecfb 100644
--- a/ios/chrome/browser/ui/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -751,9 +751,6 @@
 // Returns the view to use when animating a page in or out, positioning it to
 // fill the content area but not actually adding it to the view hierarchy.
 - (UIImageView*)pageOpenCloseAnimationView;
-// Returns the view to use when animating full screen NTP paper in, filling the
-// entire screen but not actually adding it to the view hierarchy.
-- (UIImageView*)pageFullScreenOpenCloseAnimationView;
 // Updates the toolbar display based on the current tab.
 - (void)updateToolbar;
 // Starts or stops broadcasting the toolbar UI and main content UI depending on
@@ -1736,26 +1733,40 @@
   self.inNewTabAnimation = YES;
   if (!inBackground) {
     UIView* animationParentView = _contentArea;
-    // Create the new page image, and load with the new tab page snapshot.
+    // Create the new page image, and load with the new tab snapshot except if
+    // it is the NTP.
     CGFloat newPageOffset = 0;
-    UIImageView* newPage;
+    UIView* newPage;
+    CGFloat offset = 0;
     if (tab.webState->GetLastCommittedURL() == kChromeUINewTabURL &&
         !_isOffTheRecord && !IsIPadIdiom()) {
+      offset = 0;
       animationParentView = self.view;
-      newPage = [self pageFullScreenOpenCloseAnimationView];
+      newPage = tab.view;
+      newPage.userInteractionEnabled = NO;
+      // Compute a frame for the new page by removing the status bar height from
+      // the bounds of |self.view|.
+      CGRect viewBounds, remainder;
+      CGRectDivide(self.view.bounds, &remainder, &viewBounds, StatusBarHeight(),
+                   CGRectMinYEdge);
+      newPage.frame = viewBounds;
     } else {
-      newPage = [self pageOpenCloseAnimationView];
+      UIImageView* pageScreenshot = [self pageOpenCloseAnimationView];
+      tab.view.frame = _contentArea.bounds;
+      pageScreenshot.image =
+          [tab updateSnapshotWithOverlay:YES visibleFrameOnly:YES];
+      newPage = pageScreenshot;
+      offset =
+          pageScreenshot.frame.size.height - pageScreenshot.image.size.height;
     }
     newPageOffset = newPage.frame.origin.y;
 
-    [tab view].frame = _contentArea.bounds;
-    newPage.image = [tab updateSnapshotWithOverlay:YES visibleFrameOnly:YES];
     [animationParentView addSubview:newPage];
     CGPoint origin = [self lastTapPoint];
     page_animation_util::AnimateInPaperWithAnimationAndCompletion(
-        newPage, -newPageOffset,
-        newPage.frame.size.height - newPage.image.size.height, origin,
-        _isOffTheRecord, NULL, ^{
+        newPage, -newPageOffset, offset, origin, _isOffTheRecord, NULL, ^{
+          [tab view].frame = _contentArea.bounds;
+          newPage.userInteractionEnabled = YES;
           [newPage removeFromSuperview];
           self.inNewTabAnimation = NO;
           // Use the model's currentTab here because it is possible that it can
@@ -2496,13 +2507,6 @@
   _expectingForegroundTab = YES;
 }
 
-- (UIImageView*)pageFullScreenOpenCloseAnimationView {
-  CGRect viewBounds, remainder;
-  CGRectDivide(self.view.bounds, &remainder, &viewBounds, StatusBarHeight(),
-               CGRectMinYEdge);
-  return [[UIImageView alloc] initWithFrame:viewBounds];
-}
-
 - (UIImageView*)pageOpenCloseAnimationView {
   CGRect frame = [_contentArea bounds];
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/nosniff/resources/css.py b/third_party/WebKit/LayoutTests/external/wpt/fetch/nosniff/resources/css.py
index 7c4c63b5..55712c5 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/fetch/nosniff/resources/css.py
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/nosniff/resources/css.py
@@ -1,15 +1,23 @@
 def main(request, response):
-    outcome = request.GET.first("outcome", "f")
     type = request.GET.first("type", None)
+    is_revalidation = request.headers.get("If-Modified-Since", None)
 
     content = "/* nothing to see here */"
 
     response.add_required_headers = False
-    response.writer.write_status(200)
-    response.writer.write_header("x-content-type-options", "nosniff")
-    response.writer.write_header("content-length", len(content))
-    if(type != None):
-      response.writer.write_header("content-type", type)
-    response.writer.end_headers()
-
-    response.writer.write(content)
+    if is_revalidation is not None:
+      response.writer.write_status(304)
+      response.writer.write_header("x-content-type-options", "nosniff")
+      response.writer.write_header("content-length", 0)
+      if(type != None):
+        response.writer.write_header("content-type", type)
+      response.writer.end_headers()
+      response.writer.write("")
+    else:
+      response.writer.write_status(200)
+      response.writer.write_header("x-content-type-options", "nosniff")
+      response.writer.write_header("content-length", len(content))
+      if(type != None):
+        response.writer.write_header("content-type", type)
+      response.writer.end_headers()
+      response.writer.write(content)
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/nosniff/stylesheet.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/nosniff/stylesheet.html
index 9e47f757..3d3c9f08 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/fetch/nosniff/stylesheet.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/nosniff/stylesheet.html
@@ -18,21 +18,43 @@
     async_test(function(t) {
       var link = document.createElement("link")
       link.rel = "stylesheet"
-      link.onerror = t.step_func_done(function(){})
+      link.onerror = t.step_func_done()
       link.onload = t.unreached_func("Unexpected load event")
       link.href = get_url(mime)
       document.body.appendChild(link)
     }, "URL query: " + mime)
   })
 
+  fails.forEach(function(mime) {
+    async_test(function(t) {
+      var link = document.createElement("link")
+      link.rel = "stylesheet"
+      link.onerror = t.step_func_done()
+      link.onload = t.unreached_func("Unexpected load event")
+      link.href = get_url(mime)
+      document.body.appendChild(link)
+    }, "Revalidated URL query: " + mime)
+  })
+
+  passes.forEach(function(mime) {
+    async_test(function(t) {
+      var link = document.createElement("link")
+      link.rel = "stylesheet"
+      link.onerror = t.unreached_func("Unexpected error event")
+      link.onload = t.step_func_done()
+      link.href = get_url(mime)
+      document.body.appendChild(link)
+    }, "URL query: " + mime)
+  })
+
   passes.forEach(function(mime) {
     async_test(function(t) {
       var link = document.createElement("link")
       link.rel = "stylesheet"
       link.onerror = t.unreached_func("Unexpected error event")
-      link.onload = t.step_func_done(function(){})
+      link.onload = t.step_func_done()
       link.href = get_url(mime)
       document.body.appendChild(link)
-    }, "URL query: " + mime)
+    }, "Revalidated URL query: " + mime)
   })
 </script>
diff --git a/third_party/WebKit/Source/core/layout/LayoutObjectTest.cpp b/third_party/WebKit/Source/core/layout/LayoutObjectTest.cpp
index 50c645a7..ce6213a 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObjectTest.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutObjectTest.cpp
@@ -525,4 +525,102 @@
             text2->GetLayoutObject()->Parent());
 }
 
+TEST_F(LayoutObjectTest, DisplayContentsWrapperInTable) {
+  SetBodyInnerHTML(R"HTML(
+    <div id='table' style='display:table'>
+      <div id='none' style='display:none'></div>
+      <div id='contents' style='display:contents;color:green'>Green</div>
+    </div>
+  )HTML");
+
+  Element* none = GetDocument().getElementById("none");
+  Element* contents = GetDocument().getElementById("contents");
+
+  ExpectAnonymousInlineWrapperFor<true>(contents->firstChild());
+
+  none->SetInlineStyleProperty(CSSPropertyDisplay, "inline");
+  GetDocument().View()->UpdateAllLifecyclePhases();
+  ASSERT_TRUE(none->GetLayoutObject());
+  LayoutObject* inline_parent = none->GetLayoutObject()->Parent();
+  ASSERT_TRUE(inline_parent);
+  LayoutObject* wrapper_parent =
+      contents->firstChild()->GetLayoutObject()->Parent()->Parent();
+  ASSERT_TRUE(wrapper_parent);
+  EXPECT_EQ(wrapper_parent, inline_parent);
+  EXPECT_TRUE(inline_parent->IsTableCell());
+  EXPECT_TRUE(inline_parent->IsAnonymous());
+}
+
+TEST_F(LayoutObjectTest, DisplayContentsWrapperInTableSection) {
+  SetBodyInnerHTML(R"HTML(
+    <div id='section' style='display:table-row-group'>
+      <div id='none' style='display:none'></div>
+      <div id='contents' style='display:contents;color:green'>Green</div>
+    </div>
+  )HTML");
+
+  Element* none = GetDocument().getElementById("none");
+  Element* contents = GetDocument().getElementById("contents");
+
+  ExpectAnonymousInlineWrapperFor<true>(contents->firstChild());
+
+  none->SetInlineStyleProperty(CSSPropertyDisplay, "inline");
+  GetDocument().View()->UpdateAllLifecyclePhases();
+  ASSERT_TRUE(none->GetLayoutObject());
+  LayoutObject* inline_parent = none->GetLayoutObject()->Parent();
+  ASSERT_TRUE(inline_parent);
+  LayoutObject* wrapper_parent =
+      contents->firstChild()->GetLayoutObject()->Parent()->Parent();
+  ASSERT_TRUE(wrapper_parent);
+  EXPECT_EQ(wrapper_parent, inline_parent);
+  EXPECT_TRUE(inline_parent->IsTableCell());
+  EXPECT_TRUE(inline_parent->IsAnonymous());
+}
+
+TEST_F(LayoutObjectTest, DisplayContentsWrapperInTableRow) {
+  SetBodyInnerHTML(R"HTML(
+    <div id='row' style='display:table-row'>
+      <div id='none' style='display:none'></div>
+      <div id='contents' style='display:contents;color:green'>Green</div>
+    </div>
+  )HTML");
+
+  Element* none = GetDocument().getElementById("none");
+  Element* contents = GetDocument().getElementById("contents");
+
+  ExpectAnonymousInlineWrapperFor<true>(contents->firstChild());
+
+  none->SetInlineStyleProperty(CSSPropertyDisplay, "inline");
+  GetDocument().View()->UpdateAllLifecyclePhases();
+  ASSERT_TRUE(none->GetLayoutObject());
+  LayoutObject* inline_parent = none->GetLayoutObject()->Parent();
+  ASSERT_TRUE(inline_parent);
+  LayoutObject* wrapper_parent =
+      contents->firstChild()->GetLayoutObject()->Parent()->Parent();
+  ASSERT_TRUE(wrapper_parent);
+  EXPECT_EQ(wrapper_parent, inline_parent);
+  EXPECT_TRUE(inline_parent->IsTableCell());
+  EXPECT_TRUE(inline_parent->IsAnonymous());
+}
+
+TEST_F(LayoutObjectTest, DisplayContentsWrapperInTableCell) {
+  SetBodyInnerHTML(R"HTML(
+    <div id='cell' style='display:table-cell'>
+      <div id='none' style='display:none'></div>
+      <div id='contents' style='display:contents;color:green'>Green</div>
+    </div>
+  )HTML");
+
+  Element* cell = GetDocument().getElementById("cell");
+  Element* none = GetDocument().getElementById("none");
+  Element* contents = GetDocument().getElementById("contents");
+
+  ExpectAnonymousInlineWrapperFor<true>(contents->firstChild());
+
+  none->SetInlineStyleProperty(CSSPropertyDisplay, "inline");
+  GetDocument().View()->UpdateAllLifecyclePhases();
+  ASSERT_TRUE(none->GetLayoutObject());
+  EXPECT_EQ(cell->GetLayoutObject(), none->GetLayoutObject()->Parent());
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/LayoutTable.cpp b/third_party/WebKit/Source/core/layout/LayoutTable.cpp
index 31961886..0716a70 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTable.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutTable.cpp
@@ -215,7 +215,8 @@
   while (last_box && last_box->Parent()->IsAnonymous() &&
          !last_box->IsTableSection() && NeedsTableSection(last_box))
     last_box = last_box->Parent();
-  if (last_box && last_box->IsAnonymous() && !IsAfterContent(last_box)) {
+  if (last_box && last_box->IsAnonymous() && last_box->IsTablePart() &&
+      !IsAfterContent(last_box)) {
     if (before_child == last_box)
       before_child = last_box->SlowFirstChild();
     last_box->AddChild(child, before_child);
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp b/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp
index feaad32..652c7f0 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp
@@ -144,7 +144,8 @@
     LayoutObject* last = before_child;
     if (!last)
       last = LastRow();
-    if (last && last->IsAnonymous() && !last->IsBeforeOrAfterContent()) {
+    if (last && last->IsAnonymous() && last->IsTablePart() &&
+        !last->IsBeforeOrAfterContent()) {
       if (before_child == last)
         before_child = last->SlowFirstChild();
       last->AddChild(child, before_child);
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoader.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoader.cpp
index da797cd..dac57ba 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoader.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoader.cpp
@@ -507,8 +507,14 @@
   StringBuilder cors_error_msg;
   resource_->SetCORSStatus(DetermineCORSStatus(response, cors_error_msg));
 
+  // Perform 'nosniff' checks against the original response instead of the 304
+  // response for a successful revalidation.
+  const ResourceResponse& nosniffed_response =
+      (resource_->IsCacheValidator() && response.HttpStatusCode() == 304)
+          ? resource_->GetResponse()
+          : response;
   ResourceRequestBlockedReason blocked_reason =
-      Context().CheckResponseNosniff(request_context, response);
+      Context().CheckResponseNosniff(request_context, nosniffed_response);
   if (blocked_reason != ResourceRequestBlockedReason::kNone) {
     HandleError(ResourceError::CancelledDueToAccessCheckError(response.Url(),
                                                               blocked_reason));