我目前正在尝试将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的一部分。
出于好奇,我试着像这样硬编码网址:
http://myextension/content/options.html
用户实际上已成功通过身份验证,但之后重定向显然失败了。
Chrome扩展程序似乎无问题或奇怪的黑客攻击。据我所知,打开它是这样的:
chrome.tabs.create({"url":chrome.extension.getURL("options.html"), "selected":true});
稍后引用该标签的网址,以便我们可以重定向回到它,就像这样:
var options_url = chrome.extension.getURL('options.html');
所以,我想知道:在没有使用“chrome://”“协议”的情况下,在带有Firefox扩展的新标签页中打开本地HTML文档的最佳方法是什么?是否有类似的方式来处理Google Chrome扩展程序?
更新23/5/12
因此,本文称Chrome://网址无法通过网络访问,只能在本地访问。
http://adblockplus.org/blog/web-pages-accessing-chrome-is-forbidden
我认为这可能是我的身份验证失败的原因。我肯定在寻找一种方法让我的扩展程序在不使用chrome://的情况下在窗口或标签中显示本地HTML文件。
更新07/6/12
这是我的(希望是暂时的)解决方案:
用户输入运行我们应用程序的服务器的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