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