十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Electron SharedWorkerInfo 结构详解:枚举与调试页面中的 Shared Workers

Electron SharedWorkerInfo 结构详解:枚举与调试页面中的 Shared Workers Electron SharedWorkerInfo 结构详解枚举与调试页面中的 Shared Workers【免费下载链接】electron:electron: Build cross-platform desktop apps with JavaScript, HTML, and CSS项目地址: https://gitcode.com/GitHub_Trending/el/electronSharedWorkerInfo是 Electron API 文档中定义的轻量级数据结构用于描述一个页面所创建的 Shared Worker 实例仅包含id唯一标识与urlWorker 脚本地址两个字段。本篇以 SharedWorkerInfo Object 定义文档为主体结合 Electron 浏览器进程中的 C 实现与集成测试讲清楚这个结构从哪里来、配套了哪些 API、以及如何在实际项目中用它定位和调试 Shared Worker。读完本文你将能够用webContents.getAllSharedWorkers()枚举当前应用的所有 Shared Workers并通过id精确将 DevTools 附加到指定 Worker 上下文进行调试。一、SharedWorkerInfo 结构定义根据 shared-worker-info.md 的定义SharedWorkerInfo对象包含以下字段字段类型说明idstringShared Worker 的唯一标识urlstringShared Worker 的 URL即其脚本地址这是一个只读的、以“描述 句柄”为取向的结构url用于人读回答“这是哪个 Worker”id用于机读作为后续调试操作的句柄回答“如何找到它”。id不应硬编码或依赖其格式——它是运行时生成的标识真正的用途是把它原样传回 Electron 的调试 API。这个结构是webContents.getAllSharedWorkers()的返回值元素即该方法的返回类型为SharedWorkerInfo[]——一个SharedWorkerInfo数组描述当前应用内所有 Shared Workers 的信息。二、配套 APIgetAllSharedWorkers 与两个 inspect 方法SharedWorkerInfo并不是孤立存在的它构成了一套 Shared Worker 调试工具链的数据基础。在 web-contents.md 文档中与该结构直接相关的 API 有三个contents.getAllSharedWorkers()— 返回SharedWorkerInfo[]即当前所有 Shared Worker 的信息列表contents.inspectSharedWorker()— 打开第一个Shared Worker 上下文的开发者工具contents.inspectSharedWorkerById(workerId)— 按workerId即SharedWorkerInfo.id打开指定 Shared Worker 的开发者工具。典型用法是在主进程中枚举 Worker 列表后挑选目标 Worker 的id进行精确调试// 主进程 const sharedWorkers win.webContents.getAllSharedWorkers(); // 查看每个 Worker 的信息 console.log(sharedWorkers); // [{ id: 12345, url: http://example.com/sw.js }, ...] // 调试指定的 Shared Worker win.webContents.inspectSharedWorkerById(sharedWorkers[0].id);此外webview标签同样暴露了inspectSharedWorker()方法见 webview-tag.md其底层同样走 WebContents 的实现路径因此webview内创建的 Shared Worker 也可以用同一套机制调试。三、源码实现SharedWorkerInfo 从何而来在 electron_api_web_contents.cc 中可以看到三个 C 实现方法它们对应上面的 JS API1.GetAllSharedWorkers()— 结构的产生地std::vectorscoped_refptrcontent::DevToolsAgentHost WebContents::GetAllSharedWorkers() { std::vectorscoped_refptrcontent::DevToolsAgentHost shared_workers; if (type_ Type::kRemote) return shared_workers; if (!enable_devtools_) return shared_workers; for (const auto agent_host : content::DevToolsAgentHost::GetOrCreateAll()) { if (agent_host-GetType() content::DevToolsAgentHost::kTypeSharedWorker) { shared_workers.push_back(agent_host); } } return shared_workers; }从源码结构看SharedWorkerInfo的两个字段都直接映射到 Chromium 的DevToolsAgentHost对象id对应agent_host-GetId()url对应agent_host承载的 Worker 脚本 URL。实现逻辑是遍历content::DevToolsAgentHost::GetOrCreateAll()返回的全部 DevTools 代理筛选类型为kTypeSharedWorker的条目——也就是说Electron 复用 Chromium 的 DevTools Agent 机制来枚举 Shared Worker而不是自己维护一套 Worker 注册表。由此可以读出两条使用前提源码中的守卫条件已经写得很明确type_ Type::kRemote时直接返回空数组——远程 WebContents 不枚举 Shared Workerenable_devtools_为 false即 DevTools 不可用时同样返回空数组。如果getAllSharedWorkers()总是返回[]可以先确认 DevTools 功能处于启用状态。2.InspectSharedWorkerById()—id字段的消费端void WebContents::InspectSharedWorkerById(const std::string workerId) { ... for (const auto agent_host : content::DevToolsAgentHost::GetOrCreateAll()) { if (agent_host-GetType() content::DevToolsAgentHost::kTypeSharedWorker) { if (agent_host-GetId() workerId) { OpenDevTools(nullptr); inspectable_web_contents_-AttachTo(agent_host); break; } } } }这段代码印证了id的设计意图它就是DevToolsAgentHost::GetId()的字符串形式Electron 用字符串精确比对来选中目标 Agent然后通过inspectable_web_contents_-AttachTo(agent_host)让 InspectableWebContents 附加到该 Worker 上并打开 DevTools。InspectSharedWorker()的实现则类似只是不做 ID 匹配、直接附加到第一个kTypeSharedWorker类型的 Agent 上。三个方法通过 gin 绑定暴露给 JS 层electron_api_web_contents.cc.SetMethod(inspectSharedWorker, WebContents::InspectSharedWorker) .SetMethod(inspectSharedWorkerById, WebContents::InspectSharedWorkerById) .SetMethod(getAllSharedWorkers, WebContents::GetAllSharedWorkers)方法声明集中在 electron_api_web_contents.hvoid InspectSharedWorker(); void InspectSharedWorkerById(const std::string workerId); std::vectorscoped_refptrcontent::DevToolsAgentHost GetAllSharedWorkers();四、测试用例验证枚举多个 Shared Worker 并按 ID 调试Electron 的集成测试 api-web-contents-spec.ts 中的Shared Workers测试组完整覆盖了这套 API 的行为可以视为可执行的使用示例describe(Shared Workers, () { afterEach(closeAllWindows); it(can get multiple shared workers, async () { const w new BrowserWindow({ show: false, webPreferences: { nodeIntegration: true, contextIsolation: false } }); const ready once(ipcMain, ready); w.loadFile(path.join(fixturesPath, api, shared-worker, shared-worker.html)); await ready; const sharedWorkers w.webContents.getAllSharedWorkers(); expect(sharedWorkers).to.have.lengthOf(2); expect(sharedWorkers[0].url).to.contain(shared-worker); expect(sharedWorkers[1].url).to.contain(shared-worker); }); it(can inspect a specific shared worker, async () { ... const sharedWorkers w.webContents.getAllSharedWorkers(); const devtoolsOpened once(w.webContents, devtools-opened); w.webContents.inspectSharedWorkerById(sharedWorkers[0].id); await devtoolsOpened; const devtoolsClosed once(w.webContents, devtools-closed); w.webContents.closeDevTools(); await devtoolsClosed; }); });测试用例提供了两点实践信息页面侧需要真正创建 Shared Worker测试通过加载spec/fixtures/api/shared-worker/目录下的 HTML 夹具创建两个 Shared Worker主进程的getAllSharedWorkers()才能返回对应条目并且返回数组中每条url都包含对应脚本路径——这验证了url字段就是 Worker 脚本的实际地址inspectSharedWorkerById(id)是异步触发 DevTools 的测试通过监听devtools-opened事件确认调试窗口已打开随后closeDevTools()并等待devtools-closed。在自动化场景中可以同样用这两个事件来确认调试会话的生命周期。五、小结与使用建议SharedWorkerInfo只有id和url两个字段但它是 Electron 调试 Shared Worker 的入口数据结构url用于区分不同 Workerid是传给inspectSharedWorkerById()的句柄。该结构由 ChromiumDevToolsAgentHost机制支撑electron_api_web_contents.cc因此枚举结果受 DevTools 可用性约束且不适用于远程 WebContents。调试流程可概括为渲染页面创建 Shared Worker → 主进程调用getAllSharedWorkers()拿到SharedWorkerInfo[]→ 用id调用inspectSharedWorkerById()将 DevTools 精确附加到目标 Worker。与webContents.inspectServiceWorker()一样这套能力也适用于webview场景webview.inspectSharedWorker()便于在多视图应用里逐一定位 Worker 问题。参考文件SharedWorkerInfo 结构定义、WebContents API 文档、WebContents C 实现、WebContents 集成测试。【免费下载链接】electron:electron: Build cross-platform desktop apps with JavaScript, HTML, and CSS项目地址: https://gitcode.com/GitHub_Trending/el/electron创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表