1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file. 4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "android_webview/native/permission/aw_permission_request.h" 6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "android_webview/native/permission/aw_permission_request_delegate.h" 7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "android_webview/native/permission/permission_request_handler.h" 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "android_webview/native/permission/permission_request_handler_client.h" 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/bind.h" 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/callback.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace android_webview { 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class TestAwPermissionRequestDelegate : public AwPermissionRequestDelegate { 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TestAwPermissionRequestDelegate( 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GURL& origin, int64 resources, base::Callback<void(bool)> callback) 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : origin_(origin), 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) resources_(resources), 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) callback_(callback) {} 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Get the origin which initiated the permission request. 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual const GURL& GetOrigin() OVERRIDE { 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return origin_; 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Get the resources the origin wanted to access. 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual int64 GetResources() OVERRIDE { 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return resources_; 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Notify the permission request is allowed or not. 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void NotifyRequestResult(bool allowed) OVERRIDE { 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) callback_.Run(allowed); 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private: 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GURL origin_; 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int64 resources_; 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Callback<void(bool)> callback_; 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class TestPermissionRequestHandlerClient : 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public PermissionRequestHandlerClient { 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) struct Permission { 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Permission() 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) :resources(0) {} 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Permission(const GURL& origin, int64 resources) 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : origin(origin), 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) resources(resources) {} 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GURL origin; 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int64 resources; 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestPermissionRequestHandlerClient() 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : request_(NULL) {} 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void OnPermissionRequest(AwPermissionRequest* request) OVERRIDE { 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) request_ = request; 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) requested_permission_ = 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Permission(request->GetOrigin(), request->GetResources()); 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void OnPermissionRequestCanceled( 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AwPermissionRequest* request) OVERRIDE{ 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) canceled_permission_ = 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Permission(request->GetOrigin(), request->GetResources()); 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AwPermissionRequest* request() { 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return request_; 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const Permission& requested_permission() { 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return requested_permission_; 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const Permission& canceled_permission() { 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return canceled_permission_; 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void Grant() { 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) request_->OnAccept(NULL, NULL, true); 86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) request_ = NULL; 87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void Deny() { 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) request_->OnAccept(NULL, NULL, false); 91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) request_ = NULL; 92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void Reset() { 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) request_ = NULL; 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) requested_permission_ = Permission(); 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) canceled_permission_ = Permission(); 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private: 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AwPermissionRequest* request_; 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Permission requested_permission_; 103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Permission canceled_permission_; 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class TestPermissionRequestHandler : public PermissionRequestHandler { 107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TestPermissionRequestHandler(PermissionRequestHandlerClient* client) 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : PermissionRequestHandler(client, NULL) { 110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::vector<base::WeakPtr<AwPermissionRequest> > requests() { 113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return requests_; 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void PruneRequests() { 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return PermissionRequestHandler::PruneRequests(); 118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class PermissionRequestHandlerTest : public testing::Test { 122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PermissionRequestHandlerTest() 124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : handler_(&client_), 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) allowed_(false) {} 126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void NotifyRequestResult(bool allowed) { 128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) allowed_ = allowed; 129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) protected: 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void SetUp() OVERRIDE { 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) testing::Test::SetUp(); 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) origin_ = GURL("http://www.google.com"); 135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) resources_ = 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AwPermissionRequest::VideoCapture | AwPermissionRequest::AudioCapture; 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) delegate_.reset( 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new TestAwPermissionRequestDelegate( 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) origin_, resources_, base::Bind( 140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &PermissionRequestHandlerTest::NotifyRequestResult, 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Unretained(this)))); 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GURL& origin() { 145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return origin_; 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int64 resources() { 149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return resources_; 150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<AwPermissionRequestDelegate> delegate() { 153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return delegate_.Pass(); 154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TestPermissionRequestHandler* handler() { 157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return &handler_; 158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TestPermissionRequestHandlerClient* client() { 161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return &client_; 162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool allowed() { 165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return allowed_; 166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private: 169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GURL origin_; 170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int64 resources_; 171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<AwPermissionRequestDelegate> delegate_; 172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TestPermissionRequestHandlerClient client_; 173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TestPermissionRequestHandler handler_; 174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool allowed_; 175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(PermissionRequestHandlerTest, TestPermissionGranted) { 178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) handler()->SendRequest(delegate().Pass()); 179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify Handler store the request correctly. 180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(1u, handler()->requests().size()); 181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); 182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(resources(), handler()->requests()[0]->GetResources()); 183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify client's onPermissionRequest was called 185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(origin(), client()->request()->GetOrigin()); 186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(resources(), client()->request()->GetResources()); 187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Simulate the grant request. 189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) client()->Grant(); 190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify the request is notified as granted 191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(allowed()); 192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) handler()->PruneRequests(); 193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify the weak reference in handler was removed. 194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(handler()->requests().empty()); 195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(PermissionRequestHandlerTest, TestPermissionDenied) { 198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) handler()->SendRequest(delegate().Pass()); 199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify Handler store the request correctly. 200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(1u, handler()->requests().size()); 201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); 202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(resources(), handler()->requests()[0]->GetResources()); 203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify client's onPermissionRequest was called 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(origin(), client()->request()->GetOrigin()); 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(resources(), client()->request()->GetResources()); 207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Simulate the deny request. 209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) client()->Deny(); 210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify the request is notified as granted 211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(allowed()); 212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) handler()->PruneRequests(); 213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify the weak reference in handler was removed. 214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(handler()->requests().empty()); 215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(PermissionRequestHandlerTest, TestMultiplePermissionRequest) { 218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GURL origin1 = GURL("http://a.google.com"); 219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int64 resources1 = AwPermissionRequest::Geolocation; 220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<AwPermissionRequestDelegate> delegate1; 222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) delegate1.reset(new TestAwPermissionRequestDelegate( 223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) origin1, resources1, 224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult, 225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Unretained(this)))); 226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Send 1st request 228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) handler()->SendRequest(delegate().Pass()); 229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify Handler store the request correctly. 230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(1u, handler()->requests().size()); 231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); 232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(resources(), handler()->requests()[0]->GetResources()); 233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify client's onPermissionRequest was called 234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(origin(), client()->request()->GetOrigin()); 235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(resources(), client()->request()->GetResources()); 236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Send 2nd request 238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) handler()->SendRequest(delegate1.Pass()); 239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify Handler store the request correctly. 240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(2u, handler()->requests().size()); 241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); 242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(resources(), handler()->requests()[0]->GetResources()); 243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(origin1, handler()->requests()[1]->GetOrigin()); 244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(resources1, handler()->requests()[1]->GetResources()); 245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify client's onPermissionRequest was called 246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(origin1, client()->request()->GetOrigin()); 247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(resources1, client()->request()->GetResources()); 248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Send 3rd request which has same origin and resources as first one. 250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) delegate1.reset(new TestAwPermissionRequestDelegate(origin(), resources(), 251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult, 252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Unretained(this)))); 253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) handler()->SendRequest(delegate1.Pass()); 254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify Handler store the request correctly. 255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(3u, handler()->requests().size()); 256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); 257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(resources(), handler()->requests()[0]->GetResources()); 258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(origin1, handler()->requests()[1]->GetOrigin()); 259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(resources1, handler()->requests()[1]->GetResources()); 260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(origin(), handler()->requests()[2]->GetOrigin()); 261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(resources(), handler()->requests()[2]->GetResources()); 262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify client's onPermissionRequest was called 263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(origin(), client()->request()->GetOrigin()); 264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(resources(), client()->request()->GetResources()); 265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Cancel the request. 267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) handler()->CancelRequest(origin(), resources()); 268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify client's OnPermissionRequestCancled() was called. 269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(origin(), client()->canceled_permission().origin); 270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(resources(), client()->canceled_permission().resources); 271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Verify Handler store the request correctly, the 1st and 3rd were removed. 272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) handler()->PruneRequests(); 273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(1u, handler()->requests().size()); 274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(origin1, handler()->requests()[0]->GetOrigin()); 275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(resources1, handler()->requests()[0]->GetResources()); 276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(PermissionRequestHandlerTest, TestPreauthorizePermission) { 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) handler()->PreauthorizePermission(origin(), resources()); 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Permission should granted without asking PermissionRequestHandlerClient. 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) handler()->SendRequest(delegate().Pass()); 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(allowed()); 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(NULL, client()->request()); 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Only ask one preauthorized resource, permission should granted 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // without asking PermissionRequestHandlerClient. 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<AwPermissionRequestDelegate> delegate; 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delegate.reset(new TestAwPermissionRequestDelegate( 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) origin(), AwPermissionRequest::AudioCapture, 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult, 292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Unretained(this)))); 293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) client()->Reset(); 294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) handler()->SendRequest(delegate.Pass()); 295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(allowed()); 296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(NULL, client()->request()); 297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(PermissionRequestHandlerTest, TestOriginNotPreauthorized) { 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) handler()->PreauthorizePermission(origin(), resources()); 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Ask the origin which wasn't preauthorized. 303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL origin ("http://a.google.com/a/b"); 304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<AwPermissionRequestDelegate> delegate; 305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 requested_resources = AwPermissionRequest::AudioCapture; 306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delegate.reset(new TestAwPermissionRequestDelegate( 307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) origin, requested_resources, 308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult, 309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Unretained(this)))); 310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) handler()->SendRequest(delegate.Pass()); 311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(origin, handler()->requests()[0]->GetOrigin()); 312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(requested_resources, handler()->requests()[0]->GetResources()); 313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) client()->Grant(); 314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(allowed()); 315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(PermissionRequestHandlerTest, TestResourcesNotPreauthorized) { 318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) handler()->PreauthorizePermission(origin(), resources()); 319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Ask the resources which weren't preauthorized. 321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<AwPermissionRequestDelegate> delegate; 322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 requested_resources = AwPermissionRequest::AudioCapture 323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) | AwPermissionRequest::Geolocation; 324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delegate.reset(new TestAwPermissionRequestDelegate( 325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) origin(), requested_resources, 326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult, 327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Unretained(this)))); 328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) handler()->SendRequest(delegate.Pass()); 330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); 331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(requested_resources, handler()->requests()[0]->GetResources()); 332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) client()->Deny(); 333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(allowed()); 334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(PermissionRequestHandlerTest, TestPreauthorizeMultiplePermission) { 337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) handler()->PreauthorizePermission(origin(), resources()); 338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Preauthorize another permission. 339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL origin ("http://a.google.com/a/b"); 340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) handler()->PreauthorizePermission(origin, AwPermissionRequest::Geolocation); 341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL origin_hostname ("http://a.google.com/"); 342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<AwPermissionRequestDelegate> delegate; 343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delegate.reset(new TestAwPermissionRequestDelegate( 344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) origin_hostname, AwPermissionRequest::Geolocation, 345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult, 346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Unretained(this)))); 347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) handler()->SendRequest(delegate.Pass()); 348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(allowed()); 349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(NULL, client()->request()); 350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // android_webview 353