Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: src/FileSystemJsObject.cpp

Issue 29370568: Issue #4692 - Move responsibility for engine reference from tasks to scheduler
Patch Set: Created Dec. 31, 2016, 10:37 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/AdblockPlus/JsEngine.h ('k') | src/JsEngine.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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-2016 Eyeo GmbH 3 * Copyright (C) 2006-2016 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 15 matching lines...) Expand all
26 #include "JsEngineTransition.h" 26 #include "JsEngineTransition.h"
27 #include "Scheduler.h" 27 #include "Scheduler.h"
28 #include "Utils.h" 28 #include "Utils.h"
29 #include "Value.h" 29 #include "Value.h"
30 30
31 using namespace AdblockPlus; 31 using namespace AdblockPlus;
32 32
33 namespace 33 namespace
34 { 34 {
35 class ReadTask 35 class ReadTask
36 : public TaskFunctionInterface
36 { 37 {
37 /** 38 /**
38 * Shared pointer keeps engine in existence for task thread. 39 * Shared pointer keeps engine in existence for task thread.
39 */ 40 */
40 JsEnginePtr jsEngine; 41 JsEngineInternal* engine;
41 std::string path; 42 std::string path;
42 V8PersistentNG<v8::Function> callbackFunction; 43 V8PersistentNG<v8::Function> callbackFunction;
43 44
44 public: 45 public:
45 ReadTask(JsEngineInternal* engine, const std::string& path, 46 ReadTask(JsEngineInternal* engine, const std::string& path,
46 V8PersistentNG<v8::Function> callbackFunction) 47 V8PersistentNG<v8::Function> callbackFunction)
47 : jsEngine(engine->shared_from_this()), path(path), 48 : engine(engine), path(path),
48 callbackFunction(callbackFunction) 49 callbackFunction(callbackFunction)
49 {} 50 {}
50 51
51 void operator()() 52 void operator()() override
52 { 53 {
53 JsEngineInternal* engine = ToInternal(jsEngine);
54 std::string content; 54 std::string content;
55 std::string error; 55 std::string error;
56 // Read operation is long-lived. Do not lock engine during it. 56 // Read operation is long-lived. Do not lock engine during it.
57 try 57 try
58 { 58 {
59 std::shared_ptr<std::istream> stream = engine->GetFileSystem()->Read(pat h); 59 std::shared_ptr<std::istream> stream = engine->GetFileSystem()->Read(pat h);
60 content = Utils::Slurp(*stream); 60 content = Utils::Slurp(*stream);
61 } 61 }
62 catch (std::exception& e) 62 catch (std::exception& e)
63 { 63 {
64 error = e.what(); 64 error = e.what();
65 } 65 }
66 catch (...) 66 catch (...)
67 { 67 {
68 error = "Unknown error while reading from " + path; 68 error = "Unknown error while reading from " + path;
69 } 69 }
70 // Call back with the results of the read operation 70 // Call back with the results of the read operation
71 V8ExecutionScope scope(engine); 71 V8ExecutionScope scope(engine);
72 auto callbackArguments = v8::Object::New(); 72 auto callbackArguments = v8::Object::New();
73 callbackArguments->Set(engine->ToV8String("content"), engine->ToV8String(c ontent)); 73 callbackArguments->Set(engine->ToV8String("content"), engine->ToV8String(c ontent));
74 callbackArguments->Set(engine->ToV8String("error"), engine->ToV8String(err or)); 74 callbackArguments->Set(engine->ToV8String("error"), engine->ToV8String(err or));
75 auto args = AllocatedArray<v8::Local<v8::Value>>(1); 75 auto args = AllocatedArray<v8::Local<v8::Value>>(1);
76 args[0] = callbackArguments; 76 args[0] = callbackArguments;
77 engine->ApplyFunction(callbackFunction.Get(engine->GetIsolate()), std::mov e(args)); 77 engine->ApplyFunction(callbackFunction.Get(engine->GetIsolate()), std::mov e(args));
78 } 78 }
79 }; 79 };
80 80
81 class WriteTask 81 class WriteTask
82 : public TaskFunctionInterface
82 { 83 {
83 /** 84 /**
84 * Shared pointer keeps engine in existence for task thread. 85 * Shared pointer keeps engine in existence for task thread.
85 */ 86 */
86 JsEnginePtr jsEngine; 87 JsEngineInternal* engine;
87 std::string path; 88 std::string path;
88 std::string content; 89 std::string content;
89 V8PersistentNG<v8::Function> callbackFunction; 90 V8PersistentNG<v8::Function> callbackFunction;
90 public: 91 public:
91 WriteTask(JsEngineInternal* engine, 92 WriteTask(JsEngineInternal* engine,
92 const std::string& path, const std::string& content, 93 const std::string& path, const std::string& content,
93 V8PersistentNG<v8::Function> callbackFunction) 94 V8PersistentNG<v8::Function> callbackFunction)
94 : jsEngine(engine->shared_from_this()), path(path), content(content), 95 : engine(engine), path(path), content(content),
95 callbackFunction(callbackFunction) 96 callbackFunction(callbackFunction)
96 {} 97 {}
97 98
98 void operator()() 99 void operator()() override
99 { 100 {
100 JsEngineInternal* engine = ToInternal(jsEngine);
101 std::string error; 101 std::string error;
102 // Write operation is long-lived. Do not lock engine during it. 102 // Write operation is long-lived. Do not lock engine during it.
103 try 103 try
104 { 104 {
105 std::shared_ptr<std::iostream> stream(new std::stringstream); 105 std::shared_ptr<std::iostream> stream(new std::stringstream);
106 *stream << content; 106 *stream << content;
107 engine->GetFileSystem()->Write(path, stream); 107 engine->GetFileSystem()->Write(path, stream);
108 } 108 }
109 catch (std::exception& e) 109 catch (std::exception& e)
110 { 110 {
111 error = e.what(); 111 error = e.what();
112 } 112 }
113 catch (...) 113 catch (...)
114 { 114 {
115 error = "Unknown error while writing to " + path; 115 error = "Unknown error while writing to " + path;
116 } 116 }
117 // Apply the callback function 117 // Apply the callback function
118 V8ExecutionScope scope(engine); 118 V8ExecutionScope scope(engine);
119 auto args = AllocatedArray<v8::Local<v8::Value>>(1); 119 auto args = AllocatedArray<v8::Local<v8::Value>>(1);
120 args[0] = engine->ToV8String(error); 120 args[0] = engine->ToV8String(error);
121 engine->ApplyFunction(callbackFunction.Get(engine->GetIsolate()), std::mov e(args)); 121 engine->ApplyFunction(callbackFunction.Get(engine->GetIsolate()), std::mov e(args));
122 } 122 }
123 }; 123 };
124 124
125 class MoveTask 125 class MoveTask
126 : public TaskFunctionInterface
126 { 127 {
127 /** 128 /**
128 * Shared pointer keeps engine in existence for task thread. 129 * Shared pointer keeps engine in existence for task thread.
129 */ 130 */
130 JsEnginePtr jsEngine; 131 JsEngineInternal* engine;
131 std::string fromPath; 132 std::string fromPath;
132 std::string toPath; 133 std::string toPath;
133 V8PersistentNG<v8::Function> callbackFunction; 134 V8PersistentNG<v8::Function> callbackFunction;
134 135
135 public: 136 public:
136 MoveTask(JsEngineInternal* engine, const std::string& fromPath, const std::s tring& toPath, 137 MoveTask(JsEngineInternal* engine, const std::string& fromPath, const std::s tring& toPath,
137 V8PersistentNG<v8::Function> callbackFunction) 138 V8PersistentNG<v8::Function> callbackFunction)
138 : jsEngine(engine->shared_from_this()), fromPath(fromPath), toPath(toPath) , 139 : engine(engine), fromPath(fromPath), toPath(toPath),
139 callbackFunction(callbackFunction) 140 callbackFunction(callbackFunction)
140 {} 141 {}
141 142
142 void operator()() 143 void operator()() override
143 { 144 {
144 JsEngineInternal* engine(ToInternal(jsEngine));
145 std::string error; 145 std::string error;
146 try 146 try
147 { 147 {
148 engine->GetFileSystem()->Move(fromPath, toPath); 148 engine->GetFileSystem()->Move(fromPath, toPath);
149 } 149 }
150 catch (std::exception& e) 150 catch (std::exception& e)
151 { 151 {
152 error = e.what(); 152 error = e.what();
153 } 153 }
154 catch (...) 154 catch (...)
155 { 155 {
156 error = "Unknown error while moving " + fromPath + " to " + toPath; 156 error = "Unknown error while moving " + fromPath + " to " + toPath;
157 } 157 }
158 V8ExecutionScope scope(engine); 158 V8ExecutionScope scope(engine);
159 auto args = AllocatedArray<v8::Local<v8::Value>>(1); 159 auto args = AllocatedArray<v8::Local<v8::Value>>(1);
160 args[0] = engine->ToV8String(error); 160 args[0] = engine->ToV8String(error);
161 engine->ApplyFunction(callbackFunction.Get(engine->GetIsolate()), std::mov e(args)); 161 engine->ApplyFunction(callbackFunction.Get(engine->GetIsolate()), std::mov e(args));
162 } 162 }
163 }; 163 };
164 164
165 class RemoveTask 165 class RemoveTask
166 : public TaskFunctionInterface
166 { 167 {
167 /** 168 /**
168 * Shared pointer keeps engine in existence for task thread. 169 * Shared pointer keeps engine in existence for task thread.
169 */ 170 */
170 JsEnginePtr jsEngine; 171 JsEngineInternal *engine;
171 std::string path; 172 std::string path;
172 V8PersistentNG<v8::Function> callbackFunction; 173 V8PersistentNG<v8::Function> callbackFunction;
173 174
174 public: 175 public:
175 RemoveTask(JsEngineInternal *engine, const std::string& path, 176 RemoveTask(JsEngineInternal *engine, const std::string& path,
176 V8PersistentNG<v8::Function> callbackFunction) 177 V8PersistentNG<v8::Function> callbackFunction)
177 : jsEngine(engine->shared_from_this()), path(path), 178 : engine(engine), path(path),
178 callbackFunction(callbackFunction) 179 callbackFunction(callbackFunction)
179 {} 180 {}
180 181
181 void operator()() 182 void operator()() override
182 { 183 {
183 JsEngineInternal* engine(ToInternal(jsEngine));
184 std::string error; 184 std::string error;
185 try 185 try
186 { 186 {
187 engine->GetFileSystem()->Remove(path); 187 engine->GetFileSystem()->Remove(path);
188 } 188 }
189 catch (std::exception& e) 189 catch (std::exception& e)
190 { 190 {
191 error = e.what(); 191 error = e.what();
192 } 192 }
193 catch (...) 193 catch (...)
194 { 194 {
195 error = "Unknown error while removing " + path; 195 error = "Unknown error while removing " + path;
196 } 196 }
197 V8ExecutionScope scope(engine); 197 V8ExecutionScope scope(engine);
198 auto args = AllocatedArray<v8::Local<v8::Value>>(1); 198 auto args = AllocatedArray<v8::Local<v8::Value>>(1);
199 args[0] = engine->ToV8String(error); 199 args[0] = engine->ToV8String(error);
200 engine->ApplyFunction(callbackFunction.Get(engine->GetIsolate()), std::mov e(args)); 200 engine->ApplyFunction(callbackFunction.Get(engine->GetIsolate()), std::mov e(args));
201 } 201 }
202 }; 202 };
203 203
204 class StatTask 204 class StatTask
205 : public TaskFunctionInterface
205 { 206 {
206 /** 207 /**
207 * Shared pointer keeps engine in existence for task thread. 208 * Shared pointer keeps engine in existence for task thread.
208 */ 209 */
209 JsEnginePtr jsEngine; 210 JsEngineInternal *engine;
210 std::string path; 211 std::string path;
211 V8PersistentNG<v8::Function> callbackFunction; 212 V8PersistentNG<v8::Function> callbackFunction;
212 213
213 public: 214 public:
214 StatTask(JsEngineInternal* engine, const std::string& path, 215 StatTask(JsEngineInternal* engine, const std::string& path,
215 V8PersistentNG<v8::Function> callbackFunction) 216 V8PersistentNG<v8::Function> callbackFunction)
216 : jsEngine(engine->shared_from_this()), path(path), 217 : engine(engine), path(path),
217 callbackFunction(callbackFunction) 218 callbackFunction(callbackFunction)
218 {} 219 {}
219 220
220 void operator()() 221 void operator()() override
221 { 222 {
222 JsEngineInternal* engine(ToInternal(jsEngine));
223 std::string error; 223 std::string error;
224 FileSystem::StatResult statResult; 224 FileSystem::StatResult statResult;
225 try 225 try
226 { 226 {
227 statResult = engine->GetFileSystem()->Stat(path); 227 statResult = engine->GetFileSystem()->Stat(path);
228 } 228 }
229 catch (std::exception& e) 229 catch (std::exception& e)
230 { 230 {
231 error = e.what(); 231 error = e.what();
232 } 232 }
(...skipping 11 matching lines...) Expand all
244 auto args = AllocatedArray<v8::Local<v8::Value>>(1); 244 auto args = AllocatedArray<v8::Local<v8::Value>>(1);
245 args[0] = callbackArgument; 245 args[0] = callbackArgument;
246 engine->ApplyFunction(callbackFunction.Get(engine->GetIsolate()), std::mov e(args)); 246 engine->ApplyFunction(callbackFunction.Get(engine->GetIsolate()), std::mov e(args));
247 } 247 }
248 }; 248 };
249 } 249 }
250 250
251 v8::Handle<v8::Value> ReadCallback(const v8::Arguments& arguments) 251 v8::Handle<v8::Value> ReadCallback(const v8::Arguments& arguments)
252 { 252 {
253 auto engine(JsEngineInternal::ExtractEngine(arguments)); 253 auto engine(JsEngineInternal::ExtractEngine(arguments));
254 std::shared_ptr<ReadTask> readTask;
255 try 254 try
256 { 255 {
257 if (arguments.Length() != 2) 256 if (arguments.Length() != 2)
258 { 257 {
259 throw std::runtime_error("_fileSystem.read requires 2 parameters"); 258 throw std::runtime_error("_fileSystem.read requires 2 parameters");
260 } 259 }
261 bool argumentIsString; 260 bool argumentIsString;
262 std::string firstArgument; 261 std::string firstArgument;
263 std::tie(argumentIsString, firstArgument) = ConvertString(arguments[0]); 262 std::tie(argumentIsString, firstArgument) = ConvertString(arguments[0]);
264 if (!argumentIsString) 263 if (!argumentIsString)
265 { 264 {
266 throw std::runtime_error("First argument to _fileSystem.read must be a str ing"); 265 throw std::runtime_error("First argument to _fileSystem.read must be a str ing");
267 } 266 }
268 if (!arguments[1]->IsFunction()) 267 if (!arguments[1]->IsFunction())
269 { 268 {
270 throw std::runtime_error("Second argument to _fileSystem.read must be a fu nction"); 269 throw std::runtime_error("Second argument to _fileSystem.read must be a fu nction");
271 } 270 }
272 readTask = std::make_shared<ReadTask>(engine, firstArgument, 271 ReadTask readTask(engine, firstArgument,
273 V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function> ::Cast(arguments[1]))); 272 V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function> ::Cast(arguments[1])));
273 // Run the task
274 engine->ScheduleTask(std::move(readTask), ImmediateSingleUseThread);
275 return v8::Undefined();
274 } 276 }
275 catch (const std::exception& e) 277 catch (const std::exception& e)
276 { 278 {
277 return v8::ThrowException(engine->ToV8String(e.what())); 279 return v8::ThrowException(engine->ToV8String(e.what()));
278 } 280 }
279 // Run the task
280 engine->Schedule(AdblockPlus::MakeHeapFunction(readTask), AdblockPlus::Immedia teSingleUseThread);
281 return v8::Undefined();
282 } 281 }
283 282
284 v8::Handle<v8::Value> WriteCallback(const v8::Arguments& arguments) 283 v8::Handle<v8::Value> WriteCallback(const v8::Arguments& arguments)
285 { 284 {
286 auto engine(JsEngineInternal::ExtractEngine(arguments)); 285 auto engine(JsEngineInternal::ExtractEngine(arguments));
287 std::shared_ptr<WriteTask> writeTask;
288 try 286 try
289 { 287 {
290 v8::Isolate* isolate = arguments.GetIsolate();
291
292 if (arguments.Length() != 3) 288 if (arguments.Length() != 3)
293 { 289 {
294 throw std::exception("_fileSystem.write requires 3 parameters"); 290 throw std::exception("_fileSystem.write requires 3 parameters");
295 } 291 }
296 bool argumentIsString; 292 bool argumentIsString;
297 std::string firstArgument; 293 std::string firstArgument;
298 std::tie(argumentIsString, firstArgument) = ConvertString(arguments[0]); 294 std::tie(argumentIsString, firstArgument) = ConvertString(arguments[0]);
299 if (!argumentIsString) 295 if (!argumentIsString)
300 { 296 {
301 throw std::runtime_error("First argument to _fileSystem.write must be a st ring"); 297 throw std::runtime_error("First argument to _fileSystem.write must be a st ring");
302 } 298 }
303 std::string secondArgument; 299 std::string secondArgument;
304 std::tie(argumentIsString, secondArgument) = ConvertString(arguments[1]); 300 std::tie(argumentIsString, secondArgument) = ConvertString(arguments[1]);
305 if (!argumentIsString) 301 if (!argumentIsString)
306 { 302 {
307 throw std::runtime_error("Second argument to _fileSystem.write must be a s tring"); 303 throw std::runtime_error("Second argument to _fileSystem.write must be a s tring");
308 } 304 }
309 if (!arguments[2]->IsFunction()) 305 if (!arguments[2]->IsFunction())
310 { 306 {
311 throw std::runtime_error("Third argument to _fileSystem.write must be a fu nction"); 307 throw std::runtime_error("Third argument to _fileSystem.write must be a fu nction");
312 } 308 }
313 writeTask = std::make_shared<WriteTask>(engine, firstArgument, secondArgumen t, 309 // Run the task
310 WriteTask writeTask(engine, firstArgument, secondArgument,
314 V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function> ::Cast(arguments[2]))); 311 V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function> ::Cast(arguments[2])));
312 engine->ScheduleTask(std::move(writeTask), ImmediateSingleUseThread);
313 return v8::Undefined();
315 } 314 }
316 catch (const std::exception& e) 315 catch (const std::exception& e)
317 { 316 {
318 return v8::ThrowException(engine->ToV8String(e.what())); 317 return v8::ThrowException(engine->ToV8String(e.what()));
319 } 318 }
320 engine->Schedule(AdblockPlus::MakeHeapFunction(writeTask), AdblockPlus::Immedi ateSingleUseThread);
321 return v8::Undefined();
322 } 319 }
323 320
324 v8::Handle<v8::Value> MoveCallback(const v8::Arguments& arguments) 321 v8::Handle<v8::Value> MoveCallback(const v8::Arguments& arguments)
325 { 322 {
326 auto engine(JsEngineInternal::ExtractEngine(arguments)); 323 auto engine(JsEngineInternal::ExtractEngine(arguments));
327 std::shared_ptr<MoveTask> moveTask;
328 std::string firstArgument, secondArgument;
329 try 324 try
330 { 325 {
331 if (arguments.Length() != 3) 326 if (arguments.Length() != 3)
332 { 327 {
333 throw std::runtime_error("_fileSystem.move requires 3 parameters"); 328 throw std::runtime_error("_fileSystem.move requires 3 parameters");
334 } 329 }
335 bool argumentIsString; 330 bool argumentIsString;
331 std::string firstArgument, secondArgument;
336 std::tie(argumentIsString, firstArgument) = ConvertString(arguments[0]); 332 std::tie(argumentIsString, firstArgument) = ConvertString(arguments[0]);
337 if (!argumentIsString) 333 if (!argumentIsString)
338 { 334 {
339 throw std::runtime_error("First argument to _fileSystem.write must be a st ring"); 335 throw std::runtime_error("First argument to _fileSystem.write must be a st ring");
340 } 336 }
341 std::tie(argumentIsString, secondArgument) = ConvertString(arguments[1]); 337 std::tie(argumentIsString, secondArgument) = ConvertString(arguments[1]);
342 if (!argumentIsString) 338 if (!argumentIsString)
343 { 339 {
344 throw std::runtime_error("Second argument to _fileSystem.write must be a s tring"); 340 throw std::runtime_error("Second argument to _fileSystem.write must be a s tring");
345 } 341 }
346 if (!arguments[2]->IsFunction()) 342 if (!arguments[2]->IsFunction())
347 { 343 {
348 throw std::runtime_error("Third argument to _fileSystem.move must be a fun ction"); 344 throw std::runtime_error("Third argument to _fileSystem.move must be a fun ction");
349 } 345 }
346 // Run the task
347 MoveTask moveTask(engine, firstArgument, secondArgument,
348 V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function> ::Cast(arguments[2])));
349 engine->ScheduleTask(std::move(moveTask), ImmediateSingleUseThread);
350 return v8::Undefined();
350 } 351 }
351 catch (const std::exception& e) 352 catch (const std::exception& e)
352 { 353 {
353 return v8::ThrowException(engine->ToV8String(e.what())); 354 return v8::ThrowException(engine->ToV8String(e.what()));
354 } 355 }
355 // Run the task
356 moveTask = std::make_shared<MoveTask>(engine, firstArgument, secondArgument,
357 V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function>:: Cast(arguments[2])));
358 engine->Schedule(AdblockPlus::MakeHeapFunction(moveTask), AdblockPlus::Immedia teSingleUseThread);
359 return v8::Undefined();
360 } 356 }
361 357
362 v8::Handle<v8::Value> RemoveCallback(const v8::Arguments& arguments) 358 v8::Handle<v8::Value> RemoveCallback(const v8::Arguments& arguments)
363 { 359 {
364 auto engine(JsEngineInternal::ExtractEngine(arguments)); 360 auto engine(JsEngineInternal::ExtractEngine(arguments));
365 std::shared_ptr<RemoveTask> removeTask;
366 std::string firstArgument;
367 try 361 try
368 { 362 {
369 if (arguments.Length() != 2) 363 if (arguments.Length() != 2)
370 { 364 {
371 throw std::runtime_error("_fileSystem.remove requires 2 parameters"); 365 throw std::runtime_error("_fileSystem.remove requires 2 parameters");
372 } 366 }
373 bool argumentIsString; 367 bool argumentIsString;
368 std::string firstArgument;
374 std::tie(argumentIsString, firstArgument) = ConvertString(arguments[0]); 369 std::tie(argumentIsString, firstArgument) = ConvertString(arguments[0]);
375 if (!argumentIsString) 370 if (!argumentIsString)
376 { 371 {
377 throw std::runtime_error("First argument to _fileSystem.remove must be a s tring"); 372 throw std::runtime_error("First argument to _fileSystem.remove must be a s tring");
378 } 373 }
379 if (!arguments[1]->IsFunction()) 374 if (!arguments[1]->IsFunction())
380 { 375 {
381 throw std::runtime_error("Second argument to _fileSystem.remove must be a function"); 376 throw std::runtime_error("Second argument to _fileSystem.remove must be a function");
382 } 377 }
378 // Run the task
379 RemoveTask removeTask(engine, firstArgument,
380 V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function> ::Cast(arguments[1])));
381 engine->ScheduleTask(std::move(removeTask), ImmediateSingleUseThread);
382 return v8::Undefined();
383 } 383 }
384 catch (const std::exception& e) 384 catch (const std::exception& e)
385 { 385 {
386 return v8::ThrowException(engine->ToV8String(e.what())); 386 return v8::ThrowException(engine->ToV8String(e.what()));
387 } 387 }
388 // Run the task
389 removeTask = std::make_shared<RemoveTask>(engine, firstArgument,
390 V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function>:: Cast(arguments[1])));
391 engine->Schedule(AdblockPlus::MakeHeapFunction(removeTask), AdblockPlus::Immed iateSingleUseThread);
392 return v8::Undefined();
393 } 388 }
394 389
395 v8::Handle<v8::Value> StatCallback(const v8::Arguments& arguments) 390 v8::Handle<v8::Value> StatCallback(const v8::Arguments& arguments)
396 { 391 {
397 auto engine(JsEngineInternal::ExtractEngine(arguments)); 392 auto engine(JsEngineInternal::ExtractEngine(arguments));
398 std::shared_ptr<StatTask> statTask;
399 std::string firstArgument;
400 try 393 try
401 { 394 {
402 if (arguments.Length() != 2) 395 if (arguments.Length() != 2)
403 { 396 {
404 throw std::runtime_error("_fileSystem.stat requires 2 parameters"); 397 throw std::runtime_error("_fileSystem.stat requires 2 parameters");
405 } 398 }
406 bool argumentIsString; 399 bool argumentIsString;
400 std::string firstArgument;
407 std::tie(argumentIsString, firstArgument) = ConvertString(arguments[0]); 401 std::tie(argumentIsString, firstArgument) = ConvertString(arguments[0]);
408 if (!argumentIsString) 402 if (!argumentIsString)
409 { 403 {
410 throw std::runtime_error("First argument to _fileSystem.stat must be a str ing"); 404 throw std::runtime_error("First argument to _fileSystem.stat must be a str ing");
411 } 405 }
412 if (!arguments[1]->IsFunction()) 406 if (!arguments[1]->IsFunction())
413 { 407 {
414 throw std::runtime_error("Second argument to _fileSystem.stat must be a fu nction"); 408 throw std::runtime_error("Second argument to _fileSystem.stat must be a fu nction");
415 } 409 }
410 // Run the task
411 StatTask statTask(engine, firstArgument,
412 V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function> ::Cast(arguments[1])));
413 engine->ScheduleTask(std::move(statTask), ImmediateSingleUseThread);
414 return v8::Undefined();
416 } 415 }
417 catch (const std::exception& e) 416 catch (const std::exception& e)
418 { 417 {
419 return v8::ThrowException(engine->ToV8String(e.what())); 418 return v8::ThrowException(engine->ToV8String(e.what()));
420 } 419 }
421 // Run the task
422 statTask = std::make_shared<StatTask>(engine, firstArgument,
423 V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function>:: Cast(arguments[1])));
424 engine->Schedule(AdblockPlus::MakeHeapFunction(statTask), AdblockPlus::Immedia teSingleUseThread);
425 return v8::Undefined();
426 } 420 }
427 421
428 v8::Handle<v8::Value> ResolveCallback(const v8::Arguments& arguments) 422 v8::Handle<v8::Value> ResolveCallback(const v8::Arguments& arguments)
429 { 423 {
430 auto engine(JsEngineInternal::ExtractEngine(arguments)); 424 auto engine(JsEngineInternal::ExtractEngine(arguments));
431 std::string firstArgument; 425 std::string firstArgument;
432 try 426 try
433 { 427 {
434 if (arguments.Length() != 1) 428 if (arguments.Length() != 1)
435 { 429 {
436 throw std::runtime_error("_fileSystem.resolve requires 1 parameter"); 430 throw std::runtime_error("_fileSystem.resolve requires 1 parameter");
437 } 431 }
438 bool argumentIsString; 432 bool argumentIsString;
439 std::tie(argumentIsString, firstArgument) = ConvertString(arguments[0]); 433 std::tie(argumentIsString, firstArgument) = ConvertString(arguments[0]);
440 if (!argumentIsString) 434 if (!argumentIsString)
441 { 435 {
442 throw std::runtime_error("First argument to _fileSystem.write must be a st ring"); 436 throw std::runtime_error("First argument to _fileSystem.write must be a st ring");
443 } 437 }
444 } 438 }
445 catch (const std::exception& e) 439 catch (const std::exception& e)
446 { 440 {
447 return v8::ThrowException(engine->ToV8String(e.what())); 441 return v8::ThrowException(engine->ToV8String(e.what()));
448 } 442 }
449 /* 443 /*
450 * Make sure to perform long-lived file system operation with engine unlocked. 444 * Make sure to perform long-lived file system operation with engine unlocked.
451 */ 445 */
452 std::string resolved = engine->GetFileSystem()->Resolve(firstArgument); 446 std::string resolved = engine->GetFileSystem()->Resolve(firstArgument);
453 return engine->ToV8String(resolved); 447 return engine->ToV8String(resolved);
454 } 448 }
OLDNEW
« no previous file with comments | « include/AdblockPlus/JsEngine.h ('k') | src/JsEngine.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld