blob: 8d5a055795dcc696fd90a3d2160388cd9574c66c [file] [log] [blame]
// Copyright 2012 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_CHROME_BROWSER_PRERENDER_PRELOAD_CONTROLLER_H_
#define IOS_CHROME_BROWSER_PRERENDER_PRELOAD_CONTROLLER_H_
#import <UIKit/UIKit.h>
#include <memory>
#include "components/prefs/pref_change_registrar.h"
#import "ios/chrome/browser/net/connection_type_observer_bridge.h"
#include "ios/web/public/referrer.h"
#import "ios/web/public/web_state/ui/crw_native_content_provider.h"
#import "ios/web/public/web_state/web_state_delegate_bridge.h"
#import "net/url_request/url_fetcher.h"
#include "ui/base/page_transition_types.h"
#include "url/gurl.h"
@protocol PreloadControllerDelegate;
namespace ios {
class ChromeBrowserState;
}
namespace web {
class WebState;
}
// PreloadController owns and manages a Tab that contains a prerendered
// webpage. This class contains methods to queue and cancel prerendering for a
// given URL as well as a method to return the prerendered Tab.
@interface PreloadController : NSObject<CRWNativeContentProvider,
CRWWebStateDelegate,
CRConnectionTypeObserverBridge>
// The URL of the currently prerendered Tab. Empty if there is no prerendered
// Tab.
@property(nonatomic, readonly, assign) GURL prerenderedURL;
@property(nonatomic, weak) id<PreloadControllerDelegate> delegate;
// Designated initializer.
- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState;
// Called when the browser state this object was initialized with is being
// destroyed.
- (void)browserStateDestroyed;
// Prerenders the given |url| with the given |transition|. Normally, prerender
// requests are fulfilled after a short delay, to prevent unnecessary prerenders
// while the user is typing. If |immediately| is YES, this method starts
// prerendering immediately, with no delay. |immediately| should be set to YES
// only when there is a very high confidence that the user will navigate to the
// given |url|.
//
// If there is already an existing request for |url|, this method does nothing
// and does not reset the delay timer. If there is an existing request for a
// different URL, this method cancels that request and queues this request
// instead.
- (void)prerenderURL:(const GURL&)url
referrer:(const web::Referrer&)referrer
transition:(ui::PageTransition)transition
immediately:(BOOL)immediately;
// Cancels any outstanding prerender requests and destroys any prerendered Tabs.
- (void)cancelPrerender;
// Returns whether |webState| is the WebState used for pre-rendering.
- (BOOL)isWebStatePrerendered:(web::WebState*)webState;
// Returns the currently prerendered WebState, or nil if none exists. After
// this method is called, the PrerenderController reverts to a non-prerendering
// state.
- (std::unique_ptr<web::WebState>)releasePrerenderContents;
@end
#endif // IOS_CHROME_BROWSER_PRERENDER_PRELOAD_CONTROLLER_H_