Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / content / browser / android / tracing_controller_android.cc
index cfa540d..42f4b0c 100644 (file)
@@ -6,44 +6,22 @@
 
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
-#include "base/command_line.h"
 #include "base/debug/trace_event.h"
-#include "base/files/file_path.h"
+#include "base/json/json_writer.h"
 #include "base/logging.h"
-#include "content/browser/tracing/trace_subscriber_stdio.h"
-#include "content/public/browser/trace_controller.h"
+#include "content/public/browser/tracing_controller.h"
 #include "jni/TracingControllerAndroid_jni.h"
 
 namespace content {
 
-static jint Init(JNIEnv* env, jobject obj) {
+static jlong Init(JNIEnv* env, jobject obj) {
   TracingControllerAndroid* profiler = new TracingControllerAndroid(env, obj);
-  return reinterpret_cast<jint>(profiler);
+  return reinterpret_cast<intptr_t>(profiler);
 }
 
-class TracingControllerAndroid::Subscriber
-    : public content::TraceSubscriberStdio {
- public:
-  Subscriber(TracingControllerAndroid* profiler, const base::FilePath& path)
-      : TraceSubscriberStdio(path, FILE_TYPE_ARRAY, false),
-        profiler_(profiler) {}
-
-  void set_profiler(TracingControllerAndroid* profiler) {
-    CHECK(!profiler_);
-    profiler_ = profiler;
-  }
-
-  virtual void OnEndTracingComplete() OVERRIDE {
-    TraceSubscriberStdio::OnEndTracingComplete();
-    profiler_->OnTracingStopped();
-  }
-
- private:
-  TracingControllerAndroid* profiler_;
-};
-
 TracingControllerAndroid::TracingControllerAndroid(JNIEnv* env, jobject obj)
-    : weak_java_object_(env, obj) {}
+    : weak_java_object_(env, obj),
+      weak_factory_(this) {}
 
 TracingControllerAndroid::~TracingControllerAndroid() {}
 
@@ -53,42 +31,77 @@ void TracingControllerAndroid::Destroy(JNIEnv* env, jobject obj) {
 
 bool TracingControllerAndroid::StartTracing(JNIEnv* env,
                                             jobject obj,
-                                            jstring jfilename,
                                             jstring jcategories,
-                                            jboolean record_continuously) {
-  if (subscriber_.get()) {
-    return false;
-  }
-  std::string filename = base::android::ConvertJavaStringToUTF8(env, jfilename);
+                                            jstring jtraceoptions) {
   std::string categories =
       base::android::ConvertJavaStringToUTF8(env, jcategories);
-  subscriber_.reset(new Subscriber(this, base::FilePath(filename)));
-  return TraceController::GetInstance()->BeginTracing(
-      subscriber_.get(),
-      categories,
-      record_continuously ? base::debug::TraceLog::RECORD_CONTINUOUSLY
-                          : base::debug::TraceLog::RECORD_UNTIL_FULL);
+  base::debug::TraceOptions trace_options;
+  trace_options.SetFromString(
+      base::android::ConvertJavaStringToUTF8(env, jtraceoptions));
+
+  // This log is required by adb_profile_chrome.py.
+  LOG(WARNING) << "Logging performance trace to file";
+
+  return TracingController::GetInstance()->EnableRecording(
+      base::debug::CategoryFilter(categories),
+      trace_options,
+      TracingController::EnableRecordingDoneCallback());
 }
 
-void TracingControllerAndroid::StopTracing(JNIEnv* env, jobject obj) {
-  if (!subscriber_.get()) {
-    return;
-  }
-  TraceController* controller = TraceController::GetInstance();
-  if (!controller->EndTracingAsync(subscriber_.get())) {
+void TracingControllerAndroid::StopTracing(JNIEnv* env,
+                                           jobject obj,
+                                           jstring jfilepath) {
+  base::FilePath file_path(
+      base::android::ConvertJavaStringToUTF8(env, jfilepath));
+  if (!TracingController::GetInstance()->DisableRecording(
+      file_path,
+      base::Bind(&TracingControllerAndroid::OnTracingStopped,
+                 weak_factory_.GetWeakPtr()))) {
     LOG(ERROR) << "EndTracingAsync failed, forcing an immediate stop";
-    controller->CancelSubscriber(subscriber_.get());
-    OnTracingStopped();
+    OnTracingStopped(file_path);
   }
 }
 
-void TracingControllerAndroid::OnTracingStopped() {
+void TracingControllerAndroid::GenerateTracingFilePath(
+    base::FilePath* file_path) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  ScopedJavaLocalRef<jstring> jfilename =
+      Java_TracingControllerAndroid_generateTracingFilePath(env);
+  *file_path = base::FilePath(
+      base::android::ConvertJavaStringToUTF8(env, jfilename.obj()));
+}
+
+void TracingControllerAndroid::OnTracingStopped(
+    const base::FilePath& file_path) {
   JNIEnv* env = base::android::AttachCurrentThread();
   base::android::ScopedJavaLocalRef<jobject> obj = weak_java_object_.get(env);
-  if (obj.obj()) {
+  if (obj.obj())
     Java_TracingControllerAndroid_onTracingStopped(env, obj.obj());
+}
+
+bool TracingControllerAndroid::GetKnownCategoryGroupsAsync(JNIEnv* env,
+                                                           jobject obj) {
+  if (!TracingController::GetInstance()->GetCategories(
+          base::Bind(&TracingControllerAndroid::OnKnownCategoriesReceived,
+                     weak_factory_.GetWeakPtr()))) {
+    return false;
   }
-  subscriber_.reset();
+  return true;
+}
+
+void TracingControllerAndroid::OnKnownCategoriesReceived(
+    const std::set<std::string>& categories_received) {
+  scoped_ptr<base::ListValue> category_list(new base::ListValue());
+  for (std::set<std::string>::const_iterator it = categories_received.begin();
+       it != categories_received.end();
+       ++it) {
+    category_list->AppendString(*it);
+  }
+  std::string received_category_list;
+  base::JSONWriter::Write(category_list.get(), &received_category_list);
+
+  // This log is required by adb_profile_chrome.py.
+  LOG(WARNING) << "{\"traceCategoriesList\": " << received_category_list << "}";
 }
 
 static jstring GetDefaultCategories(JNIEnv* env, jobject obj) {