 Chromium Code Reviews
 Chromium Code Reviews Issue 2762853003:
  [Doodle] Add UMA for doodle image downloads  (Closed)
    
  
    Issue 2762853003:
  [Doodle] Add UMA for doodle image downloads  (Closed) 
  | 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 #include <utility> | 8 #include <utility> | 
| 9 | 9 | 
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" | 
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 254 traffic_annotation); | 254 traffic_annotation); | 
| 255 fetcher_->SetRequestContext(request_context_getter_.get()); | 255 fetcher_->SetRequestContext(request_context_getter_.get()); | 
| 256 data_use_measurement::DataUseUserData::AttachToFetcher( | 256 data_use_measurement::DataUseUserData::AttachToFetcher( | 
| 257 fetcher_.get(), | 257 fetcher_.get(), | 
| 258 data_use_measurement::DataUseUserData::SEARCH_PROVIDER_LOGOS); | 258 data_use_measurement::DataUseUserData::SEARCH_PROVIDER_LOGOS); | 
| 259 fetcher_->Start(); | 259 fetcher_->Start(); | 
| 260 logo_download_start_time_ = base::TimeTicks::Now(); | 260 logo_download_start_time_ = base::TimeTicks::Now(); | 
| 261 } | 261 } | 
| 262 | 262 | 
| 263 void LogoTracker::OnFreshLogoParsed(bool* parsing_failed, | 263 void LogoTracker::OnFreshLogoParsed(bool* parsing_failed, | 
| 264 bool from_http_cache, | |
| 264 std::unique_ptr<EncodedLogo> logo) { | 265 std::unique_ptr<EncodedLogo> logo) { | 
| 265 DCHECK(!is_idle_); | 266 DCHECK(!is_idle_); | 
| 266 | 267 | 
| 267 if (logo) | 268 if (logo) | 
| 268 logo->metadata.source_url = logo_url_.spec(); | 269 logo->metadata.source_url = logo_url_.spec(); | 
| 269 | 270 | 
| 270 if (!logo || !logo->encoded_image.get()) { | 271 if (!logo || !logo->encoded_image.get()) { | 
| 271 OnFreshLogoAvailable(std::move(logo), *parsing_failed, SkBitmap()); | 272 OnFreshLogoAvailable(std::move(logo), *parsing_failed, from_http_cache, | 
| 273 SkBitmap()); | |
| 272 } else { | 274 } else { | 
| 273 // Store the value of logo->encoded_image for use below. This ensures that | 275 // Store the value of logo->encoded_image for use below. This ensures that | 
| 274 // logo->encoded_image is evaulated before base::Passed(&logo), which sets | 276 // logo->encoded_image is evaulated before base::Passed(&logo), which sets | 
| 275 // logo to NULL. | 277 // logo to NULL. | 
| 276 scoped_refptr<base::RefCountedString> encoded_image = logo->encoded_image; | 278 scoped_refptr<base::RefCountedString> encoded_image = logo->encoded_image; | 
| 277 logo_delegate_->DecodeUntrustedImage( | 279 logo_delegate_->DecodeUntrustedImage( | 
| 278 encoded_image, | 280 encoded_image, | 
| 279 base::Bind(&LogoTracker::OnFreshLogoAvailable, | 281 base::Bind(&LogoTracker::OnFreshLogoAvailable, | 
| 280 weak_ptr_factory_.GetWeakPtr(), | 282 weak_ptr_factory_.GetWeakPtr(), base::Passed(&logo), | 
| 281 base::Passed(&logo), | 283 *parsing_failed, from_http_cache)); | 
| 282 *parsing_failed)); | |
| 283 } | 284 } | 
| 284 } | 285 } | 
| 285 | 286 | 
| 286 void LogoTracker::OnFreshLogoAvailable( | 287 void LogoTracker::OnFreshLogoAvailable( | 
| 287 std::unique_ptr<EncodedLogo> encoded_logo, | 288 std::unique_ptr<EncodedLogo> encoded_logo, | 
| 288 bool parsing_failed, | 289 bool parsing_failed, | 
| 290 bool from_http_cache, | |
| 289 const SkBitmap& image) { | 291 const SkBitmap& image) { | 
| 290 DCHECK(!is_idle_); | 292 DCHECK(!is_idle_); | 
| 291 | 293 | 
| 292 int download_outcome = kDownloadOutcomeNotTracked; | 294 int download_outcome = kDownloadOutcomeNotTracked; | 
| 293 | 295 | 
| 294 if (encoded_logo && !encoded_logo->encoded_image.get() && cached_logo_ && | 296 if (encoded_logo && !encoded_logo->encoded_image.get() && cached_logo_ && | 
| 295 !encoded_logo->metadata.fingerprint.empty() && | 297 !encoded_logo->metadata.fingerprint.empty() && | 
| 296 encoded_logo->metadata.fingerprint == | 298 encoded_logo->metadata.fingerprint == | 
| 297 cached_logo_->metadata.fingerprint) { | 299 cached_logo_->metadata.fingerprint) { | 
| 298 // The cached logo was revalidated, i.e. its fingerprint was verified. | 300 // The cached logo was revalidated, i.e. its fingerprint was verified. | 
| 299 // mime_type isn't sent when revalidating, so copy it from the cached logo. | 301 // mime_type isn't sent when revalidating, so copy it from the cached logo. | 
| 300 encoded_logo->metadata.mime_type = cached_logo_->metadata.mime_type; | 302 encoded_logo->metadata.mime_type = cached_logo_->metadata.mime_type; | 
| 301 SetCachedMetadata(encoded_logo->metadata); | 303 SetCachedMetadata(encoded_logo->metadata); | 
| 302 download_outcome = DOWNLOAD_OUTCOME_LOGO_REVALIDATED; | 304 download_outcome = DOWNLOAD_OUTCOME_LOGO_REVALIDATED; | 
| 303 } else if (encoded_logo && image.isNull()) { | 305 } else if (encoded_logo && image.isNull()) { | 
| 304 // Image decoding failed. Do nothing. | 306 // Image decoding failed. Do nothing. | 
| 305 download_outcome = DOWNLOAD_OUTCOME_DECODING_FAILED; | 307 download_outcome = DOWNLOAD_OUTCOME_DECODING_FAILED; | 
| 306 } else { | 308 } else { | 
| 307 std::unique_ptr<Logo> logo; | 309 std::unique_ptr<Logo> logo; | 
| 308 // Check if the server returned a valid, non-empty response. | 310 // Check if the server returned a valid, non-empty response. | 
| 309 if (encoded_logo) { | 311 if (encoded_logo) { | 
| 312 UMA_HISTOGRAM_BOOLEAN("NewTabPage.LogoImageDownloaded", from_http_cache); | |
| 313 | |
| 310 DCHECK(!image.isNull()); | 314 DCHECK(!image.isNull()); | 
| 311 logo.reset(new Logo()); | 315 logo.reset(new Logo()); | 
| 312 logo->metadata = encoded_logo->metadata; | 316 logo->metadata = encoded_logo->metadata; | 
| 313 logo->image = image; | 317 logo->image = image; | 
| 314 } | 318 } | 
| 315 | 319 | 
| 316 if (logo) { | 320 if (logo) { | 
| 317 download_outcome = DOWNLOAD_OUTCOME_NEW_LOGO_SUCCESS; | 321 download_outcome = DOWNLOAD_OUTCOME_NEW_LOGO_SUCCESS; | 
| 318 } else { | 322 } else { | 
| 319 if (parsing_failed) | 323 if (parsing_failed) | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 353 return; | 357 return; | 
| 354 } | 358 } | 
| 355 | 359 | 
| 356 UMA_HISTOGRAM_TIMES("NewTabPage.LogoDownloadTime", | 360 UMA_HISTOGRAM_TIMES("NewTabPage.LogoDownloadTime", | 
| 357 base::TimeTicks::Now() - logo_download_start_time_); | 361 base::TimeTicks::Now() - logo_download_start_time_); | 
| 358 | 362 | 
| 359 std::unique_ptr<std::string> response(new std::string()); | 363 std::unique_ptr<std::string> response(new std::string()); | 
| 360 source->GetResponseAsString(response.get()); | 364 source->GetResponseAsString(response.get()); | 
| 361 base::Time response_time = clock_->Now(); | 365 base::Time response_time = clock_->Now(); | 
| 362 | 366 | 
| 367 bool from_http_cache = source->WasCached(); | |
| 
justincohen
2017/03/21 15:03:52
Can we test this?
 
Marc Treib
2017/03/21 15:37:00
What exactly would you want to get tested?
 
justincohen
2017/03/21 15:48:52
I'm curious if this works on iOS, specifically.
 
Marc Treib
2017/03/21 15:54:21
"This" being the WasCached() method on URLFetcher?
 | |
| 368 | |
| 363 bool* parsing_failed = new bool(false); | 369 bool* parsing_failed = new bool(false); | 
| 364 base::PostTaskAndReplyWithResult( | 370 base::PostTaskAndReplyWithResult( | 
| 365 background_task_runner_.get(), FROM_HERE, | 371 background_task_runner_.get(), FROM_HERE, | 
| 366 base::Bind(parse_logo_response_func_, base::Passed(&response), | 372 base::Bind(parse_logo_response_func_, base::Passed(&response), | 
| 367 response_time, parsing_failed), | 373 response_time, parsing_failed), | 
| 368 base::Bind(&LogoTracker::OnFreshLogoParsed, | 374 base::Bind(&LogoTracker::OnFreshLogoParsed, | 
| 369 weak_ptr_factory_.GetWeakPtr(), base::Owned(parsing_failed))); | 375 weak_ptr_factory_.GetWeakPtr(), base::Owned(parsing_failed), | 
| 376 from_http_cache)); | |
| 370 } | 377 } | 
| 371 | 378 | 
| 372 void LogoTracker::OnURLFetchDownloadProgress(const net::URLFetcher* source, | 379 void LogoTracker::OnURLFetchDownloadProgress(const net::URLFetcher* source, | 
| 373 int64_t current, | 380 int64_t current, | 
| 374 int64_t total, | 381 int64_t total, | 
| 375 int64_t current_network_bytes) { | 382 int64_t current_network_bytes) { | 
| 376 if (total > kMaxDownloadBytes || current > kMaxDownloadBytes) { | 383 if (total > kMaxDownloadBytes || current > kMaxDownloadBytes) { | 
| 377 LOG(WARNING) << "Search provider logo exceeded download size limit"; | 384 LOG(WARNING) << "Search provider logo exceeded download size limit"; | 
| 378 ReturnToIdle(DOWNLOAD_OUTCOME_DOWNLOAD_FAILED); | 385 ReturnToIdle(DOWNLOAD_OUTCOME_DOWNLOAD_FAILED); | 
| 379 } | 386 } | 
| 380 } | 387 } | 
| 381 | 388 | 
| 382 } // namespace search_provider_logos | 389 } // namespace search_provider_logos | 
| OLD | NEW |