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