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