tab_finder.h revision ddb351dbec246cf1fab5ec20d2d5520909041de1
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
20class Browser;
21class GURL;
22class 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.
29class 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