Index: extensions/renderer/api_activity_logger.cc |
diff --git a/extensions/renderer/api_activity_logger.cc b/extensions/renderer/api_activity_logger.cc |
index baaca3f2302c070ba35a48944855d01474dbaf5b..71cd1e4ac13cc3d385a0565af808f04be73d5de9 100644 |
--- a/extensions/renderer/api_activity_logger.cc |
+++ b/extensions/renderer/api_activity_logger.cc |
@@ -2,6 +2,8 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "extensions/renderer/api_activity_logger.h" |
+ |
#include <stddef.h> |
#include <string> |
@@ -11,8 +13,8 @@ |
#include "content/public/renderer/render_thread.h" |
#include "extensions/common/extension_messages.h" |
#include "extensions/renderer/activity_log_converter_strategy.h" |
-#include "extensions/renderer/api_activity_logger.h" |
#include "extensions/renderer/dispatcher.h" |
+#include "extensions/renderer/extensions_renderer_client.h" |
#include "extensions/renderer/script_context.h" |
namespace extensions { |
@@ -20,28 +22,45 @@ namespace extensions { |
APIActivityLogger::APIActivityLogger(ScriptContext* context, |
Dispatcher* dispatcher) |
: ObjectBackedNativeHandler(context), dispatcher_(dispatcher) { |
- RouteFunction("LogEvent", base::Bind(&APIActivityLogger::LogEvent, |
- base::Unretained(this))); |
- RouteFunction("LogAPICall", base::Bind(&APIActivityLogger::LogAPICall, |
- base::Unretained(this))); |
+ RouteFunction("LogEvent", base::Bind(&APIActivityLogger::LogForJS, |
+ base::Unretained(this), EVENT)); |
+ RouteFunction("LogAPICall", base::Bind(&APIActivityLogger::LogForJS, |
+ base::Unretained(this), APICALL)); |
} |
APIActivityLogger::~APIActivityLogger() {} |
// static |
void APIActivityLogger::LogAPICall( |
- const v8::FunctionCallbackInfo<v8::Value>& args) { |
- LogInternal(APICALL, args); |
-} |
+ v8::Local<v8::Context> context, |
+ const std::string& call_name, |
+ const std::vector<v8::Local<v8::Value>>& arguments) { |
+ const Dispatcher* dispatcher = |
+ ExtensionsRendererClient::Get()->GetDispatcher(); |
+ if (!dispatcher || // dispatcher can be null in unittests. |
+ !dispatcher->activity_logging_enabled()) { |
+ return; |
+ } |
-// static |
-void APIActivityLogger::LogEvent( |
- const v8::FunctionCallbackInfo<v8::Value>& args) { |
- LogInternal(EVENT, args); |
+ ScriptContext* script_context = |
+ ScriptContextSet::GetContextByV8Context(context); |
+ auto value_args = base::MakeUnique<base::ListValue>(); |
+ std::unique_ptr<content::V8ValueConverter> converter = |
+ content::V8ValueConverter::Create(); |
+ ActivityLogConverterStrategy strategy; |
+ converter->SetFunctionAllowed(true); |
+ converter->SetStrategy(&strategy); |
+ value_args->Reserve(arguments.size()); |
+ // TODO(devlin): This doesn't protect against custom properties, so it might |
+ // not perfectly reflect the passed arguments. |
+ for (const auto& arg : arguments) |
+ value_args->Append(converter->FromV8Value(arg, context)); |
+ |
+ LogInternal(APICALL, script_context->GetExtensionID(), call_name, |
+ std::move(value_args), std::string()); |
} |
-// static |
-void APIActivityLogger::LogInternal( |
+void APIActivityLogger::LogForJS( |
const CallType call_type, |
const v8::FunctionCallbackInfo<v8::Value>& args) { |
CHECK_GT(args.Length(), 2); |
@@ -52,38 +71,51 @@ void APIActivityLogger::LogInternal( |
if (!dispatcher_->activity_logging_enabled()) |
return; |
- std::string ext_id = *v8::String::Utf8Value(args[0]); |
- ExtensionHostMsg_APIActionOrEvent_Params params; |
- params.api_call = *v8::String::Utf8Value(args[1]); |
- if (args.Length() == 4) // Extras are optional. |
- params.extra = *v8::String::Utf8Value(args[3]); |
- else |
- params.extra = ""; |
+ v8::Isolate* isolate = args.GetIsolate(); |
+ v8::HandleScope handle_scope(isolate); |
+ v8::Local<v8::Context> context = isolate->GetCurrentContext(); |
+ |
+ std::string extension_id = *v8::String::Utf8Value(args[0]); |
+ std::string call_name = *v8::String::Utf8Value(args[1]); |
+ std::string extra; |
+ if (args.Length() == 4) { // Extras are optional. |
+ CHECK(args[3]->IsString()); |
+ extra = *v8::String::Utf8Value(args[3]); |
+ } |
- // Get the array of api call arguments. |
+ // Get the array of call arguments. |
+ auto arguments = base::MakeUnique<base::ListValue>(); |
v8::Local<v8::Array> arg_array = v8::Local<v8::Array>::Cast(args[2]); |
if (arg_array->Length() > 0) { |
+ arguments->Reserve(arg_array->Length()); |
std::unique_ptr<content::V8ValueConverter> converter = |
content::V8ValueConverter::Create(); |
ActivityLogConverterStrategy strategy; |
converter->SetFunctionAllowed(true); |
converter->SetStrategy(&strategy); |
- std::unique_ptr<base::ListValue> arg_list(new base::ListValue()); |
- for (size_t i = 0; i < arg_array->Length(); ++i) { |
- arg_list->Set( |
- i, |
- converter->FromV8Value(arg_array->Get(i), |
- args.GetIsolate()->GetCurrentContext())); |
- } |
- params.arguments.Swap(arg_list.get()); |
+ for (size_t i = 0; i < arg_array->Length(); ++i) |
+ arguments->Append(converter->FromV8Value(arg_array->Get(i), context)); |
} |
+ LogInternal(call_type, extension_id, call_name, std::move(arguments), extra); |
+} |
+ |
+// static |
+void APIActivityLogger::LogInternal(const CallType call_type, |
+ const std::string& extension_id, |
+ const std::string& call_name, |
+ std::unique_ptr<base::ListValue> arguments, |
+ const std::string& extra) { |
+ ExtensionHostMsg_APIActionOrEvent_Params params; |
+ params.api_call = call_name; |
+ params.arguments.Swap(arguments.get()); |
+ params.extra = extra; |
if (call_type == APICALL) { |
content::RenderThread::Get()->Send( |
- new ExtensionHostMsg_AddAPIActionToActivityLog(ext_id, params)); |
+ new ExtensionHostMsg_AddAPIActionToActivityLog(extension_id, params)); |
} else if (call_type == EVENT) { |
content::RenderThread::Get()->Send( |
- new ExtensionHostMsg_AddEventToActivityLog(ext_id, params)); |
+ new ExtensionHostMsg_AddEventToActivityLog(extension_id, params)); |
} |
} |