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

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: Drew's comments 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/run_loop.h"
15 #include "chrome/browser/extensions/extension_install_prompt.h"
16 #include "chrome/common/extensions/extension_test_util.h"
17 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
18 #include "content/public/browser/web_contents.h"
19 #include "extensions/browser/extension_dialog_auto_confirm.h"
20 #include "extensions/common/extension.h"
21 #include "extensions/common/manifest.h"
22 #include "extensions/common/permissions/api_permission.h"
23 #include "testing/gtest/include/gtest/gtest.h"
24
25 using extension_test_util::LoadManifestUnchecked;
26 using content::WebContents;
27 using extensions::APIPermission;
28 using extensions::Extension;
29 using extensions::Manifest;
30 using Result = ExtensionInstallPrompt::Result;
31
32 namespace {
33
34 auto permission_a = APIPermission::kAudio;
35 auto permission_b = APIPermission::kBookmark;
36
37 scoped_refptr<Extension> LoadManifestHelper(const std::string& id) {
38 std::string error;
39 scoped_refptr<Extension> extension = LoadManifestUnchecked(
40 "common/background_page", "manifest.json", Manifest::INVALID_LOCATION,
41 Extension::NO_FLAGS, id, &error);
42 EXPECT_TRUE(extension.get()) << error;
43 return extension;
44 }
45
46 class ProgrammableInstallPrompt : public ExtensionInstallPrompt {
Devlin 2017/02/10 19:54:46 Can we use a ScopedTestDialogAutoConfirm (extensio
Ivan Šandrk 2017/02/13 13:18:20 I used it in the first iteration of the unittest,
47 public:
48 explicit ProgrammableInstallPrompt(WebContents* contents)
49 : ExtensionInstallPrompt(contents) {}
50
51 ~ProgrammableInstallPrompt() override {}
52
53 void ShowDialog(
54 const DoneCallback& done_callback,
55 const extensions::Extension* extension,
56 const SkBitmap* icon,
57 std::unique_ptr<Prompt> prompt,
58 std::unique_ptr<const extensions::PermissionSet> custom_permissions,
59 const ShowDialogCallback& show_dialog_callback) override {
60 done_callback_ = done_callback;
61 }
62
63 void Resolve(ExtensionInstallPrompt::Result result) {
64 done_callback_.Run(result);
65 }
66
67 private:
68 ExtensionInstallPrompt::DoneCallback done_callback_;
69
70 DISALLOW_COPY_AND_ASSIGN(ProgrammableInstallPrompt);
71 };
72
73 std::unique_ptr<ExtensionInstallPrompt> ReturnPrompt(
74 std::unique_ptr<ExtensionInstallPrompt> prompt,
75 WebContents* web_contents) {
76 return prompt;
77 }
78
79 } // namespace
80
81 namespace extensions {
82 namespace permission_helper {
83
84 class PublicSessionPermissionHelperTest
85 : public ChromeRenderViewHostTestHarness {
86 public:
87 PublicSessionPermissionHelperTest() {}
88 ~PublicSessionPermissionHelperTest() override {}
89
90 // testing::Test
91 void SetUp() override;
92 void TearDown() override;
93
94 // Class helpers.
95 void RequestResolved(const PermissionIDSet& allowed_permissions);
96 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 ProgrammableInstallPrompt*
127 PublicSessionPermissionHelperTest::CallHandlePermissionRequest(
128 const scoped_refptr<Extension>& extension,
129 const PermissionIDSet& permissions) {
130 auto prompt = new ProgrammableInstallPrompt(web_contents());
131 auto factory_callback = base::Bind(
132 &ReturnPrompt,
133 base::Passed(base::WrapUnique<ExtensionInstallPrompt>(prompt)));
134 HandlePermissionRequest(
135 *extension.get(), permissions, web_contents(),
136 base::Bind(&PublicSessionPermissionHelperTest::RequestResolved,
137 base::Unretained(this)),
138 factory_callback);
139 return prompt;
Andrew T Wilson (Slow) 2017/02/11 09:23:24 This looks great - one thing to keep in mind is th
Ivan Šandrk 2017/02/13 13:18:20 It did cross my mind, but I didn't worry too much
140 }
141
142 TEST_F(PublicSessionPermissionHelperTest, TestPermissionAllowed) {
143 // Allow permission_a for extension_a.
144 CallHandlePermissionRequest(extension_a_, {permission_a})
145 ->Resolve(Result::ACCEPTED);
146 EXPECT_TRUE(allowed_permissions_.back().Equals({permission_a}));
147
148 // permission_a was already allowed for extension_a.
149 CallHandlePermissionRequest(extension_a_, {permission_a});
150 EXPECT_TRUE(allowed_permissions_.back().Equals({permission_a}));
151
152 // permission_a was allowed only for extension_a.
153 CallHandlePermissionRequest(extension_b_, {permission_a})
154 ->Resolve(Result::USER_CANCELED);
155 EXPECT_TRUE(allowed_permissions_.back().Equals({}));
156 }
157
158 TEST_F(PublicSessionPermissionHelperTest, TestPermissionDenied) {
159 // Deny permission_a for extension_a.
160 CallHandlePermissionRequest(extension_a_, {permission_a})
161 ->Resolve(Result::USER_CANCELED);
162 EXPECT_TRUE(allowed_permissions_.back().Equals({}));
163
164 // Still denied (previous choice is remembered).
Devlin 2017/02/10 19:54:46 It would be nice to make sure we're actually remem
Ivan Šandrk 2017/02/13 13:18:20 I made some changes and now I can catch the dialog
165 CallHandlePermissionRequest(extension_a_, {permission_a});
166 EXPECT_TRUE(allowed_permissions_.back().Equals({}));
167
168 // permission_a was denied only for extension_a.
169 CallHandlePermissionRequest(extension_b_, {permission_a})
170 ->Resolve(Result::ACCEPTED);
171 EXPECT_TRUE(allowed_permissions_.back().Equals({permission_a}));
172 }
173
174 TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsA) {
175 // Open two permission prompts.
176 auto prompt1 =
177 CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
178 CallHandlePermissionRequest(extension_a_, {permission_b});
Devlin 2017/02/10 19:54:46 Here, too, it would be nice to assert that no prom
Ivan Šandrk 2017/02/13 13:18:20 Done.
179 // prompt1 resolves both permission requests (second permission request
180 // doesn't show a prompt as permission_b is already prompted by first
181 // permission request).
182 prompt1->Resolve(Result::ACCEPTED);
183 EXPECT_TRUE(allowed_permissions_[0].Equals({permission_a, permission_b}));
184 EXPECT_TRUE(allowed_permissions_[1].Equals({permission_b}));
185 }
186
187 TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsB) {
188 auto prompt1 = CallHandlePermissionRequest(extension_a_, {permission_a});
189 auto prompt2 =
190 CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
191 // prompt2 resolves only permission_b because prompt1 already prompted for
192 // permission_a.
193 prompt2->Resolve(Result::ACCEPTED);
194 EXPECT_EQ(allowed_permissions_.size(), 0u);
195 prompt1->Resolve(Result::ACCEPTED);
196 EXPECT_TRUE(allowed_permissions_[0].Equals({permission_a}));
197 EXPECT_TRUE(allowed_permissions_[1].Equals({permission_a, permission_b}));
198 }
199
200 TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsDeny) {
201 auto prompt1 = CallHandlePermissionRequest(extension_a_, {permission_a});
202 auto prompt2 =
203 CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
204 prompt1->Resolve(Result::USER_CANCELED);
205 EXPECT_TRUE(allowed_permissions_[0].Equals({}));
206 prompt2->Resolve(Result::ACCEPTED);
207 EXPECT_TRUE(allowed_permissions_[1].Equals({permission_b}));
208 }
209
210 } // namespace permission_helper
211 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698