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