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