summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/content_renderer.gypi2
-rw-r--r--content/renderer/render_process_visibility_manager.cc37
-rw-r--r--content/renderer/render_process_visibility_manager.h32
-rw-r--r--content/renderer/render_thread_impl.cc11
-rw-r--r--content/renderer/render_widget.cc3
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() {