123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- goog.provide('goog.net.ImageLoader');
- goog.require('goog.array');
- goog.require('goog.dom');
- goog.require('goog.dom.TagName');
- goog.require('goog.events.EventHandler');
- goog.require('goog.events.EventTarget');
- goog.require('goog.events.EventType');
- goog.require('goog.net.EventType');
- goog.require('goog.object');
- goog.require('goog.userAgent');
- goog.net.ImageLoader = function(opt_parent) {
- goog.events.EventTarget.call(this);
-
- this.imageIdToRequestMap_ = {};
-
- this.imageIdToImageMap_ = {};
-
- this.handler_ = new goog.events.EventHandler(this);
-
- this.parent_ = opt_parent;
- };
- goog.inherits(goog.net.ImageLoader, goog.events.EventTarget);
- goog.net.ImageLoader.CorsRequestType = {
- ANONYMOUS: 'anonymous',
- USE_CREDENTIALS: 'use-credentials'
- };
- goog.net.ImageLoader.ImageRequest_;
- goog.net.ImageLoader.IMAGE_LOAD_EVENTS_ = [
- goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('11') ?
- goog.net.EventType.READY_STATE_CHANGE :
- goog.events.EventType.LOAD,
- goog.net.EventType.ABORT, goog.net.EventType.ERROR
- ];
- goog.net.ImageLoader.prototype.addImage = function(
- id, image, opt_corsRequestType) {
- var src = goog.isString(image) ? image : image.src;
- if (src) {
-
- this.imageIdToRequestMap_[id] = {
- src: src,
- corsRequestType: goog.isDef(opt_corsRequestType) ? opt_corsRequestType :
- null
- };
- }
- };
- goog.net.ImageLoader.prototype.removeImage = function(id) {
- delete this.imageIdToRequestMap_[id];
- var image = this.imageIdToImageMap_[id];
- if (image) {
- delete this.imageIdToImageMap_[id];
-
- this.handler_.unlisten(
- image, goog.net.ImageLoader.IMAGE_LOAD_EVENTS_, this.onNetworkEvent_);
-
- if (goog.object.isEmpty(this.imageIdToImageMap_) &&
- goog.object.isEmpty(this.imageIdToRequestMap_)) {
- this.dispatchEvent(goog.net.EventType.COMPLETE);
- }
- }
- };
- goog.net.ImageLoader.prototype.start = function() {
-
-
-
- var imageIdToRequestMap = this.imageIdToRequestMap_;
- goog.array.forEach(goog.object.getKeys(imageIdToRequestMap), function(id) {
- var imageRequest = imageIdToRequestMap[id];
- if (imageRequest) {
- delete imageIdToRequestMap[id];
- this.loadImage_(imageRequest, id);
- }
- }, this);
- };
- goog.net.ImageLoader.prototype.loadImage_ = function(imageRequest, id) {
- if (this.isDisposed()) {
-
-
-
- return;
- }
-
- var image;
- if (this.parent_) {
- var dom = goog.dom.getDomHelper(this.parent_);
- image = dom.createDom(goog.dom.TagName.IMG);
- } else {
- image = new Image();
- }
- if (imageRequest.corsRequestType) {
- image.crossOrigin = imageRequest.corsRequestType;
- }
- this.handler_.listen(
- image, goog.net.ImageLoader.IMAGE_LOAD_EVENTS_, this.onNetworkEvent_);
- this.imageIdToImageMap_[id] = image;
- image.id = id;
- image.src = imageRequest.src;
- };
- goog.net.ImageLoader.prototype.onNetworkEvent_ = function(evt) {
- var image = (evt.currentTarget);
- if (!image) {
- return;
- }
- if (evt.type == goog.net.EventType.READY_STATE_CHANGE) {
-
-
-
- if (image.readyState == goog.net.EventType.COMPLETE) {
-
- evt.type = goog.events.EventType.LOAD;
- } else {
-
-
-
-
-
-
-
-
-
-
-
-
-
- return;
- }
- }
-
- if (typeof image.naturalWidth == 'undefined') {
- if (evt.type == goog.events.EventType.LOAD) {
- image.naturalWidth = image.width;
- image.naturalHeight = image.height;
- } else {
-
- image.naturalWidth = 0;
- image.naturalHeight = 0;
- }
- }
-
-
- this.dispatchEvent({type: evt.type, target: image});
- if (this.isDisposed()) {
-
- return;
- }
- this.removeImage(image.id);
- };
- goog.net.ImageLoader.prototype.disposeInternal = function() {
- delete this.imageIdToRequestMap_;
- delete this.imageIdToImageMap_;
- goog.dispose(this.handler_);
- goog.net.ImageLoader.superClass_.disposeInternal.call(this);
- };
|