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