// Copyright 2014 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_JS_MESSAGING_WEB_VIEW_JS_UTILS_H_
#define IOS_WEB_JS_MESSAGING_WEB_VIEW_JS_UTILS_H_
#import <Foundation/Foundation.h>
@class WKContentWorld;
@class WKFrameInfo;
@class WKWebView;
namespace base {
class Value;
} // namespace base
#import "ios/web/public/js_messaging/web_view_js_utils.h"
namespace web {
// The domain for JS evaluation NSErrors in web.
extern NSString* const kJSEvaluationErrorDomain;
// The maximum recursion depth when parsing JS results.
extern int const kMaximumParsingRecursionDepth;
// The type of errors that can occur while evaluating JS.
enum JSEvaluationErrorCode {
// No web view present to evaluate JS.
JS_EVALUATION_ERROR_CODE_NO_WEB_VIEW = -1000,
// JS evaluation is not allowed for security reasons.
JS_EVALUATION_ERROR_CODE_REJECTED = -1001,
};
// Converts base::Value to an equivalent Foundation object.
id NSObjectFromValueResult(const base::Value* value_result);
// Executes JavaScript on WKWebView. If the web view cannot execute JS at the
// moment, `completion_handler` is called with an NSError.
void ExecuteJavaScript(WKWebView* web_view,
NSString* script,
void (^completion_handler)(id, NSError*));
// Executes JavaScript for `web_view` in `frame_info` within `content_world` and
// calls `completion_handler` with the result. `content_world` and `frame_info`
// are required. If the web view cannot execute JS at the moment,
// `completion_handler` is called with an NSError.
void ExecuteJavaScript(WKWebView* web_view,
WKContentWorld* content_world,
WKFrameInfo* frame_info,
NSString* script,
void (^completion_handler)(id, NSError*));
// Calls into the JavaScript in `content_world` to trigger the registration of
// all web frames.
// NOTE: This call is sent to the WKWebView directly, because the result of this
// call will create the WebFrames. (Thus, the WebFrames do not yet exist and
// the ExecuteJavaScript variant above requiring `frame_info` can not be used.)
void RegisterExistingFrames(WKWebView* web_view, WKContentWorld* content_world);
} // namespace web
#endif // IOS_WEB_JS_MESSAGING_WEB_VIEW_JS_UTILS_H_