summaryrefslogtreecommitdiffstats
path: root/content/browser/worker_host/worker_service_impl.cc
diff options
context:
space:
mode:
authorsadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-11 18:02:27 +0000
committersadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-11 18:02:27 +0000
commita801cb3dc18e88757feb246e94e86594be2f276c (patch)
treecad6f3e3ba85cf525ac917ad5eadff0e74a35f14 /content/browser/worker_host/worker_service_impl.cc
parentf1346bdc43f7e5a2a54809c81b62691ecf29eb36 (diff)
downloadchromium_src-a801cb3dc18e88757feb246e94e86594be2f276c.zip
chromium_src-a801cb3dc18e88757feb246e94e86594be2f276c.tar.gz
chromium_src-a801cb3dc18e88757feb246e94e86594be2f276c.tar.bz2
content: Introduce a RenderWidgetHostIterator.
RenderWidgetHost::GetRenderWidgetHosts() and GetAllRenderWidgetHosts() returns a list of RenderWidgetHost's. The caller can then perform some operation that leads to some of the RenderWidgetHosts in the list being destroyed, leading to reading from freed memory, when iterating over the list. So instead of sending a list, introduce RenderWidgetHostIterator, which allows safely iterating over the list of hosts. BUG=285307 R=ajwong@chromium.org, creis@chromium.org, jam@chromium.org Review URL: https://codereview.chromium.org/23453038 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@222591 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/worker_host/worker_service_impl.cc')
-rw-r--r--content/browser/worker_host/worker_service_impl.cc14
1 files changed, 8 insertions, 6 deletions
diff --git a/content/browser/worker_host/worker_service_impl.cc b/content/browser/worker_host/worker_service_impl.cc
index 5fb8e62..d2ab272 100644
--- a/content/browser/worker_host/worker_service_impl.cc
+++ b/content/browser/worker_host/worker_service_impl.cc
@@ -21,6 +21,7 @@
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/render_widget_host.h"
+#include "content/public/browser/render_widget_host_iterator.h"
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/browser/resource_context.h"
#include "content/public/browser/web_contents.h"
@@ -110,16 +111,17 @@ void WorkerPrioritySetter::GatherVisibleIDsAndUpdateWorkerPriorities() {
new std::set<std::pair<int, int> >();
// Gather up all the visible renderer process/view pairs
- RenderWidgetHost::List widgets = RenderWidgetHost::GetRenderWidgetHosts();
- for (size_t i = 0; i < widgets.size(); ++i) {
- if (widgets[i]->GetProcess()->VisibleWidgetCount() == 0)
+ scoped_ptr<RenderWidgetHostIterator> widgets(
+ RenderWidgetHost::GetRenderWidgetHosts());
+ while (RenderWidgetHost* widget = widgets->GetNextHost()) {
+ if (widget->GetProcess()->VisibleWidgetCount() == 0)
continue;
- RenderWidgetHostView* render_view = widgets[i]->GetView();
+ RenderWidgetHostView* render_view = widget->GetView();
if (render_view && render_view->IsShowing()) {
visible_renderer_ids->insert(
- std::pair<int, int>(widgets[i]->GetProcess()->GetID(),
- widgets[i]->GetRoutingID()));
+ std::pair<int, int>(widget->GetProcess()->GetID(),
+ widget->GetRoutingID()));
}
}