chromium中实现地址栏不显示真实地址

相关概念

  1. set_user_typed_url

    • set_user_typed_url 设置的是用户在地址栏输入的 URL,通常是 virtual_url
    • 它定义了地址栏中显示的内容,未必是真正加载的 URL。
  2. url_to_load

    • 这是最终导航的真实目标 URL。
    • CreateNavigationEntry 函数中,通过 url_to_load 指定浏览器实际加载的地址。
  3. virtual_url

    • 这是与用户体验相关的 URL,用于覆盖地址栏显示的 URL。它可能和 url_to_load 不同。

解决方法

修改 CreateNavigationEntry 函数的行为,通过改变 url_to_loadvirtual_url 来实现你的目标。

实现步骤
  1. 固定跳转的真实目标

    • 无论用户输入什么,修改 url_to_load 为固定的 URL,例如 https://baidu.com
  2. 保留用户输入的 URL

    • 设置 virtual_urluser_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;
}

行为解释

  1. 真实跳转到固定 URL

    • fixed_url 是真实加载的目标地址(https://baidu.com)。
    • 赋值给 url_to_load,控制页面实际导航。
  2. 地址栏显示用户输入的 URL

    • virtual_urlset_user_typed_url 都设置为用户输入的 URL。
    • 地址栏将显示用户输入的内容,而非真实跳转的目标。

其他注意事项

  • 覆盖导航参数 如果你的浏览器需要更多自定义行为,可以扩展 OverrideNavigationParams 的逻辑。

  • 安全性问题

    • 修改导航行为可能影响地址栏的安全显示,需注意避免欺骗性导航或安全漏洞。
  • 兼容性

    • 确保该逻辑与其他导航模块兼容,例如 RewriteUrlForNavigation 和重定向处理逻辑。

这样,用户输入任何 URL 都会显示在地址栏,但页面实际跳转到固定的 https://baidu.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值