| 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/ppapi_plugin_process_host.h" | 5 #include "content/browser/ppapi_plugin_process_host.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/base_switches.h" | 9 #include "base/base_switches.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 11 #include "base/file_path.h" | 11 #include "base/file_path.h" |
| 12 #include "base/process_util.h" | 12 #include "base/process_util.h" |
| 13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
| 14 #include "content/browser/browser_child_process_host_impl.h" | 14 #include "content/browser/browser_child_process_host_impl.h" |
| 15 #include "content/browser/plugin_service_impl.h" | 15 #include "content/browser/plugin_service_impl.h" |
| 16 #include "content/browser/renderer_host/render_message_filter.h" | 16 #include "content/browser/renderer_host/render_message_filter.h" |
| 17 #include "content/common/child_process_host_impl.h" | 17 #include "content/common/child_process_host_impl.h" |
| 18 #include "content/common/child_process_messages.h" | 18 #include "content/common/child_process_messages.h" |
| 19 #include "content/public/browser/content_browser_client.h" | 19 #include "content/public/browser/content_browser_client.h" |
| 20 #include "content/public/common/content_switches.h" | 20 #include "content/public/common/content_switches.h" |
| 21 #include "content/public/common/pepper_plugin_info.h" | 21 #include "content/public/common/pepper_plugin_info.h" |
| 22 #include "content/public/common/process_type.h" | 22 #include "content/public/common/process_type.h" |
| 23 #include "ipc/ipc_switches.h" | 23 #include "ipc/ipc_switches.h" |
| 24 #include "net/base/network_change_notifier.h" | 24 #include "net/base/network_change_notifier.h" |
| 25 #include "ppapi/proxy/ppapi_messages.h" | 25 #include "ppapi/proxy/ppapi_messages.h" |
| 26 #include "ui/base/ui_base_switches.h" | 26 #include "ui/base/ui_base_switches.h" |
| 27 #include "webkit/plugins/plugin_switches.h" | 27 #include "webkit/plugins/plugin_switches.h" |
| 28 | 28 |
| 29 using content::ChildProcessHost; | 29 namespace content { |
| 30 using content::ChildProcessHostImpl; | |
| 31 | 30 |
| 32 class PpapiPluginProcessHost::PluginNetworkObserver | 31 class PpapiPluginProcessHost::PluginNetworkObserver |
| 33 : public net::NetworkChangeNotifier::IPAddressObserver, | 32 : public net::NetworkChangeNotifier::IPAddressObserver, |
| 34 public net::NetworkChangeNotifier::ConnectionTypeObserver { | 33 public net::NetworkChangeNotifier::ConnectionTypeObserver { |
| 35 public: | 34 public: |
| 36 explicit PluginNetworkObserver(PpapiPluginProcessHost* process_host) | 35 explicit PluginNetworkObserver(PpapiPluginProcessHost* process_host) |
| 37 : process_host_(process_host) { | 36 : process_host_(process_host) { |
| 38 net::NetworkChangeNotifier::AddIPAddressObserver(this); | 37 net::NetworkChangeNotifier::AddIPAddressObserver(this); |
| 39 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); | 38 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); |
| 40 } | 39 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 67 }; | 66 }; |
| 68 | 67 |
| 69 PpapiPluginProcessHost::~PpapiPluginProcessHost() { | 68 PpapiPluginProcessHost::~PpapiPluginProcessHost() { |
| 70 DVLOG(1) << "PpapiPluginProcessHost" << (is_broker_ ? "[broker]" : "") | 69 DVLOG(1) << "PpapiPluginProcessHost" << (is_broker_ ? "[broker]" : "") |
| 71 << "~PpapiPluginProcessHost()"; | 70 << "~PpapiPluginProcessHost()"; |
| 72 CancelRequests(); | 71 CancelRequests(); |
| 73 } | 72 } |
| 74 | 73 |
| 75 // static | 74 // static |
| 76 PpapiPluginProcessHost* PpapiPluginProcessHost::CreatePluginHost( | 75 PpapiPluginProcessHost* PpapiPluginProcessHost::CreatePluginHost( |
| 77 const content::PepperPluginInfo& info, | 76 const PepperPluginInfo& info, |
| 78 const FilePath& profile_data_directory, | 77 const FilePath& profile_data_directory, |
| 79 net::HostResolver* host_resolver) { | 78 net::HostResolver* host_resolver) { |
| 80 PpapiPluginProcessHost* plugin_host = new PpapiPluginProcessHost( | 79 PpapiPluginProcessHost* plugin_host = new PpapiPluginProcessHost( |
| 81 info, profile_data_directory, host_resolver); | 80 info, profile_data_directory, host_resolver); |
| 82 if (plugin_host->Init(info)) | 81 if (plugin_host->Init(info)) |
| 83 return plugin_host; | 82 return plugin_host; |
| 84 | 83 |
| 85 NOTREACHED(); // Init is not expected to fail. | 84 NOTREACHED(); // Init is not expected to fail. |
| 86 return NULL; | 85 return NULL; |
| 87 } | 86 } |
| 88 | 87 |
| 89 // static | 88 // static |
| 90 PpapiPluginProcessHost* PpapiPluginProcessHost::CreateBrokerHost( | 89 PpapiPluginProcessHost* PpapiPluginProcessHost::CreateBrokerHost( |
| 91 const content::PepperPluginInfo& info) { | 90 const PepperPluginInfo& info) { |
| 92 PpapiPluginProcessHost* plugin_host = | 91 PpapiPluginProcessHost* plugin_host = |
| 93 new PpapiPluginProcessHost(); | 92 new PpapiPluginProcessHost(); |
| 94 if (plugin_host->Init(info)) | 93 if (plugin_host->Init(info)) |
| 95 return plugin_host; | 94 return plugin_host; |
| 96 | 95 |
| 97 NOTREACHED(); // Init is not expected to fail. | 96 NOTREACHED(); // Init is not expected to fail. |
| 98 return NULL; | 97 return NULL; |
| 99 } | 98 } |
| 100 | 99 |
| 101 // static | 100 // static |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 // be run once the channel is open. | 150 // be run once the channel is open. |
| 152 pending_requests_.push_back(client); | 151 pending_requests_.push_back(client); |
| 153 return; | 152 return; |
| 154 } | 153 } |
| 155 | 154 |
| 156 // We already have an open channel, send a request right away to plugin. | 155 // We already have an open channel, send a request right away to plugin. |
| 157 RequestPluginChannel(client); | 156 RequestPluginChannel(client); |
| 158 } | 157 } |
| 159 | 158 |
| 160 PpapiPluginProcessHost::PpapiPluginProcessHost( | 159 PpapiPluginProcessHost::PpapiPluginProcessHost( |
| 161 const content::PepperPluginInfo& info, | 160 const PepperPluginInfo& info, |
| 162 const FilePath& profile_data_directory, | 161 const FilePath& profile_data_directory, |
| 163 net::HostResolver* host_resolver) | 162 net::HostResolver* host_resolver) |
| 164 : permissions_( | 163 : permissions_( |
| 165 ppapi::PpapiPermissions::GetForCommandLine(info.permissions)), | 164 ppapi::PpapiPermissions::GetForCommandLine(info.permissions)), |
| 166 network_observer_(new PluginNetworkObserver(this)), | 165 network_observer_(new PluginNetworkObserver(this)), |
| 167 profile_data_directory_(profile_data_directory), | 166 profile_data_directory_(profile_data_directory), |
| 168 is_broker_(false) { | 167 is_broker_(false) { |
| 169 process_.reset(new BrowserChildProcessHostImpl( | 168 process_.reset(new BrowserChildProcessHostImpl( |
| 170 content::PROCESS_TYPE_PPAPI_PLUGIN, this)); | 169 PROCESS_TYPE_PPAPI_PLUGIN, this)); |
| 171 | 170 |
| 172 filter_ = new PepperMessageFilter(PepperMessageFilter::PLUGIN, | 171 filter_ = new PepperMessageFilter(PepperMessageFilter::PLUGIN, |
| 173 host_resolver); | 172 host_resolver); |
| 174 | 173 |
| 175 host_impl_ = new content::BrowserPpapiHostImpl(this, permissions_); | 174 host_impl_ = new BrowserPpapiHostImpl(this, permissions_); |
| 176 | 175 |
| 177 file_filter_ = new PepperTrustedFileMessageFilter( | 176 file_filter_ = new PepperTrustedFileMessageFilter( |
| 178 process_->GetData().id, info.name, profile_data_directory); | 177 process_->GetData().id, info.name, profile_data_directory); |
| 179 | 178 |
| 180 process_->GetHost()->AddFilter(filter_.get()); | 179 process_->GetHost()->AddFilter(filter_.get()); |
| 181 process_->GetHost()->AddFilter(file_filter_.get()); | 180 process_->GetHost()->AddFilter(file_filter_.get()); |
| 182 process_->GetHost()->AddFilter(host_impl_.get()); | 181 process_->GetHost()->AddFilter(host_impl_.get()); |
| 183 | 182 |
| 184 content::GetContentClient()->browser()->DidCreatePpapiPlugin(host_impl_); | 183 GetContentClient()->browser()->DidCreatePpapiPlugin(host_impl_); |
| 185 } | 184 } |
| 186 | 185 |
| 187 PpapiPluginProcessHost::PpapiPluginProcessHost() | 186 PpapiPluginProcessHost::PpapiPluginProcessHost() |
| 188 : is_broker_(true) { | 187 : is_broker_(true) { |
| 189 process_.reset(new BrowserChildProcessHostImpl( | 188 process_.reset(new BrowserChildProcessHostImpl( |
| 190 content::PROCESS_TYPE_PPAPI_BROKER, this)); | 189 PROCESS_TYPE_PPAPI_BROKER, this)); |
| 191 | 190 |
| 192 ppapi::PpapiPermissions permissions; // No permissions. | 191 ppapi::PpapiPermissions permissions; // No permissions. |
| 193 host_impl_ = new content::BrowserPpapiHostImpl(this, permissions); | 192 host_impl_ = new BrowserPpapiHostImpl(this, permissions); |
| 194 } | 193 } |
| 195 | 194 |
| 196 bool PpapiPluginProcessHost::Init(const content::PepperPluginInfo& info) { | 195 bool PpapiPluginProcessHost::Init(const PepperPluginInfo& info) { |
| 197 plugin_path_ = info.path; | 196 plugin_path_ = info.path; |
| 198 if (info.name.empty()) { | 197 if (info.name.empty()) { |
| 199 process_->SetName(plugin_path_.BaseName().LossyDisplayName()); | 198 process_->SetName(plugin_path_.BaseName().LossyDisplayName()); |
| 200 } else { | 199 } else { |
| 201 process_->SetName(UTF8ToUTF16(info.name)); | 200 process_->SetName(UTF8ToUTF16(info.name)); |
| 202 } | 201 } |
| 203 | 202 |
| 204 std::string channel_id = process_->GetHost()->CreateChannel(); | 203 std::string channel_id = process_->GetHost()->CreateChannel(); |
| 205 if (channel_id.empty()) | 204 if (channel_id.empty()) |
| 206 return false; | 205 return false; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 switches::kEnableSandboxLogging, | 240 switches::kEnableSandboxLogging, |
| 242 #endif | 241 #endif |
| 243 switches::kNoSandbox, | 242 switches::kNoSandbox, |
| 244 switches::kPpapiFlashArgs, | 243 switches::kPpapiFlashArgs, |
| 245 switches::kPpapiStartupDialog, | 244 switches::kPpapiStartupDialog, |
| 246 }; | 245 }; |
| 247 cmd_line->CopySwitchesFrom(browser_command_line, kPluginForwardSwitches, | 246 cmd_line->CopySwitchesFrom(browser_command_line, kPluginForwardSwitches, |
| 248 arraysize(kPluginForwardSwitches)); | 247 arraysize(kPluginForwardSwitches)); |
| 249 } | 248 } |
| 250 | 249 |
| 251 std::string locale = | 250 std::string locale = GetContentClient()->browser()->GetApplicationLocale(); |
| 252 content::GetContentClient()->browser()->GetApplicationLocale(); | |
| 253 if (!locale.empty()) { | 251 if (!locale.empty()) { |
| 254 // Pass on the locale so the plugin will know what language we're using. | 252 // Pass on the locale so the plugin will know what language we're using. |
| 255 cmd_line->AppendSwitchASCII(switches::kLang, locale); | 253 cmd_line->AppendSwitchASCII(switches::kLang, locale); |
| 256 } | 254 } |
| 257 | 255 |
| 258 if (!plugin_launcher.empty()) | 256 if (!plugin_launcher.empty()) |
| 259 cmd_line->PrependWrapper(plugin_launcher); | 257 cmd_line->PrependWrapper(plugin_launcher); |
| 260 | 258 |
| 261 // On posix, never use the zygote for the broker. Also, only use the zygote if | 259 // On posix, never use the zygote for the broker. Also, only use the zygote if |
| 262 // the plugin is sandboxed, and we are not using a plugin launcher - having a | 260 // the plugin is sandboxed, and we are not using a plugin launcher - having a |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 if (sent_requests_.empty()) | 357 if (sent_requests_.empty()) |
| 360 return; | 358 return; |
| 361 | 359 |
| 362 // All requests should be processed FIFO, so the next item in the | 360 // All requests should be processed FIFO, so the next item in the |
| 363 // sent_requests_ queue should be the one that the plugin just created. | 361 // sent_requests_ queue should be the one that the plugin just created. |
| 364 Client* client = sent_requests_.front(); | 362 Client* client = sent_requests_.front(); |
| 365 sent_requests_.pop(); | 363 sent_requests_.pop(); |
| 366 | 364 |
| 367 client->OnPpapiChannelOpened(channel_handle, process_->GetData().id); | 365 client->OnPpapiChannelOpened(channel_handle, process_->GetData().id); |
| 368 } | 366 } |
| 367 |
| 368 } // namespace content |
| OLD | NEW |