我目前正在使用 Chrome 扩展程序,找不到一个方便的解决方案来将消息从后台上下文(我们称之为BG)发送到注入脚本的上下文(我们称之为INJ)。从INJ向BG发送消息就像一个魅力。但我希望BG做一个XMLHttpRequest
可能需要一些时间的事情,所以我想将此请求的评估发送给INJ。
不幸的是,我不允许在INJ的上下文中注册侦听器。所以我能想到的最佳解决方案包括:
- INJ给BG发消息,触发
XMLHttpRequest
- 只要请求返回BG就在本地存储请求的结果
- INJ反复向BG发送进一步的消息询问结果,除非BG以结果回答。
也许是这样的:
输入:
function whaitForResult ()
{
chrome.runtime.sendMessage ({method: "getResult"}, function (response)
{
if (response.finished === "true")
// request finished, lets go on
else
setTimeout(whaitForResult, 100);
}
}
chrome.runtime.sendMessage({method : "triggerRequest"}, function(response) {});
whaitForResult ();
背景:
chrome.runtime.onMessage.addListener (function(request, sender, sendResponse)
{
if (request.method == "triggerRequest")
{
// startXMLHttpRequest ();
sendResponse ({});
return true;
}
else if (request.method == "getResult")
{
if (finishedXMLHttpRequest ())
sendResponse ({finished:"true", result: resultFromXMLHttpRequest ()});
else
sendResponse ({finished:"false"});
return true;
}
});
我想这应该可行,但在我看来这很混乱。所以我的问题是:有没有一种方便的方法可以向注入的脚本发送消息?
如果我的扩展概念是废话,请提出替代方案。但要做到这一点,XMLHttpRequest
我需要一些变量localStorage
,因为这些数据非常敏感,我不想将这些变量传递给INJ的上下文。因此,XMLHttpRequest
在INJ中进行不是一种选择。