Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(202)

Side by Side Diff: chrome/browser/chromeos/extensions/public_session_permission_helper_unittest.cc

Issue 2697833004: Revert of Public Sessions - prompt the user for pageCapture requests (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/chromeos/extensions/public_session_permission_helper.h"
6
7 #include <memory>
8 #include <string>
9 #include <utility>
10 #include <vector>
11
12 #include "base/bind.h"
13 #include "base/memory/ptr_util.h"
14 #include "base/memory/weak_ptr.h"
15 #include "base/run_loop.h"
16 #include "chrome/browser/extensions/extension_install_prompt.h"
17 #include "chrome/common/extensions/extension_test_util.h"
18 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
19 #include "content/public/browser/web_contents.h"
20 #include "extensions/browser/extension_dialog_auto_confirm.h"
21 #include "extensions/common/extension.h"
22 #include "extensions/common/manifest.h"
23 #include "extensions/common/permissions/api_permission.h"
24 #include "testing/gtest/include/gtest/gtest.h"
25
26 using extension_test_util::LoadManifestUnchecked;
27 using content::WebContents;
28 using extensions::APIPermission;
29 using extensions::Extension;
30 using extensions::Manifest;
31 using Result = ExtensionInstallPrompt::Result;
32
33 namespace {
34
35 auto permission_a = APIPermission::kAudio;
36 auto permission_b = APIPermission::kBookmark;
37 bool did_show_dialog;
38
39 scoped_refptr<Extension> LoadManifestHelper(const std::string& id) {
40 std::string error;
41 scoped_refptr<Extension> extension = LoadManifestUnchecked(
42 "common/background_page", "manifest.json", Manifest::INVALID_LOCATION,
43 Extension::NO_FLAGS, id, &error);
44 EXPECT_TRUE(extension.get()) << error;
45 return extension;
46 }
47
48 bool get_did_show_dialog_and_reset() {
49 bool tmp = did_show_dialog;
50 did_show_dialog = false;
51 return tmp;
52 }
53
54 class ProgrammableInstallPrompt
55 : public ExtensionInstallPrompt,
56 public base::SupportsWeakPtr<ProgrammableInstallPrompt> {
57 public:
58 explicit ProgrammableInstallPrompt(WebContents* contents)
59 : ExtensionInstallPrompt(contents) {}
60
61 ~ProgrammableInstallPrompt() override {}
62
63 void ShowDialog(
64 const DoneCallback& done_callback,
65 const extensions::Extension* extension,
66 const SkBitmap* icon,
67 std::unique_ptr<Prompt> prompt,
68 std::unique_ptr<const extensions::PermissionSet> custom_permissions,
69 const ShowDialogCallback& show_dialog_callback) override {
70 done_callback_ = done_callback;
71 did_show_dialog = true;
72 }
73
74 void Resolve(ExtensionInstallPrompt::Result result) {
75 done_callback_.Run(result);
76 }
77
78 private:
79 ExtensionInstallPrompt::DoneCallback done_callback_;
80
81 DISALLOW_COPY_AND_ASSIGN(ProgrammableInstallPrompt);
82 };
83
84 } // namespace
85
86 namespace extensions {
87 namespace permission_helper {
88
89 class PublicSessionPermissionHelperTest
90 : public ChromeRenderViewHostTestHarness {
91 public:
92 PublicSessionPermissionHelperTest() {}
93 ~PublicSessionPermissionHelperTest() override {}
94
95 // testing::Test
96 void SetUp() override;
97 void TearDown() override;
98
99 // Class helpers.
100 void RequestResolved(const PermissionIDSet& allowed_permissions);
101 std::unique_ptr<ExtensionInstallPrompt> ReturnPrompt(
102 std::unique_ptr<ExtensionInstallPrompt> prompt,
103 WebContents* web_contents);
104 base::WeakPtr<ProgrammableInstallPrompt> CallHandlePermissionRequest(
105 const scoped_refptr<Extension>& extension,
106 const PermissionIDSet& permissions);
107
108 protected:
109 scoped_refptr<Extension> extension_a_;
110 scoped_refptr<Extension> extension_b_;
111
112 std::vector<PermissionIDSet> allowed_permissions_;
113
114 private:
115 DISALLOW_COPY_AND_ASSIGN(PublicSessionPermissionHelperTest);
116 };
117
118 void PublicSessionPermissionHelperTest::SetUp() {
119 ChromeRenderViewHostTestHarness::SetUp();
120 extension_a_ = LoadManifestHelper("extension_a");
121 extension_b_ = LoadManifestHelper("extension_b");
122 }
123
124 void PublicSessionPermissionHelperTest::TearDown() {
125 ResetPermissionsForTesting();
126 ChromeRenderViewHostTestHarness::TearDown();
127 }
128
129 void PublicSessionPermissionHelperTest::RequestResolved(
130 const PermissionIDSet& allowed_permissions) {
131 allowed_permissions_.push_back(allowed_permissions);
132 }
133
134 std::unique_ptr<ExtensionInstallPrompt>
135 PublicSessionPermissionHelperTest::ReturnPrompt(
136 std::unique_ptr<ExtensionInstallPrompt> prompt,
137 WebContents* web_contents) {
138 return prompt;
139 }
140
141 base::WeakPtr<ProgrammableInstallPrompt>
142 PublicSessionPermissionHelperTest::CallHandlePermissionRequest(
143 const scoped_refptr<Extension>& extension,
144 const PermissionIDSet& permissions) {
145 auto prompt = new ProgrammableInstallPrompt(web_contents());
146 auto prompt_weak_ptr = prompt->AsWeakPtr();
147 auto factory_callback = base::Bind(
148 &PublicSessionPermissionHelperTest::ReturnPrompt, base::Unretained(this),
149 base::Passed(base::WrapUnique<ExtensionInstallPrompt>(prompt)));
150 HandlePermissionRequest(
151 *extension.get(), permissions, web_contents(),
152 base::Bind(&PublicSessionPermissionHelperTest::RequestResolved,
153 base::Unretained(this)),
154 factory_callback);
155 // In case all permissions were already prompted, ReturnPrompt isn't called
156 // because of an early return in HandlePermissionRequest, and in that case the
157 // prompt is free'd as soon as HandlePermissionRequest returns (because it's
158 // owned by a unique_ptr). Using a weak ptr we can detect when this happens.
159 return prompt_weak_ptr;
160 }
161
162 TEST_F(PublicSessionPermissionHelperTest, TestPermissionAllowed) {
163 // Allow permission_a for extension_a.
164 auto prompt = CallHandlePermissionRequest(extension_a_, {permission_a});
165 EXPECT_TRUE(prompt);
166 EXPECT_TRUE(get_did_show_dialog_and_reset());
167 prompt->Resolve(Result::ACCEPTED);
168 EXPECT_TRUE(allowed_permissions_.at(0).Equals({permission_a}));
169
170 // permission_a was already allowed for extension_a hence no prompt is being
171 // shown, and the ProgrammableInstallPrompt that is passed in is already
172 // free'd after CallHandlePermissionRequest returns so the returned weak
173 // pointer should evaluate to false.
174 EXPECT_FALSE(CallHandlePermissionRequest(extension_a_, {permission_a}));
175 EXPECT_FALSE(get_did_show_dialog_and_reset());
176 EXPECT_TRUE(allowed_permissions_.at(1).Equals({permission_a}));
177
178 // permission_a was allowed only for extension_a.
179 prompt = CallHandlePermissionRequest(extension_b_, {permission_a});
180 EXPECT_TRUE(prompt);
181 EXPECT_TRUE(get_did_show_dialog_and_reset());
182 prompt->Resolve(Result::USER_CANCELED);
183 EXPECT_TRUE(allowed_permissions_.at(2).Equals({}));
184 }
185
186 TEST_F(PublicSessionPermissionHelperTest, TestPermissionDenied) {
187 // Deny permission_a for extension_a.
188 auto prompt = CallHandlePermissionRequest(extension_a_, {permission_a});
189 EXPECT_TRUE(prompt);
190 EXPECT_TRUE(get_did_show_dialog_and_reset());
191 prompt->Resolve(Result::USER_CANCELED);
192 EXPECT_TRUE(allowed_permissions_.at(0).Equals({}));
193
194 // Still denied (previous choice is remembered).
195 EXPECT_FALSE(CallHandlePermissionRequest(extension_a_, {permission_a}));
196 EXPECT_FALSE(get_did_show_dialog_and_reset());
197 EXPECT_TRUE(allowed_permissions_.at(1).Equals({}));
198
199 // permission_a was denied only for extension_a.
200 prompt = CallHandlePermissionRequest(extension_b_, {permission_a});
201 EXPECT_TRUE(prompt);
202 EXPECT_TRUE(get_did_show_dialog_and_reset());
203 prompt->Resolve(Result::ACCEPTED);
204 EXPECT_TRUE(allowed_permissions_.at(2).Equals({permission_a}));
205 }
206
207 TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsA) {
208 // Open two permission prompts.
209 auto prompt1 =
210 CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
211 EXPECT_TRUE(prompt1);
212 EXPECT_TRUE(get_did_show_dialog_and_reset());
213 EXPECT_FALSE(CallHandlePermissionRequest(extension_a_, {permission_b}));
214 EXPECT_FALSE(get_did_show_dialog_and_reset());
215 // prompt1 resolves both permission requests (second permission request
216 // doesn't show a prompt as permission_b is already prompted by first
217 // permission request).
218 prompt1->Resolve(Result::ACCEPTED);
219 EXPECT_TRUE(allowed_permissions_.at(0).Equals({permission_a, permission_b}));
220 EXPECT_TRUE(allowed_permissions_.at(1).Equals({permission_b}));
221 }
222
223 TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsB) {
224 auto prompt1 = CallHandlePermissionRequest(extension_a_, {permission_a});
225 EXPECT_TRUE(prompt1);
226 EXPECT_TRUE(get_did_show_dialog_and_reset());
227 auto prompt2 =
228 CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
229 EXPECT_TRUE(prompt2);
230 EXPECT_TRUE(get_did_show_dialog_and_reset());
231 // prompt2 resolves only permission_b because prompt1 already prompted for
232 // permission_a.
233 prompt2->Resolve(Result::ACCEPTED);
234 EXPECT_EQ(allowed_permissions_.size(), 0u);
235 prompt1->Resolve(Result::ACCEPTED);
236 EXPECT_TRUE(allowed_permissions_.at(0).Equals({permission_a}));
237 EXPECT_TRUE(allowed_permissions_.at(1).Equals({permission_a, permission_b}));
238 }
239
240 TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsDeny) {
241 auto prompt1 = CallHandlePermissionRequest(extension_a_, {permission_a});
242 EXPECT_TRUE(prompt1);
243 EXPECT_TRUE(get_did_show_dialog_and_reset());
244 auto prompt2 =
245 CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
246 EXPECT_TRUE(prompt2);
247 EXPECT_TRUE(get_did_show_dialog_and_reset());
248 prompt1->Resolve(Result::USER_CANCELED);
249 EXPECT_TRUE(allowed_permissions_.at(0).Equals({}));
250 prompt2->Resolve(Result::ACCEPTED);
251 EXPECT_TRUE(allowed_permissions_.at(1).Equals({permission_b}));
252 }
253
254 } // namespace permission_helper
255 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698