You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chromium自定义右上角菜单加载WebUI页面崩溃问题求助

Chromium自定义菜单点击崩溃问题排查方案

核心问题定位

日志提示Calling AllowBindings for a process not locked to WebUI,说明WebUI进程未被正确锁定到指定Scheme,权限校验失败触发崩溃。

分步排查与修复

1. 自定义Scheme的WebUI进程锁定校验

  • 注册Scheme时,为securitynet或自定义chrome://子URL配置kWebUI类型,同时开启必要属性:
    // 在chrome/common/chrome_content_client.cc中注册Scheme
    void AddCustomSchemes(SchemeMap* schemes) {
      schemes->emplace("securitynet",
                       content::SchemeMetadata{
                           content::SCHEME_WEBUI,
                           content::SchemeMetadata::kSecure |
                               content::SchemeMetadata::kCorsEnabled,
                           base::nullopt,
                           base::nullopt,
                           base::nullopt});
    }
    
  • 在WebUI控制器的BindInterface方法中,先校验进程类型再执行绑定逻辑:
    void SecurityNetHelpUI::BindInterface(
        mojo::PendingReceiver<mojom::SecurityNetHelp> receiver) {
      if (!content::IsWebUIProcess()) {
        LOG(ERROR) << "Bind request from non-WebUI process";
        return;
      }
      bindings_.AddBinding(this, std::move(receiver));
      // AllowBindings调用需放在此校验之后
    }
    

2. 菜单点击的URL跳转逻辑修正

  • 避免用普通OpenURL方式打开WebUI地址,需使用WebUI专用加载逻辑,确保进程初始化正确:
    // 在菜单点击处理函数中
    void OnSecurityNetHelpClicked() {
      Profile* profile = ProfileManager::GetActiveUserProfile();
      GURL url("securitynet://help");
      content::OpenURLParams params(
          url, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
          ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false);
      params.webui_type = content::WebUIType::SECURITY_NET_HELP; // 提前定义枚举值
      content::OpenURL(profile->GetBrowserContext(), params);
    }
    

3. WebUI控制器的注册与权限配置

  • 在chrome/browser/ui/webui/webui_controller_factory.cc中注册自定义WebUI,明确支持的用户类型与启用规则:
    std::unique_ptr<content::WebUIController> CreateSecurityNetHelpUI(
        content::WebUI* web_ui, const GURL& url) {
      return std::make_unique<SecurityNetHelpUI>(web_ui);
    }
    
    void RegisterCustomWebUIControllers() {
      WebUIControllerFactory::GetInstance()->RegisterWebUIController(
          GURL("securitynet://help"), &CreateSecurityNetHelpUI,
          WebUIControllerFactory::SupportsUserType::kAll,
          WebUIControllerFactory::IsWebUIEnabled::kAlways);
    }
    
  • WebUI构造函数中强制校验进程类型,并设置正确的绑定策略:
    SecurityNetHelpUI::SecurityNetHelpUI(content::WebUI* web_ui)
        : WebUIController(web_ui) {
      DCHECK(content::IsWebUIProcess());
      web_ui->AddMessageHandler(std::make_unique<SecurityNetHelpHandler>());
      web_ui->SetBindings(content::WebUI::BINDINGS_POLICY_WEB_UI);
    }
    

4. 进程隔离与权限校验检查

  • 在chrome/common/url_constants.cc中添加自定义URL常量,避免Scheme冲突:
    const char kSecurityNetHelpURL[] = "securitynet://help";
    const char kSecurityNetSettingsURL[] = "securitynet://settings";
    
  • 确认content/browser/webui/web_ui_impl.cc中的LockToWebUIProcess逻辑对自定义Scheme生效,若未触发,检查Scheme注册时是否明确指定SCHEME_WEBUI类型。

关键注意事项

  • 所有WebUI专属API必须在WebUI进程上下文执行,禁止在浏览器主进程或非WebUI渲染进程中调用。
  • 自定义chrome://子URL时,需确保与内置URL无冲突,注册逻辑与Chromium内置WebUI保持一致。

内容的提问来源于stack exchange,提问作者heeseok lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 04:12:45