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