[iOS] Add chrome://suggestions WebUI

This WebUI is already present on other platforms. It will be useful for
testing upcoming refactoring of the suggestions component.

Change-Id: I303b02c04b0f90c34dd72bf0157199a60a26eb97
Reviewed-on: https://chromium-review.googlesource.com/574592
Reviewed-by: Sylvain Defresne <[email protected]>
Reviewed-by: Marc Treib <[email protected]>
Commit-Queue: Colin Blundell <[email protected]>
Cr-Commit-Position: refs/heads/master@{#488274}
diff --git a/ios/chrome/browser/chrome_url_constants.cc b/ios/chrome/browser/chrome_url_constants.cc
index abc9401..3c9c345 100644
--- a/ios/chrome/browser/chrome_url_constants.cc
+++ b/ios/chrome/browser/chrome_url_constants.cc
@@ -21,6 +21,7 @@
 const char kChromeUIOfflineURL[] = "chrome://offline/";
 const char kChromeUIPhysicalWebURL[] = "chrome://physical-web/";
 const char kChromeUISettingsURL[] = "chrome://settings/";
+const char kChromeUISuggestionsURL[] = "chrome://suggestions/";
 const char kChromeUITermsURL[] = "chrome://terms/";
 const char kChromeUIVersionURL[] = "chrome://version/";
 
@@ -43,6 +44,7 @@
 const char kChromeUIPhysicalWebHost[] = "physical-web";
 const char kChromeUIPolicyHost[] = "policy";
 const char kChromeUISignInInternalsHost[] = "signin-internals";
+const char kChromeUISuggestionsHost[] = "suggestions";
 const char kChromeUISyncInternalsHost[] = "sync-internals";
 const char kChromeUITermsHost[] = "terms";
 const char kChromeUIVersionHost[] = "version";
@@ -55,9 +57,9 @@
     kChromeUICreditsHost,         kChromeUIFlagsHost,
     kChromeUIHistogramHost,       kChromeUINetExportHost,
     kChromeUINewTabHost,          kChromeUINTPTilesInternalsHost,
-    kChromeUISignInInternalsHost, kChromeUISyncInternalsHost,
-    kChromeUIPhysicalWebHost,     kChromeUITermsHost,
-    kChromeUIVersionHost,
+    kChromeUISignInInternalsHost, kChromeUISuggestionsHost,
+    kChromeUISyncInternalsHost,   kChromeUIPhysicalWebHost,
+    kChromeUITermsHost,           kChromeUIVersionHost,
 };
 const size_t kNumberOfChromeHostURLs = arraysize(kChromeHostURLs);
 
diff --git a/ios/chrome/browser/chrome_url_constants.h b/ios/chrome/browser/chrome_url_constants.h
index 4377613..dfe96394 100644
--- a/ios/chrome/browser/chrome_url_constants.h
+++ b/ios/chrome/browser/chrome_url_constants.h
@@ -32,6 +32,7 @@
 extern const char kChromeUIPhysicalWebURL[];
 extern const char kChromeUIPopularSitesInternalsURL[];
 extern const char kChromeUISettingsURL[];
+extern const char kChromeUISuggestionsURL[];
 extern const char kChromeUITermsURL[];
 extern const char kChromeUIVersionURL[];
 
@@ -56,6 +57,7 @@
 extern const char kChromeUIPopularSitesInternalsHost[];
 extern const char kChromeUIPolicyHost[];
 extern const char kChromeUISignInInternalsHost[];
+extern const char kChromeUISuggestionsHost[];
 extern const char kChromeUISyncInternalsHost[];
 extern const char kChromeUITermsHost[];
 extern const char kChromeUIVersionHost[];
diff --git a/ios/chrome/browser/ui/webui/BUILD.gn b/ios/chrome/browser/ui/webui/BUILD.gn
index fcda20bd..a17bac5 100644
--- a/ios/chrome/browser/ui/webui/BUILD.gn
+++ b/ios/chrome/browser/ui/webui/BUILD.gn
@@ -16,6 +16,8 @@
     "ntp_tiles_internals_ui.h",
     "physical_web_ui.cc",
     "physical_web_ui.h",
+    "suggestions_ui.cc",
+    "suggestions_ui.h",
     "terms_ui.h",
     "terms_ui.mm",
     "version_handler.cc",
@@ -36,6 +38,7 @@
     "//components/prefs",
     "//components/resources",
     "//components/strings",
+    "//components/suggestions",
     "//components/version_info",
     "//components/version_ui",
     "//google_apis",
@@ -46,6 +49,7 @@
     "//ios/chrome/browser/favicon:favicon",
     "//ios/chrome/browser/metrics",
     "//ios/chrome/browser/ntp_tiles",
+    "//ios/chrome/browser/suggestions",
     "//ios/chrome/browser/ui",
     "//ios/chrome/common",
     "//ios/web",
diff --git a/ios/chrome/browser/ui/webui/chrome_web_ui_ios_controller_factory.mm b/ios/chrome/browser/ui/webui/chrome_web_ui_ios_controller_factory.mm
index c5e8ea590..15c2279 100644
--- a/ios/chrome/browser/ui/webui/chrome_web_ui_ios_controller_factory.mm
+++ b/ios/chrome/browser/ui/webui/chrome_web_ui_ios_controller_factory.mm
@@ -18,6 +18,7 @@
 #include "ios/chrome/browser/ui/webui/omaha_ui.h"
 #include "ios/chrome/browser/ui/webui/physical_web_ui.h"
 #include "ios/chrome/browser/ui/webui/signin_internals_ui_ios.h"
