chrome插件content内容脚本和background脚本通过cookie通讯,让background脚本关闭当前窗口

455 阅读2分钟

我这边有一个功能需求,就是使用插件拦截csdn的发文章请求,然后获取发布的文章内容,并将文章存储到storage里面,然后点击同步到掘金,就会自动打开一个页面,让内容脚本自动发布掘金文章,并替换文章内容里面的图片链接,等发布完成之后,通知background脚本关闭当前页面。这么做的原因就是因为content内容脚本不能访问和使用chrome.windows这个浏览器插件api,所以就无法自动关闭自己这个窗口。

创建了掘金这个tab页之后,就将这个tab页的id存储到storage里面,等发布完文章之后,通知background.js脚本,脚本就可以从storage里面获取到这个tab页的id,然后执行移除方法,将这个tab关闭。

在这里有个问题,就是内容脚本我使用的是MAIN方式,所以就和插件是隔离状态了,这个时候要想和background脚本通讯就需要另辟蹊径。所以这里我间接使用cookie的方式通讯,当发布完成文章之后,我就使用修改cookie的方式,手动给juejin.cn添加了一个cookie并修改了它。

 document.cookie = `juejinDone=${tid}; path=/; domain=juejin.cn; secure`

这个时候,就可以在background里面通过监听cookie变化,来获取变化的cookie的值,从而实现间接的通讯:

// listen juejin cookie change and control chrme windows query and close
chrome.cookies.onChanged.addListener(async (changeInfo) => {
    if (changeInfo.cookie.name === 'juejinDone') {
        console.log('juejin cookie change', changeInfo)
        // close juejin windows
        try {
            const juejinWinId: number = await storage.getItem('juejinWin')
            console.log('juejin win id', juejinWinId)
            juejinWinId &&
                chrome.windows.remove(juejinWinId).then(() => {
                    storage.removeItem('juejinWin')
                })
        } catch (error) {
            console.log('close juejin win err', error)
        }
    }
})

当监听到juejinDone的值发生变化后,说明文章已经发布完成,这个时候插件就可以获取到掘金的tab页id,然后使用chrome.windows.remove这个api将这个tab页关闭。