summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos
diff options
context:
space:
mode:
authordpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-20 09:48:46 +0000
committerdpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-20 09:48:46 +0000
commit0ae17ad4082508778906579c453a2e749940b83b (patch)
treec472413a67cb09c35ef6e95bbbc888bfbfa79f40 /chrome/browser/chromeos
parentf7624e3a0dbe0a0c777075670dfff129ac44ea31 (diff)
downloadchromium_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.cc123
-rw-r--r--chrome/browser/chromeos/login/html_page_screen.h82
-rw-r--r--chrome/browser/chromeos/login/wizard_controller.cc28
-rw-r--r--chrome/browser/chromeos/login/wizard_controller.h5
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_;