| 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 |