如何获取扩展程序中文件的完全限定URL?

时间:2017-08-19 16:21:51

标签: javascript firefox-webextensions

我正在使用WebExtension API创建我的第一个Firefox扩展程序,但无法找到将网站重定向到扩展程序目录中的HTML文件的方法。

我已设法将网站重定向,但仅限于网站上的其他网站或其他网页。

的manifest.json:

{
    "manifest_version": 2,
    "name": "Focus",
    "version": "1.0",
    "permissions": [
        "activeTab"
    ],
    "browser_action": {
        "default_title": "Focus",
        "default_popup": "interface/main.html"
    },
    "content_scripts": [
        {
            "matches": ["*://*.reddit.com/*"],
            "js": ["redirect.js"]
        }
    ]
}

redirect.js:

window.location = "interface/redirect.html";

当前代码会将您重定向到网站上的其他页面,例如如果您打开reddit.com,它将转到reddit.com/interface/redirect.html

我的目标是将您重定向到我不需要在网站上托管的自定义HTML页面。

1 个答案:

答案 0 :(得分:4)

您正在将网页的网址更改为相对于当前网域的网址。您的扩展程序中的页面不在 reddit.com 域中。如果您希望URL来自其他域,则必须指定域。在这种情况下,您需要使用runtime.getURL()来获取完全限定的网址:

Firefox或Chrome:

window.location = chrome.runtime.getURL("interface/redirect.html");

或(仅限Firefox):

window.location = browser.runtime.getURL("interface/redirect.html");

你还应该添加:

"run_at": "document_start"

到您的 manifest.json content_scripts条目。这样做会阻止页面显示,即使是短暂的时间。换句话说,通过使用document_start,您的内容脚本将在呈现的 redit.com 页面之前运行。

重定向网页的其他方法

当您想要重定向单个或几个预定义域时,使用内容脚本的方法是合理的。这将导致向用户报告最不宽广的权限(即只有matches中的域名。)

但是,对于重定向域的动态列表,这还不够。在这种情况下,您应该使用webNavigation.onBeforeNavigate侦听器来执行导航的重定向。您还可以使用webRequest侦听器将所有流量重定向到一个或多个域。使用webRequest可以用来阻止对域的所有请求,但比使用webNavigation.onBeforeNavigate阻止导航更加耗费资源(如果您选择,则包括iframe)。您使用哪种方法取决于您希望做什么。

您还可以使用tabs.onUpdated侦听器来执行重定向,但使用新网址的事件会在webNavigation.onBeforeNavigate和整个webRequest序列之后触发。换句话说,使用tabs.onUpdated侦听器仍将允许对您重定向的域的请求,页面的DOM已创建并可能(简要地)显示给用户。