我正在编写一个镀铬扩展名,每当PDF加载时,该扩展应该显示页面动作图标。为此,我正在检查内容类型,如果等于 application/pdf
,i chrome.pageAction.show(tabId)
。令我惊讶的是,这个
chrome.webRequest.onHeadersReceived.addListener(
function(details) {
if (details.tabId >= 0) {
var header = getContentTypeFromHeaders(
details.responseHeaders,
'content-type'
);
global.tabToMimeType[details.tabId] =
header && header.value.split(';', 1)[0];
if (global.tabToMimeType[details.tabId] === 'application/pdf') {
chrome.pageAction.show(details.tabId);
}
}
},
{
urls: ['*://*/*.pdf'],
types: ['main_frame']
},
['responseHeaders']
);
不起作用。我可以看到图标有时会闪烁,但它永远不会持续。相反,我替换
chrome.pageAction.show(details.tabId);
setTimeout(function() {
chrome.pageAction.show(details.tabId);
}, 100);
一切都很好。这有什么解释?有什么比等待100毫秒的系统方法了?
我相信问题是您在通过选项卡处理导航之前尝试过早显示。
因此,您的图标出现,然后页面过渡并擦拭图标。
onResponseStarted
甚至onCompleted
。由于这还不够,因此很难将webRequest
事件与tabs
/webNavigation
事件联系起来,因此您可以继续进行方法或尝试找到另一种使用tabs
/webNavigation
API的PDF的方法。bk_hr>
webNavigation
文档的这句话显示了我的意思:
通常,
webNavigation
事件与UI中显示的导航状态密切相关,而webRequest
事件对应于网络堆栈的状态,该状态通常不透明用户。
因此,webRequest
事件与Tab Truntition没有绑定,不能可靠地用于显示页面操作。