// Copyright 2014 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_SESSIONS_TAB_LOADER_DELEGATE_H_
#define CHROME_BROWSER_SESSIONS_TAB_LOADER_DELEGATE_H_

#include <memory>

#include "base/macros.h"
#include "base/time/time.h"

namespace content {
class WebContents;
}

namespace resource_coordinator {
class SessionRestorePolicy;
}

class TabLoaderCallback {
 public:
  // This function will get called to suppress and to allow tab loading. Tab
  // loading is initially enabled.
  virtual void SetTabLoadingEnabled(bool enable_tab_loading) = 0;

  // Invoked by the delegate to inform the tab loader of a change in the score
  // of a tab. A higher score means the tab should be restored sooner.
  virtual void NotifyTabScoreChanged(content::WebContents* contents,
                                     float score) = 0;
};

// TabLoaderDelegate is created once the SessionRestore process is complete and
// the loading of hidden tabs starts.
class TabLoaderDelegate {
 public:
  virtual ~TabLoaderDelegate() {}

  // Create a tab loader delegate. |TabLoaderCallback::SetTabLoadingEnabled| can
  // get called to disable / enable tab loading.
  // The callback object is valid as long as this object exists.
  static std::unique_ptr<TabLoaderDelegate> Create(TabLoaderCallback* callback);

  // Returns the default timeout time after which the first non-visible tab
  // gets loaded if the first (visible) tab did not finish loading.
  virtual base::TimeDelta GetFirstTabLoadingTimeout() const = 0;

  // Returns the default timeout time after which the next tab gets loaded if
  // the previous tab did not finish loading.
  virtual base::TimeDelta GetTimeoutBeforeLoadingNextTab() const = 0;

  // Returns the maximum number of tabs that should be loading simultaneously.
  virtual size_t GetMaxSimultaneousTabLoads() const = 0;

  // Notifies the delegate of a tab that will be restored. This informs the
  // delegate that this tab is being tracked, and changes in its priority or
  // ranking should be forwarded to the TabLoader. WebContents provided to the
  // delegate via this function are guaranteed to remain valid to derefence
  // until a subsequent RemoveTab. Returns an initial score for the tab.
  virtual float AddTabForScoring(content::WebContents* contents) const = 0;

  // Notifies the delegate of a tab that is no longer being tracked.
  virtual void RemoveTabForScoring(content::WebContents* contents) const = 0;

  // Determines whether or not the given tab should be loaded. If this returns
  // false, then the TabLoader no longer attempts to load |contents| and removes
  // it from TabLoaders internal state. This is called immediately prior to
  // trying to load the tab and allows the TabLoader to respond to changing
  // conditions.
  virtual bool ShouldLoad(content::WebContents* contents) const = 0;

  // Notifies the delegate that a tab load has been initiated.
  virtual void NotifyTabLoadStarted() = 0;

  // Returns the policy engine that is in use.
  virtual resource_coordinator::SessionRestorePolicy* GetPolicyForTesting() = 0;

  // Testing seam to inject a custom SessionRestorePolicy.
  static void SetSessionRestorePolicyForTesting(
      resource_coordinator::SessionRestorePolicy* policy);

 protected:
  // The delegate should only be created via the factory function.
  TabLoaderDelegate() {}

 private:
  DISALLOW_COPY_AND_ASSIGN(TabLoaderDelegate);
};

#endif  // CHROME_BROWSER_SESSIONS_TAB_LOADER_DELEGATE_H_
