Help wanted: Caching string contents as temporary / virtual files?

I’m hitting a conceptual problem in Verbosio’s development. Say the user is editing a XUL document, one sprinkled throughout with URL’s: scripts, overlays, DTD’s, stylesheets, you name it. Most of these point to files which presumably don’t exist yet (for example, chrome://package/content/file.xml). So how do you load all these files from JavaScript strings, so the user can preview the changes he’s making without saving?

I have at the moment four ideas, none of them very nice:

  1. data: URI’s

    Basically, I feed it the content-type, then a comma, then the contents of the string as the second argument. The two disadvantages I know of are (a) URI’s are supposed to be short, and data: might be abusing that, and (b) data: URI’s don’t support hash targets (#foo). That means they’re useless for pointing within the document to a specific ID attribute (XBL depends on that pretty heavily, and (X)HTML likes it).

  2. file:///userHomeDir/cache/path/to/file

    This means saving the file in a cached form to the local file system. This is probably the simplest, but it involves reading and writing to the file system repeatedly. (Every time the user changes to the document or a file depending on it, most likely.) It also doesn’t allow for granting chrome privileges that easily (though I suppose I could set CAPS security policies as needed). In case you’re wondering, this is %APPDATA%/(appName) in Windows, not …/dist/bin/anything.

  3. virtual:protocol:///path/to/file

    This would mean creating a bunch of XPCOM components, starting with protocol handlers and channels. This is unfamiliar ground for me, but it would run fast and not abuse the system.

  4. Hack the system to attempt reading from a JS source first.

    Something like this is very likely to destabilize the GRE running this chrome application, and would probably involve a lot of the same work as the previous idea. It’s just not feasible.

I really, really need some help here. If left to my own devices, I will go with the second route. I would welcome implementations, except for the data: system. I’d also welcome other ideas to solving this problem.

3 thoughts on “Help wanted: Caching string contents as temporary / virtual files?”

  1. Any chance this is a solved problem? What happens in the JDT/Corona toolkit when they need to go validate schema against things like the WSDL spec? Or am I thinking a little sideways, here?

  2. Looking through my DTD-loading glasses, your stuff has to be chrome.
    If you’re only working on one particular external package, I’d register that with a custom protocol (instead of jar:) and make that protocol cache and backup to whatever. It’s likely to be a tricky mess, though.
    (From Alex: Oh, I wish it were quite that simple. I’m trying now to implement a protocol.)

  3. #3 sounds like you’re implementing a RAMdisk in XPCOM. The thing with that is you’d only need it on systems that don’t have their own RAM filesystem and you could use the native one elsewhere. Sounds like a better idea to me.
    (From Alex: When you get down to it, the third option is a lot like what you suggest. The big difference is that this RAMdisk is much less complete, and goes away at the end of the Mozilla run. Besides, we have no way of knowing if the user has a RAMdisk available or not. So I’m going on the assumption that Verbosio should try to have its own system.
    I said try, not succeed. But I am making progress… the data: protocol handler and channel implementations are really close to what I want to do.)

Comments are closed.