| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * This file is part of Adblock Plus <https://adblockplus.org/>, | |
| 3 * Copyright (C) 2006-present eyeo GmbH | |
| 4 * | |
| 5 * Adblock Plus is free software: you can redistribute it and/or modify | |
| 6 * it under the terms of the GNU General Public License version 3 as | |
| 7 * published by the Free Software Foundation. | |
| 8 * | |
| 9 * Adblock Plus is distributed in the hope that it will be useful, | |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 12 * GNU General Public License for more details. | |
| 13 * | |
| 14 * You should have received a copy of the GNU General Public License | |
| 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | |
| 16 */ | |
| 17 | |
| 18 #include <AdblockPlus.h> | |
| 19 #include "Utils.h" | |
| 20 #include "JniCallbacks.h" | |
| 21 | |
| 22 static AdblockPlus::JsEngine& GetJsEngineRef(jlong ptr) | |
| 23 { | |
| 24 return *JniLongToTypePtr<AdblockPlus::JsEngine>(ptr); | |
| 25 } | |
| 26 | |
| 27 static void JNICALL JniSetEventCallback(JNIEnv* env, jclass clazz, jlong ptr, js
tring jEventName, jlong jCallbackPtr) | |
| 28 { | |
| 29 AdblockPlus::JsEngine& engine = GetJsEngineRef(ptr); | |
| 30 | |
| 31 JniEventCallback* callback = JniLongToTypePtr<JniEventCallback>(jCallbackPtr); | |
| 32 std::string eventName = JniJavaToStdString(env, jEventName); | |
| 33 | |
| 34 auto eCallback = [callback](AdblockPlus::JsValueList&& params) | |
| 35 { | |
| 36 callback->Callback(std::move(params)); | |
| 37 }; | |
| 38 | |
| 39 try | |
| 40 { | |
| 41 engine.SetEventCallback(eventName, eCallback); | |
| 42 } | |
| 43 CATCH_AND_THROW(env) | |
| 44 } | |
| 45 | |
| 46 static void JNICALL JniRemoveEventCallback(JNIEnv* env, jclass clazz, jlong ptr,
jstring jEventName) | |
| 47 { | |
| 48 AdblockPlus::JsEngine& engine = GetJsEngineRef(ptr); | |
| 49 | |
| 50 std::string eventName = JniJavaToStdString(env, jEventName); | |
| 51 | |
| 52 try | |
| 53 { | |
| 54 engine.RemoveEventCallback(eventName); | |
| 55 } | |
| 56 CATCH_AND_THROW(env) | |
| 57 } | |
| 58 | |
| 59 static jobject JNICALL JniEvaluate(JNIEnv* env, jclass clazz, jlong ptr, jstring
jSource, jstring jFilename) | |
| 60 { | |
| 61 AdblockPlus::JsEngine& engine = GetJsEngineRef(ptr); | |
| 62 | |
| 63 std::string source = JniJavaToStdString(env, jSource); | |
| 64 std::string filename = JniJavaToStdString(env, jFilename); | |
| 65 | |
| 66 try | |
| 67 { | |
| 68 return NewJniJsValue(env, engine.Evaluate(source, filename)); | |
| 69 } | |
| 70 CATCH_THROW_AND_RETURN(env, 0) | |
| 71 } | |
| 72 | |
| 73 static void JNICALL JniTriggerEvent(JNIEnv* env, jclass clazz, jlong ptr, jstrin
g jEventName, jarray jJsPtrs) | |
| 74 { | |
| 75 AdblockPlus::JsEngine& engine = GetJsEngineRef(ptr); | |
| 76 std::string eventName = JniJavaToStdString(env, jEventName); | |
| 77 AdblockPlus::JsValueList args; | |
| 78 | |
| 79 if (jJsPtrs) | |
| 80 { | |
| 81 jlong* ptrs = (jlong*)env->GetPrimitiveArrayCritical(jJsPtrs, 0); | |
| 82 | |
| 83 jsize length = env->GetArrayLength(jJsPtrs); | |
| 84 | |
| 85 for (jsize i = 0; i < length; i++) | |
| 86 { | |
| 87 args.push_back(JniGetJsValue(ptrs[i])); | |
| 88 } | |
| 89 | |
| 90 env->ReleasePrimitiveArrayCritical(jJsPtrs, ptrs, JNI_ABORT); | |
| 91 } | |
| 92 | |
| 93 try | |
| 94 { | |
| 95 engine.TriggerEvent(eventName, std::move(args)); | |
| 96 } | |
| 97 CATCH_AND_THROW(env) | |
| 98 } | |
| 99 | |
| 100 static jobject JNICALL JniNewLongValue(JNIEnv* env, jclass clazz, jlong ptr, jlo
ng value) | |
| 101 { | |
| 102 AdblockPlus::JsEngine& engine = GetJsEngineRef(ptr); | |
| 103 | |
| 104 try | |
| 105 { | |
| 106 return NewJniJsValue(env, engine.NewValue(static_cast<int64_t>(value))); | |
| 107 } | |
| 108 CATCH_THROW_AND_RETURN(env, 0) | |
| 109 } | |
| 110 | |
| 111 static jobject JNICALL JniNewBooleanValue(JNIEnv* env, jclass clazz, jlong ptr,
jboolean value) | |
| 112 { | |
| 113 AdblockPlus::JsEngine& engine = GetJsEngineRef(ptr); | |
| 114 | |
| 115 try | |
| 116 { | |
| 117 return NewJniJsValue(env, engine.NewValue(value == JNI_TRUE ? true : false))
; | |
| 118 } | |
| 119 CATCH_THROW_AND_RETURN(env, 0) | |
| 120 } | |
| 121 | |
| 122 static jobject JNICALL JniNewStringValue(JNIEnv* env, jclass clazz, jlong ptr, j
string value) | |
| 123 { | |
| 124 AdblockPlus::JsEngine& engine = GetJsEngineRef(ptr); | |
| 125 | |
| 126 try | |
| 127 { | |
| 128 std::string strValue = JniJavaToStdString(env, value); | |
| 129 return NewJniJsValue(env, engine.NewValue(strValue)); | |
| 130 } | |
| 131 CATCH_THROW_AND_RETURN(env, 0) | |
| 132 } | |
| 133 | |
| 134 // TODO: List of functions that lack JNI bindings | |
| 135 //JsValuePtr NewObject(); | |
| 136 //JsValuePtr NewCallback(v8::InvocationCallback callback); | |
| 137 //static JsEnginePtr FromArguments(const v8::Arguments& arguments); | |
| 138 //JsValueList ConvertArguments(const v8::Arguments& arguments); | |
| 139 | |
| 140 static JNINativeMethod methods[] = | |
| 141 { | |
| 142 { (char*)"setEventCallback", (char*)"(JLjava/lang/String;J)V", (void*)JniSetEv
entCallback }, | |
| 143 { (char*)"removeEventCallback", (char*)"(JLjava/lang/String;)V", (void*)JniRem
oveEventCallback }, | |
| 144 { (char*)"triggerEvent", (char*)"(JLjava/lang/String;[J)V", (void*)JniTriggerE
vent }, | |
| 145 | |
| 146 { (char*)"evaluate", (char*)"(JLjava/lang/String;Ljava/lang/String;)" TYP("JsV
alue"), (void*)JniEvaluate }, | |
| 147 | |
| 148 { (char*)"newValue", (char*)"(JJ)" TYP("JsValue"), (void*)JniNewLongValue }, | |
| 149 { (char*)"newValue", (char*)"(JZ)" TYP("JsValue"), (void*)JniNewBooleanValue }
, | |
| 150 { (char*)"newValue", (char*)"(JLjava/lang/String;)" TYP("JsValue"), (void*)Jni
NewStringValue } | |
| 151 }; | |
| 152 | |
| 153 extern "C" JNIEXPORT void JNICALL Java_org_adblockplus_libadblockplus_JsEngine_r
egisterNatives(JNIEnv *env, jclass clazz) | |
| 154 { | |
| 155 env->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(methods[0])); | |
| 156 } | |
| OLD | NEW |