Index: third_party/WebKit/Source/core/fetch/Resource.cpp |
diff --git a/third_party/WebKit/Source/core/fetch/Resource.cpp b/third_party/WebKit/Source/core/fetch/Resource.cpp |
index ed78f219c6ce391df41adc1752f443337a7eb96e..9dc8f188a53146c13db9049a9729fe72559953d5 100644 |
--- a/third_party/WebKit/Source/core/fetch/Resource.cpp |
+++ b/third_party/WebKit/Source/core/fetch/Resource.cpp |
@@ -144,73 +144,6 @@ |
return m_resource->encoding(); |
} |
-class Resource::ResourceCallback final : public GarbageCollectedFinalized<ResourceCallback> { |
-public: |
- static ResourceCallback& callbackHandler(); |
- DECLARE_TRACE(); |
- void schedule(Resource*); |
- void cancel(Resource*); |
- bool isScheduled(Resource*) const; |
-private: |
- ResourceCallback(); |
- |
- void runTask(); |
- OwnPtr<CancellableTaskFactory> m_callbackTaskFactory; |
- HeapHashSet<Member<Resource>> m_resourcesWithPendingClients; |
-}; |
- |
-Resource::ResourceCallback& Resource::ResourceCallback::callbackHandler() |
-{ |
- // Oilpan + LSan: as the callbackHandler() singleton is used by Resource |
- // and ResourcePtr finalizers, it cannot be released upon shutdown in |
- // preparation for leak detection. |
- // |
- // Keep it out of LSan's reach instead. |
- LEAK_SANITIZER_DISABLED_SCOPE; |
- DEFINE_STATIC_LOCAL(ResourceCallback, callbackHandler, (new ResourceCallback)); |
- return callbackHandler; |
-} |
- |
-DEFINE_TRACE(Resource::ResourceCallback) |
-{ |
- visitor->trace(m_resourcesWithPendingClients); |
-} |
- |
-Resource::ResourceCallback::ResourceCallback() |
- : m_callbackTaskFactory(CancellableTaskFactory::create(this, &ResourceCallback::runTask)) |
-{ |
-} |
- |
-void Resource::ResourceCallback::schedule(Resource* resource) |
-{ |
- if (!m_callbackTaskFactory->isPending()) |
- Platform::current()->currentThread()->scheduler()->loadingTaskRunner()->postTask(BLINK_FROM_HERE, m_callbackTaskFactory->cancelAndCreate()); |
- m_resourcesWithPendingClients.add(resource); |
-} |
- |
-void Resource::ResourceCallback::cancel(Resource* resource) |
-{ |
- m_resourcesWithPendingClients.remove(resource); |
- if (m_callbackTaskFactory->isPending() && m_resourcesWithPendingClients.isEmpty()) |
- m_callbackTaskFactory->cancel(); |
-} |
- |
-bool Resource::ResourceCallback::isScheduled(Resource* resource) const |
-{ |
- return m_resourcesWithPendingClients.contains(resource); |
-} |
- |
-void Resource::ResourceCallback::runTask() |
-{ |
- HeapVector<Member<Resource>> resources; |
- for (const Member<Resource>& resource : m_resourcesWithPendingClients) |
- resources.append(resource.get()); |
- m_resourcesWithPendingClients.clear(); |
- |
- for (const auto& resource : resources) |
- resource->finishPendingClients(); |
-} |
- |
Resource::Resource(const ResourceRequest& request, Type type, const ResourceLoaderOptions& options) |
: m_resourceRequest(request) |
, m_options(options) |
@@ -676,7 +609,7 @@ |
// If we have existing data to send to the new client and the resource type supprts it, send it asynchronously. |
if (!m_response.isNull() && !shouldSendCachedDataSynchronouslyForType(getType()) && !m_needsSynchronousCacheHit) { |
m_clientsAwaitingCallback.add(client); |
- ResourceCallback::callbackHandler().schedule(this); |
+ ResourceCallback::callbackHandler()->schedule(this); |
return; |
} |
@@ -696,7 +629,7 @@ |
m_clients.remove(client); |
if (m_clientsAwaitingCallback.isEmpty()) |
- ResourceCallback::callbackHandler().cancel(this); |
+ ResourceCallback::callbackHandler()->cancel(this); |
didRemoveClientOrObserver(); |
// This object may be dead here. |
@@ -794,9 +727,9 @@ |
// It is still possible for the above loop to finish a new client synchronously. |
// If there's no client waiting we should deschedule. |
- bool scheduled = ResourceCallback::callbackHandler().isScheduled(this); |
+ bool scheduled = ResourceCallback::callbackHandler()->isScheduled(this); |
if (scheduled && m_clientsAwaitingCallback.isEmpty()) |
- ResourceCallback::callbackHandler().cancel(this); |
+ ResourceCallback::callbackHandler()->cancel(this); |
// Prevent the case when there are clients waiting but no callback scheduled. |
ASSERT(m_clientsAwaitingCallback.isEmpty() || scheduled); |
@@ -977,6 +910,60 @@ |
m_resourceRequest.setPriority(loadPriority, intraPriorityValue); |
if (m_loader) |
m_loader->didChangePriority(loadPriority, intraPriorityValue); |
+} |
+ |
+Resource::ResourceCallback* Resource::ResourceCallback::callbackHandler() |
+{ |
+ // Oilpan + LSan: as the callbackHandler() singleton is used by Resource |
+ // and ResourcePtr finalizers, it cannot be released upon shutdown in |
+ // preparation for leak detection. |
+ // |
+ // Keep it out of LSan's reach instead. |
+ LEAK_SANITIZER_DISABLED_SCOPE; |
+ DEFINE_STATIC_LOCAL(Persistent<ResourceCallback>, callbackHandler, (new ResourceCallback)); |
+ return callbackHandler.get(); |
+} |
+ |
+DEFINE_TRACE(Resource::ResourceCallback) |
+{ |
+#if ENABLE(OILPAN) |
+ visitor->trace(m_resourcesWithPendingClients); |
+#endif |
+} |
+ |
+Resource::ResourceCallback::ResourceCallback() |
+ : m_callbackTaskFactory(CancellableTaskFactory::create(this, &ResourceCallback::runTask)) |
+{ |
+} |
+ |
+void Resource::ResourceCallback::schedule(Resource* resource) |
+{ |
+ if (!m_callbackTaskFactory->isPending()) |
+ Platform::current()->currentThread()->scheduler()->loadingTaskRunner()->postTask(BLINK_FROM_HERE, m_callbackTaskFactory->cancelAndCreate()); |
+ m_resourcesWithPendingClients.add(resource); |
+} |
+ |
+void Resource::ResourceCallback::cancel(Resource* resource) |
+{ |
+ m_resourcesWithPendingClients.remove(resource); |
+ if (m_callbackTaskFactory->isPending() && m_resourcesWithPendingClients.isEmpty()) |
+ m_callbackTaskFactory->cancel(); |
+} |
+ |
+bool Resource::ResourceCallback::isScheduled(Resource* resource) const |
+{ |
+ return m_resourcesWithPendingClients.contains(resource); |
+} |
+ |
+void Resource::ResourceCallback::runTask() |
+{ |
+ HeapVector<Member<Resource>> resources; |
+ for (const Member<Resource>& resource : m_resourcesWithPendingClients) |
+ resources.append(resource.get()); |
+ m_resourcesWithPendingClients.clear(); |
+ |
+ for (const auto& resource : resources) |
+ resource->finishPendingClients(); |
} |
static const char* initatorTypeNameToString(const AtomicString& initiatorTypeName) |