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/html_page_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/screen_observer.h"
     12 #include "chrome/browser/profiles/profile_manager.h"
     13 #include "content/browser/renderer_host/render_view_host.h"
     14 #include "content/browser/site_instance.h"
     15 #include "content/browser/tab_contents/tab_contents.h"
     16 #include "googleurl/src/gurl.h"
     17 #include "views/events/event.h"
     18 #include "views/widget/widget_gtk.h"
     19 
     20 namespace chromeos {
     21 
     22 static const char kHTMLPageDoneUrl[] = "about:blank";
     23 
     24 ///////////////////////////////////////////////////////////////////////////////
     25 // HTMLPageDomView
     26 TabContents* HTMLPageDomView::CreateTabContents(Profile* profile,
     27                                                 SiteInstance* instance) {
     28   return new WizardWebPageViewTabContents(profile,
     29                                           instance,
     30                                           page_delegate_);
     31 }
     32 
     33 ///////////////////////////////////////////////////////////////////////////////
     34 // HTMLPageView
     35 HTMLPageView::HTMLPageView()
     36     : dom_view_(new HTMLPageDomView()) {
     37 }
     38 
     39 ///////////////////////////////////////////////////////////////////////////////
     40 // HTMLPageScreen, public:
     41 HTMLPageScreen::HTMLPageScreen(WizardScreenDelegate* delegate,
     42                                const std::string& url)
     43     : ViewScreen<HTMLPageView>(delegate), url_(url) {
     44 }
     45 
     46 ///////////////////////////////////////////////////////////////////////////////
     47 // HTMLPageScreen, ViewScreen implementation:
     48 void HTMLPageScreen::CreateView() {
     49   ViewScreen<HTMLPageView>::CreateView();
     50   view()->SetWebPageDelegate(this);
     51 }
     52 
     53 void HTMLPageScreen::Refresh() {
     54   VLOG(1) << "HTMLPageScreen::Refresh(): " << url_;
     55   StartTimeoutTimer();
     56   GURL url(url_);
     57   Profile* profile = ProfileManager::GetDefaultProfile();
     58   view()->InitDOM(profile,
     59                   SiteInstance::CreateSiteInstanceForURL(profile, url));
     60   view()->SetTabContentsDelegate(this);
     61   view()->LoadURL(url);
     62 }
     63 
     64 HTMLPageView* HTMLPageScreen::AllocateView() {
     65   return new HTMLPageView();
     66 }
     67 
     68 ///////////////////////////////////////////////////////////////////////////////
     69 // HTMLPageScreen, TabContentsDelegate implementation:
     70 void HTMLPageScreen::LoadingStateChanged(TabContents* source) {
     71   std::string url = source->GetURL().spec();
     72   if (url == kHTMLPageDoneUrl) {
     73     source->Stop();
     74     // TODO(dpolukhin): use special code for this case but now
     75     // ACCOUNT_CREATE_BACK works as we would like, i.e. get to login page.
     76     VLOG(1) << "HTMLPageScreen::LoadingStateChanged: " << url;
     77     CloseScreen(ScreenObserver::ACCOUNT_CREATE_BACK);
     78   }
     79 }
     80 
     81 void HTMLPageScreen::NavigationStateChanged(const TabContents* source,
     82                                             unsigned changed_flags) {
     83 }
     84 
     85 void HTMLPageScreen::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {
     86   views::Widget* widget = view()->GetWidget();
     87   if (widget && event.os_event && !event.skip_in_browser) {
     88     views::KeyEvent views_event(reinterpret_cast<GdkEvent*>(event.os_event));
     89     static_cast<views::WidgetGtk*>(widget)->HandleKeyboardEvent(views_event);
     90   }
     91 }
     92 
     93 ///////////////////////////////////////////////////////////////////////////////
     94 // HTMLPageScreen, WebPageDelegate implementation:
     95 void HTMLPageScreen::OnPageLoaded() {
     96   StopTimeoutTimer();
     97   // Enable input methods (e.g. Chinese, Japanese) so that users could input
     98   // their first and last names.
     99   if (g_browser_process) {
    100     const std::string locale = g_browser_process->GetApplicationLocale();
    101     input_method::EnableInputMethods(
    102         locale, input_method::kAllInputMethods, "");
    103   }
    104   view()->ShowPageContent();
    105 }
    106 
    107 void HTMLPageScreen::OnPageLoadFailed(const std::string& url) {
    108   VLOG(1) << "HTMLPageScreen::OnPageLoadFailed: " << url;
    109   CloseScreen(ScreenObserver::CONNECTION_FAILED);
    110 }
    111 
    112 ///////////////////////////////////////////////////////////////////////////////
    113 // HTMLPageScreen, WebPageScreen implementation:
    114 void HTMLPageScreen::OnNetworkTimeout() {
    115   VLOG(1) << "HTMLPageScreen::OnNetworkTimeout";
    116   // Just show what we have now. We shouldn't exit from the screen on timeout.
    117   OnPageLoaded();
    118 }
    119 
    120 ///////////////////////////////////////////////////////////////////////////////
    121 // HTMLPageScreen, private:
    122 void HTMLPageScreen::CloseScreen(ScreenObserver::ExitCodes code) {
    123   StopTimeoutTimer();
    124   // Disable input methods since they are not necessary to input username and
    125   // password.
    126   if (g_browser_process) {
    127     const std::string locale = g_browser_process->GetApplicationLocale();
    128     input_method::EnableInputMethods(
    129         locale, input_method::kKeyboardLayoutsOnly, "");
    130   }
    131   delegate()->GetObserver(this)->OnExit(code);
    132 }
    133 
    134 }  // namespace chromeos
    135