From 76495dfd314de996c2c2eb0b19dbe56ff53fbb86 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Thu, 4 Aug 2011 10:16:27 +0400 Subject: [PATCH] auto catchup: prevent request flood --- viewfeed.js | 56 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/viewfeed.js b/viewfeed.js index a4ac946a..3a16edfa 100644 --- a/viewfeed.js +++ b/viewfeed.js @@ -14,6 +14,9 @@ var preload_timeout_id = false; var cache_added = []; +var catchup_id_batch = []; +var catchup_timeout_id = false; + function headlines_callback2(transport, feed_cur_page) { try { handle_rpc_json(transport); @@ -1346,39 +1349,56 @@ function headlines_scroll_handler(e) { if (getInitParam("cdm_auto_catchup") == 1) { - var ids = []; - $$("#headlines-frame > div[id*=RROW][class*=Unread]").each( function(child) { if ($("headlines-frame").scrollTop > (child.offsetTop + child.offsetHeight/2)) { - ids.push(child.id.replace("RROW-", "")); + var id = child.id.replace("RROW-", ""); + + if (catchup_id_batch.indexOf(id) == -1) + catchup_id_batch.push(id); } }); - if (ids.length > 0) { - - var query = "?op=rpc&subop=catchupSelected" + - "&cmode=0&ids=" + param_escape(ids.toString()); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - handle_rpc_json(transport); - - ids.each(function(id) { - var elem = $("RROW-" + id); - if (elem) elem.removeClassName("Unread"); - }); - } }); + if (catchup_id_batch.length > 0) { + window.clearTimeout(catchup_timeout_id); + catchup_timeout_id = window.setTimeout('catchupBatchedArticles()', + 1000); } } + } catch (e) { exception_error("headlines_scroll_handler", e); } } +function catchupBatchedArticles() { + try { + if (catchup_id_batch.length > 0) { + + var query = "?op=rpc&subop=catchupSelected" + + "&cmode=0&ids=" + param_escape(catchup_id_batch.toString()); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + handle_rpc_json(transport); + + catchup_id_batch.each(function(id) { + var elem = $("RROW-" + id); + if (elem) elem.removeClassName("Unread"); + }); + + catchup_id_batch = []; + } }); + } + + } catch (e) { + exception_error("catchupBatchedArticles", e); + } +} + function catchupRelativeToArticle(below) { try {