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 |