diff options
author | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-11 18:02:27 +0000 |
---|---|---|
committer | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-11 18:02:27 +0000 |
commit | a801cb3dc18e88757feb246e94e86594be2f276c (patch) | |
tree | cad6f3e3ba85cf525ac917ad5eadff0e74a35f14 /content/browser/worker_host/worker_service_impl.cc | |
parent | f1346bdc43f7e5a2a54809c81b62691ecf29eb36 (diff) | |
download | chromium_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.cc | 14 |
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())); } } |