소스 검색

bug fixes:
- support timed out XHRs
- remove meta refresh elements from processed documents

Gildas lormeau 15 년 전
부모
커밋
d0edbcfa53
2개의 변경된 파일18개의 추가작업 그리고 6개의 파일을 삭제
  1. 10 5
      WebContent/core/scripts/bg/nio.js
  2. 8 1
      WebContent/core/scripts/common/docprocessor.js

+ 10 - 5
WebContent/core/scripts/bg/nio.js

@@ -23,7 +23,7 @@
 	singlefile.nio = {};
 
 	singlefile.nio.RequestManager = function() {
-		var cache = {}, keys = [], pendingResponseHandlers = {};
+		var cache = {}, keys = [], pendingResponseHandlers = {}, XHR_TIMEOUT = 45000;
 
 		function sendResponses(key) {
 			if (pendingResponseHandlers[key]) {
@@ -47,15 +47,15 @@
 		};
 
 		this.send = function(url, responseHandler, characterSet, mediaTypeParam) {
-			var xhr, key = JSON.stringify({
+			var xhr, timeout, key = JSON.stringify({
 				url : url,
 				characterSet : characterSet,
 				mediaTypeParam : mediaTypeParam
-			}), resource = cache[key];
+			});
 
-			if (resource)
+			if (cache[key])
 				setTimeout(function() {
-					responseHandler(resource);
+					responseHandler(cache[key]);
 				}, 1);
 			else if (pendingResponseHandlers[key])
 				pendingResponseHandlers[key].push(responseHandler);
@@ -64,6 +64,7 @@
 				xhr = new XMLHttpRequest();
 				xhr.onreadystatechange = function() {
 					if (xhr.readyState == 4) {
+						clearTimeout(timeout);
 						cache[key] = {
 							url : url,
 							status : xhr.status,
@@ -81,6 +82,10 @@
 				xhr.open("GET", url, true);
 				if (characterSet)
 					xhr.overrideMimeType('text/plain; charset=' + characterSet);
+				timeout = setTimeout(function() {
+					xhr.abort();
+					sendResponses(key);
+				}, XHR_TIMEOUT);
 				try {
 					xhr.send(null);
 				} catch (e) {

+ 8 - 1
WebContent/core/scripts/common/docprocessor.js

@@ -329,6 +329,12 @@
 		});
 	}
 
+	function removeMetaRefresh(docElement) {
+		Array.prototype.forEach.call(docElement.querySelectorAll("meta[http-equiv=refresh]"), function(node) {
+			node.parentElement.removeChild(node);
+		});
+	}
+
 	function resetFrames(docElement, baseURI) {
 		Array.prototype.forEach.call(docElement.querySelectorAll("iframe, frame"), function(node) {
 			var src = formatURL(node.getAttribute("src"), baseURI);
@@ -390,6 +396,7 @@
 				removeFrames(docElement);
 			resetFrames(docElement, baseURI);
 			removeBlockquotesCite(docElement);
+			removeMetaRefresh(docElement);
 			setAbsoluteLinks(docElement, baseURI);
 			if (addDefaultFavico)
 				insertDefaultFavico(doc, docElement, baseURI);
@@ -427,7 +434,7 @@
 			initManager.onEnd();
 		return function() {
 			manager.doSend();
-			if (manager.requestCount == 0 && manager.onEnd)
+			if (manager.onEnd && manager.requestCount == 0)
 				manager.onEnd();
 		};
 	};