| Left: | ||
| Right: |
| 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 14 matching lines...) Expand all Loading... | |
| 25 #include "JsContext.h" | 25 #include "JsContext.h" |
| 26 #include "Utils.h" | 26 #include "Utils.h" |
| 27 #include "JsError.h" | 27 #include "JsError.h" |
| 28 #include <AdblockPlus/Platform.h> | 28 #include <AdblockPlus/Platform.h> |
| 29 | 29 |
| 30 using namespace AdblockPlus; | 30 using namespace AdblockPlus; |
| 31 using AdblockPlus::Utils::ThrowExceptionInJS; | 31 using AdblockPlus::Utils::ThrowExceptionInJS; |
| 32 | 32 |
| 33 namespace | 33 namespace |
| 34 { | 34 { |
| 35 void ReadCallback(const v8::FunctionCallbackInfo<v8::Value>& arguments) | 35 namespace ReadCallback |
|
sergei
2018/03/23 11:27:19
the changes here are:
- create the namespace `Read
| |
| 36 { | 36 { |
| 37 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(arg uments); | 37 struct WeakData |
| 38 AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments); | 38 { |
| 39 public: | |
| 40 WeakData(const JsEnginePtr& jsEngine, | |
| 41 JsEngine::JsWeakValuesID weakResolveCallback, | |
| 42 JsEngine::JsWeakValuesID weakRejectCallback) | |
| 43 : weakJsEngine(jsEngine) | |
| 44 , weakResolveCallback(weakResolveCallback) | |
| 45 , weakRejectCallback(weakRejectCallback) | |
| 46 { | |
| 47 } | |
| 48 virtual ~WeakData() | |
| 49 { | |
| 50 auto jsEngine = weakJsEngine.lock(); | |
| 51 if (!jsEngine) | |
| 52 return; | |
| 53 jsEngine->TakeJsValues(weakResolveCallback); | |
| 54 jsEngine->TakeJsValues(weakRejectCallback); | |
| 55 } | |
| 56 std::weak_ptr<JsEngine> weakJsEngine; | |
| 57 JsEngine::JsWeakValuesID weakResolveCallback; | |
| 58 JsEngine::JsWeakValuesID weakRejectCallback; | |
| 59 }; | |
| 39 | 60 |
| 40 v8::Isolate* isolate = arguments.GetIsolate(); | 61 static void V8Callback(const v8::FunctionCallbackInfo<v8::Value>& arguments) |
| 41 if (converted.size() != 2) | 62 { |
| 42 return ThrowExceptionInJS(isolate, "_fileSystem.read requires 2 parameters "); | 63 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(a rguments); |
| 43 if (!converted[1].IsFunction()) | 64 AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments) ; |
| 44 return ThrowExceptionInJS(isolate, "Second argument to _fileSystem.read mu st be a function"); | |
| 45 | 65 |
| 46 JsValueList values; | 66 v8::Isolate* isolate = arguments.GetIsolate(); |
| 47 values.push_back(converted[1]); | 67 if (converted.size() != 3) |
| 48 auto weakCallback = jsEngine->StoreJsValues(values); | 68 return ThrowExceptionInJS(isolate, "_fileSystem.read requires 3 paramete rs"); |
| 49 std::weak_ptr<JsEngine> weakJsEngine = jsEngine; | 69 if (!converted[1].IsFunction()) |
| 50 auto fileName = converted[0].AsString(); | 70 return ThrowExceptionInJS(isolate, "Second argument to _fileSystem.read must be a function"); |
| 51 jsEngine->GetPlatform().WithFileSystem( | 71 if (!converted[2].IsFunction()) |
| 52 [weakJsEngine, weakCallback, fileName](IFileSystem& fileSystem) | 72 return ThrowExceptionInJS(isolate, "Third argument to _fileSystem.read m ust be a function"); |
| 73 | |
| 74 auto weakResolveCallback = jsEngine->StoreJsValues({converted[1]}); | |
| 75 auto weakRejectCallback = jsEngine->StoreJsValues({converted[2]}); | |
| 76 auto weakData = std::make_shared<WeakData>(jsEngine, weakResolveCallback, weakRejectCallback); | |
| 77 auto fileName = converted[0].AsString(); | |
| 78 jsEngine->GetPlatform().WithFileSystem( | |
| 79 [weakData, fileName](IFileSystem& fileSystem) | |
| 80 { | |
| 81 fileSystem.Read(fileName, [weakData](IFileSystem::IOBuffer&& content) | |
| 82 { | |
| 83 auto jsEngine = weakData->weakJsEngine.lock(); | |
| 84 if (!jsEngine) | |
| 85 return; | |
| 86 const JsContext context(*jsEngine); | |
| 87 auto result = jsEngine->NewObject(); | |
| 88 result.SetStringBufferProperty("content", content); | |
| 89 jsEngine->GetJsValues(weakData->weakResolveCallback)[0].Call(resul t); | |
| 90 }, | |
| 91 [weakData](const std::string& error) | |
| 92 { | |
| 93 if (error.empty()) | |
| 94 return; | |
| 95 auto jsEngine = weakData->weakJsEngine.lock(); | |
| 96 if (!jsEngine) | |
| 97 return; | |
| 98 const JsContext context(*jsEngine); | |
| 99 jsEngine->GetJsValues(weakData->weakRejectCallback)[0].Call(jsEngi ne->NewValue(error)); | |
| 100 }); | |
| 101 }); | |
| 102 } // V8Callback | |
| 103 } // namespace ReadCallback | |
| 104 | |
| 105 namespace ReadFromFileCallback | |
|
sergei
2018/03/23 11:27:19
the changes here are:
- create the namespace `Read
| |
| 106 { | |
| 107 inline bool IsEndOfLine(char c) | |
| 108 { | |
| 109 return c == 10 || c == 13; | |
| 110 } | |
| 111 | |
| 112 inline StringBuffer::const_iterator SkipEndOfLine(StringBuffer::const_iterat or ii, StringBuffer::const_iterator end) | |
| 113 { | |
| 114 while (ii != end && IsEndOfLine(*ii)) | |
| 115 ++ii; | |
| 116 return ii; | |
| 117 } | |
| 118 | |
| 119 inline StringBuffer::const_iterator AdvanceToEndOfLine(StringBuffer::const_i terator ii, StringBuffer::const_iterator end) | |
| 120 { | |
| 121 while (ii != end && !IsEndOfLine(*ii)) | |
| 122 ++ii; | |
| 123 return ii; | |
| 124 } | |
| 125 | |
| 126 struct WeakData : ReadCallback::WeakData | |
| 127 { | |
| 128 public: | |
| 129 WeakData(const JsEnginePtr& jsEngine, | |
| 130 JsEngine::JsWeakValuesID weakResolveCallback, | |
| 131 JsEngine::JsWeakValuesID weakRejectCallback, | |
| 132 JsEngine::JsWeakValuesID weakProcessFunc) | |
| 133 : ReadCallback::WeakData(jsEngine, weakResolveCallback, weakRejectCallba ck) | |
| 134 , weakProcessFunc(weakProcessFunc) | |
| 53 { | 135 { |
| 54 fileSystem.Read(fileName, | 136 } |
| 55 [weakJsEngine, weakCallback] | 137 ~WeakData() |
| 56 (IFileSystem::IOBuffer&& content, const std::string& error) | 138 { |
| 57 { | 139 auto jsEngine = weakJsEngine.lock(); |
| 58 auto jsEngine = weakJsEngine.lock(); | 140 if (!jsEngine) |
| 59 if (!jsEngine) | 141 return; |
| 60 return; | 142 jsEngine->TakeJsValues(weakProcessFunc); |
| 143 } | |
| 144 JsEngine::JsWeakValuesID weakProcessFunc; | |
| 145 }; | |
| 61 | 146 |
| 62 const JsContext context(*jsEngine); | 147 void V8Callback(const v8::FunctionCallbackInfo<v8::Value>& arguments) |
| 63 auto result = jsEngine->NewObject(); | 148 { |
| 64 result.SetStringBufferProperty("content", std::move(content)); | 149 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(a rguments); |
| 65 if (!error.empty()) | 150 AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments) ; |
| 66 result.SetProperty("error", error); | |
| 67 jsEngine->TakeJsValues(weakCallback)[0].Call(result); | |
| 68 }); | |
| 69 }); | |
| 70 } | |
| 71 | 151 |
| 72 inline bool IsEndOfLine(char c) | 152 v8::Isolate* isolate = arguments.GetIsolate(); |
| 73 { | 153 if (converted.size() != 4) |
| 74 return c == 10 || c == 13; | 154 return ThrowExceptionInJS(isolate, "_fileSystem.readFromFile requires 4 parameters"); |
| 75 } | 155 if (!converted[1].IsFunction()) |
| 156 return ThrowExceptionInJS(isolate, "Second argument to _fileSystem.readF romFile must be a function (listener callback)"); | |
| 157 if (!converted[2].IsFunction()) | |
| 158 return ThrowExceptionInJS(isolate, "Third argument to _fileSystem.readFr omFile must be a function (done callback)"); | |
| 159 if (!converted[3].IsFunction()) | |
| 160 return ThrowExceptionInJS(isolate, "Third argument to _fileSystem.readFr omFile must be a function (error callback)"); | |
| 76 | 161 |
| 77 inline StringBuffer::const_iterator SkipEndOfLine(StringBuffer::const_iterator ii, StringBuffer::const_iterator end) | 162 auto weakProcessFunc = jsEngine->StoreJsValues({converted[1]}); |
| 78 { | 163 auto weakResolveCallback = jsEngine->StoreJsValues({converted[2]}); |
| 79 while (ii != end && IsEndOfLine(*ii)) | 164 auto weakRejectCallback = jsEngine->StoreJsValues({converted[3]}); |
| 80 ++ii; | 165 auto weakData = std::make_shared<WeakData>(jsEngine, weakResolveCallback, weakRejectCallback, weakProcessFunc); |
| 81 return ii; | 166 auto fileName = converted[0].AsString(); |
| 82 } | 167 jsEngine->GetPlatform().WithFileSystem([weakData, fileName](IFileSystem& f ileSystem) |
| 168 { | |
| 169 fileSystem.Read(fileName, [weakData](IFileSystem::IOBuffer&& content) | |
| 170 { | |
| 171 auto jsEngine = weakData->weakJsEngine.lock(); | |
| 172 if (!jsEngine) | |
| 173 return; | |
| 83 | 174 |
| 84 inline StringBuffer::const_iterator AdvanceToEndOfLine(StringBuffer::const_ite rator ii, StringBuffer::const_iterator end) | 175 const JsContext context(*jsEngine); |
| 85 { | 176 auto jsValues = jsEngine->GetJsValues(weakData->weakProcessFunc); |
| 86 while (ii != end && !IsEndOfLine(*ii)) | 177 auto processFunc = jsValues[0].UnwrapValue().As<v8::Function>(); |
| 87 ++ii; | 178 auto globalContext = context.GetV8Context()->Global(); |
| 88 return ii; | 179 if (!globalContext->IsObject()) |
| 89 } | 180 throw std::runtime_error("`this` pointer has to be an object"); |
| 90 | 181 |
| 91 void ReadFromFileCallback(const v8::FunctionCallbackInfo<v8::Value>& arguments ) | 182 const v8::TryCatch tryCatch; |
| 92 { | 183 const auto contentEnd = content.cend(); |
| 93 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(arg uments); | 184 auto stringBegin = SkipEndOfLine(content.begin(), contentEnd); |
| 94 AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments); | 185 do |
| 95 | 186 { |
| 96 v8::Isolate* isolate = arguments.GetIsolate(); | 187 auto stringEnd = AdvanceToEndOfLine(stringBegin, contentEnd); |
| 97 if (converted.size() != 3) | 188 auto jsLine = Utils::StringBufferToV8String(jsEngine->GetIsolate (), StringBuffer(stringBegin, stringEnd)).As<v8::Value>(); |
| 98 return ThrowExceptionInJS(isolate, "_fileSystem.readFromFile requires 3 pa rameters"); | 189 processFunc->Call(globalContext, 1, &jsLine); |
| 99 if (!converted[1].IsFunction()) | 190 if (tryCatch.HasCaught()) |
| 100 return ThrowExceptionInJS(isolate, "Second argument to _fileSystem.readFro mFile must be a function (listener callback)"); | 191 throw JsError(tryCatch.Exception(), tryCatch.Message()); |
|
sergei
2018/03/23 11:27:19
Please pay attention to this change. Previously it
| |
| 101 if (!converted[2].IsFunction()) | 192 stringBegin = SkipEndOfLine(stringEnd, contentEnd); |
| 102 return ThrowExceptionInJS(isolate, "Third argument to _fileSystem.readFrom File must be a function (done callback)"); | 193 } while (stringBegin != contentEnd); |
| 103 | 194 jsEngine->GetJsValues(weakData->weakResolveCallback)[0].Call(); |
| 104 JsValueList values; | 195 }, [weakData](const std::string& error) |
| 105 values.push_back(converted[1]); | |
| 106 values.push_back(converted[2]); | |
| 107 auto weakCallback = jsEngine->StoreJsValues(values); | |
| 108 std::weak_ptr<JsEngine> weakJsEngine = jsEngine; | |
| 109 auto fileName = converted[0].AsString(); | |
| 110 jsEngine->GetPlatform().WithFileSystem( | |
| 111 [weakJsEngine, weakCallback, fileName](IFileSystem& fileSystem) | |
| 112 { | |
| 113 fileSystem.Read(fileName, | |
| 114 [weakJsEngine, weakCallback] | |
| 115 (IFileSystem::IOBuffer&& content, const std::string& error) | |
| 116 { | |
| 117 auto jsEngine = weakJsEngine.lock(); | |
| 118 if (!jsEngine) | |
| 119 return; | |
| 120 | |
| 121 const JsContext context(*jsEngine); | |
| 122 | |
| 123 auto jsValues = jsEngine->TakeJsValues(weakCallback); | |
| 124 if (!error.empty()) | |
| 125 { | 196 { |
| 126 jsValues[1].Call(jsEngine->NewValue(error)); | 197 if (error.empty()) |
| 127 return; | |
| 128 } | |
| 129 | |
| 130 auto processFunc = jsValues[0].UnwrapValue().As<v8::Function>(); | |
| 131 | |
| 132 auto globalContext = context.GetV8Context()->Global(); | |
| 133 if (!globalContext->IsObject()) | |
| 134 throw std::runtime_error("`this` pointer has to be an object"); | |
| 135 | |
| 136 const v8::TryCatch tryCatch; | |
| 137 | |
| 138 const auto contentEnd = content.cend(); | |
| 139 auto stringBegin = SkipEndOfLine(content.begin(), contentEnd); | |
| 140 do | |
| 141 { | |
| 142 auto stringEnd = AdvanceToEndOfLine(stringBegin, contentEnd); | |
| 143 auto jsLine = Utils::StringBufferToV8String(jsEngine->GetIsolate() , StringBuffer(stringBegin, stringEnd)).As<v8::Value>(); | |
| 144 processFunc->Call(globalContext, 1, &jsLine); | |
| 145 if (tryCatch.HasCaught()) | |
| 146 { | |
| 147 jsValues[1].Call(jsEngine->NewValue(JsError::ExceptionToString(t ryCatch.Exception(), tryCatch.Message()))); | |
| 148 return; | 198 return; |
| 149 } | 199 auto jsEngine = weakData->weakJsEngine.lock(); |
| 150 stringBegin = SkipEndOfLine(stringEnd, contentEnd); | 200 if (!jsEngine) |
| 151 } while (stringBegin != contentEnd); | 201 return; |
| 152 jsValues[1].Call(); | 202 jsEngine->GetJsValues(weakData->weakRejectCallback)[0].Call(jsEngi ne->NewValue(error)); |
| 153 }); | 203 }); |
| 154 }); | 204 }); |
| 155 } | 205 } // V8Callback |
| 206 } // namespace ReadFromFileCallback | |
| 156 | 207 |
| 157 void WriteCallback(const v8::FunctionCallbackInfo<v8::Value>& arguments) | 208 void WriteCallback(const v8::FunctionCallbackInfo<v8::Value>& arguments) |
| 158 { | 209 { |
| 159 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(arg uments); | 210 AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(arg uments); |
| 160 AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments); | 211 AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments); |
| 161 | 212 |
| 162 v8::Isolate* isolate = arguments.GetIsolate(); | 213 v8::Isolate* isolate = arguments.GetIsolate(); |
| 163 if (converted.size() != 3) | 214 if (converted.size() != 3) |
| 164 return ThrowExceptionInJS(isolate, "_fileSystem.write requires 3 parameter s"); | 215 return ThrowExceptionInJS(isolate, "_fileSystem.write requires 3 parameter s"); |
| 165 if (!converted[2].IsFunction()) | 216 if (!converted[2].IsFunction()) |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 300 params.push_back(result); | 351 params.push_back(result); |
| 301 jsEngine->TakeJsValues(weakCallback)[0].Call(params); | 352 jsEngine->TakeJsValues(weakCallback)[0].Call(params); |
| 302 }); | 353 }); |
| 303 }); | 354 }); |
| 304 } | 355 } |
| 305 } | 356 } |
| 306 | 357 |
| 307 | 358 |
| 308 JsValue& FileSystemJsObject::Setup(JsEngine& jsEngine, JsValue& obj) | 359 JsValue& FileSystemJsObject::Setup(JsEngine& jsEngine, JsValue& obj) |
| 309 { | 360 { |
| 310 obj.SetProperty("read", jsEngine.NewCallback(::ReadCallback)); | 361 obj.SetProperty("read", jsEngine.NewCallback(::ReadCallback::V8Callback)); |
| 311 obj.SetProperty("readFromFile", jsEngine.NewCallback(::ReadFromFileCallback)); | 362 obj.SetProperty("readFromFile", jsEngine.NewCallback(::ReadFromFileCallback::V 8Callback)); |
| 312 obj.SetProperty("write", jsEngine.NewCallback(::WriteCallback)); | 363 obj.SetProperty("write", jsEngine.NewCallback(::WriteCallback)); |
| 313 obj.SetProperty("move", jsEngine.NewCallback(::MoveCallback)); | 364 obj.SetProperty("move", jsEngine.NewCallback(::MoveCallback)); |
| 314 obj.SetProperty("remove", jsEngine.NewCallback(::RemoveCallback)); | 365 obj.SetProperty("remove", jsEngine.NewCallback(::RemoveCallback)); |
| 315 obj.SetProperty("stat", jsEngine.NewCallback(::StatCallback)); | 366 obj.SetProperty("stat", jsEngine.NewCallback(::StatCallback)); |
| 316 return obj; | 367 return obj; |
| 317 } | 368 } |
| OLD | NEW |