1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_BROWSER_LIST_H_
#define CHROME_BROWSER_UI_BROWSER_LIST_H_
#include <vector>
#include "base/basictypes.h"
#include "base/lazy_instance.h"
#include "base/observer_list.h"
#include "chrome/browser/ui/host_desktop.h"
class Browser;
class Profile;
namespace base {
class FilePath;
}
namespace chrome {
class BrowserListObserver;
}
// Maintains a list of Browser objects present in a given HostDesktop (see
// HostDesktopType).
class BrowserList {
public:
typedef std::vector<Browser*> BrowserVector;
typedef BrowserVector::const_iterator const_iterator;
typedef BrowserVector::const_reverse_iterator const_reverse_iterator;
// Returns the last active browser for this list.
Browser* GetLastActive() const;
// Browsers are added to the list before they have constructed windows,
// so the |window()| member function may return NULL.
const_iterator begin() const { return browsers_.begin(); }
const_iterator end() const { return browsers_.end(); }
bool empty() const { return browsers_.empty(); }
size_t size() const { return browsers_.size(); }
Browser* get(size_t index) const { return browsers_[index]; }
// Returns iterated access to list of open browsers ordered by when
// they were last active. The underlying data structure is a vector
// and we push_back on recent access so a reverse iterator gives the
// latest accessed browser first.
const_reverse_iterator begin_last_active() const {
return last_active_browsers_.rbegin();
}
const_reverse_iterator end_last_active() const {
return last_active_browsers_.rend();
}
static BrowserList* GetInstance(chrome::HostDesktopType type);
// Adds or removes |browser| from the list it is associated with. The browser
// object should be valid BEFORE these calls (for the benefit of observers),
// so notify and THEN delete the object.
static void AddBrowser(Browser* browser);
static void RemoveBrowser(Browser* browser);
// Adds and removes |observer| from the observer list for all desktops.
// Observers are responsible for making sure the notifying browser is relevant
// to them (e.g., on the specific desktop they care about if any).
static void AddObserver(chrome::BrowserListObserver* observer);
static void RemoveObserver(chrome::BrowserListObserver* observer);
// Called by Browser objects when their window is activated (focused). This
// allows us to determine what the last active Browser was on each desktop.
// Note: This only takes effect on the appropriate browser list as determined
// by |browser->host_desktop_type()|.
static void SetLastActive(Browser* browser);
// Closes all browsers for |profile| across all desktops.
// TODO(mlerman): Move the Profile Deletion flow to use the overloaded
// version of this method with a callback, then remove this method.
static void CloseAllBrowsersWithProfile(Profile* profile);
// Closes all browsers for |profile| across all desktops. Uses
// TryToCloseBrowserList() to do the actual closing and trigger any
// OnBeforeUnload events. If all OnBeforeUnload events are confirmed,
// |on_close_success| is called.
static void CloseAllBrowsersWithProfile(
Profile* profile,
const base::Callback<void(const base::FilePath&)>& on_close_success);
// Returns true if at least one incognito session is active across all
// desktops.
static bool IsOffTheRecordSessionActive();
// Returns true if at least one incognito session is active for |profile|
// across all desktops.
static bool IsOffTheRecordSessionActiveForProfile(Profile* profile);
private:
BrowserList();
~BrowserList();
// Helper method to remove a browser instance from a list of browsers
static void RemoveBrowserFrom(Browser* browser, BrowserVector* browser_list);
// Attempts to close |browsers_to_close| while respecting OnBeforeUnload
// events. If there are no OnBeforeUnload events to be called,
// |on_close_confirmed| will be called, with a parameter of |profile_path|,
// and the Browsers will then be closed. If at least one unfired
// OnBeforeUnload event is found, handle it with a callback to
// PostBeforeUnloadHandlers, which upon success will recursively call this
// method to handle any other OnBeforeUnload events.
static void TryToCloseBrowserList(
const BrowserVector& browsers_to_close,
const base::Callback<void(const base::FilePath&)>& on_close_success,
const base::FilePath& profile_path);
// Called after handling an OnBeforeUnload event. If |tab_close_confirmed| is
// true, calls |TryToCloseBrowserList()|, passing the parameters
// |browsers_to_close|, |on_close_confirmed|, and |profile_path|. Otherwise,
// resets all the OnBeforeUnload event handlers.
static void PostBeforeUnloadHandlers(
const BrowserVector& browsers_to_close,
const base::Callback<void(const base::FilePath&)>& on_close_success,
const base::FilePath& profile_path,
bool tab_close_confirmed);
// A vector of the browsers in this list, in the order they were added.
BrowserVector browsers_;
// A vector of the browsers in this list that have been activated, in the
// reverse order in which they were last activated.
BrowserVector last_active_browsers_;
// A list of observers which will be notified of every browser addition and
// removal across all BrowserLists.
static base::LazyInstance<ObserverList<chrome::BrowserListObserver> >::Leaky
observers_;
// Nothing fancy, since we only have two HDTs.
static BrowserList* native_instance_;
static BrowserList* ash_instance_;
DISALLOW_COPY_AND_ASSIGN(BrowserList);
};
#endif // CHROME_BROWSER_UI_BROWSER_LIST_H_
|