0

我正面临一个麻烦的 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();
    varpreparedImageData;

    sourceImage.onload = function() {
        var canvas = document.createElement('canvas');
        画布.宽度 = 100; 画布.高度 = 100;
        var ctx = canvas.getContext("2d");        
        // 调整图像大小
        ctx.drawImage(sourceImage, 0, 0, sourceImage.width, sourceImage.height, 0, 0, canvas.width, canvas.height);    
        // 保存为图像数据
        尝试 {
            尝试 {
                PreparedImageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
            }
            抓住(e){
                netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
                PreparedImageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
            }                          
        }
        抓住(e){
            throw new Error("无法访问图像数据:" + e)
        }
    }

第一个 getImageData 调用抛出,并且 enablePrivilege 调用也立即抛出。错误文本是“来自“http://127.0.0.1”的脚本被拒绝 UniversalBrowserRead 权限。”。我已经检查过,这些消息似乎只应在尝试从另一个域访问图像上的 getImageData 时出现,但事实并非如此(对吗?)。没有严格的安全策略(一切默认),Firefox 4.0。相同的代码在 Chrome 上运行良好。

4

2 回答 2

1

通过 'same origin' 参考Same Origin Policy,协议、主机名和端口需要相同。我猜你在这里使用不同的端口?

我认为发生的情况是netscape.security.PrivilegeManager.enablePrivilege由于脚本未签名而导致您的调用失败-您是否尝试过删除此代码?

于 2011-04-14T13:14:39.297 回答
0

一旦我设置了与托管在不同子域上的 iframe 的合作,调用context.getImageData就会失败。作为一种解决方法,我将 domain.tld/subdomain/ 代理到 subdomain.domain.tld/ 并获得了所需的结果。PrivilegeManager.enablePrivilegedocument.domain = document.domain

于 2011-04-16T12:14:40.860 回答