1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// found in the LICENSE file. 4513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 5513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#ifndef CHROME_BROWSER_UI_BROWSER_LIST_H_ 6513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#define CHROME_BROWSER_UI_BROWSER_LIST_H_ 7513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#pragma once 8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 9513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <vector> 10513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/observer_list.h" 124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h" 13513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Stores a list of all Browser objects. 15513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass BrowserList { 16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public: 17513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch typedef std::vector<Browser*> BrowserVector; 18513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch typedef BrowserVector::iterator iterator; 19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch typedef BrowserVector::const_iterator const_iterator; 20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch typedef BrowserVector::const_reverse_iterator const_reverse_iterator; 21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // It is not allowed to change the global window list (add or remove any 23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // browser windows while handling observer callbacks. 24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch class Observer { 25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public: 26513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Called immediately after a browser is added to the list 27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void OnBrowserAdded(const Browser* browser) = 0; 28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Called immediately after a browser is removed from the list 30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void OnBrowserRemoved(const Browser* browser) = 0; 31513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 32513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Called immediately after a browser is set active (SetLastActive) 33513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void OnBrowserSetLastActive(const Browser* browser) {} 34513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 35513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch protected: 36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual ~Observer() {} 37513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch }; 38513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 39513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Adds and removes browsers from the global list. The browser object should 40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // be valid BEFORE these calls (for the benefit of observers), so notify and 41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // THEN delete the object. 42513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static void AddBrowser(Browser* browser); 43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static void RemoveBrowser(Browser* browser); 44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static void AddObserver(Observer* observer); 46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static void RemoveObserver(Observer* observer); 47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Called by Browser objects when their window is activated (focused). This 49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // allows us to determine what the last active Browser was. 50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static void SetLastActive(Browser* browser); 51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns the Browser object whose window was most recently active. If the 53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // most recently open Browser's window was closed, returns the first Browser 54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // in the list. If no Browsers exist, returns NULL. 55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // 56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // WARNING: this is NULL until a browser becomes active. If during startup 57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // a browser does not become active (perhaps the user launches Chrome, then 58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // clicks on another app before the first browser window appears) then this 59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // returns NULL. 60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // WARNING #2: this will always be NULL in unit tests run on the bots. 61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static Browser* GetLastActive(); 62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Identical in behavior to GetLastActive(), except that the most recently 64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // open browser owned by |profile| is returned. If none exist, returns NULL. 65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // WARNING: see warnings in GetLastActive(). 66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static Browser* GetLastActiveWithProfile(Profile *profile); 67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Find an existing browser window with the provided type. Searches in the 69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // order of last activation. Only browsers that have been active can be 70513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // returned. If |match_incognito| is true, will match a browser with either 71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // a regular or incognito profile that matches the given one. Returns NULL if 72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // no such browser currently exists. 73513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static Browser* FindBrowserWithType(Profile* p, Browser::Type t, 74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool match_incognito); 75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Find an existing browser window that can provide the specified type (this 77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // uses Browser::CanSupportsWindowFeature, not 78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Browser::SupportsWindowFeature). This searches in the order of last 79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // activation. Only browsers that have been active can be returned. Returns 80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // NULL if no such browser currently exists. 81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static Browser* FindBrowserWithFeature(Profile* p, 82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Browser::WindowFeature feature); 83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Find an existing browser window with the provided profile. Searches in the 85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // order of last activation. Only browsers that have been active can be 86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // returned. Returns NULL if no such browser currently exists. 87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static Browser* FindBrowserWithProfile(Profile* p); 88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Find an existing browser with the provided ID. Returns NULL if no such 90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // browser currently exists. 91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static Browser* FindBrowserWithID(SessionID::id_type desired_id); 92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Checks if the browser can be automatically restarted to install upgrades 94513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The browser can be automatically restarted when: 95513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // 1. It's in the background mode (no visible windows). 96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // 2. An update exe is present in the install folder. 97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static bool CanRestartForUpdate(); 98513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Called from Browser::Exit. 10021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen static void Exit(); 10121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Closes all browsers and exits. This is equivalent to 103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // CloseAllBrowsers(true) on platforms where the application exits when no 104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // more windows are remaining. On other platforms (the Mac), this will 105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // additionally exit the application. 106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static void CloseAllBrowsersAndExit(); 107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Closes all browsers. If the session is ending the windows are closed 109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // directly. Otherwise the windows are closed by way of posting a WM_CLOSE 110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // message. 111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static void CloseAllBrowsers(); 112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Begins shutdown of the application when the desktop session is ending. 1144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch static void SessionEnding(); 115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 116513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns true if there is at least one Browser with the specified profile. 117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static bool HasBrowserWithProfile(Profile* profile); 118513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 119513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Tells the BrowserList to keep the application alive after the last Browser 120513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // closes. This is implemented as a count, so callers should pair their calls 121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // to StartKeepAlive() with matching calls to EndKeepAlive() when they no 122513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // longer need to keep the application running. 123513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static void StartKeepAlive(); 124513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 125513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Stops keeping the application alive after the last Browser is closed. 126513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Should match a previous call to StartKeepAlive(). 127513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static void EndKeepAlive(); 128513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 129513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns true if application will continue running after the last Browser 130513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // closes. 131513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static bool WillKeepAlive(); 132513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Browsers are added to |browsers_| before they have constructed windows, 13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // so the |window()| member function may return NULL. 135513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static const_iterator begin() { return browsers_.begin(); } 136513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static const_iterator end() { return browsers_.end(); } 137513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 138513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static bool empty() { return browsers_.empty(); } 139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static size_t size() { return browsers_.size(); } 140513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns iterated access to list of open browsers ordered by when 142513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // they were last active. The underlying data structure is a vector 143513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // and we push_back on recent access so a reverse iterator gives the 144513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // latest accessed browser first. 145513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static const_reverse_iterator begin_last_active() { 146513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return last_active_browsers_.rbegin(); 147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 148513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 149513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static const_reverse_iterator end_last_active() { 150513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return last_active_browsers_.rend(); 151513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 152513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 153513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Return the number of browsers with the following profile which are 154513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // currently open. 155513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static size_t GetBrowserCount(Profile* p); 156513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Return the number of browsers with the following profile and type which are 158513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // currently open. 159513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static size_t GetBrowserCountForType(Profile* p, Browser::Type type); 160513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Returns true if at least one incognito session is active. 162513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static bool IsOffTheRecordSessionActive(); 163513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Send out notifications. 16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // For ChromeOS, also request session manager to end the session. 16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static void NotifyAndTerminate(bool fast_path); 16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Called once there are no more browsers open and the application is exiting. 169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static void AllBrowsersClosedAndAppExiting(); 170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 171513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private: 172513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Helper method to remove a browser instance from a list of browsers 173513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static void RemoveBrowserFrom(Browser* browser, BrowserVector* browser_list); 17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static void MarkAsCleanShutdown(); 17521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#if defined(OS_CHROMEOS) 17621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen static bool NeedBeforeUnloadFired(); 17721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen static bool PendingDownloads(); 17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static void NotifyWindowManagerAboutSignout(); 17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static bool signout_; 18121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#endif 182513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static BrowserVector browsers_; 184513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static BrowserVector last_active_browsers_; 185513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static ObserverList<Observer> observers_; 186513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 187513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Counter of calls to StartKeepAlive(). If non-zero, the application will 188513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // continue running after the last browser has exited. 189513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static int keep_alive_count_; 190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}; 191513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass TabContentsWrapper; 193513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 194513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Iterates through all web view hosts in all browser windows. Because the 195513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// renderers act asynchronously, getting a host through this interface does 196513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// not guarantee that the renderer is ready to go. Doing anything to affect 197513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// browser windows or tabs while iterating may cause incorrect behavior. 198513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// 199513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Example: 200513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// for (TabContentsIterator iterator; !iterator.done(); ++iterator) { 201513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// TabContents* cur = *iterator; 202513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// -or- 203513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// iterator->operationOnTabContents(); 204513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// ... 205513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// } 206513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass TabContentsIterator { 207513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public: 208513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TabContentsIterator(); 209513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 210513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns true if we are past the last Browser. 211513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool done() const { 212513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return cur_ == NULL; 213513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 214513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 2154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns the Browser instance associated with the current TabContents. 2164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Valid as long as !Done() 2174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Browser* browser() const { 2184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return *browser_iterator_; 2194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 2204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 221513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns the current TabContents, valid as long as !Done() 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper* operator->() const { 223513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return cur_; 224513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper* operator*() const { 226513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return cur_; 227513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 228513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 229513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Incrementing operators, valid as long as !Done() 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper* operator++() { // ++preincrement 231513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Advance(); 232513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return cur_; 233513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper* operator++(int) { // postincrement++ 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper* tmp = cur_; 236513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Advance(); 237513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return tmp; 238513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 239513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 240513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private: 241513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Loads the next host into Cur. This is designed so that for the initial 242513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // call when browser_iterator_ points to the first browser and 243513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // web_view_index_ is -1, it will fill the first host. 244513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void Advance(); 245513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 246513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // iterator over all the Browser objects 247513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch BrowserList::const_iterator browser_iterator_; 248513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 249513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // tab index into the current Browser of the current web view 250513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int web_view_index_; 251513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 252513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Current TabContents, or NULL if we're at the end of the list. This can 253513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // be extracted given the browser iterator and index, but it's nice to cache 254513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // this since the caller may access the current host many times. 255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper* cur_; 256513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}; 257513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 258513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif // CHROME_BROWSER_UI_BROWSER_LIST_H_ 259