// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "content/browser/android/tracing_controller_android.h" #include "base/android/jni_android.h" #include "base/android/jni_string.h" #include "base/debug/trace_event.h" #include "base/logging.h" #include "content/public/browser/tracing_controller.h" #include "jni/TracingControllerAndroid_jni.h" namespace content { static jlong Init(JNIEnv* env, jobject obj) { TracingControllerAndroid* profiler = new TracingControllerAndroid(env, obj); return reinterpret_cast(profiler); } TracingControllerAndroid::TracingControllerAndroid(JNIEnv* env, jobject obj) : weak_java_object_(env, obj), weak_factory_(this) {} TracingControllerAndroid::~TracingControllerAndroid() {} void TracingControllerAndroid::Destroy(JNIEnv* env, jobject obj) { delete this; } bool TracingControllerAndroid::StartTracing(JNIEnv* env, jobject obj, jstring jfilename, jstring jcategories, jboolean record_continuously) { file_path_ = base::FilePath( base::android::ConvertJavaStringToUTF8(env, jfilename)); std::string categories = base::android::ConvertJavaStringToUTF8(env, jcategories); // This log is required by adb_profile_chrome.py. LOG(WARNING) << "Logging performance trace to file: " << file_path_.value(); return TracingController::GetInstance()->EnableRecording( categories, record_continuously ? TracingController::RECORD_CONTINUOUSLY : TracingController::DEFAULT_OPTIONS, TracingController::EnableRecordingDoneCallback()); } void TracingControllerAndroid::StopTracing(JNIEnv* env, jobject obj) { if (!TracingController::GetInstance()->DisableRecording( file_path_, base::Bind(&TracingControllerAndroid::OnTracingStopped, weak_factory_.GetWeakPtr()))) { LOG(ERROR) << "EndTracingAsync failed, forcing an immediate stop"; OnTracingStopped(file_path_); } } void TracingControllerAndroid::OnTracingStopped( const base::FilePath& file_path) { JNIEnv* env = base::android::AttachCurrentThread(); base::android::ScopedJavaLocalRef obj = weak_java_object_.get(env); if (obj.obj()) Java_TracingControllerAndroid_onTracingStopped(env, obj.obj()); } static jstring GetDefaultCategories(JNIEnv* env, jobject obj) { return base::android::ConvertUTF8ToJavaString(env, base::debug::CategoryFilter::kDefaultCategoryFilterString).Release(); } bool RegisterTracingControllerAndroid(JNIEnv* env) { return RegisterNativesImpl(env); } } // namespace content