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

Side by Side Diff: chrome/renderer/render_thread.cc

Issue 6765011: Move the dispatching of extension messages out of RenderThread. This also moves a bunch of exten... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 9 years, 9 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "chrome/renderer/render_thread.h" 5 #include "chrome/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/stats_table.h" 17 #include "base/metrics/stats_table.h"
18 #include "base/process_util.h" 18 #include "base/process_util.h"
19 #include "base/shared_memory.h" 19 #include "base/shared_memory.h"
20 #include "base/string_util.h" 20 #include "base/string_util.h"
21 #include "base/task.h" 21 #include "base/task.h"
22 #include "base/threading/thread_local.h" 22 #include "base/threading/thread_local.h"
23 #include "base/utf_string_conversions.h" 23 #include "base/utf_string_conversions.h"
24 #include "base/values.h" 24 #include "base/values.h"
25 #include "chrome/common/child_process_logging.h" 25 #include "chrome/common/child_process_logging.h"
26 #include "chrome/common/chrome_switches.h" 26 #include "chrome/common/chrome_switches.h"
27 #include "chrome/common/extensions/extension.h"
28 #include "chrome/common/extensions/extension_localization_peer.h" 27 #include "chrome/common/extensions/extension_localization_peer.h"
29 #include "chrome/common/extensions/extension_messages.h"
30 #include "chrome/common/extensions/extension_set.h"
31 #include "chrome/common/render_messages.h" 28 #include "chrome/common/render_messages.h"
32 #include "chrome/common/spellcheck_messages.h" 29 #include "chrome/common/spellcheck_messages.h"
33 #include "chrome/common/safebrowsing_messages.h" 30 #include "chrome/common/safebrowsing_messages.h"
34 #include "chrome/common/url_constants.h" 31 #include "chrome/common/url_constants.h"
35 #include "chrome/renderer/automation/dom_automation_v8_extension.h" 32 #include "chrome/renderer/automation/dom_automation_v8_extension.h"
36 #include "chrome/renderer/devtools_agent_filter.h" 33 #include "chrome/renderer/devtools_agent_filter.h"
37 #include "chrome/renderer/extension_groups.h" 34 #include "chrome/renderer/extensions/extension_dispatcher.h"
38 #include "chrome/renderer/extensions/chrome_app_bindings.h"
39 #include "chrome/renderer/extensions/event_bindings.h"
40 #include "chrome/renderer/extensions/extension_process_bindings.h"
41 #include "chrome/renderer/extensions/js_only_v8_extensions.h"
42 #include "chrome/renderer/extensions/renderer_extension_bindings.h"
43 #include "chrome/renderer/external_extension.h" 35 #include "chrome/renderer/external_extension.h"
44 #include "chrome/renderer/loadtimes_extension_bindings.h" 36 #include "chrome/renderer/loadtimes_extension_bindings.h"
45 #include "chrome/renderer/net/renderer_net_predictor.h" 37 #include "chrome/renderer/net/renderer_net_predictor.h"
46 #include "chrome/renderer/render_process_impl.h" 38 #include "chrome/renderer/render_process_impl.h"
47 #include "chrome/renderer/renderer_histogram_snapshots.h" 39 #include "chrome/renderer/renderer_histogram_snapshots.h"
48 #include "chrome/renderer/safe_browsing/phishing_classifier_delegate.h" 40 #include "chrome/renderer/safe_browsing/phishing_classifier_delegate.h"
49 #include "chrome/renderer/search_extension.h" 41 #include "chrome/renderer/search_extension.h"
50 #include "chrome/renderer/searchbox_extension.h" 42 #include "chrome/renderer/searchbox_extension.h"
51 #include "chrome/renderer/security_filter_peer.h" 43 #include "chrome/renderer/security_filter_peer.h"
52 #include "chrome/renderer/spellchecker/spellcheck.h" 44 #include "chrome/renderer/spellchecker/spellcheck.h"
53 #include "chrome/renderer/user_script_slave.h"
54 #include "content/common/appcache/appcache_dispatcher.h" 45 #include "content/common/appcache/appcache_dispatcher.h"
55 #include "content/common/database_messages.h" 46 #include "content/common/database_messages.h"
56 #include "content/common/db_message_filter.h" 47 #include "content/common/db_message_filter.h"
57 #include "content/common/dom_storage_messages.h" 48 #include "content/common/dom_storage_messages.h"
58 #include "content/common/gpu_messages.h" 49 #include "content/common/gpu_messages.h"
59 #include "content/common/plugin_messages.h" 50 #include "content/common/plugin_messages.h"
60 #include "content/common/renderer_preferences.h" 51 #include "content/common/renderer_preferences.h"
61 #include "content/common/resource_dispatcher.h" 52 #include "content/common/resource_dispatcher.h"
62 #include "content/common/resource_messages.h" 53 #include "content/common/resource_messages.h"
63 #include "content/common/view_messages.h" 54 #include "content/common/view_messages.h"
64 #include "content/common/web_database_observer_impl.h" 55 #include "content/common/web_database_observer_impl.h"
65 #include "content/plugin/npobject_util.h" 56 #include "content/plugin/npobject_util.h"
57 #include "content/renderer/content_renderer_client.h"
66 #include "content/renderer/cookie_message_filter.h" 58 #include "content/renderer/cookie_message_filter.h"
67 #include "content/renderer/gpu_channel_host.h" 59 #include "content/renderer/gpu_channel_host.h"
68 #include "content/renderer/gpu_video_service_host.h" 60 #include "content/renderer/gpu_video_service_host.h"
69 #include "content/renderer/indexed_db_dispatcher.h" 61 #include "content/renderer/indexed_db_dispatcher.h"
70 #include "content/renderer/plugin_channel_host.h" 62 #include "content/renderer/plugin_channel_host.h"
71 #include "content/renderer/render_process_observer.h" 63 #include "content/renderer/render_process_observer.h"
72 #include "content/renderer/render_view.h" 64 #include "content/renderer/render_view.h"
73 #include "content/renderer/render_view_visitor.h" 65 #include "content/renderer/render_view_visitor.h"
74 #include "content/renderer/renderer_webidbfactory_impl.h" 66 #include "content/renderer/renderer_webidbfactory_impl.h"
75 #include "content/renderer/renderer_webkitclient_impl.h" 67 #include "content/renderer/renderer_webkitclient_impl.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 using WebKit::WebRuntimeFeatures; 118 using WebKit::WebRuntimeFeatures;
127 using WebKit::WebSecurityPolicy; 119 using WebKit::WebSecurityPolicy;
128 using WebKit::WebScriptController; 120 using WebKit::WebScriptController;
129 using WebKit::WebString; 121 using WebKit::WebString;
130 using WebKit::WebStorageEventDispatcher; 122 using WebKit::WebStorageEventDispatcher;
131 using WebKit::WebView; 123 using WebKit::WebView;
132 124
133 namespace { 125 namespace {
134 static const unsigned int kCacheStatsDelayMS = 2000 /* milliseconds */; 126 static const unsigned int kCacheStatsDelayMS = 2000 /* milliseconds */;
135 static const double kInitialIdleHandlerDelayS = 1.0 /* seconds */; 127 static const double kInitialIdleHandlerDelayS = 1.0 /* seconds */;
136 static const double kInitialExtensionIdleHandlerDelayS = 5.0 /* seconds */;
137 static const int64 kMaxExtensionIdleHandlerDelayS = 5*60 /* seconds */;
138 128
139 // Keep the global RenderThread in a TLS slot so it is impossible to access 129 // Keep the global RenderThread in a TLS slot so it is impossible to access
140 // incorrectly from the wrong thread. 130 // incorrectly from the wrong thread.
141 static base::LazyInstance<base::ThreadLocalPointer<RenderThread> > lazy_tls( 131 static base::LazyInstance<base::ThreadLocalPointer<RenderThread> > lazy_tls(
142 base::LINKER_INITIALIZED); 132 base::LINKER_INITIALIZED);
143 133
144 #if defined(OS_POSIX) 134 #if defined(OS_POSIX)
145 class SuicideOnChannelErrorFilter : public IPC::ChannelProxy::MessageFilter { 135 class SuicideOnChannelErrorFilter : public IPC::ChannelProxy::MessageFilter {
146 void OnChannelError() { 136 void OnChannelError() {
147 // On POSIX, at least, one can install an unload handler which loops 137 // On POSIX, at least, one can install an unload handler which loops
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 #endif 272 #endif
283 273
284 lazy_tls.Pointer()->Set(this); 274 lazy_tls.Pointer()->Set(this);
285 #if defined(OS_WIN) 275 #if defined(OS_WIN)
286 // If you are running plugins in this thread you need COM active but in 276 // If you are running plugins in this thread you need COM active but in
287 // the normal case you don't. 277 // the normal case you don't.
288 if (RenderProcessImpl::InProcessPlugins()) 278 if (RenderProcessImpl::InProcessPlugins())
289 CoInitialize(0); 279 CoInitialize(0);
290 #endif 280 #endif
291 281
292 std::string type_str = CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
293 switches::kProcessType);
294 // In single process the single process is all there is. 282 // In single process the single process is all there is.
295 is_extension_process_ = type_str == switches::kExtensionProcess ||
296 CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess);
297 is_incognito_process_ = false; 283 is_incognito_process_ = false;
298 suspend_webkit_shared_timer_ = true; 284 suspend_webkit_shared_timer_ = true;
299 notify_webkit_of_modal_loop_ = true; 285 notify_webkit_of_modal_loop_ = true;
300 plugin_refresh_allowed_ = true; 286 plugin_refresh_allowed_ = true;
301 cache_stats_task_pending_ = false; 287 cache_stats_task_pending_ = false;
302 widget_count_ = 0; 288 widget_count_ = 0;
303 hidden_widget_count_ = 0; 289 hidden_widget_count_ = 0;
304 idle_notification_delay_in_s_ = is_extension_process_ ? 290 idle_notification_delay_in_s_ = kInitialIdleHandlerDelayS;
305 kInitialExtensionIdleHandlerDelayS : kInitialIdleHandlerDelayS;
306 task_factory_.reset(new ScopedRunnableMethodFactory<RenderThread>(this)); 291 task_factory_.reset(new ScopedRunnableMethodFactory<RenderThread>(this));
307 292
308 resource_dispatcher()->set_observer(new RenderResourceObserver()); 293 resource_dispatcher()->set_observer(new RenderResourceObserver());
309 294
310 visited_link_slave_.reset(new VisitedLinkSlave()); 295 visited_link_slave_.reset(new VisitedLinkSlave());
311 user_script_slave_.reset(new UserScriptSlave(&extensions_));
312 renderer_net_predictor_.reset(new RendererNetPredictor()); 296 renderer_net_predictor_.reset(new RendererNetPredictor());
313 histogram_snapshots_.reset(new RendererHistogramSnapshots()); 297 histogram_snapshots_.reset(new RendererHistogramSnapshots());
314 appcache_dispatcher_.reset(new AppCacheDispatcher(this)); 298 appcache_dispatcher_.reset(new AppCacheDispatcher(this));
315 indexed_db_dispatcher_.reset(new IndexedDBDispatcher()); 299 indexed_db_dispatcher_.reset(new IndexedDBDispatcher());
316 spellchecker_.reset(new SpellCheck()); 300 spellchecker_.reset(new SpellCheck());
317 301
318 devtools_agent_filter_ = new DevToolsAgentFilter(); 302 devtools_agent_filter_ = new DevToolsAgentFilter();
319 AddFilter(devtools_agent_filter_.get()); 303 AddFilter(devtools_agent_filter_.get());
320 304
321 db_message_filter_ = new DBMessageFilter(); 305 db_message_filter_ = new DBMessageFilter();
322 AddFilter(db_message_filter_.get()); 306 AddFilter(db_message_filter_.get());
323 307
324 cookie_message_filter_ = new CookieMessageFilter(); 308 cookie_message_filter_ = new CookieMessageFilter();
325 AddFilter(cookie_message_filter_.get()); 309 AddFilter(cookie_message_filter_.get());
326 310
327 #if defined(OS_POSIX) 311 #if defined(OS_POSIX)
328 suicide_on_channel_error_filter_ = new SuicideOnChannelErrorFilter; 312 suicide_on_channel_error_filter_ = new SuicideOnChannelErrorFilter;
329 AddFilter(suicide_on_channel_error_filter_.get()); 313 AddFilter(suicide_on_channel_error_filter_.get());
330 #endif 314 #endif
331 315
316 AddObserver(new ExtensionDispatcher());
317
332 TRACE_EVENT_END("RenderThread::Init", 0, ""); 318 TRACE_EVENT_END("RenderThread::Init", 0, "");
333 } 319 }
334 320
335 RenderThread::~RenderThread() { 321 RenderThread::~RenderThread() {
336 FOR_EACH_OBSERVER( 322 FOR_EACH_OBSERVER(
337 RenderProcessObserver, observers_, OnRenderProcessShutdown()); 323 RenderProcessObserver, observers_, OnRenderProcessShutdown());
338 324
339 // Wait for all databases to be closed. 325 // Wait for all databases to be closed.
340 if (web_database_observer_impl_.get()) 326 if (web_database_observer_impl_.get())
341 web_database_observer_impl_->WaitForAllDatabasesToClose(); 327 web_database_observer_impl_->WaitForAllDatabasesToClose();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 RenderView* view = RenderView::FromWebView(frame->view()); 362 RenderView* view = RenderView::FromWebView(frame->view());
377 if (view) 363 if (view)
378 routing_id = view->routing_id(); 364 routing_id = view->routing_id();
379 } 365 }
380 } else { 366 } else {
381 DLOG(WARNING) << "Not called within a script context!"; 367 DLOG(WARNING) << "Not called within a script context!";
382 } 368 }
383 return routing_id; 369 return routing_id;
384 } 370 }
385 371
386 const ExtensionSet* RenderThread::GetExtensions() const {
387 return &extensions_;
388 }
389
390 bool RenderThread::Send(IPC::Message* msg) { 372 bool RenderThread::Send(IPC::Message* msg) {
391 // Certain synchronous messages cannot always be processed synchronously by 373 // Certain synchronous messages cannot always be processed synchronously by
392 // the browser, e.g., Chrome frame communicating with the embedding browser. 374 // the browser, e.g., Chrome frame communicating with the embedding browser.
393 // This could cause a complete hang of Chrome if a windowed plug-in is trying 375 // This could cause a complete hang of Chrome if a windowed plug-in is trying
394 // to communicate with the renderer thread since the browser's UI thread 376 // to communicate with the renderer thread since the browser's UI thread
395 // could be stuck (within a Windows API call) trying to synchronously 377 // could be stuck (within a Windows API call) trying to synchronously
396 // communicate with the plug-in. The remedy is to pump messages on this 378 // communicate with the plug-in. The remedy is to pump messages on this
397 // thread while the browser is processing this request. This creates an 379 // thread while the browser is processing this request. This creates an
398 // opportunity for re-entrancy into WebKit, so we need to take care to disable 380 // opportunity for re-entrancy into WebKit, so we need to take care to disable
399 // callbacks, timers, and pending network loads that could trigger such 381 // callbacks, timers, and pending network loads that could trigger such
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 channel()->AddFilter(filter); 483 channel()->AddFilter(filter);
502 } 484 }
503 485
504 void RenderThread::RemoveFilter(IPC::ChannelProxy::MessageFilter* filter) { 486 void RenderThread::RemoveFilter(IPC::ChannelProxy::MessageFilter* filter) {
505 channel()->RemoveFilter(filter); 487 channel()->RemoveFilter(filter);
506 } 488 }
507 489
508 void RenderThread::WidgetHidden() { 490 void RenderThread::WidgetHidden() {
509 DCHECK(hidden_widget_count_ < widget_count_); 491 DCHECK(hidden_widget_count_ < widget_count_);
510 hidden_widget_count_++; 492 hidden_widget_count_++;
511 if (!is_extension_process_ && 493
512 widget_count_ && hidden_widget_count_ == widget_count_) 494 if (!content::GetContentClient()->renderer()->
495 RunIdleHandlerWhenWidgetsHidden()) {
496 return;
497 }
498
499 if (widget_count_ && hidden_widget_count_ == widget_count_)
513 ScheduleIdleHandler(kInitialIdleHandlerDelayS); 500 ScheduleIdleHandler(kInitialIdleHandlerDelayS);
514 } 501 }
515 502
516 void RenderThread::WidgetRestored() { 503 void RenderThread::WidgetRestored() {
517 DCHECK_GT(hidden_widget_count_, 0); 504 DCHECK_GT(hidden_widget_count_, 0);
518 hidden_widget_count_--; 505 hidden_widget_count_--;
519 if (!is_extension_process_) 506 if (!content::GetContentClient()->renderer()->
520 idle_timer_.Stop(); 507 RunIdleHandlerWhenWidgetsHidden()) {
521 } 508 return;
509 }
522 510
523 bool RenderThread::IsExtensionProcess() const { 511 idle_timer_.Stop();
524 return is_extension_process_;
525 } 512 }
526 513
527 bool RenderThread::IsIncognitoProcess() const { 514 bool RenderThread::IsIncognitoProcess() const {
528 return is_incognito_process_; 515 return is_incognito_process_;
529 } 516 }
530 517
531 void RenderThread::AddObserver(RenderProcessObserver* observer) { 518 void RenderThread::AddObserver(RenderProcessObserver* observer) {
532 observers_.AddObserver(observer); 519 observers_.AddObserver(observer);
533 } 520 }
534 521
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 RenderViewContentSettingsSetter setter(url, content_settings); 560 RenderViewContentSettingsSetter setter(url, content_settings);
574 RenderView::ForEach(&setter); 561 RenderView::ForEach(&setter);
575 } 562 }
576 563
577 void RenderThread::OnSetZoomLevelForCurrentURL(const GURL& url, 564 void RenderThread::OnSetZoomLevelForCurrentURL(const GURL& url,
578 double zoom_level) { 565 double zoom_level) {
579 RenderViewZoomer zoomer(url, zoom_level); 566 RenderViewZoomer zoomer(url, zoom_level);
580 RenderView::ForEach(&zoomer); 567 RenderView::ForEach(&zoomer);
581 } 568 }
582 569
583 void RenderThread::OnUpdateUserScripts(base::SharedMemoryHandle scripts) {
584 DCHECK(base::SharedMemory::IsHandleValid(scripts)) << "Bad scripts handle";
585 user_script_slave_->UpdateScripts(scripts);
586 UpdateActiveExtensions();
587 }
588
589 void RenderThread::OnSetExtensionFunctionNames(
590 const std::vector<std::string>& names) {
591 ExtensionProcessBindings::SetFunctionNames(names);
592 }
593
594 void RenderThread::OnExtensionLoaded(const ExtensionMsg_Loaded_Params& params) {
595 scoped_refptr<const Extension> extension(params.ConvertToExtension());
596 if (!extension) {
597 // This can happen if extension parsing fails for any reason. One reason
598 // this can legitimately happen is if the
599 // --enable-experimental-extension-apis changes at runtime, which happens
600 // during browser tests. Existing renderers won't know about the change.
601 return;
602 }
603
604 extensions_.Insert(extension);
605 }
606
607 void RenderThread::OnSetExtensionScriptingWhitelist(
608 const Extension::ScriptingWhitelist& extension_ids) {
609 Extension::SetScriptingWhitelist(extension_ids);
610 }
611
612 void RenderThread::OnExtensionUnloaded(const std::string& id) {
613 extensions_.Remove(id);
614 }
615
616 void RenderThread::OnPageActionsUpdated(
617 const std::string& extension_id,
618 const std::vector<std::string>& page_actions) {
619 ExtensionProcessBindings::SetPageActions(extension_id, page_actions);
620 }
621
622 void RenderThread::OnExtensionSetAPIPermissions(
623 const std::string& extension_id,
624 const std::set<std::string>& permissions) {
625 ExtensionProcessBindings::SetAPIPermissions(extension_id, permissions);
626
627 // This is called when starting a new extension page, so start the idle
628 // handler ticking.
629 ScheduleIdleHandler(kInitialExtensionIdleHandlerDelayS);
630
631 UpdateActiveExtensions();
632 }
633
634 void RenderThread::OnExtensionSetHostPermissions(
635 const GURL& extension_url, const std::vector<URLPattern>& permissions) {
636 ExtensionProcessBindings::SetHostPermissions(extension_url, permissions);
637 }
638
639 void RenderThread::OnDOMStorageEvent( 570 void RenderThread::OnDOMStorageEvent(
640 const DOMStorageMsg_Event_Params& params) { 571 const DOMStorageMsg_Event_Params& params) {
641 if (!dom_storage_event_dispatcher_.get()) 572 if (!dom_storage_event_dispatcher_.get())
642 dom_storage_event_dispatcher_.reset(WebStorageEventDispatcher::create()); 573 dom_storage_event_dispatcher_.reset(WebStorageEventDispatcher::create());
643 dom_storage_event_dispatcher_->dispatchStorageEvent(params.key, 574 dom_storage_event_dispatcher_->dispatchStorageEvent(params.key,
644 params.old_value, params.new_value, params.origin, params.url, 575 params.old_value, params.new_value, params.origin, params.url,
645 params.storage_type == DOM_STORAGE_LOCAL); 576 params.storage_type == DOM_STORAGE_LOCAL);
646 } 577 }
647 578
648 bool RenderThread::OnControlMessageReceived(const IPC::Message& msg) { 579 bool RenderThread::OnControlMessageReceived(const IPC::Message& msg) {
(...skipping 26 matching lines...) Expand all
675 // is there a new non-windows message I should add here? 606 // is there a new non-windows message I should add here?
676 IPC_MESSAGE_HANDLER(ViewMsg_New, OnCreateNewView) 607 IPC_MESSAGE_HANDLER(ViewMsg_New, OnCreateNewView)
677 IPC_MESSAGE_HANDLER(ViewMsg_SetCacheCapacities, OnSetCacheCapacities) 608 IPC_MESSAGE_HANDLER(ViewMsg_SetCacheCapacities, OnSetCacheCapacities)
678 IPC_MESSAGE_HANDLER(ViewMsg_ClearCache, OnClearCache) 609 IPC_MESSAGE_HANDLER(ViewMsg_ClearCache, OnClearCache)
679 IPC_MESSAGE_HANDLER(ViewMsg_GetRendererHistograms, OnGetRendererHistograms) 610 IPC_MESSAGE_HANDLER(ViewMsg_GetRendererHistograms, OnGetRendererHistograms)
680 #if defined(USE_TCMALLOC) 611 #if defined(USE_TCMALLOC)
681 IPC_MESSAGE_HANDLER(ViewMsg_GetRendererTcmalloc, OnGetRendererTcmalloc) 612 IPC_MESSAGE_HANDLER(ViewMsg_GetRendererTcmalloc, OnGetRendererTcmalloc)
682 #endif 613 #endif
683 IPC_MESSAGE_HANDLER(ViewMsg_GetV8HeapStats, OnGetV8HeapStats) 614 IPC_MESSAGE_HANDLER(ViewMsg_GetV8HeapStats, OnGetV8HeapStats)
684 IPC_MESSAGE_HANDLER(ViewMsg_GetCacheResourceStats, OnGetCacheResourceStats) 615 IPC_MESSAGE_HANDLER(ViewMsg_GetCacheResourceStats, OnGetCacheResourceStats)
685 IPC_MESSAGE_HANDLER(ViewMsg_UserScripts_UpdatedScripts, OnUpdateUserScripts)
686 // TODO(rafaelw): create an ExtensionDispatcher that handles extension
687 // messages seperates their handling from the RenderThread.
688 IPC_MESSAGE_HANDLER(ExtensionMsg_MessageInvoke, OnExtensionMessageInvoke)
689 IPC_MESSAGE_HANDLER(ExtensionMsg_SetFunctionNames,
690 OnSetExtensionFunctionNames)
691 IPC_MESSAGE_HANDLER(ExtensionMsg_Loaded, OnExtensionLoaded)
692 IPC_MESSAGE_HANDLER(ExtensionMsg_Unloaded, OnExtensionUnloaded)
693 IPC_MESSAGE_HANDLER(ExtensionMsg_SetScriptingWhitelist,
694 OnSetExtensionScriptingWhitelist)
695 IPC_MESSAGE_HANDLER(ViewMsg_PurgeMemory, OnPurgeMemory) 616 IPC_MESSAGE_HANDLER(ViewMsg_PurgeMemory, OnPurgeMemory)
696 IPC_MESSAGE_HANDLER(ViewMsg_PurgePluginListCache, OnPurgePluginListCache) 617 IPC_MESSAGE_HANDLER(ViewMsg_PurgePluginListCache, OnPurgePluginListCache)
697 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdatePageActions, OnPageActionsUpdated)
698 IPC_MESSAGE_HANDLER(ExtensionMsg_SetAPIPermissions,
699 OnExtensionSetAPIPermissions)
700 IPC_MESSAGE_HANDLER(ExtensionMsg_SetHostPermissions,
701 OnExtensionSetHostPermissions)
702 IPC_MESSAGE_HANDLER(DOMStorageMsg_Event, OnDOMStorageEvent) 618 IPC_MESSAGE_HANDLER(DOMStorageMsg_Event, OnDOMStorageEvent)
703 IPC_MESSAGE_HANDLER(SpellCheckMsg_Init, OnInitSpellChecker) 619 IPC_MESSAGE_HANDLER(SpellCheckMsg_Init, OnInitSpellChecker)
704 IPC_MESSAGE_HANDLER(SpellCheckMsg_WordAdded, OnSpellCheckWordAdded) 620 IPC_MESSAGE_HANDLER(SpellCheckMsg_WordAdded, OnSpellCheckWordAdded)
705 IPC_MESSAGE_HANDLER(SpellCheckMsg_EnableAutoSpellCorrect, 621 IPC_MESSAGE_HANDLER(SpellCheckMsg_EnableAutoSpellCorrect,
706 OnSpellCheckEnableAutoSpellCorrect) 622 OnSpellCheckEnableAutoSpellCorrect)
707 IPC_MESSAGE_HANDLER(GpuMsg_GpuChannelEstablished, OnGpuChannelEstablished) 623 IPC_MESSAGE_HANDLER(GpuMsg_GpuChannelEstablished, OnGpuChannelEstablished)
708 IPC_MESSAGE_HANDLER(SafeBrowsingMsg_SetPhishingModel, OnSetPhishingModel) 624 IPC_MESSAGE_HANDLER(SafeBrowsingMsg_SetPhishingModel, OnSetPhishingModel)
709 IPC_MESSAGE_UNHANDLED(handled = false) 625 IPC_MESSAGE_UNHANDLED(handled = false)
710 IPC_END_MESSAGE_MAP() 626 IPC_END_MESSAGE_MAP()
711 return handled; 627 return handled;
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 741
826 void RenderThread::ClearCache(bool preserve_ssl_host_info) { 742 void RenderThread::ClearCache(bool preserve_ssl_host_info) {
827 int rv; 743 int rv;
828 Send(new ViewHostMsg_ClearCache(preserve_ssl_host_info, &rv)); 744 Send(new ViewHostMsg_ClearCache(preserve_ssl_host_info, &rv));
829 } 745 }
830 746
831 void RenderThread::EnableSpdy(bool enable) { 747 void RenderThread::EnableSpdy(bool enable) {
832 Send(new ViewHostMsg_EnableSpdy(enable)); 748 Send(new ViewHostMsg_EnableSpdy(enable));
833 } 749 }
834 750
835 void RenderThread::UpdateActiveExtensions() {
836 // In single-process mode, the browser process reports the active extensions.
837 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess))
838 return;
839
840 std::set<std::string> active_extensions;
841 user_script_slave_->GetActiveExtensions(&active_extensions);
842 ExtensionProcessBindings::GetActiveExtensions(&active_extensions);
843 child_process_logging::SetActiveExtensions(active_extensions);
844 }
845
846 void RenderThread::EstablishGpuChannel() { 751 void RenderThread::EstablishGpuChannel() {
847 if (gpu_channel_.get()) { 752 if (gpu_channel_.get()) {
848 // Do nothing if we already have a GPU channel or are already 753 // Do nothing if we already have a GPU channel or are already
849 // establishing one. 754 // establishing one.
850 if (gpu_channel_->state() == GpuChannelHost::kUnconnected || 755 if (gpu_channel_->state() == GpuChannelHost::kUnconnected ||
851 gpu_channel_->state() == GpuChannelHost::kConnected) 756 gpu_channel_->state() == GpuChannelHost::kConnected)
852 return; 757 return;
853 758
854 // Recreate the channel if it has been lost. 759 // Recreate the channel if it has been lost.
855 if (gpu_channel_->state() == GpuChannelHost::kLost) 760 if (gpu_channel_->state() == GpuChannelHost::kLost)
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
894 799
895 static void AddHistogramSample(void* hist, int sample) { 800 static void AddHistogramSample(void* hist, int sample) {
896 base::Histogram* histogram = static_cast<base::Histogram*>(hist); 801 base::Histogram* histogram = static_cast<base::Histogram*>(hist);
897 histogram->Add(sample); 802 histogram->Add(sample);
898 } 803 }
899 804
900 void RenderThread::EnsureWebKitInitialized() { 805 void RenderThread::EnsureWebKitInitialized() {
901 if (webkit_client_.get()) 806 if (webkit_client_.get())
902 return; 807 return;
903 808
904 // For extensions, we want to ensure we call the IdleHandler every so often,
905 // even if the extension keeps up activity.
906 if (is_extension_process_) {
907 forced_idle_timer_.Start(
908 base::TimeDelta::FromSeconds(kMaxExtensionIdleHandlerDelayS),
909 this, &RenderThread::IdleHandler);
910 }
911
912 v8::V8::SetCounterFunction(base::StatsTable::FindLocation); 809 v8::V8::SetCounterFunction(base::StatsTable::FindLocation);
913 v8::V8::SetCreateHistogramFunction(CreateHistogram); 810 v8::V8::SetCreateHistogramFunction(CreateHistogram);
914 v8::V8::SetAddHistogramSampleFunction(AddHistogramSample); 811 v8::V8::SetAddHistogramSampleFunction(AddHistogramSample);
915 812
916 webkit_client_.reset(new RendererWebKitClientImpl); 813 webkit_client_.reset(new RendererWebKitClientImpl);
917 WebKit::initialize(webkit_client_.get()); 814 WebKit::initialize(webkit_client_.get());
918 815
919 WebScriptController::enableV8SingleThreadMode(); 816 WebScriptController::enableV8SingleThreadMode();
920 817
921 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 818 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
922 819
923 webkit_glue::EnableWebCoreLogChannels( 820 webkit_glue::EnableWebCoreLogChannels(
924 command_line.GetSwitchValueASCII(switches::kWebCoreLogChannels)); 821 command_line.GetSwitchValueASCII(switches::kWebCoreLogChannels));
925 822
926 // chrome: pages should not be accessible by normal content, and should 823 // chrome: pages should not be accessible by normal content, and should
927 // also be unable to script anything but themselves (to help limit the damage 824 // also be unable to script anything but themselves (to help limit the damage
928 // that a corrupt chrome: page could cause). 825 // that a corrupt chrome: page could cause).
929 WebString chrome_ui_scheme(ASCIIToUTF16(chrome::kChromeUIScheme)); 826 WebString chrome_ui_scheme(ASCIIToUTF16(chrome::kChromeUIScheme));
930 WebSecurityPolicy::registerURLSchemeAsDisplayIsolated(chrome_ui_scheme); 827 WebSecurityPolicy::registerURLSchemeAsDisplayIsolated(chrome_ui_scheme);
931 828
932 // chrome-extension: resources shouldn't trigger insecure content warnings. 829 // chrome-extension: resources shouldn't trigger insecure content warnings.
933 WebString extension_scheme(ASCIIToUTF16(chrome::kExtensionScheme)); 830 WebString extension_scheme(ASCIIToUTF16(chrome::kExtensionScheme));
934 WebSecurityPolicy::registerURLSchemeAsSecure(extension_scheme); 831 WebSecurityPolicy::registerURLSchemeAsSecure(extension_scheme);
935 832
936 RegisterExtension(extensions_v8::LoadTimesExtension::Get(), false); 833 RegisterExtension(extensions_v8::LoadTimesExtension::Get(), false);
937 RegisterExtension(extensions_v8::ChromeAppExtension::Get(), false);
938 RegisterExtension(extensions_v8::ExternalExtension::Get(), false); 834 RegisterExtension(extensions_v8::ExternalExtension::Get(), false);
939 RegisterExtension(extensions_v8::SearchBoxExtension::Get(), false); 835 RegisterExtension(extensions_v8::SearchBoxExtension::Get(), false);
940 v8::Extension* search_extension = extensions_v8::SearchExtension::Get(); 836 v8::Extension* search_extension = extensions_v8::SearchExtension::Get();
941 // search_extension is null if not enabled. 837 // search_extension is null if not enabled.
942 if (search_extension) 838 if (search_extension)
943 RegisterExtension(search_extension, false); 839 RegisterExtension(search_extension, false);
944 840
945 if (command_line.HasSwitch(switches::kEnableBenchmarking)) 841 if (command_line.HasSwitch(switches::kEnableBenchmarking))
946 RegisterExtension(extensions_v8::BenchmarkingExtension::Get(), false); 842 RegisterExtension(extensions_v8::BenchmarkingExtension::Get(), false);
947 843
948 if (command_line.HasSwitch(switches::kPlaybackMode) || 844 if (command_line.HasSwitch(switches::kPlaybackMode) ||
949 command_line.HasSwitch(switches::kRecordMode) || 845 command_line.HasSwitch(switches::kRecordMode) ||
950 command_line.HasSwitch(switches::kNoJsRandomness)) { 846 command_line.HasSwitch(switches::kNoJsRandomness)) {
951 RegisterExtension(extensions_v8::PlaybackExtension::Get(), false); 847 RegisterExtension(extensions_v8::PlaybackExtension::Get(), false);
952 } 848 }
953 849
954 if (command_line.HasSwitch(switches::kDomAutomationController)) 850 if (command_line.HasSwitch(switches::kDomAutomationController))
955 RegisterExtension(DomAutomationV8Extension::Get(), false); 851 RegisterExtension(DomAutomationV8Extension::Get(), false);
956 852
957 // Add v8 extensions related to chrome extensions.
958 RegisterExtension(ExtensionProcessBindings::Get(), true);
959 RegisterExtension(BaseJsV8Extension::Get(), true);
960 RegisterExtension(JsonSchemaJsV8Extension::Get(), true);
961 RegisterExtension(EventBindings::Get(), true);
962 RegisterExtension(RendererExtensionBindings::Get(), true);
963 RegisterExtension(ExtensionApiTestV8Extension::Get(), true);
964
965 web_database_observer_impl_.reset(new WebDatabaseObserverImpl(this)); 853 web_database_observer_impl_.reset(new WebDatabaseObserverImpl(this));
966 WebKit::WebDatabase::setObserver(web_database_observer_impl_.get()); 854 WebKit::WebDatabase::setObserver(web_database_observer_impl_.get());
967 855
968 WebRuntimeFeatures::enableMediaPlayer( 856 WebRuntimeFeatures::enableMediaPlayer(
969 RenderProcess::current()->HasInitializedMediaLibrary()); 857 RenderProcess::current()->HasInitializedMediaLibrary());
970 858
971 WebRuntimeFeatures::enableSockets( 859 WebRuntimeFeatures::enableSockets(
972 !command_line.HasSwitch(switches::kDisableWebSockets)); 860 !command_line.HasSwitch(switches::kDisableWebSockets));
973 861
974 WebRuntimeFeatures::enableDatabase( 862 WebRuntimeFeatures::enableDatabase(
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1013 !command_line.HasSwitch(switches::kDisableDeviceOrientation)); 901 !command_line.HasSwitch(switches::kDisableDeviceOrientation));
1014 902
1015 WebRuntimeFeatures::enableSpeechInput( 903 WebRuntimeFeatures::enableSpeechInput(
1016 !command_line.HasSwitch(switches::kDisableSpeechInput)); 904 !command_line.HasSwitch(switches::kDisableSpeechInput));
1017 905
1018 WebRuntimeFeatures::enableFileSystem( 906 WebRuntimeFeatures::enableFileSystem(
1019 !command_line.HasSwitch(switches::kDisableFileSystem)); 907 !command_line.HasSwitch(switches::kDisableFileSystem));
1020 908
1021 WebRuntimeFeatures::enableJavaScriptI18NAPI( 909 WebRuntimeFeatures::enableJavaScriptI18NAPI(
1022 !command_line.HasSwitch(switches::kDisableJavaScriptI18NAPI)); 910 !command_line.HasSwitch(switches::kDisableJavaScriptI18NAPI));
911
912 FOR_EACH_OBSERVER(RenderProcessObserver, observers_, WebKitInitialized());
1023 } 913 }
1024 914
1025 void RenderThread::IdleHandler() { 915 void RenderThread::IdleHandler() {
1026 #if (defined(OS_WIN) || defined(OS_LINUX)) && defined(USE_TCMALLOC) 916 #if (defined(OS_WIN) || defined(OS_LINUX)) && defined(USE_TCMALLOC)
1027 MallocExtension::instance()->ReleaseFreeMemory(); 917 MallocExtension::instance()->ReleaseFreeMemory();
1028 #endif 918 #endif
1029 919
1030 v8::V8::IdleNotification(); 920 v8::V8::IdleNotification();
1031 921
1032 // Schedule next invocation. 922 // Schedule next invocation.
1033 // Dampen the delay using the algorithm: 923 // Dampen the delay using the algorithm:
1034 // delay = delay + 1 / (delay + 2) 924 // delay = delay + 1 / (delay + 2)
1035 // Using floor(delay) has a dampening effect such as: 925 // Using floor(delay) has a dampening effect such as:
1036 // 1s, 1, 1, 2, 2, 2, 2, 3, 3, ... 926 // 1s, 1, 1, 2, 2, 2, 2, 3, 3, ...
1037 // Note that idle_notification_delay_in_s_ would be reset to 927 // Note that idle_notification_delay_in_s_ would be reset to
1038 // kInitialIdleHandlerDelayS in RenderThread::WidgetHidden. 928 // kInitialIdleHandlerDelayS in RenderThread::WidgetHidden.
1039 ScheduleIdleHandler(idle_notification_delay_in_s_ + 929 ScheduleIdleHandler(idle_notification_delay_in_s_ +
1040 1.0 / (idle_notification_delay_in_s_ + 2.0)); 930 1.0 / (idle_notification_delay_in_s_ + 2.0));
1041 if (is_extension_process_) { 931
1042 // Dampen the forced delay as well if the extension stays idle for long 932 FOR_EACH_OBSERVER(RenderProcessObserver, observers_, IdleNotification());
1043 // periods of time.
1044 int64 forced_delay_s =
1045 std::max(static_cast<int64>(idle_notification_delay_in_s_),
1046 kMaxExtensionIdleHandlerDelayS);
1047 forced_idle_timer_.Stop();
1048 forced_idle_timer_.Start(
1049 base::TimeDelta::FromSeconds(forced_delay_s),
1050 this, &RenderThread::IdleHandler);
1051 }
1052 } 933 }
1053 934
1054 void RenderThread::ScheduleIdleHandler(double initial_delay_s) { 935 void RenderThread::ScheduleIdleHandler(double initial_delay_s) {
1055 idle_notification_delay_in_s_ = initial_delay_s; 936 idle_notification_delay_in_s_ = initial_delay_s;
1056 idle_timer_.Stop(); 937 idle_timer_.Stop();
1057 idle_timer_.Start( 938 idle_timer_.Start(
1058 base::TimeDelta::FromSeconds(static_cast<int64>(initial_delay_s)), 939 base::TimeDelta::FromSeconds(static_cast<int64>(initial_delay_s)),
1059 this, &RenderThread::IdleHandler); 940 this, &RenderThread::IdleHandler);
1060 } 941 }
1061 942
1062 void RenderThread::OnExtensionMessageInvoke(const std::string& extension_id,
1063 const std::string& function_name,
1064 const ListValue& args,
1065 const GURL& event_url) {
1066 RendererExtensionBindings::Invoke(
1067 extension_id, function_name, args, NULL, event_url);
1068
1069 // Reset the idle handler each time there's any activity like event or message
1070 // dispatch, for which Invoke is the chokepoint.
1071 if (is_extension_process_)
1072 ScheduleIdleHandler(kInitialExtensionIdleHandlerDelayS);
1073 }
1074
1075 void RenderThread::OnPurgeMemory() { 943 void RenderThread::OnPurgeMemory() {
1076 spellchecker_.reset(new SpellCheck()); 944 spellchecker_.reset(new SpellCheck());
1077 945
1078 EnsureWebKitInitialized(); 946 EnsureWebKitInitialized();
1079 947
1080 // Clear the object cache (as much as possible; some live objects cannot be 948 // Clear the object cache (as much as possible; some live objects cannot be
1081 // freed). 949 // freed).
1082 WebCache::clear(); 950 WebCache::clear();
1083 951
1084 // Clear the font/glyph cache. 952 // Clear the font/glyph cache.
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1169 } 1037 }
1170 1038
1171 bool RenderThread::AllowScriptExtension(const std::string& v8_extension_name, 1039 bool RenderThread::AllowScriptExtension(const std::string& v8_extension_name,
1172 const GURL& url, 1040 const GURL& url,
1173 int extension_group) { 1041 int extension_group) {
1174 // If we don't know about it, it was added by WebCore, so we should allow it. 1042 // If we don't know about it, it was added by WebCore, so we should allow it.
1175 if (v8_extensions_.find(v8_extension_name) == v8_extensions_.end()) 1043 if (v8_extensions_.find(v8_extension_name) == v8_extensions_.end())
1176 return true; 1044 return true;
1177 1045
1178 // If the V8 extension is not restricted, allow it to run anywhere. 1046 // If the V8 extension is not restricted, allow it to run anywhere.
1179 bool restrict_to_extensions = v8_extensions_[v8_extension_name]; 1047 bool restrict_to_extensions = v8_extensions_[v8_extension_name];
Matt Perry 2011/03/29 00:48:29 the restrict_to_extensions boolean is something th
jam 2011/03/29 04:55:37 good point, done
1180 if (!restrict_to_extensions) 1048 if (!restrict_to_extensions)
1181 return true; 1049 return true;
1182 1050
1183 // Extension-only bindings should be restricted to content scripts and 1051 ObserverListBase<RenderProcessObserver>::Iterator it(observers_);
1184 // extension-blessed URLs. 1052 RenderProcessObserver* observer;
1185 if (extension_group == EXTENSION_GROUP_CONTENT_SCRIPTS || 1053 while ((observer = it.GetNext()) != NULL) {
1186 extensions_.ExtensionBindingsAllowed(url)) { 1054 if (observer->AllowScriptExtension(v8_extension_name, url, extension_group))
1187 return true; 1055 return true;
1188 } 1056 }
1189 1057
1190 return false; 1058 return false;
1191 } 1059 }
1192 1060
1193 void RenderThread::RegisterExtension(v8::Extension* extension, 1061 void RenderThread::RegisterExtension(v8::Extension* extension,
1194 bool restrict_to_extensions) { 1062 bool restrict_to_extensions) {
1195 WebScriptController::registerExtension(extension); 1063 WebScriptController::registerExtension(extension);
1196 v8_extensions_[extension->name()] = restrict_to_extensions; 1064 v8_extensions_[extension->name()] = restrict_to_extensions;
1197 } 1065 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698