2012-03-11 98 views
0

我在写一个Firefox扩展,我需要访问Firefox的内存缓存中的项目。访问内存缓存项目

这是我的工作代码:

nsICache = Components.interfaces.nsICache 
cacheservice = Components.classes["@mozilla.org/network/cache-service;1"].getService(Components.interfaces.nsICacheService); 
cachesession = cacheservice.createSession("javascript", nsICache.STORE_IN_MEMORY, false); 
cachesession.doomEntriesIfExpired=false; 

//fileurl is captured from the nsIObserver and does print out correctly 
cachedescriptor = cachesession.openCacheEntry(fileurl, nsICache.ACCESS_READ, false); 
ERROR:NS_ERROR_CACHE_KEY_NOT_FOUND here 

由于这是数据在后台牵强,我必须使用nsIObserver捕获请求,并钩住它的URI用作缓存键。

正如我上面显示,我收到没有找到NS_ERROR_CACHE_KEY,虽然去翻about:cache表明,它显然是存在的。我也使用代理强制缓存到磁盘,但我得到了同样的问题(修改代码以查看磁盘缓存)。我认为这可能是因为缓存项目仍在写入,所以我做了一个递归的window.setTimeout来持续调用函数,但即使在下载完成后,我也会得到相同的错误。

这是,也许,并与问题nsICacheSession?也许我没有使用正确的clientId。如果是这样,我应该使用什么clientId

我真的很茫然,所以我希望你们能帮助我。

+0

我实现了一个cacheVisitor来遍历所有的缓存条目,并且cacheservice.visitEntries(cacheVisitor)确实返回了我正在查找的对象,并且从cacheVisitor返回的键是我用来试图访问它的确切键cachesession.openCacheEntry()。这让我觉得我访问它的方式存在错误。但是,这一切似乎都是有序的。我的意思是,我用(clientId,STORE_IN_MEMORY,false)和openCacheEntry(fileurl,ACCESS_READ,false) – 2012-03-11 07:16:07

+0

我用一个cacheVisitor来验证缓存条目。找到正确的密钥后,将其保存到全局变量中。当cacheVisitor完成时,该保存的密钥将被传递给openCacheEntry。再次,我得到NS_ERROR_CACHE_KEY_NOT_FOUND。所以,它肯定是存在的,但为什么nsICacheSession找不到它呢? – 2012-03-11 07:58:02

回答

1

问题在于clientId。我使用了“javascript”,因为我在一个例子中看到了它。原来我需要使用“HTTP”来代替。