| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/render_thread.h" | 5 #include "content/renderer/render_thread.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
| 13 #include "base/debug/trace_event.h" | 13 #include "base/debug/trace_event.h" |
| 14 #include "base/lazy_instance.h" | 14 #include "base/lazy_instance.h" |
| 15 #include "base/logging.h" | 15 #include "base/logging.h" |
| 16 #include "base/metrics/field_trial.h" | 16 #include "base/metrics/field_trial.h" |
| 17 #include "base/metrics/histogram.h" | 17 #include "base/metrics/histogram.h" |
| 18 #include "base/metrics/stats_table.h" | 18 #include "base/metrics/stats_table.h" |
| 19 #include "base/process_util.h" | 19 #include "base/process_util.h" |
| 20 #include "base/shared_memory.h" | 20 #include "base/shared_memory.h" |
| 21 #include "base/string_util.h" | |
| 22 #include "base/task.h" | 21 #include "base/task.h" |
| 23 #include "base/threading/thread_local.h" | 22 #include "base/threading/thread_local.h" |
| 24 #include "base/utf_string_conversions.h" | |
| 25 #include "base/values.h" | 23 #include "base/values.h" |
| 26 #include "chrome/common/chrome_switches.h" | 24 // DO NOT ADD ANY MORE INCLUDES TO "chrome/"! |
| 27 #include "chrome/common/render_messages.h" | |
| 28 #include "chrome/common/safe_browsing/safebrowsing_messages.h" | |
| 29 #include "chrome/common/url_constants.h" | |
| 30 #include "content/common/appcache/appcache_dispatcher.h" | 25 #include "content/common/appcache/appcache_dispatcher.h" |
| 26 #include "content/common/content_switches.h" |
| 31 #include "content/common/database_messages.h" | 27 #include "content/common/database_messages.h" |
| 32 #include "content/common/db_message_filter.h" | 28 #include "content/common/db_message_filter.h" |
| 33 #include "content/common/dom_storage_messages.h" | 29 #include "content/common/dom_storage_messages.h" |
| 34 #include "content/common/gpu_messages.h" | 30 #include "content/common/gpu_messages.h" |
| 35 #include "content/common/plugin_messages.h" | 31 #include "content/common/plugin_messages.h" |
| 36 #include "content/common/renderer_preferences.h" | 32 #include "content/common/renderer_preferences.h" |
| 37 #include "content/common/resource_messages.h" | 33 #include "content/common/resource_messages.h" |
| 38 #include "content/common/view_messages.h" | 34 #include "content/common/view_messages.h" |
| 39 #include "content/common/web_database_observer_impl.h" | 35 #include "content/common/web_database_observer_impl.h" |
| 40 #include "content/plugin/npobject_util.h" | 36 #include "content/plugin/npobject_util.h" |
| 41 #include "content/renderer/content_renderer_client.h" | 37 #include "content/renderer/content_renderer_client.h" |
| 42 #include "content/renderer/cookie_message_filter.h" | |
| 43 #include "content/renderer/gpu_channel_host.h" | 38 #include "content/renderer/gpu_channel_host.h" |
| 44 #include "content/renderer/gpu_video_service_host.h" | 39 #include "content/renderer/gpu_video_service_host.h" |
| 45 #include "content/renderer/indexed_db_dispatcher.h" | 40 #include "content/renderer/indexed_db_dispatcher.h" |
| 46 #include "content/renderer/plugin_channel_host.h" | 41 #include "content/renderer/plugin_channel_host.h" |
| 47 #include "content/renderer/render_process_impl.h" | 42 #include "content/renderer/render_process_impl.h" |
| 48 #include "content/renderer/render_process_observer.h" | 43 #include "content/renderer/render_process_observer.h" |
| 49 #include "content/renderer/render_view.h" | 44 #include "content/renderer/render_view.h" |
| 50 #include "content/renderer/render_view_visitor.h" | 45 #include "content/renderer/render_view_visitor.h" |
| 51 #include "content/renderer/renderer_webidbfactory_impl.h" | 46 #include "content/renderer/renderer_webidbfactory_impl.h" |
| 52 #include "content/renderer/renderer_webkitclient_impl.h" | 47 #include "content/renderer/renderer_webkitclient_impl.h" |
| 53 #include "ipc/ipc_channel_handle.h" | 48 #include "ipc/ipc_channel_handle.h" |
| 54 #include "ipc/ipc_platform_file.h" | 49 #include "ipc/ipc_platform_file.h" |
| 55 #include "net/base/net_errors.h" | 50 #include "net/base/net_errors.h" |
| 56 #include "net/base/net_util.h" | 51 #include "net/base/net_util.h" |
| 57 #include "third_party/sqlite/sqlite3.h" | |
| 58 #include "third_party/tcmalloc/chromium/src/google/malloc_extension.h" | 52 #include "third_party/tcmalloc/chromium/src/google/malloc_extension.h" |
| 59 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCache.h" | |
| 60 #include "third_party/WebKit/Source/WebKit/chromium/public/WebColor.h" | 53 #include "third_party/WebKit/Source/WebKit/chromium/public/WebColor.h" |
| 61 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCrossOriginPreflig
htResultCache.h" | |
| 62 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDatabase.h" | 54 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDatabase.h" |
| 63 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" | 55 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" |
| 64 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFontCache.h" | |
| 65 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | 56 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
| 66 #include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" | 57 #include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" |
| 67 #include "third_party/WebKit/Source/WebKit/chromium/public/WebRuntimeFeatures.h" | 58 #include "third_party/WebKit/Source/WebKit/chromium/public/WebRuntimeFeatures.h" |
| 68 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptController.h
" | 59 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptController.h
" |
| 69 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityPolicy.h" | |
| 70 #include "third_party/WebKit/Source/WebKit/chromium/public/WebStorageEventDispat
cher.h" | 60 #include "third_party/WebKit/Source/WebKit/chromium/public/WebStorageEventDispat
cher.h" |
| 71 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" | 61 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" |
| 72 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" | 62 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
| 73 #include "v8/include/v8.h" | 63 #include "v8/include/v8.h" |
| 74 #include "webkit/extensions/v8/benchmarking_extension.h" | 64 #include "webkit/extensions/v8/benchmarking_extension.h" |
| 75 #include "webkit/extensions/v8/playback_extension.h" | 65 #include "webkit/extensions/v8/playback_extension.h" |
| 76 #include "webkit/glue/webkit_glue.h" | 66 #include "webkit/glue/webkit_glue.h" |
| 77 | 67 |
| 78 // TODO(port) | 68 // TODO(port) |
| 79 #if defined(OS_WIN) | 69 #if defined(OS_WIN) |
| 80 #include "content/plugin/plugin_channel.h" | 70 #include "content/plugin/plugin_channel.h" |
| 81 #else | 71 #else |
| 82 #include "base/memory/scoped_handle.h" | 72 #include "base/memory/scoped_handle.h" |
| 83 #include "content/plugin/plugin_channel_base.h" | 73 #include "content/plugin/plugin_channel_base.h" |
| 84 #endif | 74 #endif |
| 85 | 75 |
| 86 #if defined(OS_WIN) | 76 #if defined(OS_WIN) |
| 87 #include <windows.h> | 77 #include <windows.h> |
| 88 #include <objbase.h> | 78 #include <objbase.h> |
| 89 #endif | 79 #endif |
| 90 | 80 |
| 91 #if defined(OS_POSIX) | 81 #if defined(OS_POSIX) |
| 92 #include "ipc/ipc_channel_posix.h" | 82 #include "ipc/ipc_channel_posix.h" |
| 93 #endif | 83 #endif |
| 94 | 84 |
| 95 using WebKit::WebCache; | |
| 96 using WebKit::WebCrossOriginPreflightResultCache; | |
| 97 using WebKit::WebFontCache; | |
| 98 using WebKit::WebFrame; | 85 using WebKit::WebFrame; |
| 99 using WebKit::WebRuntimeFeatures; | 86 using WebKit::WebRuntimeFeatures; |
| 100 using WebKit::WebSecurityPolicy; | |
| 101 using WebKit::WebScriptController; | 87 using WebKit::WebScriptController; |
| 102 using WebKit::WebString; | 88 using WebKit::WebString; |
| 103 using WebKit::WebStorageEventDispatcher; | 89 using WebKit::WebStorageEventDispatcher; |
| 104 using WebKit::WebView; | 90 using WebKit::WebView; |
| 105 | 91 |
| 106 namespace { | 92 namespace { |
| 107 static const double kInitialIdleHandlerDelayS = 1.0 /* seconds */; | 93 static const double kInitialIdleHandlerDelayS = 1.0 /* seconds */; |
| 108 | 94 |
| 109 // Keep the global RenderThread in a TLS slot so it is impossible to access | 95 // Keep the global RenderThread in a TLS slot so it is impossible to access |
| 110 // incorrectly from the wrong thread. | 96 // incorrectly from the wrong thread. |
| 111 static base::LazyInstance<base::ThreadLocalPointer<RenderThread> > lazy_tls( | 97 static base::LazyInstance<base::ThreadLocalPointer<RenderThread> > lazy_tls( |
| 112 base::LINKER_INITIALIZED); | 98 base::LINKER_INITIALIZED); |
| 113 | 99 |
| 114 class RenderViewContentSettingsSetter : public RenderViewVisitor { | |
| 115 public: | |
| 116 RenderViewContentSettingsSetter(const GURL& url, | |
| 117 const ContentSettings& content_settings) | |
| 118 : url_(url), | |
| 119 content_settings_(content_settings) { | |
| 120 } | |
| 121 | |
| 122 virtual bool Visit(RenderView* render_view) { | |
| 123 if (GURL(render_view->webview()->mainFrame()->url()) == url_) | |
| 124 render_view->SetContentSettings(content_settings_); | |
| 125 return true; | |
| 126 } | |
| 127 | |
| 128 private: | |
| 129 GURL url_; | |
| 130 ContentSettings content_settings_; | |
| 131 | |
| 132 DISALLOW_COPY_AND_ASSIGN(RenderViewContentSettingsSetter); | |
| 133 }; | |
| 134 | |
| 135 class RenderViewZoomer : public RenderViewVisitor { | 100 class RenderViewZoomer : public RenderViewVisitor { |
| 136 public: | 101 public: |
| 137 RenderViewZoomer(const GURL& url, double zoom_level) | 102 RenderViewZoomer(const GURL& url, double zoom_level) |
| 138 : zoom_level_(zoom_level) { | 103 : zoom_level_(zoom_level) { |
| 139 host_ = net::GetHostOrSpecFromURL(url); | 104 host_ = net::GetHostOrSpecFromURL(url); |
| 140 } | 105 } |
| 141 | 106 |
| 142 virtual bool Visit(RenderView* render_view) { | 107 virtual bool Visit(RenderView* render_view) { |
| 143 WebView* webview = render_view->webview(); // Guaranteed non-NULL. | 108 WebView* webview = render_view->webview(); // Guaranteed non-NULL. |
| 144 | 109 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 | 147 |
| 183 lazy_tls.Pointer()->Set(this); | 148 lazy_tls.Pointer()->Set(this); |
| 184 #if defined(OS_WIN) | 149 #if defined(OS_WIN) |
| 185 // If you are running plugins in this thread you need COM active but in | 150 // If you are running plugins in this thread you need COM active but in |
| 186 // the normal case you don't. | 151 // the normal case you don't. |
| 187 if (RenderProcessImpl::InProcessPlugins()) | 152 if (RenderProcessImpl::InProcessPlugins()) |
| 188 CoInitialize(0); | 153 CoInitialize(0); |
| 189 #endif | 154 #endif |
| 190 | 155 |
| 191 // In single process the single process is all there is. | 156 // In single process the single process is all there is. |
| 192 is_incognito_process_ = false; | |
| 193 suspend_webkit_shared_timer_ = true; | 157 suspend_webkit_shared_timer_ = true; |
| 194 notify_webkit_of_modal_loop_ = true; | 158 notify_webkit_of_modal_loop_ = true; |
| 195 plugin_refresh_allowed_ = true; | 159 plugin_refresh_allowed_ = true; |
| 196 widget_count_ = 0; | 160 widget_count_ = 0; |
| 197 hidden_widget_count_ = 0; | 161 hidden_widget_count_ = 0; |
| 198 idle_notification_delay_in_s_ = kInitialIdleHandlerDelayS; | 162 idle_notification_delay_in_s_ = kInitialIdleHandlerDelayS; |
| 199 task_factory_.reset(new ScopedRunnableMethodFactory<RenderThread>(this)); | 163 task_factory_.reset(new ScopedRunnableMethodFactory<RenderThread>(this)); |
| 200 | 164 |
| 201 appcache_dispatcher_.reset(new AppCacheDispatcher(this)); | 165 appcache_dispatcher_.reset(new AppCacheDispatcher(this)); |
| 202 indexed_db_dispatcher_.reset(new IndexedDBDispatcher()); | 166 indexed_db_dispatcher_.reset(new IndexedDBDispatcher()); |
| 203 | 167 |
| 204 db_message_filter_ = new DBMessageFilter(); | 168 db_message_filter_ = new DBMessageFilter(); |
| 205 AddFilter(db_message_filter_.get()); | 169 AddFilter(db_message_filter_.get()); |
| 206 | 170 |
| 207 cookie_message_filter_ = new CookieMessageFilter(); | |
| 208 AddFilter(cookie_message_filter_.get()); | |
| 209 | |
| 210 content::GetContentClient()->renderer()->RenderThreadStarted(); | 171 content::GetContentClient()->renderer()->RenderThreadStarted(); |
| 211 | 172 |
| 212 TRACE_EVENT_END("RenderThread::Init", 0, ""); | 173 TRACE_EVENT_END("RenderThread::Init", 0, ""); |
| 213 } | 174 } |
| 214 | 175 |
| 215 RenderThread::~RenderThread() { | 176 RenderThread::~RenderThread() { |
| 216 FOR_EACH_OBSERVER( | 177 FOR_EACH_OBSERVER( |
| 217 RenderProcessObserver, observers_, OnRenderProcessShutdown()); | 178 RenderProcessObserver, observers_, OnRenderProcessShutdown()); |
| 218 | 179 |
| 219 // Wait for all databases to be closed. | 180 // Wait for all databases to be closed. |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 // Certain synchronous messages cannot always be processed synchronously by | 227 // Certain synchronous messages cannot always be processed synchronously by |
| 267 // the browser, e.g., Chrome frame communicating with the embedding browser. | 228 // the browser, e.g., Chrome frame communicating with the embedding browser. |
| 268 // This could cause a complete hang of Chrome if a windowed plug-in is trying | 229 // This could cause a complete hang of Chrome if a windowed plug-in is trying |
| 269 // to communicate with the renderer thread since the browser's UI thread | 230 // to communicate with the renderer thread since the browser's UI thread |
| 270 // could be stuck (within a Windows API call) trying to synchronously | 231 // could be stuck (within a Windows API call) trying to synchronously |
| 271 // communicate with the plug-in. The remedy is to pump messages on this | 232 // communicate with the plug-in. The remedy is to pump messages on this |
| 272 // thread while the browser is processing this request. This creates an | 233 // thread while the browser is processing this request. This creates an |
| 273 // opportunity for re-entrancy into WebKit, so we need to take care to disable | 234 // opportunity for re-entrancy into WebKit, so we need to take care to disable |
| 274 // callbacks, timers, and pending network loads that could trigger such | 235 // callbacks, timers, and pending network loads that could trigger such |
| 275 // callbacks. | 236 // callbacks. |
| 276 bool pumping_events = false, may_show_cookie_prompt = false; | 237 bool pumping_events = false; |
| 277 if (msg->is_sync()) { | 238 if (msg->is_sync()) { |
| 278 if (msg->is_caller_pumping_messages()) { | 239 if (msg->is_caller_pumping_messages()) { |
| 279 pumping_events = true; | 240 pumping_events = true; |
| 280 } else { | 241 } else { |
| 281 // We only need to pump events for chrome frame processes as the | 242 if ((msg->type() == ViewHostMsg_GetCookies::ID || |
| 282 // cookie policy is controlled by the host browser (IE). If the | 243 msg->type() == ViewHostMsg_GetRawCookies::ID || |
| 283 // policy is set to prompt then the host would put up UI which | 244 msg->type() == ViewHostMsg_CookiesEnabled::ID) && |
| 284 // would require plugins if any to also pump to ensure that we | 245 content::GetContentClient()->renderer()-> |
| 285 // don't have a deadlock. | 246 ShouldPumpEventsDuringCookieMessage()) { |
| 286 if (CommandLine::ForCurrentProcess()->HasSwitch( | 247 pumping_events = true; |
| 287 switches::kChromeFrame)) { | |
| 288 switch (msg->type()) { | |
| 289 case ViewHostMsg_GetCookies::ID: | |
| 290 case ViewHostMsg_GetRawCookies::ID: | |
| 291 case ViewHostMsg_CookiesEnabled::ID: | |
| 292 case DOMStorageHostMsg_SetItem::ID: | |
| 293 case ResourceHostMsg_SyncLoad::ID: | |
| 294 case DatabaseHostMsg_Allow::ID: | |
| 295 may_show_cookie_prompt = true; | |
| 296 pumping_events = true; | |
| 297 break; | |
| 298 default: | |
| 299 break; | |
| 300 } | |
| 301 } | 248 } |
| 302 } | 249 } |
| 303 } | 250 } |
| 304 | 251 |
| 305 bool suspend_webkit_shared_timer = true; // default value | 252 bool suspend_webkit_shared_timer = true; // default value |
| 306 std::swap(suspend_webkit_shared_timer, suspend_webkit_shared_timer_); | 253 std::swap(suspend_webkit_shared_timer, suspend_webkit_shared_timer_); |
| 307 | 254 |
| 308 bool notify_webkit_of_modal_loop = true; // default value | 255 bool notify_webkit_of_modal_loop = true; // default value |
| 309 std::swap(notify_webkit_of_modal_loop, notify_webkit_of_modal_loop_); | 256 std::swap(notify_webkit_of_modal_loop, notify_webkit_of_modal_loop_); |
| 310 | 257 |
| 311 gfx::NativeViewId host_window = 0; | 258 gfx::NativeViewId host_window = 0; |
| 312 | 259 |
| 313 if (pumping_events) { | 260 if (pumping_events) { |
| 314 // See ViewMsg_SignalCookiePromptEvent. | |
| 315 if (may_show_cookie_prompt) { | |
| 316 static_cast<IPC::SyncMessage*>(msg)->set_pump_messages_event( | |
| 317 cookie_message_filter_->pump_messages_event()); | |
| 318 } | |
| 319 | |
| 320 if (suspend_webkit_shared_timer) | 261 if (suspend_webkit_shared_timer) |
| 321 webkit_client_->SuspendSharedTimer(); | 262 webkit_client_->SuspendSharedTimer(); |
| 322 | 263 |
| 323 if (notify_webkit_of_modal_loop) | 264 if (notify_webkit_of_modal_loop) |
| 324 WebView::willEnterModalLoop(); | 265 WebView::willEnterModalLoop(); |
| 325 | 266 |
| 326 RenderWidget* widget = | 267 RenderWidget* widget = |
| 327 static_cast<RenderWidget*>(ResolveRoute(msg->routing_id())); | 268 static_cast<RenderWidget*>(ResolveRoute(msg->routing_id())); |
| 328 if (widget) { | 269 if (widget) { |
| 329 host_window = widget->host_window(); | 270 host_window = widget->host_window(); |
| 330 PluginChannelHost::Broadcast( | 271 PluginChannelHost::Broadcast( |
| 331 new PluginMsg_SignalModalDialogEvent(host_window)); | 272 new PluginMsg_SignalModalDialogEvent(host_window)); |
| 332 } | 273 } |
| 333 } | 274 } |
| 334 | 275 |
| 335 bool rv = ChildThread::Send(msg); | 276 bool rv = ChildThread::Send(msg); |
| 336 | 277 |
| 337 if (pumping_events) { | 278 if (pumping_events) { |
| 338 if (host_window) { | 279 if (host_window) { |
| 339 PluginChannelHost::Broadcast( | 280 PluginChannelHost::Broadcast( |
| 340 new PluginMsg_ResetModalDialogEvent(host_window)); | 281 new PluginMsg_ResetModalDialogEvent(host_window)); |
| 341 } | 282 } |
| 342 | 283 |
| 343 if (notify_webkit_of_modal_loop) | 284 if (notify_webkit_of_modal_loop) |
| 344 WebView::didExitModalLoop(); | 285 WebView::didExitModalLoop(); |
| 345 | 286 |
| 346 if (suspend_webkit_shared_timer) | 287 if (suspend_webkit_shared_timer) |
| 347 webkit_client_->ResumeSharedTimer(); | 288 webkit_client_->ResumeSharedTimer(); |
| 348 | |
| 349 // We may end up nesting calls to Send, so we defer the reset until we | |
| 350 // return to the top-most message loop. | |
| 351 if (may_show_cookie_prompt && | |
| 352 cookie_message_filter_->pump_messages_event()->IsSignaled()) { | |
| 353 MessageLoop::current()->PostNonNestableTask(FROM_HERE, | |
| 354 NewRunnableMethod(cookie_message_filter_.get(), | |
| 355 &CookieMessageFilter::ResetPumpMessagesEvent)); | |
| 356 } | |
| 357 } | 289 } |
| 358 | 290 |
| 359 return rv; | 291 return rv; |
| 360 } | 292 } |
| 361 | 293 |
| 362 void RenderThread::AddRoute(int32 routing_id, | 294 void RenderThread::AddRoute(int32 routing_id, |
| 363 IPC::Channel::Listener* listener) { | 295 IPC::Channel::Listener* listener) { |
| 364 widget_count_++; | 296 widget_count_++; |
| 365 return ChildThread::AddRoute(routing_id, listener); | 297 return ChildThread::AddRoute(routing_id, listener); |
| 366 } | 298 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 395 DCHECK_GT(hidden_widget_count_, 0); | 327 DCHECK_GT(hidden_widget_count_, 0); |
| 396 hidden_widget_count_--; | 328 hidden_widget_count_--; |
| 397 if (!content::GetContentClient()->renderer()-> | 329 if (!content::GetContentClient()->renderer()-> |
| 398 RunIdleHandlerWhenWidgetsHidden()) { | 330 RunIdleHandlerWhenWidgetsHidden()) { |
| 399 return; | 331 return; |
| 400 } | 332 } |
| 401 | 333 |
| 402 idle_timer_.Stop(); | 334 idle_timer_.Stop(); |
| 403 } | 335 } |
| 404 | 336 |
| 405 bool RenderThread::IsIncognitoProcess() const { | |
| 406 return is_incognito_process_; | |
| 407 } | |
| 408 | |
| 409 void RenderThread::AddObserver(RenderProcessObserver* observer) { | 337 void RenderThread::AddObserver(RenderProcessObserver* observer) { |
| 410 observers_.AddObserver(observer); | 338 observers_.AddObserver(observer); |
| 411 } | 339 } |
| 412 | 340 |
| 413 void RenderThread::RemoveObserver(RenderProcessObserver* observer) { | 341 void RenderThread::RemoveObserver(RenderProcessObserver* observer) { |
| 414 observers_.RemoveObserver(observer); | 342 observers_.RemoveObserver(observer); |
| 415 } | 343 } |
| 416 | 344 |
| 417 void RenderThread::DoNotSuspendWebKitSharedTimer() { | 345 void RenderThread::DoNotSuspendWebKitSharedTimer() { |
| 418 suspend_webkit_shared_timer_ = false; | 346 suspend_webkit_shared_timer_ = false; |
| 419 } | 347 } |
| 420 | 348 |
| 421 void RenderThread::DoNotNotifyWebKitOfModalLoop() { | 349 void RenderThread::DoNotNotifyWebKitOfModalLoop() { |
| 422 notify_webkit_of_modal_loop_ = false; | 350 notify_webkit_of_modal_loop_ = false; |
| 423 } | 351 } |
| 424 | 352 |
| 425 void RenderThread::OnSetContentSettingsForCurrentURL( | |
| 426 const GURL& url, | |
| 427 const ContentSettings& content_settings) { | |
| 428 RenderViewContentSettingsSetter setter(url, content_settings); | |
| 429 RenderView::ForEach(&setter); | |
| 430 } | |
| 431 | |
| 432 void RenderThread::OnSetZoomLevelForCurrentURL(const GURL& url, | 353 void RenderThread::OnSetZoomLevelForCurrentURL(const GURL& url, |
| 433 double zoom_level) { | 354 double zoom_level) { |
| 434 RenderViewZoomer zoomer(url, zoom_level); | 355 RenderViewZoomer zoomer(url, zoom_level); |
| 435 RenderView::ForEach(&zoomer); | 356 RenderView::ForEach(&zoomer); |
| 436 } | 357 } |
| 437 | 358 |
| 438 void RenderThread::OnDOMStorageEvent( | 359 void RenderThread::OnDOMStorageEvent( |
| 439 const DOMStorageMsg_Event_Params& params) { | 360 const DOMStorageMsg_Event_Params& params) { |
| 440 if (!dom_storage_event_dispatcher_.get()) | 361 if (!dom_storage_event_dispatcher_.get()) |
| 441 dom_storage_event_dispatcher_.reset(WebStorageEventDispatcher::create()); | 362 dom_storage_event_dispatcher_.reset(WebStorageEventDispatcher::create()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 453 } | 374 } |
| 454 | 375 |
| 455 // Some messages are handled by delegates. | 376 // Some messages are handled by delegates. |
| 456 if (appcache_dispatcher_->OnMessageReceived(msg)) | 377 if (appcache_dispatcher_->OnMessageReceived(msg)) |
| 457 return true; | 378 return true; |
| 458 if (indexed_db_dispatcher_->OnMessageReceived(msg)) | 379 if (indexed_db_dispatcher_->OnMessageReceived(msg)) |
| 459 return true; | 380 return true; |
| 460 | 381 |
| 461 bool handled = true; | 382 bool handled = true; |
| 462 IPC_BEGIN_MESSAGE_MAP(RenderThread, msg) | 383 IPC_BEGIN_MESSAGE_MAP(RenderThread, msg) |
| 463 IPC_MESSAGE_HANDLER(ViewMsg_SetContentSettingsForCurrentURL, | |
| 464 OnSetContentSettingsForCurrentURL) | |
| 465 IPC_MESSAGE_HANDLER(ViewMsg_SetZoomLevelForCurrentURL, | 384 IPC_MESSAGE_HANDLER(ViewMsg_SetZoomLevelForCurrentURL, |
| 466 OnSetZoomLevelForCurrentURL) | 385 OnSetZoomLevelForCurrentURL) |
| 467 IPC_MESSAGE_HANDLER(ViewMsg_SetIsIncognitoProcess, OnSetIsIncognitoProcess) | |
| 468 IPC_MESSAGE_HANDLER(ViewMsg_SetNextPageID, OnSetNextPageID) | 386 IPC_MESSAGE_HANDLER(ViewMsg_SetNextPageID, OnSetNextPageID) |
| 469 IPC_MESSAGE_HANDLER(ViewMsg_SetCSSColors, OnSetCSSColors) | 387 IPC_MESSAGE_HANDLER(ViewMsg_SetCSSColors, OnSetCSSColors) |
| 470 // TODO(port): removed from render_messages_internal.h; | 388 // TODO(port): removed from render_messages_internal.h; |
| 471 // is there a new non-windows message I should add here? | 389 // is there a new non-windows message I should add here? |
| 472 IPC_MESSAGE_HANDLER(ViewMsg_New, OnCreateNewView) | 390 IPC_MESSAGE_HANDLER(ViewMsg_New, OnCreateNewView) |
| 473 IPC_MESSAGE_HANDLER(ViewMsg_SetCacheCapacities, OnSetCacheCapacities) | |
| 474 IPC_MESSAGE_HANDLER(ViewMsg_ClearCache, OnClearCache) | |
| 475 #if defined(USE_TCMALLOC) | |
| 476 IPC_MESSAGE_HANDLER(ViewMsg_GetRendererTcmalloc, OnGetRendererTcmalloc) | |
| 477 #endif | |
| 478 IPC_MESSAGE_HANDLER(ViewMsg_GetV8HeapStats, OnGetV8HeapStats) | |
| 479 IPC_MESSAGE_HANDLER(ViewMsg_GetCacheResourceStats, OnGetCacheResourceStats) | |
| 480 IPC_MESSAGE_HANDLER(ViewMsg_PurgeMemory, OnPurgeMemory) | |
| 481 IPC_MESSAGE_HANDLER(ViewMsg_PurgePluginListCache, OnPurgePluginListCache) | 391 IPC_MESSAGE_HANDLER(ViewMsg_PurgePluginListCache, OnPurgePluginListCache) |
| 482 IPC_MESSAGE_HANDLER(DOMStorageMsg_Event, OnDOMStorageEvent) | 392 IPC_MESSAGE_HANDLER(DOMStorageMsg_Event, OnDOMStorageEvent) |
| 483 IPC_MESSAGE_HANDLER(GpuMsg_GpuChannelEstablished, OnGpuChannelEstablished) | 393 IPC_MESSAGE_HANDLER(GpuMsg_GpuChannelEstablished, OnGpuChannelEstablished) |
| 484 IPC_MESSAGE_UNHANDLED(handled = false) | 394 IPC_MESSAGE_UNHANDLED(handled = false) |
| 485 IPC_END_MESSAGE_MAP() | 395 IPC_END_MESSAGE_MAP() |
| 486 return handled; | 396 return handled; |
| 487 } | 397 } |
| 488 | 398 |
| 489 void RenderThread::OnSetNextPageID(int32 next_page_id) { | 399 void RenderThread::OnSetNextPageID(int32 next_page_id) { |
| 490 // This should only be called at process initialization time, so we shouldn't | 400 // This should only be called at process initialization time, so we shouldn't |
| (...skipping 30 matching lines...) Expand all Loading... |
| 521 params.parent_window, | 431 params.parent_window, |
| 522 MSG_ROUTING_NONE, | 432 MSG_ROUTING_NONE, |
| 523 params.renderer_preferences, | 433 params.renderer_preferences, |
| 524 params.web_preferences, | 434 params.web_preferences, |
| 525 new SharedRenderViewCounter(0), | 435 new SharedRenderViewCounter(0), |
| 526 params.view_id, | 436 params.view_id, |
| 527 params.session_storage_namespace_id, | 437 params.session_storage_namespace_id, |
| 528 params.frame_name); | 438 params.frame_name); |
| 529 } | 439 } |
| 530 | 440 |
| 531 void RenderThread::OnSetCacheCapacities(size_t min_dead_capacity, | |
| 532 size_t max_dead_capacity, | |
| 533 size_t capacity) { | |
| 534 EnsureWebKitInitialized(); | |
| 535 WebCache::setCapacities( | |
| 536 min_dead_capacity, max_dead_capacity, capacity); | |
| 537 } | |
| 538 | |
| 539 void RenderThread::OnClearCache() { | |
| 540 EnsureWebKitInitialized(); | |
| 541 WebCache::clear(); | |
| 542 } | |
| 543 | |
| 544 void RenderThread::OnGetCacheResourceStats() { | |
| 545 EnsureWebKitInitialized(); | |
| 546 WebCache::ResourceTypeStats stats; | |
| 547 WebCache::getResourceTypeStats(&stats); | |
| 548 Send(new ViewHostMsg_ResourceTypeStats(stats)); | |
| 549 } | |
| 550 | |
| 551 #if defined(USE_TCMALLOC) | |
| 552 void RenderThread::OnGetRendererTcmalloc() { | |
| 553 std::string result; | |
| 554 char buffer[1024 * 32]; | |
| 555 base::ProcessId pid = base::GetCurrentProcId(); | |
| 556 MallocExtension::instance()->GetStats(buffer, sizeof(buffer)); | |
| 557 result.append(buffer); | |
| 558 Send(new ViewHostMsg_RendererTcmalloc(pid, result)); | |
| 559 } | |
| 560 #endif | |
| 561 | |
| 562 void RenderThread::OnGetV8HeapStats() { | |
| 563 v8::HeapStatistics heap_stats; | |
| 564 v8::V8::GetHeapStatistics(&heap_stats); | |
| 565 Send(new ViewHostMsg_V8HeapStats(heap_stats.total_heap_size(), | |
| 566 heap_stats.used_heap_size())); | |
| 567 } | |
| 568 | |
| 569 void RenderThread::CloseCurrentConnections() { | 441 void RenderThread::CloseCurrentConnections() { |
| 570 Send(new ViewHostMsg_CloseCurrentConnections()); | 442 Send(new ViewHostMsg_CloseCurrentConnections()); |
| 571 } | 443 } |
| 572 | 444 |
| 573 void RenderThread::SetCacheMode(bool enabled) { | 445 void RenderThread::SetCacheMode(bool enabled) { |
| 574 Send(new ViewHostMsg_SetCacheMode(enabled)); | 446 Send(new ViewHostMsg_SetCacheMode(enabled)); |
| 575 } | 447 } |
| 576 | 448 |
| 577 void RenderThread::ClearCache(bool preserve_ssl_host_info) { | 449 void RenderThread::ClearCache(bool preserve_ssl_host_info) { |
| 578 int rv; | 450 int rv; |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 656 webkit_client_.reset(new RendererWebKitClientImpl); | 528 webkit_client_.reset(new RendererWebKitClientImpl); |
| 657 WebKit::initialize(webkit_client_.get()); | 529 WebKit::initialize(webkit_client_.get()); |
| 658 | 530 |
| 659 WebScriptController::enableV8SingleThreadMode(); | 531 WebScriptController::enableV8SingleThreadMode(); |
| 660 | 532 |
| 661 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | 533 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
| 662 | 534 |
| 663 webkit_glue::EnableWebCoreLogChannels( | 535 webkit_glue::EnableWebCoreLogChannels( |
| 664 command_line.GetSwitchValueASCII(switches::kWebCoreLogChannels)); | 536 command_line.GetSwitchValueASCII(switches::kWebCoreLogChannels)); |
| 665 | 537 |
| 666 // chrome: pages should not be accessible by normal content, and should | |
| 667 // also be unable to script anything but themselves (to help limit the damage | |
| 668 // that a corrupt chrome: page could cause). | |
| 669 WebString chrome_ui_scheme(ASCIIToUTF16(chrome::kChromeUIScheme)); | |
| 670 WebSecurityPolicy::registerURLSchemeAsDisplayIsolated(chrome_ui_scheme); | |
| 671 | |
| 672 // chrome-extension: resources shouldn't trigger insecure content warnings. | |
| 673 WebString extension_scheme(ASCIIToUTF16(chrome::kExtensionScheme)); | |
| 674 WebSecurityPolicy::registerURLSchemeAsSecure(extension_scheme); | |
| 675 | |
| 676 if (command_line.HasSwitch(switches::kEnableBenchmarking)) | 538 if (command_line.HasSwitch(switches::kEnableBenchmarking)) |
| 677 RegisterExtension(extensions_v8::BenchmarkingExtension::Get()); | 539 RegisterExtension(extensions_v8::BenchmarkingExtension::Get()); |
| 678 | 540 |
| 679 if (command_line.HasSwitch(switches::kPlaybackMode) || | 541 if (command_line.HasSwitch(switches::kPlaybackMode) || |
| 680 command_line.HasSwitch(switches::kRecordMode) || | 542 command_line.HasSwitch(switches::kRecordMode) || |
| 681 command_line.HasSwitch(switches::kNoJsRandomness)) { | 543 command_line.HasSwitch(switches::kNoJsRandomness)) { |
| 682 RegisterExtension(extensions_v8::PlaybackExtension::Get()); | 544 RegisterExtension(extensions_v8::PlaybackExtension::Get()); |
| 683 } | 545 } |
| 684 | 546 |
| 685 web_database_observer_impl_.reset(new WebDatabaseObserverImpl(this)); | 547 web_database_observer_impl_.reset(new WebDatabaseObserverImpl(this)); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 765 } | 627 } |
| 766 | 628 |
| 767 void RenderThread::ScheduleIdleHandler(double initial_delay_s) { | 629 void RenderThread::ScheduleIdleHandler(double initial_delay_s) { |
| 768 idle_notification_delay_in_s_ = initial_delay_s; | 630 idle_notification_delay_in_s_ = initial_delay_s; |
| 769 idle_timer_.Stop(); | 631 idle_timer_.Stop(); |
| 770 idle_timer_.Start( | 632 idle_timer_.Start( |
| 771 base::TimeDelta::FromSeconds(static_cast<int64>(initial_delay_s)), | 633 base::TimeDelta::FromSeconds(static_cast<int64>(initial_delay_s)), |
| 772 this, &RenderThread::IdleHandler); | 634 this, &RenderThread::IdleHandler); |
| 773 } | 635 } |
| 774 | 636 |
| 775 void RenderThread::OnPurgeMemory() { | |
| 776 EnsureWebKitInitialized(); | |
| 777 | |
| 778 // Clear the object cache (as much as possible; some live objects cannot be | |
| 779 // freed). | |
| 780 WebCache::clear(); | |
| 781 | |
| 782 // Clear the font/glyph cache. | |
| 783 WebFontCache::clear(); | |
| 784 | |
| 785 // Clear the Cross-Origin Preflight cache. | |
| 786 WebCrossOriginPreflightResultCache::clear(); | |
| 787 | |
| 788 // Release all freeable memory from the SQLite process-global page cache (a | |
| 789 // low-level object which backs the Connection-specific page caches). | |
| 790 while (sqlite3_release_memory(std::numeric_limits<int>::max()) > 0) { | |
| 791 } | |
| 792 | |
| 793 // Repeatedly call the V8 idle notification until it returns true ("nothing | |
| 794 // more to free"). Note that it makes more sense to do this than to implement | |
| 795 // a new "delete everything" pass because object references make it difficult | |
| 796 // to free everything possible in just one pass. | |
| 797 while (!v8::V8::IdleNotification()) { | |
| 798 } | |
| 799 | |
| 800 #if (defined(OS_WIN) || defined(OS_LINUX)) && defined(USE_TCMALLOC) | |
| 801 // Tell tcmalloc to release any free pages it's still holding. | |
| 802 MallocExtension::instance()->ReleaseFreeMemory(); | |
| 803 #endif | |
| 804 } | |
| 805 | |
| 806 void RenderThread::OnPurgePluginListCache(bool reload_pages) { | 637 void RenderThread::OnPurgePluginListCache(bool reload_pages) { |
| 807 EnsureWebKitInitialized(); | 638 EnsureWebKitInitialized(); |
| 808 // The call below will cause a GetPlugins call with refresh=true, but at this | 639 // The call below will cause a GetPlugins call with refresh=true, but at this |
| 809 // point we already know that the browser has refreshed its list, so disable | 640 // point we already know that the browser has refreshed its list, so disable |
| 810 // refresh temporarily to prevent each renderer process causing the list to be | 641 // refresh temporarily to prevent each renderer process causing the list to be |
| 811 // regenerated. | 642 // regenerated. |
| 812 plugin_refresh_allowed_ = false; | 643 plugin_refresh_allowed_ = false; |
| 813 WebKit::resetPluginCache(reload_pages); | 644 WebKit::resetPluginCache(reload_pages); |
| 814 plugin_refresh_allowed_ = true; | 645 plugin_refresh_allowed_ = true; |
| 815 } | 646 } |
| 816 | 647 |
| 817 void RenderThread::OnSetIsIncognitoProcess(bool is_incognito_process) { | |
| 818 is_incognito_process_ = is_incognito_process; | |
| 819 } | |
| 820 | |
| 821 void RenderThread::OnGpuChannelEstablished( | 648 void RenderThread::OnGpuChannelEstablished( |
| 822 const IPC::ChannelHandle& channel_handle, | 649 const IPC::ChannelHandle& channel_handle, |
| 823 base::ProcessHandle renderer_process_for_gpu, | 650 base::ProcessHandle renderer_process_for_gpu, |
| 824 const GPUInfo& gpu_info) { | 651 const GPUInfo& gpu_info) { |
| 825 gpu_channel_->set_gpu_info(gpu_info); | 652 gpu_channel_->set_gpu_info(gpu_info); |
| 826 content::GetContentClient()->SetGpuInfo(gpu_info); | 653 content::GetContentClient()->SetGpuInfo(gpu_info); |
| 827 | 654 |
| 828 if (!channel_handle.name.empty() && renderer_process_for_gpu != 0) { | 655 if (!channel_handle.name.empty() && renderer_process_for_gpu != 0) { |
| 829 // Connect to the GPU process if a channel name was received. | 656 // Connect to the GPU process if a channel name was received. |
| 830 gpu_channel_->Connect(channel_handle, renderer_process_for_gpu); | 657 gpu_channel_->Connect(channel_handle, renderer_process_for_gpu); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 858 return true; | 685 return true; |
| 859 } | 686 } |
| 860 | 687 |
| 861 return false; | 688 return false; |
| 862 } | 689 } |
| 863 | 690 |
| 864 void RenderThread::RegisterExtension(v8::Extension* extension) { | 691 void RenderThread::RegisterExtension(v8::Extension* extension) { |
| 865 WebScriptController::registerExtension(extension); | 692 WebScriptController::registerExtension(extension); |
| 866 v8_extensions_.insert(extension->name()); | 693 v8_extensions_.insert(extension->name()); |
| 867 } | 694 } |
| OLD | NEW |