15230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop// Use of this source code is governed by a BSD-style license that can be 35230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop// found in the LICENSE file. 45230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop 55230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop#include "chrome/common/extensions/api/extension_action/browser_action_handler.h" 65230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop 75230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop#include "base/memory/scoped_ptr.h" 85230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop#include "base/strings/utf_string_conversions.h" 95230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop#include "base/values.h" 105230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop#include "chrome/grit/generated_resources.h" 115230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop#include "extensions/common/extension.h" 125230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop#include "extensions/common/feature_switch.h" 135230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop#include "extensions/common/file_util.h" 145230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop#include "extensions/common/manifest.h" 155230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop#include "extensions/common/manifest_constants.h" 165230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop 175230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Popnamespace extensions { 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesBrowserActionHandler::BrowserActionHandler() { 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 225230ad61fd35d3006e7764c3152d28e2e68c288fSebastian PopBrowserActionHandler::~BrowserActionHandler() { 235230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop} 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 255230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Popbool BrowserActionHandler::Parse(Extension* extension, 265230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop base::string16* error) { 275230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop const base::DictionaryValue* dict = NULL; 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!extension->manifest()->GetDictionary( 295230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop manifest_keys::kBrowserAction, &dict)) { 305230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop *error = base::ASCIIToUTF16(manifest_errors::kInvalidBrowserAction); 315230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop return false; 325230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop } 335230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop 345230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop scoped_ptr<ActionInfo> action_info = ActionInfo::Load(extension, dict, error); 35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!action_info.get()) 36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return false; // Failed to parse browser action definition. 37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 381a362619f8f74267776a93f101ef32b69b53f5b3Benjamin Kramer ActionInfo::SetBrowserActionInfo(extension, action_info.release()); 391a362619f8f74267776a93f101ef32b69b53f5b3Benjamin Kramer 405230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop return true; 415230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop} 425230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop 435230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Popbool BrowserActionHandler::Validate( 445230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop const Extension* extension, 455230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop std::string* error, 465230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop std::vector<InstallWarning>* warnings) const { 475230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop const ActionInfo* action = ActionInfo::GetBrowserActionInfo(extension); 485230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop if (action && !action->default_icon.empty() && 495230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop !file_util::ValidateExtensionIconSet( 505230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop action->default_icon, 515230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop extension, 525230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop IDS_EXTENSION_LOAD_ICON_FOR_BROWSER_ACTION_FAILED, 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines error)) { 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 565230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop return true; 575230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop} 581a362619f8f74267776a93f101ef32b69b53f5b3Benjamin Kramer 591a362619f8f74267776a93f101ef32b69b53f5b3Benjamin Kramerconst std::vector<std::string> BrowserActionHandler::Keys() const { 605230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop return SingleKey(manifest_keys::kBrowserAction); 615230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop} 625230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop 635230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop} // namespace extensions 645230ad61fd35d3006e7764c3152d28e2e68c288fSebastian Pop