| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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/plugin_process_host.h" | 5 #include "chrome/browser/plugin_process_host.h" |
| 6 | 6 |
| 7 #include <windows.h> | 7 #include <windows.h> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 #include "chrome/common/debug_flags.h" | 30 #include "chrome/common/debug_flags.h" |
| 31 #include "chrome/common/ipc_logging.h" | 31 #include "chrome/common/ipc_logging.h" |
| 32 #include "chrome/common/logging_chrome.h" | 32 #include "chrome/common/logging_chrome.h" |
| 33 #include "chrome/common/notification_service.h" | 33 #include "chrome/common/notification_service.h" |
| 34 #include "chrome/common/plugin_messages.h" | 34 #include "chrome/common/plugin_messages.h" |
| 35 #include "chrome/common/process_watcher.h" | 35 #include "chrome/common/process_watcher.h" |
| 36 #include "chrome/common/render_messages.h" | 36 #include "chrome/common/render_messages.h" |
| 37 #include "chrome/common/win_util.h" | 37 #include "chrome/common/win_util.h" |
| 38 #include "net/base/cookie_monster.h" | 38 #include "net/base/cookie_monster.h" |
| 39 #include "net/base/io_buffer.h" | 39 #include "net/base/io_buffer.h" |
| 40 #include "net/proxy/proxy_service.h" | |
| 41 #include "net/url_request/url_request.h" | 40 #include "net/url_request/url_request.h" |
| 42 #include "sandbox/src/sandbox.h" | 41 #include "sandbox/src/sandbox.h" |
| 43 #include "webkit/glue/plugins/plugin_constants_win.h" | 42 #include "webkit/glue/plugins/plugin_constants_win.h" |
| 44 | 43 |
| 45 static const char kDefaultPluginFinderURL[] = | 44 static const char kDefaultPluginFinderURL[] = |
| 46 "http://dl.google.com/chrome/plugins/plugins2.xml"; | 45 "http://dl.google.com/chrome/plugins/plugins2.xml"; |
| 47 | 46 |
| 48 // The NotificationTask is used to notify about plugin process connection/ | 47 // The NotificationTask is used to notify about plugin process connection/ |
| 49 // disconnection. It is needed because the notifications in the | 48 // disconnection. It is needed because the notifications in the |
| 50 // NotificationService must happen in the main thread. | 49 // NotificationService must happen in the main thread. |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 download_file_data.dwData = success; | 292 download_file_data.dwData = success; |
| 294 | 293 |
| 295 if (::IsWindow(download_file_caller_window_)) { | 294 if (::IsWindow(download_file_caller_window_)) { |
| 296 ::SendMessage(download_file_caller_window_, WM_COPYDATA, NULL, | 295 ::SendMessage(download_file_caller_window_, WM_COPYDATA, NULL, |
| 297 reinterpret_cast<LPARAM>(&download_file_data)); | 296 reinterpret_cast<LPARAM>(&download_file_data)); |
| 298 } | 297 } |
| 299 // Don't access any members after this. | 298 // Don't access any members after this. |
| 300 delete this; | 299 delete this; |
| 301 } | 300 } |
| 302 | 301 |
| 303 // The following class is a helper to handle ProxyResolve IPC requests. | |
| 304 // It is responsible for initiating an asynchronous proxy resolve request, | |
| 305 // and will send out the IPC response on completion then delete itself. | |
| 306 // Should the PluginProcessHost be destroyed while a proxy resolve request | |
| 307 // is in progress, the request will not be canceled. However once it completes | |
| 308 // it will see that it has been revoked and delete itself. | |
| 309 // TODO(eroman): This could leak if ProxyService is deleted while request is | |
| 310 // outstanding. | |
| 311 class PluginResolveProxyHelper : RevocableStore::Revocable { | |
| 312 public: | |
| 313 // Create a helper that writes its response through |plugin_host|. | |
| 314 PluginResolveProxyHelper(PluginProcessHost* plugin_host) | |
| 315 : RevocableStore::Revocable(&plugin_host->revocable_store_), | |
| 316 plugin_host_(plugin_host), | |
| 317 reply_msg_(NULL), | |
| 318 ALLOW_THIS_IN_INITIALIZER_LIST(callback_( | |
| 319 this, &PluginResolveProxyHelper::OnProxyResolveCompleted)) { | |
| 320 } | |
| 321 | |
| 322 // Completion callback for ProxyService. | |
| 323 void OnProxyResolveCompleted(int result) { | |
| 324 if (!revoked()) { | |
| 325 PluginProcessHostMsg_ResolveProxy::WriteReplyParams( | |
| 326 reply_msg_, result, proxy_info_.GetAnnotatedProxyList()); | |
| 327 plugin_host_->Send(reply_msg_); | |
| 328 } | |
| 329 | |
| 330 delete this; | |
| 331 }; | |
| 332 | |
| 333 // Resolve the proxy for |url| using |proxy_service|. Write the response | |
| 334 // to |reply_msg|. | |
| 335 void Start(net::ProxyService* proxy_service, | |
| 336 const GURL& url, | |
| 337 IPC::Message* reply_msg) { | |
| 338 reply_msg_ = reply_msg; | |
| 339 int rv = proxy_service->ResolveProxy( | |
| 340 url, &proxy_info_, &callback_, NULL); | |
| 341 if (rv != net::ERR_IO_PENDING) | |
| 342 OnProxyResolveCompleted(rv); | |
| 343 } | |
| 344 | |
| 345 private: | |
| 346 // |plugin_host_| is only valid if !this->revoked(). | |
| 347 PluginProcessHost* plugin_host_; | |
| 348 IPC::Message* reply_msg_; | |
| 349 net::CompletionCallbackImpl<PluginResolveProxyHelper> callback_; | |
| 350 net::ProxyInfo proxy_info_; | |
| 351 }; | |
| 352 | |
| 353 | |
| 354 // Sends the reply to the create window message on the IO thread. | 302 // Sends the reply to the create window message on the IO thread. |
| 355 class SendReplyTask : public Task { | 303 class SendReplyTask : public Task { |
| 356 public: | 304 public: |
| 357 SendReplyTask(FilePath plugin_path, IPC::Message* reply_msg) | 305 SendReplyTask(FilePath plugin_path, IPC::Message* reply_msg) |
| 358 : plugin_path_(plugin_path), reply_msg_(reply_msg) { } | 306 : plugin_path_(plugin_path), reply_msg_(reply_msg) { } |
| 359 | 307 |
| 360 virtual void Run() { | 308 virtual void Run() { |
| 361 PluginProcessHost* plugin = | 309 PluginProcessHost* plugin = |
| 362 PluginService::GetInstance()->FindPluginProcess(plugin_path_); | 310 PluginService::GetInstance()->FindPluginProcess(plugin_path_); |
| 363 if (!plugin) | 311 if (!plugin) |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 | 376 |
| 429 private: | 377 private: |
| 430 HWND window_; | 378 HWND window_; |
| 431 }; | 379 }; |
| 432 | 380 |
| 433 | 381 |
| 434 PluginProcessHost::PluginProcessHost(PluginService* plugin_service) | 382 PluginProcessHost::PluginProcessHost(PluginService* plugin_service) |
| 435 : process_(NULL), | 383 : process_(NULL), |
| 436 opening_channel_(false), | 384 opening_channel_(false), |
| 437 resource_dispatcher_host_(plugin_service->resource_dispatcher_host()), | 385 resource_dispatcher_host_(plugin_service->resource_dispatcher_host()), |
| 386 ALLOW_THIS_IN_INITIALIZER_LIST(resolve_proxy_msg_helper_(this, NULL)), |
| 438 plugin_service_(plugin_service) { | 387 plugin_service_(plugin_service) { |
| 439 DCHECK(resource_dispatcher_host_); | 388 DCHECK(resource_dispatcher_host_); |
| 440 } | 389 } |
| 441 | 390 |
| 442 PluginProcessHost::~PluginProcessHost() { | 391 PluginProcessHost::~PluginProcessHost() { |
| 443 if (process_.handle()) { | 392 if (process_.handle()) { |
| 444 watcher_.StopWatching(); | 393 watcher_.StopWatching(); |
| 445 ProcessWatcher::EnsureProcessTerminated(process_.handle()); | 394 ProcessWatcher::EnsureProcessTerminated(process_.handle()); |
| 446 } | 395 } |
| 447 } | 396 } |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 807 if (!context) | 756 if (!context) |
| 808 context = Profile::GetDefaultRequestContext(); | 757 context = Profile::GetDefaultRequestContext(); |
| 809 | 758 |
| 810 // Note: We don't have a policy_url check because plugins bypass the | 759 // Note: We don't have a policy_url check because plugins bypass the |
| 811 // third-party cookie blocking. | 760 // third-party cookie blocking. |
| 812 *cookies = context->cookie_store()->GetCookies(url); | 761 *cookies = context->cookie_store()->GetCookies(url); |
| 813 } | 762 } |
| 814 | 763 |
| 815 void PluginProcessHost::OnResolveProxy(const GURL& url, | 764 void PluginProcessHost::OnResolveProxy(const GURL& url, |
| 816 IPC::Message* reply_msg) { | 765 IPC::Message* reply_msg) { |
| 817 // Use the default profile's proxy service. | 766 resolve_proxy_msg_helper_.Start(url, reply_msg); |
| 818 net::ProxyService* proxy_service = | 767 } |
| 819 Profile::GetDefaultRequestContext()->proxy_service(); | |
| 820 | 768 |
| 821 // Kick off a proxy resolve request; writes the response to |reply_msg| | 769 void PluginProcessHost::OnResolveProxyCompleted(IPC::Message* reply_msg, |
| 822 // on completion. The helper's storage will be deleted on completion. | 770 int result, |
| 823 (new PluginResolveProxyHelper(this))->Start(proxy_service, url, reply_msg); | 771 const std::string& proxy_list) { |
| 772 PluginProcessHostMsg_ResolveProxy::WriteReplyParams( |
| 773 reply_msg, result, proxy_list); |
| 774 Send(reply_msg); |
| 824 } | 775 } |
| 825 | 776 |
| 826 void PluginProcessHost::ReplyToRenderer( | 777 void PluginProcessHost::ReplyToRenderer( |
| 827 ResourceMessageFilter* renderer_message_filter, | 778 ResourceMessageFilter* renderer_message_filter, |
| 828 const std::wstring& channel, const FilePath& plugin_path, | 779 const std::wstring& channel, const FilePath& plugin_path, |
| 829 IPC::Message* reply_msg) { | 780 IPC::Message* reply_msg) { |
| 830 ViewHostMsg_OpenChannelToPlugin::WriteReplyParams(reply_msg, channel, | 781 ViewHostMsg_OpenChannelToPlugin::WriteReplyParams(reply_msg, channel, |
| 831 plugin_path); | 782 plugin_path); |
| 832 renderer_message_filter->Send(reply_msg); | 783 renderer_message_filter->Send(reply_msg); |
| 833 } | 784 } |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 935 void PluginProcessHost::OnDestroyWindow(HWND window) { | 886 void PluginProcessHost::OnDestroyWindow(HWND window) { |
| 936 plugin_service_->main_message_loop()->PostTask(FROM_HERE, | 887 plugin_service_->main_message_loop()->PostTask(FROM_HERE, |
| 937 new DestroyWindowTask(window)); | 888 new DestroyWindowTask(window)); |
| 938 } | 889 } |
| 939 | 890 |
| 940 void PluginProcessHost::Shutdown() { | 891 void PluginProcessHost::Shutdown() { |
| 941 | 892 |
| 942 Send(new PluginProcessMsg_BrowserShutdown); | 893 Send(new PluginProcessMsg_BrowserShutdown); |
| 943 } | 894 } |
| 944 | 895 |
| OLD | NEW |