12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/api/extension_action/browser_action_handler.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/extension.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/extension_constants.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/extension_file_util.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/extension_manifest_constants.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/feature_switch.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/manifest.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/generated_resources.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserActionHandler::BrowserActionHandler() { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserActionHandler::~BrowserActionHandler() { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserActionHandler::Parse(Extension* extension, 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16* error) { 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::DictionaryValue* dict = NULL; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension->manifest()->GetDictionary( 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_manifest_keys::kBrowserAction, &dict)) { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *error = ASCIIToUTF16(extension_manifest_errors::kInvalidBrowserAction); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ActionInfo> action_info = ActionInfo::Load(extension, dict, error); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!action_info.get()) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; // Failed to parse browser action definition. 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ActionInfo::SetBrowserActionInfo(extension, action_info.release()); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserActionHandler::Validate( 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension, 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string* error, 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<InstallWarning>* warnings) const { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ActionInfo* action = ActionInfo::GetBrowserActionInfo(extension); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (action && !action->default_icon.empty() && 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !extension_file_util::ValidateExtensionIconSet( 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) action->default_icon, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension, 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IDS_EXTENSION_LOAD_ICON_FOR_BROWSER_ACTION_FAILED, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error)) { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const std::vector<std::string> BrowserActionHandler::Keys() const { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SingleKey(extension_manifest_keys::kBrowserAction); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 65