blob: 46859a1777dc4ec6ddbd12dc164db687a7e3fbb1 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <optional>
#include <string>
#include <utility>
#include "base/values.h"
#include "chrome/browser/controlled_frame/controlled_frame_permission_request_test_base.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace controlled_frame {
class ControlledFrameDialogBrowserTest
: public ControlledFrameTestBase,
public testing::WithParamInterface<bool> {
public:
void SetUpOnMainThread() override {
ControlledFrameTestBase::SetUpOnMainThread();
StartContentServer("web_apps/simple_isolated_app");
}
protected:
const std::string handle_dialog_str() const {
return GetParam() ? "ok" : "cancel";
}
};
IN_PROC_BROWSER_TEST_P(ControlledFrameDialogBrowserTest, Confirm) {
auto [app_frame, controlled_frame] =
InstallAndOpenIwaThenCreateControlledFrame(
/*controlled_frame_host_name=*/std::nullopt, "/index.html");
ASSERT_EQ("SUCCESS", content::EvalJs(app_frame, content::JsReplace(
R"(
(function() {
const frame = document.getElementsByTagName('controlledframe')[0];
if (!frame) {
return 'FAIL: Could not find a controlledframe element.';
}
frame.addEventListener('dialog', (e) => {
document.testLastDialog = e;
e.dialog[$1]();
});
return 'SUCCESS';
})();
)",
handle_dialog_str())));
EXPECT_EQ(GetParam(), content::EvalJs(controlled_frame,
R"(
(async function() {
try {
return await confirm('confirm test text');
} catch (err) {
return 'FAIL: ' + err.name + ': ' + err.message;
}
})();
)"));
EXPECT_EQ("confirm",
content::EvalJs(app_frame, "document.testLastDialog.messageType;"));
EXPECT_EQ("confirm test text",
content::EvalJs(app_frame, "document.testLastDialog.messageText;"));
EXPECT_EQ("", content::EvalJs(app_frame,
"document.testLastDialog.defaultPromptText;"));
}
IN_PROC_BROWSER_TEST_P(ControlledFrameDialogBrowserTest, Prompt) {
auto [app_frame, controlled_frame] =
InstallAndOpenIwaThenCreateControlledFrame(
/*controlled_frame_host_name=*/std::nullopt, "/index.html");
ASSERT_EQ("SUCCESS", content::EvalJs(app_frame, content::JsReplace(
R"(
(function() {
const frame = document.getElementsByTagName('controlledframe')[0];
if (!frame) {
return 'FAIL: Could not find a controlledframe element.';
}
frame.addEventListener('dialog', (e) => {
document.testLastDialog = e;
e.dialog[$1]('prompt non-default value');
});
return 'SUCCESS';
})();
)",
handle_dialog_str())));
EXPECT_EQ(
(GetParam() ? base::Value("prompt non-default value") : base::Value()),
content::EvalJs(controlled_frame,
R"(
(async function() {
try {
return await prompt('prompt test text', 'prompt default value');
} catch (err) {
return 'FAIL: ' + err.name + ': ' + err.message;
}
})();
)"));
EXPECT_EQ("prompt",
content::EvalJs(app_frame, "document.testLastDialog.messageType;"));
EXPECT_EQ("prompt test text",
content::EvalJs(app_frame, "document.testLastDialog.messageText;"));
EXPECT_EQ(
"prompt default value",
content::EvalJs(app_frame, "document.testLastDialog.defaultPromptText;"));
}
IN_PROC_BROWSER_TEST_P(ControlledFrameDialogBrowserTest, Alert) {
auto [app_frame, controlled_frame] =
InstallAndOpenIwaThenCreateControlledFrame(
/*controlled_frame_host_name=*/std::nullopt, "/index.html");
ASSERT_EQ("SUCCESS", content::EvalJs(app_frame, content::JsReplace(
R"(
(function() {
const frame = document.getElementsByTagName('controlledframe')[0];
if (!frame) {
return 'FAIL: Could not find a controlledframe element.';
}
frame.addEventListener('dialog', (e) => {
document.testLastDialog = e;
e.dialog[$1]();
});
return 'SUCCESS';
})();
)",
handle_dialog_str())));
EXPECT_EQ(base::Value(), content::EvalJs(controlled_frame,
R"(
(async function() {
try {
return await alert('alert test text');
} catch (err) {
return 'FAIL: ' + err.name + ': ' + err.message;
}
})();
)"));
EXPECT_EQ("alert",
content::EvalJs(app_frame, "document.testLastDialog.messageType;"));
EXPECT_EQ("alert test text",
content::EvalJs(app_frame, "document.testLastDialog.messageText;"));
EXPECT_EQ("", content::EvalJs(app_frame,
"document.testLastDialog.defaultPromptText;"));
}
INSTANTIATE_TEST_SUITE_P(/*no prefix*/
,
ControlledFrameDialogBrowserTest,
testing::Bool(),
[](const testing::TestParamInfo<bool>& info) {
return info.param ? "Ok" : "Cancel";
});
} // namespace controlled_frame