Commit 94bb50fa authored by Chris Whelan's avatar Chris Whelan Committed by Commit Bot

[fuchsia] Refactors chromecast/crash to be usable on Fuchsia

Cast is not respnsible for uploading crash dumps on Fuchsia, so
app_state_tracker needs to work with different annotation storing
backends.

Bug: b/67907746
Test: Build
Change-Id: I5cd6a13f9e642cdbf940cc8ada5dd76663e793e2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2083956
Commit-Queue: Christopher Whelan <chwhelan@google.com>
Reviewed-by: default avatarRobert Sesek <rsesek@chromium.org>
Reviewed-by: default avatarMichael Spang <spang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#749388}
parent f4733192
...@@ -54,7 +54,6 @@ cast_source_set("cast_crash_client") { ...@@ -54,7 +54,6 @@ cast_source_set("cast_crash_client") {
] ]
if (!is_fuchsia) { if (!is_fuchsia) {
# TODO(crbug.com/753619): Enable crash reporting on Fuchsia.
deps += [ deps += [
"//chromecast/crash", "//chromecast/crash",
"//components/crash/content/app", "//components/crash/content/app",
...@@ -98,7 +97,6 @@ cast_source_set("unittests") { ...@@ -98,7 +97,6 @@ cast_source_set("unittests") {
if (!is_fuchsia) { if (!is_fuchsia) {
deps += [ deps += [
# TODO(crbug.com/753619): Enable crash reporting on Fuchsia.
":cast_crash_client", ":cast_crash_client",
"//chromecast/crash", "//chromecast/crash",
"//chromecast/crash:test_support", "//chromecast/crash:test_support",
......
...@@ -5,71 +5,105 @@ ...@@ -5,71 +5,105 @@
import("//chromecast/chromecast.gni") import("//chromecast/chromecast.gni")
import("//testing/test.gni") import("//testing/test.gni")
# Crash reporting is not support on Fuchsia yet cast_source_set("crash_storage") {
# TODO(crbug.com/753619): Enable crash reporting on Fuchsia.
assert(!is_fuchsia)
cast_source_set("crash") {
sources = [ sources = [
"app_state_tracker.cc",
"app_state_tracker.h",
"cast_crash_keys.cc", "cast_crash_keys.cc",
"cast_crash_keys.h", "cast_crash_keys.h",
"cast_crashdump_uploader.cc", "cast_crash_storage.h",
"cast_crashdump_uploader.h",
"linux/crash_util.cc",
"linux/crash_util.h",
"linux/dummy_minidump_generator.cc",
"linux/dummy_minidump_generator.h",
"linux/dump_info.cc",
"linux/dump_info.h",
"linux/minidump_generator.h",
"linux/minidump_params.cc",
"linux/minidump_params.h",
"linux/minidump_uploader.cc",
"linux/minidump_uploader.h",
"linux/minidump_writer.cc",
"linux/minidump_writer.h",
"linux/synchronized_minidump_manager.cc",
"linux/synchronized_minidump_manager.h",
] ]
deps = [ if (is_fuchsia) {
"//base", sources += [
"//chromecast/base", "cast_crash_storage_fuchsia.cc",
"//chromecast/base:cast_sys_info_util", "fuchsia/cast_crash_storage_impl_fuchsia.cc",
"//chromecast/base:cast_version", "fuchsia/cast_crash_storage_impl_fuchsia.h",
"//components/crash/core/common", ]
"//components/metrics",
"//components/prefs",
"//third_party/breakpad:client",
]
}
cast_executable("crash_uploader") { deps = [ "//base" ]
sources = [ "linux/crash_uploader.cc" ] } else {
sources += [
"cast_crash_storage.cc",
"cast_crash_storage_impl.cc",
"cast_crash_storage_impl.h",
]
deps = [ deps = [
":crash", "//base",
"//base", "//components/crash/core/common",
"//chromecast/base", ]
"//chromecast/base:default_create_sys_info", }
"//chromecast/public",
"//chromecast/system/reboot:reboot_util",
]
} }
cast_source_set("test_support") { cast_source_set("crash") {
sources = [ sources = [
"linux/crash_testing_utils.cc", "app_state_tracker.cc",
"linux/crash_testing_utils.h", "app_state_tracker.h",
] ]
deps = [ deps = [
":crash", ":crash_storage",
"//base", "//base",
"//chromecast/base",
] ]
if (!is_fuchsia) {
sources += [
"cast_crashdump_uploader.cc",
"cast_crashdump_uploader.h",
"linux/crash_util.cc",
"linux/crash_util.h",
"linux/dummy_minidump_generator.cc",
"linux/dummy_minidump_generator.h",
"linux/dump_info.cc",
"linux/dump_info.h",
"linux/minidump_generator.h",
"linux/minidump_params.cc",
"linux/minidump_params.h",
"linux/minidump_uploader.cc",
"linux/minidump_uploader.h",
"linux/minidump_writer.cc",
"linux/minidump_writer.h",
"linux/synchronized_minidump_manager.cc",
"linux/synchronized_minidump_manager.h",
]
deps += [
"//chromecast/base",
"//chromecast/base:cast_sys_info_util",
"//chromecast/base:cast_version",
"//components/crash/core/common",
"//components/metrics",
"//components/prefs",
"//third_party/breakpad:client",
]
}
}
if (!is_fuchsia) {
cast_executable("crash_uploader") {
sources = [ "linux/crash_uploader.cc" ]
deps = [
":crash",
"//base",
"//chromecast/base",
"//chromecast/base:default_create_sys_info",
"//chromecast/public",
"//chromecast/system/reboot:reboot_util",
]
}
cast_source_set("test_support") {
sources = [
"linux/crash_testing_utils.cc",
"linux/crash_testing_utils.h",
]
deps = [
":crash",
"//base",
"//chromecast/base",
]
}
} }
if (is_linux) { if (is_linux) {
......
...@@ -5,8 +5,7 @@ ...@@ -5,8 +5,7 @@
#include "chromecast/crash/app_state_tracker.h" #include "chromecast/crash/app_state_tracker.h"
#include "base/no_destructor.h" #include "base/no_destructor.h"
#include "chromecast/crash/cast_crash_keys.h" #include "chromecast/crash/cast_crash_storage.h"
#include "components/crash/core/common/crash_key.h"
namespace { namespace {
...@@ -49,8 +48,7 @@ std::string AppStateTracker::GetStadiaSessionId() { ...@@ -49,8 +48,7 @@ std::string AppStateTracker::GetStadiaSessionId() {
// static // static
void AppStateTracker::SetLastLaunchedApp(const std::string& app_id) { void AppStateTracker::SetLastLaunchedApp(const std::string& app_id) {
GetAppState()->last_launched_app = app_id; GetAppState()->last_launched_app = app_id;
CastCrashStorage::GetInstance()->SetLastLaunchedApp(app_id);
crash_keys::last_app.Set(app_id);
} }
// static // static
...@@ -59,20 +57,24 @@ void AppStateTracker::SetCurrentApp(const std::string& app_id) { ...@@ -59,20 +57,24 @@ void AppStateTracker::SetCurrentApp(const std::string& app_id) {
app_state->previous_app = app_state->current_app; app_state->previous_app = app_state->current_app;
app_state->current_app = app_id; app_state->current_app = app_id;
static crash_reporter::CrashKeyString<64> current_app("current_app"); CastCrashStorage::GetInstance()->SetCurrentApp(app_id);
current_app.Set(app_id); CastCrashStorage::GetInstance()->SetPreviousApp(app_state->previous_app);
}
crash_keys::previous_app.Set(app_state->previous_app); // static
void AppStateTracker::SetPreviousApp(const std::string& app_id) {
GetAppState()->previous_app = app_id;
CastCrashStorage::GetInstance()->SetPreviousApp(app_id);
} }
// static // static
void AppStateTracker::SetStadiaSessionId(const std::string& stadia_session_id) { void AppStateTracker::SetStadiaSessionId(const std::string& stadia_session_id) {
if (!stadia_session_id.empty()) { if (!stadia_session_id.empty()) {
GetAppState()->stadia_session_id = stadia_session_id; GetAppState()->stadia_session_id = stadia_session_id;
crash_keys::stadia_session_id.Set(stadia_session_id); CastCrashStorage::GetInstance()->SetStadiaSessionId(stadia_session_id);
} else { } else {
GetAppState()->stadia_session_id.clear(); GetAppState()->stadia_session_id.clear();
crash_keys::stadia_session_id.Clear(); CastCrashStorage::GetInstance()->ClearStadiaSessionId();
} }
} }
......
...@@ -17,6 +17,9 @@ class AppStateTracker { ...@@ -17,6 +17,9 @@ class AppStateTracker {
// The current app becomes the previous app, |app_id| becomes the current app. // The current app becomes the previous app, |app_id| becomes the current app.
static void SetCurrentApp(const std::string& app_id); static void SetCurrentApp(const std::string& app_id);
// Record |app_id| as the previous app.
static void SetPreviousApp(const std::string& app_id);
// Set the Stadia session ID, when a Stadia session starts running. // Set the Stadia session ID, when a Stadia session starts running.
// Clear the Stadia session ID by passing in an empty string // Clear the Stadia session ID by passing in an empty string
static void SetStadiaSessionId(const std::string& stadia_session_id); static void SetStadiaSessionId(const std::string& stadia_session_id);
......
...@@ -7,11 +7,13 @@ ...@@ -7,11 +7,13 @@
namespace chromecast { namespace chromecast {
namespace crash_keys { namespace crash_keys {
crash_reporter::CrashKeyString<64> last_app("last_app"); const char kLastApp[] = "last_app";
crash_reporter::CrashKeyString<64> previous_app("previous_app"); const char kCurrentApp[] = "current_app";
crash_reporter::CrashKeyString<64> stadia_session_id("stadia_session_id"); const char kPreviousApp[] = "previous_app";
const char kStadiaSessionId[] = "stadia_session_id";
} // namespace crash_keys } // namespace crash_keys
} // namespace chromecast } // namespace chromecast
...@@ -5,16 +5,17 @@ ...@@ -5,16 +5,17 @@
#ifndef CHROMECAST_CRASH_CAST_CRASH_KEYS_H_ #ifndef CHROMECAST_CRASH_CAST_CRASH_KEYS_H_
#define CHROMECAST_CRASH_CAST_CRASH_KEYS_H_ #define CHROMECAST_CRASH_CAST_CRASH_KEYS_H_
#include "components/crash/core/common/crash_key.h"
namespace chromecast { namespace chromecast {
namespace crash_keys { namespace crash_keys {
extern crash_reporter::CrashKeyString<64> last_app; // Names of crash keys to be shared by multiple platforms.
extern const char kLastApp[];
extern const char kCurrentApp[];
extern crash_reporter::CrashKeyString<64> previous_app; extern const char kPreviousApp[];
extern crash_reporter::CrashKeyString<64> stadia_session_id; extern const char kStadiaSessionId[];
} // namespace crash_keys } // namespace crash_keys
} // namespace chromecast } // namespace chromecast
......
// Copyright 2020 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 "chromecast/crash/cast_crash_storage.h"
#include "base/no_destructor.h"
#include "chromecast/crash/cast_crash_storage_impl.h"
namespace chromecast {
CastCrashStorage* CastCrashStorage::GetInstance() {
static base::NoDestructor<CastCrashStorageImpl> storage;
return storage.get();
}
} // namespace chromecast
// Copyright 2020 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.
#ifndef CHROMECAST_CASH_CAST_CRASH_STORAGE_H_
#define CHROMECAST_CASH_CAST_CRASH_STORAGE_H_
#include "base/strings/string_piece.h"
namespace chromecast {
// Stores crash key annotations.
// This is used to provide indirection for platform dependent storage
// implementations.
class CastCrashStorage {
public:
static CastCrashStorage* GetInstance();
CastCrashStorage() = default;
virtual ~CastCrashStorage() = default;
virtual void SetLastLaunchedApp(base::StringPiece app_id) = 0;
virtual void ClearLastLaunchedApp() = 0;
virtual void SetCurrentApp(base::StringPiece app_id) = 0;
virtual void ClearCurrentApp() = 0;
virtual void SetPreviousApp(base::StringPiece app_id) = 0;
virtual void ClearPreviousApp() = 0;
virtual void SetStadiaSessionId(base::StringPiece session_id) = 0;
virtual void ClearStadiaSessionId() = 0;
};
} // namespace chromecast
#endif // CHROMECAST_CASH_CAST_CRASH_STORAGE_H_
// Copyright 2020 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 "chromecast/crash/cast_crash_storage.h"
#include "base/no_destructor.h"
#include "chromecast/crash/fuchsia/cast_crash_storage_impl_fuchsia.h"
namespace chromecast {
CastCrashStorage* CastCrashStorage::GetInstance() {
static base::NoDestructor<CastCrashStorageImplFuchsia> storage;
return storage.get();
}
} // namespace chromecast
// Copyright 2020 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 "chromecast/crash/cast_crash_storage_impl.h"
#include "chromecast/crash/cast_crash_keys.h"
#include "components/crash/core/common/crash_key.h"
namespace chromecast {
namespace {
crash_reporter::CrashKeyString<64> last_app(crash_keys::kLastApp);
crash_reporter::CrashKeyString<64> current_app(crash_keys::kCurrentApp);
crash_reporter::CrashKeyString<64> previous_app(crash_keys::kPreviousApp);
crash_reporter::CrashKeyString<64> stadia_session_id(
crash_keys::kStadiaSessionId);
} // namespace
CastCrashStorageImpl::CastCrashStorageImpl() = default;
CastCrashStorageImpl::~CastCrashStorageImpl() = default;
void CastCrashStorageImpl::SetLastLaunchedApp(base::StringPiece app_id) {
last_app.Set(app_id);
}
void CastCrashStorageImpl::ClearLastLaunchedApp() {
last_app.Clear();
}
void CastCrashStorageImpl::SetCurrentApp(base::StringPiece app_id) {
current_app.Set(app_id);
}
void CastCrashStorageImpl::ClearCurrentApp() {
current_app.Clear();
}
void CastCrashStorageImpl::SetPreviousApp(base::StringPiece app_id) {
previous_app.Set(app_id);
}
void CastCrashStorageImpl::ClearPreviousApp() {
previous_app.Clear();
}
void CastCrashStorageImpl::SetStadiaSessionId(base::StringPiece session_id) {
stadia_session_id.Set(session_id);
}
void CastCrashStorageImpl::ClearStadiaSessionId() {
stadia_session_id.Clear();
}
} // namespace chromecast
// Copyright 2020 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.
#ifndef CHROMECAST_CRASH_CAST_CRASH_STORAGE_DEFAULT_H_
#define CHROMECAST_CRASH_CAST_CRASH_STORAGE_DEFAULT_H_
#include "chromecast/crash/cast_crash_storage.h"
namespace chromecast {
class CastCrashStorageImpl : public CastCrashStorage {
public:
CastCrashStorageImpl();
~CastCrashStorageImpl() final;
CastCrashStorageImpl& operator=(const CastCrashStorageImpl&) = delete;
CastCrashStorageImpl(const CastCrashStorageImpl&) = delete;
// CastCrashStorage implementation:
void SetLastLaunchedApp(base::StringPiece app_id) final;
void ClearLastLaunchedApp() final;
void SetCurrentApp(base::StringPiece app_id) final;
void ClearCurrentApp() final;
void SetPreviousApp(base::StringPiece app_id) final;
void ClearPreviousApp() final;
void SetStadiaSessionId(base::StringPiece session_id) final;
void ClearStadiaSessionId() final;
};
} // namespace chromecast
#endif // CHROMECAST_CRASH_CAST_CRASH_STORAGE_DEFAULT_H_
// Copyright 2020 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 "chromecast/crash/fuchsia/cast_crash_storage_impl_fuchsia.h"
namespace chromecast {
CastCrashStorageImplFuchsia::CastCrashStorageImplFuchsia() = default;
CastCrashStorageImplFuchsia::~CastCrashStorageImplFuchsia() = default;
void CastCrashStorageImplFuchsia::SetLastLaunchedApp(base::StringPiece app_id) {
// TODO(b/67907746): Implement.
}
void CastCrashStorageImplFuchsia::ClearLastLaunchedApp() {
// TODO(b/67907746): Implement.
}
void CastCrashStorageImplFuchsia::SetCurrentApp(base::StringPiece app_id) {
// TODO(b/67907746): Implement.
}
void CastCrashStorageImplFuchsia::ClearCurrentApp() {
// TODO(b/67907746): Implement.
}
void CastCrashStorageImplFuchsia::SetPreviousApp(base::StringPiece app_id) {
// TODO(b/67907746): Implement.
}
void CastCrashStorageImplFuchsia::ClearPreviousApp() {
// TODO(b/67907746): Implement.
}
void CastCrashStorageImplFuchsia::SetStadiaSessionId(
base::StringPiece session_id) {
// TODO(b/67907746): Implement.
}
void CastCrashStorageImplFuchsia::ClearStadiaSessionId() {
// TODO(b/67907746): Implement.
}
} // namespace chromecast
// Copyright 2020 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.
#ifndef CHROMECAST_CRASH_FUCHSIA_CAST_CRASH_STORAGE_IMPL_FUCHSIA_H_
#define CHROMECAST_CRASH_FUCHSIA_CAST_CRASH_STORAGE_IMPL_FUCHSIA_H_
#include "chromecast/crash/cast_crash_storage.h"
namespace chromecast {
class CastCrashStorageImplFuchsia : public CastCrashStorage {
public:
CastCrashStorageImplFuchsia();
~CastCrashStorageImplFuchsia() final;
CastCrashStorageImplFuchsia& operator=(const CastCrashStorageImplFuchsia&) =
delete;
CastCrashStorageImplFuchsia(const CastCrashStorageImplFuchsia&) = delete;
// CastCrashStorage implementation:
void SetLastLaunchedApp(base::StringPiece app_id) final;
void ClearLastLaunchedApp() final;
void SetCurrentApp(base::StringPiece app_id) final;
void ClearCurrentApp() final;
void SetPreviousApp(base::StringPiece app_id) final;
void ClearPreviousApp() final;
void SetStadiaSessionId(base::StringPiece session_id) final;
void ClearStadiaSessionId() final;
};
} // namespace chromecast
#endif // CHROMECAST_CRASH_FUCHSIA_CAST_CRASH_STORAGE_IMPL_FUCHSIA_H_
...@@ -65,6 +65,7 @@ cast_source_set("renderer") { ...@@ -65,6 +65,7 @@ cast_source_set("renderer") {
"//chromecast/common:queryable_data", "//chromecast/common:queryable_data",
"//chromecast/common/media", "//chromecast/common/media",
"//chromecast/common/mojom", "//chromecast/common/mojom",
"//chromecast/crash",
"//chromecast/media", "//chromecast/media",
"//chromecast/media/base:media_codec_support", "//chromecast/media/base:media_codec_support",
"//components/network_hints/renderer", "//components/network_hints/renderer",
...@@ -79,11 +80,6 @@ cast_source_set("renderer") { ...@@ -79,11 +80,6 @@ cast_source_set("renderer") {
"//v8", "//v8",
] ]
if (!is_fuchsia) {
# TODO(crbug.com/753619): Enable crash reporting on Fuchsia.
deps += [ "//chromecast/crash" ]
}
if (!is_android) { if (!is_android) {
sources += [ sources += [
"memory_pressure_observer_impl.cc", "memory_pressure_observer_impl.cc",
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "chromecast/base/bitstream_audio_codecs.h" #include "chromecast/base/bitstream_audio_codecs.h"
#include "chromecast/base/cast_features.h" #include "chromecast/base/cast_features.h"
#include "chromecast/base/chromecast_switches.h" #include "chromecast/base/chromecast_switches.h"
#include "chromecast/crash/app_state_tracker.h"
#include "chromecast/media/base/media_codec_support.h" #include "chromecast/media/base/media_codec_support.h"
#include "chromecast/media/base/supported_codec_profile_levels_memo.h" #include "chromecast/media/base/supported_codec_profile_levels_memo.h"
#include "chromecast/public/media/media_capabilities_shlib.h" #include "chromecast/public/media/media_capabilities_shlib.h"
...@@ -48,10 +49,6 @@ ...@@ -48,10 +49,6 @@
#include "chromecast/renderer/memory_pressure_observer_impl.h" #include "chromecast/renderer/memory_pressure_observer_impl.h"
#endif // OS_ANDROID #endif // OS_ANDROID
#if !defined(OS_FUCHSIA)
#include "chromecast/crash/cast_crash_keys.h"
#endif // !defined(OS_FUCHSIA)
#if BUILDFLAG(ENABLE_CHROMECAST_EXTENSIONS) #if BUILDFLAG(ENABLE_CHROMECAST_EXTENSIONS)
#include "chromecast/common/cast_extensions_client.h" #include "chromecast/common/cast_extensions_client.h"
#include "chromecast/renderer/cast_extensions_renderer_client.h" #include "chromecast/renderer/cast_extensions_renderer_client.h"
...@@ -132,20 +129,17 @@ void CastContentRendererClient::RenderThreadStarted() { ...@@ -132,20 +129,17 @@ void CastContentRendererClient::RenderThreadStarted() {
memory_pressure_controller->AddObserver(std::move(memory_pressure_proxy)); memory_pressure_controller->AddObserver(std::move(memory_pressure_proxy));
#endif #endif
#if !defined(OS_FUCHSIA)
// TODO(crbug.com/753619): Enable crash reporting on Fuchsia.
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
std::string last_launched_app = std::string last_launched_app =
command_line->GetSwitchValueNative(switches::kLastLaunchedApp); command_line->GetSwitchValueNative(switches::kLastLaunchedApp);
if (!last_launched_app.empty()) if (!last_launched_app.empty())
crash_keys::last_app.Set(last_launched_app); AppStateTracker::SetLastLaunchedApp(last_launched_app);
std::string previous_app = std::string previous_app =
command_line->GetSwitchValueNative(switches::kPreviousApp); command_line->GetSwitchValueNative(switches::kPreviousApp);
if (!previous_app.empty()) if (!previous_app.empty())
crash_keys::previous_app.Set(previous_app); AppStateTracker::SetPreviousApp(previous_app);
#endif // !defined(OS_FUCHSIA)
#if BUILDFLAG(ENABLE_CHROMECAST_EXTENSIONS) #if BUILDFLAG(ENABLE_CHROMECAST_EXTENSIONS)
extensions_client_ = std::make_unique<extensions::CastExtensionsClient>(); extensions_client_ = std::make_unique<extensions::CastExtensionsClient>();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment