| Index: chrome/browser/ui/webui/identity_internals/identity_internals_ui_handler.cc
 | 
| diff --git a/chrome/browser/ui/webui/identity_internals/identity_internals_ui_handler.cc b/chrome/browser/ui/webui/identity_internals/identity_internals_ui_handler.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..8a486d5ef297d3bc4c57e1209a5f269a9f95a8e3
 | 
| --- /dev/null
 | 
| +++ b/chrome/browser/ui/webui/identity_internals/identity_internals_ui_handler.cc
 | 
| @@ -0,0 +1,120 @@
 | 
| +// Copyright 2014 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/ui/webui/identity_internals/identity_internals_ui_handler.h"
 | 
| +
 | 
| +#include "base/i18n/time_formatting.h"
 | 
| +#include "base/strings/utf_string_conversions.h"
 | 
| +#include "chrome/browser/extensions/extension_service.h"
 | 
| +#include "chrome/browser/profiles/profile.h"
 | 
| +#include "chrome/browser/ui/webui/identity_internals/identity_internals_token_revoker.h"
 | 
| +#include "extensions/browser/extension_system.h"
 | 
| +#include "grit/browser_resources.h"
 | 
| +#include "grit/generated_resources.h"
 | 
| +#include "ui/base/l10n/l10n_util.h"
 | 
| +
 | 
| +IdentityInternalsUIHandler::IdentityInternalsUIHandler(Profile* profile)
 | 
| +    : profile_(profile) {}
 | 
| +
 | 
| +IdentityInternalsUIHandler::~IdentityInternalsUIHandler() {}
 | 
| +
 | 
| +void IdentityInternalsUIHandler::OnTokenRevokerDone(
 | 
| +    IdentityInternalsTokenRevoker* token_revoker) {
 | 
| +  // Remove token from the cache.
 | 
| +  extensions::IdentityAPI::GetFactoryInstance()
 | 
| +      ->Get(profile_)
 | 
| +      ->EraseCachedToken(token_revoker->extension_id(),
 | 
| +                         token_revoker->access_token());
 | 
| +
 | 
| +  // Update view about the token being removed.
 | 
| +  token_revoker->callback().Run();
 | 
| +
 | 
| +  // Erase the revoker.
 | 
| +  ScopedVector<IdentityInternalsTokenRevoker>::iterator iter =
 | 
| +      std::find(token_revokers_.begin(), token_revokers_.end(), token_revoker);
 | 
| +  DCHECK(iter != token_revokers_.end());
 | 
| +  token_revokers_.erase(iter);
 | 
| +}
 | 
| +
 | 
| +void IdentityInternalsUIHandler::GetTokens(
 | 
| +    const mojo::Callback<void(mojo::Array<IdentityTokenMojoPtr>)>& callback) {
 | 
| +  extensions::IdentityAPI::CachedTokens tokens =
 | 
| +      extensions::IdentityAPI::GetFactoryInstance()
 | 
| +          ->Get(profile_)->GetAllCachedTokens();
 | 
| +  callback.Run(ConvertCachedTokens(tokens).Pass());
 | 
| +}
 | 
| +
 | 
| +void IdentityInternalsUIHandler::RevokeToken(
 | 
| +    const mojo::String& extension_id,
 | 
| +    const mojo::String& access_token,
 | 
| +    const mojo::Callback<void()>& callback) {
 | 
| +  token_revokers_.push_back(new IdentityInternalsTokenRevoker(
 | 
| +      extension_id, access_token, callback, profile_, this));
 | 
| +}
 | 
| +
 | 
| +mojo::Array<IdentityTokenMojoPtr>
 | 
| +IdentityInternalsUIHandler::ConvertCachedTokens(
 | 
| +    const extensions::IdentityAPI::CachedTokens& tokens) {
 | 
| +  mojo::Array<IdentityTokenMojoPtr> array(tokens.size());
 | 
| +  size_t index = 0;
 | 
| +  for (extensions::IdentityAPI::CachedTokens::const_iterator
 | 
| +           it = tokens.begin(); it != tokens.end(); ++it, index++) {
 | 
| +    IdentityTokenMojoPtr item(IdentityTokenMojo::New());
 | 
| +    item->access_token = it->second.token();
 | 
| +    item->extension_name = GetExtensionName(it->first);
 | 
| +    item->extension_id = it->first.extension_id;
 | 
| +    item->token_status = GetStatus(it->second);
 | 
| +    item->expiration_time = GetExpirationTime(it->second);
 | 
| +    item->scopes = GetScopes(it->first).Pass();
 | 
| +
 | 
| +    array[index] = item.Pass();
 | 
| +  }
 | 
| +
 | 
| +  return array.Pass();
 | 
| +}
 | 
| +
 | 
| +const std::string IdentityInternalsUIHandler::GetExtensionName(
 | 
| +    const extensions::ExtensionTokenKey& token_cache_key) {
 | 
| +  ExtensionService* extension_service = extensions::ExtensionSystem::Get(
 | 
| +      profile_)->extension_service();
 | 
| +  const extensions::Extension* extension =
 | 
| +      extension_service->extensions()->GetByID(token_cache_key.extension_id);
 | 
| +  if (!extension)
 | 
| +    return std::string();
 | 
| +  return extension->name();
 | 
| +}
 | 
| +
 | 
| +mojo::Array<mojo::String> IdentityInternalsUIHandler::GetScopes(
 | 
| +    const extensions::ExtensionTokenKey& token_cache_key) {
 | 
| +  mojo::Array<mojo::String> array(token_cache_key.scopes.size());
 | 
| +  size_t index = 0;
 | 
| +  for (std::set<std::string>::const_iterator
 | 
| +           it = token_cache_key.scopes.begin();
 | 
| +       it != token_cache_key.scopes.end(); ++it, index++) {
 | 
| +    array[index] = mojo::String(*it);
 | 
| +  }
 | 
| +  return array.Pass();
 | 
| +}
 | 
| +
 | 
| +const std::string IdentityInternalsUIHandler::GetStatus(
 | 
| +    const extensions::IdentityTokenCacheValue& token_cache_value) {
 | 
| +  switch (token_cache_value.status()) {
 | 
| +    case extensions::IdentityTokenCacheValue::CACHE_STATUS_ADVICE:
 | 
| +      // Fallthrough to NOT FOUND case, as ADVICE is short lived.
 | 
| +    case extensions::IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND:
 | 
| +      return l10n_util::GetStringUTF8(
 | 
| +          IDS_IDENTITY_INTERNALS_TOKEN_NOT_FOUND);
 | 
| +    case extensions::IdentityTokenCacheValue::CACHE_STATUS_TOKEN:
 | 
| +      return l10n_util::GetStringUTF8(
 | 
| +          IDS_IDENTITY_INTERNALS_TOKEN_PRESENT);
 | 
| +  }
 | 
| +  NOTREACHED();
 | 
| +  return std::string();
 | 
| +}
 | 
| +
 | 
| +const std::string IdentityInternalsUIHandler::GetExpirationTime(
 | 
| +    const extensions::IdentityTokenCacheValue& token_cache_value) {
 | 
| +  return base::UTF16ToUTF8(base::TimeFormatFriendlyDateAndTime(
 | 
| +      token_cache_value.expiration_time()));
 | 
| +}
 | 
| 
 |