| Index: content/child/throttling_url_loader.h | 
| diff --git a/content/child/throttling_url_loader.h b/content/child/throttling_url_loader.h | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..5f3b0889287d77a68950c9961139e4d024861dd7 | 
| --- /dev/null | 
| +++ b/content/child/throttling_url_loader.h | 
| @@ -0,0 +1,117 @@ | 
| +// 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 CONTENT_CHILD_THROTTLING_URL_LOADER_H_ | 
| +#define CONTENT_CHILD_THROTTLING_URL_LOADER_H_ | 
| + | 
| +#include <memory> | 
| + | 
| +#include "content/common/content_export.h" | 
| +#include "content/common/url_loader.mojom.h" | 
| +#include "content/common/url_loader_factory.mojom.h" | 
| +#include "content/public/child/url_loader_throttle.h" | 
| +#include "mojo/public/cpp/bindings/binding.h" | 
| + | 
| +namespace content { | 
| + | 
| +namespace mojom { | 
| +class URLLoaderFactory; | 
| +} | 
| + | 
| +// ThrottlingURLLoader is a wrapper around the mojom::URLLoader[Factory] | 
| +// interfaces. It applies a list of URLLoaderThrottle instances which could | 
| +// defer, resume or cancel the URL loading. | 
| +class CONTENT_EXPORT ThrottlingURLLoader : public mojom::URLLoaderClient, | 
| +                                           public URLLoaderThrottle::Delegate { | 
| + public: | 
| +  // |factory| and |client| must stay alive during the lifetime of the returned | 
| +  // object. | 
| +  static std::unique_ptr<ThrottlingURLLoader> CreateLoaderAndStart( | 
| +      mojom::URLLoaderFactory* factory, | 
| +      std::vector<std::unique_ptr<URLLoaderThrottle>> throttles, | 
| +      int32_t routing_id, | 
| +      int32_t request_id, | 
| +      uint32_t options, | 
| +      std::unique_ptr<ResourceRequest> url_request, | 
| +      mojom::URLLoaderClient* client); | 
| + | 
| +  ~ThrottlingURLLoader() override; | 
| + | 
| +  void FollowRedirect(); | 
| +  void SetPriority(net::RequestPriority priority, int32_t intra_priority_value); | 
| + | 
| + private: | 
| +  ThrottlingURLLoader(std::vector<std::unique_ptr<URLLoaderThrottle>> throttles, | 
| +                      mojom::URLLoaderClient* client); | 
| + | 
| +  void Start(mojom::URLLoaderFactory* factory, | 
| +             int32_t routing_id, | 
| +             int32_t request_id, | 
| +             uint32_t options, | 
| +             std::unique_ptr<ResourceRequest> url_request); | 
| + | 
| +  // mojom::URLLoaderClient implementation: | 
| +  void OnReceiveResponse(const ResourceResponseHead& response_head, | 
| +                         const base::Optional<net::SSLInfo>& ssl_info, | 
| +                         mojom::DownloadedTempFilePtr downloaded_file) override; | 
| +  void OnReceiveRedirect(const net::RedirectInfo& redirect_info, | 
| +                         const ResourceResponseHead& response_head) override; | 
| +  void OnDataDownloaded(int64_t data_len, int64_t encoded_data_len) override; | 
| +  void OnUploadProgress(int64_t current_position, | 
| +                        int64_t total_size, | 
| +                        OnUploadProgressCallback ack_callback) override; | 
| +  void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override; | 
| +  void OnTransferSizeUpdated(int32_t transfer_size_diff) override; | 
| +  void OnStartLoadingResponseBody( | 
| +      mojo::ScopedDataPipeConsumerHandle body) override; | 
| +  void OnComplete(const ResourceRequestCompletionStatus& status) override; | 
| + | 
| +  // URLLoaderThrottle::Delegate: | 
| +  void CancelWithError(int error_code) override; | 
| +  void Resume() override; | 
| + | 
| +  enum DeferredStage { | 
| +    DEFERRED_NONE, | 
| +    DEFERRED_START, | 
| +    DEFERRED_REDIRECT, | 
| +    DEFERRED_RESPONSE | 
| +  }; | 
| +  DeferredStage deferred_stage_ = DEFERRED_NONE; | 
| +  bool cancelled_by_throttle_ = false; | 
| + | 
| +  std::unique_ptr<URLLoaderThrottle> throttle_; | 
| + | 
| +  mojom::URLLoaderClient* forwarding_client_; | 
| +  mojo::Binding<mojom::URLLoaderClient> client_binding_; | 
| + | 
| +  mojom::URLLoaderPtr url_loader_; | 
| + | 
| +  // Set if start is deferred. | 
| +  mojom::URLLoaderFactory* url_loader_factory_ = nullptr; | 
| +  int32_t routing_id_ = -1; | 
| +  int32_t request_id_ = -1; | 
| +  uint32_t options_ = mojom::kURLLoadOptionNone; | 
| +  std::unique_ptr<ResourceRequest> url_request_; | 
| + | 
| +  // Set if either response or redirect is deferred. | 
| +  ResourceResponseHead response_head_; | 
| + | 
| +  // Set if response is deferred. | 
| +  base::Optional<net::SSLInfo> ssl_info_; | 
| +  mojom::DownloadedTempFilePtr downloaded_file_; | 
| + | 
| +  // Set if redirect is deferred. | 
| +  net::RedirectInfo redirect_info_; | 
| + | 
| +  // Set if request is deferred and SetPriority() is called. | 
| +  bool set_priority_cached_ = false; | 
| +  net::RequestPriority priority_ = net::MINIMUM_PRIORITY; | 
| +  int32_t intra_priority_value_ = 0; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(ThrottlingURLLoader); | 
| +}; | 
| + | 
| +}  // namespace content | 
| + | 
| +#endif  // CONTENT_CHILD_THROTTLING_URL_LOADER_H_ | 
|  |