| // Copyright (c) 2011 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_TABS_TAB_FINDER_H_ |
| #define CHROME_BROWSER_TABS_TAB_FINDER_H_ |
| #pragma once |
| |
| #include <map> |
| #include <set> |
| |
| #include "base/basictypes.h" |
| #include "base/memory/singleton.h" |
| #include "chrome/browser/history/history_types.h" |
| #include "content/browser/cancelable_request.h" |
| #include "content/browser/tab_contents/navigation_controller.h" |
| #include "content/common/notification_observer.h" |
| #include "content/common/notification_registrar.h" |
| |
| class Browser; |
| class GURL; |
| class TabContents; |
| |
| // TabFinder is used to locate a tab by URL. TabFinder matches tabs based |
| // on the tabs current url, or the start of the redirect chain. |
| // |
| // TODO: if we end up keeping this (moving it out of about:flags) then we |
| // should persist the start of the redirect chain in the navigation entry. |
| class TabFinder : public NotificationObserver { |
| public: |
| // Returns the TabFinder, or NULL if TabFinder is not enabled. |
| static TabFinder* GetInstance(); |
| |
| // Returns true if TabFinder is enabled. |
| static bool IsEnabled(); |
| |
| // Returns the tab that matches the specified url. If a tab is found the |
| // browser containing the tab is set in |existing_browser|. This searches |
| // in |browser| first before checking any other browsers. |
| TabContents* FindTab(Browser* browser, |
| const GURL& url, |
| Browser** existing_browser); |
| |
| // NotificationObserver overrides: |
| virtual void Observe(NotificationType type, |
| const NotificationSource& source, |
| const NotificationDetails& details) OVERRIDE; |
| |
| private: |
| friend struct DefaultSingletonTraits<TabFinder>; |
| |
| class TabContentsObserverImpl; |
| |
| typedef std::map<TabContents*, GURL> TabContentsToURLMap; |
| typedef std::set<TabContentsObserverImpl*> TabContentsObservers; |
| |
| TabFinder(); |
| ~TabFinder(); |
| |
| void Init(); |
| |
| // Forwarded from TabContentsObserverImpl. |
| void DidNavigateAnyFramePostCommit( |
| TabContents* source, |
| const NavigationController::LoadCommittedDetails& details, |
| const ViewHostMsg_FrameNavigate_Params& params); |
| |
| // Returns true if the tab's current url is |url|, or the start of the |
| // redirect chain for the tab is |url|. |
| bool TabMatchesURL(TabContents* tab_contents, const GURL& url); |
| |
| // Returns the first tab in the specified browser that matches the specified |
| // url. Returns NULL if there are no tabs matching the specified url. |
| TabContents* FindTabInBrowser(Browser* browser, const GURL& url); |
| |
| // If we're not currently tracking |tab| this creates a |
| // TabContentsObserverImpl to listen for navigations. |
| void TrackTab(TabContents* tab); |
| |
| // Queries all the tabs in |browser| for the start of the redirect chain. |
| void TrackBrowser(Browser* browser); |
| |
| // Invoked when a TabContents is being destroyed. |
| void TabDestroyed(TabContentsObserverImpl* observer); |
| |
| // Cancels any pending requests for the specified tabs redirect chain. |
| void CancelRequestsFor(TabContents* tab_contents); |
| |
| // Starts the fetch for the redirect chain of the specified TabContents. |
| // QueryRedirectsToComplete is invoked when the redirect chain is retrieved. |
| void FetchRedirectStart(TabContents* tab); |
| |
| // Callback when we get the redirect list for a tab. |
| void QueryRedirectsToComplete(CancelableRequestProvider::Handle handle, |
| GURL url, |
| bool success, |
| history::RedirectList* redirects); |
| |
| // Maps from TabContents to the start of the redirect chain. |
| TabContentsToURLMap tab_contents_to_url_; |
| |
| CancelableRequestConsumerTSimple<TabContents*> callback_consumer_; |
| |
| NotificationRegistrar registrar_; |
| |
| TabContentsObservers tab_contents_observers_; |
| |
| DISALLOW_COPY_AND_ASSIGN(TabFinder); |
| }; |
| |
| #endif // CHROME_BROWSER_TABS_TAB_FINDER_H_ |