OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <limits> | 5 #include <limits> |
6 | 6 |
7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
8 #include "content/public/test/test_browser_thread_bundle.h" | 8 #include "content/public/test/test_browser_thread_bundle.h" |
9 #include "extensions/browser/deferred_start_render_host.h" | 9 #include "extensions/browser/deferred_start_render_host.h" |
10 #include "extensions/browser/extensions_test.h" | 10 #include "extensions/browser/extensions_test.h" |
11 #include "extensions/browser/load_monitoring_extension_host_queue.h" | 11 #include "extensions/browser/load_monitoring_extension_host_queue.h" |
12 #include "extensions/browser/serial_extension_host_queue.h" | 12 #include "extensions/browser/serial_extension_host_queue.h" |
13 | 13 |
14 namespace extensions { | 14 namespace extensions { |
15 | 15 |
16 namespace { | 16 namespace { |
17 | 17 |
18 class StubDeferredStartRenderHost : public DeferredStartRenderHost { | 18 class StubDeferredStartRenderHost : public DeferredStartRenderHost { |
| 19 public: |
| 20 // Returns true if this host is being observed by |observer|. |
| 21 bool IsObservedBy(DeferredStartRenderHostObserver* observer) { |
| 22 return observers_.count(observer) > 0; |
| 23 } |
| 24 |
19 private: | 25 private: |
| 26 // DeferredStartRenderHost: |
20 void AddDeferredStartRenderHostObserver( | 27 void AddDeferredStartRenderHostObserver( |
21 DeferredStartRenderHostObserver* observer) override {} | 28 DeferredStartRenderHostObserver* observer) override { |
| 29 observers_.insert(observer); |
| 30 } |
22 void RemoveDeferredStartRenderHostObserver( | 31 void RemoveDeferredStartRenderHostObserver( |
23 DeferredStartRenderHostObserver* observer) override {} | 32 DeferredStartRenderHostObserver* observer) override { |
| 33 observers_.erase(observer); |
| 34 } |
24 void CreateRenderViewNow() override {} | 35 void CreateRenderViewNow() override {} |
| 36 |
| 37 std::set<DeferredStartRenderHostObserver*> observers_; |
25 }; | 38 }; |
26 | 39 |
27 const size_t g_invalid_size_t = std::numeric_limits<size_t>::max(); | 40 const size_t g_invalid_size_t = std::numeric_limits<size_t>::max(); |
28 | 41 |
29 } // namespace | 42 } // namespace |
30 | 43 |
31 class LoadMonitoringExtensionHostQueueTest : public ExtensionsTest { | 44 class LoadMonitoringExtensionHostQueueTest : public ExtensionsTest { |
32 public: | 45 public: |
33 LoadMonitoringExtensionHostQueueTest() | 46 LoadMonitoringExtensionHostQueueTest() |
34 : finished_(false), | 47 : finished_(false), |
35 // Arbitrary choice of an invalid size_t. | 48 // Arbitrary choice of an invalid size_t. |
36 num_queued_(g_invalid_size_t), | 49 num_queued_(g_invalid_size_t), |
37 num_loaded_(g_invalid_size_t), | 50 num_loaded_(g_invalid_size_t), |
38 max_in_queue_(g_invalid_size_t), | 51 max_awaiting_loading_(g_invalid_size_t), |
39 max_active_loading_(g_invalid_size_t) {} | 52 max_active_loading_(g_invalid_size_t) {} |
40 | 53 |
41 void SetUp() override { | 54 void SetUp() override { |
42 queue_.reset(new LoadMonitoringExtensionHostQueue( | 55 queue_.reset(new LoadMonitoringExtensionHostQueue( |
43 // Use a SerialExtensionHostQueue because it's simple. | 56 // Use a SerialExtensionHostQueue because it's simple. |
44 scoped_ptr<ExtensionHostQueue>(new SerialExtensionHostQueue()), | 57 scoped_ptr<ExtensionHostQueue>(new SerialExtensionHostQueue()), |
45 base::TimeDelta(), // no delay, easier to test | 58 base::TimeDelta(), // no delay, easier to test |
46 base::Bind(&LoadMonitoringExtensionHostQueueTest::Finished, | 59 base::Bind(&LoadMonitoringExtensionHostQueueTest::Finished, |
47 base::Unretained(this)))); | 60 base::Unretained(this)))); |
48 } | 61 } |
49 | 62 |
50 protected: | 63 protected: |
51 // Creates a new DeferredStartRenderHost. Ownership is held by this class, | 64 // Creates a new DeferredStartRenderHost. Ownership is held by this class, |
52 // not passed to caller. | 65 // not passed to caller. |
53 DeferredStartRenderHost* CreateHost() { | 66 StubDeferredStartRenderHost* CreateHost() { |
54 StubDeferredStartRenderHost* stub = new StubDeferredStartRenderHost(); | 67 StubDeferredStartRenderHost* stub = new StubDeferredStartRenderHost(); |
55 stubs_.push_back(stub); | 68 stubs_.push_back(stub); |
56 return stub; | 69 return stub; |
57 } | 70 } |
58 | 71 |
59 // Our single LoadMonitoringExtensionHostQueue instance. | 72 // Our single LoadMonitoringExtensionHostQueue instance. |
60 LoadMonitoringExtensionHostQueue* queue() { return queue_.get(); } | 73 LoadMonitoringExtensionHostQueue* queue() { return queue_.get(); } |
61 | 74 |
62 // Returns true if the queue has finished monitoring. | 75 // Returns true if the queue has finished monitoring. |
63 bool finished() { return finished_; } | 76 bool finished() const { return finished_; } |
64 | 77 |
65 // These are available after the queue has finished (in which case finished() | 78 // These are available after the queue has finished (in which case finished() |
66 // will return true). | 79 // will return true). |
67 size_t num_queued() { return num_queued_; } | 80 size_t num_queued() { return num_queued_; } |
68 size_t num_loaded() { return num_loaded_; } | 81 size_t num_loaded() { return num_loaded_; } |
69 size_t max_in_queue() { return max_in_queue_; } | 82 size_t max_awaiting_loading() { return max_awaiting_loading_; } |
70 size_t max_active_loading() { return max_active_loading_; } | 83 size_t max_active_loading() { return max_active_loading_; } |
71 | 84 |
72 private: | 85 private: |
73 // Callback when queue has finished monitoring. | 86 // Callback when queue has finished monitoring. |
74 void Finished(size_t num_queued, | 87 void Finished(size_t num_queued, |
75 size_t num_loaded, | 88 size_t num_loaded, |
76 size_t max_in_queue, | 89 size_t max_awaiting_loading, |
77 size_t max_active_loading) { | 90 size_t max_active_loading) { |
| 91 CHECK(!finished_); |
78 finished_ = true; | 92 finished_ = true; |
79 num_queued_ = num_queued; | 93 num_queued_ = num_queued; |
80 num_loaded_ = num_loaded; | 94 num_loaded_ = num_loaded; |
81 max_in_queue_ = max_in_queue; | 95 max_awaiting_loading_ = max_awaiting_loading; |
82 max_active_loading_ = max_active_loading; | 96 max_active_loading_ = max_active_loading; |
83 } | 97 } |
84 | 98 |
85 content::TestBrowserThreadBundle thread_bundle_; | 99 content::TestBrowserThreadBundle thread_bundle_; |
86 scoped_ptr<LoadMonitoringExtensionHostQueue> queue_; | 100 scoped_ptr<LoadMonitoringExtensionHostQueue> queue_; |
87 ScopedVector<StubDeferredStartRenderHost> stubs_; | 101 ScopedVector<StubDeferredStartRenderHost> stubs_; |
88 | 102 |
89 // Set after the queue has finished monitoring. | 103 // Set after the queue has finished monitoring. |
90 bool finished_; | 104 bool finished_; |
91 size_t num_queued_; | 105 size_t num_queued_; |
92 size_t num_loaded_; | 106 size_t num_loaded_; |
93 size_t max_in_queue_; | 107 size_t max_awaiting_loading_; |
94 size_t max_active_loading_; | 108 size_t max_active_loading_; |
95 }; | 109 }; |
96 | 110 |
97 // Tests that if monitoring is never started, nor any hosts added, nothing is | 111 // Tests that if monitoring is never started, nor any hosts added, nothing is |
98 // recorded. | 112 // recorded. |
99 TEST_F(LoadMonitoringExtensionHostQueueTest, NeverStarted) { | 113 TEST_F(LoadMonitoringExtensionHostQueueTest, NeverStarted) { |
100 base::RunLoop().RunUntilIdle(); | 114 base::RunLoop().RunUntilIdle(); |
101 ASSERT_FALSE(finished()); | 115 ASSERT_FALSE(finished()); |
102 } | 116 } |
103 | 117 |
104 // Tests that if monitoring has started but no hosts added, it's recorded as 0. | 118 // Tests that if monitoring has started but no hosts added, it's recorded as 0. |
105 TEST_F(LoadMonitoringExtensionHostQueueTest, NoHosts) { | 119 TEST_F(LoadMonitoringExtensionHostQueueTest, NoHosts) { |
106 queue()->StartMonitoring(); | 120 queue()->StartMonitoring(); |
107 | 121 |
108 base::RunLoop().RunUntilIdle(); | 122 base::RunLoop().RunUntilIdle(); |
109 ASSERT_TRUE(finished()); | 123 ASSERT_TRUE(finished()); |
110 EXPECT_EQ(0u, num_queued()); | 124 EXPECT_EQ(0u, num_queued()); |
111 EXPECT_EQ(0u, num_loaded()); | 125 EXPECT_EQ(0u, num_loaded()); |
112 EXPECT_EQ(0u, max_in_queue()); | 126 EXPECT_EQ(0u, max_awaiting_loading()); |
113 EXPECT_EQ(0u, max_active_loading()); | 127 EXPECT_EQ(0u, max_active_loading()); |
114 } | 128 } |
115 | 129 |
116 // Tests that adding a host starts monitoring. | 130 // Tests that adding a host starts monitoring. |
117 TEST_F(LoadMonitoringExtensionHostQueueTest, AddOneHost) { | 131 TEST_F(LoadMonitoringExtensionHostQueueTest, AddOneHost) { |
118 queue()->Add(CreateHost()); | 132 queue()->Add(CreateHost()); |
119 | 133 |
120 base::RunLoop().RunUntilIdle(); | 134 base::RunLoop().RunUntilIdle(); |
121 ASSERT_TRUE(finished()); | 135 ASSERT_TRUE(finished()); |
122 EXPECT_EQ(1u, num_queued()); | 136 EXPECT_EQ(1u, num_queued()); |
123 EXPECT_EQ(0u, num_loaded()); | 137 EXPECT_EQ(0u, num_loaded()); |
124 EXPECT_EQ(1u, max_in_queue()); | 138 EXPECT_EQ(1u, max_awaiting_loading()); |
125 EXPECT_EQ(0u, max_active_loading()); | 139 EXPECT_EQ(0u, max_active_loading()); |
126 } | 140 } |
127 | 141 |
128 // Tests that a host added and removed is still recorded, but not as a load | 142 // Tests that a host added and removed is still recorded, but not as a load |
129 // finished. | 143 // finished. |
130 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndRemoveOneHost) { | 144 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndRemoveOneHost) { |
131 DeferredStartRenderHost* host = CreateHost(); | 145 DeferredStartRenderHost* host = CreateHost(); |
132 queue()->Add(host); | 146 queue()->Add(host); |
133 queue()->Remove(host); | 147 queue()->Remove(host); |
134 | 148 |
135 base::RunLoop().RunUntilIdle(); | 149 base::RunLoop().RunUntilIdle(); |
136 ASSERT_TRUE(finished()); | 150 ASSERT_TRUE(finished()); |
137 EXPECT_EQ(1u, num_queued()); | 151 EXPECT_EQ(1u, num_queued()); |
138 EXPECT_EQ(0u, num_loaded()); | 152 EXPECT_EQ(0u, num_loaded()); |
139 EXPECT_EQ(1u, max_in_queue()); | 153 EXPECT_EQ(1u, max_awaiting_loading()); |
140 EXPECT_EQ(0u, max_active_loading()); | 154 EXPECT_EQ(0u, max_active_loading()); |
141 } | 155 } |
142 | 156 |
143 // Tests adding and starting a single host. | 157 // Tests adding and starting a single host. |
144 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartOneHost) { | 158 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartOneHost) { |
145 DeferredStartRenderHost* host = CreateHost(); | 159 DeferredStartRenderHost* host = CreateHost(); |
146 queue()->Add(host); | 160 queue()->Add(host); |
147 queue()->OnDeferredStartRenderHostDidStartLoading(host); | 161 queue()->OnDeferredStartRenderHostDidStartLoading(host); |
148 | 162 |
149 base::RunLoop().RunUntilIdle(); | 163 base::RunLoop().RunUntilIdle(); |
150 ASSERT_TRUE(finished()); | 164 ASSERT_TRUE(finished()); |
151 EXPECT_EQ(1u, num_queued()); | 165 EXPECT_EQ(1u, num_queued()); |
152 EXPECT_EQ(0u, num_loaded()); | 166 EXPECT_EQ(0u, num_loaded()); |
153 EXPECT_EQ(1u, max_in_queue()); | 167 EXPECT_EQ(1u, max_awaiting_loading()); |
154 EXPECT_EQ(1u, max_active_loading()); | 168 EXPECT_EQ(1u, max_active_loading()); |
155 | |
156 // Sanity check: stopping/destroying at this point doesn't crash. | |
157 queue()->OnDeferredStartRenderHostDidStopLoading(host); | |
158 queue()->OnDeferredStartRenderHostDestroyed(host); | |
159 } | 169 } |
160 | 170 |
161 // Tests adding and destroying a single host without starting it. | 171 // Tests adding and destroying a single host without starting it. |
162 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndDestroyOneHost) { | 172 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndDestroyOneHost) { |
163 DeferredStartRenderHost* host = CreateHost(); | 173 DeferredStartRenderHost* host = CreateHost(); |
164 queue()->Add(host); | 174 queue()->Add(host); |
165 queue()->OnDeferredStartRenderHostDestroyed(host); | 175 queue()->OnDeferredStartRenderHostDestroyed(host); |
166 | 176 |
167 base::RunLoop().RunUntilIdle(); | 177 base::RunLoop().RunUntilIdle(); |
168 ASSERT_TRUE(finished()); | 178 ASSERT_TRUE(finished()); |
169 EXPECT_EQ(1u, num_queued()); | 179 EXPECT_EQ(1u, num_queued()); |
170 EXPECT_EQ(0u, num_loaded()); | 180 EXPECT_EQ(0u, num_loaded()); |
171 EXPECT_EQ(1u, max_in_queue()); | 181 EXPECT_EQ(1u, max_awaiting_loading()); |
172 EXPECT_EQ(0u, max_active_loading()); | 182 EXPECT_EQ(0u, max_active_loading()); |
173 | |
174 // Sanity check: stopping/destroying at this point doesn't crash. | |
175 queue()->OnDeferredStartRenderHostDidStopLoading(host); | |
176 queue()->OnDeferredStartRenderHostDestroyed(host); | |
177 } | 183 } |
178 | 184 |
179 // Tests adding, starting, and stopping a single host. | 185 // Tests adding, starting, and stopping a single host. |
180 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndStopOneHost) { | 186 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndStopOneHost) { |
181 DeferredStartRenderHost* host = CreateHost(); | 187 DeferredStartRenderHost* host = CreateHost(); |
182 queue()->Add(host); | 188 queue()->Add(host); |
183 queue()->OnDeferredStartRenderHostDidStartLoading(host); | 189 queue()->OnDeferredStartRenderHostDidStartLoading(host); |
184 queue()->OnDeferredStartRenderHostDidStopLoading(host); | 190 queue()->OnDeferredStartRenderHostDidStopLoading(host); |
185 | 191 |
186 base::RunLoop().RunUntilIdle(); | 192 base::RunLoop().RunUntilIdle(); |
187 ASSERT_TRUE(finished()); | 193 ASSERT_TRUE(finished()); |
188 EXPECT_EQ(1u, num_queued()); | 194 EXPECT_EQ(1u, num_queued()); |
189 EXPECT_EQ(1u, num_loaded()); | 195 EXPECT_EQ(1u, num_loaded()); |
190 EXPECT_EQ(1u, max_in_queue()); | 196 EXPECT_EQ(1u, max_awaiting_loading()); |
191 EXPECT_EQ(1u, max_active_loading()); | 197 EXPECT_EQ(1u, max_active_loading()); |
| 198 } |
192 | 199 |
193 // Sanity check: destroying at this point doesn't crash. | 200 // Tests adding, starting, and stopping a single host - twice. |
194 queue()->OnDeferredStartRenderHostDestroyed(host); | 201 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndStopOneHostTwice) { |
| 202 DeferredStartRenderHost* host = CreateHost(); |
| 203 queue()->Add(host); |
| 204 queue()->OnDeferredStartRenderHostDidStartLoading(host); |
| 205 queue()->OnDeferredStartRenderHostDidStopLoading(host); |
| 206 |
| 207 // Re-starting loading should also be recorded fine (e.g. navigations could |
| 208 // trigger this). |
| 209 queue()->OnDeferredStartRenderHostDidStartLoading(host); |
| 210 queue()->OnDeferredStartRenderHostDidStopLoading(host); |
| 211 |
| 212 base::RunLoop().RunUntilIdle(); |
| 213 ASSERT_TRUE(finished()); |
| 214 EXPECT_EQ(1u, num_queued()); |
| 215 EXPECT_EQ(2u, num_loaded()); // 2 loaded this time, because we ran twice |
| 216 EXPECT_EQ(1u, max_awaiting_loading()); |
| 217 EXPECT_EQ(1u, max_active_loading()); |
195 } | 218 } |
196 | 219 |
197 // Tests adding, starting, and destroying (i.e. an implicit stop) a single host. | 220 // Tests adding, starting, and destroying (i.e. an implicit stop) a single host. |
198 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndDestroyOneHost) { | 221 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndDestroyOneHost) { |
199 DeferredStartRenderHost* host = CreateHost(); | 222 DeferredStartRenderHost* host = CreateHost(); |
200 queue()->Add(host); | 223 queue()->Add(host); |
201 queue()->OnDeferredStartRenderHostDidStartLoading(host); | 224 queue()->OnDeferredStartRenderHostDidStartLoading(host); |
202 queue()->OnDeferredStartRenderHostDestroyed(host); | 225 queue()->OnDeferredStartRenderHostDestroyed(host); |
203 | 226 |
204 base::RunLoop().RunUntilIdle(); | 227 base::RunLoop().RunUntilIdle(); |
205 ASSERT_TRUE(finished()); | 228 ASSERT_TRUE(finished()); |
206 EXPECT_EQ(1u, num_queued()); | 229 EXPECT_EQ(1u, num_queued()); |
207 EXPECT_EQ(1u, num_loaded()); | 230 EXPECT_EQ(1u, num_loaded()); |
208 EXPECT_EQ(1u, max_in_queue()); | 231 EXPECT_EQ(1u, max_awaiting_loading()); |
209 EXPECT_EQ(1u, max_active_loading()); | 232 EXPECT_EQ(1u, max_active_loading()); |
210 } | 233 } |
211 | 234 |
212 // Tests adding, starting, and removing a single host. | 235 // Tests adding, starting, and removing a single host. |
213 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndRemoveOneHost) { | 236 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndRemoveOneHost) { |
214 DeferredStartRenderHost* host = CreateHost(); | 237 DeferredStartRenderHost* host = CreateHost(); |
215 queue()->Add(host); | 238 queue()->Add(host); |
216 queue()->OnDeferredStartRenderHostDidStartLoading(host); | 239 queue()->OnDeferredStartRenderHostDidStartLoading(host); |
217 queue()->Remove(host); | 240 queue()->Remove(host); |
218 | 241 |
219 base::RunLoop().RunUntilIdle(); | 242 base::RunLoop().RunUntilIdle(); |
220 ASSERT_TRUE(finished()); | 243 ASSERT_TRUE(finished()); |
221 EXPECT_EQ(1u, num_queued()); | 244 EXPECT_EQ(1u, num_queued()); |
222 EXPECT_EQ(0u, num_loaded()); | 245 EXPECT_EQ(0u, num_loaded()); |
223 EXPECT_EQ(1u, max_in_queue()); | 246 EXPECT_EQ(1u, max_awaiting_loading()); |
224 EXPECT_EQ(1u, max_active_loading()); | 247 EXPECT_EQ(1u, max_active_loading()); |
225 } | 248 } |
226 | 249 |
227 // Tests monitoring a sequence of hosts. | 250 // Tests monitoring a sequence of hosts. |
228 TEST_F(LoadMonitoringExtensionHostQueueTest, Sequence) { | 251 TEST_F(LoadMonitoringExtensionHostQueueTest, Sequence) { |
229 // Scenario: | 252 // Scenario: |
230 // | 253 // |
231 // 6 hosts will be added, only 5 will start loading, with a maximum of 4 in | 254 // 6 hosts will be added, only 5 will start loading, with a maximum of 4 in |
232 // the queue and 3 loading at any time. Only 2 will finish. | 255 // the queue and 3 loading at any time. Only 2 will finish. |
233 DeferredStartRenderHost* host1 = CreateHost(); | 256 DeferredStartRenderHost* host1 = CreateHost(); |
(...skipping 17 matching lines...) Expand all Loading... |
251 | 274 |
252 queue()->OnDeferredStartRenderHostDidStartLoading(host3); | 275 queue()->OnDeferredStartRenderHostDidStartLoading(host3); |
253 queue()->OnDeferredStartRenderHostDidStartLoading(host4); | 276 queue()->OnDeferredStartRenderHostDidStartLoading(host4); |
254 queue()->OnDeferredStartRenderHostDidStopLoading(host4); | 277 queue()->OnDeferredStartRenderHostDidStopLoading(host4); |
255 queue()->OnDeferredStartRenderHostDidStartLoading(host5); | 278 queue()->OnDeferredStartRenderHostDidStartLoading(host5); |
256 | 279 |
257 base::RunLoop().RunUntilIdle(); | 280 base::RunLoop().RunUntilIdle(); |
258 ASSERT_TRUE(finished()); | 281 ASSERT_TRUE(finished()); |
259 EXPECT_EQ(6u, num_queued()); | 282 EXPECT_EQ(6u, num_queued()); |
260 EXPECT_EQ(2u, num_loaded()); | 283 EXPECT_EQ(2u, num_loaded()); |
261 EXPECT_EQ(4u, max_in_queue()); | 284 EXPECT_EQ(4u, max_awaiting_loading()); |
262 EXPECT_EQ(3u, max_active_loading()); | 285 EXPECT_EQ(3u, max_active_loading()); |
263 | 286 |
264 // Sanity check: complete a realistic sequence by stopping and/or destroying | 287 // Complete a realistic sequence by stopping and/or destroying all hosts. |
265 // all of the hosts. It shouldn't crash. | |
266 queue()->OnDeferredStartRenderHostDestroyed(host1); | 288 queue()->OnDeferredStartRenderHostDestroyed(host1); |
267 queue()->OnDeferredStartRenderHostDidStopLoading(host2); | 289 queue()->OnDeferredStartRenderHostDidStopLoading(host2); |
268 queue()->OnDeferredStartRenderHostDestroyed(host2); | 290 queue()->OnDeferredStartRenderHostDestroyed(host2); |
269 queue()->OnDeferredStartRenderHostDidStopLoading(host3); | 291 queue()->OnDeferredStartRenderHostDidStopLoading(host3); |
270 queue()->OnDeferredStartRenderHostDestroyed(host3); | 292 queue()->OnDeferredStartRenderHostDestroyed(host3); |
271 queue()->OnDeferredStartRenderHostDestroyed(host4); | 293 queue()->OnDeferredStartRenderHostDestroyed(host4); |
272 queue()->OnDeferredStartRenderHostDestroyed(host5); // never stopped | 294 queue()->OnDeferredStartRenderHostDestroyed(host5); // never stopped |
273 queue()->OnDeferredStartRenderHostDestroyed(host6); // never started/stopped | 295 queue()->OnDeferredStartRenderHostDestroyed(host6); // never started/stopped |
274 } | 296 } |
275 | 297 |
| 298 // Tests that the queue is observing Hosts from adding them through to being |
| 299 // removed - that the load sequence itself is irrelevant. |
| 300 // |
| 301 // This is an unfortunate implementation-style test, but it used to be a bug |
| 302 // and difficult to catch outside of a proper test framework - one in which we |
| 303 // don't have to trigger events by hand. |
| 304 TEST_F(LoadMonitoringExtensionHostQueueTest, ObserverLifetime) { |
| 305 StubDeferredStartRenderHost* host1 = CreateHost(); |
| 306 StubDeferredStartRenderHost* host2 = CreateHost(); |
| 307 StubDeferredStartRenderHost* host3 = CreateHost(); |
| 308 StubDeferredStartRenderHost* host4 = CreateHost(); |
| 309 |
| 310 EXPECT_FALSE(host1->IsObservedBy(queue())); |
| 311 EXPECT_FALSE(host2->IsObservedBy(queue())); |
| 312 EXPECT_FALSE(host3->IsObservedBy(queue())); |
| 313 EXPECT_FALSE(host4->IsObservedBy(queue())); |
| 314 |
| 315 queue()->Add(host1); |
| 316 queue()->Add(host2); |
| 317 queue()->Add(host3); |
| 318 queue()->Add(host4); |
| 319 |
| 320 EXPECT_TRUE(host1->IsObservedBy(queue())); |
| 321 EXPECT_TRUE(host2->IsObservedBy(queue())); |
| 322 EXPECT_TRUE(host3->IsObservedBy(queue())); |
| 323 EXPECT_TRUE(host4->IsObservedBy(queue())); |
| 324 |
| 325 queue()->OnDeferredStartRenderHostDidStartLoading(host1); |
| 326 queue()->OnDeferredStartRenderHostDidStartLoading(host2); |
| 327 queue()->OnDeferredStartRenderHostDidStartLoading(host3); |
| 328 // host4 will test that we Remove before Starting - so don't start. |
| 329 |
| 330 EXPECT_TRUE(host1->IsObservedBy(queue())); |
| 331 EXPECT_TRUE(host2->IsObservedBy(queue())); |
| 332 EXPECT_TRUE(host3->IsObservedBy(queue())); |
| 333 EXPECT_TRUE(host4->IsObservedBy(queue())); |
| 334 |
| 335 queue()->OnDeferredStartRenderHostDidStopLoading(host1); |
| 336 queue()->OnDeferredStartRenderHostDestroyed(host2); |
| 337 |
| 338 EXPECT_TRUE(host1->IsObservedBy(queue())); |
| 339 EXPECT_TRUE(host2->IsObservedBy(queue())); |
| 340 |
| 341 queue()->Remove(host1); |
| 342 queue()->Remove(host2); |
| 343 queue()->Remove(host3); |
| 344 queue()->Remove(host4); |
| 345 |
| 346 EXPECT_FALSE(host1->IsObservedBy(queue())); |
| 347 EXPECT_FALSE(host2->IsObservedBy(queue())); |
| 348 EXPECT_FALSE(host3->IsObservedBy(queue())); |
| 349 EXPECT_FALSE(host4->IsObservedBy(queue())); |
| 350 } |
| 351 |
276 } // namespace extensions | 352 } // namespace extensions |
OLD | NEW |