| // 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 |