OLD | NEW |
| (Empty) |
1 // Copyright 2014 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 "android_webview/native/permission/aw_permission_request.h" | |
6 #include "android_webview/native/permission/aw_permission_request_delegate.h" | |
7 #include "android_webview/native/permission/permission_request_handler.h" | |
8 #include "android_webview/native/permission/permission_request_handler_client.h" | |
9 #include "base/bind.h" | |
10 #include "base/callback.h" | |
11 #include "testing/gtest/include/gtest/gtest.h" | |
12 | |
13 namespace android_webview { | |
14 | |
15 class TestAwPermissionRequestDelegate : public AwPermissionRequestDelegate { | |
16 public: | |
17 TestAwPermissionRequestDelegate( | |
18 const GURL& origin, int64 resources, base::Callback<void(bool)> callback) | |
19 : origin_(origin), | |
20 resources_(resources), | |
21 callback_(callback) {} | |
22 | |
23 // Get the origin which initiated the permission request. | |
24 virtual const GURL& GetOrigin() OVERRIDE { | |
25 return origin_; | |
26 } | |
27 | |
28 // Get the resources the origin wanted to access. | |
29 virtual int64 GetResources() OVERRIDE { | |
30 return resources_; | |
31 } | |
32 | |
33 // Notify the permission request is allowed or not. | |
34 virtual void NotifyRequestResult(bool allowed) OVERRIDE { | |
35 callback_.Run(allowed); | |
36 } | |
37 | |
38 private: | |
39 GURL origin_; | |
40 int64 resources_; | |
41 base::Callback<void(bool)> callback_; | |
42 }; | |
43 | |
44 class TestPermissionRequestHandlerClient : | |
45 public PermissionRequestHandlerClient { | |
46 public: | |
47 struct Permission { | |
48 Permission() | |
49 :resources(0) {} | |
50 Permission(const GURL& origin, int64 resources) | |
51 : origin(origin), | |
52 resources(resources) {} | |
53 GURL origin; | |
54 int64 resources; | |
55 }; | |
56 | |
57 virtual void OnPermissionRequest(AwPermissionRequest* request) OVERRIDE { | |
58 request_ = request; | |
59 requested_permission_ = | |
60 Permission(request->GetOrigin(), request->GetResources()); | |
61 } | |
62 | |
63 virtual void OnPermissionRequestCanceled( | |
64 AwPermissionRequest* request) OVERRIDE{ | |
65 canceled_permission_ = | |
66 Permission(request->GetOrigin(), request->GetResources()); | |
67 } | |
68 | |
69 AwPermissionRequest* request() { | |
70 return request_; | |
71 } | |
72 | |
73 const Permission& requested_permission() { | |
74 return requested_permission_; | |
75 } | |
76 | |
77 const Permission& canceled_permission() { | |
78 return canceled_permission_; | |
79 } | |
80 | |
81 void Grant() { | |
82 request_->OnAccept(NULL, NULL, true); | |
83 request_ = NULL; | |
84 } | |
85 | |
86 void Deny() { | |
87 request_->OnAccept(NULL, NULL, false); | |
88 request_ = NULL; | |
89 } | |
90 | |
91 private: | |
92 AwPermissionRequest* request_; | |
93 Permission requested_permission_; | |
94 Permission canceled_permission_; | |
95 }; | |
96 | |
97 class TestPermissionRequestHandler : public PermissionRequestHandler { | |
98 public: | |
99 TestPermissionRequestHandler(PermissionRequestHandlerClient* client) | |
100 : PermissionRequestHandler(client) { | |
101 } | |
102 | |
103 const std::vector<base::WeakPtr<AwPermissionRequest> > requests() { | |
104 return requests_; | |
105 } | |
106 | |
107 void PruneRequests() { | |
108 return PermissionRequestHandler::PruneRequests(); | |
109 } | |
110 }; | |
111 | |
112 class PermissionRequestHandlerTest : public testing::Test { | |
113 public: | |
114 PermissionRequestHandlerTest() | |
115 : handler_(&client_), | |
116 allowed_(false) {} | |
117 | |
118 void NotifyRequestResult(bool allowed) { | |
119 allowed_ = allowed; | |
120 } | |
121 | |
122 protected: | |
123 virtual void SetUp() OVERRIDE { | |
124 testing::Test::SetUp(); | |
125 origin_ = GURL("http://www.google.com"); | |
126 resources_ = | |
127 AwPermissionRequest::VideoCapture | AwPermissionRequest::AudioCapture; | |
128 delegate_.reset( | |
129 new TestAwPermissionRequestDelegate( | |
130 origin_, resources_, base::Bind( | |
131 &PermissionRequestHandlerTest::NotifyRequestResult, | |
132 base::Unretained(this)))); | |
133 } | |
134 | |
135 const GURL& origin() { | |
136 return origin_; | |
137 } | |
138 | |
139 int64 resources() { | |
140 return resources_; | |
141 } | |
142 | |
143 scoped_ptr<AwPermissionRequestDelegate> delegate() { | |
144 return delegate_.Pass(); | |
145 } | |
146 | |
147 TestPermissionRequestHandler* handler() { | |
148 return &handler_; | |
149 } | |
150 | |
151 TestPermissionRequestHandlerClient* client() { | |
152 return &client_; | |
153 } | |
154 | |
155 bool allowed() { | |
156 return allowed_; | |
157 } | |
158 | |
159 private: | |
160 GURL origin_; | |
161 int64 resources_; | |
162 scoped_ptr<AwPermissionRequestDelegate> delegate_; | |
163 TestPermissionRequestHandlerClient client_; | |
164 TestPermissionRequestHandler handler_; | |
165 bool allowed_; | |
166 }; | |
167 | |
168 TEST_F(PermissionRequestHandlerTest, TestPermissionGranted) { | |
169 handler()->SendRequest(delegate().Pass()); | |
170 // Verify Handler store the request correctly. | |
171 ASSERT_EQ(1u, handler()->requests().size()); | |
172 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); | |
173 EXPECT_EQ(resources(), handler()->requests()[0]->GetResources()); | |
174 | |
175 // Verify client's onPermissionRequest was called | |
176 EXPECT_EQ(origin(), client()->request()->GetOrigin()); | |
177 EXPECT_EQ(resources(), client()->request()->GetResources()); | |
178 | |
179 // Simulate the grant request. | |
180 client()->Grant(); | |
181 // Verify the request is notified as granted | |
182 EXPECT_TRUE(allowed()); | |
183 handler()->PruneRequests(); | |
184 // Verify the weak reference in handler was removed. | |
185 EXPECT_TRUE(handler()->requests().empty()); | |
186 } | |
187 | |
188 TEST_F(PermissionRequestHandlerTest, TestPermissionDenied) { | |
189 handler()->SendRequest(delegate().Pass()); | |
190 // Verify Handler store the request correctly. | |
191 ASSERT_EQ(1u, handler()->requests().size()); | |
192 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); | |
193 EXPECT_EQ(resources(), handler()->requests()[0]->GetResources()); | |
194 | |
195 // Verify client's onPermissionRequest was called | |
196 EXPECT_EQ(origin(), client()->request()->GetOrigin()); | |
197 EXPECT_EQ(resources(), client()->request()->GetResources()); | |
198 | |
199 // Simulate the deny request. | |
200 client()->Deny(); | |
201 // Verify the request is notified as granted | |
202 EXPECT_FALSE(allowed()); | |
203 handler()->PruneRequests(); | |
204 // Verify the weak reference in handler was removed. | |
205 EXPECT_TRUE(handler()->requests().empty()); | |
206 } | |
207 | |
208 TEST_F(PermissionRequestHandlerTest, TestMultiplePermissionRequest) { | |
209 GURL origin1 = GURL("http://a.google.com"); | |
210 int64 resources1 = AwPermissionRequest::Geolocation; | |
211 | |
212 scoped_ptr<AwPermissionRequestDelegate> delegate1; | |
213 delegate1.reset(new TestAwPermissionRequestDelegate( | |
214 origin1, resources1, | |
215 base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult, | |
216 base::Unretained(this)))); | |
217 | |
218 // Send 1st request | |
219 handler()->SendRequest(delegate().Pass()); | |
220 // Verify Handler store the request correctly. | |
221 ASSERT_EQ(1u, handler()->requests().size()); | |
222 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); | |
223 EXPECT_EQ(resources(), handler()->requests()[0]->GetResources()); | |
224 // Verify client's onPermissionRequest was called | |
225 EXPECT_EQ(origin(), client()->request()->GetOrigin()); | |
226 EXPECT_EQ(resources(), client()->request()->GetResources()); | |
227 | |
228 // Send 2nd request | |
229 handler()->SendRequest(delegate1.Pass()); | |
230 // Verify Handler store the request correctly. | |
231 ASSERT_EQ(2u, handler()->requests().size()); | |
232 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); | |
233 EXPECT_EQ(resources(), handler()->requests()[0]->GetResources()); | |
234 EXPECT_EQ(origin1, handler()->requests()[1]->GetOrigin()); | |
235 EXPECT_EQ(resources1, handler()->requests()[1]->GetResources()); | |
236 // Verify client's onPermissionRequest was called | |
237 EXPECT_EQ(origin1, client()->request()->GetOrigin()); | |
238 EXPECT_EQ(resources1, client()->request()->GetResources()); | |
239 | |
240 // Send 3rd request which has same origin and resources as first one. | |
241 delegate1.reset(new TestAwPermissionRequestDelegate(origin(), resources(), | |
242 base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult, | |
243 base::Unretained(this)))); | |
244 handler()->SendRequest(delegate1.Pass()); | |
245 // Verify Handler store the request correctly. | |
246 ASSERT_EQ(3u, handler()->requests().size()); | |
247 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); | |
248 EXPECT_EQ(resources(), handler()->requests()[0]->GetResources()); | |
249 EXPECT_EQ(origin1, handler()->requests()[1]->GetOrigin()); | |
250 EXPECT_EQ(resources1, handler()->requests()[1]->GetResources()); | |
251 EXPECT_EQ(origin(), handler()->requests()[2]->GetOrigin()); | |
252 EXPECT_EQ(resources(), handler()->requests()[2]->GetResources()); | |
253 // Verify client's onPermissionRequest was called | |
254 EXPECT_EQ(origin(), client()->request()->GetOrigin()); | |
255 EXPECT_EQ(resources(), client()->request()->GetResources()); | |
256 | |
257 // Cancel the request. | |
258 handler()->CancelRequest(origin(), resources()); | |
259 // Verify client's OnPermissionRequestCancled() was called. | |
260 EXPECT_EQ(origin(), client()->canceled_permission().origin); | |
261 EXPECT_EQ(resources(), client()->canceled_permission().resources); | |
262 // Verify Handler store the request correctly, the 1st and 3rd were removed. | |
263 handler()->PruneRequests(); | |
264 ASSERT_EQ(1u, handler()->requests().size()); | |
265 EXPECT_EQ(origin1, handler()->requests()[0]->GetOrigin()); | |
266 EXPECT_EQ(resources1, handler()->requests()[0]->GetResources()); | |
267 } | |
268 | |
269 } // android_webview | |
OLD | NEW |