diff options
author | dpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-20 09:48:46 +0000 |
---|---|---|
committer | dpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-20 09:48:46 +0000 |
commit | 0ae17ad4082508778906579c453a2e749940b83b (patch) | |
tree | c472413a67cb09c35ef6e95bbbc888bfbfa79f40 /chrome/browser/chromeos | |
parent | f7624e3a0dbe0a0c777075670dfff129ac44ea31 (diff) | |
download | chromium_src-0ae17ad4082508778906579c453a2e749940b83b.zip chromium_src-0ae17ad4082508778906579c453a2e749940b83b.tar.gz chromium_src-0ae17ad4082508778906579c453a2e749940b83b.tar.bz2 |
OOBE screen with HTML page specified from command line it is going to be used for recovery screen.
BUG=chromium-os:5877
TEST=Run Chrome with --login-manager --login-screen=html file://filename
Review URL: http://codereview.chromium.org/3158023
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@56836 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/chromeos')
-rw-r--r-- | chrome/browser/chromeos/login/html_page_screen.cc | 123 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/html_page_screen.h | 82 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/wizard_controller.cc | 28 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/wizard_controller.h | 5 |
4 files changed, 238 insertions, 0 deletions
diff --git a/chrome/browser/chromeos/login/html_page_screen.cc b/chrome/browser/chromeos/login/html_page_screen.cc new file mode 100644 index 0000000..17bcaf0 --- /dev/null +++ b/chrome/browser/chromeos/login/html_page_screen.cc @@ -0,0 +1,123 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/login/html_page_screen.h" + +#include "base/string_util.h" +#include "base/utf_string_conversions.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/chromeos/input_method/input_method_util.h" +#include "chrome/browser/chromeos/login/screen_observer.h" +#include "chrome/browser/profile_manager.h" +#include "chrome/browser/renderer_host/render_view_host.h" +#include "chrome/browser/renderer_host/site_instance.h" +#include "chrome/browser/tab_contents/tab_contents.h" +#include "googleurl/src/gurl.h" +#include "views/widget/widget_gtk.h" + +namespace chromeos { + +static const char kHTMLPageDoneUrl[] = "about:blank"; + +/////////////////////////////////////////////////////////////////////////////// +// HTMLPageDomView +TabContents* HTMLPageDomView::CreateTabContents(Profile* profile, + SiteInstance* instance) { + return new WizardWebPageViewTabContents(profile, + instance, + page_delegate_); +} + +/////////////////////////////////////////////////////////////////////////////// +// HTMLPageView +HTMLPageView::HTMLPageView() + : dom_view_(new HTMLPageDomView()) { +} + +/////////////////////////////////////////////////////////////////////////////// +// HTMLPageScreen, public: +HTMLPageScreen::HTMLPageScreen(WizardScreenDelegate* delegate, + const std::string& url) + : ViewScreen<HTMLPageView>(delegate), url_(url) { +} + +/////////////////////////////////////////////////////////////////////////////// +// HTMLPageScreen, ViewScreen implementation: +void HTMLPageScreen::CreateView() { + ViewScreen<HTMLPageView>::CreateView(); + view()->SetWebPageDelegate(this); +} + +void HTMLPageScreen::Refresh() { + LOG(INFO) << "HTMLPageScreen::Refresh(): " << url_; + StartTimeoutTimer(); + GURL url(url_); + Profile* profile = ProfileManager::GetDefaultProfile(); + view()->InitDOM(profile, + SiteInstance::CreateSiteInstanceForURL(profile, url)); + view()->SetTabContentsDelegate(this); + view()->LoadURL(url); +} + +HTMLPageView* HTMLPageScreen::AllocateView() { + return new HTMLPageView(); +} + +/////////////////////////////////////////////////////////////////////////////// +// HTMLPageScreen, TabContentsDelegate implementation: +void HTMLPageScreen::LoadingStateChanged(TabContents* source) { + std::string url = source->GetURL().spec(); + if (url == kHTMLPageDoneUrl) { + source->Stop(); + // TODO(dpolukhin): use special code for this case but now + // ACCOUNT_CREATE_BACK works as we would like, i.e. get to login page. + LOG(INFO) << "HTMLPageScreen::LoadingStateChanged: " << url; + CloseScreen(ScreenObserver::ACCOUNT_CREATE_BACK); + } +} + +void HTMLPageScreen::NavigationStateChanged(const TabContents* source, + unsigned changed_flags) { +} + +void HTMLPageScreen::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) { + views::Widget* widget = view()->GetWidget(); + if (widget && event.os_event && !event.skip_in_browser) + static_cast<views::WidgetGtk*>(widget)->HandleKeyboardEvent(event.os_event); +} + +/////////////////////////////////////////////////////////////////////////////// +// HTMLPageScreen, WebPageDelegate implementation: +void HTMLPageScreen::OnPageLoaded() { + StopTimeoutTimer(); + // Enable input methods (e.g. Chinese, Japanese) so that users could input + // their first and last names. + if (g_browser_process) { + const std::string locale = g_browser_process->GetApplicationLocale(); + input_method::EnableInputMethods( + locale, input_method::kAllInputMethods, ""); + } + view()->ShowPageContent(); +} + +void HTMLPageScreen::OnPageLoadFailed(const std::string& url) { + LOG(INFO) << "HTMLPageScreen::OnPageLoadFailed: " << url; + CloseScreen(ScreenObserver::CONNECTION_FAILED); +} + +/////////////////////////////////////////////////////////////////////////////// +// HTMLPageScreen, private: +void HTMLPageScreen::CloseScreen(ScreenObserver::ExitCodes code) { + StopTimeoutTimer(); + // Disable input methods since they are not necessary to input username and + // password. + if (g_browser_process) { + const std::string locale = g_browser_process->GetApplicationLocale(); + input_method::EnableInputMethods( + locale, input_method::kKeyboardLayoutsOnly, ""); + } + delegate()->GetObserver(this)->OnExit(code); +} + +} // namespace chromeos diff --git a/chrome/browser/chromeos/login/html_page_screen.h b/chrome/browser/chromeos/login/html_page_screen.h new file mode 100644 index 0000000..164faee --- /dev/null +++ b/chrome/browser/chromeos/login/html_page_screen.h @@ -0,0 +1,82 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_HTML_PAGE_SCREEN_H_ +#define CHROME_BROWSER_CHROMEOS_LOGIN_HTML_PAGE_SCREEN_H_ +#pragma once + +#include <string> + +#include "base/scoped_ptr.h" +#include "chrome/browser/chromeos/login/screen_observer.h" +#include "chrome/browser/chromeos/login/view_screen.h" +#include "chrome/browser/chromeos/login/web_page_screen.h" +#include "chrome/browser/chromeos/login/web_page_view.h" + +class WizardScreenDelegate; + +namespace chromeos { + +class HTMLPageDomView : public WebPageDomView { + public: + HTMLPageDomView() {} + + protected: + // Overriden from DOMView: + virtual TabContents* CreateTabContents(Profile* profile, + SiteInstance* instance); + + private: + DISALLOW_COPY_AND_ASSIGN(HTMLPageDomView); +}; + +class HTMLPageView : public WebPageView { + public: + HTMLPageView(); + + protected: + virtual WebPageDomView* dom_view() { return dom_view_; } + + private: + // View that renders page. + HTMLPageDomView* dom_view_; + + DISALLOW_COPY_AND_ASSIGN(HTMLPageView); +}; + +// HTMLPageScreen is used to show arbitrary HTML page. It is used to show +// simple screens like recover. +class HTMLPageScreen : public ViewScreen<HTMLPageView>, + public WebPageScreen, + public WebPageDelegate { + public: + HTMLPageScreen(WizardScreenDelegate* delegate, const std::string& url); + + // WebPageDelegate implementation: + virtual void OnPageLoaded(); + virtual void OnPageLoadFailed(const std::string& url); + + private: + // ViewScreen implementation: + virtual void CreateView(); + virtual void Refresh(); + virtual HTMLPageView* AllocateView(); + + virtual void LoadingStateChanged(TabContents* source); + virtual void NavigationStateChanged(const TabContents* source, + unsigned changed_flags); + virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event); + + // WebPageScreen implementation: + virtual void CloseScreen(ScreenObserver::ExitCodes code); + + // URL to navigate. + std::string url_; + + DISALLOW_COPY_AND_ASSIGN(HTMLPageScreen); +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_LOGIN_HTML_PAGE_SCREEN_H_ diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc index 08ef6d0..5f1672c 100644 --- a/chrome/browser/chromeos/login/wizard_controller.cc +++ b/chrome/browser/chromeos/login/wizard_controller.cc @@ -28,6 +28,7 @@ #include "chrome/browser/chromeos/login/eula_view.h" #include "chrome/browser/chromeos/login/existing_user_controller.h" #include "chrome/browser/chromeos/login/helper.h" +#include "chrome/browser/chromeos/login/html_page_screen.h" #include "chrome/browser/chromeos/login/language_switch_menu.h" #include "chrome/browser/chromeos/login/login_screen.h" #include "chrome/browser/chromeos/login/login_utils.h" @@ -210,6 +211,7 @@ const char WizardController::kUpdateScreenName[] = "update"; const char WizardController::kUserImageScreenName[] = "image"; const char WizardController::kEulaScreenName[] = "eula"; const char WizardController::kRegistrationScreenName[] = "register"; +const char WizardController::kHTMLPageScreenName[] = "html"; // Passing this parameter as a "first screen" initiates full OOBE flow. const char WizardController::kOutOfBoxScreenName[] = "oobe"; @@ -365,6 +367,23 @@ chromeos::RegistrationScreen* WizardController::GetRegistrationScreen() { return registration_screen_.get(); } +chromeos::HTMLPageScreen* WizardController::GetHTMLPageScreen() { + if (!html_page_screen_.get()) { + CommandLine* command_line = CommandLine::ForCurrentProcess(); + std::string url; + // It's strange but args may contains empty strings. + for (size_t i = 0; i < command_line->args().size(); i++) { + if (!command_line->args()[i].empty()) { + DCHECK(url.empty()) << "More than one URL in command line"; + url = command_line->args()[i]; + } + } + DCHECK(!url.empty()) << "No URL in commane line"; + html_page_screen_.reset(new chromeos::HTMLPageScreen(this, url)); + } + return html_page_screen_.get(); +} + void WizardController::ShowNetworkScreen() { SetStatusAreaVisible(false); SetCurrentScreen(GetNetworkScreen()); @@ -443,6 +462,13 @@ void WizardController::ShowRegistrationScreen() { #endif } +void WizardController::ShowHTMLPageScreen() { + LOG(INFO) << "Showing HTML page screen."; + SetStatusAreaVisible(true); + background_view_->SetOobeProgressBarVisible(false); + SetCurrentScreen(GetHTMLPageScreen()); +} + void WizardController::SetStatusAreaVisible(bool visible) { // When ExistingUserController passes background ownership // to WizardController it happens after screen is shown. @@ -640,6 +666,8 @@ void WizardController::ShowFirstScreen(const std::string& first_screen_name) { // Just proceed to image screen. OnRegistrationSuccess(); } + } else if (first_screen_name == kHTMLPageScreenName) { + ShowHTMLPageScreen(); } else if (first_screen_name != kTestNoScreenName) { if (is_out_of_box_) { ShowNetworkScreen(); diff --git a/chrome/browser/chromeos/login/wizard_controller.h b/chrome/browser/chromeos/login/wizard_controller.h index 63bdc71..e6750d4 100644 --- a/chrome/browser/chromeos/login/wizard_controller.h +++ b/chrome/browser/chromeos/login/wizard_controller.h @@ -24,6 +24,7 @@ class AccountScreen; class BackgroundView; class EulaScreen; class ExistingUserController; +class HTMLPageScreen; class LoginScreen; class NetworkScreen; class RegistrationScreen; @@ -87,6 +88,7 @@ class WizardController : public chromeos::ScreenObserver, chromeos::UserImageScreen* GetUserImageScreen(); chromeos::EulaScreen* GetEulaScreen(); chromeos::RegistrationScreen* GetRegistrationScreen(); + chromeos::HTMLPageScreen* GetHTMLPageScreen(); // Show specific screen. void ShowNetworkScreen(); @@ -95,6 +97,7 @@ class WizardController : public chromeos::ScreenObserver, void ShowUserImageScreen(); void ShowEulaScreen(); void ShowRegistrationScreen(); + void ShowHTMLPageScreen(); // Shows the default login screen and returns NULL or shows images login // screen and returns the corresponding controller instance for optional // tweaking. @@ -127,6 +130,7 @@ class WizardController : public chromeos::ScreenObserver, static const char kOutOfBoxScreenName[]; static const char kTestNoScreenName[]; static const char kEulaScreenName[]; + static const char kHTMLPageScreenName[]; private: // Exit handlers: @@ -194,6 +198,7 @@ class WizardController : public chromeos::ScreenObserver, scoped_ptr<chromeos::UserImageScreen> user_image_screen_; scoped_ptr<chromeos::EulaScreen> eula_screen_; scoped_ptr<chromeos::RegistrationScreen> registration_screen_; + scoped_ptr<chromeos::HTMLPageScreen> html_page_screen_; // Screen that's currently active. WizardScreen* current_screen_; |