Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(199)

Unified Diff: chrome/browser/ui/browser_finder.cc

Issue 10391158: Moves methods for finding browsers to browser_finder. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Include fixs Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/browser_finder.cc
diff --git a/chrome/browser/ui/browser_finder.cc b/chrome/browser/ui/browser_finder.cc
new file mode 100644
index 0000000000000000000000000000000000000000..16923b35a968790ae7741dc13dcbad0361efb448
--- /dev/null
+++ b/chrome/browser/ui/browser_finder.cc
@@ -0,0 +1,198 @@
+// 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.
+
+#include "chrome/browser/ui/browser_finder.h"
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "content/public/browser/navigation_controller.h"
+
+using content::WebContents;
+
+namespace browser {
+
+namespace {
+
+// Type used to indicate to match anything.
+const int kMatchAny = 0;
+
+// See BrowserMatches for details.
+const int kMatchOriginalProfile = 1 << 0;
+const int kMatchCanSupportWindowFeature = 1 << 1;
+const int kMatchTabbed = 1 << 2;
+
+// Returns true if the specified |browser| matches the specified arguments.
+// |match_types| is a bitmask dictating what parameters to match:
+// . If it contains kMatchOriginalProfile then the original profile of the
+// browser must match |profile->GetOriginalProfile()|. This is used to match
+// incognito windows.
+// . If it contains kMatchCanSupportWindowFeature
+// |CanSupportWindowFeature(window_feature)| must return true.
+// . If it contains kMatchTabbed, the browser must be a tabbed browser.
+bool BrowserMatches(Browser* browser,
+ Profile* profile,
+ Browser::WindowFeature window_feature,
+ uint32 match_types) {
+ if (match_types & kMatchCanSupportWindowFeature &&
+ !browser->CanSupportWindowFeature(window_feature)) {
+ return false;
+ }
+
+ if (match_types & kMatchOriginalProfile) {
+ if (browser->profile()->GetOriginalProfile() !=
+ profile->GetOriginalProfile())
+ return false;
+ } else if (browser->profile() != profile) {
+ return false;
+ }
+
+ if (match_types & kMatchTabbed)
+ return browser->is_type_tabbed();
+
+ return true;
+}
+
+// Returns the first browser in the specified iterator that returns true from
+// |BrowserMatches|, or null if no browsers match the arguments. See
+// |BrowserMatches| for details on the arguments.
+template <class T>
+Browser* FindBrowserMatching(const T& begin,
+ const T& end,
+ Profile* profile,
+ Browser::WindowFeature window_feature,
+ uint32 match_types) {
+ for (T i = begin; i != end; ++i) {
+ if (BrowserMatches(*i, profile, window_feature, match_types))
+ return *i;
+ }
+ return NULL;
+}
+
+Browser* FindBrowserWithTabbedOrAnyType(Profile* profile,
+ bool match_tabbed,
+ bool match_original_profiles) {
+ uint32 match_types = kMatchAny;
+ if (match_tabbed)
+ match_types |= kMatchTabbed;
+ if (match_original_profiles)
+ match_types |= kMatchOriginalProfile;
+ Browser* browser = FindBrowserMatching(
+ BrowserList::begin_last_active(), BrowserList::end_last_active(),
+ profile, Browser::FEATURE_NONE, match_types);
+ // Fall back to a forward scan of all Browsers if no active one was found.
+ return browser ? browser :
+ FindBrowserMatching(BrowserList::begin(), BrowserList::end(), profile,
+ Browser::FEATURE_NONE, match_types);
+}
+
+size_t GetBrowserCountImpl(Profile* profile, uint32 match_types) {
+ size_t count = 0;
+ for (BrowserList::const_iterator i = BrowserList::begin();
+ i != BrowserList::end(); ++i) {
+ if (BrowserMatches(*i, profile, Browser::FEATURE_NONE, match_types))
+ count++;
+ }
+ return count;
+}
+
+} // namespace
+
+Browser* FindTabbedBrowser(Profile* profile, bool match_original_profiles) {
+ return FindBrowserWithTabbedOrAnyType(profile,
+ true,
+ match_original_profiles);
+}
+
+Browser* FindOrCreateTabbedBrowser(Profile* profile) {
+ Browser* browser = FindTabbedBrowser(profile, false);
+ if (!browser)
+ browser = Browser::Create(profile);
+ return browser;
+}
+
+Browser* FindAnyBrowser(Profile* profile, bool match_original_profiles) {
+ return FindBrowserWithTabbedOrAnyType(profile,
+ false,
+ match_original_profiles);
+}
+
+Browser* FindBrowserWithFeature(Profile* profile,
+ Browser::WindowFeature feature) {
+ Browser* browser = FindBrowserMatching(
+ BrowserList::begin_last_active(), BrowserList::end_last_active(),
+ profile, feature, kMatchCanSupportWindowFeature);
+ // Fall back to a forward scan of all Browsers if no active one was found.
+ return browser ? browser :
+ FindBrowserMatching(BrowserList::begin(), BrowserList::end(), profile,
+ feature, kMatchCanSupportWindowFeature);
+}
+
+Browser* FindBrowserWithProfile(Profile* profile) {
+ return FindAnyBrowser(profile, false);
+}
+
+Browser* FindBrowserWithID(SessionID::id_type desired_id) {
+ for (BrowserList::const_iterator i = BrowserList::begin();
+ i != BrowserList::end(); ++i) {
+ if ((*i)->session_id().id() == desired_id)
+ return *i;
+ }
+ return NULL;
+}
+
+Browser* FindBrowserWithWindow(gfx::NativeWindow window) {
+ for (BrowserList::const_iterator it = BrowserList::begin();
+ it != BrowserList::end(); ++it) {
+ Browser* browser = *it;
+ if (browser->window() && browser->window()->GetNativeHandle() == window)
+ return browser;
+ }
+ return NULL;
+}
+
+Browser* FindBrowserWithWebContents(WebContents* web_contents) {
+ DCHECK(web_contents);
+ for (TabContentsIterator it; !it.done(); ++it) {
+ if (it->web_contents() == web_contents)
+ return it.browser();
+ }
+ return NULL;
+}
+
+Browser* FindBrowserForController(
+ const content::NavigationController* controller,
+ int* index_result) {
+ for (BrowserList::const_iterator it = BrowserList::begin();
+ it != BrowserList::end(); ++it) {
+ int index = (*it)->GetIndexOfController(controller);
+ if (index != TabStripModel::kNoTab) {
+ if (index_result)
+ *index_result = index;
+ return *it;
+ }
+ }
+ return NULL;
+}
+
+
+Browser* FindLastActiveWithProfile(Profile* profile) {
+ // We are only interested in last active browsers, so we don't fall back to
+ // all browsers like FindBrowserWith* do.
+ return FindBrowserMatching(
+ BrowserList::begin_last_active(), BrowserList::end_last_active(), profile,
+ Browser::FEATURE_NONE, kMatchAny);
+}
+
+size_t GetBrowserCount(Profile* profile) {
+ return GetBrowserCountImpl(profile, kMatchAny);
+}
+
+size_t GetTabbedBrowserCount(Profile* profile) {
+ return GetBrowserCountImpl(profile, kMatchTabbed);
+}
+
+} // namespace browser

Powered by Google App Engine
This is Rietveld 408576698