| // 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 |