| 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_waiting_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() { 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_waiting_loading() { return max_waiting_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_waiting_loading, |
| 77 size_t max_active_loading) { | 90 size_t max_active_loading) { |
| 78 finished_ = true; | 91 finished_ = true; |
| 79 num_queued_ = num_queued; | 92 num_queued_ = num_queued; |
| 80 num_loaded_ = num_loaded; | 93 num_loaded_ = num_loaded; |
| 81 max_in_queue_ = max_in_queue; | 94 max_waiting_loading_ = max_waiting_loading; |
| 82 max_active_loading_ = max_active_loading; | 95 max_active_loading_ = max_active_loading; |
| 83 } | 96 } |
| 84 | 97 |
| 85 content::TestBrowserThreadBundle thread_bundle_; | 98 content::TestBrowserThreadBundle thread_bundle_; |
| 86 scoped_ptr<LoadMonitoringExtensionHostQueue> queue_; | 99 scoped_ptr<LoadMonitoringExtensionHostQueue> queue_; |
| 87 ScopedVector<StubDeferredStartRenderHost> stubs_; | 100 ScopedVector<StubDeferredStartRenderHost> stubs_; |
| 88 | 101 |
| 89 // Set after the queue has finished monitoring. | 102 // Set after the queue has finished monitoring. |
| 90 bool finished_; | 103 bool finished_; |
| 91 size_t num_queued_; | 104 size_t num_queued_; |
| 92 size_t num_loaded_; | 105 size_t num_loaded_; |
| 93 size_t max_in_queue_; | 106 size_t max_waiting_loading_; |
| 94 size_t max_active_loading_; | 107 size_t max_active_loading_; |
| 95 }; | 108 }; |
| 96 | 109 |
| 97 // Tests that if monitoring is never started, nor any hosts added, nothing is | 110 // Tests that if monitoring is never started, nor any hosts added, nothing is |
| 98 // recorded. | 111 // recorded. |
| 99 TEST_F(LoadMonitoringExtensionHostQueueTest, NeverStarted) { | 112 TEST_F(LoadMonitoringExtensionHostQueueTest, NeverStarted) { |
| 100 base::RunLoop().RunUntilIdle(); | 113 base::RunLoop().RunUntilIdle(); |
| 101 ASSERT_FALSE(finished()); | 114 ASSERT_FALSE(finished()); |
| 102 } | 115 } |
| 103 | 116 |
| 104 // Tests that if monitoring has started but no hosts added, it's recorded as 0. | 117 // Tests that if monitoring has started but no hosts added, it's recorded as 0. |
| 105 TEST_F(LoadMonitoringExtensionHostQueueTest, NoHosts) { | 118 TEST_F(LoadMonitoringExtensionHostQueueTest, NoHosts) { |
| 106 queue()->StartMonitoring(); | 119 queue()->StartMonitoring(); |
| 107 | 120 |
| 108 base::RunLoop().RunUntilIdle(); | 121 base::RunLoop().RunUntilIdle(); |
| 109 ASSERT_TRUE(finished()); | 122 ASSERT_TRUE(finished()); |
| 110 EXPECT_EQ(0u, num_queued()); | 123 EXPECT_EQ(0u, num_queued()); |
| 111 EXPECT_EQ(0u, num_loaded()); | 124 EXPECT_EQ(0u, num_loaded()); |
| 112 EXPECT_EQ(0u, max_in_queue()); | 125 EXPECT_EQ(0u, max_waiting_loading()); |
| 113 EXPECT_EQ(0u, max_active_loading()); | 126 EXPECT_EQ(0u, max_active_loading()); |
| 114 } | 127 } |
| 115 | 128 |
| 116 // Tests that adding a host starts monitoring. | 129 // Tests that adding a host starts monitoring. |
| 117 TEST_F(LoadMonitoringExtensionHostQueueTest, AddOneHost) { | 130 TEST_F(LoadMonitoringExtensionHostQueueTest, AddOneHost) { |
| 118 queue()->Add(CreateHost()); | 131 queue()->Add(CreateHost()); |
| 119 | 132 |
| 120 base::RunLoop().RunUntilIdle(); | 133 base::RunLoop().RunUntilIdle(); |
| 121 ASSERT_TRUE(finished()); | 134 ASSERT_TRUE(finished()); |
| 122 EXPECT_EQ(1u, num_queued()); | 135 EXPECT_EQ(1u, num_queued()); |
| 123 EXPECT_EQ(0u, num_loaded()); | 136 EXPECT_EQ(0u, num_loaded()); |
| 124 EXPECT_EQ(1u, max_in_queue()); | 137 EXPECT_EQ(1u, max_waiting_loading()); |
| 125 EXPECT_EQ(0u, max_active_loading()); | 138 EXPECT_EQ(0u, max_active_loading()); |
| 126 } | 139 } |
| 127 | 140 |
| 128 // Tests that a host added and removed is still recorded, but not as a load | 141 // Tests that a host added and removed is still recorded, but not as a load |
| 129 // finished. | 142 // finished. |
| 130 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndRemoveOneHost) { | 143 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndRemoveOneHost) { |
| 131 DeferredStartRenderHost* host = CreateHost(); | 144 DeferredStartRenderHost* host = CreateHost(); |
| 132 queue()->Add(host); | 145 queue()->Add(host); |
| 133 queue()->Remove(host); | 146 queue()->Remove(host); |
| 134 | 147 |
| 135 base::RunLoop().RunUntilIdle(); | 148 base::RunLoop().RunUntilIdle(); |
| 136 ASSERT_TRUE(finished()); | 149 ASSERT_TRUE(finished()); |
| 137 EXPECT_EQ(1u, num_queued()); | 150 EXPECT_EQ(1u, num_queued()); |
| 138 EXPECT_EQ(0u, num_loaded()); | 151 EXPECT_EQ(0u, num_loaded()); |
| 139 EXPECT_EQ(1u, max_in_queue()); | 152 EXPECT_EQ(1u, max_waiting_loading()); |
| 140 EXPECT_EQ(0u, max_active_loading()); | 153 EXPECT_EQ(0u, max_active_loading()); |
| 141 } | 154 } |
| 142 | 155 |
| 143 // Tests adding and starting a single host. | 156 // Tests adding and starting a single host. |
| 144 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartOneHost) { | 157 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartOneHost) { |
| 145 DeferredStartRenderHost* host = CreateHost(); | 158 DeferredStartRenderHost* host = CreateHost(); |
| 146 queue()->Add(host); | 159 queue()->Add(host); |
| 147 queue()->OnDeferredStartRenderHostDidStartLoading(host); | 160 queue()->OnDeferredStartRenderHostDidStartLoading(host); |
| 148 | 161 |
| 149 base::RunLoop().RunUntilIdle(); | 162 base::RunLoop().RunUntilIdle(); |
| 150 ASSERT_TRUE(finished()); | 163 ASSERT_TRUE(finished()); |
| 151 EXPECT_EQ(1u, num_queued()); | 164 EXPECT_EQ(1u, num_queued()); |
| 152 EXPECT_EQ(0u, num_loaded()); | 165 EXPECT_EQ(0u, num_loaded()); |
| 153 EXPECT_EQ(1u, max_in_queue()); | 166 EXPECT_EQ(1u, max_waiting_loading()); |
| 154 EXPECT_EQ(1u, max_active_loading()); | 167 EXPECT_EQ(1u, max_active_loading()); |
| 155 | 168 |
| 156 // Sanity check: stopping/destroying at this point doesn't crash. | 169 // Sanity check: stopping/destroying at this point doesn't crash. |
| 157 queue()->OnDeferredStartRenderHostDidStopLoading(host); | 170 queue()->OnDeferredStartRenderHostDidStopLoading(host); |
| 158 queue()->OnDeferredStartRenderHostDestroyed(host); | 171 queue()->OnDeferredStartRenderHostDestroyed(host); |
| 159 } | 172 } |
| 160 | 173 |
| 161 // Tests adding and destroying a single host without starting it. | 174 // Tests adding and destroying a single host without starting it. |
| 162 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndDestroyOneHost) { | 175 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndDestroyOneHost) { |
| 163 DeferredStartRenderHost* host = CreateHost(); | 176 DeferredStartRenderHost* host = CreateHost(); |
| 164 queue()->Add(host); | 177 queue()->Add(host); |
| 165 queue()->OnDeferredStartRenderHostDestroyed(host); | 178 queue()->OnDeferredStartRenderHostDestroyed(host); |
| 166 | 179 |
| 167 base::RunLoop().RunUntilIdle(); | 180 base::RunLoop().RunUntilIdle(); |
| 168 ASSERT_TRUE(finished()); | 181 ASSERT_TRUE(finished()); |
| 169 EXPECT_EQ(1u, num_queued()); | 182 EXPECT_EQ(1u, num_queued()); |
| 170 EXPECT_EQ(0u, num_loaded()); | 183 EXPECT_EQ(0u, num_loaded()); |
| 171 EXPECT_EQ(1u, max_in_queue()); | 184 EXPECT_EQ(1u, max_waiting_loading()); |
| 172 EXPECT_EQ(0u, max_active_loading()); | 185 EXPECT_EQ(0u, max_active_loading()); |
| 173 | 186 |
| 174 // Sanity check: stopping/destroying at this point doesn't crash. | 187 // Sanity check: stopping/destroying at this point doesn't crash. |
| 175 queue()->OnDeferredStartRenderHostDidStopLoading(host); | 188 queue()->OnDeferredStartRenderHostDidStopLoading(host); |
| 176 queue()->OnDeferredStartRenderHostDestroyed(host); | 189 queue()->OnDeferredStartRenderHostDestroyed(host); |
| 177 } | 190 } |
| 178 | 191 |
| 179 // Tests adding, starting, and stopping a single host. | 192 // Tests adding, starting, and stopping a single host. |
| 180 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndStopOneHost) { | 193 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndStopOneHost) { |
| 181 DeferredStartRenderHost* host = CreateHost(); | 194 DeferredStartRenderHost* host = CreateHost(); |
| 182 queue()->Add(host); | 195 queue()->Add(host); |
| 183 queue()->OnDeferredStartRenderHostDidStartLoading(host); | 196 queue()->OnDeferredStartRenderHostDidStartLoading(host); |
| 184 queue()->OnDeferredStartRenderHostDidStopLoading(host); | 197 queue()->OnDeferredStartRenderHostDidStopLoading(host); |
| 185 | 198 |
| 186 base::RunLoop().RunUntilIdle(); | 199 base::RunLoop().RunUntilIdle(); |
| 187 ASSERT_TRUE(finished()); | 200 ASSERT_TRUE(finished()); |
| 188 EXPECT_EQ(1u, num_queued()); | 201 EXPECT_EQ(1u, num_queued()); |
| 189 EXPECT_EQ(1u, num_loaded()); | 202 EXPECT_EQ(1u, num_loaded()); |
| 190 EXPECT_EQ(1u, max_in_queue()); | 203 EXPECT_EQ(1u, max_waiting_loading()); |
| 191 EXPECT_EQ(1u, max_active_loading()); | 204 EXPECT_EQ(1u, max_active_loading()); |
| 192 | 205 |
| 193 // Sanity check: destroying at this point doesn't crash. | 206 // Sanity check: destroying at this point doesn't crash. |
| 194 queue()->OnDeferredStartRenderHostDestroyed(host); | 207 queue()->OnDeferredStartRenderHostDestroyed(host); |
| 195 } | 208 } |
| 196 | 209 |
| 197 // Tests adding, starting, and destroying (i.e. an implicit stop) a single host. | 210 // Tests adding, starting, and destroying (i.e. an implicit stop) a single host. |
| 198 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndDestroyOneHost) { | 211 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndDestroyOneHost) { |
| 199 DeferredStartRenderHost* host = CreateHost(); | 212 DeferredStartRenderHost* host = CreateHost(); |
| 200 queue()->Add(host); | 213 queue()->Add(host); |
| 201 queue()->OnDeferredStartRenderHostDidStartLoading(host); | 214 queue()->OnDeferredStartRenderHostDidStartLoading(host); |
| 202 queue()->OnDeferredStartRenderHostDestroyed(host); | 215 queue()->OnDeferredStartRenderHostDestroyed(host); |
| 203 | 216 |
| 204 base::RunLoop().RunUntilIdle(); | 217 base::RunLoop().RunUntilIdle(); |
| 205 ASSERT_TRUE(finished()); | 218 ASSERT_TRUE(finished()); |
| 206 EXPECT_EQ(1u, num_queued()); | 219 EXPECT_EQ(1u, num_queued()); |
| 207 EXPECT_EQ(1u, num_loaded()); | 220 EXPECT_EQ(1u, num_loaded()); |
| 208 EXPECT_EQ(1u, max_in_queue()); | 221 EXPECT_EQ(1u, max_waiting_loading()); |
| 209 EXPECT_EQ(1u, max_active_loading()); | 222 EXPECT_EQ(1u, max_active_loading()); |
| 210 } | 223 } |
| 211 | 224 |
| 212 // Tests adding, starting, and removing a single host. | 225 // Tests adding, starting, and removing a single host. |
| 213 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndRemoveOneHost) { | 226 TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndRemoveOneHost) { |
| 214 DeferredStartRenderHost* host = CreateHost(); | 227 DeferredStartRenderHost* host = CreateHost(); |
| 215 queue()->Add(host); | 228 queue()->Add(host); |
| 216 queue()->OnDeferredStartRenderHostDidStartLoading(host); | 229 queue()->OnDeferredStartRenderHostDidStartLoading(host); |
| 217 queue()->Remove(host); | 230 queue()->Remove(host); |
| 218 | 231 |
| 219 base::RunLoop().RunUntilIdle(); | 232 base::RunLoop().RunUntilIdle(); |
| 220 ASSERT_TRUE(finished()); | 233 ASSERT_TRUE(finished()); |
| 221 EXPECT_EQ(1u, num_queued()); | 234 EXPECT_EQ(1u, num_queued()); |
| 222 EXPECT_EQ(0u, num_loaded()); | 235 EXPECT_EQ(0u, num_loaded()); |
| 223 EXPECT_EQ(1u, max_in_queue()); | 236 EXPECT_EQ(1u, max_waiting_loading()); |
| 224 EXPECT_EQ(1u, max_active_loading()); | 237 EXPECT_EQ(1u, max_active_loading()); |
| 225 } | 238 } |
| 226 | 239 |
| 227 // Tests monitoring a sequence of hosts. | 240 // Tests monitoring a sequence of hosts. |
| 228 TEST_F(LoadMonitoringExtensionHostQueueTest, Sequence) { | 241 TEST_F(LoadMonitoringExtensionHostQueueTest, Sequence) { |
| 229 // Scenario: | 242 // Scenario: |
| 230 // | 243 // |
| 231 // 6 hosts will be added, only 5 will start loading, with a maximum of 4 in | 244 // 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. | 245 // the queue and 3 loading at any time. Only 2 will finish. |
| 233 DeferredStartRenderHost* host1 = CreateHost(); | 246 DeferredStartRenderHost* host1 = CreateHost(); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 251 | 264 |
| 252 queue()->OnDeferredStartRenderHostDidStartLoading(host3); | 265 queue()->OnDeferredStartRenderHostDidStartLoading(host3); |
| 253 queue()->OnDeferredStartRenderHostDidStartLoading(host4); | 266 queue()->OnDeferredStartRenderHostDidStartLoading(host4); |
| 254 queue()->OnDeferredStartRenderHostDidStopLoading(host4); | 267 queue()->OnDeferredStartRenderHostDidStopLoading(host4); |
| 255 queue()->OnDeferredStartRenderHostDidStartLoading(host5); | 268 queue()->OnDeferredStartRenderHostDidStartLoading(host5); |
| 256 | 269 |
| 257 base::RunLoop().RunUntilIdle(); | 270 base::RunLoop().RunUntilIdle(); |
| 258 ASSERT_TRUE(finished()); | 271 ASSERT_TRUE(finished()); |
| 259 EXPECT_EQ(6u, num_queued()); | 272 EXPECT_EQ(6u, num_queued()); |
| 260 EXPECT_EQ(2u, num_loaded()); | 273 EXPECT_EQ(2u, num_loaded()); |
| 261 EXPECT_EQ(4u, max_in_queue()); | 274 EXPECT_EQ(4u, max_waiting_loading()); |
| 262 EXPECT_EQ(3u, max_active_loading()); | 275 EXPECT_EQ(3u, max_active_loading()); |
| 263 | 276 |
| 264 // Sanity check: complete a realistic sequence by stopping and/or destroying | 277 // Sanity check: complete a realistic sequence by stopping and/or destroying |
| 265 // all of the hosts. It shouldn't crash. | 278 // all of the hosts. It shouldn't crash. |
| 266 queue()->OnDeferredStartRenderHostDestroyed(host1); | 279 queue()->OnDeferredStartRenderHostDestroyed(host1); |
| 267 queue()->OnDeferredStartRenderHostDidStopLoading(host2); | 280 queue()->OnDeferredStartRenderHostDidStopLoading(host2); |
| 268 queue()->OnDeferredStartRenderHostDestroyed(host2); | 281 queue()->OnDeferredStartRenderHostDestroyed(host2); |
| 269 queue()->OnDeferredStartRenderHostDidStopLoading(host3); | 282 queue()->OnDeferredStartRenderHostDidStopLoading(host3); |
| 270 queue()->OnDeferredStartRenderHostDestroyed(host3); | 283 queue()->OnDeferredStartRenderHostDestroyed(host3); |
| 271 queue()->OnDeferredStartRenderHostDestroyed(host4); | 284 queue()->OnDeferredStartRenderHostDestroyed(host4); |
| 272 queue()->OnDeferredStartRenderHostDestroyed(host5); // never stopped | 285 queue()->OnDeferredStartRenderHostDestroyed(host5); // never stopped |
| 273 queue()->OnDeferredStartRenderHostDestroyed(host6); // never started/stopped | 286 queue()->OnDeferredStartRenderHostDestroyed(host6); // never started/stopped |
| 274 } | 287 } |
| 275 | 288 |
| 289 // Tests that the queue is observing Hosts from adding them through to being |
| 290 // removed - that the load sequence itself is irrelevant. |
| 291 // |
| 292 // This is an unfortunate implementation-style test, but it used to be a bug |
| 293 // and difficult to catch outside of a proper test framework - one in which we |
| 294 // don't have to trigger events by hand. |
| 295 TEST_F(LoadMonitoringExtensionHostQueueTest, ObserverLifetime) { |
| 296 StubDeferredStartRenderHost* host1 = CreateHost(); |
| 297 StubDeferredStartRenderHost* host2 = CreateHost(); |
| 298 StubDeferredStartRenderHost* host3 = CreateHost(); |
| 299 StubDeferredStartRenderHost* host4 = CreateHost(); |
| 300 |
| 301 EXPECT_FALSE(host1->IsObservedBy(queue())); |
| 302 EXPECT_FALSE(host2->IsObservedBy(queue())); |
| 303 EXPECT_FALSE(host3->IsObservedBy(queue())); |
| 304 EXPECT_FALSE(host4->IsObservedBy(queue())); |
| 305 |
| 306 queue()->Add(host1); |
| 307 queue()->Add(host2); |
| 308 queue()->Add(host3); |
| 309 queue()->Add(host4); |
| 310 |
| 311 EXPECT_TRUE(host1->IsObservedBy(queue())); |
| 312 EXPECT_TRUE(host2->IsObservedBy(queue())); |
| 313 EXPECT_TRUE(host3->IsObservedBy(queue())); |
| 314 EXPECT_TRUE(host4->IsObservedBy(queue())); |
| 315 |
| 316 queue()->OnDeferredStartRenderHostDidStartLoading(host1); |
| 317 queue()->OnDeferredStartRenderHostDidStartLoading(host2); |
| 318 queue()->OnDeferredStartRenderHostDidStartLoading(host3); |
| 319 // host4 will test that we Remove before Starting - so don't start. |
| 320 |
| 321 EXPECT_TRUE(host1->IsObservedBy(queue())); |
| 322 EXPECT_TRUE(host2->IsObservedBy(queue())); |
| 323 EXPECT_TRUE(host3->IsObservedBy(queue())); |
| 324 EXPECT_TRUE(host4->IsObservedBy(queue())); |
| 325 |
| 326 queue()->OnDeferredStartRenderHostDidStopLoading(host1); |
| 327 queue()->OnDeferredStartRenderHostDestroyed(host2); |
| 328 |
| 329 EXPECT_TRUE(host1->IsObservedBy(queue())); |
| 330 EXPECT_TRUE(host2->IsObservedBy(queue())); |
| 331 |
| 332 queue()->Remove(host1); |
| 333 queue()->Remove(host2); |
| 334 queue()->Remove(host3); |
| 335 queue()->Remove(host4); |
| 336 |
| 337 EXPECT_FALSE(host1->IsObservedBy(queue())); |
| 338 EXPECT_FALSE(host2->IsObservedBy(queue())); |
| 339 EXPECT_FALSE(host3->IsObservedBy(queue())); |
| 340 EXPECT_FALSE(host4->IsObservedBy(queue())); |
| 341 } |
| 342 |
| 276 } // namespace extensions | 343 } // namespace extensions |
| OLD | NEW |