Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(707)

Unified Diff: content/renderer/render_thread.cc

Issue 8171015: Rename RenderThread to RenderThreadImpl (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/render_thread.h ('k') | content/renderer/render_thread_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/render_thread.cc
===================================================================
--- content/renderer/render_thread.cc (revision 104358)
+++ content/renderer/render_thread.cc (working copy)
@@ -1,786 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/render_thread.h"
-
-#include <algorithm>
-#include <limits>
-#include <map>
-#include <vector>
-
-#include "base/command_line.h"
-#include "base/debug/trace_event.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/metrics/field_trial.h"
-#include "base/metrics/histogram.h"
-#include "base/metrics/stats_table.h"
-#include "base/process_util.h"
-#include "base/shared_memory.h"
-#include "base/task.h"
-#include "base/threading/thread_local.h"
-#include "base/values.h"
-#include "content/common/appcache/appcache_dispatcher.h"
-#include "content/common/content_switches.h"
-#include "content/common/database_messages.h"
-#include "content/common/db_message_filter.h"
-#include "content/common/dom_storage_messages.h"
-#include "content/common/gpu/gpu_messages.h"
-#include "content/common/npobject_util.h"
-#include "content/common/plugin_messages.h"
-#include "content/common/renderer_preferences.h"
-#include "content/common/resource_messages.h"
-#include "content/common/view_messages.h"
-#include "content/common/web_database_observer_impl.h"
-#include "content/public/renderer/content_renderer_client.h"
-#include "content/public/renderer/render_process_observer.h"
-#include "content/public/renderer/render_view_visitor.h"
-#include "content/renderer/devtools_agent_filter.h"
-#include "content/renderer/gpu/compositor_thread.h"
-#include "content/renderer/gpu/gpu_channel_host.h"
-#include "content/renderer/indexed_db_dispatcher.h"
-#include "content/renderer/media/audio_input_message_filter.h"
-#include "content/renderer/media/audio_message_filter.h"
-#include "content/renderer/media/video_capture_impl_manager.h"
-#include "content/renderer/media/video_capture_message_filter.h"
-#include "content/renderer/plugin_channel_host.h"
-#include "content/renderer/render_process_impl.h"
-#include "content/renderer/render_view.h"
-#include "content/renderer/renderer_webidbfactory_impl.h"
-#include "content/renderer/renderer_webkitplatformsupport_impl.h"
-#include "ipc/ipc_channel_handle.h"
-#include "ipc/ipc_platform_file.h"
-#include "net/base/net_errors.h"
-#include "net/base/net_util.h"
-#include "third_party/tcmalloc/chromium/src/google/malloc_extension.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebColor.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebDatabase.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebNetworkStateNotifier.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupMenu.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebRuntimeFeatures.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptController.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebStorageEventDispatcher.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
-#include "ui/base/ui_base_switches.h"
-#include "v8/include/v8.h"
-#include "webkit/extensions/v8/playback_extension.h"
-#include "webkit/glue/webkit_glue.h"
-
-// TODO(port)
-#if defined(OS_WIN)
-#include "content/common/child_process_messages.h"
-#else
-#include "base/memory/scoped_handle.h"
-#include "content/common/np_channel_base.h"
-#endif
-
-#if defined(OS_WIN)
-#include <windows.h>
-#include <objbase.h>
-#endif
-
-#if defined(OS_POSIX)
-#include "ipc/ipc_channel_posix.h"
-#endif
-
-using WebKit::WebDocument;
-using WebKit::WebFrame;
-using WebKit::WebNetworkStateNotifier;
-using WebKit::WebRuntimeFeatures;
-using WebKit::WebScriptController;
-using WebKit::WebString;
-using WebKit::WebStorageEventDispatcher;
-using WebKit::WebView;
-using content::RenderProcessObserver;
-
-namespace {
-static const double kInitialIdleHandlerDelayS = 1.0 /* seconds */;
-
-#if defined(TOUCH_UI)
-static const int kPopupListBoxMinimumRowHeight = 60;
-#endif
-
-// Keep the global RenderThread in a TLS slot so it is impossible to access
-// incorrectly from the wrong thread.
-static base::LazyInstance<base::ThreadLocalPointer<RenderThread> > lazy_tls(
- base::LINKER_INITIALIZED);
-
-class RenderViewZoomer : public content::RenderViewVisitor {
- public:
- RenderViewZoomer(const GURL& url, double zoom_level)
- : zoom_level_(zoom_level) {
- host_ = net::GetHostOrSpecFromURL(url);
- }
-
- virtual bool Visit(RenderView* render_view) {
- WebView* webview = render_view->webview();
- WebDocument document = webview->mainFrame()->document();
-
- // Don't set zoom level for full-page plugin since they don't use the same
- // zoom settings.
- if (document.isPluginDocument())
- return true;
-
- if (net::GetHostOrSpecFromURL(GURL(document.url())) == host_)
- webview->setZoomLevel(false, zoom_level_);
- return true;
- }
-
- private:
- std::string host_;
- double zoom_level_;
-
- DISALLOW_COPY_AND_ASSIGN(RenderViewZoomer);
-};
-
-} // namespace
-
-// TODO(jam): move this to content/public/renderer/render_thread.cc once this file is renamed
-namespace content {
-
-// Keep the global RenderThread in a TLS slot so it is impossible to access
-// incorrectly from the wrong thread.
-static base::LazyInstance<base::ThreadLocalPointer<RenderThread> > lazy_tls(
- base::LINKER_INITIALIZED);
-
-RenderThread* RenderThread::Get() {
- return lazy_tls.Pointer()->Get();
-}
-
-RenderThread::RenderThread() {
- lazy_tls.Pointer()->Set(this);
-}
-
-RenderThread::~RenderThread() {
- lazy_tls.Pointer()->Set(NULL);
-}
-
-} // namespace content
-
-
-static void* CreateHistogram(
- const char *name, int min, int max, size_t buckets) {
- if (min <= 0)
- min = 1;
- base::Histogram* histogram = base::Histogram::FactoryGet(
- name, min, max, buckets, base::Histogram::kUmaTargetedHistogramFlag);
- return histogram;
-}
-
-static void AddHistogramSample(void* hist, int sample) {
- base::Histogram* histogram = static_cast<base::Histogram*>(hist);
- histogram->Add(sample);
-}
-
-RenderThread* RenderThread::current() {
- return lazy_tls.Pointer()->Get();
-}
-
-// 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() {
- TRACE_EVENT_BEGIN_ETW("RenderThread::Init", 0, "");
-
-#if defined(OS_MACOSX)
- // On Mac, the select popups are rendered by the browser.
- WebKit::WebView::setUseExternalPopupMenus(true);
-#endif
-
- lazy_tls.Pointer()->Set(this);
-#if defined(OS_WIN)
- // If you are running plugins in this thread you need COM active but in
- // the normal case you don't.
- if (RenderProcessImpl::InProcessPlugins())
- CoInitialize(0);
-#endif
-
- // In single process the single process is all there is.
- suspend_webkit_shared_timer_ = true;
- notify_webkit_of_modal_loop_ = true;
- plugin_refresh_allowed_ = true;
- widget_count_ = 0;
- hidden_widget_count_ = 0;
- idle_notification_delay_in_s_ = kInitialIdleHandlerDelayS;
- task_factory_.reset(new ScopedRunnableMethodFactory<RenderThread>(this));
-
- appcache_dispatcher_.reset(new AppCacheDispatcher(Get()));
- indexed_db_dispatcher_.reset(new IndexedDBDispatcher());
-
- db_message_filter_ = new DBMessageFilter();
- AddFilter(db_message_filter_.get());
-
- vc_manager_ = new VideoCaptureImplManager();
- AddFilter(vc_manager_->video_capture_message_filter());
-
- audio_input_message_filter_ = new AudioInputMessageFilter();
- AddFilter(audio_input_message_filter_.get());
-
- audio_message_filter_ = new AudioMessageFilter();
- AddFilter(audio_message_filter_.get());
-
- devtools_agent_message_filter_ = new DevToolsAgentFilter();
- AddFilter(devtools_agent_message_filter_.get());
-
- content::GetContentClient()->renderer()->RenderThreadStarted();
-
- TRACE_EVENT_END_ETW("RenderThread::Init", 0, "");
-}
-
-RenderThread::~RenderThread() {
- FOR_EACH_OBSERVER(
- RenderProcessObserver, observers_, OnRenderProcessShutdown());
-
- // Wait for all databases to be closed.
- if (web_database_observer_impl_.get())
- web_database_observer_impl_->WaitForAllDatabasesToClose();
-
- // Shutdown in reverse of the initialization order.
- RemoveFilter(devtools_agent_message_filter_.get());
- devtools_agent_message_filter_ = NULL;
-
- RemoveFilter(audio_input_message_filter_.get());
- audio_input_message_filter_ = NULL;
-
- RemoveFilter(audio_message_filter_.get());
- audio_message_filter_ = NULL;
-
- RemoveFilter(vc_manager_->video_capture_message_filter());
-
- RemoveFilter(db_message_filter_.get());
- db_message_filter_ = NULL;
-
- // Shutdown the file thread if it's running.
- if (file_thread_.get())
- file_thread_->Stop();
-
- if (compositor_thread_.get()) {
- RemoveFilter(compositor_thread_->GetMessageFilter());
- compositor_thread_.reset();
- }
-
- if (webkit_platform_support_.get())
- WebKit::shutdown();
-
- lazy_tls.Pointer()->Set(NULL);
-
- // TODO(port)
-#if defined(OS_WIN)
- // Clean up plugin channels before this thread goes away.
- NPChannelBase::CleanupChannels();
- // Don't call COM if the renderer is in the sandbox.
- if (RenderProcessImpl::InProcessPlugins())
- CoUninitialize();
-#endif
-}
-
-bool RenderThread::Send(IPC::Message* msg) {
- // Certain synchronous messages cannot always be processed synchronously by
- // the browser, e.g., Chrome frame communicating with the embedding browser.
- // This could cause a complete hang of Chrome if a windowed plug-in is trying
- // to communicate with the renderer thread since the browser's UI thread
- // could be stuck (within a Windows API call) trying to synchronously
- // communicate with the plug-in. The remedy is to pump messages on this
- // thread while the browser is processing this request. This creates an
- // opportunity for re-entrancy into WebKit, so we need to take care to disable
- // callbacks, timers, and pending network loads that could trigger such
- // callbacks.
- bool pumping_events = false;
- if (msg->is_sync()) {
- if (msg->is_caller_pumping_messages()) {
- pumping_events = true;
- } else {
- if ((msg->type() == ViewHostMsg_GetCookies::ID ||
- msg->type() == ViewHostMsg_GetRawCookies::ID ||
- msg->type() == ViewHostMsg_CookiesEnabled::ID) &&
- content::GetContentClient()->renderer()->
- ShouldPumpEventsDuringCookieMessage()) {
- pumping_events = true;
- }
- }
- }
-
- bool suspend_webkit_shared_timer = true; // default value
- std::swap(suspend_webkit_shared_timer, suspend_webkit_shared_timer_);
-
- bool notify_webkit_of_modal_loop = true; // default value
- std::swap(notify_webkit_of_modal_loop, notify_webkit_of_modal_loop_);
-
- gfx::NativeViewId host_window = 0;
-
- if (pumping_events) {
- if (suspend_webkit_shared_timer)
- webkit_platform_support_->SuspendSharedTimer();
-
- if (notify_webkit_of_modal_loop)
- WebView::willEnterModalLoop();
-
- RenderWidget* widget =
- static_cast<RenderWidget*>(ResolveRoute(msg->routing_id()));
- if (widget) {
- host_window = widget->host_window();
- PluginChannelHost::Broadcast(
- new PluginMsg_SignalModalDialogEvent(host_window));
- }
- }
-
- bool rv = ChildThread::Send(msg);
-
- if (pumping_events) {
- if (host_window) {
- PluginChannelHost::Broadcast(
- new PluginMsg_ResetModalDialogEvent(host_window));
- }
-
- if (notify_webkit_of_modal_loop)
- WebView::didExitModalLoop();
-
- if (suspend_webkit_shared_timer)
- webkit_platform_support_->ResumeSharedTimer();
- }
-
- return rv;
-}
-
-MessageLoop* RenderThread::GetMessageLoop() {
- return message_loop();
-}
-
-IPC::SyncChannel* RenderThread::GetChannel() {
- return channel();
-}
-
-ResourceDispatcher* RenderThread::GetResourceDispatcher() {
- return resource_dispatcher();
-}
-
-std::string RenderThread::GetLocale() {
- // The browser process should have passed the locale to the renderer via the
- // --lang command line flag. In single process mode, this will return the
- // wrong value. TODO(tc): Fix this for single process mode.
- const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
- const std::string& lang =
- parsed_command_line.GetSwitchValueASCII(switches::kLang);
- DCHECK(!lang.empty() ||
- (!parsed_command_line.HasSwitch(switches::kRendererProcess) &&
- !parsed_command_line.HasSwitch(switches::kPluginProcess)));
- return lang;
-}
-
-void RenderThread::AddRoute(int32 routing_id,
- IPC::Channel::Listener* listener) {
- widget_count_++;
- return ChildThread::AddRoute(routing_id, listener);
-}
-
-void RenderThread::RemoveRoute(int32 routing_id) {
- widget_count_--;
- return ChildThread::RemoveRoute(routing_id);
-}
-
-void RenderThread::AddFilter(IPC::ChannelProxy::MessageFilter* filter) {
- channel()->AddFilter(filter);
-}
-
-void RenderThread::RemoveFilter(IPC::ChannelProxy::MessageFilter* filter) {
- channel()->RemoveFilter(filter);
-}
-
-void RenderThread::SetOutgoingMessageFilter(
- IPC::ChannelProxy::OutgoingMessageFilter* filter) {
-}
-
-void RenderThread::AddObserver(content::RenderProcessObserver* observer) {
- observers_.AddObserver(observer);
-}
-
-void RenderThread::RemoveObserver(content::RenderProcessObserver* observer) {
- observers_.RemoveObserver(observer);
-}
-
-void RenderThread::WidgetHidden() {
- DCHECK(hidden_widget_count_ < widget_count_);
- hidden_widget_count_++;
-
- if (!content::GetContentClient()->renderer()->
- RunIdleHandlerWhenWidgetsHidden()) {
- return;
- }
-
- if (widget_count_ && hidden_widget_count_ == widget_count_)
- ScheduleIdleHandler(kInitialIdleHandlerDelayS);
-}
-
-void RenderThread::WidgetRestored() {
- DCHECK_GT(hidden_widget_count_, 0);
- hidden_widget_count_--;
- if (!content::GetContentClient()->renderer()->
- RunIdleHandlerWhenWidgetsHidden()) {
- return;
- }
-
- idle_timer_.Stop();
-}
-
-void RenderThread::EnsureWebKitInitialized() {
- if (webkit_platform_support_.get())
- return;
-
- v8::V8::SetCounterFunction(base::StatsTable::FindLocation);
- v8::V8::SetCreateHistogramFunction(CreateHistogram);
- v8::V8::SetAddHistogramSampleFunction(AddHistogramSample);
-
- webkit_platform_support_.reset(new RendererWebKitPlatformSupportImpl);
- WebKit::initialize(webkit_platform_support_.get());
-
- compositor_thread_.reset(new CompositorThread(this));
- AddFilter(compositor_thread_->GetMessageFilter());
-
- WebScriptController::enableV8SingleThreadMode();
-
- const CommandLine& command_line = *CommandLine::ForCurrentProcess();
-
- webkit_glue::EnableWebCoreLogChannels(
- command_line.GetSwitchValueASCII(switches::kWebCoreLogChannels));
-
- if (command_line.HasSwitch(switches::kPlaybackMode) ||
- command_line.HasSwitch(switches::kRecordMode) ||
- command_line.HasSwitch(switches::kNoJsRandomness)) {
- RegisterExtension(extensions_v8::PlaybackExtension::Get());
- }
-
- web_database_observer_impl_.reset(new WebDatabaseObserverImpl(Get()));
- WebKit::WebDatabase::setObserver(web_database_observer_impl_.get());
-
- WebRuntimeFeatures::enableSockets(
- !command_line.HasSwitch(switches::kDisableWebSockets));
-
- WebRuntimeFeatures::enableDatabase(
- !command_line.HasSwitch(switches::kDisableDatabases));
-
- WebRuntimeFeatures::enableDataTransferItems(
- !command_line.HasSwitch(switches::kDisableDataTransferItems));
-
- WebRuntimeFeatures::enableApplicationCache(
- !command_line.HasSwitch(switches::kDisableApplicationCache));
-
- WebRuntimeFeatures::enableNotifications(
- !command_line.HasSwitch(switches::kDisableDesktopNotifications));
-
- WebRuntimeFeatures::enableLocalStorage(
- !command_line.HasSwitch(switches::kDisableLocalStorage));
- WebRuntimeFeatures::enableSessionStorage(
- !command_line.HasSwitch(switches::kDisableSessionStorage));
-
- WebRuntimeFeatures::enableIndexedDatabase(
- !command_line.HasSwitch(switches::kDisableIndexedDatabase));
-
- WebRuntimeFeatures::enableGeolocation(
- !command_line.HasSwitch(switches::kDisableGeolocation));
-
- WebKit::WebRuntimeFeatures::enableMediaStream(
- command_line.HasSwitch(switches::kEnableMediaStream));
-
- WebKit::WebRuntimeFeatures::enableFullScreenAPI(
- !command_line.HasSwitch(switches::kDisableFullScreen));
-
-#if defined(OS_CHROMEOS)
- // TODO(crogers): enable once Web Audio has been tested and optimized.
- WebRuntimeFeatures::enableWebAudio(false);
-#else
- WebRuntimeFeatures::enableWebAudio(
- !command_line.HasSwitch(switches::kDisableWebAudio));
-#endif
-
- WebRuntimeFeatures::enablePushState(true);
-
-#ifdef TOUCH_UI
- WebRuntimeFeatures::enableTouch(true);
- WebKit::WebPopupMenu::setMinimumRowHeight(kPopupListBoxMinimumRowHeight);
-#else
- // TODO(saintlou): in the future touch should always be enabled
- WebRuntimeFeatures::enableTouch(false);
-#endif
-
- WebRuntimeFeatures::enableDeviceMotion(
- command_line.HasSwitch(switches::kEnableDeviceMotion));
-
- WebRuntimeFeatures::enableDeviceOrientation(
- !command_line.HasSwitch(switches::kDisableDeviceOrientation));
-
- WebRuntimeFeatures::enableSpeechInput(
- !command_line.HasSwitch(switches::kDisableSpeechInput));
-
- WebRuntimeFeatures::enableFileSystem(
- !command_line.HasSwitch(switches::kDisableFileSystem));
-
- WebRuntimeFeatures::enableJavaScriptI18NAPI(
- !command_line.HasSwitch(switches::kDisableJavaScriptI18NAPI));
-
- WebRuntimeFeatures::enableQuota(true);
-
- FOR_EACH_OBSERVER(RenderProcessObserver, observers_, WebKitInitialized());
-}
-
-void RenderThread::RecordUserMetrics(const std::string& action) {
- Send(new ViewHostMsg_UserMetricsRecordAction(action));
-}
-
-void RenderThread::RegisterExtension(v8::Extension* extension) {
- WebScriptController::registerExtension(extension);
- v8_extensions_.insert(extension->name());
-}
-
-bool RenderThread::IsRegisteredExtension(
- const std::string& v8_extension_name) const {
- return v8_extensions_.find(v8_extension_name) != v8_extensions_.end();
-}
-
-void RenderThread::ScheduleIdleHandler(double initial_delay_s) {
- idle_notification_delay_in_s_ = initial_delay_s;
- idle_timer_.Stop();
- idle_timer_.Start(FROM_HERE,
- base::TimeDelta::FromSeconds(static_cast<int64>(initial_delay_s)),
- this, &RenderThread::IdleHandler);
-}
-
-void RenderThread::IdleHandler() {
- #if !defined(OS_MACOSX) && defined(USE_TCMALLOC)
- MallocExtension::instance()->ReleaseFreeMemory();
-#endif
-
- v8::V8::IdleNotification();
-
- // Schedule next invocation.
- // Dampen the delay using the algorithm:
- // delay = delay + 1 / (delay + 2)
- // Using floor(delay) has a dampening effect such as:
- // 1s, 1, 1, 2, 2, 2, 2, 3, 3, ...
- // Note that idle_notification_delay_in_s_ would be reset to
- // kInitialIdleHandlerDelayS in RenderThread::WidgetHidden.
- ScheduleIdleHandler(idle_notification_delay_in_s_ +
- 1.0 / (idle_notification_delay_in_s_ + 2.0));
-
- FOR_EACH_OBSERVER(RenderProcessObserver, observers_, IdleNotification());
-}
-
-double RenderThread::GetIdleNotificationDelayInS() const {
- return idle_notification_delay_in_s_;
-}
-
-void RenderThread::SetIdleNotificationDelayInS(
- double idle_notification_delay_in_s) {
- idle_notification_delay_in_s_ = idle_notification_delay_in_s;
-}
-
-#if defined(OS_WIN)
-void RenderThread::PreCacheFont(const LOGFONT& log_font) {
- Send(new ChildProcessHostMsg_PreCacheFont(log_font));
-}
-
-void RenderThread::ReleaseCachedFonts() {
- Send(new ChildProcessHostMsg_ReleaseCachedFonts());
-}
-
-#endif // OS_WIN
-
-int32 RenderThread::RoutingIDForCurrentContext() {
- int32 routing_id = MSG_ROUTING_CONTROL;
- if (v8::Context::InContext()) {
- WebFrame* frame = WebFrame::frameForCurrentContext();
- if (frame) {
- RenderView* view = RenderView::FromWebView(frame->view());
- if (view)
- routing_id = view->routing_id();
- }
- } else {
- DLOG(WARNING) << "Not called within a script context!";
- }
- return routing_id;
-}
-
-void RenderThread::DoNotSuspendWebKitSharedTimer() {
- suspend_webkit_shared_timer_ = false;
-}
-
-void RenderThread::DoNotNotifyWebKitOfModalLoop() {
- notify_webkit_of_modal_loop_ = false;
-}
-
-void RenderThread::OnSetZoomLevelForCurrentURL(const GURL& url,
- double zoom_level) {
- RenderViewZoomer zoomer(url, zoom_level);
- RenderView::ForEach(&zoomer);
-}
-
-void RenderThread::OnDOMStorageEvent(
- const DOMStorageMsg_Event_Params& params) {
- if (!dom_storage_event_dispatcher_.get())
- dom_storage_event_dispatcher_.reset(WebStorageEventDispatcher::create());
- dom_storage_event_dispatcher_->dispatchStorageEvent(params.key,
- params.old_value, params.new_value, params.origin, params.url,
- params.storage_type == DOM_STORAGE_LOCAL);
-}
-
-bool RenderThread::OnControlMessageReceived(const IPC::Message& msg) {
- ObserverListBase<RenderProcessObserver>::Iterator it(observers_);
- RenderProcessObserver* observer;
- while ((observer = it.GetNext()) != NULL) {
- if (observer->OnControlMessageReceived(msg))
- return true;
- }
-
- // Some messages are handled by delegates.
- if (appcache_dispatcher_->OnMessageReceived(msg))
- return true;
- if (indexed_db_dispatcher_->OnMessageReceived(msg))
- return true;
-
- bool handled = true;
- IPC_BEGIN_MESSAGE_MAP(RenderThread, msg)
- IPC_MESSAGE_HANDLER(ViewMsg_SetZoomLevelForCurrentURL,
- OnSetZoomLevelForCurrentURL)
- IPC_MESSAGE_HANDLER(ViewMsg_SetNextPageID, OnSetNextPageID)
- IPC_MESSAGE_HANDLER(ViewMsg_SetCSSColors, OnSetCSSColors)
- // 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_PurgePluginListCache, OnPurgePluginListCache)
- IPC_MESSAGE_HANDLER(ViewMsg_NetworkStateChanged, OnNetworkStateChanged)
- IPC_MESSAGE_HANDLER(DOMStorageMsg_Event, OnDOMStorageEvent)
- IPC_MESSAGE_UNHANDLED(handled = false)
- IPC_END_MESSAGE_MAP()
- return handled;
-}
-
-void RenderThread::OnSetNextPageID(int32 next_page_id) {
- // This should only be called at process initialization time, so we shouldn't
- // have to worry about thread-safety.
- RenderView::SetNextPageID(next_page_id);
-}
-
-// Called when to register CSS Color name->system color mappings.
-// We update the colors one by one and then tell WebKit to refresh all render
-// views.
-void RenderThread::OnSetCSSColors(
- const std::vector<CSSColors::CSSColorMapping>& colors) {
- EnsureWebKitInitialized();
- size_t num_colors = colors.size();
- scoped_array<WebKit::WebColorName> color_names(
- new WebKit::WebColorName[num_colors]);
- scoped_array<WebKit::WebColor> web_colors(new WebKit::WebColor[num_colors]);
- size_t i = 0;
- for (std::vector<CSSColors::CSSColorMapping>::const_iterator it =
- colors.begin();
- it != colors.end();
- ++it, ++i) {
- color_names[i] = it->first;
- web_colors[i] = it->second;
- }
- WebKit::setNamedColors(color_names.get(), web_colors.get(), num_colors);
-}
-
-void RenderThread::OnCreateNewView(const ViewMsg_New_Params& params) {
- EnsureWebKitInitialized();
- // When bringing in render_view, also bring in webkit's glue and jsbindings.
- RenderView::Create(
- this,
- params.parent_window,
- MSG_ROUTING_NONE,
- params.renderer_preferences,
- params.web_preferences,
- new SharedRenderViewCounter(0),
- params.view_id,
- params.session_storage_namespace_id,
- params.frame_name);
-}
-
-GpuChannelHost* RenderThread::EstablishGpuChannelSync(
- content::CauseForGpuLaunch cause_for_gpu_launch) {
- if (gpu_channel_.get()) {
- // Do nothing if we already have a GPU channel or are already
- // establishing one.
- if (gpu_channel_->state() == GpuChannelHost::kUnconnected ||
- gpu_channel_->state() == GpuChannelHost::kConnected)
- return GetGpuChannel();
-
- // Recreate the channel if it has been lost.
- if (gpu_channel_->state() == GpuChannelHost::kLost)
- gpu_channel_ = NULL;
- }
-
- if (!gpu_channel_.get())
- gpu_channel_ = new GpuChannelHost;
-
- // Ask the browser for the channel name.
- IPC::ChannelHandle channel_handle;
- base::ProcessHandle renderer_process_for_gpu;
- GPUInfo gpu_info;
- if (!Send(new GpuHostMsg_EstablishGpuChannel(cause_for_gpu_launch,
- &channel_handle,
- &renderer_process_for_gpu,
- &gpu_info)) ||
- channel_handle.name.empty() ||
- renderer_process_for_gpu == base::kNullProcessHandle) {
- // Otherwise cancel the connection.
- gpu_channel_ = NULL;
- return NULL;
- }
-
- gpu_channel_->set_gpu_info(gpu_info);
- content::GetContentClient()->SetGpuInfo(gpu_info);
-
- // Connect to the GPU process if a channel name was received.
- gpu_channel_->Connect(channel_handle, renderer_process_for_gpu);
-
- return GetGpuChannel();
-}
-
-GpuChannelHost* RenderThread::GetGpuChannel() {
- if (!gpu_channel_.get())
- return NULL;
-
- if (gpu_channel_->state() != GpuChannelHost::kConnected)
- return NULL;
-
- return gpu_channel_.get();
-}
-
-void RenderThread::OnPurgePluginListCache(bool reload_pages) {
- EnsureWebKitInitialized();
- // The call below will cause a GetPlugins call with refresh=true, but at this
- // point we already know that the browser has refreshed its list, so disable
- // refresh temporarily to prevent each renderer process causing the list to be
- // regenerated.
- plugin_refresh_allowed_ = false;
- WebKit::resetPluginCache(reload_pages);
- plugin_refresh_allowed_ = true;
-}
-
-void RenderThread::OnNetworkStateChanged(bool online) {
- EnsureWebKitInitialized();
- WebNetworkStateNotifier::setOnLine(online);
-}
-
-scoped_refptr<base::MessageLoopProxy>
-RenderThread::GetFileThreadMessageLoopProxy() {
- DCHECK(message_loop() == MessageLoop::current());
- if (!file_thread_.get()) {
- file_thread_.reset(new base::Thread("Renderer::FILE"));
- file_thread_->Start();
- }
- return file_thread_->message_loop_proxy();
-}
« no previous file with comments | « content/renderer/render_thread.h ('k') | content/renderer/render_thread_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698