Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(377)

Side by Side Diff: third_party/WebKit/Source/core/loader/resource/ImageResource.cpp

Issue 2797993007: Show image placeholders on dimension decode error (Closed)
Patch Set: fix comment Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
5 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) 5 Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
6 Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. 6 Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
7 7
8 This library is free software; you can redistribute it and/or 8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Library General Public 9 modify it under the terms of the GNU Library General Public
10 License as published by the Free Software Foundation; either 10 License as published by the Free Software Foundation; either
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 placeholder_option_ = PlaceholderOption::kDoNotReloadPlaceholder; 454 placeholder_option_ = PlaceholderOption::kDoNotReloadPlaceholder;
455 } else { 455 } else {
456 placeholder_option_ = PlaceholderOption::kReloadPlaceholderOnDecodeError; 456 placeholder_option_ = PlaceholderOption::kReloadPlaceholderOnDecodeError;
457 } 457 }
458 } 458 }
459 } 459 }
460 460
461 bool ImageResource::ShouldShowPlaceholder() const { 461 bool ImageResource::ShouldShowPlaceholder() const {
462 switch (placeholder_option_) { 462 switch (placeholder_option_) {
463 case PlaceholderOption::kShowAndReloadPlaceholderAlways: 463 case PlaceholderOption::kShowAndReloadPlaceholderAlways:
464 case PlaceholderOption::kShowAndDoNotReloadPlaceholder:
464 return true; 465 return true;
465 case PlaceholderOption::kReloadPlaceholderOnDecodeError: 466 case PlaceholderOption::kReloadPlaceholderOnDecodeError:
466 case PlaceholderOption::kDoNotReloadPlaceholder: 467 case PlaceholderOption::kDoNotReloadPlaceholder:
467 return false; 468 return false;
468 } 469 }
469 NOTREACHED(); 470 NOTREACHED();
470 return false; 471 return false;
471 } 472 }
472 473
473 bool ImageResource::ShouldReloadBrokenPlaceholder() const { 474 bool ImageResource::ShouldReloadBrokenPlaceholder() const {
474 switch (placeholder_option_) { 475 switch (placeholder_option_) {
475 case PlaceholderOption::kShowAndReloadPlaceholderAlways: 476 case PlaceholderOption::kShowAndReloadPlaceholderAlways:
476 return ErrorOccurred(); 477 return ErrorOccurred();
477 case PlaceholderOption::kReloadPlaceholderOnDecodeError: 478 case PlaceholderOption::kReloadPlaceholderOnDecodeError:
478 return GetStatus() == ResourceStatus::kDecodeError; 479 return GetStatus() == ResourceStatus::kDecodeError;
480 case PlaceholderOption::kShowAndDoNotReloadPlaceholder:
479 case PlaceholderOption::kDoNotReloadPlaceholder: 481 case PlaceholderOption::kDoNotReloadPlaceholder:
480 return false; 482 return false;
481 } 483 }
482 NOTREACHED(); 484 NOTREACHED();
483 return false; 485 return false;
484 } 486 }
485 487
486 static bool IsLoFiImage(const ImageResource& resource) { 488 static bool IsLoFiImage(const ImageResource& resource) {
487 if (resource.IsLoaded()) { 489 if (resource.IsLoaded()) {
488 return resource.GetResponse() 490 return resource.GetResponse()
(...skipping 22 matching lines...) Expand all
511 // progress doesn't cause clients and observers to be notified of completion 513 // progress doesn't cause clients and observers to be notified of completion
512 // prematurely. 514 // prematurely.
513 DCHECK(!is_scheduling_reload_); 515 DCHECK(!is_scheduling_reload_);
514 is_scheduling_reload_ = true; 516 is_scheduling_reload_ = true;
515 517
516 SetCachePolicyBypassingCache(); 518 SetCachePolicyBypassingCache();
517 519
518 // The reloaded image should not use any previews transformations. 520 // The reloaded image should not use any previews transformations.
519 WebURLRequest::PreviewsState previews_state_for_reload = 521 WebURLRequest::PreviewsState previews_state_for_reload =
520 WebURLRequest::kPreviewsNoTransform; 522 WebURLRequest::kPreviewsNoTransform;
523 WebURLRequest::PreviewsState old_previews_state =
524 GetResourceRequest().GetPreviewsState();
521 525
522 if (policy == kReloadIfNeeded && (GetResourceRequest().GetPreviewsState() & 526 if (policy == kReloadIfNeeded && (GetResourceRequest().GetPreviewsState() &
523 WebURLRequest::kClientLoFiOn)) { 527 WebURLRequest::kClientLoFiOn)) {
524 // If the image attempted to use Client LoFi, but encountered a decoding 528 // If the image attempted to use Client LoFi, but encountered a decoding
525 // error and is being automatically reloaded, then also set the appropriate 529 // error and is being automatically reloaded, then also set the appropriate
526 // PreviewsState bit for that. This allows the embedder to count the 530 // PreviewsState bit for that. This allows the embedder to count the
527 // bandwidth used for this reload against the data savings of the initial 531 // bandwidth used for this reload against the data savings of the initial
528 // response. 532 // response.
529 previews_state_for_reload |= WebURLRequest::kClientLoFiAutoReload; 533 previews_state_for_reload |= WebURLRequest::kClientLoFiAutoReload;
530 } 534 }
531 SetPreviewsState(previews_state_for_reload); 535 SetPreviewsState(previews_state_for_reload);
532 536
533 if (placeholder_option_ != PlaceholderOption::kDoNotReloadPlaceholder) 537 if (placeholder_option_ != PlaceholderOption::kDoNotReloadPlaceholder)
534 ClearRangeRequestHeader(); 538 ClearRangeRequestHeader();
535 placeholder_option_ = PlaceholderOption::kDoNotReloadPlaceholder; 539
540 if (old_previews_state & WebURLRequest::kClientLoFiOn &&
541 policy != kReloadAlways) {
542 placeholder_option_ = PlaceholderOption::kShowAndDoNotReloadPlaceholder;
543 } else {
544 placeholder_option_ = PlaceholderOption::kDoNotReloadPlaceholder;
545 }
536 546
537 if (IsLoading()) { 547 if (IsLoading()) {
538 Loader()->Cancel(); 548 Loader()->Cancel();
539 // Canceling the loader causes error() to be called, which in turn calls 549 // Canceling the loader causes error() to be called, which in turn calls
540 // clear() and notifyObservers(), so there's no need to call these again 550 // clear() and notifyObservers(), so there's no need to call these again
541 // here. 551 // here.
542 } else { 552 } else {
543 ClearData(); 553 ClearData();
544 SetEncodedSize(0); 554 SetEncodedSize(0);
545 UpdateImage(nullptr, ImageResourceContent::kClearImageAndNotifyObservers, 555 UpdateImage(nullptr, ImageResourceContent::kClearImageAndNotifyObservers,
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
634 // reloading in Step 3 due to notifyObservers()'s 644 // reloading in Step 3 due to notifyObservers()'s
635 // schedulingReloadOrShouldReloadBrokenPlaceholder() check. 645 // schedulingReloadOrShouldReloadBrokenPlaceholder() check.
636 // 3. reloadIfLoFiOrPlaceholderImage() is called via ResourceFetcher 646 // 3. reloadIfLoFiOrPlaceholderImage() is called via ResourceFetcher
637 // (a) via didFinishLoading() called in decodeError(), or 647 // (a) via didFinishLoading() called in decodeError(), or
638 // (b) after returning ImageResource::updateImage(). 648 // (b) after returning ImageResource::updateImage().
639 DecodeError(all_data_received); 649 DecodeError(all_data_received);
640 } 650 }
641 } 651 }
642 652
643 } // namespace blink 653 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698