| Index: chrome/browser/ui/webui/task_scheduler_internals/task_scheduler_internals_ui.cc
|
| diff --git a/chrome/browser/ui/webui/task_scheduler_internals/task_scheduler_internals_ui.cc b/chrome/browser/ui/webui/task_scheduler_internals/task_scheduler_internals_ui.cc
|
| index afec2204a08d08634de7a3d881bde8ec2051c505..e82305558fcca153d7479a556d5ed669e8be0fef 100644
|
| --- a/chrome/browser/ui/webui/task_scheduler_internals/task_scheduler_internals_ui.cc
|
| +++ b/chrome/browser/ui/webui/task_scheduler_internals/task_scheduler_internals_ui.cc
|
| @@ -4,22 +4,104 @@
|
|
|
| #include "chrome/browser/ui/webui/task_scheduler_internals/task_scheduler_internals_ui.h"
|
|
|
| +#include <utility>
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/metrics/histogram_base.h"
|
| +#include "base/metrics/histogram_samples.h"
|
| #include "base/task_scheduler/task_scheduler.h"
|
| +#include "base/values.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/common/url_constants.h"
|
| #include "chrome/grit/task_scheduler_internals_resources.h"
|
| #include "content/public/browser/web_ui_data_source.h"
|
| +#include "content/public/browser/web_ui_message_handler.h"
|
| +
|
| +namespace {
|
| +
|
| +std::unique_ptr<base::Value> SnapshotHistogramToValue(
|
| + const base::HistogramBase* histogram) {
|
| + std::unique_ptr<base::ListValue> values =
|
| + base::MakeUnique<base::ListValue>();
|
| +
|
| + std::unique_ptr<base::HistogramSamples> samples =
|
| + histogram->SnapshotSamples();
|
| + std::unique_ptr<base::SampleCountIterator> iterator = samples->Iterator();
|
| + while (!iterator->Done()) {
|
| + base::HistogramBase::Sample min;
|
| + base::HistogramBase::Sample max;
|
| + base::HistogramBase::Count count;
|
| + iterator->Get(&min, &max, &count);
|
| +
|
| + std::unique_ptr<base::DictionaryValue> bucket =
|
| + base::MakeUnique<base::DictionaryValue>();
|
| + bucket->SetInteger("min", min);
|
| + bucket->SetInteger("max", max);
|
| + bucket->SetInteger("count", count);
|
| +
|
| + values->Append(std::move(bucket));
|
| + iterator->Next();
|
| + }
|
| + return std::move(values);
|
| +}
|
| +
|
| +class TaskSchedulerDataHandler : public content::WebUIMessageHandler {
|
| + public:
|
| + TaskSchedulerDataHandler() = default;
|
| +
|
| + // content::WebUIMessageHandler:
|
| + void RegisterMessages() override {
|
| + web_ui()->RegisterMessageCallback(
|
| + "getTaskSchedulerData",
|
| + base::Bind(&TaskSchedulerDataHandler::GetTaskSchedulerData,
|
| + base::Unretained(this)));
|
| + }
|
| +
|
| + private:
|
| + void GetTaskSchedulerData(const base::ListValue*) {
|
| + base::DictionaryValue data;
|
| +
|
| + base::TaskScheduler* task_scheduler = base::TaskScheduler::GetInstance();
|
| + data.SetBoolean("instantiated", !!task_scheduler);
|
| +
|
| + if (task_scheduler) {
|
| + std::unique_ptr<base::ListValue> histogram_value =
|
| + base::MakeUnique<base::ListValue>();
|
| + std::vector<const base::HistogramBase*> histograms =
|
| + task_scheduler->GetHistograms();
|
| +
|
| + for (const base::HistogramBase* const histogram : histograms) {
|
| + std::unique_ptr<base::DictionaryValue> buckets =
|
| + base::MakeUnique<base::DictionaryValue>();
|
| + buckets->SetString("name", histogram->histogram_name());
|
| + buckets->Set("buckets", SnapshotHistogramToValue(histogram));
|
| + histogram_value->Append(std::move(buckets));
|
| + }
|
| +
|
| + data.Set("histograms", std::move(histogram_value));
|
| + }
|
| +
|
| + web_ui()->CallJavascriptFunctionUnsafe(
|
| + "TaskSchedulerInternals.onGetTaskSchedulerData", data);
|
| + }
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TaskSchedulerDataHandler);
|
| +};
|
| +
|
| +} // namespace
|
|
|
| TaskSchedulerInternalsUI::TaskSchedulerInternalsUI(content::WebUI* web_ui)
|
| : content::WebUIController(web_ui) {
|
| + web_ui->AddMessageHandler(new TaskSchedulerDataHandler());
|
| +
|
| content::WebUIDataSource* html_source =
|
| content::WebUIDataSource::Create(
|
| chrome::kChromeUITaskSchedulerInternalsHost);
|
| -
|
| - html_source->AddString("status", base::TaskScheduler::GetInstance()
|
| - ? "Instantiated"
|
| - : "Not Instantiated");
|
| -
|
| + html_source->AddResourcePath(
|
| + "index.css", IDR_TASK_SCHEDULER_INTERNALS_RESOURCES_INDEX_CSS);
|
| + html_source->AddResourcePath(
|
| + "index.js", IDR_TASK_SCHEDULER_INTERNALS_RESOURCES_INDEX_JS);
|
| html_source->SetDefaultResource(
|
| IDR_TASK_SCHEDULER_INTERNALS_RESOURCES_INDEX_HTML);
|
|
|
|
|