| Index: src/ConsoleJsObject.cpp |
| =================================================================== |
| --- a/src/ConsoleJsObject.cpp |
| +++ b/src/ConsoleJsObject.cpp |
| @@ -11,43 +11,106 @@ |
| * 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/JsValue.h> |
| -#include <AdblockPlus/ErrorCallback.h> |
| +#include <AdblockPlus/LogSystem.h> |
| #include <sstream> |
| #include "ConsoleJsObject.h" |
| +#include "Utils.h" |
| namespace |
| { |
| - v8::Handle<v8::Value> ErrorCallback(const v8::Arguments& arguments) |
| + v8::Handle<v8::Value> DoLog(AdblockPlus::LogSystem::LogLevel logLevel, |
| + const v8::Arguments& arguments) |
| { |
| AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(arguments); |
| const AdblockPlus::JsEngine::Context context(jsEngine); |
| AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments); |
| std::stringstream message; |
| for (size_t i = 0; i < converted.size(); i++) |
| + { |
| + if (i > 0) |
| + message << " "; |
| message << converted[i]->AsString(); |
| + } |
| - AdblockPlus::ErrorCallbackPtr callback = jsEngine->GetErrorCallback(); |
| - (*callback)(message.str()); |
| + std::stringstream source; |
| + v8::Local<v8::StackFrame> frame = v8::StackTrace::CurrentStackTrace(1)->GetFrame(0); |
| + source << AdblockPlus::Utils::FromV8String(frame->GetScriptName()); |
| + source << ":" << frame->GetLineNumber(); |
| + |
| + AdblockPlus::LogSystemPtr callback = jsEngine->GetLogSystem(); |
| + (*callback)(logLevel, message.str(), source.str()); |
| return v8::Undefined(); |
| } |
| + v8::Handle<v8::Value> LogCallback(const v8::Arguments& arguments) |
| + { |
| + return DoLog(AdblockPlus::LogSystem::LOG, arguments); |
| + } |
| + |
| + v8::Handle<v8::Value> DebugCallback(const v8::Arguments& arguments) |
| + { |
| + return DoLog(AdblockPlus::LogSystem::LOG, arguments); |
| + } |
| + |
| + v8::Handle<v8::Value> InfoCallback(const v8::Arguments& arguments) |
| + { |
| + return DoLog(AdblockPlus::LogSystem::INFO, arguments); |
| + } |
| + |
| + v8::Handle<v8::Value> WarnCallback(const v8::Arguments& arguments) |
| + { |
| + return DoLog(AdblockPlus::LogSystem::WARN, arguments); |
| + } |
| + |
| + v8::Handle<v8::Value> ErrorCallback(const v8::Arguments& arguments) |
| + { |
| + return DoLog(AdblockPlus::LogSystem::ERROR, arguments); |
| + } |
| + |
| v8::Handle<v8::Value> TraceCallback(const v8::Arguments& arguments) |
| { |
| + AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(arguments); |
| + const AdblockPlus::JsEngine::Context context(jsEngine); |
| + AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments); |
| + |
| + std::stringstream traceback; |
| + v8::Local<v8::StackTrace> frames = v8::StackTrace::CurrentStackTrace(100); |
| + for (int i = 0, l = frames->GetFrameCount(); i < l; i++) |
| + { |
| + v8::Local<v8::StackFrame> frame = frames->GetFrame(i); |
| + traceback << (i + 1) << ": "; |
| + std::string name = AdblockPlus::Utils::FromV8String(frame->GetFunctionName()); |
| + if (name.size()) |
| + traceback << name; |
| + else |
| + traceback << "/* anonymous */"; |
| + traceback << "() at "; |
| + traceback << AdblockPlus::Utils::FromV8String(frame->GetScriptName()); |
| + traceback << ":" << frame->GetLineNumber(); |
| + traceback << std::endl; |
| + } |
| + |
| + AdblockPlus::LogSystemPtr callback = jsEngine->GetLogSystem(); |
| + (*callback)(AdblockPlus::LogSystem::TRACE, traceback.str(), ""); |
| return v8::Undefined(); |
| } |
| } |
| AdblockPlus::JsValuePtr AdblockPlus::ConsoleJsObject::Setup( |
| AdblockPlus::JsEnginePtr jsEngine, AdblockPlus::JsValuePtr obj) |
| { |
| + obj->SetProperty("log", jsEngine->NewCallback(::LogCallback)); |
| + obj->SetProperty("debug", jsEngine->NewCallback(::DebugCallback)); |
| + obj->SetProperty("info", jsEngine->NewCallback(::InfoCallback)); |
| + obj->SetProperty("warn", jsEngine->NewCallback(::WarnCallback)); |
| obj->SetProperty("error", jsEngine->NewCallback(::ErrorCallback)); |
| obj->SetProperty("trace", jsEngine->NewCallback(::TraceCallback)); |
| return obj; |
| } |