Чтение документов CSS в расширении Chrome - PullRequest
3 голосов
/ 17 февраля 2012

Я пытаюсь читать страницы CSS, используя расширение Chrome.Вот что у меня есть в моем скрипте контента:

   var allSheets = document.styleSheets;
     for (var i = 0; i < allSheets.length; ++i) {
      var sheet = allSheets[i];
          var src = sheet.href;
      var rules = sheet.cssRules || sheet.rules;
     }

По некоторым причинам правила всегда пусты.Я получаю все CSS-файлы, используемые в переменной 'src'.Но правила всегда бывают нулевыми. Это работает, когда я пробую это как отдельный javascript на HTML-странице.Но происходит сбой, когда я помещаю его в скрипт содержимого моего расширения Chrome.Может кто-нибудь знает почему?

Ответы [ 4 ]

4 голосов
/ 19 февраля 2012

Хорошо, вот почему, но для интереса и интереса (никогда раньше ничего не делал с таблицами стилей), я подумал, что я бы сделал как ....

myscript.js

// Create the div we use for communication
 var comDiv = document.createElement('div');
 comDiv.setAttribute("id", "myCustomEventDiv");
 document.body.appendChild(comDiv);

// Utitlity function to insert some js into the page, execute it and then remove it
function exec(fn) {
    var script = document.createElement('script');
    script.setAttribute("type", "application/javascript");
    script.textContent = '(' + fn + ')();';
    document.body.appendChild(script); // run the script
    document.body.removeChild(script); // clean up
}


// function that gets inserted into the page
// iterates through all style sheets and collects their rules
// then sticks them in the comDiv and dispatchs the event that the content script listens for
getCSS=function (){
   var rules = '';

   // Create the event that the content script listens for
   var customEvent = document.createEvent('Event');
   customEvent.initEvent('myCustomEvent', true, true);

   var hiddenDiv = document.getElementById('myCustomEventDiv');
   var rules ='';
   var allSheets = document.styleSheets;
   for (var i = 0; i < allSheets.length; ++i) {
      var sheet = allSheets[i];
      for (var z = 0; z <= sheet.cssRules.length-1; z++) {
         rules = rules +'\n'+ sheet.cssRules[z].cssText;
      }
   }
   hiddenDiv.innerText = rules;
   hiddenDiv.dispatchEvent(customEvent);
}

// puts the rules back in the page in a style sheet that the content script can iterate through
// youd probably do most of this in the injected script normally and pass your results back through the comDiv....Im just having fun
document.getElementById('myCustomEventDiv').addEventListener('myCustomEvent', function() {
   var eventData = document.getElementById('myCustomEventDiv').innerText;
   document.getElementById('myCustomEventDiv').innerText='';

   var style = document.createElement('style');
   style.type = 'text/css';
   style.innerText=eventData;
   style = document.head.appendChild(style);
      var sheet = document.styleSheets[document.styleSheets.length-1];
      for (var z = 0; z <= sheet.cssRules.length-1; z++) {
         console.log(sheet.cssRules[z].selectorText +' {\n');
         for (var y = 0; y <= sheet.cssRules[z].style.length-1; y++) {
            console.log('  '+sheet.cssRules[z].style[y] + ' : ' + sheet.cssRules[z].style.getPropertyValue(sheet.cssRules[z].style[y])+';\n');
         };
         console.log('}\n');
      };

   // Clean up
   document.head.removeChild(style);
   document.body.removeChild(document.getElementById('myCustomEventDiv'));
});

exec(getCSS);

В случае этого вопроса Id выполняет большую часть проверок в введенном скрипте, а затем передает результаты обратно через div и его событие.,Но я хотел посмотреть, смогу ли я использовать методы dom в скрипте контента, чтобы пройти через css, и это был единственный способ, которым я мог это сделать.Мне не нравится идея вставлять правила обратно на страницу, но я не могу придумать другой способ сделать это.

1 голос
/ 22 февраля 2016

Для получения всех внешних css и всех внутренних css-файлов вы можете использовать devtools API. Если вы хотите использовать его в расширении Chrome, вам нужно подключить devtool к вашему расширению Chrome. Этот код будет работать

chrome.devtools.panels.create(
    'my chrome extension',
    'icon.png',
    'index.html',
     function(panel) {
        var initial_resources = {};

        // collect our current resources
        chrome.devtools.inspectedWindow.getResources(function(resources) {
            for (var i = 0, c = resources.length; i < c; i++) {
                if (resources[i].type == 'stylesheet') {
                    // use a self invoking function here to make sure the correct
                    // instance of `resource` is used in the callback
                    (function(resource) {
                        resource.getContent(function(content, encoding) {
                            initial_resources[resource.url] = content;
                        });
                    })(resources[i]);
                }
            }
        });
    }
);
1 голос
/ 17 февраля 2012

Просто предположение, но поскольку расширения chrome основаны на Javascript, они могут иметь проблемы с несколькими доменами. Chrome устанавливает правила и cssRules равными нулю при программной попытке получить таблицу стилей из другого домена.

0 голосов
/ 17 ноября 2012

Ответ поздно, но я думаю, что могу помочь. Одним из способов доступа к cssRules внешних листов, защищенных COR, является использование службы YQL Yahoo. Я включил его в расширение инструментов разработчика для Chrome для захвата стилей и разметки для фрагмента страницы. Расширение находится в Chrome Web Store и находится на Github .

Получите исходный код из Github и посмотрите на скрипт content.js, чтобы увидеть, как используется YQL. По сути, вы сделаете AJAX-вызов для YQL, и он получит CSS для вас. Вам нужно взять CSS-контент и либо внедрить его на страницу в виде встроенного тега стиля, либо проанализировать CSS с помощью JavaScript (для этого есть несколько библиотек) Если вы решите вставить их обратно в документ, убедитесь, что блоки новых стилей отключены, чтобы не испортить отображение страницы.

Само расширение может быть полезно для вас:

Extension Screenshot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...