1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/account_screen.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/input_method/input_method_util.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/account_creation_view.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/screen_observer.h"
1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile_manager.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/site_instance.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/events/event.h"
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "views/widget/widget_gtk.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kCreateAccountPageUrl[] =
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "https://www.google.com/accounts/NewAccount?service=mail&hl=en";
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kCreateAccountDoneUrl[] =
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "http://mail.google.com/mail/help/intro.html";
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kCreateAccountBackUrl[] =
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "about:blank";
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kCreateAccountCSS[] =
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "body > table, div.body > h3, div.body > table, a, "
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "#cookieWarning1, #cookieWarning2 {\n"
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    " display: none !important;\n"
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "}\n"
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "tbody tr:nth-child(7), tbody tr:nth-child(8), tbody tr:nth-child(9),"
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "tbody tr:nth-child(13), tbody tr:nth-child(16), tbody tr:nth-child(17),"
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "tbody tr:nth-child(18) {\n"
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    " display: none !important;\n"
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "}\n"
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "body {\n"
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    " padding: 0;\n"
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "}\n";
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kCreateAccountJS[] =
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  "try {\n"
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  " var smhck = document.getElementById('smhck');\n"
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  " smhck.checked = false;\n"
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  " smhck.value = 0;\n"
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  " var tables = document.getElementsByTagName('table');\n"
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  " for (var i = 0; i < tables.length; i++) {\n"
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  "   if (tables[i].bgColor == '#cbdced') tables[i].cellPadding = 0;\n"
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  " }\n"
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  " var submitbtn = document.getElementById('submitbutton');\n"
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  " submitbtn.value = 'Create Account';\n"
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  " submitbtn.parentNode.parentNode.firstElementChild.innerHTML ="
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  "   \"<input type='button' style='width:8em' value='<< Back'"
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  "      onclick='window.location=\\\"about:blank\\\";'/>\";\n"
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  "} catch(err) {\n"
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  "}\n";
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// AccountScreen, public:
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochAccountScreen::AccountScreen(WizardScreenDelegate* delegate)
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : ViewScreen<AccountCreationView>(delegate) {
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!new_account_page_url_.get())
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    new_account_page_url_.reset(new GURL(kCreateAccountPageUrl));
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochAccountScreen::~AccountScreen() {
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccountScreen::set_new_account_page_url(const GURL& url) {
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_account_page_url_.reset(new GURL(url));
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochscoped_ptr<GURL> AccountScreen::new_account_page_url_;
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool AccountScreen::check_for_https_ = true;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// AccountScreen, ViewScreen implementation:
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccountScreen::CreateView() {
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ViewScreen<AccountCreationView>::CreateView();
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view()->SetWebPageDelegate(this);
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view()->SetAccountCreationViewDelegate(this);
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccountScreen::Refresh() {
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StartTimeoutTimer();
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url(*new_account_page_url_);
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile = ProfileManager::GetDefaultProfile();
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view()->InitDOM(profile,
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  SiteInstance::CreateSiteInstanceForURL(profile, url));
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view()->SetTabContentsDelegate(this);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view()->LoadURL(url);
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochAccountCreationView* AccountScreen::AllocateView() {
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new AccountCreationView();
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// AccountScreen, TabContentsDelegate implementation:
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccountScreen::LoadingStateChanged(TabContents* source) {
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string url = source->GetURL().spec();
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (url == kCreateAccountDoneUrl) {
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    source->Stop();
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CloseScreen(ScreenObserver::ACCOUNT_CREATED);
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (url == kCreateAccountBackUrl) {
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CloseScreen(ScreenObserver::ACCOUNT_CREATE_BACK);
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (check_for_https_ && !source->GetURL().SchemeIsSecure()) {
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CloseScreen(ScreenObserver::CONNECTION_FAILED);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccountScreen::NavigationStateChanged(const TabContents* source,
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           unsigned changed_flags) {
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (source->render_view_host()) {
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    source->render_view_host()->InsertCSSInWebFrame(
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        L"", kCreateAccountCSS, "");
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    source->render_view_host()->ExecuteJavascriptInWebFrame(
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        string16(), ASCIIToUTF16(kCreateAccountJS));
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid AccountScreen::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::Widget* widget = view()->GetWidget();
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (widget && event.os_event && !event.skip_in_browser) {
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    views::KeyEvent views_event(reinterpret_cast<GdkEvent*>(event.os_event));
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    static_cast<views::WidgetGtk*>(widget)->HandleKeyboardEvent(views_event);
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// AccountScreen, WebPageDelegate implementation:
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccountScreen::OnPageLoaded() {
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StopTimeoutTimer();
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enable input methods (e.g. Chinese, Japanese) so that users could input
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // their first and last names.
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (g_browser_process) {
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string locale = g_browser_process->GetApplicationLocale();
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    input_method::EnableInputMethods(
1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        locale, input_method::kAllInputMethods, "");
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view()->ShowPageContent();
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccountScreen::OnPageLoadFailed(const std::string& url) {
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CloseScreen(ScreenObserver::CONNECTION_FAILED);
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// AccountScreen, AccountCreationViewDelegate implementation:
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccountScreen::OnUserCreated(const std::string& username,
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  const std::string& password) {
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate()->GetObserver(this)->OnSetUserNamePassword(username, password);
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// AccountScreen, private:
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AccountScreen::CloseScreen(ScreenObserver::ExitCodes code) {
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StopTimeoutTimer();
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Disable input methods since they are not necessary to input username and
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // password.
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (g_browser_process) {
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string locale = g_browser_process->GetApplicationLocale();
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    input_method::EnableInputMethods(
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        locale, input_method::kKeyboardLayoutsOnly, "");
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate()->GetObserver(this)->OnExit(code);
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
182