blob: 2ffede30e8768c6cffb16f75b21cebf61bd25d6c [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/views/hung_renderer_view.h"
#include <string>
#include "base/bind_helpers.h"
#include "chrome/browser/platform_util.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/tab_dialogs.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/test/test_browser_dialog.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_delegate.h"
#include "content/public/test/browser_test_utils.h"
// Interactive UI tests for the hung renderer (aka page unresponsive) dialog.
class HungRendererDialogViewBrowserTest : public DialogBrowserTest {
public:
HungRendererDialogViewBrowserTest() {}
// Normally the dialog only shows multiple WebContents when they're all part
// of the same process, but that's hard to achieve in a test.
void AddWebContents(HungRendererDialogView* dialog,
content::WebContents* web_contents) {
HungPagesTableModel* model = dialog->hung_pages_table_model_.get();
model->tab_observers_.push_back(
std::make_unique<HungPagesTableModel::WebContentsObserverImpl>(
model, web_contents));
if (model->observer_)
model->observer_->OnModelChanged();
dialog->UpdateLabels();
}
// DialogBrowserTest:
void ShowUi(const std::string& name) override {
auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
HungRendererDialogView::Show(web_contents,
web_contents->GetRenderViewHost()->GetWidget(),
base::DoNothing::Repeatedly());
if (name == "MultiplePages") {
auto* web_contents2 = chrome::DuplicateTabAt(browser(), 0);
AddWebContents(HungRendererDialogView::GetInstance(), web_contents2);
}
}
private:
DISALLOW_COPY_AND_ASSIGN(HungRendererDialogViewBrowserTest);
};
// TODO(tapted): The framework sometimes doesn't pick up the spawned dialog and
// the ASSERT_EQ in TestBrowserUi::ShowAndVerifyUi() fails. This seems to only
// happen on the bots. So these tests are disabled for now.
IN_PROC_BROWSER_TEST_F(HungRendererDialogViewBrowserTest,
DISABLED_InvokeUi_Default) {
ShowAndVerifyUi();
}
IN_PROC_BROWSER_TEST_F(HungRendererDialogViewBrowserTest,
DISABLED_InvokeUi_MultiplePages) {
ShowAndVerifyUi();
}
// This is a regression test for https://crbug.com/855369.
IN_PROC_BROWSER_TEST_F(HungRendererDialogViewBrowserTest, InactiveWindow) {
// Simulate creation of the dialog, without initializing or showing it yet.
// This is what happens when HungRendererDialogView::ShowForWebContents
// returns early if the frame or the dialog are not active.
HungRendererDialogView::Create(browser()->window()->GetNativeWindow());
EXPECT_TRUE(HungRendererDialogView::GetInstance());
// Simulate the renderer becoming responsive again.
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
content::RenderWidgetHost* render_widget_host =
web_contents->GetRenderWidgetHostView()->GetRenderWidgetHost();
content::WebContentsDelegate* web_contents_delegate = browser();
web_contents_delegate->RendererResponsive(web_contents, render_widget_host);
}