• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef TESTING_EMBEDDER_TEST_TIMER_HANDLING_DELEGATE_H_
6 #define TESTING_EMBEDDER_TEST_TIMER_HANDLING_DELEGATE_H_
7 
8 #include <map>
9 #include <utility>
10 
11 #include "embedder_test.h"
12 
13 class EmbedderTestTimerHandlingDelegate : public EmbedderTest::Delegate {
14 public:
SetTimer(int msecs,TimerCallback fn)15   int SetTimer(int msecs, TimerCallback fn) override {
16     expiry_to_timer_map_.insert(std::pair<int, Timer>(
17         msecs + imaginary_elapsed_msecs_, Timer(++next_timer_id_, fn)));
18     return next_timer_id_;
19   }
20 
KillTimer(int id)21   void KillTimer(int id) override {
22     for (auto iter = expiry_to_timer_map_.begin();
23          iter != expiry_to_timer_map_.end(); ++iter) {
24       if (iter->second.first == id) {
25         expiry_to_timer_map_.erase(iter);
26         break;
27       }
28     }
29   }
30 
AdvanceTime(int increment_msecs)31   void AdvanceTime(int increment_msecs) {
32     imaginary_elapsed_msecs_ += increment_msecs;
33     while (1) {
34       auto iter = expiry_to_timer_map_.begin();
35       if (iter == expiry_to_timer_map_.end()) {
36         break;
37       }
38       Timer t = iter->second;
39       if (t.first > imaginary_elapsed_msecs_) {
40         break;
41       }
42       expiry_to_timer_map_.erase(iter);
43       t.second(t.first);  // Fire timer.
44     }
45   }
46 
47 protected:
48   using Timer = std::pair<int, TimerCallback>;  // ID, callback pair.
49   std::multimap<int, Timer> expiry_to_timer_map_;  // Keyed by timeout.
50   int next_timer_id_ = 0;
51   int imaginary_elapsed_msecs_ = 0;
52 };
53 
54 #endif // TESTING_EMBEDDER_TEST_TIMER_HANDLING_DELEGATE_H_
55