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 |