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