#include "content/browser/renderer_host/navigation_entry_impl.h"
#include <stddef.h>
#include <map>
#include <string>
#include <utility>
#include "base/containers/queue.h"
#include "base/files/file_path.h"
#include "base/i18n/rtl.h"
#include "base/memory/ptr_util.h"
#include "base/ranges/algorithm.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "components/url_formatter/url_formatter.h"
#include "components/viz/host/host_frame_sink_manager.h"
#include "content/browser/child_process_security_policy_impl.h"
#include "content/browser/compositor/surface_utils.h"
#include "content/browser/renderer_host/frame_tree_node.h"
#include "content/browser/renderer_host/navigation_controller_impl.h"
#include "content/browser/renderer_host/navigation_entry_restore_context_impl.h"
#include "content/browser/renderer_host/navigation_request.h"
#include "content/common/content_constants_internal.h"
#include "content/public/browser/reload_type.h"
#include "content/public/common/content_constants.h"
#include "content/public/common/url_constants.h"
#include "net/storage_access_api/status.h"
#include "services/metrics/public/cpp/ukm_source_id.h"
#include "services/network/public/mojom/fetch_api.mojom.h"
#include "third_party/blink/public/common/navigation/navigation_params.h"
#include "third_party/blink/public/common/page_state/page_state_serialization.h"
#include "third_party/blink/public/mojom/frame/frame.mojom.h"
#include "third_party/blink/public/mojom/navigation/navigation_params.mojom.h"
#include "third_party/blink/public/mojom/navigation/prefetched_signed_exchange_info.mojom.h"
#include "third_party/blink/public/mojom/runtime_feature_state/runtime_feature.mojom.h"
#include "ui/gfx/text_elider.h"
#if BUILDFLAG(IS_ANDROID)
#include "base/android/content_uri_utils.h"
#endif
UTF16ToUTF8;
namespace content {
namespace {
int CreateUniqueEntryID() { … }
void RecursivelyGenerateFrameEntries(
NavigationEntryRestoreContextImpl* context,
const blink::ExplodedFrameState& state,
const std::vector<std::optional<std::u16string>>& referenced_files,
NavigationEntryImpl::TreeNode* node) { … }
std::optional<std::u16string> UrlToOptionalString16(const GURL& url) { … }
void RecursivelyGenerateFrameState(
NavigationEntryImpl::TreeNode* node,
blink::ExplodedFrameState* state,
std::vector<std::optional<std::u16string>>* referenced_files) { … }
bool InSameTreePosition(FrameTreeNode* frame_tree_node,
NavigationEntryImpl::TreeNode* node) { … }
void RegisterOriginsRecursive(NavigationEntryImpl::TreeNode* node,
const url::Origin& origin) { … }
}
void NavigationEntryImpl::RegisterExistingOriginAsHavingDefaultIsolation(
const url::Origin& origin) { … }
NavigationEntryImpl::TreeNode::TreeNode(
TreeNode* parent,
scoped_refptr<FrameNavigationEntry> frame_entry)
: … { … }
NavigationEntryImpl::TreeNode::~TreeNode() { … }
bool NavigationEntryImpl::TreeNode::MatchesFrame(
FrameTreeNode* frame_tree_node) const { … }
std::unique_ptr<NavigationEntryImpl::TreeNode>
NavigationEntryImpl::TreeNode::CloneAndReplace(
scoped_refptr<FrameNavigationEntry> frame_navigation_entry,
bool clone_children_of_target,
FrameTreeNode* target_frame_tree_node,
FrameTreeNode* current_frame_tree_node,
TreeNode* parent_node,
NavigationEntryRestoreContextImpl* restore_context,
ClonePolicy clone_policy) const { … }
std::unique_ptr<NavigationEntry> NavigationEntry::Create() { … }
NavigationEntryImpl* NavigationEntryImpl::FromNavigationEntry(
NavigationEntry* entry) { … }
const NavigationEntryImpl* NavigationEntryImpl::FromNavigationEntry(
const NavigationEntry* entry) { … }
std::unique_ptr<NavigationEntryImpl> NavigationEntryImpl::FromNavigationEntry(
std::unique_ptr<NavigationEntry> entry) { … }
NavigationEntryImpl::NavigationEntryImpl()
: … { … }
NavigationEntryImpl::NavigationEntryImpl(
scoped_refptr<SiteInstanceImpl> instance,
const GURL& url,
const Referrer& referrer,
const std::optional<url::Origin>& initiator_origin,
const std::optional<GURL>& initiator_base_url,
const std::u16string& title,
ui::PageTransition transition_type,
bool is_renderer_initiated,
scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory,
bool is_initial_entry)
: … { … }
NavigationEntryImpl::~NavigationEntryImpl() { … }
int NavigationEntryImpl::GetUniqueID() { … }
PageType NavigationEntryImpl::GetPageType() { … }
void NavigationEntryImpl::SetURL(const GURL& url) { … }
const GURL& NavigationEntryImpl::GetURL() { … }
void NavigationEntryImpl::SetBaseURLForDataURL(const GURL& url) { … }
const GURL& NavigationEntryImpl::GetBaseURLForDataURL() { … }
#if BUILDFLAG(IS_ANDROID)
void NavigationEntryImpl::SetDataURLAsString(
scoped_refptr<base::RefCountedString> data_url) {
if (data_url) {
DCHECK(base::StartsWith(base::as_string_view(*data_url), url::kDataScheme,
base::CompareCase::SENSITIVE));
}
data_url_as_string_ = std::move(data_url);
}
const scoped_refptr<const base::RefCountedString>&
NavigationEntryImpl::GetDataURLAsString() {
return data_url_as_string_;
}
#endif
void NavigationEntryImpl::SetReferrer(const Referrer& referrer) { … }
const Referrer& NavigationEntryImpl::GetReferrer() { … }
void NavigationEntryImpl::SetVirtualURL(const GURL& url) { … }
const GURL& NavigationEntryImpl::GetVirtualURL() { … }
void NavigationEntryImpl::SetTitle(std::u16string title) { … }
const std::u16string& NavigationEntryImpl::GetTitle() { … }
void NavigationEntryImpl::SetAppTitle(const std::u16string& app_title) { … }
const std::optional<std::u16string>& NavigationEntryImpl::GetAppTitle() { … }
void NavigationEntryImpl::SetPageState(const blink::PageState& state,
NavigationEntryRestoreContext* context) { … }
blink::PageState NavigationEntryImpl::GetPageState() { … }
const std::u16string& NavigationEntryImpl::GetTitleForDisplay() { … }
bool NavigationEntryImpl::IsViewSourceMode() { … }
void NavigationEntryImpl::SetTransitionType(
ui::PageTransition transition_type) { … }
ui::PageTransition NavigationEntryImpl::GetTransitionType() { … }
const GURL& NavigationEntryImpl::GetUserTypedURL() { … }
void NavigationEntryImpl::SetHasPostData(bool has_post_data) { … }
bool NavigationEntryImpl::GetHasPostData() { … }
void NavigationEntryImpl::SetPostID(int64_t post_id) { … }
int64_t NavigationEntryImpl::GetPostID() { … }
void NavigationEntryImpl::SetPostData(
const scoped_refptr<network::ResourceRequestBody>& data) { … }
scoped_refptr<network::ResourceRequestBody> NavigationEntryImpl::GetPostData() { … }
FaviconStatus& NavigationEntryImpl::GetFavicon() { … }
SSLStatus& NavigationEntryImpl::GetSSL() { … }
void NavigationEntryImpl::SetOriginalRequestURL(const GURL& original_url) { … }
const GURL& NavigationEntryImpl::GetOriginalRequestURL() { … }
void NavigationEntryImpl::SetIsOverridingUserAgent(bool override_ua) { … }
bool NavigationEntryImpl::GetIsOverridingUserAgent() { … }
void NavigationEntryImpl::SetTimestamp(base::Time timestamp) { … }
base::Time NavigationEntryImpl::GetTimestamp() { … }
void NavigationEntryImpl::SetHttpStatusCode(int http_status_code) { … }
int NavigationEntryImpl::GetHttpStatusCode() { … }
void NavigationEntryImpl::SetRedirectChain(
const std::vector<GURL>& redirect_chain) { … }
const std::vector<GURL>& NavigationEntryImpl::GetRedirectChain() { … }
const std::optional<ReplacedNavigationEntryData>&
NavigationEntryImpl::GetReplacedEntryData() { … }
bool NavigationEntryImpl::IsRestored() { … }
std::string NavigationEntryImpl::GetExtraHeaders() { … }
void NavigationEntryImpl::AddExtraHeaders(
const std::string& more_extra_headers) { … }
int64_t NavigationEntryImpl::GetMainFrameDocumentSequenceNumber() { … }
void NavigationEntryImpl::SetCanLoadLocalResources(bool allow) { … }
bool NavigationEntryImpl::GetCanLoadLocalResources() { … }
bool NavigationEntryImpl::IsInitialEntry() { … }
std::unique_ptr<NavigationEntryImpl> NavigationEntryImpl::Clone() const { … }
std::unique_ptr<NavigationEntryImpl> NavigationEntryImpl::CloneWithoutSharing(
NavigationEntryRestoreContextImpl* restore_context) const { … }
std::unique_ptr<NavigationEntryImpl> NavigationEntryImpl::CloneAndReplace(
scoped_refptr<FrameNavigationEntry> frame_navigation_entry,
bool clone_children_of_target,
FrameTreeNode* target_frame_tree_node,
FrameTreeNode* root_frame_tree_node) const { … }
std::unique_ptr<NavigationEntryImpl>
NavigationEntryImpl::CloneAndReplaceInternal(
scoped_refptr<FrameNavigationEntry> frame_navigation_entry,
bool clone_children_of_target,
FrameTreeNode* target_frame_tree_node,
FrameTreeNode* root_frame_tree_node,
NavigationEntryRestoreContextImpl* restore_context,
ClonePolicy clone_policy) const { … }
blink::mojom::CommonNavigationParamsPtr
NavigationEntryImpl::ConstructCommonNavigationParams(
const FrameNavigationEntry& frame_entry,
const scoped_refptr<network::ResourceRequestBody>& post_body,
const GURL& dest_url,
blink::mojom::ReferrerPtr dest_referrer,
blink::mojom::NavigationType navigation_type,
base::TimeTicks navigation_start,
base::TimeTicks input_start) { … }
blink::mojom::CommitNavigationParamsPtr
NavigationEntryImpl::ConstructCommitNavigationParams(
const FrameNavigationEntry& frame_entry,
const GURL& original_url,
const std::string& original_method,
const base::flat_map<std::string, bool>& subframe_unique_names,
bool intended_as_new_entry,
int pending_history_list_offset,
int current_history_list_offset,
int current_history_list_length,
const blink::FramePolicy& frame_policy,
bool ancestor_or_self_has_cspee,
blink::mojom::SystemEntropy system_entropy_at_navigation_start,
std::optional<blink::scheduler::TaskAttributionId>
soft_navigation_heuristics_task_id) { … }
void NavigationEntryImpl::ResetForCommit(FrameNavigationEntry* frame_entry) { … }
NavigationEntryImpl::TreeNode* NavigationEntryImpl::GetTreeNode(
FrameTreeNode* frame_tree_node) const { … }
void NavigationEntryImpl::AddOrUpdateFrameEntry(
FrameTreeNode* frame_tree_node,
UpdatePolicy update_policy,
int64_t item_sequence_number,
int64_t document_sequence_number,
const std::string& navigation_api_key,
SiteInstanceImpl* site_instance,
scoped_refptr<SiteInstanceImpl> source_site_instance,
const GURL& url,
const std::optional<url::Origin>& origin,
const Referrer& referrer,
const std::optional<url::Origin>& initiator_origin,
const std::optional<GURL>& initiator_base_url,
const std::vector<GURL>& redirect_chain,
const blink::PageState& page_state,
const std::string& method,
int64_t post_id,
scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory,
std::unique_ptr<PolicyContainerPolicies> policy_container_policies) { … }
FrameNavigationEntry* NavigationEntryImpl::GetFrameEntry(
FrameTreeNode* frame_tree_node) const { … }
void NavigationEntryImpl::ForEachFrameEntry(
FrameEntryIterationCallback on_frame_entry) { … }
base::flat_map<std::string, bool> NavigationEntryImpl::GetSubframeUniqueNames(
FrameTreeNode* frame_tree_node) const { … }
void NavigationEntryImpl::RemoveEntryForFrame(FrameTreeNode* frame_tree_node,
bool only_if_different_position) { … }
void NavigationEntryImpl::UpdateBackForwardCacheNotRestoredReasons(
NavigationRequest* navigation_request) { … }
GURL NavigationEntryImpl::GetHistoryURLForDataURL() { … }
}