1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef CHROME_BROWSER_SUPERVISED_USER_PERMISSION_REQUEST_CREATOR_APIARY_H_
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define CHROME_BROWSER_SUPERVISED_USER_PERMISSION_REQUEST_CREATOR_APIARY_H_
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string>
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_vector.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/supervised_user/permission_request_creator.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "url/gurl.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class Profile;
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass SupervisedUserSigninManagerWrapper;
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace base {
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class Time;
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace net {
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class URLFetcher;
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class URLRequestContextGetter;
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class PermissionRequestCreatorApiary : public PermissionRequestCreator,
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       public OAuth2TokenService::Consumer,
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       public net::URLFetcherDelegate {
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PermissionRequestCreatorApiary(
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      OAuth2TokenService* oauth2_token_service,
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      scoped_ptr<SupervisedUserSigninManagerWrapper> signin_wrapper,
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      net::URLRequestContextGetter* context);
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~PermissionRequestCreatorApiary();
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static scoped_ptr<PermissionRequestCreator> CreateWithProfile(
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      Profile* profile);
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // PermissionRequestCreator implementation:
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void CreatePermissionRequest(const GURL& url_requested,
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       const base::Closure& callback) OVERRIDE;
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  struct Request;
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef ScopedVector<Request>::iterator RequestIterator;
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // OAuth2TokenService::Consumer implementation:
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request,
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 const std::string& access_token,
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 const base::Time& expiration_time) OVERRIDE;
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request,
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 const GoogleServiceAuthError& error) OVERRIDE;
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // net::URLFetcherDelegate implementation.
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string GetApiScopeToUse() const;
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Requests an access token, which is the first thing we need. This is where
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // we restart when the returned access token has expired.
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void StartFetching(Request* request);
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void DispatchNetworkError(RequestIterator it, int error_code);
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void DispatchGoogleServiceAuthError(RequestIterator it,
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      const GoogleServiceAuthError& error);
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  OAuth2TokenService* oauth2_token_service_;
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<SupervisedUserSigninManagerWrapper> signin_wrapper_;
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  net::URLRequestContextGetter* context_;
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ScopedVector<Request> requests_;
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // CHROME_BROWSER_SUPERVISED_USER_PERMISSION_REQUEST_CREATOR_APIARY_H_
78