1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "content/public/browser/browser_child_process_host_iterator.h" 6 7 #include "base/logging.h" 8 #include "content/browser/browser_child_process_host_impl.h" 9 #include "content/public/browser/browser_thread.h" 10 11 namespace content { 12 BrowserChildProcessHostIterator()13BrowserChildProcessHostIterator::BrowserChildProcessHostIterator() 14 : all_(true), process_type_(PROCESS_TYPE_UNKNOWN) { 15 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)) << 16 "BrowserChildProcessHostIterator must be used on the IO thread."; 17 iterator_ = BrowserChildProcessHostImpl::GetIterator()->begin(); 18 } 19 BrowserChildProcessHostIterator(int type)20BrowserChildProcessHostIterator::BrowserChildProcessHostIterator(int type) 21 : all_(false), process_type_(type) { 22 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)) << 23 "BrowserChildProcessHostIterator must be used on the IO thread."; 24 DCHECK_NE(PROCESS_TYPE_RENDERER, type) << 25 "BrowserChildProcessHostIterator doesn't work for renderer processes; " 26 "try RenderProcessHost::AllHostsIterator() instead."; 27 iterator_ = BrowserChildProcessHostImpl::GetIterator()->begin(); 28 if (!Done() && (*iterator_)->GetData().process_type != process_type_) 29 ++(*this); 30 } 31 ~BrowserChildProcessHostIterator()32BrowserChildProcessHostIterator::~BrowserChildProcessHostIterator() { 33 } 34 operator ++()35bool BrowserChildProcessHostIterator::operator++() { 36 CHECK(!Done()); 37 do { 38 ++iterator_; 39 if (Done()) 40 break; 41 42 if (!all_ && (*iterator_)->GetData().process_type != process_type_) 43 continue; 44 45 return true; 46 } while (true); 47 48 return false; 49 } 50 Done()51bool BrowserChildProcessHostIterator::Done() { 52 return iterator_ == BrowserChildProcessHostImpl::GetIterator()->end(); 53 } 54 GetData()55const ChildProcessData& BrowserChildProcessHostIterator::GetData() { 56 CHECK(!Done()); 57 return (*iterator_)->GetData(); 58 } 59 Send(IPC::Message * message)60bool BrowserChildProcessHostIterator::Send(IPC::Message* message) { 61 CHECK(!Done()); 62 return (*iterator_)->Send(message); 63 } 64 65 BrowserChildProcessHostDelegate* GetDelegate()66 BrowserChildProcessHostIterator::GetDelegate() { 67 return (*iterator_)->delegate(); 68 } 69 70 } // namespace content 71