2012-08-07 101 views
4

我试图用自定义替换由Firefox生成的目录列表。如何拦截文件://请求提供目录列表?

所以,我需要三样东西:

  1. 我需要知道什么时候火狐尝试加载file:// URI。
  2. 我必须测试该URI是以目标还是文件为目标。
  3. 如果URI的目标是一个目录,我必须阻止Firefox生成目录列表,并显示我自己的目录列表。

这是第一点,这是最有问题的:

  • 我读了nsIObserverService的文档,但它不会做我想做的(有一个http-on-modify-request但没有file-on-modify-request
  • 我试图在file://* URI上使用Jetpack的addon-kit/page-mod,但它似乎不允许我在加载我的东西之前验证URI是否定位目录。
  • 我阅读了nsIFileProtocolHandler的文档,但它对我没有帮助。

那么如何拦截file://*请求呢?

有人有想法吗?

回答

5

我试图在文件:// * URIs上使用Jetpack的addon-kit/page-mod,但似乎它不允许我在加载我的东西之前验证URI是否以目标为目标。

没错。但是,您可以执行与page-mod模块相同的操作,即收听document-element-inserted observer notification。沿着这些路线的东西:

var events = require("sdk/system/events"); 
var urls = require("sdk/url"); 
events.on("document-element-inserted", function(event) 
{ 
    var window = event.subject.defaultView; 
    if (!window) // XBL document? 
    return; 

    var url = urls.URL(window.document.URL); 
    if (url.scheme == "file") 
    { 
    // A file:/// URL was loaded, do something with this window 
    } 
}); 

参考:system/events moduleurl module

我必须测试该URI是否以目标或文件为目标。

url模块还可以让你得到的文件路径,然后你可以使用io/file module访问它:

var files = require("sdk/io/file"); 
var path = urls.toFileName(url); 
var isDir = files.exists(path) && !files.isFile(path); 

如果URI的目标是一个目录,我有以防止Firefox生成目录列表,并显示我自己的目录列表。

这是困难的部分。我认为你不能阻止Firefox生成目录列表,但调用window.stop()应该具有相同的效果。然后,您可以将您自己的内容动态添加到窗口中。您可以使用files.list(path)方法获取目录条目列表:

window.stop(); 
var entries = files.list(path); 
for (var i = 0; i < entries.length; i++) 
    addEntry(window, path, entries[i]); 
+0

非常感谢!这正是我所寻找的:-) – 2012-08-07 13:28:05

+0

“观察员服务”库不再存在 – msangel 2015-10-19 23:40:34

+0

@msangel:当然,这些代码示例是古老的。我将它们改为使用现代SDK模块的功能。 – 2015-10-20 09:09:46