It's very possible to listen to xhr.upload events, but you'll have to subclass goog.net.XhrIo to get at the underlying XMLHttpRequest.
There are a number of ways you can do this, but in my case I overrode the createXhr method to attach the event listener. Here's a very rough example of what I mean:
my.net.XhrIo.prototype.createXhr = function() {
var xhr = my.net.XhrIo.superClass_.createXhr.call(this);
goog.events.listen(xhr.upload, 'progress', this.dispatchEvent, false, this);
return xhr;
};
(You'll also want to extend cleanUpXhr_ to remove the event listener.)
This will cause 'progress' closure events to be dispatched from the XhrIo object. You can listen for those events and, inside the listener, lookup event.getBrowserEvent().loaded to see how many bytes have been sent.
Hope that helps!
Nathan Wright