• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_TABS_TAB_FINDER_H_
6 #define CHROME_BROWSER_TABS_TAB_FINDER_H_
7 #pragma once
8 
9 #include <map>
10 #include <set>
11 
12 #include "base/basictypes.h"
13 #include "base/memory/singleton.h"
14 #include "chrome/browser/history/history_types.h"
15 #include "content/browser/cancelable_request.h"
16 #include "content/browser/tab_contents/navigation_controller.h"
17 #include "content/common/notification_observer.h"
18 #include "content/common/notification_registrar.h"
19 
20 class Browser;
21 class GURL;
22 class TabContents;
23 
24 // TabFinder is used to locate a tab by URL. TabFinder matches tabs based
25 // on the tabs current url, or the start of the redirect chain.
26 //
27 // TODO: if we end up keeping this (moving it out of about:flags) then we
28 // should persist the start of the redirect chain in the navigation entry.
29 class TabFinder : public NotificationObserver {
30  public:
31   // Returns the TabFinder, or NULL if TabFinder is not enabled.
32   static TabFinder* GetInstance();
33 
34   // Returns true if TabFinder is enabled.
35   static bool IsEnabled();
36 
37   // Returns the tab that matches the specified url. If a tab is found the
38   // browser containing the tab is set in |existing_browser|. This searches
39   // in |browser| first before checking any other browsers.
40   TabContents* FindTab(Browser* browser,
41                        const GURL& url,
42                        Browser** existing_browser);
43 
44   // NotificationObserver overrides:
45   virtual void Observe(NotificationType type,
46                        const NotificationSource& source,
47                        const NotificationDetails& details) OVERRIDE;
48 
49  private:
50   friend struct DefaultSingletonTraits<TabFinder>;
51 
52   class TabContentsObserverImpl;
53 
54   typedef std::map<TabContents*, GURL> TabContentsToURLMap;
55   typedef std::set<TabContentsObserverImpl*> TabContentsObservers;
56 
57   TabFinder();
58   ~TabFinder();
59 
60   void Init();
61 
62   // Forwarded from TabContentsObserverImpl.
63   void DidNavigateAnyFramePostCommit(
64       TabContents* source,
65       const NavigationController::LoadCommittedDetails& details,
66       const ViewHostMsg_FrameNavigate_Params& params);
67 
68   // Returns true if the tab's current url is |url|, or the start of the
69   // redirect chain for the tab is |url|.
70   bool TabMatchesURL(TabContents* tab_contents, const GURL& url);
71 
72   // Returns the first tab in the specified browser that matches the specified
73   // url.  Returns NULL if there are no tabs matching the specified url.
74   TabContents* FindTabInBrowser(Browser* browser, const GURL& url);
75 
76   // If we're not currently tracking |tab| this creates a
77   // TabContentsObserverImpl to listen for navigations.
78   void TrackTab(TabContents* tab);
79 
80   // Queries all the tabs in |browser| for the start of the redirect chain.
81   void TrackBrowser(Browser* browser);
82 
83   // Invoked when a TabContents is being destroyed.
84   void TabDestroyed(TabContentsObserverImpl* observer);
85 
86   // Cancels any pending requests for the specified tabs redirect chain.
87   void CancelRequestsFor(TabContents* tab_contents);
88 
89   // Starts the fetch for the redirect chain of the specified TabContents.
90   // QueryRedirectsToComplete is invoked when the redirect chain is retrieved.
91   void FetchRedirectStart(TabContents* tab);
92 
93   // Callback when we get the redirect list for a tab.
94   void QueryRedirectsToComplete(CancelableRequestProvider::Handle handle,
95                                 GURL url,
96                                 bool success,
97                                 history::RedirectList* redirects);
98 
99   // Maps from TabContents to the start of the redirect chain.
100   TabContentsToURLMap tab_contents_to_url_;
101 
102   CancelableRequestConsumerTSimple<TabContents*> callback_consumer_;
103 
104   NotificationRegistrar registrar_;
105 
106   TabContentsObservers tab_contents_observers_;
107 
108   DISALLOW_COPY_AND_ASSIGN(TabFinder);
109 };
110 
111 #endif  // CHROME_BROWSER_TABS_TAB_FINDER_H_
112