| // Copyright 2024 The Chromium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_PRELOAD_STORAGE_H_ | |
| #define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_PRELOAD_STORAGE_H_ | |
| #include <map> | |
| #include <optional> | |
| #include <string> | |
| #include <vector> | |
| #include "base/unguessable_token.h" | |
| #include "content/browser/preloading/prefetch/prefetch_status.h" | |
| #include "content/browser/preloading/prerender/prerender_final_status.h" | |
| #include "content/browser/preloading/prerender/prerender_metrics.h" | |
| #include "content/public/browser/document_user_data.h" | |
| #include "content/public/browser/preloading.h" | |
| #include "net/http/http_request_headers.h" | |
| #include "services/network/public/cpp/headers_matcher.h" | |
| #include "third_party/blink/public/mojom/speculation_rules/speculation_rules.mojom-forward.h" | |
| #include "url/gurl.h" | |
| namespace content { | |
| // Stores details from the latest status update reported to DevTools for | |
| // prefetches and prerenders initiated by a document. Used to persist these | |
| // details so that they can be sent to new DevTools sessions that are | |
| // created/enabled after the update happened. | |
| class DevToolsPreloadStorage : public DocumentUserData<DevToolsPreloadStorage> { | |
| public: | |
| ~DevToolsPreloadStorage() override; | |
| void UpdatePrefetchStatus(const GURL& prefetch_url, | |
| const base::UnguessableToken& preload_pipeline_id, | |
| PreloadingTriggeringOutcome outcome, | |
| PrefetchStatus status, | |
| const std::string& request_id); | |
| void UpdatePrerenderStatus( | |
| blink::mojom::SpeculationAction action, | |
| std::optional<blink::mojom::SpeculationAction> effective_action, | |
| const GURL& prerender_url, | |
| bool form_submission, | |
| std::optional<blink::mojom::SpeculationTargetHint> target_hint, | |
| const base::UnguessableToken& preload_pipeline_id, | |
| PreloadingTriggeringOutcome outcome, | |
| std::optional<PrerenderFinalStatus> status, | |
| const std::optional<std::string>& disallowed_mojo_interface, | |
| const std::vector<network::MismatchedHttpRequestHeader>* | |
| mismatched_headers); | |
| void SpeculationCandidatesUpdated( | |
| const std::vector<blink::mojom::SpeculationCandidatePtr>& candidates); | |
| using PrefetchKey = GURL; | |
| struct PrefetchData { | |
| base::UnguessableToken preload_pipeline_id; | |
| PreloadingTriggeringOutcome outcome; | |
| PrefetchStatus status; | |
| std::string request_id; | |
| }; | |
| using PrefetchDataMap = std::map<PrefetchKey, PrefetchData>; | |
| const PrefetchDataMap& prefetch_data_map() { return prefetch_data_map_; } | |
| struct PrerenderKey { | |
| GURL prerender_url; | |
| bool form_submission; | |
| std::optional<blink::mojom::SpeculationTargetHint> target_hint; | |
| auto operator<=>(const PrerenderKey&) const = default; | |
| }; | |
| struct PrerenderData { | |
| PrerenderData(); | |
| PrerenderData(const PrerenderData& other); | |
| PrerenderData(PrerenderData&& other); | |
| PrerenderData& operator=(const PrerenderData& other); | |
| PrerenderData& operator=(PrerenderData&& other); | |
| ~PrerenderData(); | |
| base::UnguessableToken preload_pipeline_id; | |
| PreloadingTriggeringOutcome outcome; | |
| // The action currently performed while the map key retains the immutable | |
| // action that originally created the attempt. | |
| std::optional<blink::mojom::SpeculationAction> effective_action; | |
| std::optional<PrerenderFinalStatus> status; | |
| std::optional<std::string> disallowed_mojo_interface; | |
| std::vector<network::MismatchedHttpRequestHeader> mismatched_headers; | |
| }; | |
| using PrerenderDataMap = std::map<PrerenderKey, PrerenderData>; | |
| const PrerenderDataMap& prerender_data_map() { return prerender_data_map_; } | |
| const PrerenderDataMap& prerender_until_script_data_map() { | |
| return prerender_until_script_data_map_; | |
| } | |
| private: | |
| explicit DevToolsPreloadStorage(RenderFrameHost* rfh); | |
| friend DocumentUserData; | |
| DOCUMENT_USER_DATA_KEY_DECL(); | |
| PrefetchDataMap prefetch_data_map_; | |
| PrerenderDataMap prerender_data_map_; | |
| PrerenderDataMap prerender_until_script_data_map_; | |
| }; | |
| } // namespace content | |
| #endif // CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_PRELOAD_STORAGE_H_ |