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

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: Using factory callback for prompts 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(const PermissionIDSet& allowed_permissions);
90 std::unique_ptr<ExtensionInstallPrompt> PromptFactory();
91 ProgrammableInstallPrompt* CallHandlePermissionRequest(
92 const scoped_refptr<Extension>& extension,
93 const PermissionIDSet& permissions);
94
95 protected:
96 scoped_refptr<Extension> extension_a_;
97 scoped_refptr<Extension> extension_b_;
98
99 std::vector<PermissionIDSet> allowed_permissions_;
100 ProgrammableInstallPrompt* last_prompt_;
101
102 private:
103 DISALLOW_COPY_AND_ASSIGN(PublicSessionPermissionHelperTest);
104 };
105
106 void PublicSessionPermissionHelperTest::SetUp() {
107 ChromeRenderViewHostTestHarness::SetUp();
108 extension_a_ = LoadManifestHelper("extension_a");
109 extension_b_ = LoadManifestHelper("extension_b");
110 }
111
112 void PublicSessionPermissionHelperTest::TearDown() {
113 ResetPermissionsForTesting();
114 ChromeRenderViewHostTestHarness::TearDown();
115 }
116
117 void PublicSessionPermissionHelperTest::RequestResolved(
118 const PermissionIDSet& allowed_permissions) {
119 allowed_permissions_.push_back(std::move(allowed_permissions));
120 }
121
122 std::unique_ptr<ExtensionInstallPrompt>
123 PublicSessionPermissionHelperTest::PromptFactory() {
124 last_prompt_ = new ProgrammableInstallPrompt(web_contents());
125 return base::WrapUnique<ExtensionInstallPrompt>(last_prompt_);
126 }
127
128 ProgrammableInstallPrompt*
129 PublicSessionPermissionHelperTest::CallHandlePermissionRequest(
130 const scoped_refptr<Extension>& extension,
131 const PermissionIDSet& permissions) {
132 auto factory_callback =
133 base::Bind(&PublicSessionPermissionHelperTest::PromptFactory,
134 base::Unretained(this));
135 last_prompt_ = nullptr;
Andrew T Wilson (Slow) 2017/02/10 17:17:21 It's messy to keep a last_prompt_ member variable
Ivan Šandrk 2017/02/10 18:46:25 Good point. Done.
136 HandlePermissionRequest(
137 *extension.get(), permissions, web_contents(),
138 base::Bind(&PublicSessionPermissionHelperTest::RequestResolved,
139 base::Unretained(this)),
140 &factory_callback);
141 return last_prompt_;
142 }
143
144 TEST_F(PublicSessionPermissionHelperTest, TestPermissionAllowed) {
145 // Allow permission_a for extension_a.
146 CallHandlePermissionRequest(extension_a_, {permission_a})
147 ->Resolve(Result::ACCEPTED);
148 EXPECT_TRUE(allowed_permissions_.back().Equals({permission_a}));
149
150 // permission_a was already allowed for extension_a.
151 CallHandlePermissionRequest(extension_a_, {permission_a});
152 EXPECT_TRUE(allowed_permissions_.back().Equals({permission_a}));
153
154 // permission_a was allowed only for extension_a.
155 CallHandlePermissionRequest(extension_b_, {permission_a})
156 ->Resolve(Result::USER_CANCELED);
157 EXPECT_TRUE(allowed_permissions_.back().Equals({}));
158 }
159
160 TEST_F(PublicSessionPermissionHelperTest, TestPermissionDenied) {
161 // Deny permission_a for extension_a.
162 CallHandlePermissionRequest(extension_a_, {permission_a})
163 ->Resolve(Result::USER_CANCELED);
164 EXPECT_TRUE(allowed_permissions_.back().Equals({}));
165
166 // Still denied (previous choice is remembered).
167 CallHandlePermissionRequest(extension_a_, {permission_a});
168 EXPECT_TRUE(allowed_permissions_.back().Equals({}));
169
170 // permission_a was denied only for extension_a.
171 CallHandlePermissionRequest(extension_b_, {permission_a})
172 ->Resolve(Result::ACCEPTED);
173 EXPECT_TRUE(allowed_permissions_.back().Equals({permission_a}));
174 }
175
176 TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsA) {
177 // Open two permission prompts.
178 auto prompt1 =
179 CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
180 CallHandlePermissionRequest(extension_a_, {permission_b});
181 // prompt1 resolves both permission requests (second permission request
182 // doesn't show a prompt as permission_b is already prompted by first
183 // permission request).
184 prompt1->Resolve(Result::ACCEPTED);
185 EXPECT_TRUE(allowed_permissions_[0].Equals({permission_a, permission_b}));
186 EXPECT_TRUE(allowed_permissions_[1].Equals({permission_b}));
187 }
188
189 TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsB) {
190 auto prompt1 = CallHandlePermissionRequest(extension_a_, {permission_a});
191 auto prompt2 =
192 CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
193 // prompt2 resolves only permission_b because prompt1 already prompted for
194 // permission_a.
195 prompt2->Resolve(Result::ACCEPTED);
196 EXPECT_EQ(allowed_permissions_.size(), 0u);
197 prompt1->Resolve(Result::ACCEPTED);
198 EXPECT_TRUE(allowed_permissions_[0].Equals({permission_a}));
199 EXPECT_TRUE(allowed_permissions_[1].Equals({permission_a, permission_b}));
200 }
201
202 TEST_F(PublicSessionPermissionHelperTest, TestTwoPromptsDeny) {
203 auto prompt1 = CallHandlePermissionRequest(extension_a_, {permission_a});
204 auto prompt2 =
205 CallHandlePermissionRequest(extension_a_, {permission_a, permission_b});
206 prompt1->Resolve(Result::USER_CANCELED);
207 EXPECT_TRUE(allowed_permissions_[0].Equals({}));
208 prompt2->Resolve(Result::ACCEPTED);
209 EXPECT_TRUE(allowed_permissions_[1].Equals({permission_b}));
210 }
211
212 } // namespace permission_helper
213 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698