Chromium Code Reviews| OLD | NEW |
|---|---|
| 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, 2008, 2009, 2010, 2011 Apple Inc. All | 6 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All |
| 7 rights reserved. | 7 rights reserved. |
| 8 | 8 |
| 9 This library is free software; you can redistribute it and/or | 9 This library is free software; you can redistribute it and/or |
| 10 modify it under the terms of the GNU Library General Public | 10 modify it under the terms of the GNU Library General Public |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 239 WebSecurityOrigin(security_origin_), | 239 WebSecurityOrigin(security_origin_), |
| 240 GetResponse().CacheStorageCacheName()); | 240 GetResponse().CacheStorageCacheName()); |
| 241 } else { | 241 } else { |
| 242 Platform::Current()->CacheMetadataInCacheStorage( | 242 Platform::Current()->CacheMetadataInCacheStorage( |
| 243 GetResponse().Url(), GetResponse().ResponseTime(), nullptr, 0, | 243 GetResponse().Url(), GetResponse().ResponseTime(), nullptr, 0, |
| 244 WebSecurityOrigin(security_origin_), | 244 WebSecurityOrigin(security_origin_), |
| 245 GetResponse().CacheStorageCacheName()); | 245 GetResponse().CacheStorageCacheName()); |
| 246 } | 246 } |
| 247 } | 247 } |
| 248 | 248 |
| 249 // This class cannot be on-heap because the first callbackHandler() call | |
| 250 // instantiates the singleton object while we can call it in the | |
| 251 // pre-finalization step. | |
| 252 class Resource::ResourceCallback final { | |
| 253 public: | |
| 254 static ResourceCallback& CallbackHandler(); | |
| 255 void Schedule(Resource*); | |
| 256 void Cancel(Resource*); | |
| 257 bool IsScheduled(Resource*) const; | |
| 258 | |
| 259 private: | |
| 260 ResourceCallback(); | |
| 261 | |
| 262 void RunTask(); | |
| 263 TaskHandle task_handle_; | |
| 264 HashSet<Persistent<Resource>> resources_with_pending_clients_; | |
| 265 }; | |
| 266 | |
| 267 Resource::ResourceCallback& Resource::ResourceCallback::CallbackHandler() { | |
| 268 DEFINE_STATIC_LOCAL(ResourceCallback, callback_handler, ()); | |
| 269 return callback_handler; | |
| 270 } | |
| 271 | |
| 272 Resource::ResourceCallback::ResourceCallback() {} | |
| 273 | |
| 274 void Resource::ResourceCallback::Schedule(Resource* resource) { | |
| 275 if (!task_handle_.IsActive()) { | |
| 276 // WTF::unretained(this) is safe because a posted task is canceled when | |
| 277 // |task_handle_| is destroyed on the dtor of this ResourceCallback. | |
| 278 task_handle_ = | |
| 279 Platform::Current() | |
| 280 ->CurrentThread() | |
| 281 ->Scheduler() | |
| 282 ->LoadingTaskRunner() | |
| 283 ->PostCancellableTask( | |
| 284 BLINK_FROM_HERE, | |
| 285 WTF::Bind(&ResourceCallback::RunTask, WTF::Unretained(this))); | |
| 286 } | |
| 287 resources_with_pending_clients_.insert(resource); | |
| 288 } | |
| 289 | |
| 290 void Resource::ResourceCallback::Cancel(Resource* resource) { | |
| 291 resources_with_pending_clients_.erase(resource); | |
| 292 if (task_handle_.IsActive() && resources_with_pending_clients_.IsEmpty()) | |
| 293 task_handle_.Cancel(); | |
| 294 } | |
| 295 | |
| 296 bool Resource::ResourceCallback::IsScheduled(Resource* resource) const { | |
| 297 return resources_with_pending_clients_.Contains(resource); | |
| 298 } | |
| 299 | |
| 300 void Resource::ResourceCallback::RunTask() { | |
| 301 HeapVector<Member<Resource>> resources; | |
| 302 for (const Member<Resource>& resource : resources_with_pending_clients_) | |
| 303 resources.push_back(resource.Get()); | |
| 304 resources_with_pending_clients_.clear(); | |
| 305 | |
| 306 for (const auto& resource : resources) | |
| 307 resource->FinishPendingClients(); | |
| 308 } | |
| 309 | |
| 310 Resource::Resource(const ResourceRequest& request, | 249 Resource::Resource(const ResourceRequest& request, |
| 311 Type type, | 250 Type type, |
| 312 const ResourceLoaderOptions& options) | 251 const ResourceLoaderOptions& options) |
| 313 : load_finish_time_(0), | 252 : load_finish_time_(0), |
| 314 identifier_(0), | 253 identifier_(0), |
| 315 encoded_size_(0), | 254 encoded_size_(0), |
| 316 encoded_size_memory_usage_(0), | 255 encoded_size_memory_usage_(0), |
| 317 decoded_size_(0), | 256 decoded_size_(0), |
| 318 overhead_size_(CalculateOverheadSize()), | 257 overhead_size_(CalculateOverheadSize()), |
| 319 preload_count_(0), | 258 preload_count_(0), |
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 715 clients_.insert(client); | 654 clients_.insert(client); |
| 716 return; | 655 return; |
| 717 } | 656 } |
| 718 | 657 |
| 719 // If an error has occurred or we have existing data to send to the new client | 658 // If an error has occurred or we have existing data to send to the new client |
| 720 // and the resource type supprts it, send it asynchronously. | 659 // and the resource type supprts it, send it asynchronously. |
| 721 if ((ErrorOccurred() || !GetResponse().IsNull()) && | 660 if ((ErrorOccurred() || !GetResponse().IsNull()) && |
| 722 !TypeNeedsSynchronousCacheHit(GetType()) && | 661 !TypeNeedsSynchronousCacheHit(GetType()) && |
| 723 !needs_synchronous_cache_hit_) { | 662 !needs_synchronous_cache_hit_) { |
| 724 clients_awaiting_callback_.insert(client); | 663 clients_awaiting_callback_.insert(client); |
| 725 ResourceCallback::CallbackHandler().Schedule(this); | 664 if (!async_callback_task_handle_.IsActive()) { |
| 665 async_callback_task_handle_ = | |
| 666 Platform::Current() | |
| 667 ->CurrentThread() | |
| 668 ->Scheduler() | |
| 669 ->LoadingTaskRunner() | |
| 670 ->PostCancellableTask(BLINK_FROM_HERE, | |
| 671 WTF::Bind(&Resource::FinishPendingClients, | |
| 672 WrapWeakPersistent(this))); | |
| 673 } | |
| 726 return; | 674 return; |
| 727 } | 675 } |
| 728 | 676 |
| 729 clients_.insert(client); | 677 clients_.insert(client); |
| 730 DidAddClient(client); | 678 DidAddClient(client); |
| 731 return; | 679 return; |
| 732 } | 680 } |
| 733 | 681 |
| 734 void Resource::RemoveClient(ResourceClient* client) { | 682 void Resource::RemoveClient(ResourceClient* client) { |
| 735 CHECK(!is_add_remove_client_prohibited_); | 683 CHECK(!is_add_remove_client_prohibited_); |
| 736 | 684 |
| 737 // This code may be called in a pre-finalizer, where weak members in the | 685 // This code may be called in a pre-finalizer, where weak members in the |
| 738 // HashCountedSet are already swept out. | 686 // HashCountedSet are already swept out. |
| 739 | 687 |
| 740 if (finished_clients_.Contains(client)) | 688 if (finished_clients_.Contains(client)) |
| 741 finished_clients_.erase(client); | 689 finished_clients_.erase(client); |
| 742 else if (clients_awaiting_callback_.Contains(client)) | 690 else if (clients_awaiting_callback_.Contains(client)) |
| 743 clients_awaiting_callback_.erase(client); | 691 clients_awaiting_callback_.erase(client); |
| 744 else | 692 else |
| 745 clients_.erase(client); | 693 clients_.erase(client); |
| 746 | 694 |
| 747 if (clients_awaiting_callback_.IsEmpty()) | 695 if (clients_awaiting_callback_.IsEmpty()) |
|
yhirano
2017/05/10 06:59:17
The original code contains |task_runner_.IsActive(
horo
2017/05/10 07:05:30
Done.
| |
| 748 ResourceCallback::CallbackHandler().Cancel(this); | 696 async_callback_task_handle_.Cancel(); |
| 749 | 697 |
| 750 DidRemoveClientOrObserver(); | 698 DidRemoveClientOrObserver(); |
| 751 } | 699 } |
| 752 | 700 |
| 753 void Resource::DidRemoveClientOrObserver() { | 701 void Resource::DidRemoveClientOrObserver() { |
| 754 if (!HasClientsOrObservers() && is_alive_) { | 702 if (!HasClientsOrObservers() && is_alive_) { |
| 755 is_alive_ = false; | 703 is_alive_ = false; |
| 756 AllClientsAndObserversRemoved(); | 704 AllClientsAndObserversRemoved(); |
| 757 | 705 |
| 758 // RFC2616 14.9.2: | 706 // RFC2616 14.9.2: |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 820 | 768 |
| 821 // When revalidation starts after waiting clients are scheduled and | 769 // When revalidation starts after waiting clients are scheduled and |
| 822 // before they are added here. In such cases, we just add the clients | 770 // before they are added here. In such cases, we just add the clients |
| 823 // to |clients_| without DidAddClient(), as in Resource::AddClient(). | 771 // to |clients_| without DidAddClient(), as in Resource::AddClient(). |
| 824 if (!is_revalidating_) | 772 if (!is_revalidating_) |
| 825 DidAddClient(client); | 773 DidAddClient(client); |
| 826 } | 774 } |
| 827 | 775 |
| 828 // It is still possible for the above loop to finish a new client | 776 // It is still possible for the above loop to finish a new client |
| 829 // synchronously. If there's no client waiting we should deschedule. | 777 // synchronously. If there's no client waiting we should deschedule. |
| 830 bool scheduled = ResourceCallback::CallbackHandler().IsScheduled(this); | 778 bool scheduled = async_callback_task_handle_.IsActive(); |
| 831 if (scheduled && clients_awaiting_callback_.IsEmpty()) | 779 if (scheduled && clients_awaiting_callback_.IsEmpty()) |
| 832 ResourceCallback::CallbackHandler().Cancel(this); | 780 async_callback_task_handle_.Cancel(); |
| 833 | 781 |
| 834 // Prevent the case when there are clients waiting but no callback scheduled. | 782 // Prevent the case when there are clients waiting but no callback scheduled. |
| 835 DCHECK(clients_awaiting_callback_.IsEmpty() || scheduled); | 783 DCHECK(clients_awaiting_callback_.IsEmpty() || scheduled); |
| 836 } | 784 } |
| 837 | 785 |
| 838 void Resource::Prune() { | 786 void Resource::Prune() { |
| 839 DestroyDecodedDataIfPossible(); | 787 DestroyDecodedDataIfPossible(); |
| 840 } | 788 } |
| 841 | 789 |
| 842 void Resource::OnPurgeMemory() { | 790 void Resource::OnPurgeMemory() { |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1120 case Resource::kMedia: | 1068 case Resource::kMedia: |
| 1121 case Resource::kManifest: | 1069 case Resource::kManifest: |
| 1122 case Resource::kMock: | 1070 case Resource::kMock: |
| 1123 return false; | 1071 return false; |
| 1124 } | 1072 } |
| 1125 NOTREACHED(); | 1073 NOTREACHED(); |
| 1126 return false; | 1074 return false; |
| 1127 } | 1075 } |
| 1128 | 1076 |
| 1129 } // namespace blink | 1077 } // namespace blink |
| OLD | NEW |