OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "base/command_line.h" | 5 #include "base/command_line.h" |
6 #include "base/macros.h" | 6 #include "base/macros.h" |
7 #include "base/strings/utf_string_conversions.h" | 7 #include "base/strings/utf_string_conversions.h" |
8 #include "chrome/browser/task_manager/mock_web_contents_task_manager.h" | 8 #include "chrome/browser/task_manager/mock_web_contents_task_manager.h" |
9 #include "chrome/browser/ui/browser.h" | 9 #include "chrome/browser/ui/browser.h" |
10 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 10 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
11 #include "chrome/grit/generated_resources.h" | 11 #include "chrome/grit/generated_resources.h" |
12 #include "chrome/test/base/in_process_browser_test.h" | 12 #include "chrome/test/base/in_process_browser_test.h" |
13 #include "chrome/test/base/ui_test_utils.h" | 13 #include "chrome/test/base/ui_test_utils.h" |
| 14 #include "content/public/browser/render_frame_host.h" |
| 15 #include "content/public/browser/render_widget_host.h" |
| 16 #include "content/public/browser/render_widget_host_view.h" |
14 #include "content/public/common/content_switches.h" | 17 #include "content/public/common/content_switches.h" |
15 #include "content/public/test/browser_test_utils.h" | 18 #include "content/public/test/browser_test_utils.h" |
16 #include "content/public/test/test_utils.h" | 19 #include "content/public/test/test_utils.h" |
17 #include "net/dns/mock_host_resolver.h" | 20 #include "net/dns/mock_host_resolver.h" |
18 #include "net/test/embedded_test_server/embedded_test_server.h" | 21 #include "net/test/embedded_test_server/embedded_test_server.h" |
19 #include "ui/base/l10n/l10n_util.h" | 22 #include "ui/base/l10n/l10n_util.h" |
20 | 23 |
21 namespace task_manager { | 24 namespace task_manager { |
22 | 25 |
23 namespace { | 26 namespace { |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 // iframes, we expect not to have any SubframeTasks. | 132 // iframes, we expect not to have any SubframeTasks. |
130 NavigateTo(kSimplePageUrl); | 133 NavigateTo(kSimplePageUrl); |
131 | 134 |
132 ASSERT_EQ(1U, task_manager.tasks().size()); | 135 ASSERT_EQ(1U, task_manager.tasks().size()); |
133 const Task* simple_page_task = task_manager.tasks().front(); | 136 const Task* simple_page_task = task_manager.tasks().front(); |
134 EXPECT_EQ(Task::RENDERER, simple_page_task->GetType()); | 137 EXPECT_EQ(Task::RENDERER, simple_page_task->GetType()); |
135 EXPECT_EQ(PrefixExpectedTabTitle("Title Of Awesomeness"), | 138 EXPECT_EQ(PrefixExpectedTabTitle("Title Of Awesomeness"), |
136 simple_page_task->title()); | 139 simple_page_task->title()); |
137 } | 140 } |
138 | 141 |
| 142 // Allows listening to unresponsive task events. |
| 143 class HungWebContentsTaskManager : public MockWebContentsTaskManager { |
| 144 public: |
| 145 HungWebContentsTaskManager() : unresponsive_task_(nullptr) {} |
| 146 void TaskUnresponsive(Task* task) override { unresponsive_task_ = task; } |
| 147 |
| 148 Task* unresponsive_task() { return unresponsive_task_; } |
| 149 |
| 150 private: |
| 151 Task* unresponsive_task_; |
| 152 }; |
| 153 |
| 154 // If sites are isolated, makes sure that subframe tasks can react to |
| 155 // unresponsive renderers. |
| 156 IN_PROC_BROWSER_TEST_F(SubframeTaskBrowserTest, TaskManagerHungSubframe) { |
| 157 // This test only makes sense if we have subframe processes. |
| 158 if (!content::AreAllSitesIsolatedForTesting()) |
| 159 return; |
| 160 |
| 161 HungWebContentsTaskManager task_manager; |
| 162 EXPECT_TRUE(task_manager.tasks().empty()); |
| 163 task_manager.StartObserving(); |
| 164 |
| 165 NavigateTo(kCrossSitePageUrl); |
| 166 |
| 167 // We expect SubframeTasks for b.com and c.com, in either order. |
| 168 ASSERT_EQ(3U, task_manager.tasks().size()); |
| 169 const Task* subframe_task_1 = task_manager.tasks()[1]; |
| 170 const Task* subframe_task_2 = task_manager.tasks()[2]; |
| 171 |
| 172 EXPECT_EQ(Task::RENDERER, subframe_task_1->GetType()); |
| 173 EXPECT_EQ(Task::RENDERER, subframe_task_2->GetType()); |
| 174 |
| 175 EXPECT_TRUE(base::StartsWith(subframe_task_1->title(), |
| 176 GetExpectedSubframeTitlePrefix(), |
| 177 base::CompareCase::INSENSITIVE_ASCII)); |
| 178 EXPECT_TRUE(base::StartsWith(subframe_task_2->title(), |
| 179 GetExpectedSubframeTitlePrefix(), |
| 180 base::CompareCase::INSENSITIVE_ASCII)); |
| 181 |
| 182 // Nothing should have hung yet. |
| 183 EXPECT_EQ(nullptr, task_manager.unresponsive_task()); |
| 184 |
| 185 // Simulate a hang in one of the subframe processes. |
| 186 content::WebContents* web_contents = |
| 187 browser()->tab_strip_model()->GetActiveWebContents(); |
| 188 std::vector<content::RenderFrameHost*> frames = web_contents->GetAllFrames(); |
| 189 content::RenderFrameHost* subframe1 = frames[1]; |
| 190 SimulateUnresponsiveRenderer(web_contents, |
| 191 subframe1->GetView()->GetRenderWidgetHost()); |
| 192 |
| 193 // Verify task_observer saw one of the two subframe tasks. (There's a race, |
| 194 // so it could be either one.) |
| 195 Task* unresponsive_task = task_manager.unresponsive_task(); |
| 196 EXPECT_NE(nullptr, unresponsive_task); |
| 197 EXPECT_TRUE(unresponsive_task == subframe_task_1 || |
| 198 unresponsive_task == subframe_task_2); |
| 199 } |
| 200 |
139 // A test for top document isolation and how subframes show up in the task | 201 // A test for top document isolation and how subframes show up in the task |
140 // manager as SubframeTasks. | 202 // manager as SubframeTasks. |
141 class SubframeTaskTDIBrowserTest : public InProcessBrowserTest { | 203 class SubframeTaskTDIBrowserTest : public InProcessBrowserTest { |
142 public: | 204 public: |
143 SubframeTaskTDIBrowserTest() {} | 205 SubframeTaskTDIBrowserTest() {} |
144 ~SubframeTaskTDIBrowserTest() override {} | 206 ~SubframeTaskTDIBrowserTest() override {} |
145 | 207 |
146 void SetUpCommandLine(base::CommandLine* command_line) override { | 208 void SetUpCommandLine(base::CommandLine* command_line) override { |
147 InProcessBrowserTest::SetUpCommandLine(command_line); | 209 InProcessBrowserTest::SetUpCommandLine(command_line); |
148 command_line->AppendSwitch(switches::kTopDocumentIsolation); | 210 command_line->AppendSwitch(switches::kTopDocumentIsolation); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 base::UTF8ToUTF16(new_title)); | 267 base::UTF8ToUTF16(new_title)); |
206 EXPECT_TRUE(ExecuteScript(web_contents, script)); | 268 EXPECT_TRUE(ExecuteScript(web_contents, script)); |
207 base::string16 actual_title = title_watcher.WaitAndGetTitle(); | 269 base::string16 actual_title = title_watcher.WaitAndGetTitle(); |
208 EXPECT_EQ(new_title, base::UTF16ToUTF8(actual_title)); | 270 EXPECT_EQ(new_title, base::UTF16ToUTF8(actual_title)); |
209 | 271 |
210 EXPECT_EQ(PrefixExpectedTabTitle(new_title), main_task->title()); | 272 EXPECT_EQ(PrefixExpectedTabTitle(new_title), main_task->title()); |
211 EXPECT_EQ(PrefixExpectedTDIRowTitle(new_title), tdi_task->title()); | 273 EXPECT_EQ(PrefixExpectedTDIRowTitle(new_title), tdi_task->title()); |
212 } | 274 } |
213 | 275 |
214 } // namespace task_manager | 276 } // namespace task_manager |
OLD | NEW |