Попытка добавить правило в таблицу стилей CSS дает "Операция небезопасна" в Firefox

Я использую Greasemonkey и пытаюсь добавить правило в определенном домене. Но это приводит к ошибке, говорящей The operation is insecure.
Код отлично работает в Chrome.

script работает на http://mydomain.com/test/test.php
И файл CSS http://cdn.mydomain.com/test/css/global.css

Моя функция:

function css(selector, property, value) {
    for (var i=0; i<document.styleSheets.length;i++) 
    {
        try 
        { 
            document.styleSheets[i].insertRule(selector+ ' {'+property+':'+value+'}', document.styleSheets[i].cssRules.length);
        } 
        catch(err) 
        { 
            try // IE
            { 
                document.styleSheets[i].addRule(selector, property+':'+value);
            } 
            catch(err) {}
        }
    }
}

В Google я обнаружил, что это может быть из-за того, что я пытаюсь получить доступ к кросс-доменам, поэтому я попытался добавить URL-адрес в файл CSS к "принятым URL-адресам", но не получил результат.

Как это исправить?

Ответ 1

Да, Firefox блокирует доступ к таблицам стилей, которые являются междоменными. Он может (или, по крайней мере, использовать) исключение:

"Доступ к ограниченному URI отклонен": "1012"
nsresult: "0x805303f4 (NS_ERROR_DOM_BAD_URI)"
местоположение:......


Но с CSS вам не нужно добавлять правила в конкретную таблицу стилей. Просто перепишите стиль, о котором вы заботитесь.

Например, если наборы страниц:

body {
    background: white;
}

И ваш script устанавливает:

body {
    background: red;
}    

Затем страница будет красной (номинально).

Для самого простого и умного способа изменения стилей целевой страницы см. предыдущие ответы, такие как этот.

Ответ 2

Я нашел, что это решение работает вокруг проблемы:

var style = document.createElement("style");
document.head.appendChild(style);
style.sheet.insertRule("body { font-size:40px; }", 0);

Ответ 3

Правила из таблицы стилей выполняются с разрешениями этой таблицы стилей различными способами. Это означает, что если вы можете вводить правила в таблицу стилей между сайтами, вы можете выполнять некоторые атаки с помощью межсайтовых сайтов. Именно поэтому Firefox блокирует добавление правила в таблицу стилей между сайтами.

Возможно, что Chrome использует все правила с разрешениями для документа привязки, поэтому он позволяет добавлять вещи на листе... Однако обратите внимание, что Chrome не позволит вам прочитать таблицу стилей между сайтами.

Обратите внимание, что если вы загрузите таблицу стилей с помощью CORS (установив атрибут "crossorigin" на <link> и убедившись, что ваш CDN обслуживает правильные заголовки), вы сможете получить доступ к нему на разных площадках.