| // Copyright 2013 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_SEARCH_SEARCH_TERMS_TRACKER_H_ |
| #define CHROME_BROWSER_SEARCH_SEARCH_TERMS_TRACKER_H_ |
| |
| #include <map> |
| |
| #include "base/strings/string16.h" |
| #include "content/public/browser/notification_observer.h" |
| #include "content/public/browser/notification_registrar.h" |
| |
| namespace content { |
| class NavigationController; |
| class WebContents; |
| } |
| |
| namespace chrome { |
| |
| // Observes navigation events (and WebContents destructions) to keep track of |
| // search terms associated with a WebContents. Essentially, as long as there are |
| // only web-triggerable navigations following a search results page, this class |
| // will consider the search terms from that SRP as the "current" search terms. |
| // Any other type of navigation will invalidate the search terms. The search |
| // terms are being tracked so they can be displayed in the location bar for |
| // related navigations that occur after a search. |
| class SearchTermsTracker : public content::NotificationObserver { |
| public: |
| SearchTermsTracker(); |
| virtual ~SearchTermsTracker(); |
| |
| // Returns the current search terms and navigation index of the corresponding |
| // search results page for the specified WebContents. This function will |
| // return true if there are valid search terms for |contents|. |search_terms| |
| // and/or |navigation_index| can be NULL if not needed. |
| bool GetSearchTerms(const content::WebContents* contents, |
| base::string16* search_terms, |
| int* navigation_index) const; |
| |
| // content::NotificationObserver |
| virtual void Observe(int type, |
| const content::NotificationSource& source, |
| const content::NotificationDetails& details) OVERRIDE; |
| |
| private: |
| struct TabData { |
| TabData() : srp_navigation_index(-1) {} |
| base::string16 search_terms; |
| int srp_navigation_index; |
| }; |
| |
| // Keeps information about the specified WebContents. |
| typedef std::map<const content::WebContents*, TabData> TabState; |
| |
| // Searches for the most recent search and, if found, fills |tab_data| with |
| // information about that search and returns true. |
| bool FindMostRecentSearch(const content::NavigationController* controller, |
| TabData* tab_data); |
| |
| // Removes the TabData entry associated to the specified |contents|. |
| void RemoveTabData(const content::WebContents* contents); |
| |
| content::NotificationRegistrar registrar_; |
| TabState tabs_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SearchTermsTracker); |
| }; |
| |
| } // namespace chrome |
| |
| #endif // CHROME_BROWSER_SEARCH_SEARCH_TERMS_TRACKER_H_ |