我遇到了麻烦的Javascript / Firefox问题。 相关代码如下所列。
基本上会发生以下情况:
1. document.ready触发并发起一个AJAX请求(到document.domain:8484 / getTrack.php或其他)
2.收到AJAX响应。此响应包含图像位置的URL(相同域)。因此,设置sourceImage.onload,然后设置sourceImage.src
3. sourceImage.onload触发。现在的想法是在内存中保留一个重新调整大小的图像,使其完全适合将要绘制的画布。我想将这个已调整大小的图像保留在内存中,因为我要将它(部分)写入我的画布很多次,每次调整大小应该慢得多。
var SourceImage = new Image(); var preparedImageData; sourceImage.onload = function() { var canvas = document.createElement('canvas'); canvas.width = 100; canvas.height = 100; var ctx = canvas.getContext("2d"); // resize image ctx.drawImage(sourceImage, 0, 0, sourceImage.width, sourceImage.height, 0, 0, canvas.width, canvas.height); // save as imagedata try { try { preparedImageData = ctx.getImageData(0, 0, canvas.width, canvas.height); } catch (e) { netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); preparedImageData = ctx.getImageData(0, 0, canvas.width, canvas.height); } } catch (e) { throw new Error("unable to access image data: " + e) } }
第一个getImageData调用抛出,而enablePrivilege调用也会立即抛出。错误文本是“来自”http://127.0.0.1的脚本“被拒绝的UniversalBrowserRead权限。”我已经检查过,看起来这些消息只应在尝试访问来自另一个域的图像上的getImageData时出现,但事实并非如此(对吗?)。没有严格的安全策略(一切都默认),Firefox 4.0。相同的代码在Chrome上运行良好。
答案 0 :(得分:1)
通过“同源”引用Same Origin Policy,协议,主机名和端口必须相同。我猜你在这里使用不同的端口?
我认为,由于脚本不是signed,您对netscape.security.PrivilegeManager.enablePrivilege
的调用失败了 - 您是否尝试删除此代码?
答案 1 :(得分:0)
我设置context.getImageData
时PrivilegeManager.enablePrivilege
和document.domain = document.domain
调用失败,这是为了与托管在不同子域上的iframe合作完成的。作为一种解决方法,我将domain.tld / subdomain /代理到subdomain.domain.tld /并获得了所需的结果。