SecurityException 1000, даже если используется тот же домен

У меня неприятная проблема с 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.


person Frank Razenberg    schedule 14.04.2011    source источник
comment
Вы запускаете страницу с того же порта? Запросы XMLHttp разрешены только к одному и тому же протоколу, домену и порту.   -  person jishi    schedule 14.04.2011
comment
Это не тот порт. Однако URL-адрес image.src находится на порту 80. Должно ли это иметь значение при срабатывании события onload изображения?   -  person Frank Razenberg    schedule 14.04.2011
comment
Событие onload срабатывает, пока загружается изображение - это не означает, что у вас есть к нему доступ.   -  person Sean Kinsey    schedule 14.04.2011


Ответы (2)


При "одинаковом происхождении" (см. одинаковую политику происхождения) протокол, имя хоста И порт должны быть идентичными. . Я предполагаю, что вы используете здесь разные порты?

Я думаю, что ваш вызов netscape.security.PrivilegeManager.enablePrivilege не работает из-за того, что скрипт не подписано - вы пытались удалить этот код?

person Sean Kinsey    schedule 14.04.2011
comment
Действительно, image.src устанавливается, когда задан ответ AJAX. Однако вызов getImageData выполняется в событии image.onload. Актуален ли тогда тот факт, что image.src был установлен из источника AJAX? Я предполагаю, что установка прокси перед сервером AJAX возможна. - person Frank Razenberg; 14.04.2011
comment
Часть ajax вообще не актуальна :) - person Sean Kinsey; 14.04.2011
comment
В этом случае протокол, имя хоста и порт, на котором размещено изображение, совпадают с протоколом, именем хоста и портом, на которые указывает веб-браузер. - person Frank Razenberg; 14.04.2011
comment
Полагаю, вы правы насчет того, что сценарий не подписывается. Все это кажется очень хлопотным. Действительно ли мне придется заново подписывать скрипт после каждой модификации, если я захочу его протестировать? Это «недостаток», что Chrome ничего этого не требует? - person Frank Razenberg; 14.04.2011
comment
Да, вам нужно подписывать после каждого изменения - это точка подписания (никто не может его изменить). Оператор netscape.... специфичен для Mozilla и вызовет TypeError или что-то в этом роде в Chrome, но поскольку это только в блоке catch, я думаю, Chrome никогда не попадает в него. - person Sean Kinsey; 14.04.2011
comment
Я изучил это еще немного. Вызов getImageData работает на холсте до момента, когда я рисую на нем объект Image. Изображение построено как var img = new Image(); img.src = document.domain + "/someimage.png". Может ли это каким-либо образом нарушить СОП? - person Frank Razenberg; 14.04.2011

Вызовы context.getImageData и PrivilegeManager.enablePrivilege завершаются неудачно, как только я устанавливаю document.domain = document.domain, что делается для взаимодействия с iframe, размещенными на другом субдомене. В качестве обходного пути я проксировал domain.tld / subdomain / на subdomain.domain.tld / и получил желаемый результат.

person Frank Razenberg    schedule 16.04.2011