| 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) |
| -{ |
| -} |