blob: 835a6f0ec33d47a56bcb64ccb963500e36719105 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/extensions/context_menu_helpers.h"
#include <stddef.h>
#include "base/strings/string_number_conversions.h"
namespace extensions {
namespace context_menu_helpers {
const char kActionNotAllowedError[] =
"Only extensions are allowed to use action contexts";
const char kCannotFindItemError[] = "Cannot find menu item with id *";
const char kCheckedError[] =
"Only items with type \"radio\" or \"checkbox\" can be checked";
const char kDuplicateIDError[] =
"Cannot create item with duplicate id *";
const char kGeneratedIdKey[] = "generatedId";
const char kLauncherNotAllowedError[] =
"Only packaged apps are allowed to use 'launcher' context";
const char kOnclickDisallowedError[] =
"Extensions using event pages or "
"Service Workers cannot pass an onclick parameter to "
"chrome.contextMenus.create. Instead, use the "
"chrome.contextMenus.onClicked event.";
const char kParentsMustBeNormalError[] =
"Parent items must have type \"normal\"";
const char kTitleNeededError[] =
"All menu items except for separators must have a title";
const char kTooManyMenuItems[] =
"An extension can create a maximum of * menu items.";
std::string GetIDString(const MenuItem::Id& id) {
if (id.uid == 0) {
return id.string_uid;
} else {
return base::NumberToString(id.uid);
}
}
MenuItem* GetParent(MenuItem::Id parent_id,
const MenuManager* menu_manager,
std::string* error) {
MenuItem* parent = menu_manager->GetItemById(parent_id);
if (!parent) {
*error = ErrorUtils::FormatErrorMessage(
kCannotFindItemError, GetIDString(parent_id));
return nullptr;
}
if (parent->type() != MenuItem::NORMAL) {
*error = kParentsMustBeNormalError;
return nullptr;
}
return parent;
}
MenuItem::ContextList GetContexts(const std::vector<
extensions::api::context_menus::ContextType>& in_contexts) {
MenuItem::ContextList contexts;
for (auto context : in_contexts) {
switch (context) {
case extensions::api::context_menus::ContextType::kAll:
contexts.Add(extensions::MenuItem::ALL);
break;
case extensions::api::context_menus::ContextType::kPage:
contexts.Add(extensions::MenuItem::PAGE);
break;
case extensions::api::context_menus::ContextType::kSelection:
contexts.Add(extensions::MenuItem::SELECTION);
break;
case extensions::api::context_menus::ContextType::kLink:
contexts.Add(extensions::MenuItem::LINK);
break;
case extensions::api::context_menus::ContextType::kEditable:
contexts.Add(extensions::MenuItem::EDITABLE);
break;
case extensions::api::context_menus::ContextType::kImage:
contexts.Add(extensions::MenuItem::IMAGE);
break;
case extensions::api::context_menus::ContextType::kVideo:
contexts.Add(extensions::MenuItem::VIDEO);
break;
case extensions::api::context_menus::ContextType::kAudio:
contexts.Add(extensions::MenuItem::AUDIO);
break;
case extensions::api::context_menus::ContextType::kFrame:
contexts.Add(extensions::MenuItem::FRAME);
break;
case extensions::api::context_menus::ContextType::kLauncher:
// Not available for <webview>.
contexts.Add(extensions::MenuItem::LAUNCHER);
break;
case extensions::api::context_menus::ContextType::kBrowserAction:
// Not available for <webview>.
contexts.Add(extensions::MenuItem::BROWSER_ACTION);
break;
case extensions::api::context_menus::ContextType::kPageAction:
// Not available for <webview>.
contexts.Add(extensions::MenuItem::PAGE_ACTION);
break;
case extensions::api::context_menus::ContextType::kAction:
// Not available for <webview>.
contexts.Add(extensions::MenuItem::ACTION);
break;
case extensions::api::context_menus::ContextType::kNone:
NOTREACHED_IN_MIGRATION();
}
}
return contexts;
}
MenuItem::Type GetType(extensions::api::context_menus::ItemType type,
MenuItem::Type default_type) {
switch (type) {
case extensions::api::context_menus::ItemType::kNone:
return default_type;
case extensions::api::context_menus::ItemType::kNormal:
return extensions::MenuItem::NORMAL;
case extensions::api::context_menus::ItemType::kCheckbox:
return extensions::MenuItem::CHECKBOX;
case extensions::api::context_menus::ItemType::kRadio:
return extensions::MenuItem::RADIO;
case extensions::api::context_menus::ItemType::kSeparator:
return extensions::MenuItem::SEPARATOR;
}
return extensions::MenuItem::NORMAL;
}
} // namespace context_menu_helpers
} // namespace extensions