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/registration_screen.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/string_util.h"
      9 #include "chrome/browser/browser_process.h"
     10 #include "chrome/browser/chromeos/input_method/input_method_util.h"
     11 #include "chrome/browser/profiles/profile_manager.h"
     12 #include "chrome/common/url_constants.h"
     13 #include "content/browser/child_process_security_policy.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 "net/url_request/url_request_about_job.h"
     19 #include "net/url_request/url_request_filter.h"
     20 #include "views/widget/widget_gtk.h"
     21 
     22 namespace chromeos {
     23 
     24 namespace {
     25 
     26 const char kRegistrationHostPageUrl[] = "chrome://register/";
     27 
     28 // "Hostname" that is used for redirects from host registration page.
     29 const char kRegistrationHostnameUrl[] = "register";
     30 
     31 // Host page navigates to these URLs in case of success/skipped registration.
     32 const char kRegistrationSuccessUrl[] = "cros://register/success";
     33 const char kRegistrationSkippedUrl[] = "cros://register/skipped";
     34 
     35 }  // namespace
     36 
     37 ///////////////////////////////////////////////////////////////////////////////
     38 // RegistrationScreen, public:
     39 RegistrationScreen::RegistrationScreen(WizardScreenDelegate* delegate)
     40     : ViewScreen<RegistrationView>(delegate) {
     41   if (!host_page_url_.get())
     42     set_registration_host_page_url(GURL(kRegistrationHostPageUrl));
     43 
     44   ChildProcessSecurityPolicy::GetInstance()->RegisterWebSafeScheme(
     45       chrome::kCrosScheme);
     46   net::URLRequestFilter::GetInstance()->AddHostnameHandler(
     47       chrome::kCrosScheme,
     48       kRegistrationHostnameUrl,
     49       &RegistrationScreen::Factory);
     50 }
     51 
     52 // static
     53 void RegistrationScreen::set_registration_host_page_url(const GURL& url) {
     54   host_page_url_.reset(new GURL(url));
     55 }
     56 
     57 // static
     58 scoped_ptr<GURL> RegistrationScreen::host_page_url_;
     59 
     60 ///////////////////////////////////////////////////////////////////////////////
     61 // RegistrationScreen, ViewScreen implementation:
     62 void RegistrationScreen::CreateView() {
     63   ViewScreen<RegistrationView>::CreateView();
     64   view()->SetWebPageDelegate(this);
     65 }
     66 
     67 void RegistrationScreen::Refresh() {
     68   StartTimeoutTimer();
     69   GURL url(*host_page_url_);
     70   Profile* profile = ProfileManager::GetDefaultProfile();
     71   view()->InitDOM(profile,
     72                   SiteInstance::CreateSiteInstanceForURL(profile, url));
     73   view()->SetTabContentsDelegate(this);
     74   view()->LoadURL(url);
     75 }
     76 
     77 RegistrationView* RegistrationScreen::AllocateView() {
     78   return new RegistrationView();
     79 }
     80 
     81 ///////////////////////////////////////////////////////////////////////////////
     82 // RegistrationScreen, WebPageDelegate implementation:
     83 void RegistrationScreen::OnPageLoaded() {
     84   StopTimeoutTimer();
     85   // Enable input methods (e.g. Chinese, Japanese) so that users could input
     86   // their first and last names.
     87   if (g_browser_process) {
     88     const std::string locale = g_browser_process->GetApplicationLocale();
     89     input_method::EnableInputMethods(
     90         locale, input_method::kAllInputMethods, "");
     91   }
     92   view()->ShowPageContent();
     93 }
     94 
     95 void RegistrationScreen::OnPageLoadFailed(const std::string& url) {
     96   LOG(ERROR) << "Error loading registration page: " << url;
     97   CloseScreen(ScreenObserver::REGISTRATION_SKIPPED);
     98 }
     99 
    100 ///////////////////////////////////////////////////////////////////////////////
    101 // RegistrationScreen, TabContentsDelegate implementation:
    102  void RegistrationScreen::OpenURLFromTab(TabContents* source,
    103                                          const GURL& url,
    104                                          const GURL& referrer,
    105                                          WindowOpenDisposition disposition,
    106                                          PageTransition::Type transition) {
    107   if (url.spec() == kRegistrationSuccessUrl) {
    108     source->Stop();
    109     VLOG(1) << "Registration form completed.";
    110     CloseScreen(ScreenObserver::REGISTRATION_SUCCESS);
    111   } else if (url.spec() == kRegistrationSkippedUrl) {
    112     source->Stop();
    113     VLOG(1) << "Registration form skipped.";
    114     CloseScreen(ScreenObserver::REGISTRATION_SKIPPED);
    115   } else {
    116     source->Stop();
    117     // Host registration page and actual registration page hosted by
    118     // OEM partner doesn't contain links to external URLs.
    119     LOG(WARNING) << "Navigate to unsupported url: " << url.spec();
    120   }
    121 }
    122 
    123 void RegistrationScreen::HandleKeyboardEvent(
    124     const NativeWebKeyboardEvent& event) {
    125   views::Widget* widget = view()->GetWidget();
    126   if (widget && event.os_event && !event.skip_in_browser) {
    127     views::KeyEvent views_event(reinterpret_cast<GdkEvent*>(event.os_event));
    128     static_cast<views::WidgetGtk*>(widget)->HandleKeyboardEvent(views_event);
    129   }
    130 }
    131 
    132 ///////////////////////////////////////////////////////////////////////////////
    133 // RegistrationScreen, private:
    134 void RegistrationScreen::CloseScreen(ScreenObserver::ExitCodes code) {
    135   StopTimeoutTimer();
    136   // Disable input methods since they are not necessary to input username and
    137   // password.
    138   if (g_browser_process) {
    139     const std::string locale = g_browser_process->GetApplicationLocale();
    140     input_method::EnableInputMethods(
    141         locale, input_method::kKeyboardLayoutsOnly, "");
    142   }
    143   delegate()->GetObserver(this)->OnExit(code);
    144 }
    145 
    146 // static
    147 net::URLRequestJob* RegistrationScreen::Factory(net::URLRequest* request,
    148                                                 const std::string& scheme) {
    149   VLOG(1) << "Handling url: " << request->url().spec().c_str();
    150   return new net::URLRequestAboutJob(request);
    151 }
    152 
    153 }  // namespace chromeos
    154