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

修改Chrome源码实现所有窗口启动默认开启移动设备模拟的技术咨询

修改Chrome源码实现所有窗口启动默认开启移动设备模拟的技术咨询

嘿,我来帮你排查这个问题哈!你现在的情况是:修改了Chrome源码中EmulationHandler的构造函数,把移动设备模拟相关的三个布尔值从false改成true,但只有第一个启动的窗口会默认开启这个功能,后续新建的窗口就没效果了,对吧?

先给你理清楚为什么会出现这个问题:你直接在构造函数里设置初始值的思路是对的,理论上每个新窗口都会创建新的EmulationHandler实例,构造函数的默认值应该会生效。但Chrome的窗口初始化流程里,有后续的逻辑会覆盖你设置的初始值——比如可能存在一个恢复默认设置的方法,在窗口创建完成后被调用,把这几个状态又改回了false;或者Chrome会从全局偏好设置中读取默认状态,而你没修改这个全局配置,导致新窗口继承了原始的默认值。

下面给你几个具体的修改方向,你可以照着排查调整:

  • 检查并修改RestoreDefaults方法:在emulation_handler.cc里找找有没有RestoreDefaults()或者类似的方法,Chrome经常会用这类方法来重置模块状态到默认值。如果找到类似下面的代码,把里面的false改成true就行:

    void EmulationHandler::RestoreDefaults() {
      touch_emulation_enabled_ = true;  // 原先是false
      device_emulation_enabled_ = true; // 原先是false
      focus_emulation_enabled_ = true;  // 原先是false
      // 其他保留的代码逻辑
    }
    
  • 修改全局偏好的默认值:Chrome的很多功能默认状态都是由全局偏好控制的,你可以在源码里搜搜和设备模拟相关的偏好键(比如prefs::kDeviceEmulationEnabled、prefs::kTouchEmulationEnabled这类命名的常量)。找到定义这些偏好默认值的地方(一般在browser_prefs.cc或者类似的初始化文件里),把它们的默认值从false改成true。这样每个新窗口创建时,会直接读取这个全局默认配置,不会覆盖你的设置。

  • 验证WebContents初始化流程:每个新窗口或者标签页对应一个WebContents实例,你可以看看在WebContents创建完成后,有没有代码会触发Emulation状态的重置。比如在RenderFrameHost的初始化逻辑里,或者DevTools附加到WebContents的环节,有没有调用修改这三个状态的代码,把那些地方的默认值也同步改成true。

另外,你也可以在EmulationHandler的构造函数里加个日志输出,看看后续窗口的device_emulation_enabled_是不是在构造后被改成了false,这样能快速定位到被覆盖的位置~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 03:10:27