+#include "ios/chrome/browser/ui/webui/suggestions_ui.h"
 #include "ios/chrome/browser/ui/webui/sync_internals/sync_internals_ui.h"
 #include "ios/chrome/browser/ui/webui/terms_ui.h"
 #include "ios/chrome/browser/ui/webui/version_ui.h"
@@ -81,6 +82,8 @@
   }
   if (url_host == kChromeUISignInInternalsHost)
     return &NewWebUIIOS<SignInInternalsUIIOS>;
+  if (url.host_piece() == kChromeUISuggestionsHost)
+    return &NewWebUIIOS<suggestions::SuggestionsUI>;
   if (url_host == kChromeUISyncInternalsHost)
     return &NewWebUIIOS<SyncInternalsUI>;
   if (url_host == kChromeUITermsHost)
diff --git a/ios/chrome/browser/ui/webui/suggestions_ui.cc b/ios/chrome/browser/ui/webui/suggestions_ui.cc
new file mode 100644
index 0000000..8e3c0d70
--- /dev/null
+++ b/ios/chrome/browser/ui/webui/suggestions_ui.cc
@@ -0,0 +1,75 @@
+// 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.
+
+#include "ios/chrome/browser/ui/webui/suggestions_ui.h"
+
+#include <map>
+#include <string>
+
+#include "components/suggestions/webui/suggestions_source.h"
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#include "ios/chrome/browser/chrome_url_constants.h"
+#include "ios/chrome/browser/suggestions/suggestions_service_factory.h"
+#include "ios/web/public/url_data_source_ios.h"
+
+namespace suggestions {
+
+namespace {
+
+// Glues a SuggestionsSource instance to //ios/chrome.
+class SuggestionsSourceWrapper : public web::URLDataSourceIOS {
+ public:
+  explicit SuggestionsSourceWrapper(SuggestionsService* suggestions_service);
+
+  // web::URLDataSourceIOS implementation.
+  std::string GetSource() const override;
+  void StartDataRequest(
+      const std::string& path,
+      const web::URLDataSourceIOS::GotDataCallback& callback) override;
+  std::string GetMimeType(const std::string& path) const override;
+
+ private:
+  ~SuggestionsSourceWrapper() override;
+
+  SuggestionsSource suggestions_source_;
+
+  DISALLOW_COPY_AND_ASSIGN(SuggestionsSourceWrapper);
+};
+
+SuggestionsSourceWrapper::SuggestionsSourceWrapper(
+    SuggestionsService* suggestions_service)
+    : suggestions_source_(suggestions_service, kChromeUISuggestionsURL) {}
+
+SuggestionsSourceWrapper::~SuggestionsSourceWrapper() {}
+
+std::string SuggestionsSourceWrapper::GetSource() const {
+  return kChromeUISuggestionsHost;
+}
+
+void SuggestionsSourceWrapper::StartDataRequest(
+    const std::string& path,
+    const web::URLDataSourceIOS::GotDataCallback& callback) {
+  suggestions_source_.StartDataRequest(path, callback);
+}
+
+std::string SuggestionsSourceWrapper::GetMimeType(
+    const std::string& path) const {
+  return "text/html";
+}
+
+}  // namespace
+
+SuggestionsUI::SuggestionsUI(web::WebUIIOS* web_ui)
+    : web::WebUIIOSController(web_ui) {
+  ios::ChromeBrowserState* browser_state =
+      ios::ChromeBrowserState::FromWebUIIOS(web_ui);
+  web::URLDataSourceIOS::Add(
+      browser_state,
+      new SuggestionsSourceWrapper(
+          SuggestionsServiceFactory::GetForBrowserState(browser_state)));
+}
+
+SuggestionsUI::~SuggestionsUI() {}
+
+}  // namespace suggestions
diff --git a/ios/chrome/browser/ui/webui/suggestions_ui.h b/ios/chrome/browser/ui/webui/suggestions_ui.h
new file mode 100644
index 0000000..ce474f0f
--- /dev/null
+++ b/ios/chrome/browser/ui/webui/suggestions_ui.h
@@ -0,0 +1,30 @@
+// 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.
+
+#ifndef IOS_CHROME_BROWSER_UI_WEBUI_SUGGESTIONS_UI_H_
+#define IOS_CHROME_BROWSER_UI_WEBUI_SUGGESTIONS_UI_H_
+
+#include "base/macros.h"
+#include "ios/web/public/webui/web_ui_ios_controller.h"
+
+namespace web {
+class WebUIIOS;
+}
+
+namespace suggestions {
+
+// The WebUIController for chrome://suggestions. Renders a webpage to list
+// SuggestionsService data.
+class SuggestionsUI : public web::WebUIIOSController {
+ public:
+  explicit SuggestionsUI(web::WebUIIOS* web_ui);
+  ~SuggestionsUI() override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(SuggestionsUI);
+};
+
+}  // namespace suggestions
+
+#endif  // IOS_CHROME_BROWSER_UI_WEBUI_SUGGESTIONS_UI_H_