| Index: test/BaseJsTest.h | 
| =================================================================== | 
| --- a/test/BaseJsTest.h | 
| +++ b/test/BaseJsTest.h | 
| @@ -13,16 +13,17 @@ | 
| * | 
| * You should have received a copy of the GNU General Public License | 
| * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 
| */ | 
| #ifndef MOCKS_H | 
| #define MOCKS_H | 
| +#include <queue> | 
| #include <thread> | 
| #include <AdblockPlus.h> | 
| #include <AdblockPlus/Platform.h> | 
| #include <gtest/gtest.h> | 
| #include "../src/Thread.h" | 
| // Strictly speaking in each test there should be a special implementation of | 
| @@ -66,16 +67,37 @@ | 
| class NoopTimer : public AdblockPlus::ITimer | 
| { | 
| void SetTimer(const std::chrono::milliseconds& timeout, const TimerCallback& timerCallback) override | 
| { | 
| } | 
| }; | 
| +class ManualTimer : public AdblockPlus::ITimer | 
| +{ | 
| + std::queue<TimerCallback> timers; | 
| + void SetTimer(const std::chrono::milliseconds& timeout, const TimerCallback& timerCallback) override | 
| + { | 
| + timers.push(timerCallback); | 
| + } | 
| + | 
| +public: | 
| + void runPending() | 
| + { | 
| + std::queue<TimerCallback> currentTimers; | 
| + currentTimers.swap(timers); | 
| + while (!currentTimers.empty()) { | 
| + auto callback = currentTimers.front(); | 
| + currentTimers.pop(); | 
| + callback(); | 
| + } | 
| + } | 
| +}; | 
| + | 
| struct DelayedTimerTask | 
| { | 
| std::chrono::milliseconds timeout; | 
| AdblockPlus::ITimer::TimerCallback callback; | 
| }; | 
| class DelayedTimer : public DelayedMixin<DelayedTimer, DelayedTimerTask, AdblockPlus::ITimer> | 
| { |