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