我正在编写我的第一个 Chrome 扩展程序。我正在尝试使用 jQuery 和jQuery Image Desaturate 插件对http://www.flickr.com上的页面上的图像进行去饱和处理。
我在我的 background.html 中以编程方式加载我的脚本(以及 jQuery 和插件):
// On browser action click, we load jQuery and the desaturate plugin, then
// call our own flickrnoir.js to desaturate the photo.
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.tabs.executeScript(null, { file: "jquery.js" }, function() {
chrome.tabs.executeScript(null, {file: "jQuery.desaturate.js" }, function() {
chrome.tabs.executeScript(null, { file: "flickrnoir.js" });
})
});
});
我在我的以下文件中指定了 Flickr 页面的权限manifest.json
:
"permissions": [
"tabs", "http://www.flickr.com/", "http://*.static.flickr.com/"
]
这似乎工作正常,例如,我可以将 Flickr 照片页面上所有 div 的背景添加到红色flickrnoir.js
,然后打开 Flickr 页面并单击我的扩展程序按钮:
$("div").css("background-color", "#ff0000");
...所以,我成功加载了 jQuery,它可以成功访问和更改http://*.flickr.com/*
页面的 DOM 元素。
但是,当我尝试使用去饱和插件对图像(或实际上所有图像)去饱和时,我遇到了一个安全错误。我的代码:
$("img").desaturate();
...最终在运行这一行的 jQuery.desaturate 插件的代码中结束:
var imgPixels = canvasContext.getImageData(0, 0, imgW, imgH);
此时,Chrome 会抛出一个安全异常:
Uncaught Error: SECURITY_ERR: DOM Exception 18
......这让我停下了脚步。
编辑:好的,所以我猜这是因为页面位于www.flickr.com
,而我复制到画布的图像位于farm6.static.flickr.com
? 是否违反跨域政策?
我真的不熟悉 Chrome 扩展安全模型,或者跨域限制canvas
,或者两者如何交互,所以我可以使用你能给我的任何帮助来理解这一点,但当然,我的基本问题是 - - 我如何克服这个安全异常并让我的代码正常工作?