- From: Michael A. Puls II <shadow2531@gmail.com>
- Date: Sun, 19 Apr 2009 09:19:19 -0400
- To: public-webapps@w3.org
On Thu, Apr 16, 2009 at 10:10 AM, Michael A. Puls II <shadow2531@gmail.com> wrote: > I think file:// should be a first class citizen when it comes to xhr (local page loading local .xml file for example). > > However, currently, there are some interoperability problems. > > 1. XHR doesn't work on local pages in IE. You get "Access is denied". > > 2. For open("GET", "non-existent.xml"): > > Firefox: Throws NS_ERROR_DOM_BAD_URI and .readyState stops at 1. > > Safari: Doesn't throw and .readyState stops at 1. > > Opera: Doesn't throw and .readyState stops at 4. > > 3. readyState changes for found local file: > > Firefox: 1, 2, 3 ,4 ,1 > > Opera: 1, 2, 3, 4 > > Safari: 1, 2, 3, 4 > > 4. status changes inside onreadystaechange for found local file: > try { > alert(this.status); > } catch (err) { > alert(err); > } > > Opera: invalid state error, invalid state error, 0, 0 > > Safari: invalid state error, 0, 0, 0 > > Firefox: 0, 0, 0, 0, 0 > > 5. In http, you can do if (this.readyState === 4 && this.status === 200). However, for file://, you have to do (this.readyState === 4 && (this.status === 200 || document.location.protocol === "file:") or assume this.status of 0 means "file:". > > It'd be cool if browsers would match each other (including IE supporting xhr for file://) and either throw an exception for file not found like Firefox does or simulate http statuses for local files (200 and 404 for example), or some combo so a page will work locally and on the server without change. What do you think about the following? The xhr spec could make a general recommendation for non-http requests. It wouldn't have to mention "file:" specifically. It could recommend something like this: 1. .readyState always makes it to 4. 2. .open() doesn't throw for "file not found" or "access denied". 3. When .readyState is 4, .status is: 404 for "file not found" 200 for "file is found and readable" 403 for "forbidden" 401 for "authorization required" 400 for "bad request" (like trying to open "c:\\file.xml" instead of "file:///c:/file.xml" or "file://localhost/c:/file.xml") etc. 4. .responseText would be available for 200 and .responseXML would be if the content was successfully parsed as XML or null otherwise. Then, you could handle specif errors like this: var req = new XMLHttpRequest(); req.open("GET", "file:///c:/Documents%20and%20Settings%20/user/Desktop/data.xml"); req.onreadystatechange = function() { if (this.readyState === 4) { if (this.status === 200) { alert(this.responseXML); alert(this.responseText); } else if (this.status === 404) { alert('file not found'); } else if (this.status === 403) { alert('forbidden'); } else if (this.status === 401) { alert('authorization required'); } else if (this.status === 400) { alert("bad request"); } } } req.send(); (alerts are just an example) -- Michael
Received on Sunday, 19 April 2009 13:19:54 UTC