// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/extensions/api/identity/identity_mint_queue.h" #include "base/logging.h" #include "base/stl_util.h" #include "base/trace_event/trace_event.h" namespace extensions { IdentityMintRequestQueue::IdentityMintRequestQueue() { } IdentityMintRequestQueue::~IdentityMintRequestQueue() { for (RequestQueueMap::const_iterator it = interactive_request_queue_map_.begin(); it != interactive_request_queue_map_.end(); ++it) { DCHECK_EQ(it->second.size(), 0lu); } for (RequestQueueMap::const_iterator it = noninteractive_request_queue_map_.begin(); it != noninteractive_request_queue_map_.end(); ++it) { DCHECK_EQ(it->second.size(), 0lu); } } void IdentityMintRequestQueue::RequestStart( IdentityMintRequestQueue::MintType type, const ExtensionTokenKey& key, IdentityMintRequestQueue::Request* request) { TRACE_EVENT_ASYNC_BEGIN1( "identity", "IdentityMintRequestQueue", request, "type", type); RequestQueue& request_queue = GetRequestQueueMap(type)[key]; request_queue.push_back(request); // If this is the first request, start it now. RequestComplete will start // all other requests. if (request_queue.size() == 1) RunRequest(type, request_queue); } void IdentityMintRequestQueue::RequestComplete( IdentityMintRequestQueue::MintType type, const ExtensionTokenKey& key, IdentityMintRequestQueue::Request* request) { TRACE_EVENT_ASYNC_END1("identity", "IdentityMintRequestQueue", request, "completed", "RequestComplete"); RequestQueue& request_queue = GetRequestQueueMap(type)[key]; CHECK_EQ(request_queue.front(), request); request_queue.pop_front(); if (request_queue.size() > 0) RunRequest(type, request_queue); } void IdentityMintRequestQueue::RequestCancel( const ExtensionTokenKey& key, IdentityMintRequestQueue::Request* request) { TRACE_EVENT_ASYNC_END1("identity", "IdentityMintRequestQueue", request, "completed", "RequestCancel"); GetRequestQueueMap(MINT_TYPE_INTERACTIVE)[key].remove(request); GetRequestQueueMap(MINT_TYPE_NONINTERACTIVE)[key].remove(request); } bool IdentityMintRequestQueue::empty(IdentityMintRequestQueue::MintType type, const ExtensionTokenKey& key) { RequestQueueMap& request_queue_map = GetRequestQueueMap(type); return !ContainsKey(request_queue_map, key) || (request_queue_map.find(key))->second.empty(); } IdentityMintRequestQueue::RequestQueueMap& IdentityMintRequestQueue::GetRequestQueueMap( IdentityMintRequestQueue::MintType type) { return (type == MINT_TYPE_INTERACTIVE) ? interactive_request_queue_map_ : noninteractive_request_queue_map_; } void IdentityMintRequestQueue::RunRequest( IdentityMintRequestQueue::MintType type, RequestQueue& request_queue) { TRACE_EVENT_ASYNC_STEP_INTO0( "identity", "IdentityMintRequestQueue", request_queue.front(), "RUNNING"); request_queue.front()->StartMintToken(type); } } // namespace extensions