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