|  | // 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 |