| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "components/quirks/quirks_manager.h" | 5 #include "components/quirks/quirks_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 // Check if file exists, VLOG results. | 36 // Check if file exists, VLOG results. |
| 37 bool CheckAndLogFile(const base::FilePath& path) { | 37 bool CheckAndLogFile(const base::FilePath& path) { |
| 38 const bool exists = base::PathExists(path); | 38 const bool exists = base::PathExists(path); |
| 39 VLOG(1) << (exists ? "File" : "No File") << " found at " << path.value(); | 39 VLOG(1) << (exists ? "File" : "No File") << " found at " << path.value(); |
| 40 // TODO(glevin): If file exists, do we want to implement a hash to verify that | 40 // TODO(glevin): If file exists, do we want to implement a hash to verify that |
| 41 // the file hasn't been corrupted or tampered with? | 41 // the file hasn't been corrupted or tampered with? |
| 42 return exists; | 42 return exists; |
| 43 } | 43 } |
| 44 | 44 |
| 45 base::FilePath CheckForIccFile(base::FilePath built_in_path, | 45 base::FilePath CheckForIccFile(base::FilePath built_in_path, |
| 46 base::FilePath download_path) { | 46 base::FilePath download_path, |
| 47 bool quirks_enabled) { |
| 47 // First, look for icc file in old read-only location. If there, we don't use | 48 // First, look for icc file in old read-only location. If there, we don't use |
| 48 // the Quirks server. | 49 // the Quirks server. |
| 49 // TODO(glevin): Awaiting final decision on how to handle old read-only files. | 50 // TODO(glevin): Awaiting final decision on how to handle old read-only files. |
| 50 if (CheckAndLogFile(built_in_path)) | 51 if (CheckAndLogFile(built_in_path)) |
| 51 return built_in_path; | 52 return built_in_path; |
| 52 | 53 |
| 53 // If experimental Quirks flag isn't set, no other icc file is available. | 54 // If experimental Quirks flag isn't set, no other icc file is available. |
| 54 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( | 55 if (!quirks_enabled) { |
| 55 switches::kEnableQuirksClient)) { | |
| 56 VLOG(1) << "Quirks Client disabled, no built-in icc file available."; | 56 VLOG(1) << "Quirks Client disabled, no built-in icc file available."; |
| 57 return base::FilePath(); | 57 return base::FilePath(); |
| 58 } | 58 } |
| 59 | 59 |
| 60 // Check if QuirksClient has already downloaded icc file from server. | 60 // Check if QuirksClient has already downloaded icc file from server. |
| 61 if (CheckAndLogFile(download_path)) | 61 if (CheckAndLogFile(download_path)) |
| 62 return download_path; | 62 return download_path; |
| 63 | 63 |
| 64 return base::FilePath(); | 64 return base::FilePath(); |
| 65 } | 65 } |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 void QuirksManager::RegisterPrefs(PrefRegistrySimple* registry) { | 119 void QuirksManager::RegisterPrefs(PrefRegistrySimple* registry) { |
| 120 registry->RegisterDictionaryPref(prefs::kQuirksClientLastServerCheck); | 120 registry->RegisterDictionaryPref(prefs::kQuirksClientLastServerCheck); |
| 121 } | 121 } |
| 122 | 122 |
| 123 // Delay downloads until after login, to ensure that device policy has been set. | 123 // Delay downloads until after login, to ensure that device policy has been set. |
| 124 void QuirksManager::OnLoginCompleted() { | 124 void QuirksManager::OnLoginCompleted() { |
| 125 if (!waiting_for_login_) | 125 if (!waiting_for_login_) |
| 126 return; | 126 return; |
| 127 | 127 |
| 128 waiting_for_login_ = false; | 128 waiting_for_login_ = false; |
| 129 if (!QuirksEnabled()) { |
| 130 VLOG(1) << "Quirks Client disabled by device policy."; |
| 131 return; |
| 132 } |
| 133 |
| 129 for (const scoped_ptr<QuirksClient>& client : clients_) | 134 for (const scoped_ptr<QuirksClient>& client : clients_) |
| 130 client->StartDownload(); | 135 client->StartDownload(); |
| 131 } | 136 } |
| 132 | 137 |
| 133 void QuirksManager::RequestIccProfilePath( | 138 void QuirksManager::RequestIccProfilePath( |
| 134 int64_t product_id, | 139 int64_t product_id, |
| 135 const RequestFinishedCallback& on_request_finished) { | 140 const RequestFinishedCallback& on_request_finished) { |
| 136 DCHECK(thread_checker_.CalledOnValidThread()); | 141 DCHECK(thread_checker_.CalledOnValidThread()); |
| 137 | 142 |
| 138 std::string name = IdToFileName(product_id); | 143 std::string name = IdToFileName(product_id); |
| 139 base::PostTaskAndReplyWithResult( | 144 base::PostTaskAndReplyWithResult( |
| 140 blocking_pool_.get(), FROM_HERE, | 145 blocking_pool_.get(), FROM_HERE, |
| 141 base::Bind(&CheckForIccFile, | 146 base::Bind(&CheckForIccFile, |
| 142 delegate_->GetBuiltInDisplayProfileDirectory().Append(name), | 147 delegate_->GetBuiltInDisplayProfileDirectory().Append(name), |
| 143 delegate_->GetDownloadDisplayProfileDirectory().Append(name)), | 148 delegate_->GetDownloadDisplayProfileDirectory().Append(name), |
| 149 QuirksEnabled()), |
| 144 base::Bind(&QuirksManager::OnIccFilePathRequestCompleted, | 150 base::Bind(&QuirksManager::OnIccFilePathRequestCompleted, |
| 145 weak_ptr_factory_.GetWeakPtr(), product_id, | 151 weak_ptr_factory_.GetWeakPtr(), product_id, |
| 146 on_request_finished)); | 152 on_request_finished)); |
| 147 } | 153 } |
| 148 | 154 |
| 149 void QuirksManager::ClientFinished(QuirksClient* client) { | 155 void QuirksManager::ClientFinished(QuirksClient* client) { |
| 150 DCHECK(thread_checker_.CalledOnValidThread()); | 156 DCHECK(thread_checker_.CalledOnValidThread()); |
| 151 SetLastServerCheck(client->product_id(), base::Time::Now()); | 157 SetLastServerCheck(client->product_id(), base::Time::Now()); |
| 152 auto it = std::find_if(clients_.begin(), clients_.end(), | 158 auto it = std::find_if(clients_.begin(), clients_.end(), |
| 153 [client](const scoped_ptr<QuirksClient>& c) { | 159 [client](const scoped_ptr<QuirksClient>& c) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 166 return net::URLFetcher::Create(url, net::URLFetcher::GET, delegate); | 172 return net::URLFetcher::Create(url, net::URLFetcher::GET, delegate); |
| 167 } | 173 } |
| 168 | 174 |
| 169 void QuirksManager::OnIccFilePathRequestCompleted( | 175 void QuirksManager::OnIccFilePathRequestCompleted( |
| 170 int64_t product_id, | 176 int64_t product_id, |
| 171 const RequestFinishedCallback& on_request_finished, | 177 const RequestFinishedCallback& on_request_finished, |
| 172 base::FilePath path) { | 178 base::FilePath path) { |
| 173 DCHECK(thread_checker_.CalledOnValidThread()); | 179 DCHECK(thread_checker_.CalledOnValidThread()); |
| 174 | 180 |
| 175 // If we found a file or client is disabled, inform requester. | 181 // If we found a file or client is disabled, inform requester. |
| 176 if (!path.empty() || | 182 if (!path.empty() || !QuirksEnabled()) { |
| 177 !base::CommandLine::ForCurrentProcess()->HasSwitch( | |
| 178 switches::kEnableQuirksClient)) { | |
| 179 on_request_finished.Run(path, false); | 183 on_request_finished.Run(path, false); |
| 180 // TODO(glevin): If Quirks files are ever modified on the server, we'll need | 184 // TODO(glevin): If Quirks files are ever modified on the server, we'll need |
| 181 // to modify this logic to check for updates. See crbug.com/595024. | 185 // to modify this logic to check for updates. See crbug.com/595024. |
| 182 return; | 186 return; |
| 183 } | 187 } |
| 184 | 188 |
| 185 double last_check = 0.0; | 189 double last_check = 0.0; |
| 186 local_state_->GetDictionary(prefs::kQuirksClientLastServerCheck) | 190 local_state_->GetDictionary(prefs::kQuirksClientLastServerCheck) |
| 187 ->GetDouble(IdToHexString(product_id), &last_check); | 191 ->GetDouble(IdToHexString(product_id), &last_check); |
| 188 | 192 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 DCHECK(thread_checker_.CalledOnValidThread()); | 244 DCHECK(thread_checker_.CalledOnValidThread()); |
| 241 QuirksClient* client = | 245 QuirksClient* client = |
| 242 new QuirksClient(product_id, on_request_finished, this); | 246 new QuirksClient(product_id, on_request_finished, this); |
| 243 clients_.insert(make_scoped_ptr(client)); | 247 clients_.insert(make_scoped_ptr(client)); |
| 244 if (!waiting_for_login_) | 248 if (!waiting_for_login_) |
| 245 client->StartDownload(); | 249 client->StartDownload(); |
| 246 else | 250 else |
| 247 VLOG(2) << "Quirks Client created; waiting for login to begin download."; | 251 VLOG(2) << "Quirks Client created; waiting for login to begin download."; |
| 248 } | 252 } |
| 249 | 253 |
| 254 bool QuirksManager::QuirksEnabled() { |
| 255 return base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 256 switches::kEnableQuirksClient) && |
| 257 delegate_->DevicePolicyEnabled(); |
| 258 } |
| 259 |
| 250 void QuirksManager::SetLastServerCheck(int64_t product_id, | 260 void QuirksManager::SetLastServerCheck(int64_t product_id, |
| 251 const base::Time& last_check) { | 261 const base::Time& last_check) { |
| 252 DCHECK(thread_checker_.CalledOnValidThread()); | 262 DCHECK(thread_checker_.CalledOnValidThread()); |
| 253 DictionaryPrefUpdate dict(local_state_, prefs::kQuirksClientLastServerCheck); | 263 DictionaryPrefUpdate dict(local_state_, prefs::kQuirksClientLastServerCheck); |
| 254 dict->SetDouble(IdToHexString(product_id), last_check.ToDoubleT()); | 264 dict->SetDouble(IdToHexString(product_id), last_check.ToDoubleT()); |
| 255 } | 265 } |
| 256 | 266 |
| 257 } // namespace quirks | 267 } // namespace quirks |
| OLD | NEW |