electron/native_mate
Samuel Attard 0090616f7b
feat: add a new contextBridge module (#20307)
* feat: add a new contextBridge module

* chore: fix docs linting

* feat: add support for function arguments being proxied

* chore: ensure that contextBridge can only be used when contextIsolation is enabled

* docs: getReverseBinding can be null

* docs: fix broken links in md file

* feat: add support for promises in function parameters

* fix: linting failure for explicit constructor

* Update atom_api_context_bridge.cc

* chore: update docs and API design as per feedback

* refactor: remove reverse bindings and handle GC'able functions across the bridge

* chore: only expose debugGC in testing builds

* fix: do not proxy promises as objects

* spec: add complete spec coverage for contextBridge

* spec: add tests for null/undefined and the anti-overwrite logic

* chore: fix linting

* spec: add complex nested back-and-forth function calling

* fix: expose contextBridge in sandboxed renderers

* refactor: improve security of default_app using the new contextBridge module

* s/bindAPIInMainWorld/exposeInMainWorld

* chore: sorry for this commit, its a big one, I fixed like everything and refactored a lot

* chore: remove PassedValueCache as it is unused now

Values transferred from context A to context B are now cachde in the RenderFramePersistenceStore

* chore: move to anonymous namespace

* refactor: remove PassValueToOtherContextWithCache

* chore: remove commented unused code blocks

* chore: remove .only

* chore: remote commented code

* refactor: extract RenderFramePersistenceStore

* spec: ensure it works with numbered keys

* fix: handle number keys correctly

* fix: sort out the linter

* spec: update default_app asar spec for removed file

* refactor: change signatures to return v8 objects directly rather than the mate dictionary handle

* refactor: use the v8 serializer to support cloneable buffers and other object types

* chore: fix linting

* fix: handle hash collisions with a linked list in the map

* fix: enforce a recursion limit on the context bridge

* chore: fix linting

* chore: remove TODO

* chore: adapt for PR feedback

* chore: remove .only

* chore: clean up docs and clean up the proxy map when objects are released

* chore: ensure we cache object values that are cloned through the V8 serializer
2019-10-18 12:57:09 -07:00
..
native_mate feat: add a new contextBridge module (#20307) 2019-10-18 12:57:09 -07:00
BUILD.gn chore: remove native_mate (Part 7) (#20561) 2019-10-15 10:15:23 +09:00
LICENSE.chromium prepare for merging to electron 2018-06-22 11:29:57 +10:00
README.md chore: remove native_mate (Part 5) (#20264) 2019-09-19 08:09:15 -07: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_deprecated.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.