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/renderer/browser_plugin/browser_plugin_channel_manager.h" | 5 #include "content/renderer/browser_plugin/browser_plugin_channel_manager.h" |
6 | 6 |
7 #include "base/process_util.h" | 7 #include "base/process_util.h" |
8 #include "content/common/browser_plugin_messages.h" | 8 #include "content/common/browser_plugin_messages.h" |
9 #include "content/common/view_messages.h" | 9 #include "content/common/view_messages.h" |
10 #include "content/renderer/browser_plugin/browser_plugin.h" | 10 #include "content/renderer/browser_plugin/browser_plugin.h" |
11 #include "content/renderer/browser_plugin/guest_to_embedder_channel.h" | 11 #include "content/renderer/browser_plugin/guest_to_embedder_channel.h" |
12 #include "content/renderer/render_thread_impl.h" | 12 #include "content/renderer/render_thread_impl.h" |
13 #include "content/renderer/render_view_impl.h" | 13 #include "content/renderer/render_view_impl.h" |
14 #include "ppapi/c/pp_instance.h" | 14 #include "ppapi/c/pp_instance.h" |
15 | 15 |
16 namespace content { | 16 namespace content { |
17 | 17 |
18 BrowserPluginChannelManager::BrowserPluginChannelManager() { | 18 BrowserPluginChannelManager::BrowserPluginChannelManager() { |
19 } | 19 } |
20 | 20 |
21 BrowserPluginChannelManager::~BrowserPluginChannelManager() { | 21 BrowserPluginChannelManager::~BrowserPluginChannelManager() { |
22 } | 22 } |
23 | 23 |
24 void BrowserPluginChannelManager::CreateRenderView( | 24 void BrowserPluginChannelManager::CreateRenderView( |
25 const ViewMsg_New_Params& params) { | 25 const ViewMsg_New_Params& params) { |
26 IPC::ChannelHandle plugin_handle; | 26 IPC::ChannelHandle embedder_channel_handle; |
27 plugin_handle.name = | 27 embedder_channel_handle.name = |
28 IPC::Channel::GenerateVerifiedChannelID(params.embedder_channel_name); | 28 IPC::Channel::GenerateVerifiedChannelID(params.embedder_channel_name); |
29 bool success = true; | 29 bool success = true; |
30 scoped_refptr<GuestToEmbedderChannel> channel = | 30 scoped_refptr<GuestToEmbedderChannel> channel = |
31 GetChannelByName(params.embedder_channel_name); | 31 GetChannelByName(params.embedder_channel_name); |
32 if (!channel) { | 32 if (!channel) { |
33 channel = new GuestToEmbedderChannel(params.embedder_channel_name); | 33 channel = new GuestToEmbedderChannel(params.embedder_channel_name, |
34 success = channel->InitChannel(plugin_handle); | 34 embedder_channel_handle.name); |
| 35 success = channel->InitChannel(embedder_channel_handle); |
35 | 36 |
36 #if defined(OS_POSIX) | 37 #if defined(OS_POSIX) |
37 // On POSIX, transfer ownership of the renderer-side (client) FD. | 38 // On POSIX, transfer ownership of the renderer-side (client) FD. |
38 // This ensures this process will be notified when it is closed even if a | 39 // This ensures this process will be notified when it is closed even if a |
39 // connection is not established. | 40 // connection is not established. |
40 plugin_handle.socket = | 41 embedder_channel_handle.socket = |
41 base::FileDescriptor(channel->TakeRendererFD(), true); | 42 base::FileDescriptor(channel->TakeRendererFD(), true); |
42 if (plugin_handle.socket.fd == -1) | 43 if (embedder_channel_handle.socket.fd == -1) |
43 success = false; | 44 success = false; |
44 #endif | 45 #endif |
45 DCHECK(success); | 46 DCHECK(success); |
46 embedder_channels_[params.embedder_channel_name] = channel; | 47 embedder_channels_[params.embedder_channel_name] = channel; |
47 } | 48 } |
48 DCHECK(pending_guests_.find(params.view_id) == | 49 RenderViewImpl* render_view = |
49 pending_guests_.end()); | |
50 pending_guests_[params.view_id] = | |
51 RenderViewImpl::Create( | 50 RenderViewImpl::Create( |
52 params.parent_window, | 51 params.parent_window, |
53 params.opener_route_id, | 52 params.opener_route_id, |
54 params.renderer_preferences, | 53 params.renderer_preferences, |
55 params.web_preferences, | 54 params.web_preferences, |
56 new SharedRenderViewCounter(0), | 55 new SharedRenderViewCounter(0), |
57 params.view_id, | 56 params.view_id, |
58 params.surface_id, | 57 params.surface_id, |
59 params.session_storage_namespace_id, | 58 params.session_storage_namespace_id, |
60 params.frame_name, | 59 params.frame_name, |
61 false, | 60 false, |
62 params.swapped_out, | 61 params.swapped_out, |
63 params.next_page_id, | 62 params.next_page_id, |
64 params.screen_info, | 63 params.screen_info, |
65 channel, | 64 channel, |
66 params.accessibility_mode)->AsWeakPtr(); | 65 params.accessibility_mode); |
| 66 ReportChannelToEmbedder(render_view, |
| 67 embedder_channel_handle, |
| 68 params.embedder_channel_name, |
| 69 params.embedder_container_id); |
| 70 } |
| 71 |
| 72 void BrowserPluginChannelManager::ReportChannelToEmbedder( |
| 73 RenderViewImpl* render_view, |
| 74 const IPC::ChannelHandle& embedder_channel_handle, |
| 75 const std::string& embedder_channel_name, |
| 76 int embedder_container_id) { |
| 77 std::pair<std::string, int> pending_guests_key = |
| 78 std::make_pair(embedder_channel_name, embedder_container_id); |
| 79 DCHECK(pending_guests_.find(pending_guests_key) == |
| 80 pending_guests_.end()); |
| 81 pending_guests_[pending_guests_key] = render_view->AsWeakPtr(); |
67 RenderThreadImpl::current()->Send( | 82 RenderThreadImpl::current()->Send( |
68 new BrowserPluginHostMsg_ConnectToChannel(params.view_id, | 83 new BrowserPluginHostMsg_ConnectToChannel(render_view->GetRoutingID(), |
69 success ? plugin_handle : IPC::ChannelHandle())); | 84 embedder_channel_handle)); |
70 } | 85 } |
71 | 86 |
72 bool BrowserPluginChannelManager::OnControlMessageReceived( | 87 bool BrowserPluginChannelManager::OnControlMessageReceived( |
73 const IPC::Message& message) { | 88 const IPC::Message& message) { |
74 bool handled = true; | 89 bool handled = true; |
75 IPC_BEGIN_MESSAGE_MAP(BrowserPluginChannelManager, message) | 90 IPC_BEGIN_MESSAGE_MAP(BrowserPluginChannelManager, message) |
76 IPC_MESSAGE_HANDLER(BrowserPluginMsg_CompleteNavigation, | |
77 OnCompleteNavigation) | |
78 IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadGuest, OnLoadGuest) | 91 IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadGuest, OnLoadGuest) |
79 IPC_MESSAGE_UNHANDLED(handled = false) | 92 IPC_MESSAGE_UNHANDLED(handled = false) |
80 IPC_END_MESSAGE_MAP() | 93 IPC_END_MESSAGE_MAP() |
81 | 94 |
82 return handled; | 95 return handled; |
83 } | 96 } |
84 | 97 |
85 GuestToEmbedderChannel* BrowserPluginChannelManager::GetChannelByName( | 98 GuestToEmbedderChannel* BrowserPluginChannelManager::GetChannelByName( |
86 const std::string& embedder_channel_name) { | 99 const std::string& embedder_channel_name) { |
87 EmbedderChannelNameToChannelMap::iterator it = | 100 EmbedderChannelNameToChannelMap::iterator it = |
88 embedder_channels_.find(embedder_channel_name); | 101 embedder_channels_.find(embedder_channel_name); |
89 if (it != embedder_channels_.end()) | 102 if (it != embedder_channels_.end()) |
90 return it->second; | 103 return it->second; |
91 return NULL; | 104 return NULL; |
92 } | 105 } |
93 | 106 |
94 void BrowserPluginChannelManager::RemoveChannelByName( | 107 void BrowserPluginChannelManager::RemoveChannelByName( |
95 const std::string& embedder_channel_name) { | 108 const std::string& embedder_channel_name) { |
96 embedder_channels_.erase(embedder_channel_name); | 109 embedder_channels_.erase(embedder_channel_name); |
97 } | 110 } |
98 | 111 |
99 void BrowserPluginChannelManager::OnCompleteNavigation( | 112 void BrowserPluginChannelManager::GuestReady( |
100 int guest_routing_id, | 113 PP_Instance instance, |
101 PP_Instance instance) { | 114 const std::string& embedder_channel_name, |
102 CHECK(pending_guests_.find(guest_routing_id) != | 115 int embedder_container_id) { |
103 pending_guests_.end()); | 116 std::pair<std::string, int> pending_guests_key = |
104 RenderViewImpl* render_view = pending_guests_[guest_routing_id]; | 117 make_pair(embedder_channel_name, embedder_container_id); |
105 pending_guests_.erase(guest_routing_id); | 118 DCHECK(pending_guests_.find(pending_guests_key) != |
| 119 pending_guests_.end()); |
| 120 RenderViewImpl* render_view = pending_guests_[pending_guests_key]; |
| 121 pending_guests_.erase(pending_guests_key); |
106 GuestToEmbedderChannel* channel = render_view->guest_to_embedder_channel(); | 122 GuestToEmbedderChannel* channel = render_view->guest_to_embedder_channel(); |
107 // Associate the RenderView with the provided PP_Instance ID, request the | 123 // Associate the RenderView with the provided PP_Instance ID, request the |
108 // receipt of events, and initialize the graphics context. | 124 // receipt of events, and initialize the graphics context. |
109 channel->AddGuest(instance, render_view); | 125 channel->AddGuest(instance, render_view); |
110 channel->RequestInputEvents(instance); | |
111 render_view->GuestReady(instance); | 126 render_view->GuestReady(instance); |
112 } | 127 } |
113 | 128 |
114 void BrowserPluginChannelManager::OnLoadGuest( | 129 void BrowserPluginChannelManager::OnLoadGuest( |
115 int instance_id, | 130 int instance_id, |
116 int guest_process_id, | 131 int guest_process_id, |
117 const IPC::ChannelHandle& channel_handle) { | 132 const IPC::ChannelHandle& channel_handle) { |
118 BrowserPlugin* browser_plugin = BrowserPlugin::FromID(instance_id); | 133 BrowserPlugin* browser_plugin = BrowserPlugin::FromID(instance_id); |
119 browser_plugin->LoadGuest(guest_process_id, channel_handle); | 134 browser_plugin->LoadGuest(guest_process_id, channel_handle); |
120 } | 135 } |
121 | 136 |
122 } // namespace content | 137 } // namespace content |
OLD | NEW |