15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_child_process_host_iterator.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_child_process_host_impl.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserChildProcessHostIterator::BrowserChildProcessHostIterator()
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : all_(true), process_type_(PROCESS_TYPE_UNKNOWN) {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)) <<
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "BrowserChildProcessHostIterator must be used on the IO thread.";
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iterator_ = BrowserChildProcessHostImpl::GetIterator()->begin();
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserChildProcessHostIterator::BrowserChildProcessHostIterator(int type)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : all_(false), process_type_(type) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)) <<
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "BrowserChildProcessHostIterator must be used on the IO thread.";
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK_NE(PROCESS_TYPE_RENDERER, type) <<
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "BrowserChildProcessHostIterator doesn't work for renderer processes; "
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "try RenderProcessHost::AllHostsIterator() instead.";
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iterator_ = BrowserChildProcessHostImpl::GetIterator()->begin();
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!Done() && (*iterator_)->GetData().process_type != process_type_)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++(*this);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)BrowserChildProcessHostIterator::~BrowserChildProcessHostIterator() {
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserChildProcessHostIterator::operator++() {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(!Done());
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++iterator_;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (Done())
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!all_ && (*iterator_)->GetData().process_type != process_type_)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (true);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserChildProcessHostIterator::Done() {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return iterator_ == BrowserChildProcessHostImpl::GetIterator()->end();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ChildProcessData& BrowserChildProcessHostIterator::GetData() {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(!Done());
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (*iterator_)->GetData();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserChildProcessHostIterator::Send(IPC::Message* message) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(!Done());
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (*iterator_)->Send(message);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserChildProcessHostDelegate*
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserChildProcessHostIterator::GetDelegate() {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (*iterator_)->delegate();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
71