Chromium界面分析小结(五)地址栏结构

本文详细介绍浏览器地址栏的各种功能,包括页面信息图标、tab_to_search特性、撤销功能、页面安全信息及权限、页面缩放功能、收藏夹快捷操作等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


地址栏位于工具栏中间,它是个很复杂的物件,虽然样子看上去很简单,但是功能的确很强大,所以结构就复杂了。

在地址栏最左侧是显示页面信息的图标,如果是经过https加密传输的页面,图标显示为绿色锁形,并在右侧显示网站单位信息,如果不是加密页面则显示空白文档图标。点击这个图标后会弹出该页面对应的权限(HTML5新增功能)和详细安全信息(加密算法和认证证书)。紧挨着右边是一个tab_to_search的东西,如果在地址栏输入一个搜索引擎的URL再按Tab键,地址栏就会变成搜索栏,出现”使用**搜索”的提示,输入内容可以直接进行搜索而不用先转到搜索引擎页面。再右边才是真正的地址栏,它由一个叫做GtkUndoView的类实现,顾名思义,这个地址栏具有撤销功能,撤销时它会撤销到最后一次匹配智能提示的URL,直到最初的空状态。再右侧是输入搜索引擎地址时的tab_to_search提示,它们由两个标签和一个图标组成。再右侧是page_action_hbox,不过从来没有见过这里出现什么东西。然后是content_setting的图标,这里显示当前页面使用的高级功能(定位等)。接着是页面缩放级别的按钮,根据不同的页面缩放级别会显示不同的图标,并且点击后可以重置缩放级别。再右侧的script_bubble图标从来没出现过,不清楚具体功能。最后是一个星形按钮,用来添加标签,如果当前页面在收藏夹内则显示黄色星星,否则显示空心星星。

大图在:点击打开链接

