Index: chrome/browser/renderer_host/render_message_filter.cc |
=================================================================== |
--- chrome/browser/renderer_host/render_message_filter.cc (revision 74733) |
+++ chrome/browser/renderer_host/render_message_filter.cc (working copy) |
@@ -167,39 +167,62 @@ |
params->supports_alpha_blend = settings.supports_alpha_blend(); |
} |
-class ClearCacheCompletion : public net::CompletionCallback { |
+// Common functionality for converting a sync renderer message to a callback |
+// function in the browser. Derive from this, create it on the heap when |
+// issuing your callback. When done, write your reply parameters into |
+// reply_msg(), and then call SendReplyAndDeleteThis(). |
+class RenderMessageCompletionCallback { |
public: |
- ClearCacheCompletion(IPC::Message* reply_msg, |
- RenderMessageFilter* filter) |
- : reply_msg_(reply_msg), |
- filter_(filter) { |
+ RenderMessageCompletionCallback(RenderMessageFilter* filter, |
+ IPC::Message* reply_msg) |
+ : filter_(filter), |
+ reply_msg_(reply_msg) { |
} |
- virtual void RunWithParams(const Tuple1<int>& params) { |
- ViewHostMsg_ClearCache::WriteReplyParams(reply_msg_, params.a); |
+ virtual ~RenderMessageCompletionCallback() { |
+ } |
+ |
+ RenderMessageFilter* filter() { return filter_.get(); } |
+ IPC::Message* reply_msg() { return reply_msg_; } |
+ |
+ void SendReplyAndDeleteThis() { |
filter_->Send(reply_msg_); |
delete this; |
} |
private: |
+ scoped_refptr<RenderMessageFilter> filter_; |
IPC::Message* reply_msg_; |
- scoped_refptr<RenderMessageFilter> filter_; |
}; |
-class OpenChannelToPluginCallback : public PluginProcessHost::Client { |
+class ClearCacheCompletion : public RenderMessageCompletionCallback, |
+ public net::CompletionCallback { |
public: |
- OpenChannelToPluginCallback(RenderMessageFilter* filter, |
- IPC::Message* reply_msg) |
- : filter_(filter), |
- reply_msg_(reply_msg) { |
+ ClearCacheCompletion(RenderMessageFilter* filter, |
+ IPC::Message* reply_msg) |
+ : RenderMessageCompletionCallback(filter, reply_msg) { |
} |
+ virtual void RunWithParams(const Tuple1<int>& params) { |
+ ViewHostMsg_ClearCache::WriteReplyParams(reply_msg(), params.a); |
+ SendReplyAndDeleteThis(); |
+ } |
+}; |
+ |
+class OpenChannelToNpapiPluginCallback : public RenderMessageCompletionCallback, |
+ public PluginProcessHost::Client { |
+ public: |
+ OpenChannelToNpapiPluginCallback(RenderMessageFilter* filter, |
+ IPC::Message* reply_msg) |
+ : RenderMessageCompletionCallback(filter, reply_msg) { |
+ } |
+ |
virtual int ID() { |
- return filter_->render_process_id(); |
+ return filter()->render_process_id(); |
} |
virtual bool OffTheRecord() { |
- return filter_->off_the_record(); |
+ return filter()->off_the_record(); |
} |
virtual void SetPluginInfo(const webkit::npapi::WebPluginInfo& info) { |
@@ -207,27 +230,45 @@ |
} |
virtual void OnChannelOpened(const IPC::ChannelHandle& handle) { |
- WriteReply(handle); |
+ WriteReplyAndDeleteThis(handle); |
} |
virtual void OnError() { |
- WriteReply(IPC::ChannelHandle()); |
+ WriteReplyAndDeleteThis(IPC::ChannelHandle()); |
} |
private: |
- void WriteReply(const IPC::ChannelHandle& handle) { |
- ViewHostMsg_OpenChannelToPlugin::WriteReplyParams(reply_msg_, |
- handle, |
- info_); |
- filter_->Send(reply_msg_); |
- delete this; |
+ void WriteReplyAndDeleteThis(const IPC::ChannelHandle& handle) { |
+ ViewHostMsg_OpenChannelToPlugin::WriteReplyParams(reply_msg(), |
+ handle, info_); |
+ SendReplyAndDeleteThis(); |
} |
- scoped_refptr<RenderMessageFilter> filter_; |
- IPC::Message* reply_msg_; |
webkit::npapi::WebPluginInfo info_; |
}; |
+class OpenChannelToPpapiPluginCallback : public RenderMessageCompletionCallback, |
+ public PpapiPluginProcessHost::Client { |
+ public: |
+ OpenChannelToPpapiPluginCallback(RenderMessageFilter* filter, |
+ IPC::Message* reply_msg) |
+ : RenderMessageCompletionCallback(filter, reply_msg) { |
+ } |
+ |
+ virtual void GetChannelInfo(base::ProcessHandle* renderer_handle, |
+ int* renderer_id) { |
+ *renderer_handle = filter()->peer_handle(); |
+ *renderer_id = filter()->render_process_id(); |
+ } |
+ |
+ virtual void OnChannelOpened(base::ProcessHandle plugin_process_handle, |
+ const IPC::ChannelHandle& channel_handle) { |
+ ViewHostMsg_OpenChannelToPepperPlugin::WriteReplyParams( |
+ reply_msg(), plugin_process_handle, channel_handle); |
+ SendReplyAndDeleteThis(); |
+ } |
+}; |
+ |
} // namespace |
RenderMessageFilter::RenderMessageFilter( |
@@ -719,17 +760,16 @@ |
const GURL& url, |
const std::string& mime_type, |
IPC::Message* reply_msg) { |
- plugin_service_->OpenChannelToPlugin( |
+ plugin_service_->OpenChannelToNpapiPlugin( |
render_process_id_, routing_id, url, mime_type, |
- new OpenChannelToPluginCallback(this, reply_msg)); |
+ new OpenChannelToNpapiPluginCallback(this, reply_msg)); |
} |
void RenderMessageFilter::OnOpenChannelToPepperPlugin( |
const FilePath& path, |
IPC::Message* reply_msg) { |
- PpapiPluginProcessHost* host = new PpapiPluginProcessHost(this); |
- host->Init(path, reply_msg); |
- ppapi_plugin_hosts_.push_back(linked_ptr<PpapiPluginProcessHost>(host)); |
+ plugin_service_->OpenChannelToPpapiPlugin( |
+ path, new OpenChannelToPpapiPluginCallback(this, reply_msg)); |
} |
void RenderMessageFilter::OnLaunchNaCl( |
@@ -1293,7 +1333,7 @@ |
http_transaction_factory()->GetCache()->GetCurrentBackend(); |
if (backend) { |
ClearCacheCompletion* callback = |
- new ClearCacheCompletion(reply_msg, this); |
+ new ClearCacheCompletion(this, reply_msg); |
rv = backend->DoomAllEntries(callback); |
if (rv == net::ERR_IO_PENDING) { |
// The callback will send the reply. |