// 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_