<think>由于Chromium源码非常庞大,且结构复杂,地址栏(通常称为Omnibox)的URL显示涉及到多个模块。具体到“负责显示地址栏中URL的函数”可能没有一个单一的函数,而是由多个类和函数协同工作完成的。 在Chromium中,地址栏的UI部分位于`chrome/browser/ui/views/omnibox/`目录下。其中,`OmniboxViewViews`类(定义在`omnibox_view_views.h`和`omnibox_view_views.cc`)负责绘制地址栏的文本内容,包括URL。 但是,显示URL的文本内容是由`OmniboxEditModel`(位于`chrome/browser/ui/omnibox`)和`OmniboxView`(视图抽象)共同管理的。具体来说,当用户输入时,地址栏会显示当前页面的URL,或者用户输入的搜索词等。 在`OmniboxViewViews`中,有一个重要的函数`SetWindowTextAndCaretPos`,它用于设置地址栏中显示的文本。另外,`OnPaint`函数负责绘制地址栏。 然而,更准确地说,地址栏的文本内容是由`OmniboxEditModel`的状态决定的,而视图(`OmniboxViewViews`)负责显示这个状态。因此,我们需要关注的是如何将URL字符串设置到视图上。 在`OmniboxViewViews::SetWindowTextAndCaretPos`函数中,会调用`SetText`设置文本,然后更新光标位置。这个文本就是地址栏中显示的字符串。 另外,在`OmniboxEditModel`中,有一个函数`UpdatePermanentText`,它用于设置永久文本(即当地址栏没有焦点时显示的URL)。 但是,请注意,Chromium地址栏功能非常复杂,它不仅仅显示URL,还可能显示安全状态图标、建议文本等。因此,显示URL的文本只是其中的一部分。 由于Chromium源码不断更新,具体的代码位置可能会有所变动。以下是一个基于Chromium 91版本的代码位置参考: 1. `OmniboxViewViews`类:`chrome/browser/ui/views/omnibox/omnibox_view_views.h` - 其中,`SetWindowTextAndCaretPos`函数用于设置文本和光标位置。 - `OnPaint`函数负责绘制。 2. 设置永久文本(即失去焦点时显示的URL)的函数在`OmniboxEditModel::UpdatePermanentText`(`chrome/browser/ui/omnibox/omnibox_edit_model.h`)中。 3. 当用户导航到新页面时,地址栏的URL更新是通过`OmniboxEditModel::OnChanged`等函数触发的。 由于无法给出确切的单一函数,这里给出一个大致的方向。如果你需要查看具体的代码实现,建议查阅最新的Chromium源码。 注意:如果你正在调试或修改Chromium,你可能需要跟踪地址栏文本变化的整个流程,这涉及到`OmniboxClient`、`OmniboxController`、`OmniboxEditModel`和`OmniboxView`等多个类。 如果你只是想知道地址栏显示的URL字符串是在哪里设置的,那么可以关注`OmniboxViewViews`的`SetText`函数(在`SetWindowTextAndCaretPos`中调用)以及`SetTextInternal`函数。 由于问题比较宽泛,这里无法给出一个确切的函数名,但希望以上信息能帮助你定位。 如果你需要更具体的帮助,请提供更详细的信息,例如你希望了解地址栏在什么情况下更新URL,或者你想修改地址栏显示URL的格式等。 §§相关问题§§: 1. Chromium地址栏(Omnibox)的UI绘制是在哪个类中完成的? 2. 当用户导航到新页面时,地址栏的URL是如何更新的? 3. 如何修改Chromium地址栏中URL的显示格式(例如隐藏协议部分)? 4. 在Chromium源码中,地址栏的文本输入和显示逻辑主要涉及哪些类?</think>在 Chromium 源码中,负责地址栏(Omnibox)URL 显示的核心逻辑位于以下位置: ### 核心文件路径: `chrome/browser/ui/omnibox/omnibox_edit_model.cc` ### 关键函数: `OmniboxEditModel::GetPermanentDisplayText()` ### 代码解析: ```cpp // chrome/browser/ui/omnibox/omnibox_edit_model.cc std::u16string OmniboxEditModel::GetPermanentDisplayText() const { // 当地址栏失去焦点时,此函数返回要显示的永久文本(通常是格式化后的URL) if (permanent_text_.empty()) return std::u16string(); // 安全显示处理:对欺诈性URL进行警告 if (input_.manager() && input_.manager()->ShouldPreventElision()) { return base::i18n::ToUpper(permanent_text_); } // 返回经过格式化的永久文本 return permanent_text_; } ``` ### 相关调用栈: 1. **文本显示入口**: `OmniboxView::SetWindowTextAndCaretPos()`(位于 `omnibox_view_views.cc`)调用此函数获取要显示的文本。 2. **URL 格式化过程**: `OmniboxEditModel::UpdatePermanentText()` 负责生成 `permanent_text_`,其中调用: ```cpp permanent_text_ = url_formatter::FormatUrl( url, url_formatter::kFormatUrlOmitDefaults, base::UnescapeRule::SPACES, nullptr, nullptr, nullptr); ``` 3. **URL 格式化工具**: 核心格式化实现在 `components/url_formatter/url_formatter.cc` 中的 `FormatUrl()` 函数,处理: - 协议隐藏(隐藏 http/https) - 子域名简化 - 空格转义 - IDN 国际化域名转换 ### 功能说明: 1. **焦点状态管理**: - 当地址栏**获得焦点**时:显示完整可编辑 URL - 当地址栏**失去焦点**时:显示 `GetPermanentDisplayText()` 返回的简化格式 2. **安全处理**: - 对钓鱼网站显示全大写 URL - 对 EV SSL 证书站点显示绿色标识 - 隐藏用户名/密码等敏感信息 3. **格式化规则**: - 默认隐藏 `http://` - 隐藏 `www.` 子域 - 路径截断(超过长度限制时) - 特殊符号的 Unicode 转义 ### 示例流程: 用户访问 `https://www.example.com/page`: 1. 导航完成后调用 `OmniboxEditModel::UpdatePermanentText()` 2. 生成格式化文本:`example.com/page` 3. 当地址栏失去焦点时通过 `GetPermanentDisplayText()` 返回该文本 4. `OmniboxViewViews` 将此文本绘制到地址栏 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值