Closed
Bug 12579
Opened 25 years ago
Closed 25 years ago
Implement jar: protocol (tracking bug)
Categories
(Core :: Networking, defect, P3)
Tracking
()
VERIFIED
FIXED
M14
People
(Reporter: warrensomebody, Assigned: warrensomebody)
References
Details
(Keywords: perf, Whiteboard: [pdt+])
We need jar: protocol support for several reasons: - performance (accessing lots of small files from a jar should be faster) - downloadable chrome - general product packaging There are a couple of pieces to this: - implementing jar: URLs (page 16 of the JavaHelp spec <http://java.sun.com/products/javahelp/spec-1.0.pdf>) - implementing the jar protocol handler (to read and write entries -- might look a lot like the file: protocol) - upgrading the current tree to make use of jar files, fixing xul, makefiles, etc. (need a separate bug for tracking this)
Assignee | ||
Updated•25 years ago
|
Target Milestone: M11
Updated•25 years ago
|
Target Milestone: M11 → M13
Updated•25 years ago
|
Assignee: valeski → mstoltz
Comment 3•25 years ago
|
||
At this point, I'm writing the protocol handler and Gayatri is writing the jar:URL parser.
Assignee | ||
Comment 4•25 years ago
|
||
Here are some thoughts on how I think some of this should look... URL parsing -- The jar: URLs should probably have 2 instance variables that point to other URLs, i.e.: class nsJARURL : public nsIURL { ... nsCOMPtr<nsIURI> mJARPath; nsCOMPtr<nsIURI> mRelativePath; }; where the syntax is "jar:<mJARPath>!/<mRelativePath>". In other words -- we shouldn't need to write a complicated parser here, just something that looks for "jar:" and "!/" and delegates the rest to nsStdURL. JAR protocol handler -- I'm about to check in changes to nsFileTransport that abstract out the part that really opens/closes/reads/writes files from the state machine that deals with asynchronous activity, suspend/resume/cancel, etc. You should be able to use this to implement the JAR protocol. Basically, there will be a new interface, nsIFileSystem that you'll have to map to libjar. Once you do that, I think it will just work. I'll let you know when it goes in (today hopefully). Please come by if either of you have any questions. I don't want us to work in a vacuum on this stuff. We should try to keep in close contact to make the quickest progress. Thanks for doing this! Warren
Comment 5•25 years ago
|
||
Just checking, but is <mJARPath> a URL in its own right? i.e. "jar:http://foo.com/my.jar!/some/stuff.html"? The original Sun spec we saw on this could handle archives embedded in other archives. We may not want to figure that out now, but lets use a non-greedy search for !/ so we can support more later. Moving resources into archives may be a space win (especially on FAT drives, even without compression), but it's not going to be a performance win if for each requested resource we open the archive, parse the directory, and *then* serve the data. We need some way to keep these archives open, and I don't know how we can do that using stateless URL syntax. Maybe this could be part of the magic of the "chrome:" protocol. Rather than have to change all existing chrome: URLs we just add to the magic where chrome: already adds "default" or local directories, it could open archives and eventually close them when the chrome system shuts down. Not sure how that plays with the jar: protocol idea, though.
Comment 6•25 years ago
|
||
Adding this functionality to chrome: is a less general solution, since other code besides UI could make use of a jar: protocol. In particular, I need it to implement signed scripts. Since in the first iteration, using libjar as is, we need to download a jar file to disk before extracting files from it, there should be a way to keep ahold of that file on disk for subsequent calls to that URL. This will improve performance.
Comment 7•25 years ago
|
||
Sorry, I didn't mean we should give up on the "jar:" protocol -- I really want that to try some cool ideas I have floating around. I just meant that a "jar:" protocol *by itself* is not going to solve the perceived chrome performance problem which I assumed was the impetus for this bug given the [perf] status. Maybe part of that solution would be for libjar (at a level below the protocol handler) to keep a refcounted table of open archives, and return references to them. That way, for example, simultaneous browser windows wouldn't cause the main resource .jar to be opened multiple times with the associated memory cost to hold the directory structure. Then the chrome/XUL system could open and keep a reference to its main archives (using nsIZip directly), and then the jar: protocol will find the archives already opened, saving much time. For other uses jar: still works, just isn't as optimized.
Assignee | ||
Comment 8•25 years ago
|
||
> Just checking, but is <mJARPath> a URL in its own right? i.e. > "jar:http://foo.com/my.jar!/some/stuff.html"? Yes, and I assume you can have cases like this too: jar:jar:http://foo.com/my.jar!/other.jar!/stuff.html This would imply to me that we have to look for the "!/" starting from the end and working backwards. Also note that we'll most likely need to pull the jar file down to the local drive so that we can access it with our libjar code. We can shortcircuit this for the case where the "mJARPath" part is a file: URL, but in general this means some sort of cache management code to clean up jar files after they're no longer needed (whenever that is). Whoever does this should sync up with Scott Furman to determine whether any of his network cache services will be useful in implementing this. Re. chrome URLs: I have this idea in the back of my mind that they can go away, being replaced by a more general search-path-based approach, probably subsumed by some change to resource: URLs. E.g. chrome://foo/bar.xul might become something like resource://ChromeDirs/foo/bar.xul. Obviously, jar files are one place on the search path you might want to look, so this resource: URL could again get translated into jar:file://<exe-dir>/chrome.jar!/foo/bar.xul.
Updated•25 years ago
|
Status: NEW → ASSIGNED
Updated•25 years ago
|
Summary: Implement jar: protocol → [dogfood]Implement jar: protocol
Whiteboard: [Perf] → [Perf][PDT+]
Comment 9•25 years ago
|
||
Added dogfood to label along with PDT+ annotation. We noted that it was lower level infrastructure, and that it was listed as a high priority bug in a status report. If we are confused about this being dogfood, please email the PDT alias. Thanks.
Comment 10•25 years ago
|
||
I do not believe this is required for dogfood at all. Chrome will work fine without needing to be in jars. We may want it for beta, but we certainly don't need it for dogfood. I'd go so far as to say it may not even be needed in the shipping product for chrome... we should do it if we think it's a performance win, but if we get fast enough without it, then I wouldn't advocate doing the extra work just for chrome. If there are other reasons why we need it, then that's cool. I just wanted to give the chrome perspective.
Assignee | ||
Comment 11•25 years ago
|
||
Note that jar: URLs are needed for smart update. The resource/chrome URL idea is separate. However, I think that this sort of architectural detail should be ironed out now before we get too far down the road and entrenched with chrome URLs. I intend to investigate to see if there's something better/more general that we can do here.
Comment 12•25 years ago
|
||
Apparently, the large number of small files causes massive disk bloat on the Mac because the large filesystem block size is inefficient for small files. It's been reported that a Mac Mozilla install requires 220M on disk. So, even for chrome, I would hazard that jar support is a requirement in the shipping product. I don't see why it should be considered necessary for dogfood, however.
Assignee | ||
Comment 13•25 years ago
|
||
I agree that it's not dogfood, but I do think it's a porkjockeys/architectural/beta feature.
Comment 14•25 years ago
|
||
Yeah, sounds like we need it for the shipping product to reduce bloat at the very least.
Updated•25 years ago
|
Summary: [dogfood]Implement jar: protocol → Implement jar: protocol
Comment 15•25 years ago
|
||
I second that. We really don't want to ship a product with hundreds of .xul files, that's sloppy. I am removing the dogfood label, since this is not crucial for dogfood.
Updated•25 years ago
|
Whiteboard: [Perf][PDT+] → [Perf] needed for Beta
Comment 16•25 years ago
|
||
jar: URLS are not required for XPInstall (smartupdate). We need ZIP archive support, but we have enough in nsIZip already. Clearing the PDT status to match the clearing of Dogfood.
Comment 17•25 years ago
|
||
Reassigning to myself.
Assignee | ||
Updated•25 years ago
|
Comment 18•25 years ago
|
||
Bulk move of all Necko (to be deleted component) bugs to new Networking component.
Comment 19•25 years ago
|
||
Bulk add of "perf" to new keyword field. This will replace the [PERF] we were using in the Status Summary field.
Comment 20•25 years ago
|
||
Gayatri...is this feature stable enough to declare it FIXED? What else needs to be done?
Comment 21•25 years ago
|
||
Moving milestone to M14. I need to get some testing done.
Comment 22•25 years ago
|
||
Dan Veditz needs to let me know some information regarding cancelling a jar installation while extraction is going on. So I will file that as a separate bugand try to close the jar protocol asap.
Status: ASSIGNED → RESOLVED
Closed: 25 years ago
Resolution: --- → FIXED
Comment 23•25 years ago
|
||
This still misses the cancel method implementation. Opening that as a separate bug. The rest of teh functionality is fine. To test it: 1) Please note that when you use local jar files, you need to type file:/// and not file:// in the browser window. An example local jar url would be something like: jar:file:///h:/testHtml.zip!/hello1.html 2) Example urls to test http and ftp downloads are: jar:http://www.relisoft.com/source.zip!/readme.txt jar:ftp://ftp.mall.net/wham131.zip!/wham.txt These are small files and can be easily downloaded and tested.
Assignee | ||
Updated•25 years ago
|
Assignee | ||
Comment 24•25 years ago
|
||
This really isn't done until all the dependencies are done. Reopening.
Status: RESOLVED → REOPENED
Depends on: 24765
Comment 26•25 years ago
|
||
On behalf of PorkJockeys: putting on beta1 radar, per beta criteria priority #2 - performance (esp. file I/O on Mac) is not within beta metrics. removing extraneous tags, cc waterson
Keywords: beta1
Whiteboard: [Perf] needed for Beta
Comment 27•25 years ago
|
||
what parts of jar protocol are working, and which ones not? does brutal sharing help?
Comment 28•25 years ago
|
||
Per warren: "Look at the dependencies, or more importantly, the dependencies of http://bugzilla.mozilla.org/showdependencytree.cgi?id=18433."
Comment 29•25 years ago
|
||
Per phil: "Warren, I thought part of the performance win was that we wouldn't need to open and close a zillion little xul, js, and dtd files in order to paint the chrome. But now that we have butal sharing, we probably only do that once, which means less performance benefit to jar files. Or am I off base?"
Comment 30•25 years ago
|
||
I don't know about a performance benefit, but a Nav-only install on a FAT drive takes over 50Mb because of all the small files.
Comment 31•25 years ago
|
||
Mac (HFS) has the same problem. Additionally, this feature has regressed: jar:http no longer works. I see 'Shortcut+' in the debug output, and then nothing happens, it fails silently. jar:file still works on Linux.
Updated•25 years ago
|
Whiteboard: [pdt+]
Comment 32•25 years ago
|
||
Clarification: as of today, jar:http fails silently on all platforms. jar:file works on all platforms.
Assignee | ||
Comment 33•25 years ago
|
||
Works for me. I tried this: jar:http://www.boulderdesign.com/Bin.zip!/chrome/global/content/default/about.h tml The initial try takes a long time to download (because it's big), the second one is really fast because it comes out of the jar cache. Mitch: Are you sure you were giving a valid jar: URL?
Comment 34•25 years ago
|
||
Warren, I tried this. It does not work for me as of now. I am trying to debug into it. What happens is that it goes into http::OpenInputStream(), it then comes into nsJARDownloadObserver::OnStopRequest(), and return from there. Then the browser url becomes the http site without the jar part and that's about it. Nothing happens after that. I am trying to debug this--just keeping you posted. I tried both with your url and also with: jar:http://www.relisoft.com/source.zip!/readme.txt (this is only a 28kb file--so the download should be pretty fast)
Assignee | ||
Comment 35•25 years ago
|
||
Works for me (jar:http://www.relisoft.com/source.zip!/readme.txt), on both my machines. What are you doing differently? Are you up to date?
Comment 36•25 years ago
|
||
This has become a tracking bug, the fix was already checked in. Moving to Warren. Selmer from Gayatri's machine.
Assignee: gayatrib → warren
Status: REOPENED → NEW
Summary: Implement jar: protocol → Implement jar: protocol (tracking bug)
Assignee | ||
Comment 37•25 years ago
|
||
I believe the actual jar: protocol is done enough for beta1, and keeping this as a tracking bug has become confusing so I'm going to close it. The remaining tasks are to use the cache manager to manage downloaded jar files (bug 24765) which depends on stream-as-file (bug 21250), and also implementing an open jar file cache for performance (bug 24764).
Status: NEW → RESOLVED
Closed: 25 years ago → 25 years ago
Resolution: --- → FIXED
You need to log in
before you can comment on or make changes to this bug.
Description
•