blob: cfd346b4a7707f46018f423f85b79f73cd125567 [file] [log] [blame]
// Copyright 2015 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_UI_CONTEXTUAL_SEARCH_CONTEXTUAL_SEARCH_CONTROLLER_H_
#define IOS_CHROME_BROWSER_UI_CONTEXTUAL_SEARCH_CONTEXTUAL_SEARCH_CONTROLLER_H_
#import <UIKit/UIKit.h>
#include "base/ios/block_types.h"
#include "base/strings/string16.h"
#include "ios/chrome/browser/ui/contextual_search/panel_configuration.h"
namespace ios {
class ChromeBrowserState;
}
namespace web {
class WebState;
}
class GURL;
@class Tab;
@class TouchToSearchPermissionsMediator;
struct WebStateOpener;
namespace ContextualSearch {
// Possible reason for panel state changes.
enum StateChangeReason {
UNKNOWN,
RESET,
BACK_PRESS, // This is Android-only; we should never use this value.
TEXT_SELECT_TAP,
TEXT_SELECT_LONG_PRESS,
INVALID_SELECTION,
BASE_PAGE_TAP,
BASE_PAGE_SCROLL,
SEARCH_BAR_TAP,
SERP_NAVIGATION,
TAB_PROMOTION,
CLICK,
SWIPE, // Moved by going to the nearest state when a drag ends.
FLING, // Moved by interpolating a drag with velocity.
OPTIN,
OPTOUT
};
} // namespace ContextualSearch
@class ContextualSearchController;
@class ContextualSearchPanelView;
@class ContextualSearchResultsView;
@protocol ContextualSearchTabProvider<NSObject>
// Disassociate the internal WebState from this view and return it.
- (std::unique_ptr<web::WebState>)releaseWebState;
// Information about the opener of the internal WebState.
- (WebStateOpener)webStateOpener;
@end
@protocol ContextualSearchControllerDelegate<NSObject>
// Called by the controller when it has tab content for the delegate to load
// and display as a new tab; the content is provided by -releaseSearchTab.
// |focusInput| indicates that the after promoting the tab, the delegate must
// focus the main input.
- (void)promotePanelToTabProvidedBy:(id<ContextualSearchTabProvider>)tabProvider
focusInput:(BOOL)focusInput;
// Called by the controller when it has a link for the delegate to load
// and display as a new tab.
- (void)createTabFromContextualSearchController:(const GURL&)url;
// Provides the current height of the headers at the top of the screen.
- (CGFloat)currentHeaderHeight;
@end
// Controller for handling contextual search gestures.
@interface ContextualSearchController : NSObject
// YES if contextual search is enabled on the current WebState.
@property(readonly) BOOL enabled;
// The current web state being watched for contextual search events.
// Only tests should set this directly; for general use, use -setTab:, which
// will set this property with the tab's webState.
@property(nonatomic, assign) web::WebState* webState;
// The panel view that this controller should populate with subviews and use.
// Owned by its superview. Setting this will have the controller create subviews
// for the panel; code that sets this property is responsible for disposing of
// the old panel and its views.
// This property can only be assigned a non-nil value, and can only be assigned
// a value when its current value is nil.
@property(nonatomic, weak) ContextualSearchPanelView* panel;
// Designated initializer.
- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState
delegate:(id<ContextualSearchControllerDelegate>)
delegate;
// Set the Tab to be used as the opener for the search results tab. |opener|'s
// lifetime should be greater than the receiver's. |opener| can be nil.
- (void)setTab:(Tab*)tab;
// Enable or disable contextual search for the current WebState. If
// |enabled| is YES, contextual search may still not be enabled for a number of
// reasons; the -enabled property will indicate the current status.
// This method functions asynchronously.
- (void)enableContextualSearch:(BOOL)enabled;
// Reset the pane to be offscreen when tabs change.
- (void)movePanelOffscreen;
// Destroy the receiver.
// Any following call is not supported.
- (void)close;
@end
// Testing category that allows a permissions class to be injected.
@interface ContextualSearchController (Testing)
- (void)setPermissions:(TouchToSearchPermissionsMediator*)permissions;
@end
#endif // IOS_CHROME_BROWSER_UI_CONTEXTUAL_SEARCH_CONTEXTUAL_SEARCH_CONTROLLER_H_