// Copyright 2021 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_FRAME_INTERNAL_H_
#define IOS_WEB_JS_MESSAGING_WEB_FRAME_INTERNAL_H_
#include <string>
#include <vector>
#include "base/functional/callback.h"
#include "base/time/time.h"
#include "base/values.h"
#include "ios/web/public/js_messaging/web_frame.h"
namespace web {
class JavaScriptContentWorld;
class WebFrameInternal {
public:
// Calls the JavaScript function `name` in the frame context in the same
// manner as the inherited CallJavaScriptFunction functions. `content_world`
// is optional, but if specified, the function will be executed within that
// world.
virtual bool CallJavaScriptFunctionInContentWorld(
const std::string& name,
const base::Value::List& parameters,
JavaScriptContentWorld* content_world) = 0;
// Calls the JavaScript function in the same condition as
// `CallJavaScriptFunctionInContentWorld` above. In addition, `callback` will
// be called with the value returned by the JavaScript execution if it
// completes before `timeout` is reached. If `timeout` is reached, `callback`
// is called with a null value.
// Returns true if function call was requested, false otherwise. Function call
// may still fail even if this function returns true. Always returns false if
// `CanCallJavaScriptFunction` is false.
virtual bool CallJavaScriptFunctionInContentWorld(
const std::string& name,
const base::Value::List& parameters,
JavaScriptContentWorld* content_world,
base::OnceCallback<void(const base::Value*)> callback,
base::TimeDelta timeout) = 0;
// Use of this function is DISCOURAGED. Prefer the
// `CallJavaScriptFunctionInContentWorld` family of functions instead to keep
// the API clear and well defined.
// Executes `script` in `content_world`.
// See WebFrame::ExecuteJavaScript for details on `callback`.
virtual bool ExecuteJavaScriptInContentWorld(
const std::u16string& script,
JavaScriptContentWorld* content_world,
ExecuteJavaScriptCallbackWithError callback) = 0;
};
} // namespace web
#endif // IOS_WEB_JS_MESSAGING_WEB_FRAME_INTERNAL_H_