Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(40)

Side by Side Diff: chrome/browser/task_manager/providers/web_contents/subframe_task_browsertest.cc

Issue 2427423003: Fix incorrect DCHECK in task manager's WebContentsEntry. (Closed)
Patch Set: Add test Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698