Github works for me - and editing ajax.js (and test/unit/ajax.js) would be ideal - that way we could just merge it directly in.
If there's any way to make your changes piece-by-piece that'd be excellent as it would make the full scope of the changes easier to understand. Also, don't feel entirely bad if this gets bumped until after 1.4 - it sounds like a lot of code might be changing and I'd rather do it right, once, then badly twice. --John On Wed, Nov 18, 2009 at 10:52 PM, Julian Aubourg <aubourg.jul...@gmail.com>wrote: > Not yet, I'll wait to have at least one transport made (I'm working on the > xhr one atm) and all the layers tested... wouldn't like to put some code > with obvious mistakes that some rough testing will get rid of. I thought > about unit testing early, but truth is the amount of refactoring at each > iteration makes it impossible to cope with. Once I have something stable > codewise and roughly tested, I'll put it on github. OK with you? > > btw, do you prefer I edit ajax.js or that I upload a plugin (which is the > format I'm using right now)? > > 2009/11/19 John Resig <jere...@gmail.com> > > All of this sounds pretty good - do you have a link to the code? >> (Preferably in a fork up on Github - makes it easy to do a code review.) >> >> --John >> >> >> >> On Wed, Nov 18, 2009 at 10:10 PM, Julian Aubourg < >> aubourg.jul...@gmail.com> wrote: >> >>> OK, just a post to keep you all updated since I didn't get as much time >>> as I expected though I have progress, mind you. >>> >>> Also, I recommend a good understanding of the internals of $.ajax to >>> follow everything. >>> >>> First, let me start with some design decisions I came up with: >>> >>> 1) the fake XHR returned by $.ajax only emulates header related methods & >>> abort >>> >>> The rational behind the decision is as follows: >>> - the onreadystatechange callback was already used by jQuery internally >>> on the old implementation, meaning that using it was pointless if not plain >>> wrong. >>> - same goes for open & send, it doesn't make sense for external code to >>> use them >>> >>> On a sidenote, readyState could be emulated but I fail to see the point. >>> I *could* emulate onreadystatechange but is there really a use case for >>> this? >>> >>> Of course, the complete(), success() & error() methods are implemented. >>> If you do something like jQuery.ajax(options).complete(completeCallback); in >>> async=false mode, the completeCallback method WILL be called with correct >>> arguments even though the request already completed. >>> >>> Each callback family handled "return false;" in callbacks, meaning no >>> further callbacks of that family will be called later on. >>> >>> For backward compatibility, the complete, success & error callbacks >>> provided in the options object are also called (they are actually added to >>> the list of callbacks before issuing the request). >>> >>> 2) I added the notion of "transport" which is the actual implementation >>> that will send the request >>> >>> ajaxSettings has two new properties: >>> - transportSelector, a function that will take an options object and >>> determine what transport type is more suited for the request, >>> - transportDefinitions which is a hashmap of transport definitions >>> (obviously). >>> >>> Transport definitions contains two functions: >>> - filter which takes the options object & returns a new transport type if >>> it deems it more suited than itself >>> - factory which takes no argument & returns a new transport of the >>> desired type >>> >>> The idea in having the filter function is: >>> - to set s.global as false if the transport cannot ensure completion >>> (cross-domain script / jsonp), >>> - to keep differentiating code as close to the implementation as >>> possible. A good example are scripts which wont be handled the same if they >>> are cross domain or not (first will use xhr, second will use a script tag). >>> If s.transportDefinitions[transportType] is not an object but a function, it >>> is considered a filter. Following previous example, transportSelector would >>> just return "script" no matter what, and the script transport definition >>> would look like this: >>> s.transportDefinitions["script"] = function (s) { return isCrossDomain(s) >>> ? "script-tag" : "xhr" } >>> >>> Filters get called until a final transportType is found, then the >>> corresponding transport factory gets called. >>> >>> By changing transportSelector & transportDefinitions, a user can >>> completely >>> >>> I also added some options into the ajax options object beside >>> transportSelector & transportDefinition: >>> - transport: which can be used to bypass transportSelector (filters >>> called until final type is found are not bypassed) >>> - transportDataType: it's the data type used to determine which transport >>> to use (in transportSelector), if not provided it's equivalent to dataType. >>> The idea came when I was refactoring and realized that it was no reason why >>> you couldn't ask for xml through jsonp. So you would have something like >>> $.ajax({ dataType: "xml", transportDataType: "jsonp", ...}) and the request >>> will be made through jsonp and the resulting json object will be parsed as >>> xml (I already implemented the logic). As a consequence dataFilter gets 3 >>> arguments: >>> - the data, >>> - s.dataType, >>> - a function that permits to get/set the transportDataType (so that you >>> can make "casts" in your dataFilter). >>> - crossDomain: a boolean computed into the main $.ajax method to make >>> life of filters easier. >>> >>> So far, I have: >>> - the logic in $.ajax (with xhr emulation & callbacks system), >>> - the factory system, >>> - a helper function to help create transports (in the end only 3 >>> functions + the filter will have to be provided to create a new transport), >>> - the interface for a transport (which is much easier to deal with than >>> an xhr). >>> >>> I have yet to implement actual transports and start testing. >>> >>> Also, generalizing the implementaton, global events, timeout, ifModified, >>> etc, are handled for all transports (now, given lack of headers, ifModified >>> may not have an effect with most transports but still). >>> >>> The code hasn't exploded in size but I cannot estimate yet how bigger it >>> will get. >>> >>> Now onto stuff I'd like to see in jQuery and am very tempted to add in >>> the process is ful-fledged support for CORS with the definition of >>> jQuery.support.crossDomainRequest (values false, "standard" or >>> "XDomainRequest" -- detection code can be found here: >>> http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/--). >>> Using filters and the new s.crossDomain computed option, it should be >>> very easy to handle all situations (by throwing an exception or whatnot so >>> that client code could fallback on a proxy or something). >>> >>> Feedbacks welcome is you see anything gross in there. >>> >>> -- Julian >>> >>> 2009/11/15 Julian Aubourg <aubourg.jul...@gmail.com> >>> >>> I looked into your code and we basically have the same approach. I'll try >>>> & get the refactoring done by the middle of next week (like I said, I have >>>> social life getting in the way right now ;) ). >>>> >>>> 2009/11/15 Shade <get...@gmail.com> >>>> >>>> I've built two different JavaScript projects which implement a nearly >>>>> identical interface to the native XHR object, including updating >>>>> properties, etc, while hiding under the covers how the actual XHR >>>>> happens. One is flXHR (http://flxhr.flensed.com) which actually has a >>>>> jQuery plugin that adapts flXHR to be automatically selected and used >>>>> by jQuery when making $.ajax calls. It relies on the XHR registry >>>>> plugin of jQuery. Because flXHR exposes the identical interface to >>>>> native XHR, this makes it able to be used throughout $.ajax without >>>>> any changes to jquery itself. >>>>> >>>>> The other project isn't specifically jQuery related, but it's called >>>>> jXHR (http://mulletxhr.com). >>>>> >>>>> The reason I mention these two projects is that they seem to be doing >>>>> exactly what is being suggested with this mockXHR object. I use a >>>>> couple of tricks to make that happen, including emulating updating >>>>> properties. I'd be willing to collaborate on this solution and share >>>>> the tricks I used in my two projects. >>>>> >>>>> Let me know if this would of assistance. I definitely support trying >>>>> to revamp the way the $.ajax system works to give it more >>>>> extensibility. >>>>> >>>>> --Kyle >>>>> >>>>> >>>>> >>>>> >>>>> On Nov 13, 4:38 pm, Jason Persampieri <papp...@gmail.com> wrote: >>>>> > On Nov 13, 6:39 am, Scott Sauyet <scott.sau...@gmail.com> wrote: >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> > > On Thu, Nov 12, 2009 at 1:15 PM, John Resig <jere...@gmail.com> >>>>> wrote: >>>>> > > >> I think the one area that would be troublesome is in the >>>>> properties >>>>> > > >> that xhr provides (like readyState, responseXML, etc.). I'm not >>>>> sure >>>>> > > >> how you'd build this mock XHR and keep those properties up to >>>>> date. >>>>> > >>>>> > > On Thu, Nov 12, 2009 at 10:14 PM, Julian Aubourg >>>>> > >>>>> > > <aubourg.jul...@gmail.com> wrote: >>>>> > > > As an example of what I'm talking about with an real xhr as a >>>>> base: >>>>> > > > - layer 0 is window.ActiveXObject ? new >>>>> ActiveXObject("Microsoft.XMLHTTP") : >>>>> > > > new XMLHttpRequest() >>>>> > > > - layer 1 is a standard compliant xhr implementation that >>>>> delegates to layer >>>>> > > > 0 while hiding browser incompatibilities. It listens to layer 0 >>>>> through its >>>>> > > > onreadystatechange event handler and propagates the event by >>>>> calling its own >>>>> > > > onreadystatechange if available >>>>> > >>>>> > > I had briefly mentioned a similar idea in the other thread [1], but >>>>> > > was rather scared of the actual implementation. I guess the >>>>> question >>>>> > > is whether there are possible state changes to the underlying XHR >>>>> > > object that might affect the properties but that are not exposed >>>>> > > through the onreadystatechange handler. I don't have nearly the >>>>> > > knowledge of XHR to answer this. If there aren't any, I think this >>>>> is >>>>> > > quite a good idea. >>>>> > >>>>> > > -- Scott >>>>> > >>>>> > > [1]http://tinyurl.com/yl2lqjz#msg_1fa4cac00dbcedcf >>>>> > >>>>> > Well, then. I had started working on something similar, but much >>>>> > simpler. I had planned to intercept the return value of $.ajax and >>>>> > extend it with 'success' and 'error' functions. Of course, I hadn't >>>>> > gotten to the point of actually testing this, so who knows if it >>>>> would >>>>> > have worked. Your solution sounds much more robust and forward >>>>> > thinking. Very nice. >>>>> > >>>>> > _jason- Hide quoted text - >>>>> > >>>>> > - Show quoted text - >>>>> >>>>> -- >>>>> >>>>> You received this message because you are subscribed to the Google >>>>> Groups "jQuery Development" group. >>>>> To post to this group, send email to jquery-...@googlegroups.com. >>>>> To unsubscribe from this group, send email to >>>>> jquery-dev+unsubscr...@googlegroups.com<jquery-dev%2bunsubscr...@googlegroups.com> >>>>> . >>>>> For more options, visit this group at >>>>> http://groups.google.com/group/jquery-dev?hl=. >>>>> >>>>> >>>>> >>>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "jQuery Development" group. >>> To post to this group, send email to jquery-...@googlegroups.com. >>> To unsubscribe from this group, send email to >>> jquery-dev+unsubscr...@googlegroups.com<jquery-dev%2bunsubscr...@googlegroups.com> >>> . >>> For more options, visit this group at >>> http://groups.google.com/group/jquery-dev?hl=. >>> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "jQuery Development" group. >> To post to this group, send email to jquery-...@googlegroups.com. >> To unsubscribe from this group, send email to >> jquery-dev+unsubscr...@googlegroups.com<jquery-dev%2bunsubscr...@googlegroups.com> >> . >> For more options, visit this group at >> http://groups.google.com/group/jquery-dev?hl=. >> > > -- > You received this message because you are subscribed to the Google Groups > "jQuery Development" group. > To post to this group, send email to jquery-...@googlegroups.com. > To unsubscribe from this group, send email to > jquery-dev+unsubscr...@googlegroups.com<jquery-dev%2bunsubscr...@googlegroups.com> > . > For more options, visit this group at > http://groups.google.com/group/jquery-dev?hl=. > -- You received this message because you are subscribed to the Google Groups "jQuery Development" group. To post to this group, send email to jquery-...@googlegroups.com. To unsubscribe from this group, send email to jquery-dev+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/jquery-dev?hl=.