Merge branch 'v3' of git://github.com/zixaphir/appchan-x

This commit is contained in:
Jordan Bates 2013-04-25 03:34:35 -07:00
commit 93c87664b4
5 changed files with 234 additions and 8 deletions

View File

@ -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
@ -9706,7 +9706,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();
@ -9738,6 +9742,63 @@
return Main.handleErrors(errors);
}
},
callbackNodesDB: function(klass, nodes, cb) {
var errors, func, i, len, node, queue, softTask;
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);
if ((queue.length % 7) === 0) {
return setTimeout(softTask, 0);
} else {
return softTask();
}
};
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) {
if (errors) {
Main.handleErrors(errors);
}
if (cb) {
return cb();
}
}
};
while (i < len) {
node = nodes[i];
queue.push([func, node, ++i]);
}
return softTask();
},
addCallback: function(e) {
var Klass, obj;

View File

@ -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
@ -9729,7 +9729,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();
@ -9761,6 +9765,63 @@
return Main.handleErrors(errors);
}
},
callbackNodesDB: function(klass, nodes, cb) {
var errors, func, i, len, node, queue, softTask;
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);
if ((queue.length % 7) === 0) {
return setTimeout(softTask, 0);
} else {
return softTask();
}
};
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) {
if (errors) {
Main.handleErrors(errors);
}
if (cb) {
return cb();
}
}
};
while (i < len) {
node = nodes[i];
queue.push([func, node, ++i]);
}
return softTask();
},
addCallback: function(e) {
var Klass, obj;

View File

@ -9572,7 +9572,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();
@ -9604,6 +9608,63 @@
return Main.handleErrors(errors);
}
},
callbackNodesDB: function(klass, nodes, cb) {
var errors, func, i, len, node, queue, softTask;
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);
if ((queue.length % 7) === 0) {
return setTimeout(softTask, 0);
} else {
return softTask();
}
};
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) {
if (errors) {
Main.handleErrors(errors);
}
if (cb) {
return cb();
}
}
};
while (i < len) {
node = nodes[i];
queue.push([func, node, ++i]);
}
return softTask();
},
addCallback: function(e) {
var Klass, obj;

View File

@ -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 = []

View File

@ -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."
@ -195,7 +195,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()
@ -218,6 +222,45 @@ 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
if (queue.length % 7) is 0
setTimeout softTask, 0
else
softTask()
# 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
Main.handleErrors errors if errors
cb() if cb
while i < len
node = nodes[i]
queue.push [func, node, ++i]
softTask()
addCallback: (e) ->
obj = e.detail
unless typeof obj.callback.name is 'string'