From 8362df654c75033bfc9262b6a970cc045184558a Mon Sep 17 00:00:00 2001 From: Zixaphir Date: Thu, 25 Apr 2013 01:32:08 -0700 Subject: [PATCH 1/3] Throttle our first init. --- builds/4chan-X.js | 59 ++++++++++++++++++++++++++++++++++++++++-- builds/4chan-X.user.js | 59 ++++++++++++++++++++++++++++++++++++++++-- builds/crx/script.js | 57 +++++++++++++++++++++++++++++++++++++++- src/lib/$.coffee | 2 +- src/main.coffee | 43 ++++++++++++++++++++++++++++-- 5 files changed, 212 insertions(+), 8 deletions(-) diff --git a/builds/4chan-X.js b/builds/4chan-X.js index 7d314d336..07a76c696 100644 --- a/builds/4chan-X.js +++ b/builds/4chan-X.js @@ -22,7 +22,7 @@ // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAgMAAAAqbBEUAAAACVBMVEUAAGcAAABmzDNZt9VtAAAAAXRSTlMAQObYZgAAAHFJREFUKFOt0LENACEIBdBv4Qju4wgWanEj3D6OcIVMKaitYHEU/jwTCQj8W75kiVCSBvdQ5/AvfVHBin11BgdRq3ysBgfwBDRrj3MCIA+oAQaku/Q1cNctrAmyDl577tOThYt/Y1RBM4DgOHzM0HFTAyLukH/cmRnqAAAAAElFTkSuQmCC // ==/UserScript== /* -* 4chan X - Version 1.1.0 - 2013-04-24 +* 4chan X - Version 1.1.0 - 2013-04-25 * * Licensed under the MIT license. * https://github.com/seaweedchan/4chan-x/blob/master/LICENSE @@ -9621,7 +9621,11 @@ Main.handleErrors(errors); } Main.callbackNodes(Thread, threads); - Main.callbackNodes(Post, posts); + Main.callbackNodesDB(Post, posts, function() { + $.event('4chanXInitFinished'); + return Main.checkUpdate(); + }); + return; } $.event('4chanXInitFinished'); return Main.checkUpdate(); @@ -9653,6 +9657,57 @@ return Main.handleErrors(errors); } }, + callbackNodesDB: function(klass, nodes, cb) { + var errors, func, i, len, node, queue, softTask, _i; + + queue = []; + softTask = function() { + var args, func, task; + + if (!queue.length) { + return; + } + task = queue.shift(); + func = task[0]; + args = Array.prototype.slice.call(task, 1); + func.apply(func, args); + return setTimeout(softTask, 20); + }; + len = nodes.length; + i = 0; + errors = null; + func = function(node, i) { + var callback, err, _i, _len, _ref; + + _ref = klass.prototype.callbacks; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + callback = _ref[_i]; + try { + callback.cb.call(node); + } catch (_error) { + err = _error; + if (!errors) { + errors = []; + } + errors.push({ + message: "\"" + callback.name + "\" crashed on " + klass.name + " No." + node + " (/" + node.board + "/).", + error: err + }); + } + } + if (i === len) { + cb(); + if (errors) { + return Main.handleErrors(errors); + } + } + }; + for (i = _i = 0; 0 <= len ? _i < len : _i > len; i = 0 <= len ? ++_i : --_i) { + node = nodes[i]; + queue.push([func, node, i]); + } + return softTask(); + }, addCallback: function(e) { var Klass, obj; diff --git a/builds/4chan-X.user.js b/builds/4chan-X.user.js index 255b85e7c..c3cfd420f 100644 --- a/builds/4chan-X.user.js +++ b/builds/4chan-X.user.js @@ -22,7 +22,7 @@ // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAgMAAAAqbBEUAAAACVBMVEUAAGcAAABmzDNZt9VtAAAAAXRSTlMAQObYZgAAAHFJREFUKFOt0LENACEIBdBv4Qju4wgWanEj3D6OcIVMKaitYHEU/jwTCQj8W75kiVCSBvdQ5/AvfVHBin11BgdRq3ysBgfwBDRrj3MCIA+oAQaku/Q1cNctrAmyDl577tOThYt/Y1RBM4DgOHzM0HFTAyLukH/cmRnqAAAAAElFTkSuQmCC // ==/UserScript== /* -* 4chan X - Version 1.1.0 - 2013-04-24 +* 4chan X - Version 1.1.0 - 2013-04-25 * * Licensed under the MIT license. * https://github.com/seaweedchan/4chan-x/blob/master/LICENSE @@ -9644,7 +9644,11 @@ Main.handleErrors(errors); } Main.callbackNodes(Thread, threads); - Main.callbackNodes(Post, posts); + Main.callbackNodesDB(Post, posts, function() { + $.event('4chanXInitFinished'); + return Main.checkUpdate(); + }); + return; } $.event('4chanXInitFinished'); return Main.checkUpdate(); @@ -9676,6 +9680,57 @@ return Main.handleErrors(errors); } }, + callbackNodesDB: function(klass, nodes, cb) { + var errors, func, i, len, node, queue, softTask, _i; + + queue = []; + softTask = function() { + var args, func, task; + + if (!queue.length) { + return; + } + task = queue.shift(); + func = task[0]; + args = Array.prototype.slice.call(task, 1); + func.apply(func, args); + return setTimeout(softTask, 20); + }; + len = nodes.length; + i = 0; + errors = null; + func = function(node, i) { + var callback, err, _i, _len, _ref; + + _ref = klass.prototype.callbacks; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + callback = _ref[_i]; + try { + callback.cb.call(node); + } catch (_error) { + err = _error; + if (!errors) { + errors = []; + } + errors.push({ + message: "\"" + callback.name + "\" crashed on " + klass.name + " No." + node + " (/" + node.board + "/).", + error: err + }); + } + } + if (i === len) { + cb(); + if (errors) { + return Main.handleErrors(errors); + } + } + }; + for (i = _i = 0; 0 <= len ? _i < len : _i > len; i = 0 <= len ? ++_i : --_i) { + node = nodes[i]; + queue.push([func, node, i]); + } + return softTask(); + }, addCallback: function(e) { var Klass, obj; diff --git a/builds/crx/script.js b/builds/crx/script.js index 573f669d9..53fb08b2c 100644 --- a/builds/crx/script.js +++ b/builds/crx/script.js @@ -9487,7 +9487,11 @@ Main.handleErrors(errors); } Main.callbackNodes(Thread, threads); - Main.callbackNodes(Post, posts); + Main.callbackNodesDB(Post, posts, function() { + $.event('4chanXInitFinished'); + return Main.checkUpdate(); + }); + return; } $.event('4chanXInitFinished'); return Main.checkUpdate(); @@ -9519,6 +9523,57 @@ return Main.handleErrors(errors); } }, + callbackNodesDB: function(klass, nodes, cb) { + var errors, func, i, len, node, queue, softTask, _i; + + queue = []; + softTask = function() { + var args, func, task; + + if (!queue.length) { + return; + } + task = queue.shift(); + func = task[0]; + args = Array.prototype.slice.call(task, 1); + func.apply(func, args); + return setTimeout(softTask, 20); + }; + len = nodes.length; + i = 0; + errors = null; + func = function(node, i) { + var callback, err, _i, _len, _ref; + + _ref = klass.prototype.callbacks; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + callback = _ref[_i]; + try { + callback.cb.call(node); + } catch (_error) { + err = _error; + if (!errors) { + errors = []; + } + errors.push({ + message: "\"" + callback.name + "\" crashed on " + klass.name + " No." + node + " (/" + node.board + "/).", + error: err + }); + } + } + if (i === len) { + cb(); + if (errors) { + return Main.handleErrors(errors); + } + } + }; + for (i = _i = 0; 0 <= len ? _i < len : _i > len; i = 0 <= len ? ++_i : --_i) { + node = nodes[i]; + queue.push([func, node, i]); + } + return softTask(); + }, addCallback: function(e) { var Klass, obj; diff --git a/src/lib/$.coffee b/src/lib/$.coffee index a92d19ac3..91daa0ae6 100644 --- a/src/lib/$.coffee +++ b/src/lib/$.coffee @@ -234,7 +234,7 @@ $.debounce = (wait, fn) -> # after wait, let next invocation execute immediately timeout = setTimeout exec, wait - + $.queueTask = do -> # inspired by https://www.w3.org/Bugs/Public/show_bug.cgi?id=15007 taskQueue = [] diff --git a/src/main.coffee b/src/main.coffee index 11b64a081..9fb09397d 100644 --- a/src/main.coffee +++ b/src/main.coffee @@ -52,7 +52,7 @@ Main = for name, module of features # c.time "#{name} initialization" try - do module.init + module.init() catch err Main.handleErrors message: "\"#{name}\" initialization crashed." @@ -193,7 +193,11 @@ Main = Main.handleErrors errors if errors Main.callbackNodes Thread, threads - Main.callbackNodes Post, posts + Main.callbackNodesDB Post, posts, -> + $.event '4chanXInitFinished' + Main.checkUpdate() + + return $.event '4chanXInitFinished' Main.checkUpdate() @@ -216,6 +220,41 @@ Main = # c.profileEnd callback.name Main.handleErrors errors if errors + callbackNodesDB: (klass, nodes, cb) -> + queue = [] + softTask = -> + return unless queue.length + task = queue.shift() + func = task[0] + args = Array::slice.call task, 1 + func.apply func, args + setTimeout softTask, 20 + + # get the nodes' length only once + len = nodes.length + i = 0 + errors = null + + func = (node, i) -> + for callback in klass::callbacks + try + callback.cb.call node + catch err + unless errors + errors = [] + errors.push + message: "\"#{callback.name}\" crashed on #{klass.name} No.#{node} (/#{node.board}/)." + error: err + # finish + if i is len + cb() + Main.handleErrors errors if errors + + for i in [0...len] + node = nodes[i] + queue.push [func, node, i] + softTask() + addCallback: (e) -> obj = e.detail unless typeof obj.callback.name is 'string' From f269690b3e355fdf241c6f6dd25a0fb471be7755 Mon Sep 17 00:00:00 2001 From: Zixaphir Date: Thu, 25 Apr 2013 01:54:39 -0700 Subject: [PATCH 2/3] Mite need to rethink a couple of those "4chanXInitFinished" cb()s... --- builds/4chan-X.js | 14 ++++++++------ builds/4chan-X.user.js | 14 ++++++++------ builds/crx/script.js | 14 ++++++++------ src/main.coffee | 9 +++++---- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/builds/4chan-X.js b/builds/4chan-X.js index 07a76c696..216c029ab 100644 --- a/builds/4chan-X.js +++ b/builds/4chan-X.js @@ -9658,7 +9658,7 @@ } }, callbackNodesDB: function(klass, nodes, cb) { - var errors, func, i, len, node, queue, softTask, _i; + var errors, func, i, len, node, queue, softTask; queue = []; softTask = function() { @@ -9671,7 +9671,7 @@ func = task[0]; args = Array.prototype.slice.call(task, 1); func.apply(func, args); - return setTimeout(softTask, 20); + return setTimeout(softTask, 0); }; len = nodes.length; i = 0; @@ -9696,15 +9696,17 @@ } } if (i === len) { - cb(); if (errors) { - return Main.handleErrors(errors); + Main.handleErrors(errors); + } + if (cb) { + return cb(); } } }; - for (i = _i = 0; 0 <= len ? _i < len : _i > len; i = 0 <= len ? ++_i : --_i) { + while (i < len) { node = nodes[i]; - queue.push([func, node, i]); + queue.push([func, node, ++i]); } return softTask(); }, diff --git a/builds/4chan-X.user.js b/builds/4chan-X.user.js index c3cfd420f..457047733 100644 --- a/builds/4chan-X.user.js +++ b/builds/4chan-X.user.js @@ -9681,7 +9681,7 @@ } }, callbackNodesDB: function(klass, nodes, cb) { - var errors, func, i, len, node, queue, softTask, _i; + var errors, func, i, len, node, queue, softTask; queue = []; softTask = function() { @@ -9694,7 +9694,7 @@ func = task[0]; args = Array.prototype.slice.call(task, 1); func.apply(func, args); - return setTimeout(softTask, 20); + return setTimeout(softTask, 0); }; len = nodes.length; i = 0; @@ -9719,15 +9719,17 @@ } } if (i === len) { - cb(); if (errors) { - return Main.handleErrors(errors); + Main.handleErrors(errors); + } + if (cb) { + return cb(); } } }; - for (i = _i = 0; 0 <= len ? _i < len : _i > len; i = 0 <= len ? ++_i : --_i) { + while (i < len) { node = nodes[i]; - queue.push([func, node, i]); + queue.push([func, node, ++i]); } return softTask(); }, diff --git a/builds/crx/script.js b/builds/crx/script.js index 53fb08b2c..c9e41c2b9 100644 --- a/builds/crx/script.js +++ b/builds/crx/script.js @@ -9524,7 +9524,7 @@ } }, callbackNodesDB: function(klass, nodes, cb) { - var errors, func, i, len, node, queue, softTask, _i; + var errors, func, i, len, node, queue, softTask; queue = []; softTask = function() { @@ -9537,7 +9537,7 @@ func = task[0]; args = Array.prototype.slice.call(task, 1); func.apply(func, args); - return setTimeout(softTask, 20); + return setTimeout(softTask, 0); }; len = nodes.length; i = 0; @@ -9562,15 +9562,17 @@ } } if (i === len) { - cb(); if (errors) { - return Main.handleErrors(errors); + Main.handleErrors(errors); + } + if (cb) { + return cb(); } } }; - for (i = _i = 0; 0 <= len ? _i < len : _i > len; i = 0 <= len ? ++_i : --_i) { + while (i < len) { node = nodes[i]; - queue.push([func, node, i]); + queue.push([func, node, ++i]); } return softTask(); }, diff --git a/src/main.coffee b/src/main.coffee index 9fb09397d..13cca9348 100644 --- a/src/main.coffee +++ b/src/main.coffee @@ -228,7 +228,7 @@ Main = func = task[0] args = Array::slice.call task, 1 func.apply func, args - setTimeout softTask, 20 + setTimeout softTask, 0 # get the nodes' length only once len = nodes.length @@ -247,12 +247,13 @@ Main = error: err # finish if i is len - cb() Main.handleErrors errors if errors + cb() if cb - for i in [0...len] + while i < len node = nodes[i] - queue.push [func, node, i] + queue.push [func, node, ++i] + softTask() addCallback: (e) -> From c07d39a11f4dde4c6e79e7f266c51ca3bb858902 Mon Sep 17 00:00:00 2001 From: Zixaphir Date: Thu, 25 Apr 2013 02:23:32 -0700 Subject: [PATCH 3/3] Seven is a magic number. --- builds/4chan-X.js | 6 +++++- builds/4chan-X.user.js | 6 +++++- builds/crx/script.js | 6 +++++- src/main.coffee | 5 ++++- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/builds/4chan-X.js b/builds/4chan-X.js index 216c029ab..e11f52d41 100644 --- a/builds/4chan-X.js +++ b/builds/4chan-X.js @@ -9671,7 +9671,11 @@ func = task[0]; args = Array.prototype.slice.call(task, 1); func.apply(func, args); - return setTimeout(softTask, 0); + if ((queue.length % 7) === 0) { + return setTimeout(softTask, 0); + } else { + return softTask(); + } }; len = nodes.length; i = 0; diff --git a/builds/4chan-X.user.js b/builds/4chan-X.user.js index 457047733..b9f4b3f1f 100644 --- a/builds/4chan-X.user.js +++ b/builds/4chan-X.user.js @@ -9694,7 +9694,11 @@ func = task[0]; args = Array.prototype.slice.call(task, 1); func.apply(func, args); - return setTimeout(softTask, 0); + if ((queue.length % 7) === 0) { + return setTimeout(softTask, 0); + } else { + return softTask(); + } }; len = nodes.length; i = 0; diff --git a/builds/crx/script.js b/builds/crx/script.js index c9e41c2b9..27c5834e2 100644 --- a/builds/crx/script.js +++ b/builds/crx/script.js @@ -9537,7 +9537,11 @@ func = task[0]; args = Array.prototype.slice.call(task, 1); func.apply(func, args); - return setTimeout(softTask, 0); + if ((queue.length % 7) === 0) { + return setTimeout(softTask, 0); + } else { + return softTask(); + } }; len = nodes.length; i = 0; diff --git a/src/main.coffee b/src/main.coffee index 13cca9348..335125b54 100644 --- a/src/main.coffee +++ b/src/main.coffee @@ -228,7 +228,10 @@ Main = func = task[0] args = Array::slice.call task, 1 func.apply func, args - setTimeout softTask, 0 + if (queue.length % 7) is 0 + setTimeout softTask, 0 + else + softTask() # get the nodes' length only once len = nodes.length