| Index: chrome/renderer/render_thread.cc
|
| ===================================================================
|
| --- chrome/renderer/render_thread.cc (revision 79565)
|
| +++ chrome/renderer/render_thread.cc (working copy)
|
| @@ -24,22 +24,14 @@
|
| #include "base/values.h"
|
| #include "chrome/common/child_process_logging.h"
|
| #include "chrome/common/chrome_switches.h"
|
| -#include "chrome/common/extensions/extension.h"
|
| #include "chrome/common/extensions/extension_localization_peer.h"
|
| -#include "chrome/common/extensions/extension_messages.h"
|
| -#include "chrome/common/extensions/extension_set.h"
|
| #include "chrome/common/render_messages.h"
|
| #include "chrome/common/spellcheck_messages.h"
|
| #include "chrome/common/safebrowsing_messages.h"
|
| #include "chrome/common/url_constants.h"
|
| #include "chrome/renderer/automation/dom_automation_v8_extension.h"
|
| #include "chrome/renderer/devtools_agent_filter.h"
|
| -#include "chrome/renderer/extension_groups.h"
|
| -#include "chrome/renderer/extensions/chrome_app_bindings.h"
|
| -#include "chrome/renderer/extensions/event_bindings.h"
|
| -#include "chrome/renderer/extensions/extension_process_bindings.h"
|
| -#include "chrome/renderer/extensions/js_only_v8_extensions.h"
|
| -#include "chrome/renderer/extensions/renderer_extension_bindings.h"
|
| +#include "chrome/renderer/extensions/extension_dispatcher.h"
|
| #include "chrome/renderer/external_extension.h"
|
| #include "chrome/renderer/loadtimes_extension_bindings.h"
|
| #include "chrome/renderer/net/renderer_net_predictor.h"
|
| @@ -50,7 +42,6 @@
|
| #include "chrome/renderer/searchbox_extension.h"
|
| #include "chrome/renderer/security_filter_peer.h"
|
| #include "chrome/renderer/spellchecker/spellcheck.h"
|
| -#include "chrome/renderer/user_script_slave.h"
|
| #include "content/common/appcache/appcache_dispatcher.h"
|
| #include "content/common/database_messages.h"
|
| #include "content/common/db_message_filter.h"
|
| @@ -63,6 +54,7 @@
|
| #include "content/common/view_messages.h"
|
| #include "content/common/web_database_observer_impl.h"
|
| #include "content/plugin/npobject_util.h"
|
| +#include "content/renderer/content_renderer_client.h"
|
| #include "content/renderer/cookie_message_filter.h"
|
| #include "content/renderer/gpu_channel_host.h"
|
| #include "content/renderer/gpu_video_service_host.h"
|
| @@ -133,8 +125,6 @@
|
| namespace {
|
| static const unsigned int kCacheStatsDelayMS = 2000 /* milliseconds */;
|
| static const double kInitialIdleHandlerDelayS = 1.0 /* seconds */;
|
| -static const double kInitialExtensionIdleHandlerDelayS = 5.0 /* seconds */;
|
| -static const int64 kMaxExtensionIdleHandlerDelayS = 5*60 /* seconds */;
|
|
|
| // Keep the global RenderThread in a TLS slot so it is impossible to access
|
| // incorrectly from the wrong thread.
|
| @@ -289,11 +279,7 @@
|
| CoInitialize(0);
|
| #endif
|
|
|
| - std::string type_str = CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
|
| - switches::kProcessType);
|
| // In single process the single process is all there is.
|
| - is_extension_process_ = type_str == switches::kExtensionProcess ||
|
| - CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess);
|
| is_incognito_process_ = false;
|
| suspend_webkit_shared_timer_ = true;
|
| notify_webkit_of_modal_loop_ = true;
|
| @@ -301,14 +287,12 @@
|
| cache_stats_task_pending_ = false;
|
| widget_count_ = 0;
|
| hidden_widget_count_ = 0;
|
| - idle_notification_delay_in_s_ = is_extension_process_ ?
|
| - kInitialExtensionIdleHandlerDelayS : kInitialIdleHandlerDelayS;
|
| + idle_notification_delay_in_s_ = kInitialIdleHandlerDelayS;
|
| task_factory_.reset(new ScopedRunnableMethodFactory<RenderThread>(this));
|
|
|
| resource_dispatcher()->set_observer(new RenderResourceObserver());
|
|
|
| visited_link_slave_.reset(new VisitedLinkSlave());
|
| - user_script_slave_.reset(new UserScriptSlave(&extensions_));
|
| renderer_net_predictor_.reset(new RendererNetPredictor());
|
| histogram_snapshots_.reset(new RendererHistogramSnapshots());
|
| appcache_dispatcher_.reset(new AppCacheDispatcher(this));
|
| @@ -329,6 +313,8 @@
|
| AddFilter(suicide_on_channel_error_filter_.get());
|
| #endif
|
|
|
| + AddObserver(new ExtensionDispatcher());
|
| +
|
| TRACE_EVENT_END("RenderThread::Init", 0, "");
|
| }
|
|
|
| @@ -383,10 +369,6 @@
|
| return routing_id;
|
| }
|
|
|
| -const ExtensionSet* RenderThread::GetExtensions() const {
|
| - return &extensions_;
|
| -}
|
| -
|
| 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.
|
| @@ -508,20 +490,25 @@
|
| void RenderThread::WidgetHidden() {
|
| DCHECK(hidden_widget_count_ < widget_count_);
|
| hidden_widget_count_++;
|
| - if (!is_extension_process_ &&
|
| - widget_count_ && hidden_widget_count_ == 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 (!is_extension_process_)
|
| - idle_timer_.Stop();
|
| -}
|
| + if (!content::GetContentClient()->renderer()->
|
| + RunIdleHandlerWhenWidgetsHidden()) {
|
| + return;
|
| + }
|
|
|
| -bool RenderThread::IsExtensionProcess() const {
|
| - return is_extension_process_;
|
| + idle_timer_.Stop();
|
| }
|
|
|
| bool RenderThread::IsIncognitoProcess() const {
|
| @@ -580,62 +567,6 @@
|
| RenderView::ForEach(&zoomer);
|
| }
|
|
|
| -void RenderThread::OnUpdateUserScripts(base::SharedMemoryHandle scripts) {
|
| - DCHECK(base::SharedMemory::IsHandleValid(scripts)) << "Bad scripts handle";
|
| - user_script_slave_->UpdateScripts(scripts);
|
| - UpdateActiveExtensions();
|
| -}
|
| -
|
| -void RenderThread::OnSetExtensionFunctionNames(
|
| - const std::vector<std::string>& names) {
|
| - ExtensionProcessBindings::SetFunctionNames(names);
|
| -}
|
| -
|
| -void RenderThread::OnExtensionLoaded(const ExtensionMsg_Loaded_Params& params) {
|
| - scoped_refptr<const Extension> extension(params.ConvertToExtension());
|
| - if (!extension) {
|
| - // This can happen if extension parsing fails for any reason. One reason
|
| - // this can legitimately happen is if the
|
| - // --enable-experimental-extension-apis changes at runtime, which happens
|
| - // during browser tests. Existing renderers won't know about the change.
|
| - return;
|
| - }
|
| -
|
| - extensions_.Insert(extension);
|
| -}
|
| -
|
| -void RenderThread::OnSetExtensionScriptingWhitelist(
|
| - const Extension::ScriptingWhitelist& extension_ids) {
|
| - Extension::SetScriptingWhitelist(extension_ids);
|
| -}
|
| -
|
| -void RenderThread::OnExtensionUnloaded(const std::string& id) {
|
| - extensions_.Remove(id);
|
| -}
|
| -
|
| -void RenderThread::OnPageActionsUpdated(
|
| - const std::string& extension_id,
|
| - const std::vector<std::string>& page_actions) {
|
| - ExtensionProcessBindings::SetPageActions(extension_id, page_actions);
|
| -}
|
| -
|
| -void RenderThread::OnExtensionSetAPIPermissions(
|
| - const std::string& extension_id,
|
| - const std::set<std::string>& permissions) {
|
| - ExtensionProcessBindings::SetAPIPermissions(extension_id, permissions);
|
| -
|
| - // This is called when starting a new extension page, so start the idle
|
| - // handler ticking.
|
| - ScheduleIdleHandler(kInitialExtensionIdleHandlerDelayS);
|
| -
|
| - UpdateActiveExtensions();
|
| -}
|
| -
|
| -void RenderThread::OnExtensionSetHostPermissions(
|
| - const GURL& extension_url, const std::vector<URLPattern>& permissions) {
|
| - ExtensionProcessBindings::SetHostPermissions(extension_url, permissions);
|
| -}
|
| -
|
| void RenderThread::OnDOMStorageEvent(
|
| const DOMStorageMsg_Event_Params& params) {
|
| if (!dom_storage_event_dispatcher_.get())
|
| @@ -682,23 +613,8 @@
|
| #endif
|
| IPC_MESSAGE_HANDLER(ViewMsg_GetV8HeapStats, OnGetV8HeapStats)
|
| IPC_MESSAGE_HANDLER(ViewMsg_GetCacheResourceStats, OnGetCacheResourceStats)
|
| - IPC_MESSAGE_HANDLER(ViewMsg_UserScripts_UpdatedScripts, OnUpdateUserScripts)
|
| - // TODO(rafaelw): create an ExtensionDispatcher that handles extension
|
| - // messages seperates their handling from the RenderThread.
|
| - IPC_MESSAGE_HANDLER(ExtensionMsg_MessageInvoke, OnExtensionMessageInvoke)
|
| - IPC_MESSAGE_HANDLER(ExtensionMsg_SetFunctionNames,
|
| - OnSetExtensionFunctionNames)
|
| - IPC_MESSAGE_HANDLER(ExtensionMsg_Loaded, OnExtensionLoaded)
|
| - IPC_MESSAGE_HANDLER(ExtensionMsg_Unloaded, OnExtensionUnloaded)
|
| - IPC_MESSAGE_HANDLER(ExtensionMsg_SetScriptingWhitelist,
|
| - OnSetExtensionScriptingWhitelist)
|
| IPC_MESSAGE_HANDLER(ViewMsg_PurgeMemory, OnPurgeMemory)
|
| IPC_MESSAGE_HANDLER(ViewMsg_PurgePluginListCache, OnPurgePluginListCache)
|
| - IPC_MESSAGE_HANDLER(ExtensionMsg_UpdatePageActions, OnPageActionsUpdated)
|
| - IPC_MESSAGE_HANDLER(ExtensionMsg_SetAPIPermissions,
|
| - OnExtensionSetAPIPermissions)
|
| - IPC_MESSAGE_HANDLER(ExtensionMsg_SetHostPermissions,
|
| - OnExtensionSetHostPermissions)
|
| IPC_MESSAGE_HANDLER(DOMStorageMsg_Event, OnDOMStorageEvent)
|
| IPC_MESSAGE_HANDLER(SpellCheckMsg_Init, OnInitSpellChecker)
|
| IPC_MESSAGE_HANDLER(SpellCheckMsg_WordAdded, OnSpellCheckWordAdded)
|
| @@ -832,17 +748,6 @@
|
| Send(new ViewHostMsg_EnableSpdy(enable));
|
| }
|
|
|
| -void RenderThread::UpdateActiveExtensions() {
|
| - // In single-process mode, the browser process reports the active extensions.
|
| - if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess))
|
| - return;
|
| -
|
| - std::set<std::string> active_extensions;
|
| - user_script_slave_->GetActiveExtensions(&active_extensions);
|
| - ExtensionProcessBindings::GetActiveExtensions(&active_extensions);
|
| - child_process_logging::SetActiveExtensions(active_extensions);
|
| -}
|
| -
|
| void RenderThread::EstablishGpuChannel() {
|
| if (gpu_channel_.get()) {
|
| // Do nothing if we already have a GPU channel or are already
|
| @@ -901,14 +806,6 @@
|
| if (webkit_client_.get())
|
| return;
|
|
|
| - // For extensions, we want to ensure we call the IdleHandler every so often,
|
| - // even if the extension keeps up activity.
|
| - if (is_extension_process_) {
|
| - forced_idle_timer_.Start(
|
| - base::TimeDelta::FromSeconds(kMaxExtensionIdleHandlerDelayS),
|
| - this, &RenderThread::IdleHandler);
|
| - }
|
| -
|
| v8::V8::SetCounterFunction(base::StatsTable::FindLocation);
|
| v8::V8::SetCreateHistogramFunction(CreateHistogram);
|
| v8::V8::SetAddHistogramSampleFunction(AddHistogramSample);
|
| @@ -933,35 +830,26 @@
|
| WebString extension_scheme(ASCIIToUTF16(chrome::kExtensionScheme));
|
| WebSecurityPolicy::registerURLSchemeAsSecure(extension_scheme);
|
|
|
| - RegisterExtension(extensions_v8::LoadTimesExtension::Get(), false);
|
| - RegisterExtension(extensions_v8::ChromeAppExtension::Get(), false);
|
| - RegisterExtension(extensions_v8::ExternalExtension::Get(), false);
|
| - RegisterExtension(extensions_v8::SearchBoxExtension::Get(), false);
|
| + RegisterExtension(extensions_v8::LoadTimesExtension::Get());
|
| + RegisterExtension(extensions_v8::ExternalExtension::Get());
|
| + RegisterExtension(extensions_v8::SearchBoxExtension::Get());
|
| v8::Extension* search_extension = extensions_v8::SearchExtension::Get();
|
| // search_extension is null if not enabled.
|
| if (search_extension)
|
| - RegisterExtension(search_extension, false);
|
| + RegisterExtension(search_extension);
|
|
|
| if (command_line.HasSwitch(switches::kEnableBenchmarking))
|
| - RegisterExtension(extensions_v8::BenchmarkingExtension::Get(), false);
|
| + RegisterExtension(extensions_v8::BenchmarkingExtension::Get());
|
|
|
| if (command_line.HasSwitch(switches::kPlaybackMode) ||
|
| command_line.HasSwitch(switches::kRecordMode) ||
|
| command_line.HasSwitch(switches::kNoJsRandomness)) {
|
| - RegisterExtension(extensions_v8::PlaybackExtension::Get(), false);
|
| + RegisterExtension(extensions_v8::PlaybackExtension::Get());
|
| }
|
|
|
| if (command_line.HasSwitch(switches::kDomAutomationController))
|
| - RegisterExtension(DomAutomationV8Extension::Get(), false);
|
| + RegisterExtension(DomAutomationV8Extension::Get());
|
|
|
| - // Add v8 extensions related to chrome extensions.
|
| - RegisterExtension(ExtensionProcessBindings::Get(), true);
|
| - RegisterExtension(BaseJsV8Extension::Get(), true);
|
| - RegisterExtension(JsonSchemaJsV8Extension::Get(), true);
|
| - RegisterExtension(EventBindings::Get(), true);
|
| - RegisterExtension(RendererExtensionBindings::Get(), true);
|
| - RegisterExtension(ExtensionApiTestV8Extension::Get(), true);
|
| -
|
| web_database_observer_impl_.reset(new WebDatabaseObserverImpl(this));
|
| WebKit::WebDatabase::setObserver(web_database_observer_impl_.get());
|
|
|
| @@ -1020,6 +908,8 @@
|
|
|
| WebRuntimeFeatures::enableJavaScriptI18NAPI(
|
| !command_line.HasSwitch(switches::kDisableJavaScriptI18NAPI));
|
| +
|
| + FOR_EACH_OBSERVER(RenderProcessObserver, observers_, WebKitInitialized());
|
| }
|
|
|
| void RenderThread::IdleHandler() {
|
| @@ -1038,17 +928,8 @@
|
| // kInitialIdleHandlerDelayS in RenderThread::WidgetHidden.
|
| ScheduleIdleHandler(idle_notification_delay_in_s_ +
|
| 1.0 / (idle_notification_delay_in_s_ + 2.0));
|
| - if (is_extension_process_) {
|
| - // Dampen the forced delay as well if the extension stays idle for long
|
| - // periods of time.
|
| - int64 forced_delay_s =
|
| - std::max(static_cast<int64>(idle_notification_delay_in_s_),
|
| - kMaxExtensionIdleHandlerDelayS);
|
| - forced_idle_timer_.Stop();
|
| - forced_idle_timer_.Start(
|
| - base::TimeDelta::FromSeconds(forced_delay_s),
|
| - this, &RenderThread::IdleHandler);
|
| - }
|
| +
|
| + FOR_EACH_OBSERVER(RenderProcessObserver, observers_, IdleNotification());
|
| }
|
|
|
| void RenderThread::ScheduleIdleHandler(double initial_delay_s) {
|
| @@ -1059,19 +940,6 @@
|
| this, &RenderThread::IdleHandler);
|
| }
|
|
|
| -void RenderThread::OnExtensionMessageInvoke(const std::string& extension_id,
|
| - const std::string& function_name,
|
| - const ListValue& args,
|
| - const GURL& event_url) {
|
| - RendererExtensionBindings::Invoke(
|
| - extension_id, function_name, args, NULL, event_url);
|
| -
|
| - // Reset the idle handler each time there's any activity like event or message
|
| - // dispatch, for which Invoke is the chokepoint.
|
| - if (is_extension_process_)
|
| - ScheduleIdleHandler(kInitialExtensionIdleHandlerDelayS);
|
| -}
|
| -
|
| void RenderThread::OnPurgeMemory() {
|
| spellchecker_.reset(new SpellCheck());
|
|
|
| @@ -1175,23 +1043,17 @@
|
| if (v8_extensions_.find(v8_extension_name) == v8_extensions_.end())
|
| return true;
|
|
|
| - // If the V8 extension is not restricted, allow it to run anywhere.
|
| - bool restrict_to_extensions = v8_extensions_[v8_extension_name];
|
| - if (!restrict_to_extensions)
|
| - return true;
|
| -
|
| - // Extension-only bindings should be restricted to content scripts and
|
| - // extension-blessed URLs.
|
| - if (extension_group == EXTENSION_GROUP_CONTENT_SCRIPTS ||
|
| - extensions_.ExtensionBindingsAllowed(url)) {
|
| - return true;
|
| + ObserverListBase<RenderProcessObserver>::Iterator it(observers_);
|
| + RenderProcessObserver* observer;
|
| + while ((observer = it.GetNext()) != NULL) {
|
| + if (observer->AllowScriptExtension(v8_extension_name, url, extension_group))
|
| + return true;
|
| }
|
|
|
| return false;
|
| }
|
|
|
| -void RenderThread::RegisterExtension(v8::Extension* extension,
|
| - bool restrict_to_extensions) {
|
| +void RenderThread::RegisterExtension(v8::Extension* extension) {
|
| WebScriptController::registerExtension(extension);
|
| - v8_extensions_[extension->name()] = restrict_to_extensions;
|
| + v8_extensions_.insert(extension->name());
|
| }
|
|
|