OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/webui/hung_renderer_dialog.h" | 5 #include "chrome/browser/ui/webui/hung_renderer_dialog.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
| 11 #include "base/utf_string_conversions.h" |
11 #include "base/values.h" | 12 #include "base/values.h" |
12 #include "chrome/browser/ui/browser.h" | 13 #include "chrome/browser/ui/browser.h" |
13 #include "chrome/browser/ui/browser_list.h" | 14 #include "chrome/browser/ui/browser_list.h" |
| 15 #include "chrome/browser/ui/browser_dialogs.h" |
14 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 16 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| 17 #include "chrome/browser/ui/webui/html_dialog_ui.h" |
15 #include "chrome/common/logging_chrome.h" | 18 #include "chrome/common/logging_chrome.h" |
16 #include "chrome/common/url_constants.h" | 19 #include "chrome/common/url_constants.h" |
17 #include "content/browser/renderer_host/render_view_host.h" | 20 #include "content/browser/renderer_host/render_view_host.h" |
18 #include "content/browser/tab_contents/tab_contents.h" | 21 #include "content/browser/tab_contents/tab_contents.h" |
19 #include "content/common/result_codes.h" | 22 #include "content/common/result_codes.h" |
20 #include "grit/generated_resources.h" | 23 #include "grit/generated_resources.h" |
21 #include "ui/base/l10n/l10n_util.h" | 24 #include "ui/base/l10n/l10n_util.h" |
22 #include "views/widget/widget.h" | |
23 | 25 |
24 namespace { | 26 namespace { |
25 HungRendererDialog* g_instance = NULL; | 27 HungRendererDialog* g_instance = NULL; |
26 const int kHungRendererDialogWidth = 425; | 28 const int kHungRendererDialogWidth = 425; |
27 const int kHungRendererDialogHeight = 200; | 29 const int kHungRendererDialogHeight = 200; |
28 } | 30 } |
29 | 31 |
30 namespace browser { | 32 namespace browser { |
31 | 33 |
32 void ShowHungRendererDialog(TabContents* contents) { | 34 void ShowHungRendererDialog(TabContents* contents) { |
33 HungRendererDialog::ShowHungRendererDialog(contents); | 35 if (ChromeWebUI::IsMoreWebUI()) { |
| 36 HungRendererDialog::ShowHungRendererDialog(contents); |
| 37 return; |
| 38 } |
| 39 |
| 40 ShowNativeHungRendererDialog(contents); |
34 } | 41 } |
35 | 42 |
36 void HideHungRendererDialog(TabContents* contents) { | 43 void HideHungRendererDialog(TabContents* contents) { |
37 HungRendererDialog::HideHungRendererDialog(contents); | 44 if (ChromeWebUI::IsMoreWebUI()) { |
| 45 HungRendererDialog::HideHungRendererDialog(contents); |
| 46 return; |
| 47 } |
| 48 |
| 49 HideNativeHungRendererDialog(contents); |
38 } | 50 } |
39 | 51 |
40 } // namespace browser | 52 } // namespace browser |
41 | 53 |
42 //////////////////////////////////////////////////////////////////////////////// | 54 //////////////////////////////////////////////////////////////////////////////// |
43 // HungRendererDialog public static methods | 55 // HungRendererDialog public static methods |
44 | 56 |
45 void HungRendererDialog::ShowHungRendererDialog(TabContents* contents) { | 57 void HungRendererDialog::ShowHungRendererDialog(TabContents* contents) { |
46 if (!logging::DialogsAreSuppressed()) { | 58 if (!logging::DialogsAreSuppressed()) { |
47 if (g_instance) | 59 if (g_instance) |
48 return; | 60 return; |
49 g_instance = new HungRendererDialog(); | 61 g_instance = new HungRendererDialog(); |
50 g_instance->ShowDialog(contents); | 62 g_instance->ShowDialog(contents); |
51 } | 63 } |
52 } | 64 } |
53 | 65 |
54 void HungRendererDialog::HideHungRendererDialog(TabContents* contents) { | 66 void HungRendererDialog::HideHungRendererDialog(TabContents* contents) { |
55 if (!logging::DialogsAreSuppressed() && g_instance) | 67 if (!logging::DialogsAreSuppressed() && g_instance) |
56 g_instance->HideDialog(contents); | 68 g_instance->HideDialog(contents); |
57 } | 69 } |
58 | 70 |
59 | 71 |
60 //////////////////////////////////////////////////////////////////////////////// | 72 //////////////////////////////////////////////////////////////////////////////// |
61 // HungRendererDialog private methods | 73 // HungRendererDialog private methods |
62 | 74 |
63 HungRendererDialog::HungRendererDialog() | 75 HungRendererDialog::HungRendererDialog() |
64 : contents_(NULL), | 76 : contents_(NULL), |
| 77 handler_(NULL), |
65 window_(NULL) { | 78 window_(NULL) { |
66 } | 79 } |
67 | 80 |
68 void HungRendererDialog::ShowDialog(TabContents* contents) { | 81 void HungRendererDialog::ShowDialog(TabContents* contents) { |
69 DCHECK(contents); | 82 DCHECK(contents); |
70 contents_ = contents; | 83 contents_ = contents; |
71 Browser* browser = BrowserList::GetLastActive(); | 84 Browser* browser = BrowserList::GetLastActive(); |
72 DCHECK(browser); | 85 DCHECK(browser); |
| 86 handler_ = new HungRendererDialogHandler(contents_); |
73 window_ = browser->BrowserShowHtmlDialog(this, NULL); | 87 window_ = browser->BrowserShowHtmlDialog(this, NULL); |
74 } | 88 } |
75 | 89 |
76 void HungRendererDialog::HideDialog(TabContents* contents) { | 90 void HungRendererDialog::HideDialog(TabContents* contents) { |
77 DCHECK(contents); | 91 DCHECK(contents); |
78 // Don't close the dialog if it's a TabContents for some other renderer. | 92 // Don't close the dialog if it's a TabContents for some other renderer. |
79 if (contents_ && contents_->GetRenderProcessHost() != | 93 if (contents_ && contents_->GetRenderProcessHost() != |
80 contents->GetRenderProcessHost()) | 94 contents->GetRenderProcessHost()) |
81 return; | 95 return; |
82 // Settings |contents_| to NULL prevents the hang monitor from restarting. | 96 // Settings |contents_| to NULL prevents the hang monitor from restarting. |
83 // We do this because the close dialog handler runs whether it is trigged by | 97 // We do this because the close dialog handler runs whether it is trigged by |
84 // the user closing the box, or by being closed externally with widget->Close. | 98 // the user closing the box, or by being closed externally with widget->Close. |
85 contents_ = NULL; | 99 contents_ = NULL; |
86 views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window_); | 100 DCHECK(handler_); |
87 DCHECK(widget); | 101 handler_->CloseDialog(); |
88 widget->Close(); | |
89 } | 102 } |
90 | 103 |
91 bool HungRendererDialog::IsDialogModal() const { | 104 bool HungRendererDialog::IsDialogModal() const { |
92 return false; | 105 return false; |
93 } | 106 } |
94 | 107 |
95 string16 HungRendererDialog::GetDialogTitle() const { | 108 string16 HungRendererDialog::GetDialogTitle() const { |
96 return l10n_util::GetStringUTF16(IDS_BROWSER_HANGMONITOR_RENDERER_TITLE); | 109 return l10n_util::GetStringUTF16(IDS_BROWSER_HANGMONITOR_RENDERER_TITLE); |
97 } | 110 } |
98 | 111 |
99 GURL HungRendererDialog::GetDialogContentURL() const { | 112 GURL HungRendererDialog::GetDialogContentURL() const { |
100 return GURL(chrome::kChromeUIHungRendererDialogURL); | 113 return GURL(chrome::kChromeUIHungRendererDialogURL); |
101 } | 114 } |
102 | 115 |
103 void HungRendererDialog::GetWebUIMessageHandlers( | 116 void HungRendererDialog::GetWebUIMessageHandlers( |
104 std::vector<WebUIMessageHandler*>* handlers) const { | 117 std::vector<WebUIMessageHandler*>* handlers) const { |
105 handlers->push_back(new HungRendererDialogHandler(contents_)); | 118 handlers->push_back(handler_); |
106 } | 119 } |
107 | 120 |
108 void HungRendererDialog::GetDialogSize(gfx::Size* size) const { | 121 void HungRendererDialog::GetDialogSize(gfx::Size* size) const { |
109 size->SetSize(kHungRendererDialogWidth, kHungRendererDialogHeight); | 122 size->SetSize(kHungRendererDialogWidth, kHungRendererDialogHeight); |
110 } | 123 } |
111 | 124 |
112 std::string HungRendererDialog::GetDialogArgs() const { | 125 std::string HungRendererDialog::GetDialogArgs() const { |
113 return std::string(); // There are no args used. | 126 return std::string(); // There are no args used. |
114 } | 127 } |
115 | 128 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 } | 161 } |
149 | 162 |
150 //////////////////////////////////////////////////////////////////////////////// | 163 //////////////////////////////////////////////////////////////////////////////// |
151 // HungRendererDialogHandler methods | 164 // HungRendererDialogHandler methods |
152 | 165 |
153 HungRendererDialogHandler::HungRendererDialogHandler( | 166 HungRendererDialogHandler::HungRendererDialogHandler( |
154 TabContents* contents) | 167 TabContents* contents) |
155 : contents_(contents) { | 168 : contents_(contents) { |
156 } | 169 } |
157 | 170 |
| 171 void HungRendererDialogHandler::CloseDialog() { |
| 172 DCHECK(web_ui_); |
| 173 static_cast<HtmlDialogUI*>(web_ui_)->CloseDialog(NULL); |
| 174 } |
| 175 |
158 void HungRendererDialogHandler::RegisterMessages() { | 176 void HungRendererDialogHandler::RegisterMessages() { |
159 web_ui_->RegisterMessageCallback("requestTabContentsList", | 177 web_ui_->RegisterMessageCallback("requestTabContentsList", |
160 NewCallback(this, | 178 NewCallback(this, |
161 &HungRendererDialogHandler::RequestTabContentsList)); | 179 &HungRendererDialogHandler::RequestTabContentsList)); |
162 } | 180 } |
163 | 181 |
164 void HungRendererDialogHandler::RequestTabContentsList( | 182 void HungRendererDialogHandler::RequestTabContentsList( |
165 const base::ListValue* args) { | 183 const base::ListValue* args) { |
166 ListValue tab_contents_list; | 184 ListValue tab_contents_list; |
167 for (TabContentsIterator it; !it.done(); ++it) { | 185 for (TabContentsIterator it; !it.done(); ++it) { |
168 if (it->tab_contents()->GetRenderProcessHost() == | 186 if (it->tab_contents()->GetRenderProcessHost() == |
169 contents_->GetRenderProcessHost()) { | 187 contents_->GetRenderProcessHost()) { |
170 string16 title = it->tab_contents()->GetTitle(); | 188 string16 title = it->tab_contents()->GetTitle(); |
171 if (title.empty()) | 189 if (title.empty()) |
172 title = TabContentsWrapper::GetDefaultTitle(); | 190 title = TabContentsWrapper::GetDefaultTitle(); |
173 // Add details for |url| and |title|. | 191 // Add details for |url| and |title|. |
174 DictionaryValue* dict = new DictionaryValue(); | 192 DictionaryValue* dict = new DictionaryValue(); |
175 dict->SetString("url", it->tab_contents()->GetURL().spec()); | 193 dict->SetString("url", it->tab_contents()->GetURL().spec()); |
176 dict->SetString("title", title); | 194 dict->SetString("title", title); |
177 tab_contents_list.Append(dict); | 195 tab_contents_list.Append(dict); |
178 } | 196 } |
179 } | 197 } |
180 // Send list of tab contents details to javascript. | 198 // Send list of tab contents details to javascript. |
181 web_ui_->CallJavascriptFunction("hungRendererDialog.setTabContentsList", | 199 web_ui_->CallJavascriptFunction("hungRendererDialog.setTabContentsList", |
182 tab_contents_list); | 200 tab_contents_list); |
183 } | 201 } |
OLD | NEW |