| // Copyright (c) 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_UI_ACTIVE_TAB_TRACKER_H_ |
| #define CHROME_BROWSER_UI_ACTIVE_TAB_TRACKER_H_ |
| |
| #include "base/logging.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/time/time.h" |
| #include "base/timer/timer.h" |
| #include "chrome/browser/idle.h" |
| #include "chrome/browser/ui/browser_list_observer.h" |
| #include "chrome/browser/ui/native_focus_tracker.h" |
| #include "chrome/browser/ui/tabs/tab_strip_model_observer.h" |
| #include "content/public/browser/notification_observer.h" |
| #include "content/public/browser/notification_registrar.h" |
| #include "url/gurl.h" |
| |
| class Browser; |
| |
| namespace content { |
| class WebContents; |
| } |
| |
| // ActiveTabTracker persists the amount of time the user views a page to |
| // history. Only pages the user views for more than |kTimeBeforeCommitMS| |
| // milliseconds while the page is active are persisted. |
| class ActiveTabTracker : public chrome::BrowserListObserver, |
| public TabStripModelObserver, |
| public content::NotificationObserver, |
| public NativeFocusTrackerHost { |
| public: |
| ActiveTabTracker(); |
| virtual ~ActiveTabTracker(); |
| |
| // TODO(sky): remove this when we have NativeFocusTracker for other platforms. |
| bool is_valid() const { return native_focus_tracker_.get() != NULL; } |
| |
| // TabStripModelObserver: |
| virtual void ActiveTabChanged(content::WebContents* old_contents, |
| content::WebContents* new_contents, |
| int index, |
| int reason) OVERRIDE; |
| virtual void TabReplacedAt(TabStripModel* tab_strip_model, |
| content::WebContents* old_contents, |
| content::WebContents* new_contents, |
| int index) OVERRIDE; |
| virtual void TabStripEmpty() OVERRIDE; |
| |
| // BrowserListObserver: |
| virtual void OnBrowserRemoved(Browser* browser) OVERRIDE; |
| |
| // content::NotificationObserver: |
| virtual void Observe(int type, |
| const content::NotificationSource& source, |
| const content::NotificationDetails& details) OVERRIDE; |
| |
| // NativeFocusTrackerHost: |
| virtual void SetBrowser(Browser* browser) OVERRIDE; |
| |
| private: |
| // Sets the active webcontents. |
| void SetWebContents(content::WebContents* web_contents); |
| |
| // Sets the idle state. |
| void SetIdleState(IdleState idle_state); |
| |
| // Starts the query for the idle state. Invokes SetIdleState() when idel state |
| // is found. |
| void QueryIdleState(); |
| |
| // Returns the URL |web_contents_| is showing and needs to be tracked. Returns |
| // an empty GURL() is no |web_contents_| or the |web_contents_| is not showing |
| // a page that needs to be tracked. |
| GURL GetURLFromWebContents() const; |
| |
| // If necessary commits the active time for the active tab. |
| void CommitActiveTime(); |
| |
| scoped_ptr<NativeFocusTracker> native_focus_tracker_; |
| |
| // The active Browser, or NULL if one is not active. |
| Browser* browser_; |
| |
| // The active WebContents. |
| content::WebContents* web_contents_; |
| |
| // Current idle state. Only valid if |browser_| is non-null and |
| // |weak_ptr_factory_| is empty. |
| IdleState idle_state_; |
| |
| // Time the |idle_state_| became IDLE_STATE_ACTIVE, or a tab changed. |
| base::TimeTicks active_time_; |
| |
| // Timer used to query for idle state. |
| base::Timer timer_; |
| |
| // The url of the active tab. Empty indicates not valid. |
| GURL url_; |
| |
| content::NotificationRegistrar registrar_; |
| |
| // WeakPtrFactory used when querying for idle state. |
| base::WeakPtrFactory<ActiveTabTracker> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ActiveTabTracker); |
| }; |
| |
| #endif // CHROME_BROWSER_UI_ACTIVE_TAB_TRACKER_H_ |