OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/search_provider_logos/logo_tracker.h" | 5 #include "components/search_provider_logos/logo_tracker.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/task_runner_util.h" | 10 #include "base/task_runner_util.h" |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 append_fingerprint_func_ = append_fingerprint_func; | 100 append_fingerprint_func_ = append_fingerprint_func; |
101 } | 101 } |
102 | 102 |
103 void LogoTracker::GetLogo(LogoObserver* observer) { | 103 void LogoTracker::GetLogo(LogoObserver* observer) { |
104 DCHECK(!logo_url_.is_empty()); | 104 DCHECK(!logo_url_.is_empty()); |
105 logo_observers_.AddObserver(observer); | 105 logo_observers_.AddObserver(observer); |
106 | 106 |
107 if (is_idle_) { | 107 if (is_idle_) { |
108 is_idle_ = false; | 108 is_idle_ = false; |
109 base::PostTaskAndReplyWithResult( | 109 base::PostTaskAndReplyWithResult( |
110 file_task_runner_, | 110 file_task_runner_.get(), |
111 FROM_HERE, | 111 FROM_HERE, |
112 base::Bind(&GetLogoFromCacheOnFileThread, | 112 base::Bind(&GetLogoFromCacheOnFileThread, |
113 logo_cache_, | 113 logo_cache_, |
114 logo_url_, | 114 logo_url_, |
115 clock_->Now()), | 115 clock_->Now()), |
116 base::Bind(&LogoTracker::OnCachedLogoRead, | 116 base::Bind(&LogoTracker::OnCachedLogoRead, |
117 weak_ptr_factory_.GetWeakPtr())); | 117 weak_ptr_factory_.GetWeakPtr())); |
118 } else if (is_cached_logo_valid_) { | 118 } else if (is_cached_logo_valid_) { |
119 observer->OnLogoAvailable(cached_logo_.get(), true); | 119 observer->OnLogoAvailable(cached_logo_.get(), true); |
120 } | 120 } |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 GURL url; | 201 GURL url; |
202 if (cached_logo_ && !cached_logo_->metadata.fingerprint.empty() && | 202 if (cached_logo_ && !cached_logo_->metadata.fingerprint.empty() && |
203 cached_logo_->metadata.expiration_time >= clock_->Now()) { | 203 cached_logo_->metadata.expiration_time >= clock_->Now()) { |
204 url = append_fingerprint_func_.Run(logo_url_, | 204 url = append_fingerprint_func_.Run(logo_url_, |
205 cached_logo_->metadata.fingerprint); | 205 cached_logo_->metadata.fingerprint); |
206 } else { | 206 } else { |
207 url = logo_url_; | 207 url = logo_url_; |
208 } | 208 } |
209 | 209 |
210 fetcher_.reset(net::URLFetcher::Create(url, net::URLFetcher::GET, this)); | 210 fetcher_.reset(net::URLFetcher::Create(url, net::URLFetcher::GET, this)); |
211 fetcher_->SetRequestContext(request_context_getter_); | 211 fetcher_->SetRequestContext(request_context_getter_.get()); |
212 fetcher_->Start(); | 212 fetcher_->Start(); |
213 } | 213 } |
214 | 214 |
215 void LogoTracker::OnFreshLogoParsed(scoped_ptr<EncodedLogo> logo) { | 215 void LogoTracker::OnFreshLogoParsed(scoped_ptr<EncodedLogo> logo) { |
216 DCHECK(!is_idle_); | 216 DCHECK(!is_idle_); |
217 | 217 |
218 if (logo) | 218 if (logo) |
219 logo->metadata.source_url = logo_url_.spec(); | 219 logo->metadata.source_url = logo_url_.spec(); |
220 | 220 |
221 if (!logo || !logo->encoded_image) { | 221 if (!logo || !logo->encoded_image.get()) { |
222 OnFreshLogoAvailable(logo.Pass(), SkBitmap()); | 222 OnFreshLogoAvailable(logo.Pass(), SkBitmap()); |
223 } else { | 223 } else { |
224 // Store the value of logo->encoded_image for use below. This ensures that | 224 // Store the value of logo->encoded_image for use below. This ensures that |
225 // logo->encoded_image is evaulated before base::Passed(&logo), which sets | 225 // logo->encoded_image is evaulated before base::Passed(&logo), which sets |
226 // logo to NULL. | 226 // logo to NULL. |
227 scoped_refptr<base::RefCountedString> encoded_image = logo->encoded_image; | 227 scoped_refptr<base::RefCountedString> encoded_image = logo->encoded_image; |
228 logo_delegate_->DecodeUntrustedImage( | 228 logo_delegate_->DecodeUntrustedImage( |
229 encoded_image, | 229 encoded_image, |
230 base::Bind(&LogoTracker::OnFreshLogoAvailable, | 230 base::Bind(&LogoTracker::OnFreshLogoAvailable, |
231 weak_ptr_factory_.GetWeakPtr(), | 231 weak_ptr_factory_.GetWeakPtr(), |
232 base::Passed(&logo))); | 232 base::Passed(&logo))); |
233 } | 233 } |
234 } | 234 } |
235 | 235 |
236 void LogoTracker::OnFreshLogoAvailable(scoped_ptr<EncodedLogo> encoded_logo, | 236 void LogoTracker::OnFreshLogoAvailable(scoped_ptr<EncodedLogo> encoded_logo, |
237 const SkBitmap& image) { | 237 const SkBitmap& image) { |
238 DCHECK(!is_idle_); | 238 DCHECK(!is_idle_); |
239 | 239 |
240 if (encoded_logo && !encoded_logo->encoded_image && cached_logo_ && | 240 if (encoded_logo && !encoded_logo->encoded_image.get() && cached_logo_ && |
241 !encoded_logo->metadata.fingerprint.empty() && | 241 !encoded_logo->metadata.fingerprint.empty() && |
242 encoded_logo->metadata.fingerprint == | 242 encoded_logo->metadata.fingerprint == |
243 cached_logo_->metadata.fingerprint) { | 243 cached_logo_->metadata.fingerprint) { |
244 // The cached logo was revalidated, i.e. its fingerprint was verified. | 244 // The cached logo was revalidated, i.e. its fingerprint was verified. |
245 SetCachedMetadata(encoded_logo->metadata); | 245 SetCachedMetadata(encoded_logo->metadata); |
246 } else if (encoded_logo && image.isNull()) { | 246 } else if (encoded_logo && image.isNull()) { |
247 // Image decoding failed. Do nothing. | 247 // Image decoding failed. Do nothing. |
248 } else { | 248 } else { |
249 scoped_ptr<Logo> logo; | 249 scoped_ptr<Logo> logo; |
250 // Check if the server returned a valid, non-empty response. | 250 // Check if the server returned a valid, non-empty response. |
(...skipping 24 matching lines...) Expand all Loading... |
275 if (!source->GetStatus().is_success() || (source->GetResponseCode() != 200)) { | 275 if (!source->GetStatus().is_success() || (source->GetResponseCode() != 200)) { |
276 ReturnToIdle(); | 276 ReturnToIdle(); |
277 return; | 277 return; |
278 } | 278 } |
279 | 279 |
280 scoped_ptr<std::string> response(new std::string()); | 280 scoped_ptr<std::string> response(new std::string()); |
281 source->GetResponseAsString(response.get()); | 281 source->GetResponseAsString(response.get()); |
282 base::Time response_time = clock_->Now(); | 282 base::Time response_time = clock_->Now(); |
283 | 283 |
284 base::PostTaskAndReplyWithResult( | 284 base::PostTaskAndReplyWithResult( |
285 background_task_runner_, | 285 background_task_runner_.get(), |
286 FROM_HERE, | 286 FROM_HERE, |
287 base::Bind(parse_logo_response_func_, | 287 base::Bind( |
288 base::Passed(&response), | 288 parse_logo_response_func_, base::Passed(&response), response_time), |
289 response_time), | |
290 base::Bind(&LogoTracker::OnFreshLogoParsed, | 289 base::Bind(&LogoTracker::OnFreshLogoParsed, |
291 weak_ptr_factory_.GetWeakPtr())); | 290 weak_ptr_factory_.GetWeakPtr())); |
292 } | 291 } |
293 | 292 |
294 void LogoTracker::OnURLFetchDownloadProgress(const net::URLFetcher* source, | 293 void LogoTracker::OnURLFetchDownloadProgress(const net::URLFetcher* source, |
295 int64 current, | 294 int64 current, |
296 int64 total) { | 295 int64 total) { |
297 if (total > kMaxDownloadBytes || current > kMaxDownloadBytes) { | 296 if (total > kMaxDownloadBytes || current > kMaxDownloadBytes) { |
298 LOG(WARNING) << "Search provider logo exceeded download size limit"; | 297 LOG(WARNING) << "Search provider logo exceeded download size limit"; |
299 ReturnToIdle(); | 298 ReturnToIdle(); |
300 } | 299 } |
301 } | 300 } |
302 | 301 |
303 } // namespace search_provider_logos | 302 } // namespace search_provider_logos |
OLD | NEW |