summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/render_thread.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/renderer/render_thread.cc')
-rw-r--r--chrome/renderer/render_thread.cc126
1 files changed, 88 insertions, 38 deletions
diff --git a/chrome/renderer/render_thread.cc b/chrome/renderer/render_thread.cc
index 58de4ef..2937935 100644
--- a/chrome/renderer/render_thread.cc
+++ b/chrome/renderer/render_thread.cc
@@ -14,9 +14,9 @@
#include "base/shared_memory.h"
#include "chrome/common/chrome_plugin_lib.h"
+#include "chrome/common/ipc_logging.h"
#include "chrome/common/render_messages.h"
#include "chrome/common/notification_service.h"
-#include "chrome/plugin/npobject_util.h"
// TODO(port)
#if defined(OS_WIN)
#include "chrome/plugin/plugin_channel.h"
@@ -34,6 +34,8 @@
#include "webkit/glue/cache_manager.h"
+RenderThread* g_render_thread;
+
static const unsigned int kCacheStatsDelayMS = 2000 /* milliseconds */;
// V8 needs a 1MB stack size.
@@ -42,53 +44,78 @@ static const size_t kStackSize = 1024 * 1024;
//-----------------------------------------------------------------------------
// Methods below are only called on the owner's thread:
-// When we run plugins in process, we actually run them on the render thread,
-// which means that we need to make the render thread pump UI events.
-RenderThread::RenderThread()
- : ChildThread(
- base::Thread::Options(RenderProcess::InProcessPlugins() ?
- MessageLoop::TYPE_UI : MessageLoop::TYPE_DEFAULT, kStackSize)),
- visited_link_slave_(NULL),
- user_script_slave_(NULL),
- render_dns_master_(NULL) {
-}
-
RenderThread::RenderThread(const std::wstring& channel_name)
- : ChildThread(
- base::Thread::Options(RenderProcess::InProcessPlugins() ?
- MessageLoop::TYPE_UI : MessageLoop::TYPE_DEFAULT, kStackSize)),
+ : Thread("Chrome_RenderThread"),
+ owner_loop_(MessageLoop::current()),
+ channel_name_(channel_name),
visited_link_slave_(NULL),
user_script_slave_(NULL),
- render_dns_master_(NULL) {
- SetChannelName(channel_name);
+ render_dns_master_(NULL),
+ in_send_(0) {
+ DCHECK(owner_loop_);
+ base::Thread::Options options;
+ options.stack_size = kStackSize;
+ // When we run plugins in process, we actually run them on the render thread,
+ // which means that we need to make the render thread pump UI events.
+ if (RenderProcess::ShouldLoadPluginsInProcess())
+ options.message_loop_type = MessageLoop::TYPE_UI;
+ StartWithOptions(options);
}
RenderThread::~RenderThread() {
+ Stop();
}
-RenderThread* RenderThread::current() {
- DCHECK(!IsPluginProcess());
- return static_cast<RenderThread*>(ChildThread::current());
+void RenderThread::OnChannelError() {
+ owner_loop_->PostTask(FROM_HERE, new MessageLoop::QuitTask());
+}
+
+bool RenderThread::Send(IPC::Message* msg) {
+ in_send_++;
+ bool rv = channel_->Send(msg);
+ in_send_--;
+ return rv;
}
void RenderThread::AddFilter(IPC::ChannelProxy::MessageFilter* filter) {
- channel()->AddFilter(filter);
+ channel_->AddFilter(filter);
}
void RenderThread::RemoveFilter(IPC::ChannelProxy::MessageFilter* filter) {
- channel()->RemoveFilter(filter);
+ channel_->RemoveFilter(filter);
}
void RenderThread::Resolve(const char* name, size_t length) {
return render_dns_master_->Resolve(name, length);
}
+void RenderThread::AddRoute(int32 routing_id,
+ IPC::Channel::Listener* listener) {
+ DCHECK(MessageLoop::current() == message_loop());
+
+ // This corresponds to the AddRoute call done in CreateView.
+ router_.AddRoute(routing_id, listener);
+}
+
+void RenderThread::RemoveRoute(int32 routing_id) {
+ DCHECK(MessageLoop::current() == message_loop());
+
+ router_.RemoveRoute(routing_id);
+}
+
void RenderThread::Init() {
- ChildThread::Init();
+ DCHECK(!g_render_thread);
+ g_render_thread = this;
+
notification_service_.reset(new NotificationService);
+
cache_stats_factory_.reset(
new ScopedRunnableMethodFactory<RenderThread>(this));
+ channel_.reset(new IPC::SyncChannel(channel_name_,
+ IPC::Channel::MODE_CLIENT, this, NULL, owner_loop_, true,
+ RenderProcess::GetShutDownEvent()));
+
#if defined(OS_WIN)
// The renderer thread should wind-up COM.
CoInitialize(0);
@@ -97,10 +124,19 @@ void RenderThread::Init() {
visited_link_slave_ = new VisitedLinkSlave();
user_script_slave_ = new UserScriptSlave();
render_dns_master_.reset(new RenderDnsMaster());
+
+#ifdef IPC_MESSAGE_LOG_ENABLED
+ IPC::Logging::current()->SetIPCSender(this);
+#endif
}
void RenderThread::CleanUp() {
- ChildThread::CleanUp();
+ DCHECK(g_render_thread == this);
+ g_render_thread = NULL;
+
+ // Need to destruct the SyncChannel to the browser before we go away because
+ // it caches a pointer to this thread.
+ channel_.reset();
// TODO(port)
#if defined(OS_WIN)
@@ -108,6 +144,10 @@ void RenderThread::CleanUp() {
PluginChannelBase::CleanupChannels();
#endif
+#ifdef IPC_MESSAGE_LOG_ENABLED
+ IPC::Logging::current()->SetIPCSender(NULL);
+#endif
+
notification_service_.reset();
delete visited_link_slave_;
@@ -132,20 +172,30 @@ void RenderThread::OnUpdateUserScripts(
user_script_slave_->UpdateScripts(scripts);
}
-void RenderThread::OnControlMessageReceived(const IPC::Message& msg) {
- IPC_BEGIN_MESSAGE_MAP(RenderThread, msg)
- IPC_MESSAGE_HANDLER(ViewMsg_VisitedLink_NewTable, OnUpdateVisitedLinks)
- IPC_MESSAGE_HANDLER(ViewMsg_SetNextPageID, OnSetNextPageID)
- // TODO(port): removed from render_messages_internal.h;
- // is there a new non-windows message I should add here?
- IPC_MESSAGE_HANDLER(ViewMsg_New, OnCreateNewView)
- IPC_MESSAGE_HANDLER(ViewMsg_SetCacheCapacities, OnSetCacheCapacities)
- IPC_MESSAGE_HANDLER(ViewMsg_GetCacheResourceStats,
- OnGetCacheResourceStats)
- IPC_MESSAGE_HANDLER(ViewMsg_PluginMessage, OnPluginMessage)
- IPC_MESSAGE_HANDLER(ViewMsg_UserScripts_NewScripts,
- OnUpdateUserScripts)
- IPC_END_MESSAGE_MAP()
+void RenderThread::OnMessageReceived(const IPC::Message& msg) {
+ // NOTE: We could subclass router_ to intercept OnControlMessageReceived, but
+ // it seems simpler to just process any control messages that we care about
+ // up-front and then send the rest of the messages onto router_.
+
+ if (msg.routing_id() == MSG_ROUTING_CONTROL) {
+ IPC_BEGIN_MESSAGE_MAP(RenderThread, msg)
+ IPC_MESSAGE_HANDLER(ViewMsg_VisitedLink_NewTable, OnUpdateVisitedLinks)
+ IPC_MESSAGE_HANDLER(ViewMsg_SetNextPageID, OnSetNextPageID)
+ // TODO(port): removed from render_messages_internal.h;
+ // is there a new non-windows message I should add here?
+ IPC_MESSAGE_HANDLER(ViewMsg_New, OnCreateNewView)
+ IPC_MESSAGE_HANDLER(ViewMsg_SetCacheCapacities, OnSetCacheCapacities)
+ IPC_MESSAGE_HANDLER(ViewMsg_GetCacheResourceStats,
+ OnGetCacheResourceStats)
+ IPC_MESSAGE_HANDLER(ViewMsg_PluginMessage, OnPluginMessage)
+ IPC_MESSAGE_HANDLER(ViewMsg_UserScripts_NewScripts,
+ OnUpdateUserScripts)
+ // send the rest to the router
+ IPC_MESSAGE_UNHANDLED(router_.OnMessageReceived(msg))
+ IPC_END_MESSAGE_MAP()
+ } else {
+ router_.OnMessageReceived(msg);
+ }
}
void RenderThread::OnPluginMessage(const FilePath& plugin_path,