Added better progress event logic:
- Works for data: URLs - Works in IE11
This commit is contained in:
committed by
Joshua Granick
parent
05d5238c5b
commit
ba45320d7b
@@ -2,12 +2,14 @@ package lime._backend.html5;
|
|||||||
|
|
||||||
|
|
||||||
import js.html.AnchorElement;
|
import js.html.AnchorElement;
|
||||||
|
import js.html.ErrorEvent;
|
||||||
import js.html.Event;
|
import js.html.Event;
|
||||||
import js.html.Image in JSImage;
|
import js.html.Image in JSImage;
|
||||||
import js.html.ProgressEvent;
|
import js.html.ProgressEvent;
|
||||||
import js.html.XMLHttpRequest;
|
import js.html.XMLHttpRequest;
|
||||||
import js.Browser;
|
import js.Browser;
|
||||||
import haxe.io.Bytes;
|
import haxe.io.Bytes;
|
||||||
|
import js.html.XMLHttpRequestResponseType;
|
||||||
import lime.app.Future;
|
import lime.app.Future;
|
||||||
import lime.app.Promise;
|
import lime.app.Promise;
|
||||||
import lime.graphics.Image;
|
import lime.graphics.Image;
|
||||||
@@ -17,7 +19,7 @@ import lime.net.HTTPRequestHeader;
|
|||||||
import lime.utils.AssetType;
|
import lime.utils.AssetType;
|
||||||
|
|
||||||
@:access(lime.graphics.ImageBuffer)
|
@:access(lime.graphics.ImageBuffer)
|
||||||
|
@:access(lime.graphics.Image)
|
||||||
|
|
||||||
class HTML5HTTPRequest {
|
class HTML5HTTPRequest {
|
||||||
|
|
||||||
@@ -423,42 +425,76 @@ 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.addEventListener ("load", function (event) {
|
||||||
|
|
||||||
|
var buffer = new ImageBuffer (null, image.width, image.height);
|
||||||
|
buffer.__srcImage = cast image;
|
||||||
|
|
||||||
|
activeRequests--;
|
||||||
|
processQueue ();
|
||||||
|
|
||||||
|
promise.complete (new Image (buffer));
|
||||||
|
|
||||||
|
}, false);
|
||||||
|
|
||||||
image.crossOrigin = "Anonymous";
|
image.addEventListener ("progress", function (event) {
|
||||||
|
|
||||||
|
promise.progress (event.loaded, event.total);
|
||||||
|
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
image.addEventListener ("error", function (event) {
|
||||||
|
|
||||||
|
activeRequests--;
|
||||||
|
processQueue ();
|
||||||
|
|
||||||
|
promise.error (event.detail);
|
||||||
|
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
image.src = uri;
|
||||||
|
}else{
|
||||||
|
if (!__isSameOrigin (uri)) {
|
||||||
|
|
||||||
|
image.crossOrigin = "Anonymous";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
var request = new XMLHttpRequest();
|
||||||
|
|
||||||
|
request.onload = function (_) {
|
||||||
|
|
||||||
|
activeRequests--;
|
||||||
|
processQueue ();
|
||||||
|
|
||||||
|
var img = new Image();
|
||||||
|
img.__fromBytes( Bytes.ofData(request.response), function(img){
|
||||||
|
promise.complete (img);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
request.onerror = function (e:ErrorEvent) {
|
||||||
|
|
||||||
|
promise.error(e.message);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
request.onprogress = function(e:ProgressEvent) {
|
||||||
|
|
||||||
|
if (e.lengthComputable) {
|
||||||
|
|
||||||
|
promise.progress(e.loaded, e.total);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
request.open("GET", uri, true);
|
||||||
|
request.responseType = XMLHttpRequestResponseType.ARRAYBUFFER;
|
||||||
|
request.overrideMimeType('text/plain; charset=x-user-defined');
|
||||||
|
request.send(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
image.addEventListener ("load", function (event) {
|
|
||||||
|
|
||||||
var buffer = new ImageBuffer (null, image.width, image.height);
|
|
||||||
buffer.__srcImage = cast image;
|
|
||||||
|
|
||||||
activeRequests--;
|
|
||||||
processQueue ();
|
|
||||||
|
|
||||||
promise.complete (new Image (buffer));
|
|
||||||
|
|
||||||
}, false);
|
|
||||||
|
|
||||||
image.addEventListener ("progress", function (event) {
|
|
||||||
|
|
||||||
promise.progress (event.loaded, event.total);
|
|
||||||
|
|
||||||
}, false);
|
|
||||||
|
|
||||||
image.addEventListener ("error", function (event) {
|
|
||||||
|
|
||||||
activeRequests--;
|
|
||||||
processQueue ();
|
|
||||||
|
|
||||||
promise.error (event.detail);
|
|
||||||
|
|
||||||
}, false);
|
|
||||||
|
|
||||||
image.src = uri;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -509,4 +545,4 @@ class HTML5HTTPRequest {
|
|||||||
var promise:Dynamic;
|
var promise:Dynamic;
|
||||||
var uri:String;
|
var uri:String;
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user