| 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_service_impl.h" | 5 #include "content/browser/plugin_service_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 const FilePath& broker_path) { | 236 const FilePath& broker_path) { |
| 237 for (PpapiBrokerProcessHostIterator iter; !iter.Done(); ++iter) { | 237 for (PpapiBrokerProcessHostIterator iter; !iter.Done(); ++iter) { |
| 238 if (iter->plugin_path() == broker_path) | 238 if (iter->plugin_path() == broker_path) |
| 239 return *iter; | 239 return *iter; |
| 240 } | 240 } |
| 241 | 241 |
| 242 return NULL; | 242 return NULL; |
| 243 } | 243 } |
| 244 | 244 |
| 245 PluginProcessHost* PluginServiceImpl::FindOrStartNpapiPluginProcess( | 245 PluginProcessHost* PluginServiceImpl::FindOrStartNpapiPluginProcess( |
| 246 int render_process_id, |
| 246 const FilePath& plugin_path) { | 247 const FilePath& plugin_path) { |
| 247 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 248 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 248 | 249 |
| 250 if (filter_ && !filter_->CanLoadPlugin(render_process_id, plugin_path)) |
| 251 return NULL; |
| 252 |
| 249 PluginProcessHost* plugin_host = FindNpapiPluginProcess(plugin_path); | 253 PluginProcessHost* plugin_host = FindNpapiPluginProcess(plugin_path); |
| 250 if (plugin_host) | 254 if (plugin_host) |
| 251 return plugin_host; | 255 return plugin_host; |
| 252 | 256 |
| 253 webkit::WebPluginInfo info; | 257 webkit::WebPluginInfo info; |
| 254 if (!GetPluginInfoByPath(plugin_path, &info)) { | 258 if (!GetPluginInfoByPath(plugin_path, &info)) { |
| 255 return NULL; | 259 return NULL; |
| 256 } | 260 } |
| 257 | 261 |
| 258 // This plugin isn't loaded by any plugin process, so create a new process. | 262 // This plugin isn't loaded by any plugin process, so create a new process. |
| 259 scoped_ptr<PluginProcessHost> new_host(new PluginProcessHost()); | 263 scoped_ptr<PluginProcessHost> new_host(new PluginProcessHost()); |
| 260 if (!new_host->Init(info)) { | 264 if (!new_host->Init(info)) { |
| 261 NOTREACHED(); // Init is not expected to fail. | 265 NOTREACHED(); // Init is not expected to fail. |
| 262 return NULL; | 266 return NULL; |
| 263 } | 267 } |
| 264 return new_host.release(); | 268 return new_host.release(); |
| 265 } | 269 } |
| 266 | 270 |
| 267 PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiPluginProcess( | 271 PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiPluginProcess( |
| 272 int render_process_id, |
| 268 const FilePath& plugin_path, | 273 const FilePath& plugin_path, |
| 269 const FilePath& profile_data_directory, | 274 const FilePath& profile_data_directory, |
| 270 PpapiPluginProcessHost::PluginClient* client) { | 275 PpapiPluginProcessHost::PluginClient* client) { |
| 271 #if defined(ENABLE_PLUGINS) | 276 #if defined(ENABLE_PLUGINS) |
| 272 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 277 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 273 | 278 |
| 279 if (filter_ && !filter_->CanLoadPlugin(render_process_id, plugin_path)) |
| 280 return NULL; |
| 281 |
| 274 PpapiPluginProcessHost* plugin_host = | 282 PpapiPluginProcessHost* plugin_host = |
| 275 FindPpapiPluginProcess(plugin_path, profile_data_directory); | 283 FindPpapiPluginProcess(plugin_path, profile_data_directory); |
| 276 if (plugin_host) | 284 if (plugin_host) |
| 277 return plugin_host; | 285 return plugin_host; |
| 278 | 286 |
| 279 // Validate that the plugin is actually registered. | 287 // Validate that the plugin is actually registered. |
| 280 PepperPluginInfo* info = GetRegisteredPpapiPluginInfo(plugin_path); | 288 PepperPluginInfo* info = GetRegisteredPpapiPluginInfo(plugin_path); |
| 281 if (!info) | 289 if (!info) |
| 282 return NULL; | 290 return NULL; |
| 283 | 291 |
| 284 // This plugin isn't loaded by any plugin process, so create a new process. | 292 // This plugin isn't loaded by any plugin process, so create a new process. |
| 285 return PpapiPluginProcessHost::CreatePluginHost( | 293 return PpapiPluginProcessHost::CreatePluginHost( |
| 286 *info, profile_data_directory, | 294 *info, profile_data_directory, |
| 287 client->GetResourceContext()->GetHostResolver()); | 295 client->GetResourceContext()->GetHostResolver()); |
| 288 #else | 296 #else |
| 289 return NULL; | 297 return NULL; |
| 290 #endif | 298 #endif |
| 291 } | 299 } |
| 292 | 300 |
| 293 PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiBrokerProcess( | 301 PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiBrokerProcess( |
| 302 int render_process_id, |
| 294 const FilePath& plugin_path) { | 303 const FilePath& plugin_path) { |
| 295 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 304 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 296 | 305 |
| 306 if (filter_ && !filter_->CanLoadPlugin(render_process_id, plugin_path)) |
| 307 return NULL; |
| 308 |
| 297 PpapiPluginProcessHost* plugin_host = FindPpapiBrokerProcess(plugin_path); | 309 PpapiPluginProcessHost* plugin_host = FindPpapiBrokerProcess(plugin_path); |
| 298 if (plugin_host) | 310 if (plugin_host) |
| 299 return plugin_host; | 311 return plugin_host; |
| 300 | 312 |
| 301 // Validate that the plugin is actually registered. | 313 // Validate that the plugin is actually registered. |
| 302 PepperPluginInfo* info = GetRegisteredPpapiPluginInfo(plugin_path); | 314 PepperPluginInfo* info = GetRegisteredPpapiPluginInfo(plugin_path); |
| 303 if (!info) | 315 if (!info) |
| 304 return NULL; | 316 return NULL; |
| 305 | 317 |
| 306 // TODO(ddorwin): Uncomment once out of process is supported. | 318 // TODO(ddorwin): Uncomment once out of process is supported. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 327 render_view_id, | 339 render_view_id, |
| 328 page_url, | 340 page_url, |
| 329 client->GetResourceContext() | 341 client->GetResourceContext() |
| 330 }; | 342 }; |
| 331 GetPlugins(base::Bind( | 343 GetPlugins(base::Bind( |
| 332 &PluginServiceImpl::ForwardGetAllowedPluginForOpenChannelToPlugin, | 344 &PluginServiceImpl::ForwardGetAllowedPluginForOpenChannelToPlugin, |
| 333 base::Unretained(this), params, url, mime_type, client)); | 345 base::Unretained(this), params, url, mime_type, client)); |
| 334 } | 346 } |
| 335 | 347 |
| 336 void PluginServiceImpl::OpenChannelToPpapiPlugin( | 348 void PluginServiceImpl::OpenChannelToPpapiPlugin( |
| 349 int render_process_id, |
| 337 const FilePath& plugin_path, | 350 const FilePath& plugin_path, |
| 338 const FilePath& profile_data_directory, | 351 const FilePath& profile_data_directory, |
| 339 PpapiPluginProcessHost::PluginClient* client) { | 352 PpapiPluginProcessHost::PluginClient* client) { |
| 340 PpapiPluginProcessHost* plugin_host = FindOrStartPpapiPluginProcess( | 353 PpapiPluginProcessHost* plugin_host = FindOrStartPpapiPluginProcess( |
| 341 plugin_path, profile_data_directory, client); | 354 render_process_id, plugin_path, profile_data_directory, client); |
| 342 if (plugin_host) { | 355 if (plugin_host) { |
| 343 plugin_host->OpenChannelToPlugin(client); | 356 plugin_host->OpenChannelToPlugin(client); |
| 344 } else { | 357 } else { |
| 345 // Send error. | 358 // Send error. |
| 346 client->OnPpapiChannelOpened(IPC::ChannelHandle(), base::kNullProcessId, 0); | 359 client->OnPpapiChannelOpened(IPC::ChannelHandle(), base::kNullProcessId, 0); |
| 347 } | 360 } |
| 348 } | 361 } |
| 349 | 362 |
| 350 void PluginServiceImpl::OpenChannelToPpapiBroker( | 363 void PluginServiceImpl::OpenChannelToPpapiBroker( |
| 364 int render_process_id, |
| 351 const FilePath& path, | 365 const FilePath& path, |
| 352 PpapiPluginProcessHost::BrokerClient* client) { | 366 PpapiPluginProcessHost::BrokerClient* client) { |
| 353 #if defined(ENABLE_PLUGINS) | 367 #if defined(ENABLE_PLUGINS) |
| 354 PpapiPluginProcessHost* plugin_host = FindOrStartPpapiBrokerProcess(path); | 368 PpapiPluginProcessHost* plugin_host = FindOrStartPpapiBrokerProcess( |
| 369 render_process_id, path); |
| 355 if (plugin_host) { | 370 if (plugin_host) { |
| 356 plugin_host->OpenChannelToPlugin(client); | 371 plugin_host->OpenChannelToPlugin(client); |
| 357 } else { | 372 } else { |
| 358 // Send error. | 373 // Send error. |
| 359 client->OnPpapiChannelOpened(IPC::ChannelHandle(), base::kNullProcessId, 0); | 374 client->OnPpapiChannelOpened(IPC::ChannelHandle(), base::kNullProcessId, 0); |
| 360 } | 375 } |
| 361 #endif | 376 #endif |
| 362 } | 377 } |
| 363 | 378 |
| 364 void PluginServiceImpl::CancelOpenChannelToNpapiPlugin( | 379 void PluginServiceImpl::CancelOpenChannelToNpapiPlugin( |
| (...skipping 29 matching lines...) Expand all Loading... |
| 394 url, page_url, mime_type, allow_wildcard, | 409 url, page_url, mime_type, allow_wildcard, |
| 395 NULL, &info, NULL); | 410 NULL, &info, NULL); |
| 396 FilePath plugin_path; | 411 FilePath plugin_path; |
| 397 if (found) | 412 if (found) |
| 398 plugin_path = info.path; | 413 plugin_path = info.path; |
| 399 | 414 |
| 400 // Now we jump back to the IO thread to finish opening the channel. | 415 // Now we jump back to the IO thread to finish opening the channel. |
| 401 BrowserThread::PostTask( | 416 BrowserThread::PostTask( |
| 402 BrowserThread::IO, FROM_HERE, | 417 BrowserThread::IO, FROM_HERE, |
| 403 base::Bind(&PluginServiceImpl::FinishOpenChannelToPlugin, | 418 base::Bind(&PluginServiceImpl::FinishOpenChannelToPlugin, |
| 404 base::Unretained(this), plugin_path, client)); | 419 base::Unretained(this), |
| 420 render_process_id, |
| 421 plugin_path, |
| 422 client)); |
| 405 } | 423 } |
| 406 | 424 |
| 407 void PluginServiceImpl::FinishOpenChannelToPlugin( | 425 void PluginServiceImpl::FinishOpenChannelToPlugin( |
| 426 int render_process_id, |
| 408 const FilePath& plugin_path, | 427 const FilePath& plugin_path, |
| 409 PluginProcessHost::Client* client) { | 428 PluginProcessHost::Client* client) { |
| 410 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 429 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 411 | 430 |
| 412 // Make sure it hasn't been canceled yet. | 431 // Make sure it hasn't been canceled yet. |
| 413 if (!ContainsKey(pending_plugin_clients_, client)) | 432 if (!ContainsKey(pending_plugin_clients_, client)) |
| 414 return; | 433 return; |
| 415 pending_plugin_clients_.erase(client); | 434 pending_plugin_clients_.erase(client); |
| 416 | 435 |
| 417 PluginProcessHost* plugin_host = FindOrStartNpapiPluginProcess(plugin_path); | 436 PluginProcessHost* plugin_host = FindOrStartNpapiPluginProcess( |
| 437 render_process_id, plugin_path); |
| 418 if (plugin_host) { | 438 if (plugin_host) { |
| 419 client->OnFoundPluginProcessHost(plugin_host); | 439 client->OnFoundPluginProcessHost(plugin_host); |
| 420 plugin_host->OpenChannelToPlugin(client); | 440 plugin_host->OpenChannelToPlugin(client); |
| 421 } else { | 441 } else { |
| 422 client->OnError(); | 442 client->OnError(); |
| 423 } | 443 } |
| 424 } | 444 } |
| 425 | 445 |
| 426 bool PluginServiceImpl::GetPluginInfoArray( | 446 bool PluginServiceImpl::GetPluginInfoArray( |
| 427 const GURL& url, | 447 const GURL& url, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 446 webkit::WebPluginInfo* info, | 466 webkit::WebPluginInfo* info, |
| 447 std::string* actual_mime_type) { | 467 std::string* actual_mime_type) { |
| 448 std::vector<webkit::WebPluginInfo> plugins; | 468 std::vector<webkit::WebPluginInfo> plugins; |
| 449 std::vector<std::string> mime_types; | 469 std::vector<std::string> mime_types; |
| 450 bool stale = GetPluginInfoArray( | 470 bool stale = GetPluginInfoArray( |
| 451 url, mime_type, allow_wildcard, &plugins, &mime_types); | 471 url, mime_type, allow_wildcard, &plugins, &mime_types); |
| 452 if (is_stale) | 472 if (is_stale) |
| 453 *is_stale = stale; | 473 *is_stale = stale; |
| 454 | 474 |
| 455 for (size_t i = 0; i < plugins.size(); ++i) { | 475 for (size_t i = 0; i < plugins.size(); ++i) { |
| 456 if (!filter_ || filter_->ShouldUsePlugin(render_process_id, | 476 if (!filter_ || filter_->IsPluginEnabled(render_process_id, |
| 457 render_view_id, | 477 render_view_id, |
| 458 context, | 478 context, |
| 459 url, | 479 url, |
| 460 page_url, | 480 page_url, |
| 461 &plugins[i])) { | 481 &plugins[i])) { |
| 462 *info = plugins[i]; | 482 *info = plugins[i]; |
| 463 if (actual_mime_type) | 483 if (actual_mime_type) |
| 464 *actual_mime_type = mime_types[i]; | 484 *actual_mime_type = mime_types[i]; |
| 465 return true; | 485 return true; |
| 466 } | 486 } |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 709 void PluginServiceImpl::GetInternalPlugins( | 729 void PluginServiceImpl::GetInternalPlugins( |
| 710 std::vector<webkit::WebPluginInfo>* plugins) { | 730 std::vector<webkit::WebPluginInfo>* plugins) { |
| 711 plugin_list_->GetInternalPlugins(plugins); | 731 plugin_list_->GetInternalPlugins(plugins); |
| 712 } | 732 } |
| 713 | 733 |
| 714 webkit::npapi::PluginList* PluginServiceImpl::GetPluginList() { | 734 webkit::npapi::PluginList* PluginServiceImpl::GetPluginList() { |
| 715 return plugin_list_; | 735 return plugin_list_; |
| 716 } | 736 } |
| 717 | 737 |
| 718 } // namespace content | 738 } // namespace content |
| OLD | NEW |