| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/file_path.h" | 8 #include "base/file_path.h" |
| 9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 } | 38 } |
| 39 | 39 |
| 40 std::vector<webkit::WebPluginInfo>* internal_plugins() { | 40 std::vector<webkit::WebPluginInfo>* internal_plugins() { |
| 41 return &internal_plugins_; | 41 return &internal_plugins_; |
| 42 } | 42 } |
| 43 | 43 |
| 44 void RealLoadPluginsInternal() { | 44 void RealLoadPluginsInternal() { |
| 45 PluginLoaderPosix::LoadPluginsInternal(); | 45 PluginLoaderPosix::LoadPluginsInternal(); |
| 46 } | 46 } |
| 47 | 47 |
| 48 void TestOnPluginLoaded(const webkit::WebPluginInfo& plugin) { | 48 void TestOnPluginLoaded(uint32_t index, const webkit::WebPluginInfo& plugin) { |
| 49 OnPluginLoaded(plugin); | 49 OnPluginLoaded(index, plugin); |
| 50 } | 50 } |
| 51 | 51 |
| 52 void TestOnPluginLoadFailed(const FilePath& path) { | 52 void TestOnPluginLoadFailed(uint32_t index, const FilePath& path) { |
| 53 OnPluginLoadFailed(path); | 53 OnPluginLoadFailed(index, path); |
| 54 } | 54 } |
| 55 }; | 55 }; |
| 56 | 56 |
| 57 void VerifyCallback(int* run_count, const std::vector<webkit::WebPluginInfo>&) { | 57 void VerifyCallback(int* run_count, const std::vector<webkit::WebPluginInfo>&) { |
| 58 ++(*run_count); | 58 ++(*run_count); |
| 59 } | 59 } |
| 60 | 60 |
| 61 class PluginLoaderPosixTest : public testing::Test { | 61 class PluginLoaderPosixTest : public testing::Test { |
| 62 public: | 62 public: |
| 63 PluginLoaderPosixTest() | 63 PluginLoaderPosixTest() |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 EXPECT_EQ(2u, plugin_loader()->number_of_pending_callbacks()); | 108 EXPECT_EQ(2u, plugin_loader()->number_of_pending_callbacks()); |
| 109 | 109 |
| 110 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); | 110 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); |
| 111 message_loop()->RunAllPending(); | 111 message_loop()->RunAllPending(); |
| 112 | 112 |
| 113 plugin_loader()->canonical_list()->clear(); | 113 plugin_loader()->canonical_list()->clear(); |
| 114 plugin_loader()->canonical_list()->push_back(plugin1_.path); | 114 plugin_loader()->canonical_list()->push_back(plugin1_.path); |
| 115 | 115 |
| 116 EXPECT_EQ(0, did_callback); | 116 EXPECT_EQ(0, did_callback); |
| 117 | 117 |
| 118 plugin_loader()->TestOnPluginLoaded(plugin1_); | 118 plugin_loader()->TestOnPluginLoaded(0, plugin1_); |
| 119 message_loop()->RunAllPending(); | 119 message_loop()->RunAllPending(); |
| 120 | 120 |
| 121 EXPECT_EQ(2, did_callback); | 121 EXPECT_EQ(2, did_callback); |
| 122 EXPECT_EQ(0u, plugin_loader()->number_of_pending_callbacks()); | 122 EXPECT_EQ(0u, plugin_loader()->number_of_pending_callbacks()); |
| 123 } | 123 } |
| 124 | 124 |
| 125 TEST_F(PluginLoaderPosixTest, ThreeSuccessfulLoads) { | 125 TEST_F(PluginLoaderPosixTest, ThreeSuccessfulLoads) { |
| 126 int did_callback = 0; | 126 int did_callback = 0; |
| 127 PluginService::GetPluginsCallback callback = | 127 PluginService::GetPluginsCallback callback = |
| 128 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); | 128 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); |
| 129 | 129 |
| 130 plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback); | 130 plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback); |
| 131 | 131 |
| 132 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); | 132 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); |
| 133 message_loop()->RunAllPending(); | 133 message_loop()->RunAllPending(); |
| 134 | 134 |
| 135 AddThreePlugins(); | 135 AddThreePlugins(); |
| 136 | 136 |
| 137 EXPECT_EQ(0u, plugin_loader()->next_load_index()); | 137 EXPECT_EQ(0u, plugin_loader()->next_load_index()); |
| 138 | 138 |
| 139 const std::vector<webkit::WebPluginInfo>& plugins( | 139 const std::vector<webkit::WebPluginInfo>& plugins( |
| 140 plugin_loader()->loaded_plugins()); | 140 plugin_loader()->loaded_plugins()); |
| 141 | 141 |
| 142 plugin_loader()->TestOnPluginLoaded(plugin1_); | 142 plugin_loader()->TestOnPluginLoaded(0, plugin1_); |
| 143 EXPECT_EQ(1u, plugin_loader()->next_load_index()); | 143 EXPECT_EQ(1u, plugin_loader()->next_load_index()); |
| 144 EXPECT_EQ(1u, plugins.size()); | 144 EXPECT_EQ(1u, plugins.size()); |
| 145 EXPECT_EQ(plugin1_.name, plugins[0].name); | 145 EXPECT_EQ(plugin1_.name, plugins[0].name); |
| 146 | 146 |
| 147 message_loop()->RunAllPending(); | 147 message_loop()->RunAllPending(); |
| 148 EXPECT_EQ(0, did_callback); | 148 EXPECT_EQ(0, did_callback); |
| 149 | 149 |
| 150 plugin_loader()->TestOnPluginLoaded(plugin2_); | 150 plugin_loader()->TestOnPluginLoaded(1, plugin2_); |
| 151 EXPECT_EQ(2u, plugin_loader()->next_load_index()); | 151 EXPECT_EQ(2u, plugin_loader()->next_load_index()); |
| 152 EXPECT_EQ(2u, plugins.size()); | 152 EXPECT_EQ(2u, plugins.size()); |
| 153 EXPECT_EQ(plugin2_.name, plugins[1].name); | 153 EXPECT_EQ(plugin2_.name, plugins[1].name); |
| 154 | 154 |
| 155 message_loop()->RunAllPending(); | 155 message_loop()->RunAllPending(); |
| 156 EXPECT_EQ(0, did_callback); | 156 EXPECT_EQ(0, did_callback); |
| 157 | 157 |
| 158 plugin_loader()->TestOnPluginLoaded(plugin3_); | 158 plugin_loader()->TestOnPluginLoaded(2, plugin3_); |
| 159 EXPECT_EQ(3u, plugins.size()); | 159 EXPECT_EQ(3u, plugins.size()); |
| 160 EXPECT_EQ(plugin3_.name, plugins[2].name); | 160 EXPECT_EQ(plugin3_.name, plugins[2].name); |
| 161 | 161 |
| 162 message_loop()->RunAllPending(); | 162 message_loop()->RunAllPending(); |
| 163 EXPECT_EQ(1, did_callback); | 163 EXPECT_EQ(1, did_callback); |
| 164 } | 164 } |
| 165 | 165 |
| 166 TEST_F(PluginLoaderPosixTest, TwoFailures) { | 166 TEST_F(PluginLoaderPosixTest, TwoFailures) { |
| 167 int did_callback = 0; | 167 int did_callback = 0; |
| 168 PluginService::GetPluginsCallback callback = | 168 PluginService::GetPluginsCallback callback = |
| 169 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); | 169 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); |
| 170 | 170 |
| 171 plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback); | 171 plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback); |
| 172 | 172 |
| 173 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); | 173 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); |
| 174 message_loop()->RunAllPending(); | 174 message_loop()->RunAllPending(); |
| 175 | 175 |
| 176 AddThreePlugins(); | 176 AddThreePlugins(); |
| 177 | 177 |
| 178 EXPECT_EQ(0u, plugin_loader()->next_load_index()); | 178 EXPECT_EQ(0u, plugin_loader()->next_load_index()); |
| 179 | 179 |
| 180 const std::vector<webkit::WebPluginInfo>& plugins( | 180 const std::vector<webkit::WebPluginInfo>& plugins( |
| 181 plugin_loader()->loaded_plugins()); | 181 plugin_loader()->loaded_plugins()); |
| 182 | 182 |
| 183 plugin_loader()->TestOnPluginLoadFailed(plugin1_.path); | 183 plugin_loader()->TestOnPluginLoadFailed(0, plugin1_.path); |
| 184 EXPECT_EQ(1u, plugin_loader()->next_load_index()); | 184 EXPECT_EQ(1u, plugin_loader()->next_load_index()); |
| 185 EXPECT_EQ(0u, plugins.size()); | 185 EXPECT_EQ(0u, plugins.size()); |
| 186 | 186 |
| 187 message_loop()->RunAllPending(); | 187 message_loop()->RunAllPending(); |
| 188 EXPECT_EQ(0, did_callback); | 188 EXPECT_EQ(0, did_callback); |
| 189 | 189 |
| 190 plugin_loader()->TestOnPluginLoaded(plugin2_); | 190 plugin_loader()->TestOnPluginLoaded(1, plugin2_); |
| 191 EXPECT_EQ(2u, plugin_loader()->next_load_index()); | 191 EXPECT_EQ(2u, plugin_loader()->next_load_index()); |
| 192 EXPECT_EQ(1u, plugins.size()); | 192 EXPECT_EQ(1u, plugins.size()); |
| 193 EXPECT_EQ(plugin2_.name, plugins[0].name); | 193 EXPECT_EQ(plugin2_.name, plugins[0].name); |
| 194 | 194 |
| 195 message_loop()->RunAllPending(); | 195 message_loop()->RunAllPending(); |
| 196 EXPECT_EQ(0, did_callback); | 196 EXPECT_EQ(0, did_callback); |
| 197 | 197 |
| 198 plugin_loader()->TestOnPluginLoadFailed(plugin3_.path); | 198 plugin_loader()->TestOnPluginLoadFailed(2, plugin3_.path); |
| 199 EXPECT_EQ(1u, plugins.size()); | 199 EXPECT_EQ(1u, plugins.size()); |
| 200 | 200 |
| 201 message_loop()->RunAllPending(); | 201 message_loop()->RunAllPending(); |
| 202 EXPECT_EQ(1, did_callback); | 202 EXPECT_EQ(1, did_callback); |
| 203 } | 203 } |
| 204 | 204 |
| 205 TEST_F(PluginLoaderPosixTest, CrashedProcess) { | 205 TEST_F(PluginLoaderPosixTest, CrashedProcess) { |
| 206 int did_callback = 0; | 206 int did_callback = 0; |
| 207 PluginService::GetPluginsCallback callback = | 207 PluginService::GetPluginsCallback callback = |
| 208 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); | 208 base::Bind(&VerifyCallback, base::Unretained(&did_callback)); |
| 209 | 209 |
| 210 plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback); | 210 plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback); |
| 211 | 211 |
| 212 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); | 212 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); |
| 213 message_loop()->RunAllPending(); | 213 message_loop()->RunAllPending(); |
| 214 | 214 |
| 215 AddThreePlugins(); | 215 AddThreePlugins(); |
| 216 | 216 |
| 217 EXPECT_EQ(0u, plugin_loader()->next_load_index()); | 217 EXPECT_EQ(0u, plugin_loader()->next_load_index()); |
| 218 | 218 |
| 219 const std::vector<webkit::WebPluginInfo>& plugins( | 219 const std::vector<webkit::WebPluginInfo>& plugins( |
| 220 plugin_loader()->loaded_plugins()); | 220 plugin_loader()->loaded_plugins()); |
| 221 | 221 |
| 222 plugin_loader()->TestOnPluginLoaded(plugin1_); | 222 plugin_loader()->TestOnPluginLoaded(0, plugin1_); |
| 223 EXPECT_EQ(1u, plugin_loader()->next_load_index()); | 223 EXPECT_EQ(1u, plugin_loader()->next_load_index()); |
| 224 EXPECT_EQ(1u, plugins.size()); | 224 EXPECT_EQ(1u, plugins.size()); |
| 225 EXPECT_EQ(plugin1_.name, plugins[0].name); | 225 EXPECT_EQ(plugin1_.name, plugins[0].name); |
| 226 | 226 |
| 227 message_loop()->RunAllPending(); | 227 message_loop()->RunAllPending(); |
| 228 EXPECT_EQ(0, did_callback); | 228 EXPECT_EQ(0, did_callback); |
| 229 | 229 |
| 230 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); | 230 EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1); |
| 231 plugin_loader()->OnProcessCrashed(42); | 231 plugin_loader()->OnProcessCrashed(42); |
| 232 EXPECT_EQ(1u, plugin_loader()->canonical_list()->size()); | 232 EXPECT_EQ(1u, plugin_loader()->canonical_list()->size()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 250 AddThreePlugins(); | 250 AddThreePlugins(); |
| 251 | 251 |
| 252 plugin_loader()->internal_plugins()->clear(); | 252 plugin_loader()->internal_plugins()->clear(); |
| 253 plugin_loader()->internal_plugins()->push_back(plugin2_); | 253 plugin_loader()->internal_plugins()->push_back(plugin2_); |
| 254 | 254 |
| 255 EXPECT_EQ(0u, plugin_loader()->next_load_index()); | 255 EXPECT_EQ(0u, plugin_loader()->next_load_index()); |
| 256 | 256 |
| 257 const std::vector<webkit::WebPluginInfo>& plugins( | 257 const std::vector<webkit::WebPluginInfo>& plugins( |
| 258 plugin_loader()->loaded_plugins()); | 258 plugin_loader()->loaded_plugins()); |
| 259 | 259 |
| 260 plugin_loader()->TestOnPluginLoaded(plugin1_); | 260 plugin_loader()->TestOnPluginLoaded(0, plugin1_); |
| 261 EXPECT_EQ(1u, plugin_loader()->next_load_index()); | 261 EXPECT_EQ(1u, plugin_loader()->next_load_index()); |
| 262 EXPECT_EQ(1u, plugins.size()); | 262 EXPECT_EQ(1u, plugins.size()); |
| 263 EXPECT_EQ(plugin1_.name, plugins[0].name); | 263 EXPECT_EQ(plugin1_.name, plugins[0].name); |
| 264 | 264 |
| 265 message_loop()->RunAllPending(); | 265 message_loop()->RunAllPending(); |
| 266 EXPECT_EQ(0, did_callback); | 266 EXPECT_EQ(0, did_callback); |
| 267 | 267 |
| 268 // Internal plugins can fail to load if they're built-in with manual | 268 // Internal plugins can fail to load if they're built-in with manual |
| 269 // entrypoint functions. | 269 // entrypoint functions. |
| 270 plugin_loader()->TestOnPluginLoadFailed(plugin2_.path); | 270 plugin_loader()->TestOnPluginLoadFailed(1, plugin2_.path); |
| 271 EXPECT_EQ(2u, plugin_loader()->next_load_index()); | 271 EXPECT_EQ(2u, plugin_loader()->next_load_index()); |
| 272 EXPECT_EQ(2u, plugins.size()); | 272 EXPECT_EQ(2u, plugins.size()); |
| 273 EXPECT_EQ(plugin2_.name, plugins[1].name); | 273 EXPECT_EQ(plugin2_.name, plugins[1].name); |
| 274 EXPECT_EQ(0u, plugin_loader()->internal_plugins()->size()); | 274 EXPECT_EQ(0u, plugin_loader()->internal_plugins()->size()); |
| 275 | 275 |
| 276 message_loop()->RunAllPending(); | 276 message_loop()->RunAllPending(); |
| 277 EXPECT_EQ(0, did_callback); | 277 EXPECT_EQ(0, did_callback); |
| 278 | 278 |
| 279 plugin_loader()->TestOnPluginLoaded(plugin3_); | 279 plugin_loader()->TestOnPluginLoaded(2, plugin3_); |
| 280 EXPECT_EQ(3u, plugins.size()); | 280 EXPECT_EQ(3u, plugins.size()); |
| 281 EXPECT_EQ(plugin3_.name, plugins[2].name); | 281 EXPECT_EQ(plugin3_.name, plugins[2].name); |
| 282 | 282 |
| 283 message_loop()->RunAllPending(); | 283 message_loop()->RunAllPending(); |
| 284 EXPECT_EQ(1, did_callback); | 284 EXPECT_EQ(1, did_callback); |
| 285 } | 285 } |
| 286 | 286 |
| 287 TEST_F(PluginLoaderPosixTest, AllCrashed) { | 287 TEST_F(PluginLoaderPosixTest, AllCrashed) { |
| 288 int did_callback = 0; | 288 int did_callback = 0; |
| 289 PluginService::GetPluginsCallback callback = | 289 PluginService::GetPluginsCallback callback = |
| (...skipping 19 matching lines...) Expand all Loading... |
| 309 &MockPluginLoaderPosix::RealLoadPluginsInternal)); | 309 &MockPluginLoaderPosix::RealLoadPluginsInternal)); |
| 310 plugin_loader()->OnProcessCrashed(42); | 310 plugin_loader()->OnProcessCrashed(42); |
| 311 plugin_loader()->OnProcessCrashed(42); | 311 plugin_loader()->OnProcessCrashed(42); |
| 312 plugin_loader()->OnProcessCrashed(42); | 312 plugin_loader()->OnProcessCrashed(42); |
| 313 | 313 |
| 314 message_loop()->RunAllPending(); | 314 message_loop()->RunAllPending(); |
| 315 EXPECT_EQ(1, did_callback); | 315 EXPECT_EQ(1, did_callback); |
| 316 | 316 |
| 317 EXPECT_EQ(0u, plugin_loader()->loaded_plugins().size()); | 317 EXPECT_EQ(0u, plugin_loader()->loaded_plugins().size()); |
| 318 } | 318 } |
| OLD | NEW |