| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/plugin_loader_posix.h" | 5 #include "content/browser/plugin_loader_posix.h" |
| 6 | 6 |
| 7 #include "base/at_exit.h" | 7 #include "base/at_exit.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| 11 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 13 #include "content/browser/browser_thread_impl.h" | 13 #include "content/browser/browser_thread_impl.h" |
| 14 #include "content/common/plugin_list.h" |
| 14 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 16 | 17 |
| 17 using base::ASCIIToUTF16; | 18 using base::ASCIIToUTF16; |
| 18 | 19 |
| 19 namespace content { | 20 namespace content { |
| 20 | 21 |
| 21 class MockPluginLoaderPosix : public PluginLoaderPosix { | 22 class MockPluginLoaderPosix : public PluginLoaderPosix { |
| 22 public: | 23 public: |
| 23 MOCK_METHOD0(LoadPluginsInternal, void(void)); | 24 MOCK_METHOD0(LoadPluginsInternal, void(void)); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 plugin_loader_->canonical_list()->push_back(plugin2_.path); | 90 plugin_loader_->canonical_list()->push_back(plugin2_.path); |
| 90 plugin_loader_->canonical_list()->push_back(plugin3_.path); | 91 plugin_loader_->canonical_list()->push_back(plugin3_.path); |
| 91 } | 92 } |
| 92 | 93 |
| 93 // Data used for testing. | 94 // Data used for testing. |
| 94 WebPluginInfo plugin1_; | 95 WebPluginInfo plugin1_; |
| 95 WebPluginInfo plugin2_; | 96 WebPluginInfo plugin2_; |
| 96 WebPluginInfo plugin3_; | 97 WebPluginInfo plugin3_; |
| 97 | 98 |
| 98 private: | 99 private: |
| 99 base::ShadowingAtExitManager at_exit_manager_; // Destroys PluginService. | 100 // Destroys PluginService and PluginList. |
| 101 base::ShadowingAtExitManager at_exit_manager_; |
| 100 | 102 |
| 101 base::MessageLoopForIO message_loop_; | 103 base::MessageLoopForIO message_loop_; |
| 102 BrowserThreadImpl file_thread_; | 104 BrowserThreadImpl file_thread_; |
| 103 BrowserThreadImpl io_thread_; | 105 BrowserThreadImpl io_thread_; |
| 104 | 106 |
| 105 scoped_refptr<MockPluginLoaderPosix> plugin_loader_; | 107 scoped_refptr<MockPluginLoaderPosix> plugin_loader_; |
| 106 }; | 108 }; |
| 107 | 109 |
| 108 TEST_F(PluginLoaderPosixTest, QueueRequests) { | 110 TEST_F(PluginLoaderPosixTest, QueueRequests) { |
| 109 int did_callback = 0; | 111 int did_callback = 0; |
| 110 PluginService::GetPluginsCallback callback = | 112 PluginService::GetPluginsCallback callback = |
| 111 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); | 113 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); |
| 112 | 114 |
| 113 EXPECT_EQ(0u, plugin_loader()->number_of_pending_callbacks()); | 115 plugin_loader()->GetPlugins(callback); |
| 114 plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback); | 116 plugin_loader()->GetPlugins(callback); |
| 115 EXPECT_EQ(1u, plugin_loader()->number_of_pending_callbacks()); | |
| 116 | 117 |
| 117 plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback); | 118 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); |
| 118 EXPECT_EQ(2u, plugin_loader()->number_of_pending_callbacks()); | |
| 119 | |
| 120 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(2); | |
| 121 message_loop()->RunUntilIdle(); | 119 message_loop()->RunUntilIdle(); |
| 122 | 120 |
| 123 EXPECT_EQ(0, did_callback); | 121 EXPECT_EQ(0, did_callback); |
| 124 | 122 |
| 125 plugin_loader()->canonical_list()->clear(); | 123 plugin_loader()->canonical_list()->clear(); |
| 126 plugin_loader()->canonical_list()->push_back(plugin1_.path); | 124 plugin_loader()->canonical_list()->push_back(plugin1_.path); |
| 127 plugin_loader()->TestOnPluginLoaded(0, plugin1_); | 125 plugin_loader()->TestOnPluginLoaded(0, plugin1_); |
| 128 message_loop()->RunUntilIdle(); | 126 message_loop()->RunUntilIdle(); |
| 129 | 127 |
| 130 EXPECT_EQ(1, did_callback); | 128 EXPECT_EQ(2, did_callback); |
| 131 EXPECT_EQ(1u, plugin_loader()->number_of_pending_callbacks()); | 129 } |
| 130 |
| 131 TEST_F(PluginLoaderPosixTest, QueueRequestsAndInvalidate) { |
| 132 int did_callback = 0; |
| 133 PluginService::GetPluginsCallback callback = |
| 134 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); |
| 135 |
| 136 plugin_loader()->GetPlugins(callback); |
| 137 |
| 138 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); |
| 139 message_loop()->RunUntilIdle(); |
| 140 |
| 141 EXPECT_EQ(0, did_callback); |
| 142 ::testing::Mock::VerifyAndClearExpectations(plugin_loader()); |
| 143 |
| 144 // Invalidate the plugin list, then queue up another request. |
| 145 PluginList::Singleton()->RefreshPlugins(); |
| 146 plugin_loader()->GetPlugins(callback); |
| 147 |
| 148 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); |
| 132 | 149 |
| 133 plugin_loader()->canonical_list()->clear(); | 150 plugin_loader()->canonical_list()->clear(); |
| 134 plugin_loader()->canonical_list()->push_back(plugin1_.path); | 151 plugin_loader()->canonical_list()->push_back(plugin1_.path); |
| 152 plugin_loader()->TestOnPluginLoaded(0, plugin1_); |
| 153 message_loop()->RunUntilIdle(); |
| 154 |
| 155 // Only the first request should have been fulfilled. |
| 156 EXPECT_EQ(1, did_callback); |
| 157 |
| 158 plugin_loader()->canonical_list()->clear(); |
| 159 plugin_loader()->canonical_list()->push_back(plugin1_.path); |
| 135 plugin_loader()->TestOnPluginLoaded(0, plugin1_); | 160 plugin_loader()->TestOnPluginLoaded(0, plugin1_); |
| 136 message_loop()->RunUntilIdle(); | 161 message_loop()->RunUntilIdle(); |
| 137 | 162 |
| 138 EXPECT_EQ(2, did_callback); | 163 EXPECT_EQ(2, did_callback); |
| 139 EXPECT_EQ(0u, plugin_loader()->number_of_pending_callbacks()); | |
| 140 } | 164 } |
| 141 | 165 |
| 142 TEST_F(PluginLoaderPosixTest, ThreeSuccessfulLoads) { | 166 TEST_F(PluginLoaderPosixTest, ThreeSuccessfulLoads) { |
| 143 int did_callback = 0; | 167 int did_callback = 0; |
| 144 PluginService::GetPluginsCallback callback = | 168 PluginService::GetPluginsCallback callback = |
| 145 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); | 169 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); |
| 146 | 170 |
| 147 plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback); | 171 plugin_loader()->GetPlugins(callback); |
| 148 | 172 |
| 149 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); | 173 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); |
| 150 message_loop()->RunUntilIdle(); | 174 message_loop()->RunUntilIdle(); |
| 151 | 175 |
| 152 AddThreePlugins(); | 176 AddThreePlugins(); |
| 153 | 177 |
| 154 EXPECT_EQ(0u, plugin_loader()->next_load_index()); | 178 EXPECT_EQ(0u, plugin_loader()->next_load_index()); |
| 155 | 179 |
| 156 const std::vector<WebPluginInfo>& plugins(plugin_loader()->loaded_plugins()); | 180 const std::vector<WebPluginInfo>& plugins(plugin_loader()->loaded_plugins()); |
| 157 | 181 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 177 | 201 |
| 178 message_loop()->RunUntilIdle(); | 202 message_loop()->RunUntilIdle(); |
| 179 EXPECT_EQ(1, did_callback); | 203 EXPECT_EQ(1, did_callback); |
| 180 } | 204 } |
| 181 | 205 |
| 182 TEST_F(PluginLoaderPosixTest, ThreeSuccessfulLoadsThenCrash) { | 206 TEST_F(PluginLoaderPosixTest, ThreeSuccessfulLoadsThenCrash) { |
| 183 int did_callback = 0; | 207 int did_callback = 0; |
| 184 PluginService::GetPluginsCallback callback = | 208 PluginService::GetPluginsCallback callback = |
| 185 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); | 209 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); |
| 186 | 210 |
| 187 plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback); | 211 plugin_loader()->GetPlugins(callback); |
| 188 | 212 |
| 189 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(2); | 213 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(2); |
| 190 message_loop()->RunUntilIdle(); | 214 message_loop()->RunUntilIdle(); |
| 191 | 215 |
| 192 AddThreePlugins(); | 216 AddThreePlugins(); |
| 193 | 217 |
| 194 EXPECT_EQ(0u, plugin_loader()->next_load_index()); | 218 EXPECT_EQ(0u, plugin_loader()->next_load_index()); |
| 195 | 219 |
| 196 const std::vector<WebPluginInfo>& plugins(plugin_loader()->loaded_plugins()); | 220 const std::vector<WebPluginInfo>& plugins(plugin_loader()->loaded_plugins()); |
| 197 | 221 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 219 EXPECT_EQ(1, did_callback); | 243 EXPECT_EQ(1, did_callback); |
| 220 | 244 |
| 221 plugin_loader()->OnProcessCrashed(42); | 245 plugin_loader()->OnProcessCrashed(42); |
| 222 } | 246 } |
| 223 | 247 |
| 224 TEST_F(PluginLoaderPosixTest, TwoFailures) { | 248 TEST_F(PluginLoaderPosixTest, TwoFailures) { |
| 225 int did_callback = 0; | 249 int did_callback = 0; |
| 226 PluginService::GetPluginsCallback callback = | 250 PluginService::GetPluginsCallback callback = |
| 227 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); | 251 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); |
| 228 | 252 |
| 229 plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback); | 253 plugin_loader()->GetPlugins(callback); |
| 230 | 254 |
| 231 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); | 255 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); |
| 232 message_loop()->RunUntilIdle(); | 256 message_loop()->RunUntilIdle(); |
| 233 | 257 |
| 234 AddThreePlugins(); | 258 AddThreePlugins(); |
| 235 | 259 |
| 236 EXPECT_EQ(0u, plugin_loader()->next_load_index()); | 260 EXPECT_EQ(0u, plugin_loader()->next_load_index()); |
| 237 | 261 |
| 238 const std::vector<WebPluginInfo>& plugins(plugin_loader()->loaded_plugins()); | 262 const std::vector<WebPluginInfo>& plugins(plugin_loader()->loaded_plugins()); |
| 239 | 263 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 257 | 281 |
| 258 message_loop()->RunUntilIdle(); | 282 message_loop()->RunUntilIdle(); |
| 259 EXPECT_EQ(1, did_callback); | 283 EXPECT_EQ(1, did_callback); |
| 260 } | 284 } |
| 261 | 285 |
| 262 TEST_F(PluginLoaderPosixTest, CrashedProcess) { | 286 TEST_F(PluginLoaderPosixTest, CrashedProcess) { |
| 263 int did_callback = 0; | 287 int did_callback = 0; |
| 264 PluginService::GetPluginsCallback callback = | 288 PluginService::GetPluginsCallback callback = |
| 265 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); | 289 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); |
| 266 | 290 |
| 267 plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback); | 291 plugin_loader()->GetPlugins(callback); |
| 268 | 292 |
| 269 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); | 293 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); |
| 270 message_loop()->RunUntilIdle(); | 294 message_loop()->RunUntilIdle(); |
| 271 | 295 |
| 272 AddThreePlugins(); | 296 AddThreePlugins(); |
| 273 | 297 |
| 274 EXPECT_EQ(0u, plugin_loader()->next_load_index()); | 298 EXPECT_EQ(0u, plugin_loader()->next_load_index()); |
| 275 | 299 |
| 276 const std::vector<WebPluginInfo>& plugins(plugin_loader()->loaded_plugins()); | 300 const std::vector<WebPluginInfo>& plugins(plugin_loader()->loaded_plugins()); |
| 277 | 301 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 289 EXPECT_EQ(0u, plugin_loader()->next_load_index()); | 313 EXPECT_EQ(0u, plugin_loader()->next_load_index()); |
| 290 EXPECT_EQ(plugin3_.path.value(), | 314 EXPECT_EQ(plugin3_.path.value(), |
| 291 plugin_loader()->canonical_list()->at(0).value()); | 315 plugin_loader()->canonical_list()->at(0).value()); |
| 292 } | 316 } |
| 293 | 317 |
| 294 TEST_F(PluginLoaderPosixTest, InternalPlugin) { | 318 TEST_F(PluginLoaderPosixTest, InternalPlugin) { |
| 295 int did_callback = 0; | 319 int did_callback = 0; |
| 296 PluginService::GetPluginsCallback callback = | 320 PluginService::GetPluginsCallback callback = |
| 297 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); | 321 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); |
| 298 | 322 |
| 299 plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback); | 323 plugin_loader()->GetPlugins(callback); |
| 300 | 324 |
| 301 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); | 325 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); |
| 302 message_loop()->RunUntilIdle(); | 326 message_loop()->RunUntilIdle(); |
| 303 | 327 |
| 304 plugin2_.path = base::FilePath("/internal/plugin.plugin"); | 328 plugin2_.path = base::FilePath("/internal/plugin.plugin"); |
| 305 | 329 |
| 306 AddThreePlugins(); | 330 AddThreePlugins(); |
| 307 | 331 |
| 308 plugin_loader()->internal_plugins()->clear(); | 332 plugin_loader()->internal_plugins()->clear(); |
| 309 plugin_loader()->internal_plugins()->push_back(plugin2_); | 333 plugin_loader()->internal_plugins()->push_back(plugin2_); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 337 | 361 |
| 338 message_loop()->RunUntilIdle(); | 362 message_loop()->RunUntilIdle(); |
| 339 EXPECT_EQ(1, did_callback); | 363 EXPECT_EQ(1, did_callback); |
| 340 } | 364 } |
| 341 | 365 |
| 342 TEST_F(PluginLoaderPosixTest, AllCrashed) { | 366 TEST_F(PluginLoaderPosixTest, AllCrashed) { |
| 343 int did_callback = 0; | 367 int did_callback = 0; |
| 344 PluginService::GetPluginsCallback callback = | 368 PluginService::GetPluginsCallback callback = |
| 345 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); | 369 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); |
| 346 | 370 |
| 347 plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback); | 371 plugin_loader()->GetPlugins(callback); |
| 348 | 372 |
| 349 // Spin the loop so that the canonical list of plugins can be set. | 373 // Spin the loop so that the canonical list of plugins can be set. |
| 350 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); | 374 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); |
| 351 message_loop()->RunUntilIdle(); | 375 message_loop()->RunUntilIdle(); |
| 352 AddThreePlugins(); | 376 AddThreePlugins(); |
| 353 | 377 |
| 354 EXPECT_EQ(0u, plugin_loader()->next_load_index()); | 378 EXPECT_EQ(0u, plugin_loader()->next_load_index()); |
| 355 | 379 |
| 356 // Mock the first two calls like normal. | 380 // Mock the first two calls like normal. |
| 357 testing::Expectation first = | 381 testing::Expectation first = |
| 358 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(2); | 382 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(2); |
| 359 // On the last call, go through the default impl. | 383 // On the last call, go through the default impl. |
| 360 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()) | 384 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()) |
| 361 .After(first) | 385 .After(first) |
| 362 .WillOnce( | 386 .WillOnce( |
| 363 testing::Invoke(plugin_loader(), | 387 testing::Invoke(plugin_loader(), |
| 364 &MockPluginLoaderPosix::RealLoadPluginsInternal)); | 388 &MockPluginLoaderPosix::RealLoadPluginsInternal)); |
| 365 plugin_loader()->OnProcessCrashed(42); | 389 plugin_loader()->OnProcessCrashed(42); |
| 366 plugin_loader()->OnProcessCrashed(42); | 390 plugin_loader()->OnProcessCrashed(42); |
| 367 plugin_loader()->OnProcessCrashed(42); | 391 plugin_loader()->OnProcessCrashed(42); |
| 368 | 392 |
| 369 message_loop()->RunUntilIdle(); | 393 message_loop()->RunUntilIdle(); |
| 370 EXPECT_EQ(1, did_callback); | 394 EXPECT_EQ(1, did_callback); |
| 371 | 395 |
| 372 EXPECT_EQ(0u, plugin_loader()->loaded_plugins().size()); | 396 EXPECT_EQ(0u, plugin_loader()->loaded_plugins().size()); |
| 373 } | 397 } |
| 374 | 398 |
| 375 } // namespace content | 399 } // namespace content |
| OLD | NEW |