OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "chrome/browser/renderer_host/buffered_resource_handler.h" | 5 #include "chrome/browser/renderer_host/buffered_resource_handler.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/histogram.h" | 9 #include "base/histogram.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 | 397 |
398 // Schedule plugin loading on the file thread. | 398 // Schedule plugin loading on the file thread. |
399 // Note: it's possible that the only reference to this object is the task. If | 399 // Note: it's possible that the only reference to this object is the task. If |
400 // If the task executes on the file thread, and before it returns, the task it | 400 // If the task executes on the file thread, and before it returns, the task it |
401 // posts to the IO thread runs, then this object will get destructed on the | 401 // posts to the IO thread runs, then this object will get destructed on the |
402 // file thread. This breaks assumptions in other message handlers (i.e. when | 402 // file thread. This breaks assumptions in other message handlers (i.e. when |
403 // unregistering with NotificationService in the destructor). | 403 // unregistering with NotificationService in the destructor). |
404 AddRef(); | 404 AddRef(); |
405 ChromeThread::PostTask( | 405 ChromeThread::PostTask( |
406 ChromeThread::FILE, FROM_HERE, | 406 ChromeThread::FILE, FROM_HERE, |
407 NewRunnableFunction(&BufferedResourceHandler::LoadPlugins, | 407 NewRunnableFunction(&BufferedResourceHandler::LoadPlugins, this)); |
408 this, host_->ui_loop())); | |
409 return true; | 408 return true; |
410 } | 409 } |
411 | 410 |
412 // This test mirrors the decision that WebKit makes in | 411 // This test mirrors the decision that WebKit makes in |
413 // WebFrameLoaderClient::dispatchDecidePolicyForMIMEType. | 412 // WebFrameLoaderClient::dispatchDecidePolicyForMIMEType. |
414 bool BufferedResourceHandler::ShouldDownload(bool* need_plugin_list) { | 413 bool BufferedResourceHandler::ShouldDownload(bool* need_plugin_list) { |
415 if (need_plugin_list) | 414 if (need_plugin_list) |
416 *need_plugin_list = false; | 415 *need_plugin_list = false; |
417 std::string type = StringToLowerASCII(response_->response_head.mime_type); | 416 std::string type = StringToLowerASCII(response_->response_head.mime_type); |
418 std::string disposition; | 417 std::string disposition; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 DCHECK(NPAPI::PluginList::Singleton()->PluginsLoaded()); | 461 DCHECK(NPAPI::PluginList::Singleton()->PluginsLoaded()); |
463 } | 462 } |
464 | 463 |
465 // Finally, check the plugin list. | 464 // Finally, check the plugin list. |
466 WebPluginInfo info; | 465 WebPluginInfo info; |
467 bool allow_wildcard = false; | 466 bool allow_wildcard = false; |
468 return !NPAPI::PluginList::Singleton()->GetPluginInfo( | 467 return !NPAPI::PluginList::Singleton()->GetPluginInfo( |
469 GURL(), type, allow_wildcard, &info, NULL); | 468 GURL(), type, allow_wildcard, &info, NULL); |
470 } | 469 } |
471 | 470 |
472 void BufferedResourceHandler::LoadPlugins(BufferedResourceHandler* handler, | 471 void BufferedResourceHandler::LoadPlugins(BufferedResourceHandler* handler) { |
473 MessageLoop* main_message_loop) { | |
474 std::vector<WebPluginInfo> plugins; | 472 std::vector<WebPluginInfo> plugins; |
475 NPAPI::PluginList::Singleton()->GetPlugins(false, &plugins); | 473 NPAPI::PluginList::Singleton()->GetPlugins(false, &plugins); |
476 | 474 |
477 // Note, we want to get to the IO thread now, but the file thread outlives it | 475 ChromeThread::PostTask( |
478 // so we can't post a task to it directly as it might be in the middle of | 476 ChromeThread::IO, FROM_HERE, |
479 // destruction. So hop through the main thread, where the destruction of the | 477 NewRunnableFunction(&BufferedResourceHandler::OnPluginsLoaded, |
480 // IO thread happens and hence no race conditions exist. | |
481 main_message_loop->PostTask(FROM_HERE, | |
482 NewRunnableFunction(&BufferedResourceHandler::NotifyPluginsLoaded, | |
483 handler)); | 478 handler)); |
484 } | 479 } |
485 | 480 |
486 void BufferedResourceHandler::NotifyPluginsLoaded( | 481 void BufferedResourceHandler::OnPluginsLoaded( |
487 BufferedResourceHandler* handler) { | 482 BufferedResourceHandler* handler) { |
488 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE, | 483 handler->wait_for_plugins_ = false; |
489 NewRunnableMethod(handler, &BufferedResourceHandler::OnPluginsLoaded)); | 484 if (handler->request_) { |
| 485 ResourceDispatcherHostRequestInfo* info = |
| 486 ResourceDispatcherHost::InfoForRequest(handler->request_); |
| 487 handler->host_->PauseRequest(info->child_id(), info->request_id(), false); |
| 488 if (!handler->CompleteResponseStarted(info->request_id(), false)) |
| 489 handler->host_->CancelRequest( |
| 490 info->child_id(), info->request_id(), false); |
| 491 } |
| 492 handler->Release(); |
490 } | 493 } |
491 | |
492 void BufferedResourceHandler::OnPluginsLoaded() { | |
493 wait_for_plugins_ = false; | |
494 if (request_) { | |
495 ResourceDispatcherHostRequestInfo* info = | |
496 ResourceDispatcherHost::InfoForRequest(request_); | |
497 host_->PauseRequest(info->child_id(), info->request_id(), false); | |
498 if (!CompleteResponseStarted(info->request_id(), false)) | |
499 host_->CancelRequest(info->child_id(), info->request_id(), false); | |
500 } | |
501 Release(); | |
502 } | |
OLD | NEW |