| Index: lib/crawler.js |
| diff --git a/lib/crawler.js b/lib/crawler.js |
| index 54df1501957a2a585f608eaca8042c75bc477051..cc28c96ab280ccf51b16ef7b29f9bd57b66211ea 100644 |
| --- a/lib/crawler.js |
| +++ b/lib/crawler.js |
| @@ -22,6 +22,8 @@ function abprequire(module) |
| let {RequestNotifier} = abprequire("requestNotifier"); |
| +let {FilterNotifier} = abprequire("filterNotifier"); |
| +let {FilterStorage} = abprequire("filterStorage"); |
| /** |
| * Creates a pool of tabs and allocates them to tasks on request. |
| @@ -219,31 +221,51 @@ function run(window, urls, timeout, maxtabs, targetURL, onDone) |
| } |
| }; |
| - for (let url of urls) |
| + new Promise(function(resolve, reject) |
|
Wladimir Palant
2016/03/15 09:13:10
Nit: Why not use arrow functions consistently? (re
sergei
2016/03/15 12:16:23
We don't need to capture `this` here, so I have no
Wladimir Palant
2016/03/15 13:44:22
We generally use arrow functions for inline callba
|
| { |
| - running++; |
| - Task.spawn(crawl_url.bind(null, url, tabAllocator, loadListener)).then(function(result) |
| + if (FilterStorage.subscriptions.length > 0 && !FilterStorage._loading) |
|
Wladimir Palant
2016/03/15 09:13:10
_loading is an internal flag to prevent reentrance
Wladimir Palant
2016/03/15 09:18:11
Actually, I think that this is a bad assumption fr
sergei
2016/03/15 12:16:23
I thought about it.
It does happen that "load" ev
Wladimir Palant
2016/03/15 13:44:22
No, subscriptions are added all at once when loadi
sergei
2016/03/15 14:44:25
Acknowledged.
|
| { |
| - let request = new XMLHttpRequest(); |
| - request.open("POST", targetURL); |
| - request.addEventListener("load", taskDone, false); |
| - request.addEventListener("error", taskDone, false); |
| - request.send(JSON.stringify(result)); |
| - }, function(url, exception) |
| + resolve(); |
| + return; |
| + } |
| + FilterNotifier.addListener((action, item, newValue, oldValue) => |
| + { |
| + if (action === "load") |
|
Wladimir Palant
2016/03/15 09:13:11
Nit: We don't usually use strict equality, and it
sergei
2016/03/15 12:16:23
Fixed.
|
| + { |
| + resolve(); |
| + } |
| + }); |
| + }).then(_ => |
|
Wladimir Palant
2016/03/15 09:13:11
No pointless parameter please, () =>
sergei
2016/03/15 12:16:23
Acknowledged.
|
| + { |
| + for (let url of urls) |
| { |
| - reportException(exception); |
| + running++; |
| + Task.spawn(crawl_url.bind(null, url, tabAllocator, loadListener)).then(function(result) |
| + { |
| + let request = new XMLHttpRequest(); |
| + request.open("POST", targetURL); |
| + request.addEventListener("load", taskDone, false); |
| + request.addEventListener("error", taskDone, false); |
| + request.send(JSON.stringify(result)); |
| + }, function(url, exception) |
| + { |
| + reportException(exception); |
| - let request = new XMLHttpRequest(); |
| - request.open("POST", targetURL); |
| - request.addEventListener("load", taskDone, false); |
| - request.addEventListener("error", taskDone, false); |
| - request.send(JSON.stringify({ |
| - url: url, |
| - startTime: Date.now(), |
| - error: String(exception) |
| - })); |
| - }.bind(null, url)); |
| - } |
| + let request = new XMLHttpRequest(); |
| + request.open("POST", targetURL); |
| + request.addEventListener("load", taskDone, false); |
| + request.addEventListener("error", taskDone, false); |
| + request.send(JSON.stringify({ |
| + url: url, |
| + startTime: Date.now(), |
| + error: String(exception) |
| + })); |
| + }.bind(null, url)); |
| + } |
| + // Be careful, `catch` does not catch exeptions from any asynchronous calls |
|
Wladimir Palant
2016/03/15 09:13:11
exeptions => exceptions.
sergei
2016/03/15 12:16:23
Done. Basically, I have removed the comment.
|
| + // of this `then` handler because the latter one does not return an array of |
| + // promises of asynchrounous tasks and does not contain any waiting code. |
| + }).catch(reportException); |
|
Wladimir Palant
2016/03/15 09:13:11
I'm not really happy with the way this is structur
sergei
2016/03/15 12:16:23
Done.
|
| } |
| exports.run = run; |