// Copyright 2015 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_RESOURCE_COORDINATOR_TAB_MANAGER_WEB_CONTENTS_DATA_H_
#define CHROME_BROWSER_RESOURCE_COORDINATOR_TAB_MANAGER_WEB_CONTENTS_DATA_H_

#include "base/macros.h"
#include "base/time/time.h"
#include "chrome/browser/resource_coordinator/tab_load_tracker.h"
#include "chrome/browser/resource_coordinator/tab_manager.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"

namespace content {
class WebContents;
}

namespace resource_coordinator {

// Internal class used by TabManager to record the needed data for
// WebContentses.
// TODO(michaelpg): Merge implementation into
// TabActivityWatcher::WebContentsData and expose necessary properties publicly.
class TabManager::WebContentsData
    : public content::WebContentsObserver,
      public content::WebContentsUserData<TabManager::WebContentsData> {
 public:
  using LoadingState = resource_coordinator::TabLoadTracker::LoadingState;

  explicit WebContentsData(content::WebContents* web_contents);
  ~WebContentsData() override;

  // WebContentsObserver implementation:
  void DidStartNavigation(
      content::NavigationHandle* navigation_handle) override;
  void DidFinishNavigation(
      content::NavigationHandle* navigation_handle) override;
  void WebContentsDestroyed() override;

  // Returns the timestamp of the last time the tab changed became inactive.
  base::TimeTicks LastInactiveTime();

  // Sets the timestamp of the last time the tab became inactive.
  void SetLastInactiveTime(base::TimeTicks timestamp);

  // Copies the discard state from |old_contents| to |new_contents|.
  static void CopyState(content::WebContents* old_contents,
                        content::WebContents* new_contents);

  // Sets the current purge state.
  // TODO(tasak): remove this after the logic is moved into
  // MemoryCoordinator.
  void set_is_purged(bool state) { is_purged_ = state; }

  // Returns the current state of purge.
  // TODO(tasak): remove this after the logic is moved into
  // MemoryCoordinator.
  bool is_purged() const { return is_purged_; }

  // Sets the time to purge after the tab is backgrounded.
  void set_time_to_purge(const base::TimeDelta& time_to_purge) {
    time_to_purge_ = time_to_purge;
  }

  // Returns the time to first purge after the tab is backgrounded.
  base::TimeDelta time_to_purge() const { return time_to_purge_; }

  // Sets the tab loading state.
  void SetTabLoadingState(LoadingState state) {
    tab_data_.tab_loading_state = state;
  }

  // Returns the loading state of the tab.
  LoadingState tab_loading_state() const { return tab_data_.tab_loading_state; }

  void SetIsInSessionRestore(bool is_in_session_restore) {
    tab_data_.is_in_session_restore = is_in_session_restore;
  }

  bool is_in_session_restore() const { return tab_data_.is_in_session_restore; }

  void SetIsRestoredInForeground(bool is_restored_in_foreground) {
    tab_data_.is_restored_in_foreground = is_restored_in_foreground;
  }

  bool is_restored_in_foreground() const {
    return tab_data_.is_restored_in_foreground;
  }

 private:
  friend class content::WebContentsUserData<TabManager::WebContentsData>;
  // Needed to access tab_data_.
  FRIEND_TEST_ALL_PREFIXES(TabManagerWebContentsDataTest, CopyState);
  FRIEND_TEST_ALL_PREFIXES(TabManagerWebContentsDataTest, TabLoadingState);

  struct Data {
    Data();
    bool operator==(const Data& right) const;
    bool operator!=(const Data& right) const;

    // The last time the tab switched from being active to inactive.
    base::TimeTicks last_inactive_time;
    // Current loading state of this tab.
    LoadingState tab_loading_state;
    // True if the tab was created by session restore. Remains true until the
    // end of the first navigation or the tab is closed.
    bool is_in_session_restore;
    // True if the tab was created by session restore and initially foreground.
    bool is_restored_in_foreground;
  };

  // Contains all the needed data for the tab.
  Data tab_data_;

  // The time to purge after the tab is backgrounded.
  base::TimeDelta time_to_purge_;

  // True if the tab has been purged.
  bool is_purged_;

  DISALLOW_COPY_AND_ASSIGN(WebContentsData);
  WEB_CONTENTS_USER_DATA_KEY_DECL();
};

}  // namespace resource_coordinator

#endif  // CHROME_BROWSER_RESOURCE_COORDINATOR_TAB_MANAGER_WEB_CONTENTS_DATA_H_
