blob: 6415998ea784f7d624687e0382ec6f6f1f19e690 [file] [log] [blame]
[email protected]9c1662b2012-03-06 15:44:331// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]4af869a2010-04-02 21:49:532// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
avia2f4804a2015-12-24 23:11:135#include <stddef.h>
6
vitbare6d04562015-07-31 16:08:247#include "base/strings/string_number_conversions.h"
[email protected]135cb802013-06-09 16:44:208#include "base/strings/utf_string_conversions.h"
[email protected]4af869a2010-04-02 21:49:539#include "chrome/browser/extensions/extension_apitest.h"
[email protected]8ecad5e2010-12-02 21:18:3310#include "chrome/browser/profiles/profile.h"
[email protected]7b5dc002010-11-16 23:08:1011#include "chrome/browser/ui/browser.h"
[email protected]af44e7fb2011-07-29 18:32:3212#include "chrome/test/base/ui_test_utils.h"
vitbare6d04562015-07-31 16:08:2413#include "components/app_modal/app_modal_dialog_queue.h"
14#include "components/app_modal/javascript_app_modal_dialog.h"
15#include "components/app_modal/native_app_modal_dialog.h"
[email protected]f13ab892014-03-12 06:48:5216#include "content/public/browser/render_frame_host.h"
vitbare6d04562015-07-31 16:08:2417#include "content/public/test/test_utils.h"
[email protected]22401dc2014-03-21 01:38:5718#include "extensions/browser/extension_host.h"
[email protected]98b6d942013-11-10 00:34:0719#include "extensions/browser/process_manager.h"
[email protected]e4452d32013-11-15 23:07:4120#include "extensions/common/extension.h"
[email protected]4af869a2010-04-02 21:49:5321
vitbare6d04562015-07-31 16:08:2422namespace {
23
24void GetNextDialog(app_modal::NativeAppModalDialog** native_dialog) {
25 DCHECK(native_dialog);
26 *native_dialog = nullptr;
avi373e72a2017-05-26 20:33:5227 app_modal::JavaScriptAppModalDialog* dialog =
28 ui_test_utils::WaitForAppModalDialog();
29 *native_dialog = dialog->native_dialog();
vitbare6d04562015-07-31 16:08:2430 ASSERT_TRUE(*native_dialog);
31}
32
33void CloseDialog() {
34 app_modal::NativeAppModalDialog* dialog = nullptr;
35 ASSERT_NO_FATAL_FAILURE(GetNextDialog(&dialog));
36 dialog->CloseAppModalDialog();
37}
38
39void AcceptDialog() {
40 app_modal::NativeAppModalDialog* dialog = nullptr;
41 ASSERT_NO_FATAL_FAILURE(GetNextDialog(&dialog));
42 dialog->AcceptAppModalDialog();
43}
44
45void CancelDialog() {
46 app_modal::NativeAppModalDialog* dialog = nullptr;
47 ASSERT_NO_FATAL_FAILURE(GetNextDialog(&dialog));
48 dialog->CancelAppModalDialog();
49}
50
51void CheckAlertResult(const std::string& dialog_name,
52 size_t* call_count,
53 const base::Value* value) {
54 ASSERT_TRUE(value) << dialog_name;
jdoerrie1f536b22017-10-23 17:15:1155 ASSERT_TRUE(value->is_none());
vitbare6d04562015-07-31 16:08:2456 ++*call_count;
57}
58
59void CheckConfirmResult(const std::string& dialog_name,
60 bool expected_value,
61 size_t* call_count,
62 const base::Value* value) {
63 ASSERT_TRUE(value) << dialog_name;
64 bool current_value;
65 ASSERT_TRUE(value->GetAsBoolean(&current_value)) << dialog_name;
66 ASSERT_EQ(expected_value, current_value) << dialog_name;
67 ++*call_count;
68}
69
70} // namespace
71
[email protected]bf1948802010-04-08 20:58:3572IN_PROC_BROWSER_TEST_F(ExtensionApiTest, AlertBasic) {
[email protected]4af869a2010-04-02 21:49:5373 ASSERT_TRUE(RunExtensionTest("alert")) << message_;
74
[email protected]1c321ee2012-05-21 03:02:3475 const extensions::Extension* extension = GetSingleLoadedExtension();
[email protected]3a1dc572012-07-31 22:25:1376 extensions::ExtensionHost* host =
reillyg0ea3fa902014-10-28 15:30:2377 extensions::ProcessManager::Get(browser()->profile())
78 ->GetBackgroundHostForExtension(extension->id());
[email protected]4af869a2010-04-02 21:49:5379 ASSERT_TRUE(host);
Jochen Eisinger14ea9772015-07-24 12:04:3780 host->host_contents()->GetMainFrame()->ExecuteJavaScriptForTests(
[email protected]04338722013-12-24 23:18:0581 base::ASCIIToUTF16("alert('This should not crash.');"));
[email protected]4af869a2010-04-02 21:49:5382
vitbare6d04562015-07-31 16:08:2483 ASSERT_NO_FATAL_FAILURE(CloseDialog());
84}
85
86IN_PROC_BROWSER_TEST_F(ExtensionApiTest, AlertQueue) {
87 ASSERT_TRUE(RunExtensionTest("alert")) << message_;
88
89 const extensions::Extension* extension = GetSingleLoadedExtension();
90 extensions::ExtensionHost* host =
91 extensions::ProcessManager::Get(browser()->profile())
92 ->GetBackgroundHostForExtension(extension->id());
93 ASSERT_TRUE(host);
94
95 // Creates several dialogs at the same time.
96 const size_t num_dialogs = 3;
97 size_t call_count = 0;
98 for (size_t i = 0; i != num_dialogs; ++i) {
Brett Wilson5accd242017-11-30 22:07:3299 const std::string dialog_name = "Dialog #" + base::NumberToString(i) + ".";
vitbare6d04562015-07-31 16:08:24100 host->host_contents()->GetMainFrame()->ExecuteJavaScriptForTests(
101 base::ASCIIToUTF16("alert('" + dialog_name + "');"),
102 base::Bind(&CheckAlertResult, dialog_name,
103 base::Unretained(&call_count)));
104 }
105
106 // Closes these dialogs.
107 for (size_t i = 0; i != num_dialogs; ++i) {
108 ASSERT_NO_FATAL_FAILURE(AcceptDialog());
109 }
110
111 // All dialogs must be closed now.
112 app_modal::AppModalDialogQueue* queue =
113 app_modal::AppModalDialogQueue::GetInstance();
114 ASSERT_TRUE(queue);
115 EXPECT_FALSE(queue->HasActiveDialog());
116 EXPECT_EQ(0, queue->end() - queue->begin());
117 while (call_count < num_dialogs)
118 ASSERT_NO_FATAL_FAILURE(content::RunAllPendingInMessageLoop());
119}
120
121IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ConfirmQueue) {
122 ASSERT_TRUE(RunExtensionTest("alert")) << message_;
123
124 const extensions::Extension* extension = GetSingleLoadedExtension();
125 extensions::ExtensionHost* host =
126 extensions::ProcessManager::Get(browser()->profile())
127 ->GetBackgroundHostForExtension(extension->id());
128 ASSERT_TRUE(host);
129
130 // Creates several dialogs at the same time.
131 const size_t num_accepted_dialogs = 3;
132 const size_t num_cancelled_dialogs = 3;
133 size_t call_count = 0;
134 for (size_t i = 0; i != num_accepted_dialogs; ++i) {
135 const std::string dialog_name =
Brett Wilson5accd242017-11-30 22:07:32136 "Accepted dialog #" + base::NumberToString(i) + ".";
vitbare6d04562015-07-31 16:08:24137 host->host_contents()->GetMainFrame()->ExecuteJavaScriptForTests(
138 base::ASCIIToUTF16("confirm('" + dialog_name + "');"),
139 base::Bind(&CheckConfirmResult, dialog_name, true,
140 base::Unretained(&call_count)));
141 }
142 for (size_t i = 0; i != num_cancelled_dialogs; ++i) {
143 const std::string dialog_name =
Brett Wilson5accd242017-11-30 22:07:32144 "Cancelled dialog #" + base::NumberToString(i) + ".";
vitbare6d04562015-07-31 16:08:24145 host->host_contents()->GetMainFrame()->ExecuteJavaScriptForTests(
146 base::ASCIIToUTF16("confirm('" + dialog_name + "');"),
147 base::Bind(&CheckConfirmResult, dialog_name, false,
148 base::Unretained(&call_count)));
149 }
150
151 // Closes these dialogs.
152 for (size_t i = 0; i != num_accepted_dialogs; ++i)
153 ASSERT_NO_FATAL_FAILURE(AcceptDialog());
154 for (size_t i = 0; i != num_cancelled_dialogs; ++i)
155 ASSERT_NO_FATAL_FAILURE(CancelDialog());
156
157 // All dialogs must be closed now.
158 app_modal::AppModalDialogQueue* queue =
159 app_modal::AppModalDialogQueue::GetInstance();
160 ASSERT_TRUE(queue);
161 EXPECT_FALSE(queue->HasActiveDialog());
162 EXPECT_EQ(0, queue->end() - queue->begin());
163 while (call_count < num_accepted_dialogs + num_cancelled_dialogs)
164 ASSERT_NO_FATAL_FAILURE(content::RunAllPendingInMessageLoop());
[email protected]4af869a2010-04-02 21:49:53165}