| 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 <stddef.h> |
| 8 |
| 7 #include <string> | 9 #include <string> |
| 8 #include <utility> | 10 #include <utility> |
| 9 | 11 |
| 10 #include "base/base_switches.h" | 12 #include "base/base_switches.h" |
| 11 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 12 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
| 15 #include "base/macros.h" |
| 13 #include "base/metrics/field_trial.h" | 16 #include "base/metrics/field_trial.h" |
| 14 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
| 15 #include "base/strings/utf_string_conversions.h" | 18 #include "base/strings/utf_string_conversions.h" |
| 19 #include "build/build_config.h" |
| 16 #include "content/browser/browser_child_process_host_impl.h" | 20 #include "content/browser/browser_child_process_host_impl.h" |
| 17 #include "content/browser/plugin_service_impl.h" | 21 #include "content/browser/plugin_service_impl.h" |
| 18 #include "content/browser/renderer_host/render_message_filter.h" | 22 #include "content/browser/renderer_host/render_message_filter.h" |
| 19 #include "content/common/child_process_host_impl.h" | 23 #include "content/common/child_process_host_impl.h" |
| 20 #include "content/common/child_process_messages.h" | 24 #include "content/common/child_process_messages.h" |
| 21 #include "content/common/content_switches_internal.h" | 25 #include "content/common/content_switches_internal.h" |
| 22 #include "content/public/browser/content_browser_client.h" | 26 #include "content/public/browser/content_browser_client.h" |
| 23 #include "content/public/common/content_constants.h" | 27 #include "content/public/common/content_constants.h" |
| 24 #include "content/public/common/content_switches.h" | 28 #include "content/public/common/content_switches.h" |
| 25 #include "content/public/common/pepper_plugin_info.h" | 29 #include "content/public/common/pepper_plugin_info.h" |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 if (plugin_host->Init(info)) | 185 if (plugin_host->Init(info)) |
| 182 return plugin_host; | 186 return plugin_host; |
| 183 | 187 |
| 184 NOTREACHED(); // Init is not expected to fail. | 188 NOTREACHED(); // Init is not expected to fail. |
| 185 return NULL; | 189 return NULL; |
| 186 } | 190 } |
| 187 | 191 |
| 188 // static | 192 // static |
| 189 void PpapiPluginProcessHost::DidCreateOutOfProcessInstance( | 193 void PpapiPluginProcessHost::DidCreateOutOfProcessInstance( |
| 190 int plugin_process_id, | 194 int plugin_process_id, |
| 191 int32 pp_instance, | 195 int32_t pp_instance, |
| 192 const PepperRendererInstanceData& instance_data) { | 196 const PepperRendererInstanceData& instance_data) { |
| 193 for (PpapiPluginProcessHostIterator iter; !iter.Done(); ++iter) { | 197 for (PpapiPluginProcessHostIterator iter; !iter.Done(); ++iter) { |
| 194 if (iter->process_.get() && | 198 if (iter->process_.get() && |
| 195 iter->process_->GetData().id == plugin_process_id) { | 199 iter->process_->GetData().id == plugin_process_id) { |
| 196 // Found the plugin. | 200 // Found the plugin. |
| 197 iter->host_impl_->AddInstance(pp_instance, instance_data); | 201 iter->host_impl_->AddInstance(pp_instance, instance_data); |
| 198 return; | 202 return; |
| 199 } | 203 } |
| 200 } | 204 } |
| 201 // We'll see this passed with a 0 process ID for the browser tag stuff that | 205 // We'll see this passed with a 0 process ID for the browser tag stuff that |
| 202 // is currently in the process of being removed. | 206 // is currently in the process of being removed. |
| 203 // | 207 // |
| 204 // TODO(brettw) When old browser tag impl is removed | 208 // TODO(brettw) When old browser tag impl is removed |
| 205 // (PepperPluginDelegateImpl::CreateBrowserPluginModule passes a 0 plugin | 209 // (PepperPluginDelegateImpl::CreateBrowserPluginModule passes a 0 plugin |
| 206 // process ID) this should be converted to a NOTREACHED(). | 210 // process ID) this should be converted to a NOTREACHED(). |
| 207 DCHECK(plugin_process_id == 0) | 211 DCHECK(plugin_process_id == 0) |
| 208 << "Renderer sent a bad plugin process host ID"; | 212 << "Renderer sent a bad plugin process host ID"; |
| 209 } | 213 } |
| 210 | 214 |
| 211 // static | 215 // static |
| 212 void PpapiPluginProcessHost::DidDeleteOutOfProcessInstance( | 216 void PpapiPluginProcessHost::DidDeleteOutOfProcessInstance( |
| 213 int plugin_process_id, | 217 int plugin_process_id, |
| 214 int32 pp_instance) { | 218 int32_t pp_instance) { |
| 215 for (PpapiPluginProcessHostIterator iter; !iter.Done(); ++iter) { | 219 for (PpapiPluginProcessHostIterator iter; !iter.Done(); ++iter) { |
| 216 if (iter->process_.get() && | 220 if (iter->process_.get() && |
| 217 iter->process_->GetData().id == plugin_process_id) { | 221 iter->process_->GetData().id == plugin_process_id) { |
| 218 // Found the plugin. | 222 // Found the plugin. |
| 219 iter->host_impl_->DeleteInstance(pp_instance); | 223 iter->host_impl_->DeleteInstance(pp_instance); |
| 220 return; | 224 return; |
| 221 } | 225 } |
| 222 } | 226 } |
| 223 // Note: It's possible that the plugin process has already been deleted by | 227 // Note: It's possible that the plugin process has already been deleted by |
| 224 // the time this message is received. For example, it could have crashed. | 228 // the time this message is received. For example, it could have crashed. |
| 225 // That's OK, we can just ignore this message. | 229 // That's OK, we can just ignore this message. |
| 226 } | 230 } |
| 227 | 231 |
| 228 // static | 232 // static |
| 229 void PpapiPluginProcessHost::OnPluginInstanceThrottleStateChange( | 233 void PpapiPluginProcessHost::OnPluginInstanceThrottleStateChange( |
| 230 int plugin_process_id, | 234 int plugin_process_id, |
| 231 int32 pp_instance, | 235 int32_t pp_instance, |
| 232 bool is_throttled) { | 236 bool is_throttled) { |
| 233 for (PpapiPluginProcessHostIterator iter; !iter.Done(); ++iter) { | 237 for (PpapiPluginProcessHostIterator iter; !iter.Done(); ++iter) { |
| 234 if (iter->process_.get() && | 238 if (iter->process_.get() && |
| 235 iter->process_->GetData().id == plugin_process_id) { | 239 iter->process_->GetData().id == plugin_process_id) { |
| 236 // Found the plugin. | 240 // Found the plugin. |
| 237 iter->host_impl_->OnThrottleStateChanged(pp_instance, is_throttled); | 241 iter->host_impl_->OnThrottleStateChanged(pp_instance, is_throttled); |
| 238 return; | 242 return; |
| 239 } | 243 } |
| 240 } | 244 } |
| 241 // Note: It's possible that the plugin process has already been deleted by | 245 // Note: It's possible that the plugin process has already been deleted by |
| (...skipping 26 matching lines...) Expand all Loading... |
| 268 | 272 |
| 269 // We already have an open channel, send a request right away to plugin. | 273 // We already have an open channel, send a request right away to plugin. |
| 270 RequestPluginChannel(client); | 274 RequestPluginChannel(client); |
| 271 } | 275 } |
| 272 | 276 |
| 273 PpapiPluginProcessHost::PpapiPluginProcessHost( | 277 PpapiPluginProcessHost::PpapiPluginProcessHost( |
| 274 const PepperPluginInfo& info, | 278 const PepperPluginInfo& info, |
| 275 const base::FilePath& profile_data_directory) | 279 const base::FilePath& profile_data_directory) |
| 276 : profile_data_directory_(profile_data_directory), | 280 : profile_data_directory_(profile_data_directory), |
| 277 is_broker_(false) { | 281 is_broker_(false) { |
| 278 uint32 base_permissions = info.permissions; | 282 uint32_t base_permissions = info.permissions; |
| 279 | 283 |
| 280 // We don't have to do any whitelisting for APIs in this process host, so | 284 // We don't have to do any whitelisting for APIs in this process host, so |
| 281 // don't bother passing a browser context or document url here. | 285 // don't bother passing a browser context or document url here. |
| 282 if (GetContentClient()->browser()->IsPluginAllowedToUseDevChannelAPIs( | 286 if (GetContentClient()->browser()->IsPluginAllowedToUseDevChannelAPIs( |
| 283 NULL, GURL())) | 287 NULL, GURL())) |
| 284 base_permissions |= ppapi::PERMISSION_DEV_CHANNEL; | 288 base_permissions |= ppapi::PERMISSION_DEV_CHANNEL; |
| 285 permissions_ = ppapi::PpapiPermissions::GetForCommandLine(base_permissions); | 289 permissions_ = ppapi::PpapiPermissions::GetForCommandLine(base_permissions); |
| 286 | 290 |
| 287 process_.reset(new BrowserChildProcessHostImpl( | 291 process_.reset(new BrowserChildProcessHostImpl( |
| 288 PROCESS_TYPE_PPAPI_PLUGIN, this)); | 292 PROCESS_TYPE_PPAPI_PLUGIN, this)); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 IPC_BEGIN_MESSAGE_MAP(PpapiPluginProcessHost, msg) | 459 IPC_BEGIN_MESSAGE_MAP(PpapiPluginProcessHost, msg) |
| 456 IPC_MESSAGE_HANDLER(PpapiHostMsg_ChannelCreated, | 460 IPC_MESSAGE_HANDLER(PpapiHostMsg_ChannelCreated, |
| 457 OnRendererPluginChannelCreated) | 461 OnRendererPluginChannelCreated) |
| 458 IPC_MESSAGE_UNHANDLED(handled = false) | 462 IPC_MESSAGE_UNHANDLED(handled = false) |
| 459 IPC_END_MESSAGE_MAP() | 463 IPC_END_MESSAGE_MAP() |
| 460 DCHECK(handled); | 464 DCHECK(handled); |
| 461 return handled; | 465 return handled; |
| 462 } | 466 } |
| 463 | 467 |
| 464 // Called when the browser <--> plugin channel has been established. | 468 // Called when the browser <--> plugin channel has been established. |
| 465 void PpapiPluginProcessHost::OnChannelConnected(int32 peer_pid) { | 469 void PpapiPluginProcessHost::OnChannelConnected(int32_t peer_pid) { |
| 466 // This will actually load the plugin. Errors will actually not be reported | 470 // This will actually load the plugin. Errors will actually not be reported |
| 467 // back at this point. Instead, the plugin will fail to establish the | 471 // back at this point. Instead, the plugin will fail to establish the |
| 468 // connections when we request them on behalf of the renderer(s). | 472 // connections when we request them on behalf of the renderer(s). |
| 469 Send(new PpapiMsg_LoadPlugin(plugin_path_, permissions_)); | 473 Send(new PpapiMsg_LoadPlugin(plugin_path_, permissions_)); |
| 470 | 474 |
| 471 // Process all pending channel requests from the renderers. | 475 // Process all pending channel requests from the renderers. |
| 472 for (size_t i = 0; i < pending_requests_.size(); i++) | 476 for (size_t i = 0; i < pending_requests_.size(); i++) |
| 473 RequestPluginChannel(pending_requests_[i]); | 477 RequestPluginChannel(pending_requests_[i]); |
| 474 pending_requests_.clear(); | 478 pending_requests_.clear(); |
| 475 } | 479 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 512 // sent_requests_ queue should be the one that the plugin just created. | 516 // sent_requests_ queue should be the one that the plugin just created. |
| 513 Client* client = sent_requests_.front(); | 517 Client* client = sent_requests_.front(); |
| 514 sent_requests_.pop(); | 518 sent_requests_.pop(); |
| 515 | 519 |
| 516 const ChildProcessData& data = process_->GetData(); | 520 const ChildProcessData& data = process_->GetData(); |
| 517 client->OnPpapiChannelOpened(channel_handle, base::GetProcId(data.handle), | 521 client->OnPpapiChannelOpened(channel_handle, base::GetProcId(data.handle), |
| 518 data.id); | 522 data.id); |
| 519 } | 523 } |
| 520 | 524 |
| 521 } // namespace content | 525 } // namespace content |
| OLD | NEW |