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

Unified 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, 8 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 side-by-side diff with in-line comments
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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/task_manager/providers/web_contents/subframe_task_browsertest.cc
diff --git a/chrome/browser/task_manager/providers/web_contents/subframe_task_browsertest.cc b/chrome/browser/task_manager/providers/web_contents/subframe_task_browsertest.cc
index 265f2f791cd0a0d4e9fdf95b04771b02119aaeeb..2bbf4cc1023fe74d2f05a9a2202ea979e43bedbb 100644
--- a/chrome/browser/task_manager/providers/web_contents/subframe_task_browsertest.cc
+++ b/chrome/browser/task_manager/providers/web_contents/subframe_task_browsertest.cc
@@ -11,6 +11,9 @@
#include "chrome/grit/generated_resources.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/render_widget_host.h"
+#include "content/public/browser/render_widget_host_view.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
@@ -136,6 +139,65 @@ IN_PROC_BROWSER_TEST_F(SubframeTaskBrowserTest, TaskManagerShowsSubframeTasks) {
simple_page_task->title());
}
+// Allows listening to unresponsive task events.
+class HungWebContentsTaskManager : public MockWebContentsTaskManager {
+ public:
+ HungWebContentsTaskManager() : unresponsive_task_(nullptr) {}
+ void TaskUnresponsive(Task* task) override { unresponsive_task_ = task; }
+
+ Task* unresponsive_task() { return unresponsive_task_; }
+
+ private:
+ Task* unresponsive_task_;
+};
+
+// If sites are isolated, makes sure that subframe tasks can react to
+// unresponsive renderers.
+IN_PROC_BROWSER_TEST_F(SubframeTaskBrowserTest, TaskManagerHungSubframe) {
+ // This test only makes sense if we have subframe processes.
+ if (!content::AreAllSitesIsolatedForTesting())
+ return;
+
+ HungWebContentsTaskManager task_manager;
+ EXPECT_TRUE(task_manager.tasks().empty());
+ task_manager.StartObserving();
+
+ NavigateTo(kCrossSitePageUrl);
+
+ // We expect SubframeTasks for b.com and c.com, in either order.
+ ASSERT_EQ(3U, task_manager.tasks().size());
+ const Task* subframe_task_1 = task_manager.tasks()[1];
+ const Task* subframe_task_2 = task_manager.tasks()[2];
+
+ EXPECT_EQ(Task::RENDERER, subframe_task_1->GetType());
+ EXPECT_EQ(Task::RENDERER, subframe_task_2->GetType());
+
+ EXPECT_TRUE(base::StartsWith(subframe_task_1->title(),
+ GetExpectedSubframeTitlePrefix(),
+ base::CompareCase::INSENSITIVE_ASCII));
+ EXPECT_TRUE(base::StartsWith(subframe_task_2->title(),
+ GetExpectedSubframeTitlePrefix(),
+ base::CompareCase::INSENSITIVE_ASCII));
+
+ // Nothing should have hung yet.
+ EXPECT_EQ(nullptr, task_manager.unresponsive_task());
+
+ // Simulate a hang in one of the subframe processes.
+ content::WebContents* web_contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ std::vector<content::RenderFrameHost*> frames = web_contents->GetAllFrames();
+ content::RenderFrameHost* subframe1 = frames[1];
+ SimulateUnresponsiveRenderer(web_contents,
+ subframe1->GetView()->GetRenderWidgetHost());
+
+ // Verify task_observer saw one of the two subframe tasks. (There's a race,
+ // so it could be either one.)
+ Task* unresponsive_task = task_manager.unresponsive_task();
+ EXPECT_NE(nullptr, unresponsive_task);
+ EXPECT_TRUE(unresponsive_task == subframe_task_1 ||
+ unresponsive_task == subframe_task_2);
+}
+
// A test for top document isolation and how subframes show up in the task
// manager as SubframeTasks.
class SubframeTaskTDIBrowserTest : public InProcessBrowserTest {
« 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