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-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 |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
13 * | 13 * |
14 * You should have received a copy of the GNU General Public License | 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/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
16 */ | 16 */ |
17 | 17 |
18 #include <AdblockPlus.h> | 18 #include <AdblockPlus.h> |
19 #include "FileSystemJsObject.h" | 19 #include "FileSystemJsObject.h" |
20 #include "GlobalJsObject.h" | 20 #include "GlobalJsObject.h" |
21 #include "JsContext.h" | 21 #include "JsContext.h" |
22 #include "JsEngineInternal.h" | 22 #include "JsEngineInternal.h" |
23 #include "JsEngineTransition.h" | 23 #include "JsEngineTransition.h" |
24 #include "JsError.h" | 24 #include "JsError.h" |
25 #include "Scheduler.h" | |
26 #include "Utils.h" | 25 #include "Utils.h" |
27 #include "WebRequestJsObject.h" | 26 #include "WebRequestJsObject.h" |
28 | 27 |
29 const AdblockPlus::ImmediateSingleUseThreadType AdblockPlus::ImmediateSingleUseT
hread = {}; | 28 const ImmediateSingleUseThreadType ImmediateSingleUseThread = {}; |
30 | |
31 class AdblockPlus::JsEngine::SchedulerImpl | |
32 : public SchedulerT<SingleUseWorker> | |
33 { | |
34 public: | |
35 SchedulerImpl() {} // = default; | |
36 }; | |
37 | 29 |
38 namespace | 30 namespace |
39 { | 31 { |
40 v8::Handle<v8::Script> CompileScript(v8::Isolate* isolate, | 32 v8::Handle<v8::Script> CompileScript(v8::Isolate* isolate, |
41 const std::string& source, const std::string& filename) | 33 const std::string& source, const std::string& filename) |
42 { | 34 { |
43 using AdblockPlus::Utils::ToV8String; | 35 using AdblockPlus::Utils::ToV8String; |
44 const v8::Handle<v8::String> v8Source = ToV8String(isolate, source); | 36 const v8::Handle<v8::String> v8Source = ToV8String(isolate, source); |
45 if (filename.length()) | 37 if (filename.length()) |
46 { | 38 { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 isolate = v8::Isolate::New(); | 83 isolate = v8::Isolate::New(); |
92 } | 84 } |
93 | 85 |
94 AdblockPlus::ScopedV8Isolate::~ScopedV8Isolate() | 86 AdblockPlus::ScopedV8Isolate::~ScopedV8Isolate() |
95 { | 87 { |
96 isolate->Dispose(); | 88 isolate->Dispose(); |
97 isolate = nullptr; | 89 isolate = nullptr; |
98 } | 90 } |
99 | 91 |
100 AdblockPlus::JsEngine::JsEngine(const ScopedV8IsolatePtr& isolate) | 92 AdblockPlus::JsEngine::JsEngine(const ScopedV8IsolatePtr& isolate) |
101 : isolate(isolate), | 93 : isolate(isolate) |
102 scheduler(new SchedulerImpl()) // TODO: make_unique once available | |
103 {} | 94 {} |
104 | 95 |
105 JsEngineInternal::JsEngineInternal(const AdblockPlus::ScopedV8IsolatePtr& isolat
e) | 96 JsEngineInternal::JsEngineInternal(const AdblockPlus::ScopedV8IsolatePtr& isolat
e) |
106 : AdblockPlus::JsEngine(isolate), | 97 : AdblockPlus::JsEngine(isolate), |
107 context(isolate->Get(),v8::Context::New(isolate->Get())) | 98 context(isolate->Get(),v8::Context::New(isolate->Get())) |
108 { | 99 { |
109 /* | 100 /* |
110 * Enter v8 scope for our context so that we can initialize its global object. | 101 * Enter v8 scope for our context so that we can initialize its global object. |
111 */ | 102 */ |
112 const v8::Context::Scope contextScope(GetContextAsLocal()); | 103 const v8::Context::Scope contextScope(GetContextAsLocal()); |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 void AdblockPlus::JsEngine::SetGlobalProperty(const std::string& name, | 366 void AdblockPlus::JsEngine::SetGlobalProperty(const std::string& name, |
376 AdblockPlus::JsValuePtr value) | 367 AdblockPlus::JsValuePtr value) |
377 { | 368 { |
378 JsContext jsContext(shared_from_this()); | 369 JsContext jsContext(shared_from_this()); |
379 auto global = GetGlobalObject(); | 370 auto global = GetGlobalObject(); |
380 if (!global) | 371 if (!global) |
381 throw std::runtime_error("Global object cannot be null"); | 372 throw std::runtime_error("Global object cannot be null"); |
382 global->SetProperty(name, value); | 373 global->SetProperty(name, value); |
383 } | 374 } |
384 | 375 |
385 void AdblockPlus::JsEngine::Schedule(std::function<void()> task, | 376 void JsEngineInternal::ScheduleTaskInternal(std::shared_ptr<TaskFunctionInterfac
e>&& body) |
386 AdblockPlus::ImmediateSingleUseThreadType) | |
387 { | 377 { |
388 // The present version of the scheduler only does immediate and single-use | 378 // The present version of the scheduler only does immediate and single-use |
389 // It does not, however, detach threads like the legacy thread behavior did. | 379 // It does not, however, detach threads like the legacy thread behavior did. |
390 scheduler->Run(task); | 380 scheduler.Run(Task(this, std::move(body))); |
391 } | 381 } |
392 | 382 |
393 void AdblockPlus::JsEngine::WaitForQuietScheduler() | 383 void JsEngineInternal::WaitForQuietScheduler() |
394 { | 384 { |
395 scheduler->JoinAll(); | 385 scheduler.JoinAll(); |
396 } | 386 } |
397 | 387 |
398 JsEngineInternal* ToInternal(AdblockPlus::JsEnginePtr p) | 388 JsEngineInternal* ToInternal(AdblockPlus::JsEnginePtr p) |
399 { | 389 { |
400 return static_cast<JsEngineInternal*>(p.get()); | 390 return static_cast<JsEngineInternal*>(p.get()); |
401 } | 391 } |
402 | 392 |
403 JsEngineInternal* ToInternal(AdblockPlus::JsEngine* p) | 393 JsEngineInternal* ToInternal(AdblockPlus::JsEngine* p) |
404 { | 394 { |
405 return static_cast<JsEngineInternal*>(p); | 395 return static_cast<JsEngineInternal*>(p); |
406 } | 396 } |
OLD | NEW |