Trivial Chrome pageДействие расширения не работает - PullRequest
2 голосов
/ 09 марта 2012

Я пытаюсь написать тривиальное расширение Chrome pageAction для изменения всех якорей на странице с одного домена на другой ... но я не могу заставить его работать, и у меня возникают проблемы с отладкой.

Неужели я не понимаю, как должен быть построен этот вид расширения?Или я просто неправильно использую API?

manifest.json :

{
  "name": "theirs2ours",
  "version": "1.0",
  "description": "Changes all 'their' URLs to 'our' URLs.",
  "background_page": "background.html",
  "permissions": [
    "tabs"
  ],
  "page_action": {
    "default_icon": "cookie.png",
    "default_title": "theirs2ours"
  },
  "content_scripts": [
    {
      "matches": ["http://*/*"],
      "js": ["content.js"]
    }
  ]
}

background.html :

<html>
<head>
<script type='text/javascript'>

chrome.tabs.onSelectionChanged.addListener(function(tabId) {
  chrome.pageAction.show(tabId);
});

chrome.tabs.getSelected(null, function(tab) {
  chrome.pageAction.show(tab.id);
});

chrome.pageAction.onClicked.addListener(function(tab) {
    chrome.tabs.sendRequest(tab.id, {}, null);
});

</script>
</head>
<body>
</body>
</html>

content.js :

var transform = function() {
  var theirs = 'http://www.yourdomain.com';
  var ours = 'http://sf.ourdomain.com';
  var anchors = document.getElementsByTagName('a');
  for (var a in anchors) {
    var link = anchors[a];
    var href = link.href;
    if (href.indexOf('/') == 0) link.href = ours + href;
    else if (href.indexOf(theirs) == 0) link.href = href.replace(theirs, ours);
  }
};

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  transform();
});

Ответы [ 2 ]

3 голосов
/ 09 марта 2012

Я думаю, что это не тот способ сделать расширение, которое вы хотите.

Прежде всего, я предполагаю, что вы хотите заменить якоря при нажатии кнопки действия страницы.

Манифест, который у вас есть, вставляет content.js на каждую страницу, независимо от того, нажимаете ли вы кнопку действия страницы или нет.

Я предлагаю вам удалить из манифеста поле content_scripts и ввести content.js вручную, используя

chrome.tabs.executeScript(tabId, {file:'content.js'})

Вы должны сделать это в прослушивателе кликов действия страницы.

Кстати, в этом прослушивателе вы отправляете запрос к скрипту содержимого, но у него нет прослушивателя для прослушивания такого сообщения запроса. В этом расширении вам не нужно будет использовать senRequest .

2 голосов
/ 09 марта 2012

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

"permissions": [
  "tabs",
  "http://*/*"
]
...