// Copyright 2013 The Flutter 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 FLUTTER_TESTING_TEST_DART_NATIVE_RESOLVER_H_ #define FLUTTER_TESTING_TEST_DART_NATIVE_RESOLVER_H_ #include #include #include #include "flutter/fml/macros.h" #include "third_party/dart/runtime/include/dart_api.h" #define CREATE_NATIVE_ENTRY(native_entry) \ ([&]() { \ static ::flutter::testing::NativeEntry closure; \ static Dart_NativeFunction entrypoint = [](Dart_NativeArguments args) { \ closure(args); \ }; \ closure = (native_entry); \ return entrypoint; \ })() namespace flutter { namespace testing { using NativeEntry = std::function; class TestDartNativeResolver : public std::enable_shared_from_this { public: TestDartNativeResolver(); ~TestDartNativeResolver(); void AddNativeCallback(std::string name, Dart_NativeFunction callback); void AddFfiNativeCallback(std::string name, void* callback_ptr); void SetNativeResolverForIsolate(); private: std::map native_callbacks_; std::map ffi_native_callbacks_; Dart_NativeFunction ResolveCallback(std::string name) const; void* ResolveFfiCallback(std::string name) const; static Dart_NativeFunction DartNativeEntryResolverCallback( Dart_Handle dart_name, int num_of_arguments, bool* auto_setup_scope); static void* FfiNativeResolver(const char* name, uintptr_t args_n); FML_DISALLOW_COPY_AND_ASSIGN(TestDartNativeResolver); }; } // namespace testing } // namespace flutter #endif // FLUTTER_TESTING_TEST_DART_NATIVE_RESOLVER_H_