Skip to content

Commit 2e60aa6

Browse files
committed
🐛 修复 offscreen 页面 navigator.serviceWorker.controller 为 null 的问题
扩展 offscreen 页面的 controller 通常为 null,改用 navigator.serviceWorker.ready 获取 registration.active 作为 SW 引用。
1 parent 738f406 commit 2e60aa6

1 file changed

Lines changed: 22 additions & 2 deletions

File tree

packages/message/window_message.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,15 +302,30 @@ export class ServiceWorkerMessageSend implements Message {
302302
}
303303
}
304304

305-
// Offscreen端通过navigator.serviceWorker.controller.postMessage向SW发送消息
305+
// Offscreen端通过navigator.serviceWorker向SW发送postMessage消息
306306
// 与ServiceWorkerMessageSend配对使用,实现Offscreen→SW的postMessage通道
307+
// 注意: 扩展offscreen页面的navigator.serviceWorker.controller通常为null,
308+
// 需要通过navigator.serviceWorker.ready获取registration.active
307309
export class ServiceWorkerClientMessage implements MessageSend {
308310
EE = new EventEmitter<string, any>();
309311

312+
private sw: ServiceWorker | null = null;
313+
private swReady: Promise<ServiceWorker>;
314+
310315
constructor() {
311316
navigator.serviceWorker.addEventListener("message", (e) => {
312317
this.messageHandle(e.data);
313318
});
319+
// controller在扩展offscreen页面中通常为null,通过ready获取active
320+
this.sw = navigator.serviceWorker.controller;
321+
if (this.sw) {
322+
this.swReady = Promise.resolve(this.sw);
323+
} else {
324+
this.swReady = navigator.serviceWorker.ready.then((reg) => {
325+
this.sw = reg.active!;
326+
return this.sw;
327+
});
328+
}
314329
}
315330

316331
messageHandle(data: WindowMessageBody) {
@@ -325,7 +340,12 @@ export class ServiceWorkerClientMessage implements MessageSend {
325340
}
326341

327342
private postToServiceWorker(message: any) {
328-
navigator.serviceWorker.controller!.postMessage(message);
343+
if (this.sw) {
344+
this.sw.postMessage(message);
345+
} else {
346+
// 初始化期间还没获取到SW引用,等待ready后发送
347+
this.swReady.then((sw) => sw.postMessage(message));
348+
}
329349
}
330350

331351
async connect(data: TMessage): Promise<MessageConnect> {

0 commit comments

Comments
 (0)