// Copyright (c) 2012 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/histogram_message_filter.h"

#include "base/command_line.h"
#include "base/metrics/histogram.h"
#include "base/metrics/statistics_recorder.h"
#include "content/browser/histogram_controller.h"
#include "content/browser/tcmalloc_internals_request_job.h"
#include "content/common/child_process_messages.h"
#include "content/public/common/content_switches.h"

namespace content {

HistogramMessageFilter::HistogramMessageFilter()
    : BrowserMessageFilter(ChildProcessMsgStart) {}

bool HistogramMessageFilter::OnMessageReceived(const IPC::Message& message) {
  bool handled = true;
  IPC_BEGIN_MESSAGE_MAP(HistogramMessageFilter, message)
    IPC_MESSAGE_HANDLER(ChildProcessHostMsg_ChildHistogramData,
                        OnChildHistogramData)
    IPC_MESSAGE_HANDLER(ChildProcessHostMsg_GetBrowserHistogram,
                        OnGetBrowserHistogram)
    IPC_MESSAGE_UNHANDLED(handled = false)
  IPC_END_MESSAGE_MAP()
  return handled;
}

HistogramMessageFilter::~HistogramMessageFilter() {}

void HistogramMessageFilter::OnChildHistogramData(
    int sequence_number,
    const std::vector<std::string>& pickled_histograms) {
  HistogramController::GetInstance()->OnHistogramDataCollected(
      sequence_number, pickled_histograms);
}

void HistogramMessageFilter::OnGetBrowserHistogram(
    const std::string& name,
    std::string* histogram_json) {
  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
  // Security: Only allow access to browser histograms when running in the
  // context of a test.
  bool using_stats_collection_controller =
      base::CommandLine::ForCurrentProcess()->HasSwitch(
          switches::kStatsCollectionController);
  if (!using_stats_collection_controller) {
    LOG(ERROR) << "Attempt at reading browser histogram without specifying "
               << "--" << switches::kStatsCollectionController << " switch.";
    return;
  }
  base::HistogramBase* histogram =
      base::StatisticsRecorder::FindHistogram(name);
  if (!histogram) {
    *histogram_json = "{}";
  } else {
    histogram->WriteJSON(histogram_json);
  }
}

}  // namespace content
