content_script 在 GitHub 上点击链接时不是 运行

content_script not running on GitHub when following links

我正在写一个 Chrome 扩展,主要用于 Github Enterprise 上的 Pull Requests,并且 运行 成为一个问题。当通过刷新或直接从浏览器输入 url 加载页面时,它 运行s,当它是 运行 来自点击 Github 中的 link ] 它不是。

例如,如果您使用 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

关于如何解决这个问题有什么想法吗?

GitHub 站点使用 jquery-pjax library (see How to make github style page transitions by pjax).

  • 基本上你只需要 运行 内容脚本一次并在 an injected <script> element code 中附加 pjax 事件处理程序,这将重用 jQuery$ 站点的变量。

    • 在这些处理程序中,您可以将带有 document.dispatchEvent 的消息发送到您的内容脚本,内容脚本将在其 window.addEventListener("blabla", ...)
    • 中接收它
    • 或者您可以 allow the access to chrome.runtime.sendMessagemanifest.json 的 github 站点上,这样页面注入代码将能够发送一条消息,该消息可以被 [=] 中的扩展程序接收17=]听众。
  • 或者,您可以在后台脚本中使用 chrome.webNavigation.onHistoryStateUpdated,但这会在安装过程中引起警告,扩展可以 "Read your browsing history",这是一个全局权限,与内容脚本不同解决方案。

我想出的工作示例,以防对其他人有所帮助。

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 存储库。