// 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 IOS_WEB_PUBLIC_NAVIGATION_MANAGER_H_
#define IOS_WEB_PUBLIC_NAVIGATION_MANAGER_H_

#include <stddef.h>

#include "base/callback.h"
#include "ios/web/public/browser_url_rewriter.h"
#include "ios/web/public/navigation_item_list.h"
#include "ios/web/public/referrer.h"
#include "ios/web/public/reload_type.h"
#include "ios/web/public/user_agent.h"
#include "ui/base/page_transition_types.h"

@class NSDictionary;
@class NSData;

namespace web {

class BrowserState;
class NavigationItem;
class WebState;

// A NavigationManager maintains the back-forward list for a WebState and
// manages all navigation within that list.
//
// Each NavigationManager belongs to one WebState; each WebState has
// exactly one NavigationManager.
class NavigationManager {
 public:
  // User agent override option used in LoadURLParams.
  enum class UserAgentOverrideOption : short {
    // Inherit the user agent type from the last committed non-native item if
    // there is one, otherwise keep the default type, which is NONE for native
    // item and MOBILE for non-native item.
    INHERIT = 0,

    // Use the mobile user agent.
    MOBILE,

    // Use the desktop user agent.
    DESKTOP,
  };

  // Parameters for URL loading. Most parameters are optional, and can be left
  // at the default values set by the constructor.
  struct WebLoadParams {
   public:
    // The URL to load. Must be set.
    GURL url;

    // The URL to display in Omnibox. If empty, |url| will be displayed.
    GURL virtual_url;

    // The referrer for the load. May be empty.
    Referrer referrer;

    // The transition type for the load. Defaults to PAGE_TRANSITION_LINK.
    ui::PageTransition transition_type;

    // The user agent override option for the load. Defualts to INHERIT.
    UserAgentOverrideOption user_agent_override_option;

    // True for renderer-initiated navigations. This is
    // important for tracking whether to display pending URLs.
    bool is_renderer_initiated;

    // Any extra HTTP headers to add to the load.
    NSDictionary* extra_headers;

    // Any post data to send with the load. When setting this, you should
    // generally set a Content-Type header as well.
    NSData* post_data;

    // Create a new WebLoadParams with the given URL and defaults for all other
    // parameters.
    explicit WebLoadParams(const GURL& url);
    ~WebLoadParams();

    // Allow copying WebLoadParams.
    WebLoadParams(const WebLoadParams& other);
    WebLoadParams& operator=(const WebLoadParams& other);
  };

  virtual ~NavigationManager() {}

  // Gets the BrowserState associated with this NavigationManager. Can never
  // return null.
  virtual BrowserState* GetBrowserState() const = 0;

  // Gets the WebState associated with this NavigationManager.
  virtual WebState* GetWebState() const = 0;

  // Returns the NavigationItem that should be used when displaying info about
  // the current item to the user. It ignores certain pending entries, to
  // prevent spoofing attacks using slow-loading navigations.
  virtual NavigationItem* GetVisibleItem() const = 0;

  // Returns the last committed NavigationItem, which may be null if there
  // are no committed entries or session restoration is in-progress.
  virtual NavigationItem* GetLastCommittedItem() const = 0;

  // Returns the pending item corresponding to the navigation that is currently
  // in progress, or null if there is none.
  virtual NavigationItem* GetPendingItem() const = 0;

  // Returns the transient item if any. This is an item which is removed and
  // discarded if any navigation occurs. Note that the returned item is owned
  // by the navigation manager and may be deleted at any time.
  virtual NavigationItem* GetTransientItem() const = 0;

  // Removes the transient and pending NavigationItems.
  virtual void DiscardNonCommittedItems() = 0;

  // Loads the URL with specified |params|.
  virtual void LoadURLWithParams(
      const NavigationManager::WebLoadParams& params) = 0;

  // Loads the current page in the following cases:
  //  - NavigationManager was restored from history and the current page has not
  //    loaded yet.
  //  - Renderer process has crashed.
  //  - Web usage was disabled and re-enabled.
  virtual void LoadIfNecessary() = 0;

  // Adds |rewriter| to a transient list of URL rewriters.  Transient URL
  // rewriters will be executed before the rewriters already added to the
  // BrowserURLRewriter singleton, and the list will be cleared after the next
  // attempted page load.  |rewriter| must not be null.
  virtual void AddTransientURLRewriter(
      BrowserURLRewriter::URLRewriter rewriter) = 0;

