content_script не запускается на GitHub при переходе по ссылкам

Я пишу расширение Chrome в основном для запросов на вытягивание на Github Enterprise и столкнулся с проблемой. Когда страница загружается с помощью обновления или прямого ввода URL-адреса из вашего браузера, она запускается, когда она запускается при нажатии на ссылку в Github, она не запускается.

Например, если вы перейдете на эту страницу с Pull Requests и щелкнете по одному из них, он не запустится. . Но если вы обновите ту же страницу, она запустится.

manifest.json

{
    "name": "Github Sample",
    "manifest_version": 2,
    "version": "0.0.1",
    "description": "Sample",
    "permissions": [
        "tabs", "<all_urls>",
        "http://github.com/*"
    ],
    "content_scripts": [
        {
            "matches": [ "https://github.com/*" ],
            "js": ["github.sample.js"],
            "run_at": "document_end"
        }
    ]
}

github.sample.json

// ==UserScript==
// @author Jacob Schoen
// ==/UserScript==

alert("Extension has Ran");

Чтобы упростить задачу, я отправил это на github.

Любые идеи о том, как решить эту проблему?


person Jacob Schoen    schedule 16.10.2015    source источник


Ответы (2)


Сайт GitHub использует библиотеку jquery-pjax (см. Как сделать переходы страниц в стиле github с помощью pjax).

  • По сути, вам нужно только один раз запустить сценарий содержимого и подключить обработчики событий pjax внутри введенный <script> код элемента, который будет повторно использовать jQueryили $ переменную сайта.

    • In those handlers you can send a message with document.dispatchEvent to your content script that will receive it in its window.addEventListener("blabla", ...)
    • или вы можете разрешить доступ к chrome.runtime.sendMessage на сайте github в manifest.json, чтобы код, внедренный страницей, сможет отправить сообщение, которое может быть получено расширением в chrome.runtime.onMessageExternal listener.
  • В качестве альтернативы вы можете использовать chrome.webNavigation.onHistoryStateUpdated в фоновом сценарии, но это вызвать предупреждение во время установки о том, что расширение может «Читать историю просмотров», что является глобальным разрешением, в отличие от решения сценария содержимого.

person wOxxOm    schedule 16.10.2015
comment
Спасибо, я думаю, что теперь я двигаюсь в правильном направлении. - person Jacob Schoen; 16.10.2015
comment
Еще раз спасибо, я смог заставить его работать с вашим объяснением. - person Jacob Schoen; 16.10.2015

Рабочий пример, который я придумал, на случай, если он поможет кому-то еще.

manifest.json

{
    "name": "Github Sample",
    "manifest_version": 2,
    "version": "0.0.1",
    "description": "Sample",
    "permissions": [
        "activeTab",
        "tabs", "<all_urls>",
        "http://github.com/*"
    ],
    "content_scripts": [
        {
            "matches": [ "https://github.com/*" ],
            "js": ["github.sample.js"],
            "run_at": "document_idle"
        }
    ],
    "web_accessible_resources": ["inject.js"]
}

github.sample.js

// ==UserScript==
// @author Jacob Schoen
// ==/UserScript==

function myAlert() {
    alert("Extension has Ran");
}

window.addEventListener("pageLoadTransition", myAlert);

var s = document.createElement('script');
// TODO: add "script.js" to web_accessible_resources in manifest.json
s.src = chrome.extension.getURL('inject.js');
s.onload = function() {
    this.parentNode.removeChild(this);
};
(document.head||document.documentElement).appendChild(s);

//still have to load this one for direct page loads
myAlert();

inject.js

$(document).on('pjax:success', function() {
  var evt=document.createEvent("CustomEvent");
    evt.initCustomEvent("pageLoadTransition", true, true, null);
    document.dispatchEvent(evt);
})

Я также обновил репозиторий Github рабочим примером.

person Jacob Schoen    schedule 16.10.2015