what should happen here is that we should detect that there are upload listeners. this should force a preflight. once the preflight has happened we should be sending progress events as normal when doing the real request.
Not sure that we have tests though, so not surprised if something is broken.

So here's what *should* happen. Unfortunately I don't have the bandwidth to investigate why it's not. cc'ing Olli who's been doing a lot of XHR work in the past, but I don't know if he has the bandwidth either.
1. When send() is called we should call CheckChannelForCrossSiteRequest
2. CheckChannelForCrossSiteRequest should detect that mUpload->HasListeners()
returns true and set XML_HTTP_REQUEST_NEED_AC_PREFLIGHT
3. send() should then call NS_StartCORSPreflight which triggers a preflight
4. Once the real request start we should be getting OnProgress callbacks from necko
5. These callbacks should call MaybeDispatchProgressEvents which in turn should
call DispatchProgressEvent using mUpload.
6. DispatchProgressEvent should call AllowUploadProgress() which should return true
7. DispatchProgressEvent should then actually dispatch the event.
I don't know where things are going wrong.
Do make sure to do the following two things in your JS code:
A) Make sure to attach the event listeners before calling send() (This is per spec)
B) Make sure that the preflight is successful. If the POST actually is sent to the
server then the preflight is definitely successful.
Hopefully someone will have the cycles to debug why this is failing. What you could do to help is to set up a simple testcase somewhere. Making the testcase as small as possible will definitely help.

I've just tested the code in attachement 656774 (bug 786953) and it seems that it's woking perfectly for me. I'm running Firefox 30.0
We tried to put the php file on two diffrent domains, let's say domainA and domainB.
There are the different test cases :
localhost -> domainA : Success.
domainB -> domainA : Success.
We also tried different file formats, tar.bz2 and mp3. the progress event was fired until the end.