1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file.
4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/chromeos/enterprise_enrollment_ui.h"
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/json/json_reader.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/json/json_writer.h"
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/lazy_instance.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted_memory.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/message_loop.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/stringprintf.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/values.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/profiles/profile.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/chrome_url_data_manager.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/jstemplate_builder.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/url_constants.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/renderer_host/render_view_host.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/tab_contents/tab_contents.h"
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/bindings_policy.h"
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/property_bag.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/browser_resources.h"
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/chromium_strings.h"
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/generated_resources.h"
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/l10n/l10n_util.h"
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/resource/resource_bundle.h"
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace chromeos {
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic base::LazyInstance<
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PropertyAccessor<EnterpriseEnrollmentUI::Controller*> >
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        g_enrollment_ui_controller_property(base::LINKER_INITIALIZED);
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic const char kEnterpriseEnrollmentGaiaLoginPath[] = "gaialogin";
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// WebUIMessageHandler implementation which handles events occuring on the page,
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// such as the user pressing the signin button.
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass EnterpriseEnrollmentMessageHandler : public WebUIMessageHandler {
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EnterpriseEnrollmentMessageHandler();
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~EnterpriseEnrollmentMessageHandler();
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // WebUIMessageHandler implementation.
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RegisterMessages() OVERRIDE;
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Handlers for WebUI messages.
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandleSubmitAuth(const ListValue* args);
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandleCancelAuth(const ListValue* args);
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void HandleConfirmationClose(const ListValue* args);
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Gets the currently installed enrollment controller (if any).
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EnterpriseEnrollmentUI::Controller* GetController();
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(EnterpriseEnrollmentMessageHandler);
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// A data source that provides the resources for the enterprise enrollment page.
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// The enterprise enrollment page requests the HTML and other resources from
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// this source.
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass EnterpriseEnrollmentDataSource : public ChromeURLDataManager::DataSource {
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EnterpriseEnrollmentDataSource();
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // DataSource implementation.
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void StartDataRequest(const std::string& path,
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                bool is_off_the_record,
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                int request_id) OVERRIDE;
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual std::string GetMimeType(const std::string& path) const OVERRIDE;
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~EnterpriseEnrollmentDataSource();
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Saves i18n string for |resource_id| to the |key| property of |dictionary|.
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static void AddString(DictionaryValue* dictionary,
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        const std::string& key,
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        int resource_id);
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static void AddString(DictionaryValue* dictionary,
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        const std::string& key,
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        int resource_id,
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        const string16& arg1);
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(EnterpriseEnrollmentDataSource);
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenEnterpriseEnrollmentMessageHandler::EnterpriseEnrollmentMessageHandler() {}
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenEnterpriseEnrollmentMessageHandler::~EnterpriseEnrollmentMessageHandler() {}
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid EnterpriseEnrollmentMessageHandler::RegisterMessages() {
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->RegisterMessageCallback(
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "SubmitAuth",
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NewCallback(
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          this, &EnterpriseEnrollmentMessageHandler::HandleSubmitAuth));
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->RegisterMessageCallback(
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "DialogClose",
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NewCallback(
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          this, &EnterpriseEnrollmentMessageHandler::HandleCancelAuth));
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->RegisterMessageCallback(
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "confirmationClose",
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NewCallback(
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          this, &EnterpriseEnrollmentMessageHandler::HandleConfirmationClose));
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid EnterpriseEnrollmentMessageHandler::HandleSubmitAuth(
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const ListValue* value) {
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EnterpriseEnrollmentUI::Controller* controller = GetController();
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!controller) {
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED();
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Value carries single list entry, which is a json-encoded string that
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // contains the auth parameters (see gaia_login.js).
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string json_params;
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!value->GetString(0, &json_params)) {
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED();
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Check the value type.
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<Value> params(base::JSONReader::Read(json_params, false));
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!params.get() || !params->IsType(Value::TYPE_DICTIONARY)) {
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED();
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Read the parameters.
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DictionaryValue* params_dict = static_cast<DictionaryValue*>(params.get());
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string user;
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string pass;
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string captcha;
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string access_code;
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!params_dict->GetString("user", &user) ||
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !params_dict->GetString("pass", &pass) ||
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !params_dict->GetString("captcha", &captcha) ||
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !params_dict->GetString("access_code", &access_code)) {
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED();
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  controller->OnAuthSubmitted(user, pass, captcha, access_code);
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid EnterpriseEnrollmentMessageHandler::HandleCancelAuth(
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const ListValue* value) {
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EnterpriseEnrollmentUI::Controller* controller = GetController();
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!controller) {
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED();
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  controller->OnAuthCancelled();
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid EnterpriseEnrollmentMessageHandler::HandleConfirmationClose(
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const ListValue* value) {
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EnterpriseEnrollmentUI::Controller* controller = GetController();
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!controller) {
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED();
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  controller->OnConfirmationClosed();
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenEnterpriseEnrollmentUI::Controller*
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EnterpriseEnrollmentMessageHandler::GetController() {
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return EnterpriseEnrollmentUI::GetController(web_ui_);
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenEnterpriseEnrollmentDataSource::EnterpriseEnrollmentDataSource()
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : DataSource(chrome::kChromeUIEnterpriseEnrollmentHost,
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                 MessageLoop::current()) {}
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid EnterpriseEnrollmentDataSource::StartDataRequest(const std::string& path,
177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                      bool is_off_the_record,
178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                      int request_id) {
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ResourceBundle& resource_bundle = ResourceBundle::GetSharedInstance();
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DictionaryValue strings;
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string response;
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (path.empty()) {
184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "loginHeader",
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              IDS_ENTERPRISE_ENROLLMENT_LOGIN_HEADER),
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "loginExplain",
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              IDS_ENTERPRISE_ENROLLMENT_LOGIN_EXPLAIN,
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "cloudHeader",
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              IDS_ENTERPRISE_ENROLLMENT_CLOUD_HEADER),
191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "cloudExplain",
192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              IDS_ENTERPRISE_ENROLLMENT_CLOUD_EXPLAIN);
193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "accesscontrolHeader",
194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              IDS_ENTERPRISE_ENROLLMENT_ACCESSCONTROL_HEADER),
195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "accesscontrolExplain",
196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              IDS_ENTERPRISE_ENROLLMENT_ACCESSCONTROL_EXPLAIN);
197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "confirmationHeader",
198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              IDS_ENTERPRISE_ENROLLMENT_CONFIRMATION_HEADER);
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "confirmationMessage",
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              IDS_ENTERPRISE_ENROLLMENT_CONFIRMATION_MESSAGE);
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "confirmationClose",
202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              IDS_ENTERPRISE_ENROLLMENT_CONFIRMATION_CLOSE);
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    static const base::StringPiece html(
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        resource_bundle.GetRawDataResource(IDR_ENTERPRISE_ENROLLMENT_HTML));
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SetFontAndTextDirection(&strings);
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    response = jstemplate_builder::GetI18nTemplateHtml(html, &strings);
208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else if (path == kEnterpriseEnrollmentGaiaLoginPath) {
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    strings.SetString("invalidpasswordhelpurl", "");
210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    strings.SetString("invalidaccessaccounturl", "");
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    strings.SetString("cannotaccessaccount", "");
212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    strings.SetString("cannotaccessaccounturl", "");
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    strings.SetString("createaccount", "");
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    strings.SetString("createnewaccounturl", "");
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    strings.SetString("getaccesscodehelp", "");
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    strings.SetString("getaccesscodeurl", "");
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // None of the strings used here currently have sync-specific wording in
219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // them.  We have a unit test to catch if that happens.
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    strings.SetString("introduction", "");
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "signinprefix", IDS_SYNC_LOGIN_SIGNIN_PREFIX);
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "signinsuffix", IDS_SYNC_LOGIN_SIGNIN_SUFFIX);
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "cannotbeblank", IDS_SYNC_CANNOT_BE_BLANK);
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "emaillabel", IDS_SYNC_LOGIN_EMAIL);
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "passwordlabel", IDS_SYNC_LOGIN_PASSWORD);
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "invalidcredentials",
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              IDS_SYNC_INVALID_USER_CREDENTIALS);
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "signin", IDS_SYNC_SIGNIN);
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "couldnotconnect", IDS_SYNC_LOGIN_COULD_NOT_CONNECT);
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "cancel", IDS_CANCEL);
231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "settingup", IDS_SYNC_LOGIN_SETTING_UP);
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "success", IDS_SYNC_SUCCESS);
233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "errorsigningin", IDS_SYNC_ERROR_SIGNING_IN);
234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "captchainstructions",
235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              IDS_SYNC_GAIA_CAPTCHA_INSTRUCTIONS);
236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "invalidaccesscode",
237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              IDS_SYNC_INVALID_ACCESS_CODE_LABEL);
238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddString(&strings, "enteraccesscode", IDS_SYNC_ENTER_ACCESS_CODE_LABEL);
239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    static const base::StringPiece html(resource_bundle.GetRawDataResource(
241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        IDR_GAIA_LOGIN_HTML));
242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SetFontAndTextDirection(&strings);
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    response = jstemplate_builder::GetI18nTemplateHtml(html, &strings);
244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Send the response.
247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes());
248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  html_bytes->data.resize(response.size());
249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::copy(response.begin(), response.end(), html_bytes->data.begin());
250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SendResponse(request_id, html_bytes);
251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstd::string EnterpriseEnrollmentDataSource::GetMimeType(
254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const std::string& path) const {
255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return "text/html";
256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenEnterpriseEnrollmentDataSource::~EnterpriseEnrollmentDataSource() {}
259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid EnterpriseEnrollmentDataSource::AddString(DictionaryValue* dictionary,
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                               const std::string& key,
262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                               int resource_id) {
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  dictionary->SetString(key, l10n_util::GetStringUTF16(resource_id));
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid EnterpriseEnrollmentDataSource::AddString(DictionaryValue* dictionary,
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                               const std::string& key,
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                               int resource_id,
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                               const string16& arg1) {
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  dictionary->SetString(key, l10n_util::GetStringFUTF16(resource_id, arg1));
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenEnterpriseEnrollmentUI::EnterpriseEnrollmentUI(TabContents* contents)
274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : WebUI(contents) {}
275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenEnterpriseEnrollmentUI::~EnterpriseEnrollmentUI() {}
277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid EnterpriseEnrollmentUI::RenderViewCreated(
279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    RenderViewHost* render_view_host) {
280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Bail out early if the controller doesn't exist or web ui is disabled.
281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!GetController(this) || !(bindings_ & BindingsPolicy::WEB_UI))
282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WebUIMessageHandler* handler = new EnterpriseEnrollmentMessageHandler();
285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AddMessageHandler(handler->Attach(this));
286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Set up the data source, so the enrollment page can be loaded.
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  tab_contents()->profile()->GetChromeURLDataManager()->AddDataSource(
289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      new EnterpriseEnrollmentDataSource());
290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string user;
292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool has_init_user = GetController(this)->GetInitialUser(&user);
293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!has_init_user)
294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    user = "";
295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Set the arguments for showing the gaia login page.
296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DictionaryValue args;
297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  args.SetString("user", user);
298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  args.SetInteger("error", 0);
299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  args.SetBoolean("editable_user", !has_init_user);
300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  args.SetString("initialScreen", "login-screen");
301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string json_args;
302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  base::JSONWriter::Write(&args, false, &json_args);
303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  render_view_host->SetWebUIProperty("dialogArguments", json_args);
304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// static
307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenEnterpriseEnrollmentUI::Controller* EnterpriseEnrollmentUI::GetController(
308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    WebUI* ui) {
309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Controller** controller =
310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      g_enrollment_ui_controller_property.Get().GetProperty(
311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          ui->tab_contents()->property_bag());
312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return controller ? *controller : NULL;
314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// static
317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid EnterpriseEnrollmentUI::SetController(
318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    TabContents* contents,
319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EnterpriseEnrollmentUI::Controller* controller) {
320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  g_enrollment_ui_controller_property.Get().SetProperty(
321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      contents->property_bag(),
322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      controller);
323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace chromeos
326