histogram_internals_request_job.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/histogram_internals_request_job.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/statistics_recorder.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/histogram_synchronizer.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/escape.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistogramInternalsRequestJob::HistogramInternalsRequestJob(
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequest* request, net::NetworkDelegate* network_delegate)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : net::URLRequestSimpleJob(request, network_delegate) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& spec = request->url().possibly_invalid_spec();
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const url_parse::Parsed& parsed =
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request->url().parsed_for_possibly_invalid_spec();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // + 1 to skip the slash at the beginning of the path.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int offset = parsed.CountCharactersBefore(url_parse::Parsed::PATH, false) + 1;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (offset < static_cast<int>(spec.size()))
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path_.assign(spec.substr(offset));
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AboutHistogram(std::string* data, const std::string& path) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We only rush the acquisition of Histogram meta-data (meta-histograms) in
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Debug mode, so that developers don't damage our data that we upload to UMA
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (in official builds).
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StatisticsRecorder::CollectHistogramStats("Browser");
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistogramSynchronizer::FetchHistograms();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string unescaped_query;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string unescaped_title("About Histograms");
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!path.empty()) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unescaped_query = net::UnescapeURLComponent(path,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                net::UnescapeRule::NORMAL);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unescaped_title += " - " + unescaped_query;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data->append("<!DOCTYPE html>\n<html>\n<head>\n");
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data->append(
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<meta http-equiv=\"Content-Security-Policy\" "
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "content=\"object-src 'none'; script-src 'none' 'unsafe-eval'\">");
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data->append("<title>");
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data->append(net::EscapeForHTML(unescaped_title));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data->append("</title>\n");
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data->append("</head><body>");
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Display any stats for which we sent off requests the last time.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data->append("<p>Stats as of last page load;");
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data->append("reload to get stats as of this page load.</p>\n");
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data->append("<table width=\"100%\">\n");
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StatisticsRecorder::WriteHTMLGraph(unescaped_query, data);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int HistogramInternalsRequestJob::GetData(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* mime_type,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* charset,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* data,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CompletionCallback& callback) const {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mime_type->assign("text/html");
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  charset->assign("UTF8");
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data->clear();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AboutHistogram(data, path_);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net::OK;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
78