blob: 495556181de78a8b14f72f034a5e6d8bd082d26d [file] [log] [blame]
// Copyright 2017 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.
package org.chromium.components.crash.browser;
import org.chromium.base.Log;
import org.chromium.base.ThreadUtils;
import org.chromium.base.annotations.CalledByNative;
import java.io.File;
/**
* A Java-side bridge for continuing the upload processing for child process crash minidumps.
*/
public class CrashDumpManager {
private static final String TAG = "CrashDumpManager";
/**
* An interface for providing a callback that will try to upload a minidump. The callback should
* be registered on, and will be run on, the UI thread.
*/
public interface UploadMinidumpCallback { public void tryToUploadMinidump(File minidump); }
/**
* The globally registered callback for uploading minidumps, or null if no callback has been
* registered yet.
*/
private static UploadMinidumpCallback sCallback;
/**
* Registers a callback for uploading minidumps. May be called at most once, and only on the UI
* thread.
*
* @param callback The callback to trigger when a new minidump is generated by a child process.
*/
public static void registerUploadCallback(UploadMinidumpCallback callback) {
ThreadUtils.assertOnUiThread();
assert sCallback == null;
sCallback = callback;
}
/**
* Attempts to upload the specified child process minidump (or a no-op if no observer has been
* registered).
*
* @param minidumpPath The file path for the generated minidump.
*/
@CalledByNative
public static void tryToUploadMinidump(String minidumpPath) {
// The C++ code that calls into this method should be running on a background thread. It's
// important to be off the UI thread for the file operations done below.
ThreadUtils.assertOnBackgroundThread();
if (minidumpPath == null) {
Log.e(TAG, "Minidump path should be non-null! Bailing...");
return;
}
final File minidump = new File(minidumpPath);
if (!minidump.exists() || !minidump.isFile()) {
Log.e(TAG,
"Minidump path '" + minidumpPath
+ "' should describe a file that exists! Bailing...");
return;
}
// The callback should only be accessed on the UI thread.
ThreadUtils.postOnUiThread(new Runnable() {
@Override
public void run() {
if (sCallback == null) {
Log.w(TAG, "Ignoring crash observed before a callback was registered...");
return;
}
sCallback.tryToUploadMinidump(minidump);
}
});
}
}