terms_of_service_screen.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
1// Copyright (c) 2013 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/screens/terms_of_service_screen.h" 6 7#include <string> 8 9#include "base/location.h" 10#include "base/logging.h" 11#include "base/prefs/pref_service.h" 12#include "base/time.h" 13#include "chrome/browser/browser_process.h" 14#include "chrome/browser/chromeos/login/screens/screen_observer.h" 15#include "chrome/browser/chromeos/login/wizard_controller.h" 16#include "chrome/browser/policy/browser_policy_connector.h" 17#include "chrome/browser/profiles/profile.h" 18#include "chrome/browser/profiles/profile_manager.h" 19#include "chrome/common/pref_names.h" 20#include "googleurl/src/gurl.h" 21#include "net/http/http_response_headers.h" 22#include "net/url_request/url_fetcher.h" 23#include "net/url_request/url_request_context_getter.h" 24#include "net/url_request/url_request_status.h" 25 26namespace chromeos { 27 28TermsOfServiceScreen::TermsOfServiceScreen(ScreenObserver* screen_observer, 29 TermsOfServiceScreenActor* actor) 30 : WizardScreen(screen_observer), 31 actor_(actor) { 32 DCHECK(actor_); 33 if (actor_) 34 actor_->SetDelegate(this); 35} 36 37TermsOfServiceScreen::~TermsOfServiceScreen() { 38 if (actor_) 39 actor_->SetDelegate(NULL); 40} 41 42void TermsOfServiceScreen::PrepareToShow() { 43} 44 45void TermsOfServiceScreen::Show() { 46 if (!actor_) 47 return; 48 49 // Set the domain name whose Terms of Service are being shown. 50 actor_->SetDomain( 51 g_browser_process->browser_policy_connector()->GetEnterpriseDomain()); 52 53 // Show the screen. 54 actor_->Show(); 55 56 // Start downloading the Terms of Service. 57 StartDownload(); 58} 59 60void TermsOfServiceScreen::Hide() { 61 if (actor_) 62 actor_->Hide(); 63} 64 65std::string TermsOfServiceScreen::GetName() const { 66 return WizardController::kTermsOfServiceScreenName; 67} 68 69void TermsOfServiceScreen::OnDecline() { 70 get_screen_observer()->OnExit(ScreenObserver::TERMS_OF_SERVICE_DECLINED); 71} 72 73void TermsOfServiceScreen::OnAccept() { 74 get_screen_observer()->OnExit(ScreenObserver::TERMS_OF_SERVICE_ACCEPTED); 75} 76 77void TermsOfServiceScreen::OnActorDestroyed(TermsOfServiceScreenActor* actor) { 78 if (actor_ == actor) 79 actor_ = NULL; 80} 81 82void TermsOfServiceScreen::StartDownload() { 83 const PrefService* prefs = ProfileManager::GetDefaultProfile()->GetPrefs(); 84 // If an URL from which the Terms of Service can be downloaded has not been 85 // set, show an error message to the user. 86 std::string terms_of_service_url = 87 prefs->GetString(prefs::kTermsOfServiceURL); 88 if (terms_of_service_url.empty()) { 89 if (actor_) 90 actor_->OnLoadError(); 91 return; 92 } 93 94 // Start downloading the Terms of Service. 95 terms_of_service_fetcher_.reset(net::URLFetcher::Create( 96 GURL(terms_of_service_url), net::URLFetcher::GET, this)); 97 terms_of_service_fetcher_->SetRequestContext( 98 g_browser_process->system_request_context()); 99 // Request a text/plain MIME type as only plain-text Terms of Service are 100 // accepted. 101 terms_of_service_fetcher_->AddExtraRequestHeader("Accept: text/plain"); 102 // Retry up to three times if network changes are detected during the 103 // download. 104 terms_of_service_fetcher_->SetAutomaticallyRetryOnNetworkChanges(3); 105 terms_of_service_fetcher_->Start(); 106 107 // Abort the download attempt if it takes longer than one minute. 108 download_timer_.Start(FROM_HERE, base::TimeDelta::FromMinutes(1), 109 this, &TermsOfServiceScreen::OnDownloadTimeout); 110} 111 112void TermsOfServiceScreen::OnDownloadTimeout() { 113 // Abort the download attempt. 114 terms_of_service_fetcher_.reset(); 115 116 // Show an error message to the user. 117 if (actor_) 118 actor_->OnLoadError(); 119} 120 121void TermsOfServiceScreen::OnURLFetchComplete(const net::URLFetcher* source) { 122 if (source != terms_of_service_fetcher_.get()) { 123 NOTREACHED() << "Callback from foreign URL fetcher"; 124 return; 125 } 126 127 download_timer_.Stop(); 128 129 // Destroy the fetcher when this method returns. 130 scoped_ptr<net::URLFetcher> fetcher(terms_of_service_fetcher_.Pass()); 131 if (!actor_) 132 return; 133 134 std::string terms_of_service; 135 std::string mime_type; 136 // If the Terms of Service could not be downloaded, do not have a MIME type of 137 // text/plain or are empty, show an error message to the user. 138 if (!source->GetStatus().is_success() || 139 !source->GetResponseHeaders()->GetMimeType(&mime_type) || 140 mime_type != "text/plain" || 141 !source->GetResponseAsString(&terms_of_service)) { 142 actor_->OnLoadError(); 143 } else { 144 // If the Terms of Service were downloaded successfully, show them to the 145 // user. 146 actor_->OnLoadSuccess(terms_of_service); 147 } 148} 149 150} // namespace chromeos 151