在 Code.org 的 App Lab 编辑器中,我们最近开始在 Chrome 64 中看到这个错误:
Uncaught DOMException: Failed to read the 'rules' property from 'CSSStyleSheet'
在这个旨在检测浏览器是否正在使用 CSS 媒体查询的函数中抛出错误,在包含 styleSheets[i].cssRules
的行中。
/**
* IE9 throws an exception when trying to access the media field of a stylesheet
*/
export function browserSupportsCssMedia() {
var styleSheets = document.styleSheets;
for (var i = 0; i < styleSheets.length; i++) {
var rules = styleSheets[i].cssRules || styleSheets[i].rules;
try {
if (rules.length > 0) {
// see if we can access media
rules[0].media;
}
} catch (e) {
return false;
}
}
return true;
}
该问题已在 Windows、OSX、Ubuntu 和 ChromeOS 上出现;在 Chrome 版本 64.0.3282.167 和 64.0.3282.186 上。然而,我们也发现这个问题 并没有 发生在完全相同的 Chrome 版本和平台上——而且我们似乎无法在隐身窗口中重现这个问题。
这个错误的根本原因是什么?
原文由 Brad Buchanan 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是一个很好的故事,也是网络开发人员的一个新“问题”,所以我不得不分享:
Chrome 64.0.3282.0(2018 年 1 月发布, 完整更改列表)引入了对样式表安全规则的更改。我很生气,因为我在任何比完整提交列表更详细的变更日志中找不到此更改。
Chromium 中的提交 a4ebe08 描述如下:
此提交修复了错误 安全性:关于 CSS 和链接元素的 CORS 实现不一致。 链接的 W3C 规范详细描述了 CSS 对象模型的使用需要同源访问的地方。
综上所述,为什么这个问题会出现在 App Lab 中?我们不应该遇到任何 CORS 问题,因为我们只从我们自己的来源加载样式表:
最后的线索是我们无法在私人选项卡中重现此问题。我们开始查看 Chrome 扩展并意识到一些受影响的用户启用了 Loom Video Recorder 扩展,它似乎将自己的 CSS 注入到页面中。由于我们的(原始)函数正在遍历 所有 已加载的样式表,因此它试图访问由扩展注入的样式表,从而导致 CORS 错误。
也就是说,围绕 Chrome 中的这一变化仍然存在一些悬而未决的问题和争论:
try/catch
。为了解决我们的问题,我们只是撕掉了整个功能。 我们不再支持 IE9,而且我们知道我们支持的所有浏览器都能正确处理媒体查询。
相关(但不完全重复)的问题: