Поиск javascript на странице через расширение Chrome

Я хотел создать простое расширение для Chrome, которое выполняло бы поиск в HTML/DOM текущей активной вкладки и выводило во всплывающем окне количество элементов, содержащих javascript, соответствующий определенному источнику.

В руководствах по расширению Chrome я прочитал, что сценарии контента не могут ни взаимодействовать, ни даже видеть другие javascript на странице, что заставило меня поверить, что это невозможно. Кто-нибудь знает наверняка, возможно ли создание такого типа расширения?


person user3731928    schedule 29.08.2015    source источник


Ответы (1)


Я сделал что-то подобное не так давно; Мне нужно было увидеть элементы onclick и другие атрибуты, что обычно невозможно:

Стоит отметить, что происходит с объектами JavaScript, которые являются общими для страницы и расширения, например, событие window.onload. Каждый изолированный мир видит свою версию объекта.

Существует метод внедрения код в контексте страницы. Такой код может получить доступ к контексту JS окна, а затем передать его вашему сценарию содержимого. В моем случае я просто добавил дополнительный атрибут к узлам с прикрепленным JS.

// Fill inline handler copies
function fillClickHandlers(callback) {
  var injected = function() {
    // Note: This executes in another context!
    // Note: This assumes jQuery in the other context!
    $("[onclick]").each(function() {
      this.dataset["onclick"] = this.attributes["onclick"].value;
    });
    $("[onsubmit]").each(function() {
      this.dataset["onsubmit"] = this.attributes["onsubmit"].value;
    });
    $("[onload]").each(function() {
      this.dataset["onload"] = this.attributes["onload"].value;
    });
  }

  var s = document.createElement('script');
  s.textContent = "(" + injected + ")();";
  (document.head||document.documentElement).appendChild(s);
  // Script is synchronously executed here
  s.parentNode.removeChild(s);
  callback();
}

// Erase inline handlers copies
function eraseClickHandlers(callback) {
  $("[data-onclick], [data-onsubmit], [data-onload]").each(function() {
    delete this.dataset.onclick;
    delete this.dataset.onsubmit;
    delete this.dataset.onload;
  });
  callback();
}

// Usage:
fillClickHandlers(function() {
  doActualWork(function() {
    eraseClickHandlers(doSomethingElse) 
  });
});

Обратите внимание, что для фактических тегов <script> вы можете свободно проверять атрибут src или textContent.

person Xan    schedule 29.08.2015