blob: a24a327b3c6d379288657c5aa5fcc60d75173a66 [file] [log] [blame]
// Copyright 2015 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/extensions/api/developer_private/developer_private_mangle.h"
#include <memory>
#include "base/values.h"
#include "chrome/common/extensions/api/developer_private.h"
#include "extensions/browser/extension_error.h"
#include "extensions/common/constants.h"
namespace extensions {
namespace developer_private_mangle {
api::developer_private::ItemInfo MangleExtensionInfo(
const api::developer_private::ExtensionInfo& info) {
api::developer_private::ItemInfo result;
result.id = info.id;
result.name = info.name;
result.version = info.version;
result.description = info.description;
result.may_disable = info.user_may_modify;
result.enabled =
info.state == api::developer_private::EXTENSION_STATE_ENABLED;
switch (info.type) {
case api::developer_private::EXTENSION_TYPE_HOSTED_APP:
result.type = api::developer_private::ITEM_TYPE_HOSTED_APP;
result.is_app = true;
break;
case api::developer_private::EXTENSION_TYPE_PLATFORM_APP:
result.type = api::developer_private::ITEM_TYPE_PACKAGED_APP;
result.is_app = true;
break;
case api::developer_private::EXTENSION_TYPE_LEGACY_PACKAGED_APP:
result.type = api::developer_private::ITEM_TYPE_LEGACY_PACKAGED_APP;
result.is_app = true;
break;
case api::developer_private::EXTENSION_TYPE_EXTENSION:
result.type = api::developer_private::ITEM_TYPE_EXTENSION;
result.is_app = false;
break;
case api::developer_private::EXTENSION_TYPE_THEME:
result.type = api::developer_private::ITEM_TYPE_THEME;
result.is_app = false;
break;
case api::developer_private::EXTENSION_TYPE_SHARED_MODULE:
// Old api doesn't account for this.
break;
default:
NOTREACHED();
}
result.allow_file_access = info.file_access.is_active;
result.wants_file_access = info.file_access.is_enabled;
result.icon_url = info.icon_url;
result.incognito_enabled = info.incognito_access.is_active;
result.allow_incognito = info.incognito_access.is_enabled;
result.is_unpacked =
info.location == api::developer_private::LOCATION_UNPACKED;
result.allow_reload = result.is_unpacked;
result.terminated =
info.state == api::developer_private::EXTENSION_STATE_TERMINATED;
if (info.path)
result.path.reset(new std::string(*info.path));
if (info.options_page)
result.options_url.reset(new std::string(info.options_page->url));
if (info.launch_url)
result.app_launch_url.reset(new std::string(*info.launch_url));
if (!info.home_page.url.empty())
result.homepage_url.reset(new std::string(info.home_page.url));
result.update_url.reset(new std::string(info.update_url));
for (const std::string& str_warning : info.install_warnings) {
api::developer_private::InstallWarning warning;
warning.message = str_warning;
result.install_warnings.push_back(std::move(warning));
}
for (const api::developer_private::ManifestError& error :
info.manifest_errors) {
std::unique_ptr<base::DictionaryValue> value = error.ToValue();
value->SetInteger("type", static_cast<int>(ExtensionError::MANIFEST_ERROR));
value->SetInteger("level", static_cast<int>(logging::LOG_WARNING));
result.manifest_errors.push_back(std::move(value));
}
for (const api::developer_private::RuntimeError& error :
info.runtime_errors) {
std::unique_ptr<base::DictionaryValue> value = error.ToValue();
value->SetInteger("type", static_cast<int>(ExtensionError::RUNTIME_ERROR));
logging::LogSeverity severity = logging::LOG_INFO;
if (error.severity == api::developer_private::ERROR_LEVEL_WARN)
severity = logging::LOG_WARNING;
else if (error.severity == api::developer_private::ERROR_LEVEL_ERROR)
severity = logging::LOG_ERROR;
value->SetInteger("level", static_cast<int>(severity));
result.runtime_errors.push_back(std::move(value));
}
result.offline_enabled = info.offline_enabled;
for (const api::developer_private::ExtensionView& view : info.views) {
api::developer_private::ItemInspectView view_copy;
GURL url(view.url);
if (url.scheme() == kExtensionScheme) {
// No leading slash.
view_copy.path = url.path().substr(1);
} else {
// For live pages, use the full URL.
view_copy.path = url.spec();
}
view_copy.render_process_id = view.render_process_id;
view_copy.render_view_id = view.render_view_id;
view_copy.incognito = view.incognito;
view_copy.generated_background_page =
view_copy.path == kGeneratedBackgroundPageFilename;
result.views.push_back(std::move(view_copy));
}
return result;
}
} // namespace developer_private_mangle
} // namespace extensions