Commit 08d9e1d2 authored by Yutaka Hirano's avatar Yutaka Hirano Committed by Commit Bot

Keep DocumentThreadableLoader for keepalive requests

...in order to make the logic work after frame detach.
This CL also removes Resource::SetDetachable which is no longer needed.

Bug: 836641
Change-Id: I6ebc978021cafa9a6337afab5de29532fc28c4c1
Reviewed-on: https://chromium-review.googlesource.com/1027210Reviewed-by: default avatarTakashi Toyoshima <toyoshim@chromium.org>
Commit-Queue: Yutaka Hirano <yhirano@chromium.org>
Cr-Commit-Position: refs/heads/master@{#553526}
parent 7cbf8d00
...@@ -146,6 +146,27 @@ class EmptyDataHandle final : public WebDataConsumerHandle { ...@@ -146,6 +146,27 @@ class EmptyDataHandle final : public WebDataConsumerHandle {
} // namespace } // namespace
// DetachedClient is a ThreadableLoaderClient for a "detached"
// DocumentThreadableLoader. It's for fetch requests with keepalive set, so
// it keeps itself alive during loading.
class DocumentThreadableLoader::DetachedClient final
: public GarbageCollectedFinalized<DetachedClient>,
public ThreadableLoaderClient {
public:
DetachedClient() : self_keep_alive_(this) {}
~DetachedClient() override {}
void DidFinishLoading(unsigned long identifier, double finish_time) override {
self_keep_alive_.Clear();
}
void DidFail(const ResourceError&) override { self_keep_alive_.Clear(); }
void DidFailRedirectCheck() override { self_keep_alive_.Clear(); }
void Trace(Visitor* visitor) {}
private:
SelfKeepAlive<DetachedClient> self_keep_alive_;
};
// Max number of CORS redirects handled in DocumentThreadableLoader. Same number // Max number of CORS redirects handled in DocumentThreadableLoader. Same number
// as net/url_request/url_request.cc, and same number as // as net/url_request/url_request.cc, and same number as
// https://fetch.spec.whatwg.org/#concept-http-fetch, Step 4. // https://fetch.spec.whatwg.org/#concept-http-fetch, Step 4.
...@@ -546,9 +567,9 @@ void DocumentThreadableLoader::Cancel() { ...@@ -546,9 +567,9 @@ void DocumentThreadableLoader::Cancel() {
void DocumentThreadableLoader::Detach() { void DocumentThreadableLoader::Detach() {
Resource* resource = GetResource(); Resource* resource = GetResource();
if (resource) if (!resource)
resource->SetDetachable(); return;
Clear(); client_ = new DetachedClient();
} }
void DocumentThreadableLoader::SetDefersLoading(bool value) { void DocumentThreadableLoader::SetDefersLoading(bool value) {
......
...@@ -88,6 +88,7 @@ class CORE_EXPORT DocumentThreadableLoader final : public ThreadableLoader, ...@@ -88,6 +88,7 @@ class CORE_EXPORT DocumentThreadableLoader final : public ThreadableLoader,
void Trace(blink::Visitor*) override; void Trace(blink::Visitor*) override;
private: private:
class DetachedClient;
enum BlockingBehavior { kLoadSynchronously, kLoadAsynchronously }; enum BlockingBehavior { kLoadSynchronously, kLoadAsynchronously };
static std::unique_ptr<ResourceRequest> CreateAccessControlPreflightRequest( static std::unique_ptr<ResourceRequest> CreateAccessControlPreflightRequest(
......
...@@ -704,7 +704,7 @@ void Resource::DidRemoveClientOrObserver() { ...@@ -704,7 +704,7 @@ void Resource::DidRemoveClientOrObserver() {
} }
void Resource::AllClientsAndObserversRemoved() { void Resource::AllClientsAndObserversRemoved() {
if (loader_ && !detachable_) if (loader_)
loader_->ScheduleCancel(); loader_->ScheduleCancel();
} }
......
...@@ -166,9 +166,6 @@ class PLATFORM_EXPORT Resource : public GarbageCollectedFinalized<Resource>, ...@@ -166,9 +166,6 @@ class PLATFORM_EXPORT Resource : public GarbageCollectedFinalized<Resource>,
// base::SingleThreadTaskRunner is unused. // base::SingleThreadTaskRunner is unused.
void AddClient(ResourceClient*, base::SingleThreadTaskRunner*); void AddClient(ResourceClient*, base::SingleThreadTaskRunner*);
void RemoveClient(ResourceClient*); void RemoveClient(ResourceClient*);
// Once called, this resource will not be canceled until load finishes
// even if associated with no client.
void SetDetachable() { detachable_ = true; }
// If this Resource is already finished when AddFinishObserver is called, the // If this Resource is already finished when AddFinishObserver is called, the
// ResourceFinishObserver will be notified asynchronously by a task scheduled // ResourceFinishObserver will be notified asynchronously by a task scheduled
...@@ -521,7 +518,6 @@ class PLATFORM_EXPORT Resource : public GarbageCollectedFinalized<Resource>, ...@@ -521,7 +518,6 @@ class PLATFORM_EXPORT Resource : public GarbageCollectedFinalized<Resource>,
bool is_add_remove_client_prohibited_; bool is_add_remove_client_prohibited_;
bool is_revalidation_start_forbidden_ = false; bool is_revalidation_start_forbidden_ = false;
bool is_unused_preload_ = false; bool is_unused_preload_ = false;
bool detachable_ = false;
ResourceIntegrityDisposition integrity_disposition_; ResourceIntegrityDisposition integrity_disposition_;
SubresourceIntegrity::ReportInfo integrity_report_info_; SubresourceIntegrity::ReportInfo integrity_report_info_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment