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 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 const FilePath& broker_path) { | 252 const FilePath& broker_path) { |
253 for (PpapiBrokerProcessHostIterator iter; !iter.Done(); ++iter) { | 253 for (PpapiBrokerProcessHostIterator iter; !iter.Done(); ++iter) { |
254 if (iter->plugin_path() == broker_path) | 254 if (iter->plugin_path() == broker_path) |
255 return *iter; | 255 return *iter; |
256 } | 256 } |
257 | 257 |
258 return NULL; | 258 return NULL; |
259 } | 259 } |
260 | 260 |
261 PluginProcessHost* PluginServiceImpl::FindOrStartNpapiPluginProcess( | 261 PluginProcessHost* PluginServiceImpl::FindOrStartNpapiPluginProcess( |
262 int render_process_id, | |
263 const FilePath& plugin_path) { | 262 const FilePath& plugin_path) { |
264 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 263 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
265 | 264 |
266 if (filter_ && !filter_->CanLoadPlugin(render_process_id, plugin_path)) | |
267 return NULL; | |
268 | |
269 PluginProcessHost* plugin_host = FindNpapiPluginProcess(plugin_path); | 265 PluginProcessHost* plugin_host = FindNpapiPluginProcess(plugin_path); |
270 if (plugin_host) | 266 if (plugin_host) |
271 return plugin_host; | 267 return plugin_host; |
272 | 268 |
273 webkit::WebPluginInfo info; | 269 webkit::WebPluginInfo info; |
274 if (!GetPluginInfoByPath(plugin_path, &info)) { | 270 if (!GetPluginInfoByPath(plugin_path, &info)) { |
275 return NULL; | 271 return NULL; |
276 } | 272 } |
277 | 273 |
278 // This plugin isn't loaded by any plugin process, so create a new process. | 274 // This plugin isn't loaded by any plugin process, so create a new process. |
279 scoped_ptr<PluginProcessHost> new_host(new PluginProcessHost()); | 275 scoped_ptr<PluginProcessHost> new_host(new PluginProcessHost()); |
280 if (!new_host->Init(info)) { | 276 if (!new_host->Init(info)) { |
281 NOTREACHED(); // Init is not expected to fail. | 277 NOTREACHED(); // Init is not expected to fail. |
282 return NULL; | 278 return NULL; |
283 } | 279 } |
284 return new_host.release(); | 280 return new_host.release(); |
285 } | 281 } |
286 | 282 |
287 PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiPluginProcess( | 283 PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiPluginProcess( |
288 int render_process_id, | |
289 const FilePath& plugin_path, | 284 const FilePath& plugin_path, |
290 const FilePath& profile_data_directory, | 285 const FilePath& profile_data_directory, |
291 PpapiPluginProcessHost::PluginClient* client) { | 286 PpapiPluginProcessHost::PluginClient* client) { |
292 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 287 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
293 | 288 |
294 if (filter_ && !filter_->CanLoadPlugin(render_process_id, plugin_path)) | |
295 return NULL; | |
296 | |
297 PpapiPluginProcessHost* plugin_host = | 289 PpapiPluginProcessHost* plugin_host = |
298 FindPpapiPluginProcess(plugin_path, profile_data_directory); | 290 FindPpapiPluginProcess(plugin_path, profile_data_directory); |
299 if (plugin_host) | 291 if (plugin_host) |
300 return plugin_host; | 292 return plugin_host; |
301 | 293 |
302 // Validate that the plugin is actually registered. | 294 // Validate that the plugin is actually registered. |
303 PepperPluginInfo* info = GetRegisteredPpapiPluginInfo(plugin_path); | 295 PepperPluginInfo* info = GetRegisteredPpapiPluginInfo(plugin_path); |
304 if (!info) | 296 if (!info) |
305 return NULL; | 297 return NULL; |
306 | 298 |
307 // This plugin isn't loaded by any plugin process, so create a new process. | 299 // This plugin isn't loaded by any plugin process, so create a new process. |
308 return PpapiPluginProcessHost::CreatePluginHost( | 300 return PpapiPluginProcessHost::CreatePluginHost( |
309 *info, profile_data_directory, | 301 *info, profile_data_directory, |
310 client->GetResourceContext()->GetHostResolver()); | 302 client->GetResourceContext()->GetHostResolver()); |
311 } | 303 } |
312 | 304 |
313 PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiBrokerProcess( | 305 PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiBrokerProcess( |
314 int render_process_id, | |
315 const FilePath& plugin_path) { | 306 const FilePath& plugin_path) { |
316 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 307 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
317 | 308 |
318 if (filter_ && !filter_->CanLoadPlugin(render_process_id, plugin_path)) | |
319 return NULL; | |
320 | |
321 PpapiPluginProcessHost* plugin_host = FindPpapiBrokerProcess(plugin_path); | 309 PpapiPluginProcessHost* plugin_host = FindPpapiBrokerProcess(plugin_path); |
322 if (plugin_host) | 310 if (plugin_host) |
323 return plugin_host; | 311 return plugin_host; |
324 | 312 |
325 // Validate that the plugin is actually registered. | 313 // Validate that the plugin is actually registered. |
326 PepperPluginInfo* info = GetRegisteredPpapiPluginInfo(plugin_path); | 314 PepperPluginInfo* info = GetRegisteredPpapiPluginInfo(plugin_path); |
327 if (!info) | 315 if (!info) |
328 return NULL; | 316 return NULL; |
329 | 317 |
330 // 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... |
351 render_view_id, | 339 render_view_id, |
352 page_url, | 340 page_url, |
353 client->GetResourceContext() | 341 client->GetResourceContext() |
354 }; | 342 }; |
355 GetPlugins(base::Bind( | 343 GetPlugins(base::Bind( |
356 &PluginServiceImpl::ForwardGetAllowedPluginForOpenChannelToPlugin, | 344 &PluginServiceImpl::ForwardGetAllowedPluginForOpenChannelToPlugin, |
357 base::Unretained(this), params, url, mime_type, client)); | 345 base::Unretained(this), params, url, mime_type, client)); |
358 } | 346 } |
359 | 347 |
360 void PluginServiceImpl::OpenChannelToPpapiPlugin( | 348 void PluginServiceImpl::OpenChannelToPpapiPlugin( |
361 int render_process_id, | |
362 const FilePath& plugin_path, | 349 const FilePath& plugin_path, |
363 const FilePath& profile_data_directory, | 350 const FilePath& profile_data_directory, |
364 PpapiPluginProcessHost::PluginClient* client) { | 351 PpapiPluginProcessHost::PluginClient* client) { |
365 PpapiPluginProcessHost* plugin_host = FindOrStartPpapiPluginProcess( | 352 PpapiPluginProcessHost* plugin_host = FindOrStartPpapiPluginProcess( |
366 render_process_id, plugin_path, profile_data_directory, client); | 353 plugin_path, profile_data_directory, client); |
367 if (plugin_host) { | 354 if (plugin_host) { |
368 plugin_host->OpenChannelToPlugin(client); | 355 plugin_host->OpenChannelToPlugin(client); |
369 } else { | 356 } else { |
370 // Send error. | 357 // Send error. |
371 client->OnPpapiChannelOpened(IPC::ChannelHandle(), base::kNullProcessId, 0); | 358 client->OnPpapiChannelOpened(IPC::ChannelHandle(), base::kNullProcessId, 0); |
372 } | 359 } |
373 } | 360 } |
374 | 361 |
375 void PluginServiceImpl::OpenChannelToPpapiBroker( | 362 void PluginServiceImpl::OpenChannelToPpapiBroker( |
376 int render_process_id, | |
377 const FilePath& path, | 363 const FilePath& path, |
378 PpapiPluginProcessHost::BrokerClient* client) { | 364 PpapiPluginProcessHost::BrokerClient* client) { |
379 PpapiPluginProcessHost* plugin_host = FindOrStartPpapiBrokerProcess( | 365 PpapiPluginProcessHost* plugin_host = FindOrStartPpapiBrokerProcess(path); |
380 render_process_id, path); | |
381 if (plugin_host) { | 366 if (plugin_host) { |
382 plugin_host->OpenChannelToPlugin(client); | 367 plugin_host->OpenChannelToPlugin(client); |
383 } else { | 368 } else { |
384 // Send error. | 369 // Send error. |
385 client->OnPpapiChannelOpened(IPC::ChannelHandle(), base::kNullProcessId, 0); | 370 client->OnPpapiChannelOpened(IPC::ChannelHandle(), base::kNullProcessId, 0); |
386 } | 371 } |
387 } | 372 } |
388 | 373 |
389 void PluginServiceImpl::CancelOpenChannelToNpapiPlugin( | 374 void PluginServiceImpl::CancelOpenChannelToNpapiPlugin( |
390 PluginProcessHost::Client* client) { | 375 PluginProcessHost::Client* client) { |
(...skipping 28 matching lines...) Expand all Loading... |
419 url, page_url, mime_type, allow_wildcard, | 404 url, page_url, mime_type, allow_wildcard, |
420 NULL, &info, NULL); | 405 NULL, &info, NULL); |
421 FilePath plugin_path; | 406 FilePath plugin_path; |
422 if (found) | 407 if (found) |
423 plugin_path = info.path; | 408 plugin_path = info.path; |
424 | 409 |
425 // Now we jump back to the IO thread to finish opening the channel. | 410 // Now we jump back to the IO thread to finish opening the channel. |
426 BrowserThread::PostTask( | 411 BrowserThread::PostTask( |
427 BrowserThread::IO, FROM_HERE, | 412 BrowserThread::IO, FROM_HERE, |
428 base::Bind(&PluginServiceImpl::FinishOpenChannelToPlugin, | 413 base::Bind(&PluginServiceImpl::FinishOpenChannelToPlugin, |
429 base::Unretained(this), | 414 base::Unretained(this), plugin_path, client)); |
430 render_process_id, | |
431 plugin_path, | |
432 client)); | |
433 } | 415 } |
434 | 416 |
435 void PluginServiceImpl::FinishOpenChannelToPlugin( | 417 void PluginServiceImpl::FinishOpenChannelToPlugin( |
436 int render_process_id, | |
437 const FilePath& plugin_path, | 418 const FilePath& plugin_path, |
438 PluginProcessHost::Client* client) { | 419 PluginProcessHost::Client* client) { |
439 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 420 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
440 | 421 |
441 // Make sure it hasn't been canceled yet. | 422 // Make sure it hasn't been canceled yet. |
442 if (!ContainsKey(pending_plugin_clients_, client)) | 423 if (!ContainsKey(pending_plugin_clients_, client)) |
443 return; | 424 return; |
444 pending_plugin_clients_.erase(client); | 425 pending_plugin_clients_.erase(client); |
445 | 426 |
446 PluginProcessHost* plugin_host = FindOrStartNpapiPluginProcess( | 427 PluginProcessHost* plugin_host = FindOrStartNpapiPluginProcess(plugin_path); |
447 render_process_id, plugin_path); | |
448 if (plugin_host) { | 428 if (plugin_host) { |
449 client->OnFoundPluginProcessHost(plugin_host); | 429 client->OnFoundPluginProcessHost(plugin_host); |
450 plugin_host->OpenChannelToPlugin(client); | 430 plugin_host->OpenChannelToPlugin(client); |
451 } else { | 431 } else { |
452 client->OnError(); | 432 client->OnError(); |
453 } | 433 } |
454 } | 434 } |
455 | 435 |
456 bool PluginServiceImpl::GetPluginInfoArray( | 436 bool PluginServiceImpl::GetPluginInfoArray( |
457 const GURL& url, | 437 const GURL& url, |
(...skipping 18 matching lines...) Expand all Loading... |
476 webkit::WebPluginInfo* info, | 456 webkit::WebPluginInfo* info, |
477 std::string* actual_mime_type) { | 457 std::string* actual_mime_type) { |
478 std::vector<webkit::WebPluginInfo> plugins; | 458 std::vector<webkit::WebPluginInfo> plugins; |
479 std::vector<std::string> mime_types; | 459 std::vector<std::string> mime_types; |
480 bool stale = GetPluginInfoArray( | 460 bool stale = GetPluginInfoArray( |
481 url, mime_type, allow_wildcard, &plugins, &mime_types); | 461 url, mime_type, allow_wildcard, &plugins, &mime_types); |
482 if (is_stale) | 462 if (is_stale) |
483 *is_stale = stale; | 463 *is_stale = stale; |
484 | 464 |
485 for (size_t i = 0; i < plugins.size(); ++i) { | 465 for (size_t i = 0; i < plugins.size(); ++i) { |
486 if (!filter_ || filter_->IsPluginEnabled(render_process_id, | 466 if (!filter_ || filter_->ShouldUsePlugin(render_process_id, |
487 render_view_id, | 467 render_view_id, |
488 context, | 468 context, |
489 url, | 469 url, |
490 page_url, | 470 page_url, |
491 &plugins[i])) { | 471 &plugins[i])) { |
492 *info = plugins[i]; | 472 *info = plugins[i]; |
493 if (actual_mime_type) | 473 if (actual_mime_type) |
494 *actual_mime_type = mime_types[i]; | 474 *actual_mime_type = mime_types[i]; |
495 return true; | 475 return true; |
496 } | 476 } |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
740 void PluginServiceImpl::GetInternalPlugins( | 720 void PluginServiceImpl::GetInternalPlugins( |
741 std::vector<webkit::WebPluginInfo>* plugins) { | 721 std::vector<webkit::WebPluginInfo>* plugins) { |
742 plugin_list_->GetInternalPlugins(plugins); | 722 plugin_list_->GetInternalPlugins(plugins); |
743 } | 723 } |
744 | 724 |
745 webkit::npapi::PluginList* PluginServiceImpl::GetPluginList() { | 725 webkit::npapi::PluginList* PluginServiceImpl::GetPluginList() { |
746 return plugin_list_; | 726 return plugin_list_; |
747 } | 727 } |
748 | 728 |
749 } // namespace content | 729 } // namespace content |
OLD | NEW |