web_bundle_url_loader_factory.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef COMPONENTS_WEB_PACKAGE_WEB_BUNDLE_URL_LOADER_FACTORY_H_
  5. #define COMPONENTS_WEB_PACKAGE_WEB_BUNDLE_URL_LOADER_FACTORY_H_
  6. #include <vector>
  7. #include "base/memory/raw_ptr.h"
  8. #include "base/memory/weak_ptr.h"
  9. #include "components/web_package/mojom/web_bundle_parser.mojom.h"
  10. #include "mojo/public/cpp/bindings/remote.h"
  11. #include "services/network/public/cpp/corb/corb_api.h"
  12. #include "services/network/public/cpp/cross_origin_embedder_policy.h"
  13. #include "services/network/public/cpp/resource_request.h"
  14. #include "services/network/public/mojom/devtools_observer.mojom.h"
  15. #include "services/network/public/mojom/network_context.mojom.h"
  16. #include "services/network/public/mojom/web_bundle_handle.mojom.h"
  17. #include "third_party/abseil-cpp/absl/types/optional.h"
  18. namespace web_package {
  19. class WebBundleMemoryQuotaConsumer;
  20. class WebBundleURLLoaderFactory {
  21. public:
  22. // Used for UMA. Append-only.
  23. enum class SubresourceWebBundleLoadResult {
  24. kSuccess = 0,
  25. kMetadataParseError = 1,
  26. kMemoryQuotaExceeded = 2,
  27. kServingConstraintsNotMet = 3,
  28. kWebBundleFetchFailed = 4,
  29. kWebBundleRedirected = 5,
  30. kMaxValue = kWebBundleRedirected,
  31. };
  32. WebBundleURLLoaderFactory(
  33. const GURL& bundle_url,
  34. const network::ResourceRequest::WebBundleTokenParams&
  35. web_bundle_token_params,
  36. mojo::Remote<network::mojom::WebBundleHandle> web_bundle_handle,
  37. std::unique_ptr<WebBundleMemoryQuotaConsumer>
  38. web_bundle_memory_quota_consumer,
  39. mojo::PendingRemote<network::mojom::DevToolsObserver> devtools_observer,
  40. absl::optional<std::string> devtools_request_id,
  41. const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy,
  42. network::mojom::CrossOriginEmbedderPolicyReporter* coep_reporter);
  43. ~WebBundleURLLoaderFactory();
  44. WebBundleURLLoaderFactory(const WebBundleURLLoaderFactory&) = delete;
  45. WebBundleURLLoaderFactory& operator=(const WebBundleURLLoaderFactory&) =
  46. delete;
  47. base::WeakPtr<WebBundleURLLoaderFactory> GetWeakPtr() const;
  48. void SetBundleStream(mojo::ScopedDataPipeConsumerHandle body);
  49. void ReportErrorAndCancelPendingLoaders(
  50. SubresourceWebBundleLoadResult result,
  51. network::mojom::WebBundleErrorType error,
  52. const std::string& message);
  53. mojo::PendingRemote<network::mojom::URLLoaderClient> MaybeWrapURLLoaderClient(
  54. mojo::PendingRemote<network::mojom::URLLoaderClient> wrapped);
  55. void StartSubresourceRequest(
  56. mojo::PendingReceiver<network::mojom::URLLoader> receiver,
  57. const network::ResourceRequest& url_request,
  58. mojo::PendingRemote<network::mojom::URLLoaderClient> client,
  59. mojo::Remote<network::mojom::TrustedHeaderClient> trusted_header_client,
  60. base::Time request_start_time,
  61. base::TimeTicks request_start_time_ticks);
  62. void OnWebBundleFetchFailed();
  63. private:
  64. class BundleDataSource;
  65. class URLLoader;
  66. bool HasError() const;
  67. void OnBeforeSendHeadersComplete(
  68. base::WeakPtr<URLLoader> loader,
  69. int result,
  70. const absl::optional<net::HttpRequestHeaders>& headers);
  71. void QueueOrStartLoader(base::WeakPtr<URLLoader> loader);
  72. void StartLoad(base::WeakPtr<URLLoader> loader);
  73. void OnMetadataParsed(web_package::mojom::BundleMetadataPtr metadata,
  74. web_package::mojom::BundleMetadataParseErrorPtr error);
  75. bool IsAllowedExchangeUrl(const GURL& relative_url);
  76. void OnResponseParsed(base::WeakPtr<URLLoader> loader,
  77. web_package::mojom::BundleResponsePtr response,
  78. web_package::mojom::BundleResponseParseErrorPtr error);
  79. void OnHeadersReceivedComplete(
  80. base::WeakPtr<URLLoader> loader,
  81. const std::string& original_header,
  82. uint64_t payload_offset,
  83. uint64_t payload_length,
  84. int result,
  85. const absl::optional<std::string>& headers,
  86. const absl::optional<GURL>& preserve_fragment_on_redirect_url);
  87. void SendResponseToLoader(base::WeakPtr<URLLoader> loader,
  88. const std::string& headers,
  89. uint64_t payload_offset,
  90. uint64_t payload_length);
  91. void OnMemoryQuotaExceeded();
  92. void OnDataCompleted();
  93. void MaybeReportLoadResult(SubresourceWebBundleLoadResult result);
  94. GURL bundle_url_;
  95. mojo::Remote<network::mojom::WebBundleHandle> web_bundle_handle_;
  96. const absl::optional<::url::Origin> request_initiator_origin_lock_;
  97. std::unique_ptr<WebBundleMemoryQuotaConsumer>
  98. web_bundle_memory_quota_consumer_;
  99. mojo::Remote<network::mojom::DevToolsObserver> devtools_observer_;
  100. absl::optional<std::string> devtools_request_id_;
  101. const network::CrossOriginEmbedderPolicy cross_origin_embedder_policy_;
  102. raw_ptr<network::mojom::CrossOriginEmbedderPolicyReporter> coep_reporter_;
  103. std::unique_ptr<BundleDataSource> source_;
  104. mojo::Remote<web_package::mojom::WebBundleParser> parser_;
  105. web_package::mojom::BundleMetadataPtr metadata_;
  106. absl::optional<SubresourceWebBundleLoadResult> load_result_;
  107. bool data_completed_ = false;
  108. std::vector<base::WeakPtr<URLLoader>> pending_loaders_;
  109. network::corb::PerFactoryState corb_state_;
  110. base::WeakPtrFactory<WebBundleURLLoaderFactory> weak_ptr_factory_{this};
  111. };
  112. } // namespace web_package
  113. #endif // COMPONENTS_WEB_PACKAGE_WEB_BUNDLE_URL_LOADER_FACTORY_H_