| OLD | NEW |
| 1 /* | 1 /* |
| 2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
| 3 * Copyright (C) 2006-present eyeo GmbH | 3 * Copyright (C) 2006-present eyeo GmbH |
| 4 * | 4 * |
| 5 * Adblock Plus is free software: you can redistribute it and/or modify | 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 | 6 * it under the terms of the GNU General Public License version 3 as |
| 7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
| 8 * | 8 * |
| 9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 v8::Isolate* isolate = arguments.GetIsolate(); | 40 v8::Isolate* isolate = arguments.GetIsolate(); |
| 41 if (converted.size() != 2) | 41 if (converted.size() != 2) |
| 42 return ThrowExceptionInJS(isolate, "_fileSystem.read requires 2 parameters
"); | 42 return ThrowExceptionInJS(isolate, "_fileSystem.read requires 2 parameters
"); |
| 43 if (!converted[1].IsFunction()) | 43 if (!converted[1].IsFunction()) |
| 44 return ThrowExceptionInJS(isolate, "Second argument to _fileSystem.read mu
st be a function"); | 44 return ThrowExceptionInJS(isolate, "Second argument to _fileSystem.read mu
st be a function"); |
| 45 | 45 |
| 46 JsValueList values; | 46 JsValueList values; |
| 47 values.push_back(converted[1]); | 47 values.push_back(converted[1]); |
| 48 auto weakCallback = jsEngine->StoreJsValues(values); | 48 auto weakCallback = jsEngine->StoreJsValues(values); |
| 49 std::weak_ptr<JsEngine> weakJsEngine = jsEngine; | 49 std::weak_ptr<JsEngine> weakJsEngine = jsEngine; |
| 50 jsEngine->GetPlatform().GetFileSystem().Read(converted[0].AsString(), | 50 auto fileName = converted[0].AsString(); |
| 51 [weakJsEngine, weakCallback] | 51 jsEngine->GetPlatform().WithFileSystem( |
| 52 (IFileSystem::IOBuffer&& content, const std::string& error) | 52 [weakJsEngine, weakCallback, fileName](IFileSystem& fileSystem) |
| 53 { | 53 { |
| 54 auto jsEngine = weakJsEngine.lock(); | 54 fileSystem.Read(fileName, |
| 55 if (!jsEngine) | 55 [weakJsEngine, weakCallback] |
| 56 return; | 56 (IFileSystem::IOBuffer&& content, const std::string& error) |
| 57 { |
| 58 auto jsEngine = weakJsEngine.lock(); |
| 59 if (!jsEngine) |
| 60 return; |
| 57 | 61 |
| 58 const JsContext context(*jsEngine); | 62 const JsContext context(*jsEngine); |
| 59 auto result = jsEngine->NewObject(); | 63 auto result = jsEngine->NewObject(); |
| 60 result.SetStringBufferProperty("content", std::move(content)); | 64 result.SetStringBufferProperty("content", std::move(content)); |
| 61 if (!error.empty()) | 65 if (!error.empty()) |
| 62 result.SetProperty("error", error); | 66 result.SetProperty("error", error); |
| 63 jsEngine->TakeJsValues(weakCallback)[0].Call(result); | 67 jsEngine->TakeJsValues(weakCallback)[0].Call(result); |
| 68 }); |
| 64 }); | 69 }); |
| 65 } | 70 } |
| 66 | 71 |
| 67 inline bool IsEndOfLine(char c) | 72 inline bool IsEndOfLine(char c) |
| 68 { | 73 { |
| 69 return c == 10 || c == 13; | 74 return c == 10 || c == 13; |
| 70 } | 75 } |
| 71 | 76 |
| 72 inline StringBuffer::const_iterator SkipEndOfLine(StringBuffer::const_iterator
ii, StringBuffer::const_iterator end) | 77 inline StringBuffer::const_iterator SkipEndOfLine(StringBuffer::const_iterator
ii, StringBuffer::const_iterator end) |
| 73 { | 78 { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 94 if (!converted[1].IsFunction()) | 99 if (!converted[1].IsFunction()) |
| 95 return ThrowExceptionInJS(isolate, "Second argument to _fileSystem.readFro
mFile must be a function (listener callback)"); | 100 return ThrowExceptionInJS(isolate, "Second argument to _fileSystem.readFro
mFile must be a function (listener callback)"); |
| 96 if (!converted[2].IsFunction()) | 101 if (!converted[2].IsFunction()) |
| 97 return ThrowExceptionInJS(isolate, "Third argument to _fileSystem.readFrom
File must be a function (done callback)"); | 102 return ThrowExceptionInJS(isolate, "Third argument to _fileSystem.readFrom
File must be a function (done callback)"); |
| 98 | 103 |
| 99 JsValueList values; | 104 JsValueList values; |
| 100 values.push_back(converted[1]); | 105 values.push_back(converted[1]); |
| 101 values.push_back(converted[2]); | 106 values.push_back(converted[2]); |
| 102 auto weakCallback = jsEngine->StoreJsValues(values); | 107 auto weakCallback = jsEngine->StoreJsValues(values); |
| 103 std::weak_ptr<JsEngine> weakJsEngine = jsEngine; | 108 std::weak_ptr<JsEngine> weakJsEngine = jsEngine; |
| 104 jsEngine->GetPlatform().GetFileSystem().Read(converted[0].AsString(), | 109 auto fileName = converted[0].AsString(); |
| 105 [weakJsEngine, weakCallback] | 110 jsEngine->GetPlatform().WithFileSystem( |
| 106 (IFileSystem::IOBuffer&& content, const std::string& error) | 111 [weakJsEngine, weakCallback, fileName](IFileSystem& fileSystem) |
| 107 { | 112 { |
| 108 auto jsEngine = weakJsEngine.lock(); | 113 fileSystem.Read(fileName, |
| 109 if (!jsEngine) | 114 [weakJsEngine, weakCallback] |
| 110 return; | 115 (IFileSystem::IOBuffer&& content, const std::string& error) |
| 116 { |
| 117 auto jsEngine = weakJsEngine.lock(); |
| 118 if (!jsEngine) |
| 119 return; |
| 111 | 120 |
| 112 const JsContext context(*jsEngine); | 121 const JsContext context(*jsEngine); |
| 113 | 122 |
| 114 auto jsValues = jsEngine->TakeJsValues(weakCallback); | 123 auto jsValues = jsEngine->TakeJsValues(weakCallback); |
| 115 if (!error.empty()) | 124 if (!error.empty()) |
| 116 { | 125 { |
| 117 jsValues[1].Call(jsEngine->NewValue(error)); | 126 jsValues[1].Call(jsEngine->NewValue(error)); |
| 118 return; | 127 return; |
| 119 } | 128 } |
| 120 | 129 |
| 121 auto processFunc = jsValues[0].UnwrapValue().As<v8::Function>(); | 130 auto processFunc = jsValues[0].UnwrapValue().As<v8::Function>(); |
| 122 | 131 |
| 123 auto globalContext = context.GetV8Context()->Global(); | 132 auto globalContext = context.GetV8Context()->Global(); |
| 124 if (!globalContext->IsObject()) | 133 if (!globalContext->IsObject()) |
| 125 throw std::runtime_error("`this` pointer has to be an object"); | 134 throw std::runtime_error("`this` pointer has to be an object"); |
| 126 | 135 |
| 127 const v8::TryCatch tryCatch; | 136 const v8::TryCatch tryCatch; |
| 128 | 137 |
| 129 const auto contentEnd = content.cend(); | 138 const auto contentEnd = content.cend(); |
| 130 auto stringBegin = SkipEndOfLine(content.begin(), contentEnd); | 139 auto stringBegin = SkipEndOfLine(content.begin(), contentEnd); |
| 131 do | 140 do |
| 132 { | 141 { |
| 133 auto stringEnd = AdvanceToEndOfLine(stringBegin, contentEnd); | 142 auto stringEnd = AdvanceToEndOfLine(stringBegin, contentEnd); |
| 134 auto jsLine = Utils::StringBufferToV8String(jsEngine->GetIsolate(), Stri
ngBuffer(stringBegin, stringEnd)).As<v8::Value>(); | 143 auto jsLine = Utils::StringBufferToV8String(jsEngine->GetIsolate()
, StringBuffer(stringBegin, stringEnd)).As<v8::Value>(); |
| 135 processFunc->Call(globalContext, 1, &jsLine); | 144 processFunc->Call(globalContext, 1, &jsLine); |
| 136 if (tryCatch.HasCaught()) | 145 if (tryCatch.HasCaught()) |
| 137 { | 146 { |
| 138 jsValues[1].Call(jsEngine->NewValue(JsError::ExceptionToString(tryCatc
h.Exception(), tryCatch.Message()))); | 147 jsValues[1].Call(jsEngine->NewValue(JsError::ExceptionToString(t
ryCatch.Exception(), tryCatch.Message()))); |
| 139 return; | 148 return; |
| 140 } | 149 } |
| 141 stringBegin = SkipEndOfLine(stringEnd, contentEnd); | 150 stringBegin = SkipEndOfLine(stringEnd, contentEnd); |
| 142 } while (stringBegin != contentEnd); | 151 } while (stringBegin != contentEnd); |
| 143 jsValues[1].Call(); | 152 jsValues[1].Call(); |
| 144 }); | 153 }); |
| 154 }); |
| 145 } | 155 } |
| 146 | 156 |
| 147 void WriteCallback(const v8::FunctionCallbackInfo<v8::Value>& arguments) | 157 void WriteCallback(const v8::FunctionCallbackInfo<v8::Value>& arguments) |
| 148 { | 158 { |
| 149 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(arg
uments); | 159 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(arg
uments); |
| 150 AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments); | 160 AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments); |
| 151 | 161 |
| 152 v8::Isolate* isolate = arguments.GetIsolate(); | 162 v8::Isolate* isolate = arguments.GetIsolate(); |
| 153 if (converted.size() != 3) | 163 if (converted.size() != 3) |
| 154 return ThrowExceptionInJS(isolate, "_fileSystem.write requires 3 parameter
s"); | 164 return ThrowExceptionInJS(isolate, "_fileSystem.write requires 3 parameter
s"); |
| 155 if (!converted[2].IsFunction()) | 165 if (!converted[2].IsFunction()) |
| 156 return ThrowExceptionInJS(isolate, "Third argument to _fileSystem.write mu
st be a function"); | 166 return ThrowExceptionInJS(isolate, "Third argument to _fileSystem.write mu
st be a function"); |
| 157 | 167 |
| 158 JsValueList values; | 168 JsValueList values; |
| 159 values.push_back(converted[2]); | 169 values.push_back(converted[2]); |
| 160 auto weakCallback = jsEngine->StoreJsValues(values); | 170 auto weakCallback = jsEngine->StoreJsValues(values); |
| 161 std::weak_ptr<JsEngine> weakJsEngine = jsEngine; | 171 std::weak_ptr<JsEngine> weakJsEngine = jsEngine; |
| 162 auto content = converted[1].AsStringBuffer(); | 172 auto content = converted[1].AsStringBuffer(); |
| 163 jsEngine->GetPlatform().GetFileSystem().Write(converted[0].AsString(), | 173 auto fileName = converted[0].AsString(); |
| 164 content, | 174 jsEngine->GetPlatform().WithFileSystem( |
| 165 [weakJsEngine, weakCallback](const std::string& error) | 175 [weakJsEngine, weakCallback, fileName, content](IFileSystem& fileSystem) |
| 166 { | 176 { |
| 167 auto jsEngine = weakJsEngine.lock(); | 177 fileSystem.Write(fileName, content, |
| 168 if (!jsEngine) | 178 [weakJsEngine, weakCallback](const std::string& error) |
| 169 return; | 179 { |
| 180 auto jsEngine = weakJsEngine.lock(); |
| 181 if (!jsEngine) |
| 182 return; |
| 170 | 183 |
| 171 const JsContext context(*jsEngine); | 184 const JsContext context(*jsEngine); |
| 172 JsValueList params; | 185 JsValueList params; |
| 173 if (!error.empty()) | 186 if (!error.empty()) |
| 174 params.push_back(jsEngine->NewValue(error)); | 187 params.push_back(jsEngine->NewValue(error)); |
| 175 jsEngine->TakeJsValues(weakCallback)[0].Call(params); | 188 jsEngine->TakeJsValues(weakCallback)[0].Call(params); |
| 189 }); |
| 176 }); | 190 }); |
| 177 } | 191 } |
| 178 | 192 |
| 179 void MoveCallback(const v8::FunctionCallbackInfo<v8::Value>& arguments) | 193 void MoveCallback(const v8::FunctionCallbackInfo<v8::Value>& arguments) |
| 180 { | 194 { |
| 181 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(arg
uments); | 195 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(arg
uments); |
| 182 AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments); | 196 AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments); |
| 183 | 197 |
| 184 v8::Isolate* isolate = arguments.GetIsolate(); | 198 v8::Isolate* isolate = arguments.GetIsolate(); |
| 185 if (converted.size() != 3) | 199 if (converted.size() != 3) |
| 186 return ThrowExceptionInJS(isolate, "_fileSystem.move requires 3 parameters
"); | 200 return ThrowExceptionInJS(isolate, "_fileSystem.move requires 3 parameters
"); |
| 187 if (!converted[2].IsFunction()) | 201 if (!converted[2].IsFunction()) |
| 188 return ThrowExceptionInJS(isolate, "Third argument to _fileSystem.move mus
t be a function"); | 202 return ThrowExceptionInJS(isolate, "Third argument to _fileSystem.move mus
t be a function"); |
| 189 | 203 |
| 190 JsValueList values; | 204 JsValueList values; |
| 191 values.push_back(converted[2]); | 205 values.push_back(converted[2]); |
| 192 auto weakCallback = jsEngine->StoreJsValues(values); | 206 auto weakCallback = jsEngine->StoreJsValues(values); |
| 193 std::weak_ptr<JsEngine> weakJsEngine = jsEngine; | 207 std::weak_ptr<JsEngine> weakJsEngine = jsEngine; |
| 194 jsEngine->GetPlatform().GetFileSystem().Move(converted[0].AsString(), | 208 auto from = converted[0].AsString(); |
| 195 converted[1].AsString(), | 209 auto to = converted[1].AsString(); |
| 196 [weakJsEngine, weakCallback](const std::string& error) | 210 jsEngine->GetPlatform().WithFileSystem( |
| 211 [weakJsEngine, weakCallback, from, to](IFileSystem& fileSystem) |
| 197 { | 212 { |
| 198 auto jsEngine = weakJsEngine.lock(); | 213 fileSystem.Move(from, to, |
| 199 if (!jsEngine) | 214 [weakJsEngine, weakCallback](const std::string& error) |
| 200 return; | 215 { |
| 216 auto jsEngine = weakJsEngine.lock(); |
| 217 if (!jsEngine) |
| 218 return; |
| 201 | 219 |
| 202 const JsContext context(*jsEngine); | 220 const JsContext context(*jsEngine); |
| 203 JsValueList params; | 221 JsValueList params; |
| 204 if (!error.empty()) | 222 if (!error.empty()) |
| 205 params.push_back(jsEngine->NewValue(error)); | 223 params.push_back(jsEngine->NewValue(error)); |
| 206 jsEngine->TakeJsValues(weakCallback)[0].Call(params); | 224 jsEngine->TakeJsValues(weakCallback)[0].Call(params); |
| 225 }); |
| 207 }); | 226 }); |
| 208 } | 227 } |
| 209 | 228 |
| 210 void RemoveCallback(const v8::FunctionCallbackInfo<v8::Value>& arguments) | 229 void RemoveCallback(const v8::FunctionCallbackInfo<v8::Value>& arguments) |
| 211 { | 230 { |
| 212 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(arg
uments); | 231 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(arg
uments); |
| 213 AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments); | 232 AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments); |
| 214 | 233 |
| 215 v8::Isolate* isolate = arguments.GetIsolate(); | 234 v8::Isolate* isolate = arguments.GetIsolate(); |
| 216 if (converted.size() != 2) | 235 if (converted.size() != 2) |
| 217 return ThrowExceptionInJS(isolate, "_fileSystem.remove requires 2 paramete
rs"); | 236 return ThrowExceptionInJS(isolate, "_fileSystem.remove requires 2 paramete
rs"); |
| 218 if (!converted[1].IsFunction()) | 237 if (!converted[1].IsFunction()) |
| 219 return ThrowExceptionInJS(isolate, "Second argument to _fileSystem.remove
must be a function"); | 238 return ThrowExceptionInJS(isolate, "Second argument to _fileSystem.remove
must be a function"); |
| 220 | 239 |
| 221 JsValueList values; | 240 JsValueList values; |
| 222 values.push_back(converted[1]); | 241 values.push_back(converted[1]); |
| 223 auto weakCallback = jsEngine->StoreJsValues(values); | 242 auto weakCallback = jsEngine->StoreJsValues(values); |
| 224 std::weak_ptr<JsEngine> weakJsEngine = jsEngine; | 243 std::weak_ptr<JsEngine> weakJsEngine = jsEngine; |
| 225 jsEngine->GetPlatform().GetFileSystem().Remove(converted[0].AsString(), | 244 auto fileName = converted[0].AsString(); |
| 226 [weakJsEngine, weakCallback](const std::string& error) | 245 jsEngine->GetPlatform().WithFileSystem( |
| 246 [weakJsEngine, weakCallback, fileName](IFileSystem& fileSystem) |
| 227 { | 247 { |
| 228 auto jsEngine = weakJsEngine.lock(); | 248 fileSystem.Remove(fileName, |
| 229 if (!jsEngine) | 249 [weakJsEngine, weakCallback](const std::string& error) |
| 230 return; | 250 { |
| 251 auto jsEngine = weakJsEngine.lock(); |
| 252 if (!jsEngine) |
| 253 return; |
| 231 | 254 |
| 232 const JsContext context(*jsEngine); | 255 const JsContext context(*jsEngine); |
| 233 JsValueList params; | 256 JsValueList params; |
| 234 if (!error.empty()) | 257 if (!error.empty()) |
| 235 params.push_back(jsEngine->NewValue(error)); | 258 params.push_back(jsEngine->NewValue(error)); |
| 236 jsEngine->TakeJsValues(weakCallback)[0].Call(params); | 259 jsEngine->TakeJsValues(weakCallback)[0].Call(params); |
| 260 }); |
| 237 }); | 261 }); |
| 238 } | 262 } |
| 239 | 263 |
| 240 void StatCallback(const v8::FunctionCallbackInfo<v8::Value>& arguments) | 264 void StatCallback(const v8::FunctionCallbackInfo<v8::Value>& arguments) |
| 241 { | 265 { |
| 242 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(arg
uments); | 266 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(arg
uments); |
| 243 AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments); | 267 AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments); |
| 244 | 268 |
| 245 v8::Isolate* isolate = arguments.GetIsolate(); | 269 v8::Isolate* isolate = arguments.GetIsolate(); |
| 246 if (converted.size() != 2) | 270 if (converted.size() != 2) |
| 247 return ThrowExceptionInJS(isolate, "_fileSystem.stat requires 2 parameters
"); | 271 return ThrowExceptionInJS(isolate, "_fileSystem.stat requires 2 parameters
"); |
| 248 if (!converted[1].IsFunction()) | 272 if (!converted[1].IsFunction()) |
| 249 return ThrowExceptionInJS(isolate, "Second argument to _fileSystem.stat mu
st be a function"); | 273 return ThrowExceptionInJS(isolate, "Second argument to _fileSystem.stat mu
st be a function"); |
| 250 | 274 |
| 251 JsValueList values; | 275 JsValueList values; |
| 252 values.push_back(converted[1]); | 276 values.push_back(converted[1]); |
| 253 auto weakCallback = jsEngine->StoreJsValues(values); | 277 auto weakCallback = jsEngine->StoreJsValues(values); |
| 254 std::weak_ptr<JsEngine> weakJsEngine = jsEngine; | 278 std::weak_ptr<JsEngine> weakJsEngine = jsEngine; |
| 255 jsEngine->GetPlatform().GetFileSystem().Stat(converted[0].AsString(), | 279 auto fileName = converted[0].AsString(); |
| 256 [weakJsEngine, weakCallback] | 280 jsEngine->GetPlatform().WithFileSystem( |
| 257 (const IFileSystem::StatResult& statResult, const std::string& error) | 281 [weakJsEngine, weakCallback, fileName](IFileSystem& fileSystem) |
| 258 { | 282 { |
| 259 auto jsEngine = weakJsEngine.lock(); | 283 fileSystem.Stat(fileName, |
| 260 if (!jsEngine) | 284 [weakJsEngine, weakCallback] |
| 261 return; | 285 (const IFileSystem::StatResult& statResult, const std::string& error) |
| 286 { |
| 287 auto jsEngine = weakJsEngine.lock(); |
| 288 if (!jsEngine) |
| 289 return; |
| 262 | 290 |
| 263 const JsContext context(*jsEngine); | 291 const JsContext context(*jsEngine); |
| 264 auto result = jsEngine->NewObject(); | 292 auto result = jsEngine->NewObject(); |
| 265 | 293 |
| 266 result.SetProperty("exists", statResult.exists); | 294 result.SetProperty("exists", statResult.exists); |
| 267 result.SetProperty("lastModified", statResult.lastModified); | 295 result.SetProperty("lastModified", statResult.lastModified); |
| 268 if (!error.empty()) | 296 if (!error.empty()) |
| 269 result.SetProperty("error", error); | 297 result.SetProperty("error", error); |
| 270 | 298 |
| 271 JsValueList params; | 299 JsValueList params; |
| 272 params.push_back(result); | 300 params.push_back(result); |
| 273 jsEngine->TakeJsValues(weakCallback)[0].Call(params); | 301 jsEngine->TakeJsValues(weakCallback)[0].Call(params); |
| 302 }); |
| 274 }); | 303 }); |
| 275 } | 304 } |
| 276 } | 305 } |
| 277 | 306 |
| 278 | 307 |
| 279 JsValue& FileSystemJsObject::Setup(JsEngine& jsEngine, JsValue& obj) | 308 JsValue& FileSystemJsObject::Setup(JsEngine& jsEngine, JsValue& obj) |
| 280 { | 309 { |
| 281 obj.SetProperty("read", jsEngine.NewCallback(::ReadCallback)); | 310 obj.SetProperty("read", jsEngine.NewCallback(::ReadCallback)); |
| 282 obj.SetProperty("readFromFile", jsEngine.NewCallback(::ReadFromFileCallback)); | 311 obj.SetProperty("readFromFile", jsEngine.NewCallback(::ReadFromFileCallback)); |
| 283 obj.SetProperty("write", jsEngine.NewCallback(::WriteCallback)); | 312 obj.SetProperty("write", jsEngine.NewCallback(::WriteCallback)); |
| 284 obj.SetProperty("move", jsEngine.NewCallback(::MoveCallback)); | 313 obj.SetProperty("move", jsEngine.NewCallback(::MoveCallback)); |
| 285 obj.SetProperty("remove", jsEngine.NewCallback(::RemoveCallback)); | 314 obj.SetProperty("remove", jsEngine.NewCallback(::RemoveCallback)); |
| 286 obj.SetProperty("stat", jsEngine.NewCallback(::StatCallback)); | 315 obj.SetProperty("stat", jsEngine.NewCallback(::StatCallback)); |
| 287 return obj; | 316 return obj; |
| 288 } | 317 } |
| OLD | NEW |