允许iframe访问与扩展捆绑在一起的库。有时工作,有时不工作

时间:2017-02-27 15:10:03

标签: iframe google-chrome-extension permissions

在Chrome扩展程序中,我的页面顶部有以下代码段,附在脚本标记中。这是一个从我的服务器下载的页面,通过iframe.src = "https://example.com/extension-iframe"

嵌入到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页面显示,该页面试图加载这些脚本,获取取消状态,但没有警告,控制台中没有任何不良内容。

enter image description here

服务器确实返回页面,chrome://net-internals表示此页面已下载并写入磁盘缓存(URL_REQUESTDISK_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并不是必需的,我今天加了它,以确保不会造成任何问题。

0 个答案:

没有答案