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

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

Issue 2552203007: Public Sessions - prompt the user for pageCapture requests (Closed)
Patch Set: Unittest - WeakPtr, detecting prompt shown/not shown, nits 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
38 scoped_refptr<Extension> LoadManifestHelper(const std::string& id) {
39 std::string error;
40 scoped_refptr<Extension> extension = LoadManifestUnchecked(
41 "common/background_page", "manifest.json", Manifest::INVALID_LOCATION,
42 Extension::NO_FLAGS, id, &error);
43 EXPECT_TRUE(extension.get()) << error;
44 return extension;
45 }
46
47 class ProgrammableInstallPrompt
48 : public ExtensionInstallPrompt,
49 public base::SupportsWeakPtr<ProgrammableInstallPrompt> {
50 public:
51 explicit ProgrammableInstallPrompt(WebContents* contents)
52 : ExtensionInstallPrompt(contents) {}
53
54 ~ProgrammableInstallPrompt() override {}
55
56 void ShowDialog(
57 const DoneCallback& done_callback,
58 const extensions::Extension* extension,
59 const SkBitmap* icon,
60 std::unique_ptr<Prompt> prompt,
61 std::unique_ptr<const extensions::PermissionSet> custom_permissions,
62 const ShowDialogCallback& show_dialog_callback) override {
63 done_callback_ = done_callback;
64 }
65
66 void Resolve(ExtensionInstallPrompt::Result result) {
67 done_callback_.Run(result);
68 }
69
70 private:
71 ExtensionInstallPrompt::DoneCallback done_callback_;
72
73 DISALLOW_COPY_AND_ASSIGN(ProgrammableInstallPrompt);
74 };
75
76 } // namespace
77
78 namespace extensions {
79 namespace permission_helper {
80
81 class PublicSessionPermissionHelperTest
82 : public ChromeRenderViewHostTestHarness {
83 public:
84 PublicSessionPermissionHelperTest() {}
85 ~PublicSessionPermissionHelperTest() override {}
86
87 // testing::Test
88 void SetUp() override;
89 void TearDown() override;
90
91 // Class helpers.
92 void RequestResolved(const PermissionIDSet& allowed_permissions);
93 std::unique_ptr<ExtensionInstallPrompt> ReturnPrompt(
94 std::unique_ptr<ExtensionInstallPrompt> prompt,
95 WebContents* web_contents);
96 base::WeakPtr<ProgrammableInstallPrompt> CallHandlePermissionRequest(
97 const scoped_refptr<Extension>& extension,
98 const PermissionIDSet& permissions);
99
100 protected:
101 scoped_refptr<Extension> extension_a_;
102 scoped_refptr<Extension> extension_b_;
103
104 std::vector<PermissionIDSet> allowed_permissions_;
105
106 private:
107 DISALLOW_COPY_AND_ASSIGN(PublicSessionPermissionHelperTest);
108 };
109
110 void PublicSessionPermissionHelperTest::SetUp() {
111 ChromeRenderViewHostTestHarness::SetUp();
112 extension_a_ = LoadManifestHelper("extension_a");
113 extension_b_ = LoadManifestHelper("extension_b");
114 }
115
116 void PublicSessionPermissionHelperTest::TearDown() {
117 ResetPermissionsForTesting();
118 ChromeRenderViewHostTestHarness::TearDown();
119 }
120
121 void PublicSessionPermissionHelperTest::RequestResolved(
122 const PermissionIDSet& allowed_permissions) {
123 allowed_permissions_.push_back(allowed_permissions);
124 }
125
126 std::unique_ptr<ExtensionInstallPrompt>
127 PublicSessionPermissionHelperTest::ReturnPrompt(
128 std::unique_ptr<ExtensionInstallPrompt> prompt,
129 WebContents* web_contents) {
130 return prompt;
131 }
132
133 base::WeakPtr<ProgrammableInstallPrompt>
134 PublicSessionPermissionHelperTest::CallHandlePermissionRequest(
135 const scoped_refptr<Extension>& extension,
136 const PermissionIDSet& permissions) {
137 auto prompt = new ProgrammableInstallPrompt(web_contents());
138 auto prompt_weak_ptr = prompt->AsWeakPtr();
139 auto factory_callback = base::Bind(
140 &PublicSessionPermissionHelperTest::ReturnPrompt, base::Unretained(this),
141 base::Passed(base::WrapUnique<ExtensionInstallPrompt>(prompt)));
142 HandlePermissionRequest(
143 *extension.get(), permissions, web_contents(),
144 base::Bind(&PublicSessionPermissionHelperTest::RequestResolved,
145 base::Unretained(this)),
146 factory_callback);
147 // In case all permissions were already prompted, ReturnPrompt isn't called
Devlin 2017/02/13 22:34:00 To me, this seems like it's very dependent on the
Ivan Šandrk 2017/02/14 14:03:06 Good suggestion. Done.
148 // because of an early return in HandlePermissionRequest, and in that case the
149 // prompt is free'd as soon as HandlePermissionRequest returns (because it's
150 // owned by a unique_ptr). Using a weak ptr we can detect when this happens.
151 // Using this mechanism we can also detect whether the prompt was shown or
152 // not.
153 return prompt_weak_ptr;
154 }
155
156 TEST_F(PublicSessionPermissionHelperTest, TestPermissionAllowed) {
157 // Allow permission_a for extension_a.
158 auto prompt = CallHandlePermissionRequest(extension_a_, {permission_a});
159 EXPECT_TRUE(prompt);
Devlin 2017/02/13 22:34:00 s/EXPECT_TRUE(prompt)/EXPECT_TRUE(did_show_dialog(
160 prompt->Resolve(Result::ACCEPTED);
161 EXPECT_TRUE(allowed_permissions_.at(0).Equals({permission_a}));
162
Devlin 2017/02/13 22:34:00 reset_did_show_dialog();
163 // permission_a was already allowed for extension_a hence no prompt is being
164 // shown, and the ProgrammableInstallPrompt that is passed in is already
165 // free'd after CallHandlePermissionRequest returns so the returned weak
166 // pointer should evaluate to false.
167 EXPECT_FALSE(CallHandlePermissionRequest(extension_a_, {permission_a}));
Devlin 2017/02/13 22:34:00 EXPECT_FALSE(did_show_dialog())
168 EXPECT_TRUE(allowed_permissions_.at(1).Equals({permission_a}));
169
170 // permission_a was allowed only for extension_a.
171 prompt = CallHandlePermissionRequest(extension_b_, {permission_a});
172 EXPECT_TRUE(prompt);
Devlin 2017/02/13 22:34:00 EXPECT_TRUE(did_show_dialog()) ... etc It's a lit
173 prompt->Resolve(Result::USER_CANCELED);
174 EXPECT_TRUE(allowed_permissions_.at(2).Equals({}));
175 }
176
177 TEST_F(PublicSessionPermissionHelperTest, TestPermissionDenied) {
178 // Deny permission_a for extension_a.
179 auto prompt = CallHandlePermissionRequest(extension_a_, {permission_a});
180 EXPECT_TRUE(prompt);
181 prompt->Resolve(Result::USER_CANCELED);
182 EXPECT_TRUE(allowed_permissions_.at(0).Equals({}));
183
184 // Still denied (previous choice is remembered).
185 EXPECT_FALSE(CallHandlePermissionRequest(extension_a_, {permission_a}));
186 EXPECT_TRUE(allowed_permissions_.at(1).Equals({}));
187
188 // permission_a was denied only for extension_a.
189 prompt = CallHandlePermissionRequest(extension_b_, {permission_a});
190 EXPECT_TRUE(prompt);
191 prompt->Resolve(Result::ACCEPTED);
192 EXPECT_TRUE(allowed_permissions_.at(2).Equals({permission_a}));
193 }
194
195 TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsA) {
196 // Open two permission prompts.
197 auto prompt1 =
198 CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
199 EXPECT_TRUE(prompt1);
200 EXPECT_FALSE(CallHandlePermissionRequest(extension_a_, {permission_b}));
201 // prompt1 resolves both permission requests (second permission request
202 // doesn't show a prompt as permission_b is already prompted by first
203 // permission request).
204 prompt1->Resolve(Result::ACCEPTED);
205 EXPECT_TRUE(allowed_permissions_.at(0).Equals({permission_a, permission_b}));
206 EXPECT_TRUE(allowed_permissions_.at(1).Equals({permission_b}));
207 }
208
209 TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsB) {
210 auto prompt1 = CallHandlePermissionRequest(extension_a_, {permission_a});
211 EXPECT_TRUE(prompt1);
212 auto prompt2 =
213 CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
214 EXPECT_TRUE(prompt2);
215 // prompt2 resolves only permission_b because prompt1 already prompted for
216 // permission_a.
217 prompt2->Resolve(Result::ACCEPTED);
218 EXPECT_EQ(allowed_permissions_.size(), 0u);
219 prompt1->Resolve(Result::ACCEPTED);
220 EXPECT_TRUE(allowed_permissions_.at(0).Equals({permission_a}));
221 EXPECT_TRUE(allowed_permissions_.at(1).Equals({permission_a, permission_b}));
222 }
223
224 TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsDeny) {
225 auto prompt1 = CallHandlePermissionRequest(extension_a_, {permission_a});
226 EXPECT_TRUE(prompt1);
227 auto prompt2 =
228 CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
229 EXPECT_TRUE(prompt2);
230 prompt1->Resolve(Result::USER_CANCELED);
231 EXPECT_TRUE(allowed_permissions_.at(0).Equals({}));
232 prompt2->Resolve(Result::ACCEPTED);
233 EXPECT_TRUE(allowed_permissions_.at(1).Equals({permission_b}));
234 }
235
236 } // namespace permission_helper
237 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698