| Index: chrome/renderer/render_thread.cc
|
| ===================================================================
|
| --- chrome/renderer/render_thread.cc (revision 21215)
|
| +++ chrome/renderer/render_thread.cc (working copy)
|
| @@ -17,6 +17,7 @@
|
| #include "chrome/common/chrome_switches.h"
|
| #include "chrome/common/render_messages.h"
|
| #include "chrome/common/renderer_preferences.h"
|
| +#include "chrome/common/notification_service.h"
|
| #include "chrome/common/url_constants.h"
|
| #include "chrome/plugin/npobject_util.h"
|
| // TODO(port)
|
| @@ -54,10 +55,54 @@
|
| using WebKit::WebCache;
|
| using WebKit::WebString;
|
|
|
| -namespace {
|
| static const unsigned int kCacheStatsDelayMS = 2000 /* milliseconds */;
|
| +
|
| static base::LazyInstance<base::ThreadLocalPointer<RenderThread> > lazy_tls(
|
| base::LINKER_INITIALIZED);
|
| +
|
| +//-----------------------------------------------------------------------------
|
| +// 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, kV8StackSize)),
|
| + plugin_refresh_allowed_(true) {
|
| +}
|
| +
|
| +RenderThread::RenderThread(const std::string& channel_name)
|
| + : ChildThread(
|
| + base::Thread::Options(RenderProcess::InProcessPlugins() ?
|
| + MessageLoop::TYPE_UI : MessageLoop::TYPE_DEFAULT, kV8StackSize)),
|
| + plugin_refresh_allowed_(true) {
|
| + SetChannelName(channel_name);
|
| +}
|
| +
|
| +RenderThread::~RenderThread() {
|
| +}
|
| +
|
| +RenderThread* RenderThread::current() {
|
| + return lazy_tls.Pointer()->Get();
|
| +}
|
| +
|
| +void RenderThread::AddFilter(IPC::ChannelProxy::MessageFilter* filter) {
|
| + channel()->AddFilter(filter);
|
| +}
|
| +
|
| +void RenderThread::RemoveFilter(IPC::ChannelProxy::MessageFilter* filter) {
|
| + channel()->RemoveFilter(filter);
|
| +}
|
| +
|
| +void RenderThread::Resolve(const char* name, size_t length) {
|
| + return dns_master_->Resolve(name, length);
|
| +}
|
| +
|
| +void RenderThread::SendHistograms(int sequence_number) {
|
| + return histogram_snapshots_->SendHistograms(sequence_number);
|
| +}
|
| +
|
| static WebAppCacheContext* CreateAppCacheContextForRenderer() {
|
| return new AppCacheContextImpl(RenderThread::current());
|
| }
|
| @@ -83,19 +128,7 @@
|
| }
|
| };
|
| #endif
|
| -} // namespace
|
|
|
| -// 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() {
|
| - Init();
|
| -}
|
| -
|
| -RenderThread::RenderThread(const std::string& channel_name)
|
| - : ChildThread(channel_name) {
|
| - Init();
|
| -}
|
| -
|
| void RenderThread::Init() {
|
| lazy_tls.Pointer()->Set(this);
|
| #if defined(OS_WIN)
|
| @@ -105,7 +138,8 @@
|
| CoInitialize(0);
|
| #endif
|
|
|
| - plugin_refresh_allowed_ = true;
|
| + ChildThread::Init();
|
| + notification_service_.reset(new NotificationService);
|
| cache_stats_factory_.reset(
|
| new ScopedRunnableMethodFactory<RenderThread>(this));
|
|
|
| @@ -124,13 +158,24 @@
|
| #endif
|
| }
|
|
|
| -RenderThread::~RenderThread() {
|
| +void RenderThread::CleanUp() {
|
| // Shutdown in reverse of the initialization order.
|
| RemoveFilter(devtools_agent_filter_.get());
|
| + devtools_agent_filter_ = NULL;
|
| WebAppCacheContext::SetFactory(NULL);
|
| - if (webkit_client_.get())
|
| + app_cache_dispatcher_.reset();
|
| + histogram_snapshots_.reset();
|
| + dns_master_.reset();
|
| + user_script_slave_.reset();
|
| + visited_link_slave_.reset();
|
| +
|
| + if (webkit_client_.get()) {
|
| WebKit::shutdown();
|
| + webkit_client_.reset();
|
| + }
|
|
|
| + notification_service_.reset();
|
| + ChildThread::CleanUp();
|
| lazy_tls.Pointer()->Set(NULL);
|
|
|
| // TODO(port)
|
| @@ -143,26 +188,6 @@
|
| #endif
|
| }
|
|
|
| -RenderThread* RenderThread::current() {
|
| - return lazy_tls.Pointer()->Get();
|
| -}
|
| -
|
| -void RenderThread::AddFilter(IPC::ChannelProxy::MessageFilter* filter) {
|
| - channel()->AddFilter(filter);
|
| -}
|
| -
|
| -void RenderThread::RemoveFilter(IPC::ChannelProxy::MessageFilter* filter) {
|
| - channel()->RemoveFilter(filter);
|
| -}
|
| -
|
| -void RenderThread::Resolve(const char* name, size_t length) {
|
| - return dns_master_->Resolve(name, length);
|
| -}
|
| -
|
| -void RenderThread::SendHistograms(int sequence_number) {
|
| - return histogram_snapshots_->SendHistograms(sequence_number);
|
| -}
|
| -
|
| void RenderThread::OnUpdateVisitedLinks(base::SharedMemoryHandle table) {
|
| DCHECK(base::SharedMemory::IsHandleValid(table)) << "Bad table handle";
|
| visited_link_slave_->Init(table);
|
| @@ -249,6 +274,8 @@
|
| true, false);
|
| #endif
|
|
|
| + // TODO(darin): once we have a RenderThread per RenderView, this will need to
|
| + // change to assert that we are not creating more than one view.
|
| RenderView::Create(
|
| this, parent_hwnd, waitable_event, MSG_ROUTING_NONE, renderer_prefs,
|
| webkit_prefs, new SharedRenderViewCounter(0), view_id);
|
|
|