diff options
author | davidben@chromium.org <davidben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-20 03:59:18 +0000 |
---|---|---|
committer | davidben@chromium.org <davidben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-20 03:59:18 +0000 |
commit | 146b8b276bc5388c25482c78d270e7fa773e3cc5 (patch) | |
tree | fa6608a7bbb88a7b71e146b6cfa642be51493d92 /content/browser/loader/detachable_resource_handler.h | |
parent | f967658e63c06a3fe1b505375d14bead8b35eb0b (diff) | |
download | chromium_src-146b8b276bc5388c25482c78d270e7fa773e3cc5.zip chromium_src-146b8b276bc5388c25482c78d270e7fa773e3cc5.tar.gz chromium_src-146b8b276bc5388c25482c78d270e7fa773e3cc5.tar.bz2 |
Allow prefetches to outlive their owning RenderViewHost.
This is a rework of r231910. Instead of putting the detachable logic in
AsyncResourceHandler, move it to a wrapper DetachableResourceHandler. On
detach, it simulates a cancel to the ResourceHandler it wraps and then
continues to drain the request itself. This should have fewer buffering
complications.
BUG=286186
TEST=ResourceDispatcherHostTest.Cancel,
ResourceDispatcherHostTest.DetachedResourceTimesOut,
ResourceDispatcherHostTest.DeletedFilterDetached,
ResourceDispatcherHostTest.DeletedFilterDetachedRedirect,
ResourceDispatcherHostTest.DetachWhileStartIsDeferred
ResourceDispatcherHostTest.TestProcessCancelDetachedTimeout,
ResourceDispatcherHostTest.CancelRequestsForContextDetached,
ResourceDispatcherHostTest.DataSentBeforeDetach
Review URL: https://codereview.chromium.org/59783003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@236132 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/loader/detachable_resource_handler.h')
-rw-r--r-- | content/browser/loader/detachable_resource_handler.h | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/content/browser/loader/detachable_resource_handler.h b/content/browser/loader/detachable_resource_handler.h new file mode 100644 index 0000000..990084d --- /dev/null +++ b/content/browser/loader/detachable_resource_handler.h @@ -0,0 +1,94 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_LOADER_DETACHABLE_RESOURCE_HANDLER_H_ +#define CONTENT_BROWSER_LOADER_DETACHABLE_RESOURCE_HANDLER_H_ + +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "base/time/time.h" +#include "base/timer/timer.h" +#include "content/browser/loader/resource_handler.h" +#include "content/public/browser/resource_controller.h" + +namespace net { +class IOBuffer; +class URLRequest; +} // namespace net + +namespace content { + +// A ResourceHandler which delegates all calls to the next handler, unless +// detached. Once detached, it drives the request to completion itself. This is +// used for requests which outlive the owning renderer, such as <link +// rel=prefetch> and <a ping>. Requests do not start out detached so, e.g., +// prefetches appear in DevTools and get placed in the renderer's local +// cache. If the request does not complete after a timeout on detach, it is +// cancelled. +// +// Note that, once detached, the request continues without the original next +// handler, so any policy decisions in that handler are skipped. +class DetachableResourceHandler : public ResourceHandler, + public ResourceController { + public: + DetachableResourceHandler(net::URLRequest* request, + base::TimeDelta cancel_delay, + scoped_ptr<ResourceHandler> next_handler); + virtual ~DetachableResourceHandler(); + + bool is_detached() const { return next_handler_ == NULL; } + void Detach(); + + void set_cancel_delay(base::TimeDelta cancel_delay) { + cancel_delay_ = cancel_delay; + } + + // ResourceHandler implementation: + virtual void SetController(ResourceController* controller) OVERRIDE; + virtual bool OnUploadProgress(int request_id, uint64 position, + uint64 size) OVERRIDE; + virtual bool OnRequestRedirected(int request_id, const GURL& url, + ResourceResponse* response, + bool* defer) OVERRIDE; + virtual bool OnResponseStarted(int request_id, + ResourceResponse* response, + bool* defer) OVERRIDE; + virtual bool OnWillStart(int request_id, const GURL& url, + bool* defer) OVERRIDE; + virtual bool OnWillRead(int request_id, + scoped_refptr<net::IOBuffer>* buf, + int* buf_size, + int min_size) OVERRIDE; + virtual bool OnReadCompleted(int request_id, int bytes_read, + bool* defer) OVERRIDE; + virtual void OnResponseCompleted(int request_id, + const net::URLRequestStatus& status, + const std::string& security_info, + bool* defer) OVERRIDE; + virtual void OnDataDownloaded(int request_id, int bytes_downloaded) OVERRIDE; + + // ResourceController implementation: + virtual void Resume() OVERRIDE; + virtual void Cancel() OVERRIDE; + virtual void CancelAndIgnore() OVERRIDE; + virtual void CancelWithError(int error_code) OVERRIDE; + + private: + scoped_ptr<ResourceHandler> next_handler_; + scoped_refptr<net::IOBuffer> read_buffer_; + + scoped_ptr<base::OneShotTimer<DetachableResourceHandler> > detached_timer_; + base::TimeDelta cancel_delay_; + + bool is_deferred_; + bool is_finished_; + + DISALLOW_COPY_AND_ASSIGN(DetachableResourceHandler); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_LOADER_DETACHABLE_RESOURCE_HANDLER_H_ |