• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
CreateTabContents(Profile * profile,SiteInstance * instance)26 TabContents* HTMLPageDomView::CreateTabContents(Profile* profile,
27                                                 SiteInstance* instance) {
28   return new WizardWebPageViewTabContents(profile,
29                                           instance,
30                                           page_delegate_);
31 }
32 
33 ///////////////////////////////////////////////////////////////////////////////
34 // HTMLPageView
HTMLPageView()35 HTMLPageView::HTMLPageView()
36     : dom_view_(new HTMLPageDomView()) {
37 }
38 
39 ///////////////////////////////////////////////////////////////////////////////
40 // HTMLPageScreen, public:
HTMLPageScreen(WizardScreenDelegate * delegate,const std::string & url)41 HTMLPageScreen::HTMLPageScreen(WizardScreenDelegate* delegate,
42                                const std::string& url)
43     : ViewScreen<HTMLPageView>(delegate), url_(url) {
44 }
45 
46 ///////////////////////////////////////////////////////////////////////////////
47 // HTMLPageScreen, ViewScreen implementation:
CreateView()48 void HTMLPageScreen::CreateView() {
49   ViewScreen<HTMLPageView>::CreateView();
50   view()->SetWebPageDelegate(this);
51 }
52 
Refresh()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 
AllocateView()64 HTMLPageView* HTMLPageScreen::AllocateView() {
65   return new HTMLPageView();
66 }
67 
68 ///////////////////////////////////////////////////////////////////////////////
69 // HTMLPageScreen, TabContentsDelegate implementation:
LoadingStateChanged(TabContents * source)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 
NavigationStateChanged(const TabContents * source,unsigned changed_flags)81 void HTMLPageScreen::NavigationStateChanged(const TabContents* source,
82                                             unsigned changed_flags) {
83 }
84 
HandleKeyboardEvent(const NativeWebKeyboardEvent & event)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:
OnPageLoaded()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 
OnPageLoadFailed(const std::string & url)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:
OnNetworkTimeout()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:
CloseScreen(ScreenObserver::ExitCodes code)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