Use XHR for progress events if HTML5 image does not have onprogress

This commit is contained in:
Joshua Granick
2017-10-23 09:37:04 -07:00
parent ba45320d7b
commit 70e1bed0ae

View File

@@ -31,6 +31,7 @@ class HTML5HTTPRequest {
private static var originProtocol:String; private static var originProtocol:String;
private static var requestLimit = 4; private static var requestLimit = 4;
private static var requestQueue = new List<QueueItem> (); private static var requestQueue = new List<QueueItem> ();
private static var supportsImageProgress:Null<Bool>;
private var binary:Bool; private var binary:Bool;
private var parent:_IHTTPRequest; private var parent:_IHTTPRequest;
@@ -425,7 +426,21 @@ class HTML5HTTPRequest {
private static function __loadImage (uri:String, promise:Promise<Image>):Void { private static function __loadImage (uri:String, promise:Promise<Image>):Void {
var image = new JSImage (); var image = new JSImage ();
if(uri.indexOf("data:") == 0){
if (!__isSameOrigin (uri)) {
image.crossOrigin = "Anonymous";
}
if (supportsImageProgress == null) {
supportsImageProgress = untyped __js__ ("'onprogress' in image");
}
if (supportsImageProgress || StringTools.startsWith (uri, "data:")) {
image.addEventListener ("load", function (event) { image.addEventListener ("load", function (event) {
var buffer = new ImageBuffer (null, image.width, image.height); var buffer = new ImageBuffer (null, image.width, image.height);
@@ -454,47 +469,46 @@ class HTML5HTTPRequest {
}, false); }, false);
image.src = uri; image.src = uri;
}else{
if (!__isSameOrigin (uri)) {
image.crossOrigin = "Anonymous"; } else {
} var request = new XMLHttpRequest ();
var request = new XMLHttpRequest();
request.onload = function (_) { request.onload = function (_) {
activeRequests--; activeRequests--;
processQueue (); processQueue ();
var img = new Image(); var img = new Image ();
img.__fromBytes( Bytes.ofData(request.response), function(img){ img.__fromBytes (Bytes.ofData (request.response), function (img) {
promise.complete (img); promise.complete (img);
}); });
} }
request.onerror = function (e:ErrorEvent) { request.onerror = function (event:ErrorEvent) {
promise.error(e.message); promise.error (event.message);
} }
request.onprogress = function(e:ProgressEvent) { request.onprogress = function (event:ProgressEvent) {
if (e.lengthComputable) { if (event.lengthComputable) {
promise.progress(e.loaded, e.total); promise.progress (event.loaded, event.total);
} }
} }
request.open("GET", uri, true);
request.open ("GET", uri, true);
request.responseType = XMLHttpRequestResponseType.ARRAYBUFFER; request.responseType = XMLHttpRequestResponseType.ARRAYBUFFER;
request.overrideMimeType('text/plain; charset=x-user-defined'); request.overrideMimeType ('text/plain; charset=x-user-defined');
request.send(null); request.send (null);
} }
} }