blob: 91e01c8c81bcae6168f548200c510d2b5ae809a5 [file] [log] [blame]
// Copyright 2017 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 COMPONENTS_SAFE_BROWSING_BROWSER_BASE_PARALLEL_RESOURCE_THROTTLE_H_
#define COMPONENTS_SAFE_BROWSING_BROWSER_BASE_PARALLEL_RESOURCE_THROTTLE_H_
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "content/public/browser/resource_throttle.h"
#include "content/public/common/resource_type.h"
#include "content/public/common/url_loader_throttle.h"
namespace net {
class URLRequest;
}
namespace safe_browsing {
class BrowserURLLoaderThrottle;
class UrlCheckerDelegate;
// A thin wrapper around BrowserURLLoaderThrottle to adapt to the
// content::ResourceThrottle interface.
class BaseParallelResourceThrottle : public content::ResourceThrottle {
protected:
BaseParallelResourceThrottle(
const net::URLRequest* request,
content::ResourceType resource_type,
scoped_refptr<UrlCheckerDelegate> url_checker_delegate);
~BaseParallelResourceThrottle() override;
// content::ResourceThrottle implementation:
void WillStartRequest(bool* defer) override;
void WillRedirectRequest(const net::RedirectInfo& redirect_info,
bool* defer) override;
void WillProcessResponse(bool* defer) override;
const char* GetNameForLogging() override;
bool MustProcessResponseBeforeReadingBody() override;
// Cancels the resource load. This calls ResourceThrottle::Cancel() but also
// maintains internal state. It may be overridden in a subclass. The override
// in subclass should call this base implementation for cancellation, instead
// of calling ResourceThrottle::Cancel() directly.
virtual void CancelResourceLoad();
private:
class URLLoaderThrottleHolder;
void ResumeResourceLoad();
void MayDeferCancelResourceLoad();
const net::URLRequest* const request_;
const content::ResourceType resource_type_;
// Set to true if the throttle is currently either inside a ResourceThrottle
// notification call or responsible for deferring the request.
bool throttle_in_band_ = false;
// Whether we should directly cancel the request on subsequent
// ResourceThrottle notification calls.
bool should_cancel_on_notification_ = false;
std::unique_ptr<URLLoaderThrottleHolder> url_loader_throttle_holder_;
DISALLOW_COPY_AND_ASSIGN(BaseParallelResourceThrottle);
};
} // namespace safe_browsing
#endif // COMPONENTS_SAFE_BROWSING_BROWSER_BASE_PARALLEL_RESOURCE_THROTTLE_H_