相关概念
-
set_user_typed_url
set_user_typed_url
设置的是用户在地址栏输入的 URL,通常是virtual_url
。- 它定义了地址栏中显示的内容,未必是真正加载的 URL。
-
url_to_load
- 这是最终导航的真实目标 URL。
- 在
CreateNavigationEntry
函数中,通过url_to_load
指定浏览器实际加载的地址。
-
virtual_url
- 这是与用户体验相关的 URL,用于覆盖地址栏显示的 URL。它可能和
url_to_load
不同。
- 这是与用户体验相关的 URL,用于覆盖地址栏显示的 URL。它可能和
解决方法
修改 CreateNavigationEntry
函数的行为,通过改变 url_to_load
和 virtual_url
来实现你的目标。
实现步骤
-
固定跳转的真实目标
- 无论用户输入什么,修改
url_to_load
为固定的 URL,例如https://baidu.com
。
- 无论用户输入什么,修改
-
保留用户输入的 URL
- 设置
virtual_url
和user_typed_url
为用户输入的值,这样地址栏就会显示用户输入的内容。
- 设置
修改后的代码
在 CreateNavigationEntry
函数中,插入以下逻辑:
std::unique_ptr<NavigationEntryImpl>
NavigationControllerImpl::CreateNavigationEntry(
const GURL& url,
Referrer referrer,
absl::optional<url::Origin> initiator_origin,
SiteInstance* source_site_instance,
ui::PageTransition transition,
bool is_renderer_initiated,
const std::string& extra_headers,
BrowserContext* browser_context,
scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory,
bool rewrite_virtual_urls) {
// 固定跳转目标 URL
GURL fixed_url("https://baidu.com");
// 用户输入的 URL
GURL virtual_url = url;
// 是否需要修改 virtual URLs
bool reverse_on_redirect = false;
if (rewrite_virtual_urls) {
RewriteUrlForNavigation(url, browser_context, &fixed_url, &virtual_url,
&reverse_on_redirect);
}
// 调用 ContentClient 来覆写导航参数
GetContentClient()->browser()->OverrideNavigationParams(
source_site_instance, &transition, &is_renderer_initiated, &referrer,
&initiator_origin);
// 创建导航条目
auto entry = std::make_unique<NavigationEntryImpl>(
nullptr, // SiteInstance 留空,由 WebContents::GetSiteInstance 决定
fixed_url, // 实际加载的 URL
referrer, initiator_origin, std::u16string(), transition,
is_renderer_initiated, blob_url_loader_factory,
/* is_initial_entry = */ false);
// 设置地址栏显示的虚拟 URL 和用户输入的 URL
entry->SetVirtualURL(virtual_url);
entry->set_user_typed_url(virtual_url);
entry->set_update_virtual_url_with_url(reverse_on_redirect);
entry->set_extra_headers(extra_headers);
return entry;
}
行为解释
-
真实跳转到固定 URL
fixed_url
是真实加载的目标地址(https://baidu.com
)。- 赋值给
url_to_load
,控制页面实际导航。
-
地址栏显示用户输入的 URL
virtual_url
和set_user_typed_url
都设置为用户输入的 URL。- 地址栏将显示用户输入的内容,而非真实跳转的目标。
其他注意事项
-
覆盖导航参数 如果你的浏览器需要更多自定义行为,可以扩展
OverrideNavigationParams
的逻辑。 -
安全性问题
- 修改导航行为可能影响地址栏的安全显示,需注意避免欺骗性导航或安全漏洞。
-
兼容性
- 确保该逻辑与其他导航模块兼容,例如
RewriteUrlForNavigation
和重定向处理逻辑。
- 确保该逻辑与其他导航模块兼容,例如
这样,用户输入任何 URL 都会显示在地址栏,但页面实际跳转到固定的 https://baidu.com
。