1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_EXTENSIONS_API_IDENTITY_IDENTITY_MINT_QUEUE_H_ 6 #define CHROME_BROWSER_EXTENSIONS_API_IDENTITY_IDENTITY_MINT_QUEUE_H_ 7 8 #include <list> 9 #include <map> 10 #include <set> 11 #include <string> 12 13 #include "chrome/browser/extensions/api/identity/extension_token_key.h" 14 15 namespace extensions { 16 17 // getAuthToken requests are serialized to avoid excessive traffic to 18 // GAIA and to consolidate UI pop-ups. IdentityMintRequestQueue 19 // maitains a set of queues, one for each RequestKey. 20 // 21 // The queue calls StartMintToken on each Request when it reaches the 22 // head of the line. 23 // 24 // The queue does not own Requests. Request pointers must be valid 25 // until they are removed from the queue with RequestComplete or 26 // RequestCancel. 27 class IdentityMintRequestQueue { 28 public: 29 enum MintType { 30 MINT_TYPE_NONINTERACTIVE, 31 MINT_TYPE_INTERACTIVE 32 }; 33 34 IdentityMintRequestQueue(); 35 virtual ~IdentityMintRequestQueue(); 36 37 class Request { 38 public: 39 virtual ~Request() {} 40 virtual void StartMintToken(IdentityMintRequestQueue::MintType type) = 0; 41 }; 42 43 // Adds a request to the queue specified by the token key. 44 void RequestStart(IdentityMintRequestQueue::MintType type, 45 const ExtensionTokenKey& key, 46 IdentityMintRequestQueue::Request* request); 47 // Removes a request from the queue specified by the token key. 48 void RequestComplete(IdentityMintRequestQueue::MintType type, 49 const ExtensionTokenKey& key, 50 IdentityMintRequestQueue::Request* request); 51 // Cancels a request. OK to call if |request| is not queued. 52 // Does *not* start a new request, even if the canceled request is at 53 // the head of the queue. 54 void RequestCancel(const ExtensionTokenKey& key, 55 IdentityMintRequestQueue::Request* request); 56 bool empty(IdentityMintRequestQueue::MintType type, 57 const ExtensionTokenKey& key); 58 59 private: 60 typedef std::list<IdentityMintRequestQueue::Request*> RequestQueue; 61 typedef std::map<const ExtensionTokenKey, RequestQueue> RequestQueueMap; 62 63 RequestQueueMap& GetRequestQueueMap(IdentityMintRequestQueue::MintType type); 64 void RunRequest(IdentityMintRequestQueue::MintType type, 65 RequestQueue& request_queue); 66 67 RequestQueueMap interactive_request_queue_map_; 68 RequestQueueMap noninteractive_request_queue_map_; 69 }; 70 71 } // namespace extensions 72 73 #endif // CHROME_BROWSER_EXTENSIONS_API_IDENTITY_IDENTITY_MINT_QUEUE_H_ 74