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

Unified Diff: content/browser/loader/resource_loader.h

Issue 2526983002: Refactor ResourceHandler API. (Closed)
Patch Set: Silly merge Created 3 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/loader/resource_loader.h
diff --git a/content/browser/loader/resource_loader.h b/content/browser/loader/resource_loader.h
index 40603a4556a9531f9af6eaf1adc933fd186d2f1b..42cc27eac73065ab8b5e4dea29aa684df7c1a40d 100644
--- a/content/browser/loader/resource_loader.h
+++ b/content/browser/loader/resource_loader.h
@@ -12,6 +12,7 @@
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "content/browser/loader/resource_controller.h"
+#include "content/browser/loader/resource_handler.h"
#include "content/browser/ssl/ssl_client_auth_handler.h"
#include "content/browser/ssl/ssl_error_handler.h"
#include "content/common/content_export.h"
@@ -34,7 +35,7 @@ class ResourceRequestInfoImpl;
class CONTENT_EXPORT ResourceLoader : public net::URLRequest::Delegate,
public SSLErrorHandler::Delegate,
public SSLClientAuthHandler::Delegate,
- public ResourceController {
+ public ResourceHandler::Delegate {
public:
ResourceLoader(std::unique_ptr<net::URLRequest> request,
std::unique_ptr<ResourceHandler> handler,
@@ -53,7 +54,13 @@ class CONTENT_EXPORT ResourceLoader : public net::URLRequest::Delegate,
void ClearLoginDelegate();
+ // ResourceHandler::Delegate implementation:
+ void OutOfBandCancel(int error_code, bool tell_renderer) override;
+
private:
+ // ResourceController implementation for the ResourceLoader.
+ class Controller;
+
// net::URLRequest::Delegate implementation:
void OnReceivedRedirect(net::URLRequest* request,
const net::RedirectInfo& redirect_info,
@@ -76,17 +83,23 @@ class CONTENT_EXPORT ResourceLoader : public net::URLRequest::Delegate,
void ContinueWithCertificate(net::X509Certificate* cert) override;
void CancelCertificateSelection() override;
- // ResourceController implementation:
- void Resume() override;
- void Cancel() override;
- void CancelAndIgnore() override;
- void CancelWithError(int error_code) override;
+ // These correspond to Controller's methods.
+ // TODO(mmenke): Seems like this could be simplified a little.
+
+ // |called_from_resource_controller| is true if called directly from a
+ // ResourceController, in which case |resource_handler_| must not be invoked
+ // or destroyed synchronously to avoid re-entrancy issues, and false
+ // otherwise.
+ void Resume(bool called_from_resource_controller);
Charlie Harrison 2017/01/25 20:23:00 Personal preference: I really dislike bare bools p
mmenke 2017/01/25 22:08:00 I think this is reasonable. I went with labeling
+ void Cancel();
+ void CancelAndIgnore();
+ void CancelWithError(int error_code);
void StartRequestInternal();
void CancelRequestInternal(int error, bool from_renderer);
void FollowDeferredRedirectInternal();
void CompleteResponseStarted();
- void ReadMore(bool is_continuation);
+ void ReadMore(bool called_from_resource_controller);
void ResumeReading();
// Passes a read result to the handler.
void CompleteRead(int bytes_read);
@@ -110,6 +123,12 @@ class CONTENT_EXPORT ResourceLoader : public net::URLRequest::Delegate,
enum DeferredStage {
DEFERRED_NONE,
+ // Magic deferral "stage" which means that the code is currently in a
+ // recursive call from the ResourceLoader. When in this state, Resume() does
+ // nothing but update the deferral state, and when the stack is unwound back
+ // up to the ResourceLoader, the request will be continued. This is used to
+ // prevent the stack from getting too deep.
+ DEFERRED_SYNC,
DEFERRED_START,
DEFERRED_REDIRECT,
DEFERRED_READ,
@@ -118,6 +137,8 @@ class CONTENT_EXPORT ResourceLoader : public net::URLRequest::Delegate,
};
DeferredStage deferred_stage_;
+ class ScopedDeferral;
+
std::unique_ptr<net::URLRequest> request_;
std::unique_ptr<ResourceHandler> handler_;
ResourceLoaderDelegate* delegate_;

Powered by Google App Engine
This is Rietveld 408576698