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

Side by Side Diff: src/JsEngine.cpp

Issue 29369557: Issue #4692 - Rewrite I/O tasks to avoid engine self-reference
Patch Set: Created Dec. 28, 2016, 5:34 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 | « src/GlobalJsObject.cpp ('k') | src/JsEngineInternal.h » ('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
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 "GlobalJsObject.h" 20 #include "GlobalJsObject.h"
20 #include "JsContext.h" 21 #include "JsContext.h"
21 #include "JsEngineInternal.h" 22 #include "JsEngineInternal.h"
22 #include "JsEngineTransition.h" 23 #include "JsEngineTransition.h"
23 #include "JsError.h" 24 #include "JsError.h"
24 #include "Scheduler.h" 25 #include "Scheduler.h"
25 #include "Utils.h" 26 #include "Utils.h"
26 #include "WebRequestJsObject.h" 27 #include "WebRequestJsObject.h"
27 28
28 const AdblockPlus::ImmediateSingleUseThreadType AdblockPlus::ImmediateSingleUseT hread = {}; 29 const AdblockPlus::ImmediateSingleUseThreadType AdblockPlus::ImmediateSingleUseT hread = {};
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 JsEngineInternal::JsEngineInternal(const AdblockPlus::ScopedV8IsolatePtr& isolat e) 105 JsEngineInternal::JsEngineInternal(const AdblockPlus::ScopedV8IsolatePtr& isolat e)
105 : AdblockPlus::JsEngine(isolate), 106 : AdblockPlus::JsEngine(isolate),
106 context(isolate->Get(),v8::Context::New(isolate->Get())) 107 context(isolate->Get(),v8::Context::New(isolate->Get()))
107 { 108 {
108 /* 109 /*
109 * Enter v8 scope for our context so that we can initialize its global object. 110 * Enter v8 scope for our context so that we can initialize its global object.
110 */ 111 */
111 const v8::Context::Scope contextScope(GetContextAsLocal()); 112 const v8::Context::Scope contextScope(GetContextAsLocal());
112 auto globalObject = GetGlobalObject(); 113 auto globalObject = GetGlobalObject();
113 // Timeout 114 // Timeout
114 auto propertyName = AdblockPlus::Utils::ToV8String(GetIsolate(), "setTimeout") ; 115 globalObject->Set(ToV8String("setTimeout"), MakeCallback(::CallbackForSetTimeo ut));
115 globalObject->Set(propertyName, MakeCallback(::CallbackForSetTimeout));
116 // Web request 116 // Web request
117 auto auxiliaryObject = v8::Object::New(); 117 auto auxiliaryObject = v8::Object::New();
118 propertyName = AdblockPlus::Utils::ToV8String(GetIsolate(), "GET"); 118 auxiliaryObject->Set(ToV8String("GET"), MakeCallback(::GETCallback));
119 auxiliaryObject->Set(propertyName, MakeCallback(::GETCallback)); 119 globalObject->Set(ToV8String("_webRequest"), auxiliaryObject);
120 propertyName = AdblockPlus::Utils::ToV8String(GetIsolate(), "_webRequest"); 120 // File system I/O
121 globalObject->Set(propertyName, auxiliaryObject); 121 auxiliaryObject = v8::Object::New();
122 auxiliaryObject->Set(ToV8String("read"), MakeCallback(::ReadCallback));
123 auxiliaryObject->Set(ToV8String("write"), MakeCallback(::WriteCallback));
124 auxiliaryObject->Set(ToV8String("move"), MakeCallback(::MoveCallback));
125 auxiliaryObject->Set(ToV8String("remove"), MakeCallback(::RemoveCallback));
126 auxiliaryObject->Set(ToV8String("stat"), MakeCallback(::StatCallback));
127 auxiliaryObject->Set(ToV8String("resolve"), MakeCallback(::ResolveCallback));
128 globalObject->Set(ToV8String("_fileSystem"), auxiliaryObject);
129
122 // TODO: Move the rest of the global object initializations here 130 // TODO: Move the rest of the global object initializations here
123 } 131 }
124 132
125 /** 133 /**
126 * \par Design Notes 134 * \par Design Notes
127 * It is technically necessary to construct JsEngine instances *only* within a f actory. 135 * It is technically necessary to construct JsEngine instances *only* within a f actory.
128 * Initialization requires that certain transient v8 scopes be set up 136 * Initialization requires that certain transient v8 scopes be set up
129 * before initialization and torn down afterwards. 137 * before initialization and torn down afterwards.
130 * C++ has no syntax to use anything like a sentry object in the constructor its elf. 138 * C++ has no syntax to use anything like a sentry object in the constructor its elf.
131 * Thus we need to establish v8 scope within every C++ scope that constructs an object. 139 * Thus we need to establish v8 scope within every C++ scope that constructs an object.
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 v8::Local<v8::Function> JsEngineInternal::MakeCallback(v8::InvocationCallback ca llback) 306 v8::Local<v8::Function> JsEngineInternal::MakeCallback(v8::InvocationCallback ca llback)
299 { 307 {
300 return v8::FunctionTemplate::New(callback, v8::External::New(this))->GetFuncti on(); 308 return v8::FunctionTemplate::New(callback, v8::External::New(this))->GetFuncti on();
301 } 309 }
302 310
303 JsEngineInternal* JsEngineInternal::ExtractEngine(const v8::Arguments& arguments ) 311 JsEngineInternal* JsEngineInternal::ExtractEngine(const v8::Arguments& arguments )
304 { 312 {
305 return static_cast<JsEngineInternal*>(v8::Local<v8::External>::Cast(arguments. Data())->Value()); 313 return static_cast<JsEngineInternal*>(v8::Local<v8::External>::Cast(arguments. Data())->Value());
306 } 314 }
307 315
316 v8::Local<v8::String> JsEngineInternal::ToV8String(const std::string& s)
317 {
318 return AdblockPlus::Utils::ToV8String(GetIsolate(), s);
319 }
320
308 AdblockPlus::JsValueList AdblockPlus::JsEngine::ConvertArguments(const v8::Argum ents& arguments) 321 AdblockPlus::JsValueList AdblockPlus::JsEngine::ConvertArguments(const v8::Argum ents& arguments)
309 { 322 {
310 const JsContext context(shared_from_this()); 323 const JsContext context(shared_from_this());
311 JsValueList list; 324 JsValueList list;
312 for (int i = 0; i < arguments.Length(); i++) 325 for (int i = 0; i < arguments.Length(); i++)
313 list.push_back(JsValuePtr(new JsValue(shared_from_this(), arguments[i]))); 326 list.push_back(JsValuePtr(new JsValue(shared_from_this(), arguments[i])));
314 return list; 327 return list;
315 } 328 }
316 329
317 AdblockPlus::FileSystemPtr AdblockPlus::JsEngine::GetFileSystem() 330 AdblockPlus::FileSystemPtr AdblockPlus::JsEngine::GetFileSystem()
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 397
385 JsEngineInternal* ToInternal(AdblockPlus::JsEnginePtr p) 398 JsEngineInternal* ToInternal(AdblockPlus::JsEnginePtr p)
386 { 399 {
387 return static_cast<JsEngineInternal*>(p.get()); 400 return static_cast<JsEngineInternal*>(p.get());
388 } 401 }
389 402
390 JsEngineInternal* ToInternal(AdblockPlus::JsEngine* p) 403 JsEngineInternal* ToInternal(AdblockPlus::JsEngine* p)
391 { 404 {
392 return static_cast<JsEngineInternal*>(p); 405 return static_cast<JsEngineInternal*>(p);
393 } 406 }
OLDNEW
« no previous file with comments | « src/GlobalJsObject.cpp ('k') | src/JsEngineInternal.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld