Index: src/JsEngine.cpp |
=================================================================== |
--- a/src/JsEngine.cpp |
+++ b/src/JsEngine.cpp |
@@ -11,19 +11,20 @@ |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
* GNU General Public License for more details. |
* |
* You should have received a copy of the GNU General Public License |
* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
*/ |
#include <AdblockPlus.h> |
-#include <sstream> |
#include "GlobalJsObject.h" |
+#include "JsContext.h" |
+#include "JsError.h" |
#include "Utils.h" |
namespace |
{ |
v8::Handle<v8::Script> CompileScript(const std::string& source, const std::string& filename) |
{ |
const v8::Handle<v8::String> v8Source = v8::String::New(source.c_str()); |
if (filename.length()) |
@@ -35,61 +36,40 @@ namespace |
return v8::Script::Compile(v8Source); |
} |
void CheckTryCatch(const v8::TryCatch& tryCatch) |
{ |
if (tryCatch.HasCaught()) |
throw AdblockPlus::JsError(tryCatch.Exception(), tryCatch.Message()); |
} |
- |
- std::string ExceptionToString(const v8::Handle<v8::Value> exception, |
- const v8::Handle<v8::Message> message) |
- { |
- std::stringstream error; |
- error << *v8::String::Utf8Value(exception); |
- if (!message.IsEmpty()) |
- { |
- error << " at "; |
- error << *v8::String::Utf8Value(message->GetScriptResourceName()); |
- error << ":"; |
- error << message->GetLineNumber(); |
- } |
- return error.str(); |
- } |
-} |
- |
-AdblockPlus::JsError::JsError(const v8::Handle<v8::Value> exception, |
- const v8::Handle<v8::Message> message) |
- : std::runtime_error(ExceptionToString(exception, message)) |
-{ |
} |
AdblockPlus::JsEngine::JsEngine() |
: isolate(v8::Isolate::GetCurrent()) |
{ |
} |
AdblockPlus::JsEnginePtr AdblockPlus::JsEngine::New(const AppInfo& appInfo) |
{ |
JsEnginePtr result(new JsEngine()); |
const v8::Locker locker(result->isolate); |
const v8::HandleScope handleScope; |
- result->context = v8::Context::New(); |
+ result->context.reset(result->isolate, v8::Context::New()); |
AdblockPlus::GlobalJsObject::Setup(result, appInfo, |
JsValuePtr(new JsValue(result, result->context->Global()))); |
return result; |
} |
AdblockPlus::JsValuePtr AdblockPlus::JsEngine::Evaluate(const std::string& source, |
const std::string& filename) |
{ |
- const Context context(shared_from_this()); |
+ const JsContext context(shared_from_this()); |
const v8::TryCatch tryCatch; |
const v8::Handle<v8::Script> script = CompileScript(source, filename); |
CheckTryCatch(tryCatch); |
v8::Local<v8::Value> result = script->Run(); |
CheckTryCatch(tryCatch); |
return JsValuePtr(new JsValue(shared_from_this(), result)); |
} |
@@ -113,43 +93,43 @@ void AdblockPlus::JsEngine::TriggerEvent |
void AdblockPlus::JsEngine::Gc() |
{ |
while (!v8::V8::IdleNotification()); |
} |
AdblockPlus::JsValuePtr AdblockPlus::JsEngine::NewValue(const std::string& val) |
{ |
- const Context context(shared_from_this()); |
+ const JsContext context(shared_from_this()); |
return JsValuePtr(new JsValue(shared_from_this(), |
v8::String::New(val.c_str(), val.length()))); |
} |
AdblockPlus::JsValuePtr AdblockPlus::JsEngine::NewValue(int64_t val) |
{ |
- const Context context(shared_from_this()); |
+ const JsContext context(shared_from_this()); |
return JsValuePtr(new JsValue(shared_from_this(), v8::Number::New(val))); |
} |
AdblockPlus::JsValuePtr AdblockPlus::JsEngine::NewValue(bool val) |
{ |
- const Context context(shared_from_this()); |
+ const JsContext context(shared_from_this()); |
return JsValuePtr(new JsValue(shared_from_this(), v8::Boolean::New(val))); |
} |
AdblockPlus::JsValuePtr AdblockPlus::JsEngine::NewObject() |
{ |
- const Context context(shared_from_this()); |
+ const JsContext context(shared_from_this()); |
return JsValuePtr(new JsValue(shared_from_this(), v8::Object::New())); |
} |
AdblockPlus::JsValuePtr AdblockPlus::JsEngine::NewCallback( |
v8::InvocationCallback callback) |
{ |
- const Context context(shared_from_this()); |
+ const JsContext context(shared_from_this()); |
// Note: we are leaking this weak pointer, no obvious way to destroy it when |
// it's no longer used |
std::tr1::weak_ptr<JsEngine>* data = |
new std::tr1::weak_ptr<JsEngine>(shared_from_this()); |
v8::Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(callback, |
v8::External::New(data)); |
return JsValuePtr(new JsValue(shared_from_this(), templ->GetFunction())); |
@@ -164,17 +144,17 @@ AdblockPlus::JsEnginePtr AdblockPlus::Js |
JsEnginePtr result = data->lock(); |
if (!result) |
throw std::runtime_error("Oops, our JsEngine is gone, how did that happen?"); |
return result; |
} |
AdblockPlus::JsValueList AdblockPlus::JsEngine::ConvertArguments(const v8::Arguments& arguments) |
{ |
- const Context context(shared_from_this()); |
+ const JsContext context(shared_from_this()); |
JsValueList list; |
for (int i = 0; i < arguments.Length(); i++) |
list.push_back(JsValuePtr(new JsValue(shared_from_this(), arguments[i]))); |
return list; |
} |
AdblockPlus::FileSystemPtr AdblockPlus::JsEngine::GetFileSystem() |
{ |
@@ -215,14 +195,8 @@ AdblockPlus::LogSystemPtr AdblockPlus::J |
void AdblockPlus::JsEngine::SetLogSystem(AdblockPlus::LogSystemPtr val) |
{ |
if (!val) |
throw std::runtime_error("LogSystem cannot be null"); |
logSystem = val; |
} |
- |
-AdblockPlus::JsEngine::Context::Context(const JsEnginePtr jsEngine) |
- : locker(jsEngine->isolate), handleScope(), |
- contextScope(jsEngine->context) |
-{ |
-} |