Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(590)

Side by Side Diff: chrome/browser/ui/webui/about_ui.cc

Issue 13820014: Show online policy on CrOS EULA page (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Modify chrome://terms to show online content Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/webui/about_ui.h" 5 #include "chrome/browser/ui/webui/about_ui.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 #include "content/public/common/content_client.h" 48 #include "content/public/common/content_client.h"
49 #include "content/public/common/process_type.h" 49 #include "content/public/common/process_type.h"
50 #include "google_apis/gaia/google_service_auth_error.h" 50 #include "google_apis/gaia/google_service_auth_error.h"
51 #include "googleurl/src/gurl.h" 51 #include "googleurl/src/gurl.h"
52 #include "grit/browser_resources.h" 52 #include "grit/browser_resources.h"
53 #include "grit/chromium_strings.h" 53 #include "grit/chromium_strings.h"
54 #include "grit/generated_resources.h" 54 #include "grit/generated_resources.h"
55 #include "grit/locale_settings.h" 55 #include "grit/locale_settings.h"
56 #include "net/base/escape.h" 56 #include "net/base/escape.h"
57 #include "net/base/net_util.h" 57 #include "net/base/net_util.h"
58 #include "net/http/http_response_headers.h"
59 #include "net/url_request/url_fetcher.h"
60 #include "net/url_request/url_request_status.h"
58 #include "ui/base/l10n/l10n_util.h" 61 #include "ui/base/l10n/l10n_util.h"
59 #include "ui/base/resource/resource_bundle.h" 62 #include "ui/base/resource/resource_bundle.h"
60 #include "ui/webui/jstemplate_builder.h" 63 #include "ui/webui/jstemplate_builder.h"
61 #include "ui/webui/web_ui_util.h" 64 #include "ui/webui/web_ui_util.h"
62 65
63 #if defined(ENABLE_THEMES) 66 #if defined(ENABLE_THEMES)
64 #include "chrome/browser/ui/webui/theme_source.h" 67 #include "chrome/browser/ui/webui/theme_source.h"
65 #endif 68 #endif
66 69
67 #if defined(OS_LINUX) || defined(OS_OPENBSD) 70 #if defined(OS_LINUX) || defined(OS_OPENBSD)
(...skipping 21 matching lines...) Expand all
89 using content::BrowserThread; 92 using content::BrowserThread;
90 using content::WebContents; 93 using content::WebContents;
91 94
92 namespace { 95 namespace {
93 96
94 const char kCreditsJsPath[] = "credits.js"; 97 const char kCreditsJsPath[] = "credits.js";
95 const char kMemoryJsPath[] = "memory.js"; 98 const char kMemoryJsPath[] = "memory.js";
96 const char kMemoryCssPath[] = "about_memory.css"; 99 const char kMemoryCssPath[] = "about_memory.css";
97 const char kStatsJsPath[] = "stats.js"; 100 const char kStatsJsPath[] = "stats.js";
98 const char kStringsJsPath[] = "strings.js"; 101 const char kStringsJsPath[] = "strings.js";
102 const int kOnlineTermsTimeout = 5; // seconds
Evan Stade 2013/04/15 19:35:08 two spaces before //. Also please document what th
Nikita (slow) 2013/04/16 04:36:35 nit: You could just rename it to kOnlineTermsTimeo
vasilii 2013/04/16 15:40:18 Done.
99 103
100 // When you type about:memory, it actually loads this intermediate URL that 104 // When you type about:memory, it actually loads this intermediate URL that
101 // redirects you to the final page. This avoids the problem where typing 105 // redirects you to the final page. This avoids the problem where typing
102 // "about:memory" on the new tab page or any other page where a process 106 // "about:memory" on the new tab page or any other page where a process
103 // transition would occur to the about URL will cause some confusion. 107 // transition would occur to the about URL will cause some confusion.
104 // 108 //
105 // The problem is that during the processing of the memory page, there are two 109 // The problem is that during the processing of the memory page, there are two
106 // processes active, the original and the destination one. This can create the 110 // processes active, the original and the destination one. This can create the
107 // impression that we're using more resources than we actually are. This 111 // impression that we're using more resources than we actually are. This
108 // redirect solves the problem by eliminating the process transition during the 112 // redirect solves the problem by eliminating the process transition during the
(...skipping 21 matching lines...) Expand all
130 void BindProcessMetrics(DictionaryValue* data, 134 void BindProcessMetrics(DictionaryValue* data,
131 ProcessMemoryInformation* info); 135 ProcessMemoryInformation* info);
132 void AppendProcess(ListValue* child_data, ProcessMemoryInformation* info); 136 void AppendProcess(ListValue* child_data, ProcessMemoryInformation* info);
133 137
134 content::URLDataSource::GotDataCallback callback_; 138 content::URLDataSource::GotDataCallback callback_;
135 139
136 DISALLOW_COPY_AND_ASSIGN(AboutMemoryHandler); 140 DISALLOW_COPY_AND_ASSIGN(AboutMemoryHandler);
137 }; 141 };
138 142
139 #if defined(OS_CHROMEOS) 143 #if defined(OS_CHROMEOS)
144 // Helper class that fetches the online Chrome OS terms.
145 class ChromeOSOnlineTermsHandler : public net::URLFetcherDelegate {
146 public:
147 typedef base::Callback<void (ChromeOSOnlineTermsHandler*)> FetchCallback;
148
149 explicit ChromeOSOnlineTermsHandler(const FetchCallback& callback):
150 fetch_callback_(callback) {
battre 2013/04/16 08:34:22 nit: : in next line, +2 indentation
vasilii 2013/04/16 15:40:18 Done.
151 // TODO(vasilii): request a real EULA specific to locale.
Nikita (slow) 2013/04/16 04:36:35 Is this part of the upcoming CL? I think this shou
vasilii 2013/04/16 15:40:18 Added localization support. But URL is still fake
152 eula_fetcher_.reset(net::URLFetcher::Create(
153 GURL("https://www.google.com/intl/en/chrome/browser/"
154 "privacy/eula_text.html"), net::URLFetcher::GET, this));
battre 2013/04/16 08:34:22 This should be an i18n-ized URL
vasilii 2013/04/16 15:40:18 Done.
155 eula_fetcher_->SetRequestContext(
156 g_browser_process->system_request_context());
157 eula_fetcher_->AddExtraRequestHeader("Accept: text/html");
158 eula_fetcher_->Start();
159 // Abort the download attempt if it takes longer than one minute.
Nikita (slow) 2013/04/16 04:36:35 What would be UX during this time? Is there some f
vasilii 2013/04/16 15:40:18 Changed timeout to 10 sec. Added "Loading" message
160 download_timer_.Start(FROM_HERE,
161 base::TimeDelta::FromSeconds(kOnlineTermsTimeout),
162 this,
battre 2013/04/16 08:34:22 what's the lifetime of |this|? Is it guaranteed to
vasilii 2013/04/16 15:40:18 Object destroys itself in either OnURLFetchComplet
163 &ChromeOSOnlineTermsHandler::OnDownloadTimeout);
164 }
165
166 void GetResponseResult(std::string* response_string) {
167 std::string mime_type;
168 if (!eula_fetcher_ ||
169 !eula_fetcher_->GetStatus().is_success() ||
170 !eula_fetcher_->GetResponseHeaders()->GetMimeType(&mime_type) ||
171 mime_type != "text/html" ||
172 !eula_fetcher_->GetResponseAsString(response_string)) {
173 response_string->clear();
174 }
175 }
176
177 private:
178 // This object is to be allocated on the heap only.
battre 2013/04/16 08:34:22 I don't understand this comment. I think what you
vasilii 2013/04/16 15:40:18 Done.
179 virtual ~ChromeOSOnlineTermsHandler() {}
180
181 // net::URLFetcherDelegate:
182 virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE {
183 if (source != eula_fetcher_.get()) {
184 NOTREACHED() << "Callback from foreign URL fetcher";
185 return;
186 }
187 fetch_callback_.Run(this);
188 delete this;
189 }
190
191 void OnDownloadTimeout() {
192 eula_fetcher_.reset();
193 fetch_callback_.Run(this);
194 delete this;
195 }
battre 2013/04/16 08:34:22 nit newline.
vasilii 2013/04/16 15:40:18 Done.
196 // Timer that enforces a timeout on the attempt to download the
197 // ChromeOS Terms.
198 base::OneShotTimer<ChromeOSOnlineTermsHandler> download_timer_;
battre 2013/04/16 08:34:22 nit: newline.
vasilii 2013/04/16 15:40:18 Done.
199 // |fetch_callback_| called when fetching succeeded or failed.
200 FetchCallback fetch_callback_;
battre 2013/04/16 08:34:22 nit: newline.
vasilii 2013/04/16 15:40:18 Done.
201 // Helper to fetch online eula.
202 scoped_ptr<net::URLFetcher> eula_fetcher_;
203
204 DISALLOW_COPY_AND_ASSIGN(ChromeOSOnlineTermsHandler);
205 };
206
140 class ChromeOSTermsHandler 207 class ChromeOSTermsHandler
141 : public base::RefCountedThreadSafe<ChromeOSTermsHandler> { 208 : public base::RefCountedThreadSafe<ChromeOSTermsHandler> {
142 public: 209 public:
143 static void Start(const std::string& path, 210 static void Start(const std::string& path,
144 const content::URLDataSource::GotDataCallback& callback) { 211 const content::URLDataSource::GotDataCallback& callback) {
145 scoped_refptr<ChromeOSTermsHandler> handler( 212 scoped_refptr<ChromeOSTermsHandler> handler(
146 new ChromeOSTermsHandler(path, callback)); 213 new ChromeOSTermsHandler(path, callback));
147 handler->StartOnUIThread(); 214 handler->StartOnUIThread();
148 } 215 }
149 216
150 private: 217 private:
151 friend class base::RefCountedThreadSafe<ChromeOSTermsHandler>; 218 friend class base::RefCountedThreadSafe<ChromeOSTermsHandler>;
152 219
153 ChromeOSTermsHandler(const std::string& path, 220 ChromeOSTermsHandler(const std::string& path,
154 const content::URLDataSource::GotDataCallback& callback) 221 const content::URLDataSource::GotDataCallback& callback)
155 : path_(path), 222 : path_(path),
156 callback_(callback), 223 callback_(callback),
157 // Previously we were using "initial locale" http://crbug.com/145142 224 // Previously we were using "initial locale" http://crbug.com/145142
158 locale_(g_browser_process->GetApplicationLocale()) { 225 locale_(g_browser_process->GetApplicationLocale()) {
159 } 226 }
160 227
161 ~ChromeOSTermsHandler() {} 228 virtual ~ChromeOSTermsHandler() {}
162 229
163 void StartOnUIThread() { 230 void StartOnUIThread() {
164 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 231 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
165 BrowserThread::PostTask( 232 if (path_ == chrome::kOemEulaURLPath) {
166 BrowserThread::FILE, FROM_HERE, 233 // Load local OEM EULA from the disk.
167 base::Bind(&ChromeOSTermsHandler::LoadFileOnFileThread, this)); 234 BrowserThread::PostTask(
235 BrowserThread::FILE, FROM_HERE,
236 base::Bind(&ChromeOSTermsHandler::LoadOemEulaFileOnFileThread, this));
237 } else {
238 // Try to load online version of ChromeOS terms first.
239 // ChromeOSOnlineTermsHandler object destroys itself.
240 new ChromeOSOnlineTermsHandler(
241 base::Bind(&ChromeOSTermsHandler::OnOnlineEULAFetched, this));
battre 2013/04/16 08:34:22 Is it guaranteed that |this| survives the callback
vasilii 2013/04/16 15:40:18 ChromeOSTermsHandler is ref-counted class. base::B
242 }
168 } 243 }
169 244
170 void LoadFileOnFileThread() { 245 void OnOnlineEULAFetched(ChromeOSOnlineTermsHandler* loader) {
246 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
247 loader->GetResponseResult(&contents_);
248 if (contents_.empty()) {
249 // Load local ChromeOS terms from the file.
250 BrowserThread::PostTask(
251 BrowserThread::FILE, FROM_HERE,
252 base::Bind(&ChromeOSTermsHandler::LoadEulaFileOnFileThread, this));
253 } else {
254 ResponseOnUIThread();
255 }
256 }
257
258 void LoadOemEulaFileOnFileThread() {
171 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 259 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
172 if (path_ == chrome::kOemEulaURLPath) { 260 const chromeos::StartupCustomizationDocument* customization =
173 const chromeos::StartupCustomizationDocument* customization = 261 chromeos::StartupCustomizationDocument::GetInstance();
174 chromeos::StartupCustomizationDocument::GetInstance(); 262 if (customization->IsReady()) {
175 if (customization->IsReady()) { 263 base::FilePath oem_eula_file_path;
176 base::FilePath oem_eula_file_path; 264 if (net::FileURLToFilePath(GURL(customization->GetEULAPage(locale_)),
177 if (net::FileURLToFilePath(GURL(customization->GetEULAPage(locale_)), 265 &oem_eula_file_path)) {
178 &oem_eula_file_path)) { 266 if (!file_util::ReadFileToString(oem_eula_file_path, &contents_)) {
179 if (!file_util::ReadFileToString(oem_eula_file_path, &contents_)) {
180 contents_.clear();
181 }
182 }
183 }
184 } else {
185 std::string file_path =
186 base::StringPrintf(chrome::kEULAPathFormat, locale_.c_str());
187 if (!file_util::ReadFileToString(base::FilePath(file_path), &contents_)) {
188 // No EULA for given language - try en-US as default.
189 file_path = base::StringPrintf(chrome::kEULAPathFormat, "en-US");
190 if (!file_util::ReadFileToString(base::FilePath(file_path),
191 &contents_)) {
192 // File with EULA not found, ResponseOnUIThread will load EULA from
193 // resources if contents_ is empty.
194 contents_.clear(); 267 contents_.clear();
195 } 268 }
196 } 269 }
197 } 270 }
198 BrowserThread::PostTask( 271 BrowserThread::PostTask(
199 BrowserThread::UI, FROM_HERE, 272 BrowserThread::UI, FROM_HERE,
200 base::Bind(&ChromeOSTermsHandler::ResponseOnUIThread, this)); 273 base::Bind(&ChromeOSTermsHandler::ResponseOnUIThread, this));
201 } 274 }
202 275
276 void LoadEulaFileOnFileThread() {
277 std::string file_path =
278 base::StringPrintf(chrome::kEULAPathFormat, locale_.c_str());
279 if (!file_util::ReadFileToString(base::FilePath(file_path), &contents_)) {
280 // No EULA for given language - try en-US as default.
281 file_path = base::StringPrintf(chrome::kEULAPathFormat, "en-US");
282 if (!file_util::ReadFileToString(base::FilePath(file_path),
283 &contents_)) {
284 // File with EULA not found, ResponseOnUIThread will load EULA from
285 // resources if contents_ is empty.
286 contents_.clear();
287 }
288 }
289 BrowserThread::PostTask(
290 BrowserThread::UI, FROM_HERE,
291 base::Bind(&ChromeOSTermsHandler::ResponseOnUIThread, this));
292 }
293
203 void ResponseOnUIThread() { 294 void ResponseOnUIThread() {
204 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 295 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
205 // If we fail to load Chrome OS EULA from disk, load it from resources. 296 // If we fail to load Chrome OS EULA from disk, load it from resources.
206 // Do nothing if OEM EULA load failed. 297 // Do nothing if OEM EULA load failed.
207 if (contents_.empty() && path_ != chrome::kOemEulaURLPath) 298 if (contents_.empty() && path_ != chrome::kOemEulaURLPath)
208 contents_ = l10n_util::GetStringUTF8(IDS_TERMS_HTML); 299 contents_ = l10n_util::GetStringUTF8(IDS_TERMS_HTML);
209 callback_.Run(base::RefCountedString::TakeString(&contents_)); 300 callback_.Run(base::RefCountedString::TakeString(&contents_));
210 } 301 }
211 302
212 // Path in the URL. 303 // Path in the URL.
213 std::string path_; 304 const std::string path_;
214 305
215 // Callback to run with the response. 306 // Callback to run with the response.
216 content::URLDataSource::GotDataCallback callback_; 307 content::URLDataSource::GotDataCallback callback_;
217 308
218 // Locale of the EULA. 309 // Locale of the EULA.
219 std::string locale_; 310 const std::string locale_;
220 311
221 // EULA contents that was loaded from file. 312 // EULA contents that was loaded from file.
222 std::string contents_; 313 std::string contents_;
223 314
224 DISALLOW_COPY_AND_ASSIGN(ChromeOSTermsHandler); 315 DISALLOW_COPY_AND_ASSIGN(ChromeOSTermsHandler);
225 }; 316 };
226 317
227 #endif 318 #endif
228 319
229 } // namespace 320 } // namespace
(...skipping 837 matching lines...) Expand 10 before | Expand all | Expand 10 after
1067 Profile* profile = Profile::FromWebUI(web_ui); 1158 Profile* profile = Profile::FromWebUI(web_ui);
1068 1159
1069 #if defined(ENABLE_THEMES) 1160 #if defined(ENABLE_THEMES)
1070 // Set up the chrome://theme/ source. 1161 // Set up the chrome://theme/ source.
1071 ThemeSource* theme = new ThemeSource(profile); 1162 ThemeSource* theme = new ThemeSource(profile);
1072 content::URLDataSource::Add(profile, theme); 1163 content::URLDataSource::Add(profile, theme);
1073 #endif 1164 #endif
1074 1165
1075 content::URLDataSource::Add(profile, new AboutUIHTMLSource(name, profile)); 1166 content::URLDataSource::Add(profile, new AboutUIHTMLSource(name, profile));
1076 } 1167 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698