在Chrome扩展程序中,我的页面顶部有以下代码段,附在脚本标记中。这是一个从我的服务器下载的页面,通过iframe.src = "https://example.com/extension-iframe"
基本上它是一个popup-extension,当打开时,会将一个url发布到example.com,当服务器响应OK时,弹出窗口会打开一个iframe,其中包含来自服务器的页面,允许编辑提交的网址。这是为了简化扩展程序的开发,因为编码发生在iframe的内容中,而不是扩展本身,这需要每天多次上传到chrome网上商店。
var parameters = {};
var tokens = document.location.search.substr(1).split("&");
for (i = 0; i < tokens.length; i++) {
var values = tokens[i].split("=")
parameters[values[0]] = values[1]
};
var scripts;
var use_bundled_scripts = true; // <======= TOGGLE
if (use_bundled_scripts) {
scripts = [ // -- optimize for speed by bundling the libraries
'chrome-extension://' + parameters['extension-id'] + '/libraries/moment.min.js',
'chrome-extension://' + parameters['extension-id'] + '/libraries/angular.min.js',
'chrome-extension://' + parameters['extension-id'] + '/libraries/angular-animate.min.js',
]
}
else {
scripts = [ // -- else use a CDN
'https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.16.0/moment.min.js',
'https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js',
'https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular-animate.min.js',
]
}
for (i in scripts) {
var script = document.createElement('script');
script.async = false;
script.src = scripts[i];
document.getElementsByTagName('head')[0].appendChild(script);
}
这在以前版本的Chrome中可靠地运行(当前是56.0.2924.87)我认为版本55包含和向下,因为最近出现了这个问题。 1月底2月初可能是时间点。所以我认为这是由于Chrome的一些变化。
如您所见,扩展程序动态加载脚本。当我从cloudflare加载它们时,它每次都有效。但是当我使用与扩展捆绑在一起的那个时,它有时会起作用。
很难说它在哪种情况下会起作用。我使用自己的配置文件并行运行多个浏览器,有时我觉得这是因为我有两个或更多浏览器打开了不同的配置文件,但是有些事情告诉我事实并非如此。很难调试。
问题由iframe页面显示,该页面试图加载这些脚本,获取取消状态,但没有警告,控制台中没有任何不良内容。
服务器确实返回页面,chrome://net-internals
表示此页面已下载并写入磁盘缓存(URL_REQUEST
且DISK_CACHE_ENTRY
为绿色)
我也得到了以下条目(仅列出了3的第一个(libraries / moment.js))
25222: URL_REQUEST
chrome-extension://oadcendiggijjpegcoledekjhghejoac/libraries/moment.min.js
Start Time: 2017-02-27 15:07:24.353
t=412 [st=0] +REQUEST_ALIVE [dt=1]
t=412 [st=0] URL_REQUEST_DELEGATE [dt=0]
t=413 [st=1] +URL_REQUEST_START_JOB [dt=0]
--> load_flags = 33024 (MAYBE_USER_GESTURE | VERIFY_EV_CERT)
--> method = "GET"
--> priority = "LOWEST"
--> url = "chrome-extension://oadcendiggijjpegcoledekjhghejoac/libraries/moment.min.js"
t=413 [st=1] -URL_REQUEST_START_JOB
--> net_error = -20 (ERR_BLOCKED_BY_CLIENT)
t=413 [st=1] URL_REQUEST_DELEGATE [dt=0]
t=413 [st=1] -REQUEST_ALIVE
--> net_error = -20 (ERR_BLOCKED_BY_CLIENT)
所以有这个net_error = -20 (ERR_BLOCKED_BY_CLIENT)
但我不知道为什么只有当浏览器感觉这样做时才会被阻止。
我已尝试禁用所有扩展程序(即uBlock Origin),但这并没有任何效果。
当它工作时,它会在浏览器启动后持续几分钟(10左右)。然后,有时它根本不起作用。当我然后终止所有chrome.exe启动一个实例,我可能会很幸运,它的工作原理。这感觉就像是铬本身的一个错误。
如何确保iframe可以加载捆绑的js文件?我可以添加到清单中吗?
{
"browser_action": {
"default_icon": "images/sm-logo-insert-19px-amber-border.png",
"default_title": "Add to ...",
"default_popup": "popup.html"
},
"background": {
"page": "background.html"
},
"options_page": "options.html",
"content_security_policy": "script-src 'self' https://*.example.com https://cdnjs.cloudflare.com https://ajax.googleapis.com; object-src 'self' https://*.example.com",
"permissions": [ "tabs", "activeTab", "contextMenus", "https://*.example.com/*", "https://cdnjs.cloudflare.com/ajax/libs/*", "https://ajax.googleapis.com/ajax/libs/*" ]
}
content_security_policy
并不是必需的,我今天加了它,以确保不会造成任何问题。