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

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: Const ref for passing PermissionIDSet around 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 {
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 } // namespace
74
75 namespace extensions {
76 namespace permission_helper {
77
78 class PublicSessionPermissionHelperTest
79 : public ChromeRenderViewHostTestHarness {
80 public:
81 PublicSessionPermissionHelperTest() {}
82 ~PublicSessionPermissionHelperTest() override {}
83
84 // testing::Test
85 void SetUp() override;
86 void TearDown() override;
87
88 // Class helpers.
89 void RequestResolved(PermissionIDSet allowed_permissions);
90 ProgrammableInstallPrompt* CallHandlePermissionRequest(
91 const scoped_refptr<Extension>& extension,
92 PermissionIDSet permissions);
93
94 protected:
95 scoped_refptr<Extension> extension_a_;
96 scoped_refptr<Extension> extension_b_;
97
98 std::vector<PermissionIDSet> allowed_permissions_;
99
100 private:
101 DISALLOW_COPY_AND_ASSIGN(PublicSessionPermissionHelperTest);
102 };
103
104 void PublicSessionPermissionHelperTest::SetUp() {
105 ChromeRenderViewHostTestHarness::SetUp();
106 extension_a_ = LoadManifestHelper("extension_a");
107 extension_b_ = LoadManifestHelper("extension_b");
108 }
109
110 void PublicSessionPermissionHelperTest::TearDown() {
111 ResetPermissionsForTesting();
112 ChromeRenderViewHostTestHarness::TearDown();
113 }
114
115 void PublicSessionPermissionHelperTest::RequestResolved(
116 PermissionIDSet allowed_permissions) {
117 allowed_permissions_.push_back(std::move(allowed_permissions));
118 }
119
120 ProgrammableInstallPrompt*
121 PublicSessionPermissionHelperTest::CallHandlePermissionRequest(
122 const scoped_refptr<Extension>& extension,
123 PermissionIDSet permissions) {
124 ProgrammableInstallPrompt* prompt =
125 new ProgrammableInstallPrompt(web_contents());
126 SetExtensionInstallPromptForTesting(prompt);
127 HandlePermissionRequest(
128 *extension.get(), std::move(permissions), web_contents(),
129 base::Bind(&PublicSessionPermissionHelperTest::RequestResolved,
130 base::Unretained(this)));
131 return prompt;
132 }
133
134 TEST_F(PublicSessionPermissionHelperTest, TestPermissionAllowed) {
135 // Allow permission_a for extension_a.
136 CallHandlePermissionRequest(extension_a_, {permission_a})
137 ->Resolve(Result::ACCEPTED);
138 EXPECT_TRUE(allowed_permissions_.back().Equals({permission_a}));
139
140 // permission_a was already allowed for extension_a.
141 CallHandlePermissionRequest(extension_a_, {permission_a});
142 EXPECT_TRUE(allowed_permissions_.back().Equals({permission_a}));
143
144 // permission_a was allowed only for extension_a.
145 CallHandlePermissionRequest(extension_b_, {permission_a})
146 ->Resolve(Result::USER_CANCELED);
147 EXPECT_TRUE(allowed_permissions_.back().Equals({}));
148 }
149
150 TEST_F(PublicSessionPermissionHelperTest, TestPermissionDenied) {
151 // Deny permission_a for extension_a.
152 CallHandlePermissionRequest(extension_a_, {permission_a})
153 ->Resolve(Result::USER_CANCELED);
154 EXPECT_TRUE(allowed_permissions_.back().Equals({}));
155
156 // Still denied (previous choice is remembered).
157 CallHandlePermissionRequest(extension_a_, {permission_a});
158 EXPECT_TRUE(allowed_permissions_.back().Equals({}));
159
160 // permission_a was denied only for extension_a.
161 CallHandlePermissionRequest(extension_b_, {permission_a})
162 ->Resolve(Result::ACCEPTED);
163 EXPECT_TRUE(allowed_permissions_.back().Equals({permission_a}));
164 }
165
166 TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsA) {
167 // Open two permission prompts.
168 auto prompt1 =
169 CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
170 CallHandlePermissionRequest(extension_a_, {permission_b});
171 // prompt1 resolves both permission requests (second permission request
172 // doesn't show a prompt as permission_b is already prompted by first
173 // permission request).
174 prompt1->Resolve(Result::ACCEPTED);
175 EXPECT_TRUE(allowed_permissions_[0].Equals({permission_a, permission_b}));
176 EXPECT_TRUE(allowed_permissions_[1].Equals({permission_b}));
177 }
178
179 TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsB) {
180 auto prompt1 = CallHandlePermissionRequest(extension_a_, {permission_a});
181 auto prompt2 =
182 CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
183 // prompt2 resolves only permission_b because prompt1 already prompted for
184 // permission_a.
185 prompt2->Resolve(Result::ACCEPTED);
186 EXPECT_EQ(allowed_permissions_.size(), 0u);
187 prompt1->Resolve(Result::ACCEPTED);
188 EXPECT_TRUE(allowed_permissions_[0].Equals({permission_a}));
189 EXPECT_TRUE(allowed_permissions_[1].Equals({permission_a, permission_b}));
190 }
191
192 TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsDeny) {
193 auto prompt1 = CallHandlePermissionRequest(extension_a_, {permission_a});
194 auto prompt2 =
195 CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
196 prompt1->Resolve(Result::USER_CANCELED);
197 EXPECT_TRUE(allowed_permissions_[0].Equals({}));
198 prompt2->Resolve(Result::ACCEPTED);
199 EXPECT_TRUE(allowed_permissions_[1].Equals({permission_b}));
200 }
201
202 } // namespace permission_helper
203 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698