electron/native_mate
Cheng Zhao 2c23e44ed9
chore: remove native_mate (Part 3) (#20131)
* use gin converter in atom_api_menu

* please only put necessary includes in header

Having include in header means they have dependency relationship,
putting arbitrary includes really really really really really makes
refacoring much harder.

* remove some simple uses of callback_converter_deprecated.h

* use gin callback converter in file_dialog code

* use gin in ErrorThrower

* use gin in atom_bundle_mover

* fix mistake in node stream

* deprecate native_mate version of event_emitter_caller

* use gin in node_bindings

* remove usages of native_mate event_emitter_caller.h except for EventEmitter

* fix compilation on Windows

* gin::Arguments behaves differently on GetNext

* just use StringToV8
2019-09-06 14:52:54 +09:00
..
native_mate chore: remove native_mate (Part 3) (#20131) 2019-09-06 14:52:54 +09:00
BUILD.gn chore: fix V8 deprecation warnings (#15842) 2018-11-27 16:42:02 -05:00
LICENSE.chromium prepare for merging to electron 2018-06-22 11:29:57 +10:00
README.md docs: replace the atom.io headers URL with electronjs.org (#18328) 2019-05-21 16:17:07 +09:00

A fork of Chromium's gin library that makes it easier to marshal types between C++ and JavaScript.

Overview

native-mate was forked from gin so that it could be used in Electron without conflicting with Node's Environment. It has also been extended to allow Electron to create classes in JavaScript.

With the help of Chromium's base library, native-mate makes writing JS bindings very easy, and most of the intricate details of converting V8 types to C++ types and back are taken care of auto-magically. In most cases there's no need to use the raw V8 API to implement an API binding.

For example, here's an API binding that doesn't use native-mate:

// static
void Shell::OpenItem(const v8::FunctionCallbackInfo<v8::Value>& args) {
  base::FilePath file_path;
  if (!FromV8Arguments(args, &file_path))
    return node::ThrowTypeError("Bad argument");

  platform_util::OpenItem(file_path);
}

// static
void Shell::Initialize(v8::Handle<v8::Object> target) {
  NODE_SET_METHOD(target, "openItem", OpenItem);
}

And here's the same API binding using native-mate:

void Initialize(v8::Handle<v8::Object> exports) {
  mate::Dictionary dict(v8::Isolate::GetCurrent(), exports);
  dict.SetMethod("openItem", &platform_util::OpenItem);
}

Code Structure

  • converter.h - Templatized JS<->C++ conversion routines for many common C++ types. You can define your own by specializing Converter.
  • function_template.h - Create JavaScript functions that dispatch to any C++ function, member function pointer, or base::Callback.
  • object_template_builder.h - A handy utility for creation of v8::ObjectTemplate.
  • wrappable.h - Base class for C++ classes that want to be owned by the V8 GC. Wrappable objects are automatically deleted when GC discovers that nothing in the V8 heap refers to them. This is also an easy way to expose C++ objects to JavaScript.