如何在Chromium中限制页面加载 查阅omni box及navigator.cc代码未找到线索
Chromium 限制页面加载功能实现指引
核心实现逻辑
限制页面加载的最佳拦截时机早于地址栏输入解析、navigator.cc导航提交阶段,直接在导航请求的初始入口做校验即可,无需修改过多上层逻辑。
具体修改点
1. 主页面导航拦截(最核心入口)
所有主页面导航请求都会经过content/browser/renderer_host/navigation_request.cc中的NavigationRequest::BeginNavigation方法,在此处添加校验规则即可覆盖所有场景的主页面加载限制:
- 新增自定义URL校验函数,支持黑名单、白名单、规则匹配等任意限制逻辑
- 校验不通过时直接调用
FailNavigation终止导航,无需走后续加载流程
代码示例:
// 插入到NavigationRequest::BeginNavigation方法的最开头 GURL current_url = common_params_.url; // 自定义校验逻辑,返回false表示禁止加载 if (!CustomURLValidator::GetInstance()->CheckURLValid(current_url)) { FailNavigation(net::ERR_BLOCKED_BY_ADMINISTRATOR, /*is_early_cancel=*/true); return; }
2. 地址栏输入前置拦截(可选优化)
如果需要在用户输入地址后、发起导航前就拦截,减少无效流程,可以修改chrome/browser/ui/omnibox/omnibox_edit_controller.cc中的OpenURL方法:
- 在跳转逻辑执行前先调用自定义校验逻辑
- 校验不通过时直接弹出提示,不发起导航请求,响应速度更快
3. 子资源加载拦截(可选,适用于需要限制页面内资源的场景)
如果需要同时限制页面内的iframe、脚本、图片等子资源加载,可通过Chromium的URLLoaderThrottle体系实现全局拦截:
- 继承
URLLoaderThrottle实现自定义限流类,在WillStartRequest方法中做资源URL校验 - 在
ContentBrowserClient::CreateURLLoaderThrottles方法中注册自定义的throttle,即可对所有资源请求生效
开发注意事项
- 所有自定义规则建议抽成独立的单例管理类维护,保证不同拦截点的规则统一
- 错误码直接使用Chromium原生的
net::ERR_BLOCKED_BY_ADMINISTRATOR即可,前端会自动匹配对应的错误提示页,无需额外开发错误页面 - 如果需要支持动态更新限制规则,无需重新编译,可以把规则存储在浏览器Prefs配置中,校验时直接读取配置即可
内容的提问来源于stack exchange,提问作者Mayank Sharma
相关产品推荐
相关产品推荐

