blob: d4da61adb4490a98a90700e9dc6d7aaf7d0a9eca [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
#include "chrome/browser/ui/webui/constrained_web_dialog_ui.h"
#include "base/run_loop.h"
#include "base/test/bind.h"
#include "chrome/test/base/testing_profile.h"
#include "content/public/test/browser_task_environment.h"
#include "content/public/test/test_renderer_host.h"
#include "content/public/test/test_web_ui.h"
#include "content/public/test/web_contents_tester.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/web_dialogs/test/test_web_dialog_delegate.h"
#include "url/gurl.h"
namespace {
class TestConstrainedWebDialogDelegate : public ConstrainedWebDialogDelegate {
public:
TestConstrainedWebDialogDelegate() {
web_dialog_delegate_ = std::make_unique<ui::WebDialogDelegate>();
web_dialog_delegate_->set_delete_on_close(false);
}
// ConstrainedWebDialogDelegate::GetWebDialogDelegate w/ covariant returns
const ui::WebDialogDelegate* GetWebDialogDelegate() const override {
return web_dialog_delegate_.get();
}
ui::WebDialogDelegate* GetWebDialogDelegate() override {
return web_dialog_delegate_.get();
}
// ConstrainedWebDialogDelegate:
void OnDialogCloseFromWebUI() override {}
std::unique_ptr<content::WebContents> ReleaseWebContents() override {
NOTREACHED();
return nullptr;
}
content::WebContents* GetWebContents() override {
NOTREACHED();
return nullptr;
}
gfx::NativeWindow GetNativeDialog() override {
NOTREACHED();
return nullptr;
}
gfx::Size GetConstrainedWebDialogMinimumSize() const override {
NOTREACHED();
return gfx::Size();
}
gfx::Size GetConstrainedWebDialogMaximumSize() const override {
NOTREACHED();
return gfx::Size();
}
gfx::Size GetConstrainedWebDialogPreferredSize() const override {
NOTREACHED();
return gfx::Size();
}
private:
std::unique_ptr<ui::WebDialogDelegate> web_dialog_delegate_;
};
} // namespace
class ConstrainedWebDialogUITest : public ::testing::Test {
public:
ConstrainedWebDialogUITest() = default;
~ConstrainedWebDialogUITest() override = default;
protected:
void SetUp() override {
profile_ = std::make_unique<TestingProfile>();
web_contents_ = content::WebContentsTester::CreateTestWebContents(
profile_.get(), nullptr);
web_ui_ = std::make_unique<content::TestWebUI>();
web_ui_->set_web_contents(web_contents_.get());
dialog_delegate_ = std::make_unique<TestConstrainedWebDialogDelegate>();
dialog_ = std::make_unique<ConstrainedWebDialogUI>(web_ui_.get());
dialog_->WebUIRenderFrameCreated(web_contents_->GetPrimaryMainFrame());
ConstrainedWebDialogUI::SetConstrainedDelegate(web_contents_.get(),
dialog_delegate_.get());
}
content::TestWebUI* web_ui() { return web_ui_.get(); }
TestConstrainedWebDialogDelegate* dialog_delegate() {
return dialog_delegate_.get();
}
private:
content::BrowserTaskEnvironment task_environment_;
content::RenderViewHostTestEnabler render_view_host_test_enabler_;
std::unique_ptr<content::TestWebUI> web_ui_;
std::unique_ptr<ConstrainedWebDialogUI> dialog_;
std::unique_ptr<TestConstrainedWebDialogDelegate> dialog_delegate_;
std::unique_ptr<TestingProfile> profile_;
std::unique_ptr<content::WebContents> web_contents_;
};
// Demonstrates that empty args list won't cause a crash: crbug.com/1262467.
TEST_F(ConstrainedWebDialogUITest, DialogCloseWithEmptyArgs) {
base::RunLoop run_loop;
dialog_delegate()->GetWebDialogDelegate()->RegisterOnDialogClosedCallback(
base::BindLambdaForTesting([&](const std::string& json_retval) {
ASSERT_EQ(json_retval, "");
run_loop.Quit();
}));
base::Value::List args;
web_ui()->HandleReceivedMessage("dialogClose", args);
run_loop.Run();
}
TEST_F(ConstrainedWebDialogUITest, DialogCloseWithJsonInArgs) {
const std::string kJsonRetval = "[42]";
std::string json_retval;
base::RunLoop run_loop;
dialog_delegate()->GetWebDialogDelegate()->RegisterOnDialogClosedCallback(
base::BindLambdaForTesting([&](const std::string& cb_json_retval) {
json_retval = cb_json_retval;
run_loop.Quit();
}));
base::Value::List args;
args.Append(kJsonRetval);
web_ui()->HandleReceivedMessage("dialogClose", args);
run_loop.Run();
ASSERT_EQ(json_retval, kJsonRetval);
}