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 |