172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Need to include this before any other file because it defines 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// IPC_MESSAGE_LOG_ENABLED. We need to use it to define 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// IPC_MESSAGE_MACROS_LOG_ENABLED so render_messages.h will generate the 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ViewMsgLog et al. functions. 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "ipc/ipc_message.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef IPC_MESSAGE_LOG_ENABLED 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define IPC_MESSAGE_MACROS_LOG_ENABLED 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/about_ipc_dialog.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <set> 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 193f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h" 213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/app/chrome_dll_resource.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process.h" 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/browser_dialogs.h" 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_constants.h" 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/devtools_messages.h" 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/render_messages.h" 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/plugin_messages.h" 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request.h" 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request_job.h" 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request_job_tracker.h" 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/button/text_button.h" 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/native/native_view_host.h" 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/layout/grid_layout.h" 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/layout/layout_constants.h" 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/widget/root_view.h" 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/widget/widget.h" 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/window/window.h" 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// We don't localize this UI since this is a developer-only feature. 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst wchar_t kStartTrackingLabel[] = L"Start tracking"; 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst wchar_t kStopTrackingLabel[] = L"Stop tracking"; 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst wchar_t kClearLabel[] = L"Clear"; 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst wchar_t kFilterLabel[] = L"Filter..."; 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochenum { 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kTimeColumn = 0, 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kChannelColumn, 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kMessageColumn, 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kFlagsColumn, 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kDispatchColumn, 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kProcessColumn, 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kParamsColumn, 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class registers the browser IPC logger functions with IPC::Logging. 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass RegisterLoggerFuncs { 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterLoggerFuncs() { 6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen IPC::Logging::set_log_function_map(&g_log_function_mapping); 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochRegisterLoggerFuncs g_register_logger_funcs; 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The singleton dialog box. This is non-NULL when a dialog is active so we 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// know not to create a new one. 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenAboutIPCDialog* g_active_dialog = NULL; 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::set<int> disabled_messages; 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Settings dialog ------------------------------------------------------------- 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool init_done = false; 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHWND settings_dialog = NULL; 7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Settings. 8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenCListViewCtrl* messages = NULL; 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid OnCheck(int id, bool checked) { 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!init_done) 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (checked) 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disabled_messages.erase(id); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disabled_messages.insert(id); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid InitDialog(HWND hwnd) { 9321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen messages = new CListViewCtrl(::GetDlgItem(hwnd, IDC_Messages)); 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen messages->SetViewType(LVS_REPORT); 9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen messages->SetExtendedListViewStyle(LVS_EX_CHECKBOXES); 9721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen messages->ModifyStyle(0, LVS_SORTASCENDING | LVS_NOCOLUMNHEADER); 9821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen messages->InsertColumn(0, L"id", LVCFMT_LEFT, 230); 9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 10021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen LogFunctionMap* log_functions = IPC::Logging::log_function_map(); 10121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen for (LogFunctionMap::iterator i = log_functions->begin(); 10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen i != log_functions->end(); ++i) { 10321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::string name; 10421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen (*i->second)(&name, NULL, NULL); 10521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (name.empty()) 10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen continue; // Will happen if the message file isn't included above. 10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::wstring wname = UTF8ToWide(name); 10821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int index = messages->InsertItem( 11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen LVIF_TEXT | LVIF_PARAM, 0, wname.c_str(), 0, 0, 0, i->first); 11121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen messages->SetItemText(index, 0, wname.c_str()); 11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (disabled_messages.find(i->first) == disabled_messages.end()) 11521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen messages->SetCheckState(index, TRUE); 11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch init_done = true; 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CloseDialog() { 12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen delete messages; 12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen messages = NULL; 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch init_done = false; 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ::DestroyWindow(settings_dialog); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch settings_dialog = NULL; 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch /* The old version of this code stored the last settings in the preferences. 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch But with this dialog, there currently isn't an easy way to get the profile 13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen to save in the preferences. 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* current_profile = profile(); 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!current_profile) 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PrefService* prefs = current_profile->GetPrefs(); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!prefs->FindPreference(prefs::kIpcDisabledMessages)) 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ListValue* list = prefs->GetMutableList(prefs::kIpcDisabledMessages); 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch list->Clear(); 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (std::set<int>::const_iterator itr = disabled_messages_.begin(); 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch itr != disabled_messages_.end(); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ++itr) { 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch list->Append(Value::CreateIntegerValue(*itr)); 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */ 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid OnButtonClick(int id) { 15021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int count = messages->GetItemCount(); 15121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen for (int i = 0; i < count; ++i) 15221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen messages->SetCheckState(i, id == IDC_MessagesAll); 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochINT_PTR CALLBACK DialogProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (msg) { 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WM_INITDIALOG: 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitDialog(hwnd); 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return FALSE; // Don't set keyboard focus. 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WM_SYSCOMMAND: 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (wparam == SC_CLOSE) { 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CloseDialog(); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return FALSE; 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WM_NOTIFY: { 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NMLISTVIEW* info = reinterpret_cast<NM_LISTVIEW*>(lparam); 16821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (wparam == IDC_Messages && info->hdr.code == LVN_ITEMCHANGED) { 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (info->uChanged & LVIF_STATE) { 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool checked = (info->uNewState >> 12) == 2; 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnCheck(static_cast<int>(info->lParam), checked); 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return FALSE; 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WM_COMMAND: 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (HIWORD(wparam) == BN_CLICKED) 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OnButtonClick(LOWORD(wparam)); 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return FALSE; 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RunSettingsDialog(HWND parent) { 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (settings_dialog) 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HINSTANCE module_handle = GetModuleHandle(chrome::kBrowserResourcesDll); 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch settings_dialog = CreateDialog(module_handle, 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MAKEINTRESOURCE(IDD_IPC_SETTINGS), 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NULL, 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &DialogProc); 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ::ShowWindow(settings_dialog, SW_SHOW); 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// AboutIPCDialog -------------------------------------------------------------- 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochAboutIPCDialog::AboutIPCDialog() 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : track_toggle_(NULL), 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch clear_button_(NULL), 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch filter_button_(NULL), 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch table_(NULL), 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tracking_(false) { 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetupControls(); 20721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen IPC::Logging::GetInstance()->SetConsumer(this); 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochAboutIPCDialog::~AboutIPCDialog() { 21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen g_active_dialog = NULL; 21221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen IPC::Logging::GetInstance()->SetConsumer(NULL); 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AboutIPCDialog::RunDialog() { 21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!g_active_dialog) { 21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen g_active_dialog = new AboutIPCDialog; 21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen views::Window::CreateChromeWindow(NULL, gfx::Rect(), 22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen g_active_dialog)->Show(); 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(brettw) it would be nice to focus the existing window. 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AboutIPCDialog::SetupControls() { 22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen views::GridLayout* layout = views::GridLayout::CreatePanel(this); 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetLayoutManager(layout); 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch track_toggle_ = new views::TextButton(this, kStartTrackingLabel); 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch clear_button_ = new views::TextButton(this, kClearLabel); 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch filter_button_ = new views::TextButton(this, kFilterLabel); 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch table_ = new views::NativeViewHost; 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const int first_column_set = 1; 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::ColumnSet* column_set = layout->AddColumnSet(first_column_set); 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33.33f, views::GridLayout::FIXED, 0, 0); 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33.33f, views::GridLayout::FIXED, 0, 0); 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33.33f, views::GridLayout::FIXED, 0, 0); 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const int table_column_set = 2; 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set = layout->AddColumnSet(table_column_set); 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 100.0f, views::GridLayout::FIXED, 0, 0); 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->StartRow(0, first_column_set); 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->AddView(track_toggle_); 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->AddView(clear_button_); 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->AddView(filter_button_); 25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->StartRow(1.0f, table_column_set); 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->AddView(table_); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochgfx::Size AboutIPCDialog::GetPreferredSize() { 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return gfx::Size(800, 400); 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochviews::View* AboutIPCDialog::GetContentsView() { 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return this; 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint AboutIPCDialog::GetDialogButtons() const { 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Don't want OK or Cancel. 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return 0; 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::wstring AboutIPCDialog::GetWindowTitle() const { 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return L"about:ipc"; 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AboutIPCDialog::Layout() { 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!message_list_.m_hWnd) { 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HWND parent_window = GetRootView()->GetWidget()->GetNativeView(); 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RECT rect = {0, 0, 10, 10}; 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HWND list_hwnd = message_list_.Create(parent_window, 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rect, NULL, WS_CHILD | WS_VISIBLE | LVS_SORTASCENDING); 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_list_.SetViewType(LVS_REPORT); 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_list_.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT); 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int column_index = 0; 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_list_.InsertColumn(kTimeColumn, L"time", LVCFMT_LEFT, 80); 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_list_.InsertColumn(kChannelColumn, L"channel", LVCFMT_LEFT, 110); 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_list_.InsertColumn(kMessageColumn, L"message", LVCFMT_LEFT, 240); 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_list_.InsertColumn(kFlagsColumn, L"flags", LVCFMT_LEFT, 50); 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_list_.InsertColumn(kDispatchColumn, L"dispatch (ms)", LVCFMT_RIGHT, 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 80); 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_list_.InsertColumn(kProcessColumn, L"process (ms)", LVCFMT_RIGHT, 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 80); 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_list_.InsertColumn(kParamsColumn, L"parameters", LVCFMT_LEFT, 500); 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch table_->Attach(list_hwnd); 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch View::Layout(); 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AboutIPCDialog::Log(const IPC::LogData& data) { 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (disabled_messages.find(data.type) != disabled_messages.end()) 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; // Message type is filtered out. 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time sent = base::Time::FromInternalValue(data.sent); 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time::Exploded exploded; 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sent.LocalExplode(&exploded); 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (exploded.hour > 12) 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch exploded.hour -= 12; 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::wstring sent_str = StringPrintf(L"%02d:%02d:%02d.%03d", 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch exploded.hour, exploded.minute, exploded.second, exploded.millisecond); 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int count = message_list_.GetItemCount(); 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int index = message_list_.InsertItem(count, sent_str.c_str()); 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_list_.SetItemText(index, kTimeColumn, sent_str.c_str()); 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_list_.SetItemText(index, kChannelColumn, 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASCIIToWide(data.channel).c_str()); 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string message_name; 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC::Logging::GetMessageText(data.type, &message_name, NULL, NULL); 3253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick message_list_.SetItemText(index, kMessageColumn, 3263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UTF8ToWide(message_name).c_str()); 3273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick message_list_.SetItemText(index, kFlagsColumn, 3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UTF8ToWide(data.flags).c_str()); 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 time_to_send = (base::Time::FromInternalValue(data.receive) - 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sent).InMilliseconds(); 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // time can go backwards by a few ms (see Time), don't show that. 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch time_to_send = std::max(static_cast<int>(time_to_send), 0); 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::wstring temp = StringPrintf(L"%d", time_to_send); 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_list_.SetItemText(index, kDispatchColumn, temp.c_str()); 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 time_to_process = (base::Time::FromInternalValue(data.dispatch) - 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time::FromInternalValue(data.receive)).InMilliseconds(); 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch time_to_process = std::max(static_cast<int>(time_to_process), 0); 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch temp = StringPrintf(L"%d", time_to_process); 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_list_.SetItemText(index, kProcessColumn, temp.c_str()); 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick message_list_.SetItemText(index, kParamsColumn, 3443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UTF8ToWide(data.params).c_str()); 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_list_.EnsureVisible(index, FALSE); 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool AboutIPCDialog::CanResize() const { 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AboutIPCDialog::ButtonPressed( 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::Button* button, const views::Event& event) { 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (button == track_toggle_) { 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (tracking_) { 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch track_toggle_->SetText(kStartTrackingLabel); 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tracking_ = false; 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_browser_process->SetIPCLoggingEnabled(false); 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch track_toggle_->SetText(kStopTrackingLabel); 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tracking_ = true; 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_browser_process->SetIPCLoggingEnabled(true); 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch track_toggle_->SchedulePaint(); 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (button == clear_button_) { 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_list_.DeleteAllItems(); 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (button == filter_button_) { 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RunSettingsDialog(GetRootView()->GetWidget()->GetNativeView()); 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace browser { 37372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 37472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ShowAboutIPCDialog() { 37572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AboutIPCDialog::RunDialog(); 37672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 37772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 37872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} // namespace browser 37972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // IPC_MESSAGE_LOG_ENABLED 381