chromium/ios/web/web_state/ui/crw_web_request_controller.h

// Copyright 2019 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_WEB_STATE_UI_CRW_WEB_REQUEST_CONTROLLER_H_
#define IOS_WEB_WEB_STATE_UI_CRW_WEB_REQUEST_CONTROLLER_H_

#import <WebKit/WebKit.h>

#include <memory>

#include "ios/web/public/navigation/referrer.h"
#import "ios/web/web_state/ui/crw_web_view_handler.h"
#import "ios/web/web_state/ui/crw_web_view_handler_delegate.h"
#include "ui/base/page_transition_types.h"
#include "url/gurl.h"

@class CRWWebRequestController;
@class CRWWKNavigationHandler;

namespace web {
class NavigationContextImpl;
}  // namespace web

@protocol CRWWebRequestControllerDelegate <CRWWebViewHandlerDelegate>

// The delegate should stop loading the page.
- (void)webRequestControllerStopLoading:
    (CRWWebRequestController*)requestController;

// The delegate is called when a page has actually started loading.
- (void)webRequestControllerDidStartLoading:
    (CRWWebRequestController*)requestController;

- (CRWWKNavigationHandler*)webRequestControllerNavigationHandler:
    (CRWWebRequestController*)requestController;

@end

// Controller in charge of preparing and handling web requests for the delegate,
// which should be `CRWWebController`.
@interface CRWWebRequestController : CRWWebViewHandler

@property(nonatomic, weak) id<CRWWebRequestControllerDelegate> delegate;

// Checks if a load request of the current navigation item should proceed. If
// this returns `YES`, caller should create a webView and call
// `loadRequestForCurrentNavigationItem`. Otherwise this will set the request
// state to finished and call `didFinishWithURL` with failure.
- (BOOL)maybeLoadRequestForCurrentNavigationItem;

// Sets up WebUI for URL.
- (void)createWebUIForURL:(const GURL&)URL;

// Clears WebUI, if one exists.
- (void)clearWebUI;

// Loads the URL indicated by current session state.
- (void)loadCurrentURLWithRendererInitiatedNavigation:(BOOL)rendererInitiated;

// Should be called by owner component after URL is finished loading and
// self.navigationHandler.navigationState is set to FINISHED. `context` contains
// information about the navigation associated with the URL. It is nil if
// currentURL is invalid.
- (void)didFinishWithURL:(const GURL&)currentURL
             loadSuccess:(BOOL)loadSuccess
                 context:(const web::NavigationContextImpl*)context;

// Calls `registerLoadRequestForURL` with empty referrer and link or client
// redirect transition based on user interaction state. Returns navigation
// context for this request.
- (std::unique_ptr<web::NavigationContextImpl>)
    registerLoadRequestForURL:(const GURL&)URL
       sameDocumentNavigation:(BOOL)sameDocumentNavigation
               hasUserGesture:(BOOL)hasUserGesture
            rendererInitiated:(BOOL)rendererInitiated;

// Creates a page change request and registers it with the navigation handler.
// Returns navigation context for this request.
- (std::unique_ptr<web::NavigationContextImpl>)
    registerLoadRequestForURL:(const GURL&)requestURL
                     referrer:(const web::Referrer&)referrer
                   transition:(ui::PageTransition)transition
       sameDocumentNavigation:(BOOL)sameDocumentNavigation
               hasUserGesture:(BOOL)hasUserGesture
            rendererInitiated:(BOOL)rendererInitiated;

// Loads `data` of type `MIMEType` and replaces last committed URL with the
// given `URL`.
- (void)loadData:(NSData*)data
        MIMEType:(NSString*)MIMEType
          forURL:(const GURL&)URL;

// Loads `HTML` into the page and use `URL` to resolve relative URLs within the
// document.
- (void)loadHTML:(NSString*)HTML forURL:(const GURL&)URL;

// Reloads web view. `rendererInitiated` is YES for renderer-initiated
// navigation. `rendererInitiated` is NO for browser-initiated navigation.
- (void)reloadWithRendererInitiatedNavigation:(BOOL)rendererInitiated;

@end

#endif  // IOS_WEB_WEB_STATE_UI_CRW_WEB_REQUEST_CONTROLLER_H_