#ifndef CONTENT_BROWSER_RENDERER_HOST_DOCUMENT_ASSOCIATED_DATA_H_
#define CONTENT_BROWSER_RENDERER_HOST_DOCUMENT_ASSOCIATED_DATA_H_
#include <memory>
#include <optional>
#include <vector>
#include "base/containers/queue.h"
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/safe_ref.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/supports_user_data.h"
#include "base/types/pass_key.h"
#include "base/unguessable_token.h"
#include "content/browser/loader/keep_alive_url_loader_service.h"
#include "net/cookies/cookie_setting_override.h"
#include "third_party/blink/public/common/tokens/tokens.h"
#include "third_party/blink/public/mojom/confidence_level.mojom.h"
#include "url/gurl.h"
namespace content {
namespace internal {
class DocumentServiceBase;
}
class NavigationOrDocumentHandle;
class PageImpl;
class RenderFrameHostImpl;
class DocumentAssociatedData : public base::SupportsUserData {
public:
static RenderFrameHostImpl* GetDocumentFromToken(
base::PassKey<RenderFrameHostImpl>,
const blink::DocumentToken& token);
explicit DocumentAssociatedData(RenderFrameHostImpl& document,
const blink::DocumentToken& token);
~DocumentAssociatedData() override;
DocumentAssociatedData(const DocumentAssociatedData&) = delete;
DocumentAssociatedData& operator=(const DocumentAssociatedData&) = delete;
const blink::DocumentToken& token() const { return token_; }
PageImpl* owned_page() { return owned_page_.get(); }
const PageImpl* owned_page() const { return owned_page_.get(); }
bool dom_content_loaded() const { return dom_content_loaded_; }
void MarkDomContentLoaded() { dom_content_loaded_ = true; }
bool is_discarded() const { return is_discarded_; }
void MarkDiscarded() { is_discarded_ = true; }
const std::optional<GURL>& pending_did_finish_load_url_for_prerendering()
const {
return pending_did_finish_load_url_for_prerendering_;
}
void set_pending_did_finish_load_url_for_prerendering(const GURL& url) {
pending_did_finish_load_url_for_prerendering_.emplace(url);
}
void reset_pending_did_finish_load_url_for_prerendering() {
pending_did_finish_load_url_for_prerendering_.reset();
}
bool pending_did_stop_loading_for_prerendering() const {
return pending_did_stop_loading_for_prerendering_;
}
void set_pending_did_stop_loading_for_prerendering() {
pending_did_stop_loading_for_prerendering_ = true;
}
const base::UnguessableToken& reporting_source() const {
return token_.value();
}
std::vector<raw_ptr<internal::DocumentServiceBase, VectorExperimental>>&
services() {
return services_;
}
const scoped_refptr<NavigationOrDocumentHandle>&
navigation_or_document_handle() const {
return navigation_or_document_handle_;
}
void set_navigation_or_document_handle(
scoped_refptr<NavigationOrDocumentHandle> handle);
const std::optional<base::UnguessableToken>& devtools_navigation_token()
const {
return devtools_navigation_token_;
}
void set_devtools_navigation_token(
const base::UnguessableToken& devtools_navigation_token) {
devtools_navigation_token_ = devtools_navigation_token;
}
blink::mojom::ConfidenceLevel navigation_confidence() const {
return confidence_level_;
}
void set_navigation_confidence(
blink::mojom::ConfidenceLevel confidence_level) {
confidence_level_ = confidence_level;
}
base::WeakPtr<KeepAliveURLLoaderService::FactoryContext>
keep_alive_url_loader_factory_context() const {
return keep_alive_url_loader_factory_context_;
}
void set_keep_alive_url_loader_factory_context(
base::WeakPtr<KeepAliveURLLoaderService::FactoryContext>
factory_context) {
DCHECK(!keep_alive_url_loader_factory_context_);
keep_alive_url_loader_factory_context_ = factory_context;
}
base::SafeRef<RenderFrameHostImpl> GetSafeRef() {
return weak_factory_.GetSafeRef();
}
base::WeakPtr<RenderFrameHostImpl> GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
void AddService(internal::DocumentServiceBase* service,
base::PassKey<internal::DocumentServiceBase>);
void RemoveService(internal::DocumentServiceBase* service,
base::PassKey<internal::DocumentServiceBase>);
void AddPostPrerenderingActivationStep(base::OnceClosure callback);
void RunPostPrerenderingActivationSteps();
net::CookieSettingOverrides cookie_setting_overrides() const {
return cookie_setting_overrides_;
}
void PutCookieSettingOverride(
net::CookieSettingOverride cookie_setting_override);
void RemoveCookieSettingOverride(
net::CookieSettingOverride cookie_setting_override);
private:
const blink::DocumentToken token_;
std::unique_ptr<PageImpl> owned_page_;
bool dom_content_loaded_ = false;
bool is_discarded_ = false;
std::optional<GURL> pending_did_finish_load_url_for_prerendering_;
bool pending_did_stop_loading_for_prerendering_ = false;
std::vector<raw_ptr<internal::DocumentServiceBase, VectorExperimental>>
services_;
scoped_refptr<NavigationOrDocumentHandle> navigation_or_document_handle_;
std::optional<base::UnguessableToken> devtools_navigation_token_;
blink::mojom::ConfidenceLevel confidence_level_ =
blink::mojom::ConfidenceLevel::kHigh;
base::WeakPtr<KeepAliveURLLoaderService::FactoryContext>
keep_alive_url_loader_factory_context_;
base::queue<base::OnceClosure> post_prerendering_activation_callbacks_;
net::CookieSettingOverrides cookie_setting_overrides_;
base::WeakPtrFactory<RenderFrameHostImpl> weak_factory_;
};
}
#endif