1 // Copyright (c) 2013 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 "chrome/browser/extensions/api/identity/identity_mint_queue.h"
6 
7 #include "base/check_op.h"
8 #include "base/stl_util.h"
9 #include "base/trace_event/trace_event.h"
10 
11 namespace extensions {
12 
IdentityMintRequestQueue()13 IdentityMintRequestQueue::IdentityMintRequestQueue() {
14 }
15 
~IdentityMintRequestQueue()16 IdentityMintRequestQueue::~IdentityMintRequestQueue() {
17   for (RequestQueueMap::const_iterator
18            it = interactive_request_queue_map_.begin();
19        it != interactive_request_queue_map_.end();
20        ++it) {
21     DCHECK_EQ(it->second.size(), 0lu);
22   }
23   for (RequestQueueMap::const_iterator
24            it = noninteractive_request_queue_map_.begin();
25        it != noninteractive_request_queue_map_.end();
26        ++it) {
27     DCHECK_EQ(it->second.size(), 0lu);
28   }
29 }
30 
RequestStart(IdentityMintRequestQueue::MintType type,const ExtensionTokenKey & key,IdentityMintRequestQueue::Request * request)31 void IdentityMintRequestQueue::RequestStart(
32     IdentityMintRequestQueue::MintType type,
33     const ExtensionTokenKey& key,
34     IdentityMintRequestQueue::Request* request) {
35   TRACE_EVENT_NESTABLE_ASYNC_BEGIN1("identity", "IdentityMintRequestQueue",
36                                     request, "type", type);
37   RequestQueue& request_queue = GetRequestQueueMap(type)[key];
38   request_queue.push_back(request);
39   // If this is the first request, start it now. RequestComplete will start
40   // all other requests.
41   if (request_queue.size() == 1)
42     RunRequest(type, request_queue);
43 }
44 
RequestComplete(IdentityMintRequestQueue::MintType type,const ExtensionTokenKey & key,IdentityMintRequestQueue::Request * request)45 void IdentityMintRequestQueue::RequestComplete(
46     IdentityMintRequestQueue::MintType type,
47     const ExtensionTokenKey& key,
48     IdentityMintRequestQueue::Request* request) {
49   TRACE_EVENT_NESTABLE_ASYNC_END1("identity", "IdentityMintRequestQueue",
50                                   request, "completed", "RequestComplete");
51   RequestQueue& request_queue = GetRequestQueueMap(type)[key];
52   CHECK_EQ(request_queue.front(), request);
53   request_queue.pop_front();
54   if (!request_queue.empty())
55     RunRequest(type, request_queue);
56 }
57 
RequestCancel(const ExtensionTokenKey & key,IdentityMintRequestQueue::Request * request)58 void IdentityMintRequestQueue::RequestCancel(
59     const ExtensionTokenKey& key,
60     IdentityMintRequestQueue::Request* request) {
61   TRACE_EVENT_NESTABLE_ASYNC_END1("identity", "IdentityMintRequestQueue",
62                                   request, "completed", "RequestCancel");
63   GetRequestQueueMap(MINT_TYPE_INTERACTIVE)[key].remove(request);
64   GetRequestQueueMap(MINT_TYPE_NONINTERACTIVE)[key].remove(request);
65 }
66 
empty(IdentityMintRequestQueue::MintType type,const ExtensionTokenKey & key)67 bool IdentityMintRequestQueue::empty(IdentityMintRequestQueue::MintType type,
68                                      const ExtensionTokenKey& key) {
69   RequestQueueMap& request_queue_map = GetRequestQueueMap(type);
70   return !base::Contains(request_queue_map, key) ||
71          (request_queue_map.find(key))->second.empty();
72 }
73 
74 IdentityMintRequestQueue::RequestQueueMap&
GetRequestQueueMap(IdentityMintRequestQueue::MintType type)75 IdentityMintRequestQueue::GetRequestQueueMap(
76     IdentityMintRequestQueue::MintType type) {
77   return (type == MINT_TYPE_INTERACTIVE) ? interactive_request_queue_map_
78                                          : noninteractive_request_queue_map_;
79 }
80 
RunRequest(IdentityMintRequestQueue::MintType type,RequestQueue & request_queue)81 void IdentityMintRequestQueue::RunRequest(
82     IdentityMintRequestQueue::MintType type,
83     RequestQueue& request_queue) {
84   TRACE_EVENT_NESTABLE_ASYNC_INSTANT0("identity", "RunRequest",
85                                       request_queue.front());
86   request_queue.front()->StartMintToken(type);
87 }
88 
89 }  // namespace extensions
90