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

Unified 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: Set the final URL 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/webui/about_ui.cc
diff --git a/chrome/browser/ui/webui/about_ui.cc b/chrome/browser/ui/webui/about_ui.cc
index 64bc3b4ae703a2f1be0b5d0be50f50b99b8ee4a1..ff407b297b1419a2d7f9680ace03dfe9cdbf90eb 100644
--- a/chrome/browser/ui/webui/about_ui.cc
+++ b/chrome/browser/ui/webui/about_ui.cc
@@ -55,6 +55,9 @@
#include "grit/locale_settings.h"
#include "net/base/escape.h"
#include "net/base/net_util.h"
+#include "net/http/http_response_headers.h"
+#include "net/url_request/url_fetcher.h"
+#include "net/url_request/url_request_status.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/webui/jstemplate_builder.h"
@@ -96,6 +99,8 @@ const char kMemoryJsPath[] = "memory.js";
const char kMemoryCssPath[] = "about_memory.css";
const char kStatsJsPath[] = "stats.js";
const char kStringsJsPath[] = "strings.js";
+// chrome://terms falls back to offline page after kOnlineTermsTimeoutSec.
+const int kOnlineTermsTimeoutSec = 10;
// When you type about:memory, it actually loads this intermediate URL that
// redirects you to the final page. This avoids the problem where typing
@@ -137,6 +142,75 @@ class AboutMemoryHandler : public MemoryDetails {
};
#if defined(OS_CHROMEOS)
+// Helper class that fetches the online Chrome OS terms. Empty string is
+// returned once fetching failed or exceeded |kOnlineTermsTimeoutSec|.
+class ChromeOSOnlineTermsHandler : public net::URLFetcherDelegate {
+ public:
+ typedef base::Callback<void (ChromeOSOnlineTermsHandler*)> FetchCallback;
+
+ explicit ChromeOSOnlineTermsHandler(const FetchCallback& callback)
+ : fetch_callback_(callback) {
+ eula_fetcher_.reset(net::URLFetcher::Create(
+ GURL(l10n_util::GetStringUTF16(IDS_EULA_POLICY_URL)),
+ net::URLFetcher::GET,
+ this));
+ eula_fetcher_->SetRequestContext(
+ g_browser_process->system_request_context());
+ eula_fetcher_->AddExtraRequestHeader("Accept: text/html");
battre 2013/04/22 08:13:20 Can you please add eula_fetcher_->SetLoadFlags(
+ eula_fetcher_->Start();
+ // Abort the download attempt if it takes longer than one minute.
+ download_timer_.Start(FROM_HERE,
+ base::TimeDelta::FromSeconds(kOnlineTermsTimeoutSec),
+ this,
+ &ChromeOSOnlineTermsHandler::OnDownloadTimeout);
+ }
+
+ void GetResponseResult(std::string* response_string) {
+ std::string mime_type;
+ if (!eula_fetcher_ ||
+ !eula_fetcher_->GetStatus().is_success() ||
+ eula_fetcher_->GetResponseCode() != 200 ||
+ !eula_fetcher_->GetResponseHeaders()->GetMimeType(&mime_type) ||
+ mime_type != "text/html" ||
+ !eula_fetcher_->GetResponseAsString(response_string)) {
+ response_string->clear();
+ }
+ }
+
+ private:
+ // Prevents allocation on the stack. ChromeOSOnlineTermsHandler should be
+ // created by 'operator new'. |this| takes care of destruction.
+ virtual ~ChromeOSOnlineTermsHandler() {}
+
+ // net::URLFetcherDelegate:
+ virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE {
+ if (source != eula_fetcher_.get()) {
+ NOTREACHED() << "Callback from foreign URL fetcher";
+ return;
+ }
+ fetch_callback_.Run(this);
+ delete this;
+ }
+
+ void OnDownloadTimeout() {
+ eula_fetcher_.reset();
+ fetch_callback_.Run(this);
+ delete this;
+ }
+
+ // Timer that enforces a timeout on the attempt to download the
+ // ChromeOS Terms.
+ base::OneShotTimer<ChromeOSOnlineTermsHandler> download_timer_;
+
+ // |fetch_callback_| called when fetching succeeded or failed.
+ FetchCallback fetch_callback_;
+
+ // Helper to fetch online eula.
+ scoped_ptr<net::URLFetcher> eula_fetcher_;
+
+ DISALLOW_COPY_AND_ASSIGN(ChromeOSOnlineTermsHandler);
+};
+
class ChromeOSTermsHandler
: public base::RefCountedThreadSafe<ChromeOSTermsHandler> {
public:
@@ -158,39 +232,45 @@ class ChromeOSTermsHandler
locale_(g_browser_process->GetApplicationLocale()) {
}
- ~ChromeOSTermsHandler() {}
+ virtual ~ChromeOSTermsHandler() {}
void StartOnUIThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- BrowserThread::PostTask(
- BrowserThread::FILE, FROM_HERE,
- base::Bind(&ChromeOSTermsHandler::LoadFileOnFileThread, this));
+ if (path_ == chrome::kOemEulaURLPath) {
+ // Load local OEM EULA from the disk.
+ BrowserThread::PostTask(
+ BrowserThread::FILE, FROM_HERE,
+ base::Bind(&ChromeOSTermsHandler::LoadOemEulaFileOnFileThread, this));
+ } else {
+ // Try to load online version of ChromeOS terms first.
+ // ChromeOSOnlineTermsHandler object destroys itself.
+ new ChromeOSOnlineTermsHandler(
+ base::Bind(&ChromeOSTermsHandler::OnOnlineEULAFetched, this));
+ }
}
- void LoadFileOnFileThread() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- if (path_ == chrome::kOemEulaURLPath) {
- const chromeos::StartupCustomizationDocument* customization =
- chromeos::StartupCustomizationDocument::GetInstance();
- if (customization->IsReady()) {
- base::FilePath oem_eula_file_path;
- if (net::FileURLToFilePath(GURL(customization->GetEULAPage(locale_)),
- &oem_eula_file_path)) {
- if (!file_util::ReadFileToString(oem_eula_file_path, &contents_)) {
- contents_.clear();
- }
- }
- }
+ void OnOnlineEULAFetched(ChromeOSOnlineTermsHandler* loader) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ loader->GetResponseResult(&contents_);
+ if (contents_.empty()) {
+ // Load local ChromeOS terms from the file.
+ BrowserThread::PostTask(
+ BrowserThread::FILE, FROM_HERE,
+ base::Bind(&ChromeOSTermsHandler::LoadEulaFileOnFileThread, this));
} else {
- std::string file_path =
- base::StringPrintf(chrome::kEULAPathFormat, locale_.c_str());
- if (!file_util::ReadFileToString(base::FilePath(file_path), &contents_)) {
- // No EULA for given language - try en-US as default.
- file_path = base::StringPrintf(chrome::kEULAPathFormat, "en-US");
- if (!file_util::ReadFileToString(base::FilePath(file_path),
- &contents_)) {
- // File with EULA not found, ResponseOnUIThread will load EULA from
- // resources if contents_ is empty.
+ ResponseOnUIThread();
+ }
+ }
+
+ void LoadOemEulaFileOnFileThread() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ const chromeos::StartupCustomizationDocument* customization =
+ chromeos::StartupCustomizationDocument::GetInstance();
+ if (customization->IsReady()) {
+ base::FilePath oem_eula_file_path;
+ if (net::FileURLToFilePath(GURL(customization->GetEULAPage(locale_)),
+ &oem_eula_file_path)) {
+ if (!file_util::ReadFileToString(oem_eula_file_path, &contents_)) {
contents_.clear();
}
}
@@ -200,6 +280,24 @@ class ChromeOSTermsHandler
base::Bind(&ChromeOSTermsHandler::ResponseOnUIThread, this));
}
+ void LoadEulaFileOnFileThread() {
+ std::string file_path =
+ base::StringPrintf(chrome::kEULAPathFormat, locale_.c_str());
+ if (!file_util::ReadFileToString(base::FilePath(file_path), &contents_)) {
+ // No EULA for given language - try en-US as default.
+ file_path = base::StringPrintf(chrome::kEULAPathFormat, "en-US");
+ if (!file_util::ReadFileToString(base::FilePath(file_path),
+ &contents_)) {
+ // File with EULA not found, ResponseOnUIThread will load EULA from
+ // resources if contents_ is empty.
+ contents_.clear();
+ }
+ }
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&ChromeOSTermsHandler::ResponseOnUIThread, this));
+ }
+
void ResponseOnUIThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
// If we fail to load Chrome OS EULA from disk, load it from resources.
@@ -210,13 +308,13 @@ class ChromeOSTermsHandler
}
// Path in the URL.
- std::string path_;
+ const std::string path_;
// Callback to run with the response.
content::URLDataSource::GotDataCallback callback_;
// Locale of the EULA.
- std::string locale_;
+ const std::string locale_;
// EULA contents that was loaded from file.
std::string contents_;

Powered by Google App Engine
This is Rietveld 408576698