1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/breadcrumbs/core/application_breadcrumbs_logger.h"
#include <algorithm>
#include "base/functional/bind.h"
#include "base/strings/stringprintf.h"
#include "components/breadcrumbs/core/application_breadcrumbs_not_user_action.inc"
#include "components/breadcrumbs/core/breadcrumb_manager.h"
#include "components/breadcrumbs/core/breadcrumb_persistent_storage_manager.h"
#if defined(TOOLKIT_VIEWS)
#include "ui/views/widget/any_widget_observer_singleton.h"
#include "ui/views/widget/widget.h"
#endif // TOOLKIT_VIEWS
namespace breadcrumbs {
namespace {
void AddEvent(const std::string& event) {
breadcrumbs::BreadcrumbManager::GetInstance().AddEvent(event);
}
} // namespace
ApplicationBreadcrumbsLogger::ApplicationBreadcrumbsLogger(
const base::FilePath& storage_dir,
base::RepeatingCallback<bool()> is_metrics_enabled_callback)
: user_action_callback_(
base::BindRepeating(&ApplicationBreadcrumbsLogger::OnUserAction,
base::Unretained(this))),
memory_pressure_listener_(std::make_unique<base::MemoryPressureListener>(
FROM_HERE,
base::BindRepeating(&ApplicationBreadcrumbsLogger::OnMemoryPressure,
base::Unretained(this)))),
#if defined(TOOLKIT_VIEWS)
any_widget_observer_(views::AnyWidgetPasskey{}),
#endif // TOOLKIT_VIEWS
persistent_storage_manager_(
std::make_unique<BreadcrumbPersistentStorageManager>(
storage_dir,
std::move(is_metrics_enabled_callback))) {
base::AddActionCallback(user_action_callback_);
#if defined(TOOLKIT_VIEWS)
any_widget_observer_.set_closing_callback(base::BindRepeating(
&ApplicationBreadcrumbsLogger::OnWidgetClosed, base::Unretained(this)));
#endif // TOOLKIT_VIEWS
AddEvent("Startup");
}
ApplicationBreadcrumbsLogger::~ApplicationBreadcrumbsLogger() {
AddEvent("Shutdown");
base::RemoveActionCallback(user_action_callback_);
}
BreadcrumbPersistentStorageManager*
ApplicationBreadcrumbsLogger::GetPersistentStorageManager() const {
return persistent_storage_manager_.get();
}
void ApplicationBreadcrumbsLogger::OnUserAction(const std::string& action,
base::TimeTicks action_time) {
// Filter out unwanted actions.
if (action.find("InProductHelp.") == 0) {
// InProductHelp actions are very noisy.
return;
}
if (!IsUserTriggeredAction(action)) {
// These actions are not useful for breadcrumbs.
return;
}
AddEvent(action.c_str());
}
void ApplicationBreadcrumbsLogger::OnMemoryPressure(
base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
const char* pressure_string = "";
switch (memory_pressure_level) {
case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE:
pressure_string = "None";
break;
case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
pressure_string = "Moderate";
break;
case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL:
pressure_string = "Critical";
break;
}
AddEvent(base::StringPrintf("Memory Pressure: %s", pressure_string));
}
#if defined(TOOLKIT_VIEWS)
void ApplicationBreadcrumbsLogger::OnWidgetClosed(views::Widget* widget) {
AddEvent(base::StringPrintf("Widget Closed: %s", widget->GetName().c_str()));
}
#endif // TOOLKIT_VIEWS
bool ApplicationBreadcrumbsLogger::IsUserTriggeredAction(
const std::string& action) {
// The variable kNotUserTriggeredActions is a sorted array of
// strings generated by generate_not_user_triggered_actions.py.
// It is defined in application_breadcrumbs_not_user_action.inc.
return !std::binary_search(std::begin(kNotUserTriggeredActions),
std::end(kNotUserTriggeredActions), action);
}
} // namespace breadcrumbs
|