1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/registration_screen.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/input_method/input_method_util.h"
1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile_manager.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/child_process_security_policy.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/site_instance.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request_about_job.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request_filter.h"
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "views/widget/widget_gtk.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kRegistrationHostPageUrl[] = "chrome://register/";
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "Hostname" that is used for redirects from host registration page.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kRegistrationHostnameUrl[] = "register";
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Host page navigates to these URLs in case of success/skipped registration.
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kRegistrationSuccessUrl[] = "cros://register/success";
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kRegistrationSkippedUrl[] = "cros://register/skipped";
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RegistrationScreen, public:
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochRegistrationScreen::RegistrationScreen(WizardScreenDelegate* delegate)
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : ViewScreen<RegistrationView>(delegate) {
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!host_page_url_.get())
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    set_registration_host_page_url(GURL(kRegistrationHostPageUrl));
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ChildProcessSecurityPolicy::GetInstance()->RegisterWebSafeScheme(
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      chrome::kCrosScheme);
463f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  net::URLRequestFilter::GetInstance()->AddHostnameHandler(
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      chrome::kCrosScheme,
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      kRegistrationHostnameUrl,
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      &RegistrationScreen::Factory);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RegistrationScreen::set_registration_host_page_url(const GURL& url) {
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  host_page_url_.reset(new GURL(url));
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochscoped_ptr<GURL> RegistrationScreen::host_page_url_;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RegistrationScreen, ViewScreen implementation:
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RegistrationScreen::CreateView() {
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ViewScreen<RegistrationView>::CreateView();
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view()->SetWebPageDelegate(this);
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RegistrationScreen::Refresh() {
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StartTimeoutTimer();
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url(*host_page_url_);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile = ProfileManager::GetDefaultProfile();
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view()->InitDOM(profile,
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  SiteInstance::CreateSiteInstanceForURL(profile, url));
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view()->SetTabContentsDelegate(this);
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view()->LoadURL(url);
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochRegistrationView* RegistrationScreen::AllocateView() {
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new RegistrationView();
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RegistrationScreen, WebPageDelegate implementation:
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RegistrationScreen::OnPageLoaded() {
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StopTimeoutTimer();
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enable input methods (e.g. Chinese, Japanese) so that users could input
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // their first and last names.
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (g_browser_process) {
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string locale = g_browser_process->GetApplicationLocale();
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    input_method::EnableInputMethods(
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        locale, input_method::kAllInputMethods, "");
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view()->ShowPageContent();
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RegistrationScreen::OnPageLoadFailed(const std::string& url) {
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  LOG(ERROR) << "Error loading registration page: " << url;
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CloseScreen(ScreenObserver::REGISTRATION_SKIPPED);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RegistrationScreen, TabContentsDelegate implementation:
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RegistrationScreen::OpenURLFromTab(TabContents* source,
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         const GURL& url,
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         const GURL& referrer,
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         WindowOpenDisposition disposition,
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         PageTransition::Type transition) {
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (url.spec() == kRegistrationSuccessUrl) {
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    source->Stop();
109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    VLOG(1) << "Registration form completed.";
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CloseScreen(ScreenObserver::REGISTRATION_SUCCESS);
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (url.spec() == kRegistrationSkippedUrl) {
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    source->Stop();
113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    VLOG(1) << "Registration form skipped.";
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CloseScreen(ScreenObserver::REGISTRATION_SKIPPED);
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    source->Stop();
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Host registration page and actual registration page hosted by
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // OEM partner doesn't contain links to external URLs.
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LOG(WARNING) << "Navigate to unsupported url: " << url.spec();
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid RegistrationScreen::HandleKeyboardEvent(
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const NativeWebKeyboardEvent& event) {
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::Widget* widget = view()->GetWidget();
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (widget && event.os_event && !event.skip_in_browser) {
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    views::KeyEvent views_event(reinterpret_cast<GdkEvent*>(event.os_event));
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    static_cast<views::WidgetGtk*>(widget)->HandleKeyboardEvent(views_event);
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch///////////////////////////////////////////////////////////////////////////////
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RegistrationScreen, private:
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RegistrationScreen::CloseScreen(ScreenObserver::ExitCodes code) {
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StopTimeoutTimer();
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Disable input methods since they are not necessary to input username and
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // password.
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (g_browser_process) {
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string locale = g_browser_process->GetApplicationLocale();
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    input_method::EnableInputMethods(
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        locale, input_method::kKeyboardLayoutsOnly, "");
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate()->GetObserver(this)->OnExit(code);
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
14721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsennet::URLRequestJob* RegistrationScreen::Factory(net::URLRequest* request,
14821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                                const std::string& scheme) {
149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  VLOG(1) << "Handling url: " << request->url().spec().c_str();
15021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return new net::URLRequestAboutJob(request);
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
154