blob: 73e9d11e22b25ece54440a4a2fa74d40513b5ca3 [file] [log] [blame]
// Copyright 2017 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 EXTENSIONS_RENDERER_BINDINGS_JS_RUNNER_H_
#define EXTENSIONS_RENDERER_BINDINGS_JS_RUNNER_H_
#include <memory>
#include "base/callback.h"
#include "v8/include/v8.h"
namespace extensions {
// A helper class to execute JS functions safely.
class JSRunner {
public:
// Returns the instance of the JSRunner for the specified |context|.
static JSRunner* Get(v8::Local<v8::Context> context);
// Sets the instance for a given |context|.
static void SetInstanceForContext(v8::Local<v8::Context> context,
std::unique_ptr<JSRunner> runner);
// Clears the instance for a given |context|.
static void ClearInstanceForContext(v8::Local<v8::Context> context);
virtual ~JSRunner() {}
// Called with the result of executing the function, as well as the context
// it was executed in. Note: This callback is *not* guaranteed to be invoked
// (and won't be if, for instance, the context is destroyed before this is
// ran).
// NOTE(devlin): We could easily change that if desired.
using ResultCallback = base::OnceCallback<void(v8::Local<v8::Context>,
v8::MaybeLocal<v8::Value>)>;
// Calls the given |function| in the specified |context| and with the provided
// arguments. JS may be executed asynchronously if it has been suspended in
// the context.
void RunJSFunction(v8::Local<v8::Function> function,
v8::Local<v8::Context> context,
int argc,
v8::Local<v8::Value> argv[]);
// Same as above, but if a |callback| is provided, it will be called with the
// results of the function running.
virtual void RunJSFunction(v8::Local<v8::Function> function,
v8::Local<v8::Context> context,
int argc,
v8::Local<v8::Value> argv[],
ResultCallback callback) = 0;
// Executes the given |function| synchronously and returns the result. This
// should *only* be called in direct response to script running, since it
// bypasses script suspension.
virtual v8::MaybeLocal<v8::Value> RunJSFunctionSync(
v8::Local<v8::Function> function,
v8::Local<v8::Context> context,
int argc,
v8::Local<v8::Value> argv[]) = 0;
// Sets a global instance for testing that will be returned instead of the
// per-context version (if any).
static void SetInstanceForTesting(JSRunner* runner);
// Returns the global testing instance.
static JSRunner* GetInstanceForTesting();
};
} // namespace extensions
#endif // EXTENSIONS_RENDERER_BINDINGS_JS_RUNNER_H_