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(); |
-} |