  // Returns the number of items in the NavigationManager, excluding
  // pending and transient entries.
  // TODO(crbug.com/533848): Update to return size_t.
  virtual int GetItemCount() const = 0;

  // Returns the committed NavigationItem at |index|.
  virtual NavigationItem* GetItemAtIndex(size_t index) const = 0;

  // Returns the index of |item| in the committed session history.
  virtual int GetIndexOfItem(const NavigationItem* item) const = 0;

  // Returns the index of the last committed item or -1 if the last
  // committed item correspond to a new navigation  or session restoration is
  // in-progress.
  // TODO(crbug.com/533848): Update to return size_t.
  virtual int GetLastCommittedItemIndex() const = 0;

  // Returns the index of the pending item or -1 if the pending item
  // corresponds to a new navigation.
  // TODO(crbug.com/533848): Update to return size_t.
  virtual int GetPendingItemIndex() const = 0;

  // Removes the item at the specified |index|.  If the index is the last
  // committed index or the pending item, this does nothing and returns false.
  // Otherwise this call discards any transient or pending entries.
  // TODO(crbug.com/533848): Update to use size_t.
  virtual bool RemoveItemAtIndex(int index) = 0;

  // Navigation relative to the current item.
  virtual bool CanGoBack() const = 0;
  virtual bool CanGoForward() const = 0;
  virtual bool CanGoToOffset(int offset) const = 0;
  virtual void GoBack() = 0;
  virtual void GoForward() = 0;

  // Navigates to the specified absolute index.
  // TODO(crbug.com/533848): Update to use size_t.
  virtual void GoToIndex(int index) = 0;

  // Reloads the visible item under the specified ReloadType. If
  // |check_for_repost| is true and the current item has POST data the user is
  // prompted to see if they really want to reload the page. Pass in true if the
  // reload is explicitly initiated by the user. If a transient item is showing,
  // initiates a new navigation to its URL.
  // TODO(crbug.com/700958): implement the logic for |check_for_repost|.
  virtual void Reload(ReloadType reload_type, bool check_for_repost) = 0;

  // Reloads the visible item under the specified UserAgentType.
  // TODO(crbug.com/738020): combine both Reload() implementations.
  virtual void ReloadWithUserAgentType(UserAgentType user_agent_type) = 0;

  // Returns a list of all non-redirected NavigationItems whose index precedes
  // or follows the current index.
  virtual NavigationItemList GetBackwardItems() const = 0;
  virtual NavigationItemList GetForwardItems() const = 0;

  // Initializes this NavigationManager with the given saved navigations, using
  // |last_committed_item_index| as the currently loaded item. Before this call
  // the NavigationManager should be unused (there should be no current item).
  // This takes ownership of |items| (must be moved).
  virtual void Restore(int last_committed_item_index,
                       std::vector<std::unique_ptr<NavigationItem>> items) = 0;

  // Returns true after session restoration has started, until the first
  // post-restore navigation is started.
  virtual bool IsRestoreSessionInProgress() const = 0;

  // Registers a callback to be run when session restoration is completed.
  // If there is no in-progress session restoration, the callback is run
  // immediately.
  // TODO(crbug.com/904502): This API is only needed for clearing cookies.
  // Remove after //ios/web exposes a proper cookie clearing API.
  virtual void AddRestoreCompletionCallback(base::OnceClosure callback) = 0;

  // Removes all items from this except the last committed item, and inserts
  // copies of all items from |source| at the beginning of the session history.
  //
  // For example:
  // source: A B *C* D
  // this:   E F *G*
  // result: A B C *G*
  //
  // If there is a pending item after *G* in |this|, it is also preserved.
  // This ignores any pending or transient entries in |source|.  This will be a
  // no-op if called while CanPruneAllButLastCommittedItem() is false.
  virtual void CopyStateFromAndPrune(const NavigationManager* source) = 0;

  // Whether the NavigationManager can prune all but the last committed item.
  // This is true when all the following conditions are met:
  // - There is a last committed NavigationItem.
  // - There is no pending history navigation.
  // - There is no transient NavigationItem.
  virtual bool CanPruneAllButLastCommittedItem() const = 0;
};

}  // namespace web

#endif  // IOS_WEB_PUBLIC_NAVIGATION_MANAGER_H_
