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