Просмотр исходного кода

fixed mime type issue for data URI encoded in base64

Gildas lormeau 12 лет назад
Родитель
Сommit
731678e686
1 измененных файлов с 24 добавлено и 22 удалено
  1. 24 22
      WebContent/core/scripts/bg/nio.js

+ 24 - 22
WebContent/core/scripts/bg/nio.js

@@ -34,12 +34,15 @@
 			}
 		}
 
-		function throwAwayHighOrderBytes(str) {
-			var i, ret = [];
-			ret.length = str.length;
-			for (i = 0; i < str.length; i++)
-				ret[i] = String.fromCharCode(str.charCodeAt(i) & 0xff);
-			return ret.join("");
+		function arrayBufferToBase64(buffer) {
+			var binary, bytes, len, i;
+			binary = "";
+			bytes = new Uint8Array(buffer);
+			len = bytes.byteLength;
+			for (i = 0; i < len; i++) {
+				binary += String.fromCharCode(bytes[i]);
+			}
+			return btoa(binary);
 		}
 
 		this.reset = function() {
@@ -63,26 +66,25 @@
 			else {
 				pendingResponseHandlers[key] = [ responseHandler ];
 				xhr = new XMLHttpRequest();
-				xhr.onreadystatechange = function() {
-					if (xhr.readyState == 4) {
-						clearTimeout(timeout);
-						cache[key] = {
-							url : url,
-							status : xhr.status,
-							mediaType : xhr.getResponseHeader("Content-Type"),
-							content : mediaTypeParam == "base64" ? btoa(throwAwayHighOrderBytes(xhr.responseText)) : xhr.responseText,
-							mediaTypeParam : mediaTypeParam
-						};
-						keys.push(key);
-						sendResponses(key);
-					}
+				xhr.onload = function() {
+					clearTimeout(timeout);
+					cache[key] = {
+						url : url,
+						status : xhr.status,
+						mediaType : xhr.getResponseHeader("Content-Type"),
+						content : mediaTypeParam == "base64" ? arrayBufferToBase64(xhr.response) : xhr.responseText,
+						mediaTypeParam : mediaTypeParam
+					};
+					keys.push(key);
+					sendResponses(key);
 				};
 				xhr.onerror = function() {
 					sendResponses(key);
 				};
 				xhr.open("GET", url, true);
-				if (characterSet)
-					xhr.overrideMimeType('text/plain; charset=' + characterSet);
+				if (mediaTypeParam == "base64") {
+					xhr.responseType = "arraybuffer";
+				}
 				timeout = setTimeout(function() {
 					xhr.abort();
 					sendResponses(key);
@@ -96,4 +98,4 @@
 		};
 	};
 
-})();
+})();