Refactor interfaces
Reviewed By: johnislarry Differential Revision: D4844786 fbshipit-source-id: f348b8d5078643636343f6ea099b200f519fbc40
This commit is contained in:
parent
2d4ca8bd80
commit
ac74d2a38b
|
@ -1,6 +1,7 @@
|
|||
// Copyright 2004-present Facebook. All Rights Reserved.
|
||||
|
||||
#include "JInspector.h"
|
||||
#include <jschelpers/JavaScriptCore.h>
|
||||
|
||||
#ifdef WITH_INSPECTOR
|
||||
|
||||
|
@ -9,16 +10,16 @@ namespace react {
|
|||
|
||||
namespace {
|
||||
|
||||
class RemoteConnection : public Inspector::RemoteConnection {
|
||||
class RemoteConnection : public IRemoteConnection {
|
||||
public:
|
||||
RemoteConnection(jni::alias_ref<JRemoteConnection::javaobject> connection)
|
||||
: connection_(jni::make_global(connection)) {}
|
||||
|
||||
void onMessage(std::string message) override {
|
||||
virtual void onMessage(std::string message) override {
|
||||
connection_->onMessage(message);
|
||||
}
|
||||
|
||||
void onDisconnect() override {
|
||||
virtual void onDisconnect() override {
|
||||
connection_->onDisconnect();
|
||||
}
|
||||
private:
|
||||
|
@ -42,7 +43,7 @@ void JRemoteConnection::onDisconnect() const {
|
|||
method(self());
|
||||
}
|
||||
|
||||
JLocalConnection::JLocalConnection(std::unique_ptr<Inspector::LocalConnection> connection)
|
||||
JLocalConnection::JLocalConnection(std::unique_ptr<ILocalConnection> connection)
|
||||
: connection_(std::move(connection)) {}
|
||||
|
||||
void JLocalConnection::sendMessage(std::string message) {
|
||||
|
@ -60,13 +61,17 @@ void JLocalConnection::registerNatives() {
|
|||
});
|
||||
}
|
||||
|
||||
static IInspector* getInspectorInstance() {
|
||||
return JSC_JSInspectorGetInstance(true /*useCustomJSC*/);
|
||||
}
|
||||
|
||||
jni::global_ref<JInspector::javaobject> JInspector::instance(jni::alias_ref<jclass>) {
|
||||
static auto instance = jni::make_global(newObjectCxxArgs(&Inspector::instance()));
|
||||
static auto instance = jni::make_global(newObjectCxxArgs(getInspectorInstance()/*&Inspector::instance()*/));
|
||||
return instance;
|
||||
}
|
||||
|
||||
jni::local_ref<jni::JArrayClass<JPage::javaobject>> JInspector::getPages() {
|
||||
std::vector<Inspector::Page> pages = inspector_->getPages();
|
||||
std::vector<InspectorPage> pages = inspector_->getPages();
|
||||
auto array = jni::JArrayClass<JPage::javaobject>::newArray(pages.size());
|
||||
for (size_t i = 0; i < pages.size(); i++) {
|
||||
(*array)[i] = JPage::create(pages[i].id, pages[i].title);
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
#ifdef WITH_INSPECTOR
|
||||
|
||||
#include <inspector/Inspector.h>
|
||||
#include <jschelpers/InspectorInterfaces.h>
|
||||
|
||||
#include <fb/fbjni.h>
|
||||
#include <folly/Memory.h>
|
||||
|
@ -31,14 +31,14 @@ class JLocalConnection : public jni::HybridClass<JLocalConnection> {
|
|||
public:
|
||||
static constexpr auto kJavaDescriptor = "Lcom/facebook/react/bridge/Inspector$LocalConnection;";
|
||||
|
||||
JLocalConnection(std::unique_ptr<Inspector::LocalConnection> connection);
|
||||
JLocalConnection(std::unique_ptr<ILocalConnection> connection);
|
||||
|
||||
void sendMessage(std::string message);
|
||||
void disconnect();
|
||||
|
||||
static void registerNatives();
|
||||
private:
|
||||
std::unique_ptr<Inspector::LocalConnection> connection_;
|
||||
std::unique_ptr<ILocalConnection> connection_;
|
||||
};
|
||||
|
||||
class JInspector : public jni::HybridClass<JInspector> {
|
||||
|
@ -54,9 +54,9 @@ public:
|
|||
private:
|
||||
friend HybridBase;
|
||||
|
||||
JInspector(Inspector* inspector) : inspector_(inspector) {}
|
||||
JInspector(IInspector* inspector) : inspector_(inspector) {}
|
||||
|
||||
Inspector* inspector_;
|
||||
IInspector* inspector_;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ CXX_LIBRARY_COMPILER_FLAGS = []
|
|||
REACT_LIBRARY_EXTRA_COMPILER_FLAGS = []
|
||||
|
||||
if THIS_IS_FBOBJC:
|
||||
include_defs("xplat//configurations/buck/apple/dependency_aggregator_defs")
|
||||
inherited_buck_flags = STATIC_LIBRARY_IOS_FLAGS
|
||||
CXX_LIBRARY_COMPILER_FLAGS = inherited_buck_flags.get_flag_value('compiler_flags')
|
||||
REACT_LIBRARY_EXTRA_COMPILER_FLAGS = ['-Wno-shadow', '-Wno-missing-prototypes', '-Wno-global-constructors']
|
||||
|
@ -62,6 +63,12 @@ if THIS_IS_FBANDROID:
|
|||
)
|
||||
|
||||
if THIS_IS_FBOBJC:
|
||||
|
||||
if should_use_dependency_aggregation():
|
||||
INSPECTOR_FLAGS = []
|
||||
else:
|
||||
INSPECTOR_FLAGS = [ '-DWITH_INSPECTOR=1', ]
|
||||
|
||||
def react_library(**kwargs):
|
||||
fb_apple_library(
|
||||
name = 'bridge',
|
||||
|
@ -75,7 +82,7 @@ if THIS_IS_FBOBJC:
|
|||
],
|
||||
**kwargs_add(
|
||||
kwargs,
|
||||
preprocessor_flags = DEBUG_PREPROCESSOR_FLAGS,
|
||||
preprocessor_flags = DEBUG_PREPROCESSOR_FLAGS + INSPECTOR_FLAGS,
|
||||
deps = [
|
||||
'//xplat/folly:molly',
|
||||
],
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#include <jschelpers/Value.h>
|
||||
|
||||
#ifdef WITH_INSPECTOR
|
||||
#include <inspector/Inspector.h>
|
||||
#include <jschelpers/InspectorInterfaces.h>
|
||||
#endif
|
||||
|
||||
#include "JSBundleType.h"
|
||||
|
@ -171,6 +171,16 @@ void JSCExecutor::setContextName(const std::string& name) {
|
|||
JSC_JSGlobalContextSetName(m_context, jsName);
|
||||
}
|
||||
|
||||
#ifdef WITH_INSPECTOR
|
||||
static bool canUseInspector(JSContextRef context) {
|
||||
#if defined(__APPLE__)
|
||||
return isCustomJSCPtr(context); // WITH_INSPECTOR && Apple
|
||||
#else
|
||||
return true; // WITH_INSPECTOR && Android
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
void JSCExecutor::initOnJSVMThread() throw(JSException) {
|
||||
SystraceSection s("JSCExecutor.initOnJSVMThread");
|
||||
|
||||
|
@ -204,9 +214,12 @@ void JSCExecutor::initOnJSVMThread() throw(JSException) {
|
|||
// Add a pointer to ourselves so we can retrieve it later in our hooks
|
||||
Object::getGlobalObject(m_context).setPrivate(this);
|
||||
|
||||
#ifdef WITH_INSPECTOR
|
||||
Inspector::instance().registerGlobalContext("main", m_context);
|
||||
#endif
|
||||
#ifdef WITH_INSPECTOR
|
||||
if (canUseInspector(m_context)) {
|
||||
IInspector* pInspector = JSC_JSInspectorGetInstance(true);
|
||||
pInspector->registerGlobalContext("main", m_context);
|
||||
}
|
||||
#endif
|
||||
|
||||
installNativeHook<&JSCExecutor::nativeFlushQueueImmediate>("nativeFlushQueueImmediate");
|
||||
installNativeHook<&JSCExecutor::nativeCallSyncHook>("nativeCallSyncHook");
|
||||
|
@ -247,9 +260,12 @@ void JSCExecutor::initOnJSVMThread() throw(JSException) {
|
|||
void JSCExecutor::terminateOnJSVMThread() {
|
||||
m_nativeModules.reset();
|
||||
|
||||
#ifdef WITH_INSPECTOR
|
||||
Inspector::instance().unregisterGlobalContext(m_context);
|
||||
#endif
|
||||
#ifdef WITH_INSPECTOR
|
||||
if (canUseInspector(m_context)) {
|
||||
IInspector* pInspector = JSC_JSInspectorGetInstance(true);
|
||||
pInspector->unregisterGlobalContext(m_context);
|
||||
}
|
||||
#endif
|
||||
|
||||
JSC_JSGlobalContextRelease(m_context);
|
||||
m_context = nullptr;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
EXPORTED_HEADERS = [
|
||||
"InspectorInterfaces.h",
|
||||
"JavaScriptCore.h",
|
||||
"JSCHelpers.h",
|
||||
"JSCWrapper.h",
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
/**
|
||||
* Copyright (c) 2016-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <JavaScriptCore/JSBase.h>
|
||||
|
||||
namespace facebook {
|
||||
namespace react {
|
||||
|
||||
class IDestructible {
|
||||
public:
|
||||
virtual ~IDestructible() = 0;
|
||||
};
|
||||
|
||||
struct InspectorPage {
|
||||
const int id;
|
||||
const std::string title;
|
||||
};
|
||||
|
||||
class IRemoteConnection : public IDestructible {
|
||||
public:
|
||||
virtual ~IRemoteConnection() = 0;
|
||||
virtual void onMessage(std::string message) = 0;
|
||||
virtual void onDisconnect() = 0;
|
||||
};
|
||||
|
||||
class ILocalConnection : public IDestructible {
|
||||
public:
|
||||
virtual ~ILocalConnection() = 0;
|
||||
virtual void sendMessage(std::string message) = 0;
|
||||
virtual void disconnect() = 0;
|
||||
};
|
||||
|
||||
// Note: not destructible!
|
||||
class IInspector {
|
||||
public:
|
||||
virtual void registerGlobalContext(std::string title, JSGlobalContextRef ctx) = 0;
|
||||
virtual void unregisterGlobalContext(JSGlobalContextRef ctx) = 0;
|
||||
|
||||
virtual std::vector<InspectorPage> getPages() const = 0;
|
||||
virtual std::unique_ptr<ILocalConnection> connect(int pageId, std::unique_ptr<IRemoteConnection> remote) = 0;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
|
@ -9,25 +9,40 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <JavaScriptCore/JavaScript.h>
|
||||
|
||||
#if WITH_FBJSCEXTENSIONS
|
||||
#include <jsc_stringref.h>
|
||||
#endif
|
||||
|
||||
#if defined(JSCINTERNAL) || (!defined(__APPLE__))
|
||||
#define JSC_IMPORT extern "C"
|
||||
#else
|
||||
#define JSC_IMPORT extern
|
||||
#endif
|
||||
|
||||
namespace facebook {
|
||||
namespace react {
|
||||
class IInspector;
|
||||
}
|
||||
}
|
||||
|
||||
JSC_IMPORT facebook::react::IInspector* JSInspectorGetInstance();
|
||||
|
||||
// This is used to substitute an alternate JSC implementation for
|
||||
// testing. These calls must all be ABI compatible with the standard JSC.
|
||||
JSC_IMPORT void configureJSCForIOS(std::string); // TODO: replace with folly::dynamic once supported
|
||||
JSC_IMPORT JSValueRef JSEvaluateBytecodeBundle(JSContextRef, JSObjectRef, int, JSStringRef, JSValueRef*);
|
||||
JSC_IMPORT bool JSSamplingProfilerEnabled();
|
||||
JSC_IMPORT void JSStartSamplingProfilingOnMainJSCThread(JSGlobalContextRef);
|
||||
JSC_IMPORT JSValueRef JSPokeSamplingProfiler(JSContextRef);
|
||||
|
||||
#if defined(__APPLE__)
|
||||
#import <objc/objc.h>
|
||||
#import <JavaScriptCore/JSStringRefCF.h>
|
||||
#import <string>
|
||||
|
||||
// This is used to substitute an alternate JSC implementation for
|
||||
// testing. These calls must all be ABI compatible with the standard JSC.
|
||||
extern void configureJSCForIOS(std::string); // TODO: replace with folly::dynamic once supported
|
||||
extern JSValueRef JSEvaluateBytecodeBundle(JSContextRef, JSObjectRef, int, JSStringRef, JSValueRef*);
|
||||
extern bool JSSamplingProfilerEnabled();
|
||||
extern void JSStartSamplingProfilingOnMainJSCThread(JSGlobalContextRef);
|
||||
extern JSValueRef JSPokeSamplingProfiler(JSContextRef);
|
||||
|
||||
/**
|
||||
* JSNoBytecodeFileFormatVersion
|
||||
*
|
||||
|
@ -114,6 +129,8 @@ struct JSCWrapper {
|
|||
JSC_WRAPPER_METHOD(JSPokeSamplingProfiler);
|
||||
JSC_WRAPPER_METHOD(JSStartSamplingProfilingOnMainJSCThread);
|
||||
|
||||
JSC_WRAPPER_METHOD(JSInspectorGetInstance);
|
||||
|
||||
JSC_WRAPPER_METHOD(configureJSCForIOS);
|
||||
|
||||
// Objective-C API
|
||||
|
|
|
@ -182,6 +182,10 @@ jsc_poison(JSObjectMakeArrayBufferWithBytesNoCopy JSObjectMakeTypedArray
|
|||
jsc_poison(JSSamplingProfilerEnabled JSPokeSamplingProfiler
|
||||
JSStartSamplingProfilingOnMainJSCThread)
|
||||
|
||||
#define JSC_JSInspectorGetInstance(...) __jsc_bool_wrapper(JSInspectorGetInstance, __VA_ARGS__)
|
||||
jsc_poison(JSInspectorGetInstance)
|
||||
|
||||
|
||||
#define JSC_configureJSCForIOS(...) __jsc_bool_wrapper(configureJSCForIOS, __VA_ARGS__)
|
||||
|
||||
jsc_poison(configureJSCForIOS)
|
||||
|
|
|
@ -28,6 +28,9 @@ UNIMPLEMENTED_SYSTEM_JSC_FUNCTION(JSStringCreateWithUTF8CStringExpectAscii)
|
|||
#endif
|
||||
UNIMPLEMENTED_SYSTEM_JSC_FUNCTION(JSPokeSamplingProfiler)
|
||||
UNIMPLEMENTED_SYSTEM_JSC_FUNCTION(JSStartSamplingProfilingOnMainJSCThread)
|
||||
|
||||
UNIMPLEMENTED_SYSTEM_JSC_FUNCTION(JSInspectorGetInstance)
|
||||
|
||||
UNIMPLEMENTED_SYSTEM_JSC_FUNCTION(configureJSCForIOS)
|
||||
|
||||
bool JSSamplingProfilerEnabled() {
|
||||
|
@ -119,6 +122,10 @@ const JSCWrapper* systemJSCWrapper() {
|
|||
(decltype(&JSStartSamplingProfilingOnMainJSCThread))
|
||||
Unimplemented_JSStartSamplingProfilingOnMainJSCThread,
|
||||
|
||||
.JSInspectorGetInstance =
|
||||
(decltype(&JSInspectorGetInstance))
|
||||
Unimplemented_JSInspectorGetInstance,
|
||||
|
||||
.configureJSCForIOS =
|
||||
(decltype(&configureJSCForIOS))Unimplemented_configureJSCForIOS,
|
||||
|
||||
|
|
Loading…
Reference in New Issue