1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/webui/media/webrtc_logs_ui.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector> 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind_helpers.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/i18n/time_formatting.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/ref_counted_memory.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/prefs/pref_service.h" 14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/strings/string_number_conversions.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/utf_string_conversions.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/values.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/browser_process.h" 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/media/webrtc_log_list.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/profiles/profile.h" 20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/upload_list.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/chrome_version_info.h" 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/pref_names.h" 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/url_constants.h" 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/web_contents.h" 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/web_ui.h" 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/web_ui_data_source.h" 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/web_ui_message_handler.h" 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "grit/browser_resources.h" 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "grit/chromium_strings.h" 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "grit/generated_resources.h" 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "grit/theme_resources.h" 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/l10n/l10n_util.h" 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/resource/resource_bundle.h" 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_CHROMEOS) 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/chromeos/settings/cros_settings.h" 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing content::WebContents; 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing content::WebUIMessageHandler; 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochcontent::WebUIDataSource* CreateWebRtcLogsUIHTMLSource() { 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::WebUIDataSource* source = 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::WebUIDataSource::Create(chrome::kChromeUIWebRtcLogsHost); 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch source->SetUseJsonJSFormatV2(); 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch source->AddLocalizedString("webrtcLogsTitle", IDS_WEBRTC_LOGS_TITLE); 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch source->AddLocalizedString("webrtcLogCountFormat", 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_WEBRTC_LOGS_LOG_COUNT_BANNER_FORMAT); 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch source->AddLocalizedString("webrtcLogHeaderFormat", 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_WEBRTC_LOGS_LOG_HEADER_FORMAT); 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch source->AddLocalizedString("webrtcLogLocalFileLabelFormat", 55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_WEBRTC_LOGS_LOG_LOCAL_FILE_LABEL_FORMAT); 56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch source->AddLocalizedString("webrtcLogLocalFileFormat", 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_WEBRTC_LOGS_LOG_LOCAL_FILE_FORMAT); 58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch source->AddLocalizedString("noLocalLogFileMessage", 59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_WEBRTC_LOGS_NO_LOCAL_LOG_FILE_MESSAGE); 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch source->AddLocalizedString("webrtcLogUploadTimeFormat", 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_WEBRTC_LOGS_LOG_UPLOAD_TIME_FORMAT); 62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch source->AddLocalizedString("webrtcLogReportIdFormat", 63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_WEBRTC_LOGS_LOG_REPORT_ID_FORMAT); 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch source->AddLocalizedString("bugLinkText", IDS_WEBRTC_LOGS_BUG_LINK_LABEL); 65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch source->AddLocalizedString("webrtcLogNotUploadedMessage", 66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch IDS_WEBRTC_LOGS_LOG_NOT_UPLOADED_MESSAGE); 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch source->AddLocalizedString("noLogsMessage", 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_WEBRTC_LOGS_NO_LOGS_MESSAGE); 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch source->SetJsonPath("strings.js"); 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch source->AddResourcePath("webrtc_logs.js", IDR_WEBRTC_LOGS_JS); 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch source->SetDefaultResource(IDR_WEBRTC_LOGS_HTML); 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return source; 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//////////////////////////////////////////////////////////////////////////////// 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// WebRtcLogsDOMHandler 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//////////////////////////////////////////////////////////////////////////////// 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// The handler for Javascript messages for the chrome://webrtc-logs/ page. 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass WebRtcLogsDOMHandler : public WebUIMessageHandler, 83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public UploadList::Delegate { 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) explicit WebRtcLogsDOMHandler(Profile* profile); 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~WebRtcLogsDOMHandler(); 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // WebUIMessageHandler implementation. 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void RegisterMessages() OVERRIDE; 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // UploadList::Delegate implemenation. 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnUploadListAvailable() OVERRIDE; 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Asynchronously fetches the list of upload WebRTC logs. Called from JS. 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleRequestWebRtcLogs(const base::ListValue* args); 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Sends the recently uploaded logs list JS. 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void UpdateUI(); 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Loads, parses and stores the list of uploaded WebRTC logs. 102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<UploadList> upload_list_; 103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // The directory where the logs are stored. 105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::FilePath log_dir_; 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set when |upload_list_| has finished populating the list of logs. 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool list_available_; 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set when the webpage wants to update the list (on the webpage) but 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // |upload_list_| hasn't finished populating the list of logs yet. 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool js_request_pending_; 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DISALLOW_COPY_AND_ASSIGN(WebRtcLogsDOMHandler); 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)WebRtcLogsDOMHandler::WebRtcLogsDOMHandler(Profile* profile) 118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : log_dir_( 119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch WebRtcLogList::GetWebRtcLogDirectoryForProfile(profile->GetPath())), 120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch list_available_(false), 121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch js_request_pending_(false) { 122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch upload_list_ = WebRtcLogList::CreateWebRtcLogList(this, profile); 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochWebRtcLogsDOMHandler::~WebRtcLogsDOMHandler() { 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch upload_list_->ClearDelegate(); 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WebRtcLogsDOMHandler::RegisterMessages() { 130a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch upload_list_->LoadUploadListAsynchronously(); 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch web_ui()->RegisterMessageCallback("requestWebRtcLogsList", 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&WebRtcLogsDOMHandler::HandleRequestWebRtcLogs, 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this))); 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebRtcLogsDOMHandler::HandleRequestWebRtcLogs( 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* args) { 1398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (list_available_) 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateUI(); 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch js_request_pending_ = true; 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WebRtcLogsDOMHandler::OnUploadListAvailable() { 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch list_available_ = true; 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (js_request_pending_) 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateUI(); 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WebRtcLogsDOMHandler::UpdateUI() { 152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::vector<UploadList::UploadInfo> uploads; 1538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) upload_list_->GetUploads(50, &uploads); 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue upload_list; 156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch for (std::vector<UploadList::UploadInfo>::iterator i = uploads.begin(); 157effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch i != uploads.end(); 158effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ++i) { 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* upload = new base::DictionaryValue(); 1608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) upload->SetString("id", i->id); 161effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 162effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::string16 value_w; 163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!i->time.is_null()) 164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch value_w = base::TimeFormatFriendlyDateAndTime(i->time); 165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch upload->SetString("upload_time", value_w); 166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch value_w.clear(); 168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch double seconds_since_epoch; 169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (base::StringToDouble(i->local_id, &seconds_since_epoch)) { 170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::Time capture_time = base::Time::FromDoubleT(seconds_since_epoch); 171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch value_w = base::TimeFormatFriendlyDateAndTime(capture_time); 172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch upload->SetString("capture_time", value_w); 174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::FilePath::StringType value; 176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!i->local_id.empty()) 177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch value = log_dir_.AppendASCII(i->local_id) 178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .AddExtension(FILE_PATH_LITERAL(".gz")).value(); 179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch upload->SetString("local_file", value); 180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) upload_list.Append(upload); 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const chrome::VersionInfo version_info; 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::StringValue version(version_info.Version()); 186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) web_ui()->CallJavascriptFunction("updateWebRtcLogsList", upload_list, 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch version); 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/////////////////////////////////////////////////////////////////////////////// 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// WebRtcLogsUI 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/////////////////////////////////////////////////////////////////////////////// 198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochWebRtcLogsUI::WebRtcLogsUI(content::WebUI* web_ui) : WebUIController(web_ui) { 2008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui); 2018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) web_ui->AddMessageHandler(new WebRtcLogsDOMHandler(profile)); 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set up the chrome://webrtc-logs/ source. 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::WebUIDataSource::Add(profile, CreateWebRtcLogsUIHTMLSource()); 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 206