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