diff options
-rw-r--r-- | content/content_renderer.gypi | 2 | ||||
-rw-r--r-- | content/renderer/render_process_visibility_manager.cc | 37 | ||||
-rw-r--r-- | content/renderer/render_process_visibility_manager.h | 32 | ||||
-rw-r--r-- | content/renderer/render_thread_impl.cc | 11 | ||||
-rw-r--r-- | content/renderer/render_widget.cc | 3 |
5 files changed, 85 insertions, 0 deletions
diff --git a/content/content_renderer.gypi b/content/content_renderer.gypi index 25735f7..c8e52fd 100644 --- a/content/content_renderer.gypi +++ b/content/content_renderer.gypi @@ -278,6 +278,8 @@ 'renderer/render_process.h', 'renderer/render_process_impl.cc', 'renderer/render_process_impl.h', + 'renderer/render_process_visibility_manager.cc', + 'renderer/render_process_visibility_manager.h', 'renderer/render_thread_impl.cc', 'renderer/render_thread_impl.h', 'renderer/render_view_impl.cc', diff --git a/content/renderer/render_process_visibility_manager.cc b/content/renderer/render_process_visibility_manager.cc new file mode 100644 index 0000000..8231df4 --- /dev/null +++ b/content/renderer/render_process_visibility_manager.cc @@ -0,0 +1,37 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/renderer/render_process_visibility_manager.h" + +#include "base/logging.h" +#include "base/memory/memory_pressure_listener.h" + +namespace content { + +RenderProcessVisibilityManager::RenderProcessVisibilityManager() + : num_visible_render_widgets_(0) { +} + +RenderProcessVisibilityManager::~RenderProcessVisibilityManager() { +} + +// static +RenderProcessVisibilityManager* RenderProcessVisibilityManager::GetInstance() { + return Singleton<RenderProcessVisibilityManager>::get(); +} + +void RenderProcessVisibilityManager::WidgetVisibilityChanged(bool visible) { +#if !defined(DISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY) + num_visible_render_widgets_ += visible ? 1 : -1; + DCHECK_LE(0, num_visible_render_widgets_); + if (num_visible_render_widgets_ == 0) { + // TODO(vollick): Remove this this heavy-handed approach once we're polling + // the real system memory pressure. + base::MemoryPressureListener::NotifyMemoryPressure( + base::MemoryPressureListener::MEMORY_PRESSURE_CRITICAL); + } +#endif +} + +} // namespace content diff --git a/content/renderer/render_process_visibility_manager.h b/content/renderer/render_process_visibility_manager.h new file mode 100644 index 0000000..290da81 --- /dev/null +++ b/content/renderer/render_process_visibility_manager.h @@ -0,0 +1,32 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_RENDERER_RENDER_PROCESS_VISIBILITY_MANAGER_H_ +#define CONTENT_RENDERER_RENDER_PROCESS_VISIBILITY_MANAGER_H_ + +#include "base/memory/singleton.h" +#include "content/common/content_export.h" + +namespace content { + +class CONTENT_EXPORT RenderProcessVisibilityManager { + public: + static RenderProcessVisibilityManager* GetInstance(); + + void WidgetVisibilityChanged(bool visible); + + private: + friend struct DefaultSingletonTraits<RenderProcessVisibilityManager>; + + RenderProcessVisibilityManager(); + ~RenderProcessVisibilityManager(); + + int num_visible_render_widgets_; + + DISALLOW_COPY_AND_ASSIGN(RenderProcessVisibilityManager); +}; + +} // namespace content + +#endif // CONTENT_RENDERER_RENDER_PROCESS_VISIBILITY_MANAGER_H_ diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index a91a9d9..795a92a 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc @@ -14,6 +14,7 @@ #include "base/debug/trace_event.h" #include "base/lazy_instance.h" #include "base/logging.h" +#include "base/memory/discardable_memory.h" #include "base/metrics/field_trial.h" #include "base/metrics/histogram.h" #include "base/metrics/stats_table.h" @@ -71,6 +72,7 @@ #include "content/renderer/p2p/socket_dispatcher.h" #include "content/renderer/plugin_channel_host.h" #include "content/renderer/render_process_impl.h" +#include "content/renderer/render_process_visibility_manager.h" #include "content/renderer/render_view_impl.h" #include "content/renderer/renderer_webkitplatformsupport_impl.h" #include "content/renderer/skia_benchmarking_extension.h" @@ -597,6 +599,10 @@ void RenderThreadImpl::WidgetHidden() { DCHECK(hidden_widget_count_ < widget_count_); hidden_widget_count_++; + RenderProcessVisibilityManager* manager = + RenderProcessVisibilityManager::GetInstance(); + manager->WidgetVisibilityChanged(false); + if (!GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden()) { return; } @@ -608,6 +614,11 @@ void RenderThreadImpl::WidgetHidden() { void RenderThreadImpl::WidgetRestored() { DCHECK_GT(hidden_widget_count_, 0); hidden_widget_count_--; + + RenderProcessVisibilityManager* manager = + RenderProcessVisibilityManager::GetInstance(); + manager->WidgetVisibilityChanged(true); + if (!GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden()) { return; } diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index 2692a93..bb06cfe 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc @@ -30,6 +30,7 @@ #include "content/renderer/gpu/render_widget_compositor.h" #include "content/renderer/ime_event_guard.h" #include "content/renderer/render_process.h" +#include "content/renderer/render_process_visibility_manager.h" #include "content/renderer/render_thread_impl.h" #include "content/renderer/renderer_webkitplatformsupport_impl.h" #include "ipc/ipc_sync_message.h" @@ -188,6 +189,8 @@ RenderWidget::RenderWidget(WebKit::WebPopupType popup_type, is_threaded_compositing_enabled_ = CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableThreadedCompositing); + + RenderProcessVisibilityManager::GetInstance()->WidgetVisibilityChanged(true); } RenderWidget::~RenderWidget() { |