我目前正在尝试将 Chrome 扩展移植到 Firefox。
Chrome 扩展程序有一个“登录”页面,该页面以 HTML 文档的形式在新选项卡中打开。HTML 文档与其他扩展文件一起存储在本地目录中。用户输入一个 URL,该 URL 应该代表运行我们应用程序的服务器,用户将被要求登录。成功登录后,用户将被重定向回 options.html 页面,该页面已更新以显示用户的偏好。
我想在 Firefox 扩展中复制它,即我想避免在 XUL 中编写任何东西来构建选项页面。
我尝试使用我的 HTML 页面打开一个新选项卡,如下所示:
var url = "chrome://myextension/content/options.html";
var win = Components.classes['@mozilla.org/appshell/window-mediator;1']
.getService(Components.interfaces.nsIWindowMediator)
.getMostRecentWindow('navigator:browser');
win.gBrowser.selectedTab = win.gBrowser.addTab(url);
但我不喜欢这个有几个原因:1)新选项卡中的导航栏显示“chrome:// ...” URL,2)它破坏了身份验证过程。身份验证是使用 OAuth 类型系统完成的,并且当前 URL 被传递到 API 中,以便用户可以在身份验证成功后被重定向回来。身份验证失败,“chrome://”作为 URL 的一部分。
只是出于好奇,我尝试像这样对 URL 进行硬编码:
http://myextension/content/options.html
并且用户实际上已成功通过身份验证,但随后重定向显然失败了。
Chrome 扩展程序似乎没有任何问题或奇怪的黑客攻击。据我所知,打开它的工作原理是这样的:
chrome.tabs.create({"url":chrome.extension.getURL("options.html"), "selected":true});
稍后引用选项卡的 URL,以便我们可以重定向回它,就像这样:
var options_url = chrome.extension.getURL('options.html');
所以,我想知道:在不使用“chrome://”“协议”的情况下,使用 Firefox 扩展在新选项卡中打开本地 HTML 文档的最佳方法是什么?是否有类似的方法可以使用 Google Chrome 扩展来完成?
更新 23/5/12
所以这篇文章说 chrome:// URL 不能从网络访问,只能在本地访问。
http://adblockplus.org/blog/web-pages-accessing-chrome-is-forbidden
我认为这可能是我的身份验证失败的原因。我肯定在寻找一种方法让我的扩展程序在不使用 chrome:// 的情况下在窗口或选项卡中显示本地 HTML 文件。
2012 年 7 月 6 日更新
这是我的(希望是临时的)解决方案:
用户输入运行我们应用程序的服务器的 URL。他/她被重定向到应用程序登录页面,但我没有传递“chrome://myextension/content/options.html”作为身份验证后重定向回的 URL,而是传递了一个虚假的 URL,即“http:/ /myextension/thisis/madeup.html”。
在我的扩展程序的 overlay.js 中,我设置了一个 HTTP 请求侦听器,它侦听被请求的虚假 URL。当虚假 URL 发生 GET 时,我取消请求,并在“chrome://myextension/content/options.html”打开真实的本地存储页面。
请参阅以下参考资料:
https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIObserver https://developer.mozilla.org/en/XUL_School/Intercepting_Page_Loads#HTTP_Observers