Установка разрешений перекрестного источника в манифесте, созданном для перекрестного

В расширении Chrome вы можете установить разрешения в manifest.json, Я предполагаю, что crossrider создает этот файл за кулисами. Как можно изменить разрешения, созданные расширением кроссрайдера, или это пока невозможно?

Моему расширению, в частности, нужен доступ к изображениям и видео на всех страницах. Это отклоняется из-за ошибки CORS, и я считаю, что установка правильных разрешений решит мою проблему.


[РЕДАКТИРОВАТЬ]

Вот суть моего кода:

try {
    //all nodes in the DOM go through this function
    var parseNode = function(node) {

        //only get img and video tags
        var nodeName = node.nodeName.toUpperCase();
        if (["IMG", "VIDEO"].indexOf(nodeName) == -1)
            return;

        //attempt to extract their pixel data
        var canvas = document.createElement("canvas");
        var context = canvas.getContext("2d");
        try {
            console.log(node.src, " ", node.clientWidth, "x", node.clientHeight);
            canvas.width = node.clientWidth; //may be zero if failed CORS
            canvas.height = node.clientHeight;
            context.drawImage(node, 0, 0);
            var dat = context.getImageData(0, 0, canvas.width, canvas.height);
            console.log("Success");
            canvas.remove();
            return dat.pixels;
        }
        catch (e) {
            console.log("Failed ", node, ": ", e);
            canvas.remove();
        }
        return null;
    };

    //parse everything currently loaded
    var everything = document.getElementsByTagName("*");
    for (var i = 0; i < everything.length; i++) {
        parseNode(everything[i]);
    }

    //use a mutation ovserver to parse everything that gets injected later
    var parseMutations = function(mutations) {
        mutations.forEach(function(mutation) {
            if (mutation.addedNodes) {
                for (var i = 0; i < mutation.addedNodes.length; i++) {
                    parseNode(mutation.addedNodes[i]);
                }
            }
        });
    };

    var observer = new MutationObserver(parseMutations);
    observer.observe(document, {
        childList:     true,
        subtree:       true
    });
}
catch (e)
{
    //this has to be here since all browsers are so shit at catching syntax errors in extensions
    //not to mention the crossrider extension won't install properly if there's a typo or missing semicolon. so much pain
    console.log(e, " ", e.stack); //stack is pretty useless with crossrider code injection
}

На многих страницах я просто получаю тонну из них:

DOMException {
    code: 18
    message: "Failed to execute 'getImageData' on 'CanvasRenderingContext2D': the canvas has been tainted by cross-origin data."
    name: "SecurityError"
    ...

[РЕДАКТИРОВАТЬ]

Я удалил try/catch, чтобы ошибки печатались правильно. Я все еще вижу много ошибок.

Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': the canvas has been tainted by cross-origin data. 

Я использую эту страницу для тестирования с: http://en.wikipedia.org/wiki/HSL_and_HSV

"Беги в IFrame" выключен.

try {
    //all image and video nodes in the DOM go through this function
    var parseNode = function(node) {
        //attempt to extract their pixel data
        var canvas = document.createElement("canvas");
        var context = canvas.getContext("2d");
        node.title = "FAILED";
        console.log(node.src, " ", node.clientWidth, "x", node.clientHeight);
        canvas.width = Math.max(1, node.clientWidth); //may be zero if failed CORS
        canvas.height = Math.max(1, node.clientHeight);
        context.drawImage(node, 0, 0);
        var dat = context.getImageData(0, 0, canvas.width, canvas.height);
        canvas.remove();
        return dat.pixels;
        node.title = "SUCCESS";
        return null;
    };

    //parse everything currently loaded
    var everything = document.getElementsByTagName("*");
    for (var i = 0; i < everything.length; i++) {
        var node = everything[i];
        var nodeName = node.nodeName.toUpperCase();
        if (["IMG", "VIDEO"].indexOf(nodeName) != -1)
            (function(n) {setTimeout(function(){parseNode(n);},1000);})(node);
    }

    //use a mutation ovserver to parse everything that gets injected later
    var parseMutations = function(mutations) {
        mutations.forEach(function(mutation) {
            if (mutation.addedNodes) {
                for (var i = 0; i < mutation.addedNodes.length; i++) {
                    var node = mutation.addedNodes[i];
                    var nodeName = node.nodeName.toUpperCase();
                    if (["IMG", "VIDEO"].indexOf(nodeName) != -1)
                        (function(n) {setTimeout(function(){parseNode(n);},1000);})(node);
                }
            }
        });
    };

    var observer = new MutationObserver(parseMutations);
    observer.observe(document, {
        childList:     true,
        subtree:       true
    });
}
catch (e)
{
    //this has to be here since all browsers are so shit at catching syntax errors in extensions
    console.log(e, " ", e.stack); //stack is pretty useless with crossrider code injection
}

1 ответ

В настоящее время платформа Crossrider не предоставляет механизм для изменения разрешений манифеста, хотя есть планы рассмотреть это в будущих выпусках.

Следовательно, вы можете вручную поэкспериментировать с добавлением разрешения в файл CRX, хотя имейте в виду, что это может помешать возможности поддержки вашего расширения.

[Раскрытие информации: я сотрудник Crossrider]

Другие вопросы по тегам