blob: ec37c55f6cb832df15bb9cfd1093622aabe10d1e [file] [log] [blame]
// Copyright 2014 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.
#import "ios/chrome/browser/ui/contextual_search/js_contextual_search_manager.h"
#include "base/ios/ios_util.h"
#include "base/mac/foundation_util.h"
#include "base/mac/scoped_block.h"
#include "base/strings/string_util.h"
#include "base/strings/sys_string_conversions.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
static NSString* const kEnableSelectionChangeListener =
@"__gCrWeb.contextualSearch.enableSelectionChangeListener(%@);";
static NSString* const kSetMutationObserverDelay =
@"__gCrWeb.contextualSearch.setMutationObserverDelay(%f);";
static NSString* const kDisableMutationObserver =
@"__gCrWeb.contextualSearch.disableMutationObserver();";
static NSString* const kSetBodyTouchListenerDelay =
@"__gCrWeb.contextualSearch.setBodyTouchListenerDelay(%f);";
static NSString* const kDisableBodyTouchListener =
@"__gCrWeb.contextualSearch.disableBodyTouchListener();";
static NSString* const kHandleCtxSearch =
@"__gCrWeb.contextualSearch.handleTapAtPoint(%f, %f);";
static NSString* const kExpandHighlight =
@"__gCrWeb.contextualSearch.expandHighlight(%d, %d);";
static NSString* const kHighlightRects =
@"__gCrWeb.contextualSearch.highlightRects();";
static NSString* const kClearHighlight =
@"__gCrWeb.contextualSearch.clearHighlight();";
@implementation JsContextualSearchManager
#pragma mark - Protected methods
- (NSString*)scriptPath {
return @"contextualsearch";
}
#pragma mark - Public methods
- (void)fetchContextFromSelectionAtPoint:(CGPoint)point
completionHandler:(void (^)(NSString*))handler {
NSString* handleContextualSearch =
[NSString stringWithFormat:kHandleCtxSearch, point.x, point.y];
web::JavaScriptResultBlock resultHandler = ^(id result, NSError* error) {
if (error) {
DLOG(ERROR) << "Error evaluating contextual search javascript: "
<< base::SysNSStringToUTF8([error description]);
}
handler(base::mac::ObjCCastStrict<NSString>(result));
};
[self executeJavaScript:handleContextualSearch
completionHandler:resultHandler];
}
- (void)enableEventListenersWithMutationDelay:(CGFloat)mutationDelay
bodyTouchDelay:(CGFloat)bodyTouchDelay {
NSString* jsForwardString =
[NSString stringWithFormat:kEnableSelectionChangeListener, @"true"];
jsForwardString = [jsForwardString
stringByAppendingFormat:kSetMutationObserverDelay, mutationDelay];
if (bodyTouchDelay == 0) {
jsForwardString =
[jsForwardString stringByAppendingString:kDisableBodyTouchListener];
} else {
jsForwardString = [jsForwardString
stringByAppendingFormat:kSetBodyTouchListenerDelay, bodyTouchDelay];
}
[self executeJavaScript:jsForwardString completionHandler:nil];
}
- (void)highlightRectsWithCompletionHandler:
(web::JavaScriptResultBlock)completion {
[self executeJavaScript:kHighlightRects completionHandler:completion];
}
- (void)clearHighlight {
[self executeJavaScript:kClearHighlight completionHandler:nil];
}
- (void)disableListeners {
NSString* jsForwardString =
[NSString stringWithFormat:kEnableSelectionChangeListener, @"false"];
jsForwardString =
[jsForwardString stringByAppendingString:kDisableMutationObserver];
jsForwardString =
[jsForwardString stringByAppendingString:kDisableBodyTouchListener];
[self executeJavaScript:jsForwardString completionHandler:nil];
}
- (void)expandHighlightToStartOffset:(int)startOffset
endOffset:(int)endOffset
completionHandler:(web::JavaScriptResultBlock)completion {
if (startOffset < 0 || endOffset < 0)
return;
NSString* expandHightlightString =
[NSString stringWithFormat:kExpandHighlight, startOffset, endOffset];
[self executeJavaScript:expandHightlightString completionHandler:completion];
}
@end