// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_WEB_NAVIGATION_NAVIGATION_MANAGER_DELEGATE_H_
#define IOS_WEB_NAVIGATION_NAVIGATION_MANAGER_DELEGATE_H_

#include <stddef.h>

#include "ios/web/common/user_agent.h"
#import "url/gurl.h"

@protocol CRWWebViewNavigationProxy;
@class WKBackForwardListItem;

namespace web {

enum class NavigationInitiationType;
class NavigationItem;
class NavigationItemImpl;
class WebState;

// Delegate for NavigationManager to hand off parts of the navigation flow.
class NavigationManagerDelegate {
 public:
  virtual ~NavigationManagerDelegate() {}

  // Instructs the delegate to clear any presented dialogs to prepare for a new
  // navigation.
  virtual void ClearDialogs() = 0;

  // Instructs the delegate to record page states (e.g. scroll position, form
  // values, whatever can be harvested) from the current page into the
  // navigation item.
  virtual void RecordPageStateInNavigationItem() = 0;

  // Instructs the delegate to load the current navigation item.
  virtual void LoadCurrentItem(NavigationInitiationType type) = 0;

  // Instructs the delegate to load the current navigation item if the current
  // page has not loaded yet. The navigation should be browser-initiated.
  virtual void LoadIfNecessary() = 0;

  // Instructs the delegate to reload.
  virtual void Reload() = 0;

  // Informs the delegate that a navigation item has been committed.
  virtual void OnNavigationItemCommitted(NavigationItem* item) = 0;

  // Returns the WebState associated with this delegate.
  virtual WebState* GetWebState() = 0;

  // Sets the UserAgent that should be used by the WebState.
  virtual void SetWebStateUserAgent(UserAgentType user_agent_type) = 0;

  // Returns a CRWWebViewNavigationProxy protocol that can be used to access
  // navigation related functions on the main WKWebView.
  virtual id<CRWWebViewNavigationProxy> GetWebViewNavigationProxy() const = 0;

  // Instructs WKWebView to navigate to the given navigation item. `wk_item` and
  // `item` must point to the same navigation item. Calling this method may
  // result in an iframe navigation.
  virtual void GoToBackForwardListItem(WKBackForwardListItem* wk_item,
                                       NavigationItem* item,
                                       NavigationInitiationType type,
                                       bool has_user_gesture) = 0;

  // Instructs the delegate to remove the underlying web view. The only use case
  // currently is to clear back-forward history in web view before restoring
  // session history.
  virtual void RemoveWebView() = 0;

  // Used to access pending item stored in NavigationContext.
  virtual NavigationItemImpl* GetPendingItem() = 0;

  // Instructs the delegate to update the SSL status for the current navigation
  // item.
  virtual void UpdateSSLStatusForCurrentNavigationItem() = 0;

  // Returns the NavigationManagerDelegate's view of the current URL. This is
  // used as a fallback in situations where the NavigationManager doesn't trust
  // its own view of the last committed item.
  virtual GURL GetCurrentURL() const = 0;
};

}  // namespace web

#endif  // IOS_WEB_NAVIGATION_NAVIGATION_MANAGER_DELEGATE_H_
