blob: 6e9194f2801b00abe371e2a65522c01b3fa63061 [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef EXTENSIONS_RENDERER_API_MESSAGING_MESSAGING_UTIL_H_
#define EXTENSIONS_RENDERER_API_MESSAGING_MESSAGING_UTIL_H_
#include <memory>
#include <string>
#include "extensions/common/extension_id.h"
#include "v8/include/v8-forward.h"
namespace blink {
class WebLocalFrame;
}
namespace extensions {
namespace mojom {
enum class ChannelType;
enum class SerializationFormat;
} // namespace mojom
class ScriptContext;
struct Message;
struct MessagingEndpoint;
namespace messaging_util {
// The channel names for the sendMessage and sendRequest calls.
extern const char kSendMessageChannel[];
extern const char kSendRequestChannel[];
// Messaging-related events.
extern const char kOnMessageEvent[];
extern const char kOnMessageExternalEvent[];
extern const char kOnUserScriptMessageEvent[];
extern const char kOnRequestEvent[];
extern const char kOnRequestExternalEvent[];
extern const char kOnConnectEvent[];
extern const char kOnConnectExternalEvent[];
extern const char kOnUserScriptConnectEvent[];
extern const char kOnConnectNativeEvent[];
inline constexpr int kNoFrameId = -1;
// Parses the message from a v8 value, returning null on failure. On error,
// will populate `error_out`.
std::unique_ptr<Message> MessageFromV8(v8::Local<v8::Context> context,
v8::Local<v8::Value> value,
mojom::SerializationFormat format,
std::string* error);
// Converts a message to a v8 value. For well-formed inputs, this will always
// return a valid value. For malformed inputs, the behavior is as follows:
//
// If `is_parsing_fail_safe` is true, this function will return an empty value
// and populate `error`.
//
// If `is_parsing_fail_safe` is false, this function will CHECK() and cause a
// crash.
v8::Local<v8::Value> MessageToV8(v8::Local<v8::Context> context,
const Message& message,
bool is_parsing_fail_safe,
std::string* error);
// Extracts an integer id from `value`, including accounting for -0 (which is a
// valid integer, but is stored in V8 as a number). This will DCHECK that
// `value` is either an int32 or -0.
int ExtractIntegerId(v8::Local<v8::Value> value);
// Returns the preferred serialization format for the given `context`. Note
// extension native messaging clients shouldn't call this as they should always
// use JSON.
mojom::SerializationFormat GetSerializationFormat(const ScriptContext& context);
// Flags for ParseMessageOptions().
enum ParseOptionsFlags {
NO_FLAGS = 0,
PARSE_CHANNEL_NAME = 1,
PARSE_FRAME_ID = 1 << 1,
};
struct MessageOptions {
std::string channel_name;
int frame_id = kNoFrameId;
std::string document_id;
};
// Parses and returns the options parameter for sendMessage or connect.
// `flags` specifies additional properties to look for on the object.
MessageOptions ParseMessageOptions(v8::Local<v8::Context> context,
v8::Local<v8::Object> v8_options,
int flags);
// Parses the target from `v8_target_id`, or uses the extension associated with
// the `script_context` as a default. Returns true on success, and false on
// failure. In the case of failure, will populate `error_out` with an error
// based on the `method_name`.
bool GetTargetExtensionId(ScriptContext* script_context,
v8::Local<v8::Value> v8_target_id,
const char* method_name,
std::string* target_out,
std::string* error_out);
// Massages the sendMessage() or sendRequest() arguments into the expected
// schema. These arguments are ambiguous (could match multiple signatures), so
// we can't just rely on the normal signature parsing. Sets `arguments` to the
// result if successful; otherwise leaves `arguments` untouched. (If the massage
// is unsuccessful, our normal argument parsing code should throw a reasonable
// error.
void MassageSendMessageArguments(v8::Isolate* isolate,
bool allow_options_argument,
v8::LocalVector<v8::Value>* arguments_out);
// Returns true if the sendRequest-related properties are disabled for the given
// `script_context`.
bool IsSendRequestDisabled(ScriptContext* script_context);
// Retrieves the event to dispatch for the given `source_endpoint`,
// `target_extension_id`, and `channel_name`.
std::string GetEventForChannel(const MessagingEndpoint& source_endpoint,
const ExtensionId& target_extension_id,
mojom::ChannelType channel_type);
} // namespace messaging_util
} // namespace extensions
#endif // EXTENSIONS_RENDERER_API_MESSAGING_MESSAGING_UTIL_H_