Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(799)

Side by Side Diff: chrome/common/extensions/api/plugins/plugins_handler.cc

Issue 2783813002: Move ChromeRequirementsChecker to //extensions as a PreloadCheck (Closed)
Patch Set: rebase? Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/common/extensions/api/plugins/plugins_handler.h"
6
7 #include <stddef.h>
8
9 #include <memory>
10
11 #include "base/files/file_util.h"
12 #include "base/strings/string_number_conversions.h"
13 #include "base/strings/utf_string_conversions.h"
14 #include "base/values.h"
15 #include "build/build_config.h"
16 #include "chrome/grit/generated_resources.h"
17 #include "extensions/common/error_utils.h"
18 #include "extensions/common/manifest.h"
19 #include "extensions/common/manifest_constants.h"
20 #include "extensions/common/manifest_handlers/permissions_parser.h"
21 #include "extensions/common/permissions/api_permission.h"
22 #include "extensions/common/permissions/api_permission_set.h"
23 #include "ui/base/l10n/l10n_util.h"
24
25 namespace extensions {
26
27 namespace keys = manifest_keys;
28
29 namespace {
30
31 struct PluginManifestData : Extension::ManifestData {
32 // Optional list of NPAPI plugins and associated properties for an extension.
33 PluginInfo::PluginVector plugins;
34 };
35
36 } // namespace
37
38 PluginInfo::PluginInfo(const base::FilePath& plugin_path, bool plugin_is_public)
39 : path(plugin_path), is_public(plugin_is_public) {
40 }
41
42 PluginInfo::~PluginInfo() {
43 }
44
45 // static
46 const PluginInfo::PluginVector* PluginInfo::GetPlugins(
47 const Extension* extension) {
48 PluginManifestData* data = static_cast<PluginManifestData*>(
49 extension->GetManifestData(keys::kPlugins));
50 return data ? &data->plugins : NULL;
51 }
52
53 // static
54 bool PluginInfo::HasPlugins(const Extension* extension) {
55 PluginManifestData* data = static_cast<PluginManifestData*>(
56 extension->GetManifestData(keys::kPlugins));
57 return data && !data->plugins.empty() ? true : false;
58 }
59
60 PluginsHandler::PluginsHandler() {
61 }
62
63 PluginsHandler::~PluginsHandler() {
64 }
65
66 const std::vector<std::string> PluginsHandler::Keys() const {
67 return SingleKey(keys::kPlugins);
68 }
69
70 bool PluginsHandler::Parse(Extension* extension, base::string16* error) {
71 const base::ListValue* list_value = NULL;
72 if (!extension->manifest()->GetList(keys::kPlugins, &list_value)) {
73 *error = base::ASCIIToUTF16(manifest_errors::kInvalidPlugins);
74 return false;
75 }
76
77 std::unique_ptr<PluginManifestData> plugins_data(new PluginManifestData);
78
79 for (size_t i = 0; i < list_value->GetSize(); ++i) {
80 const base::DictionaryValue* plugin_value = NULL;
81 if (!list_value->GetDictionary(i, &plugin_value)) {
82 *error = base::ASCIIToUTF16(manifest_errors::kInvalidPlugins);
83 return false;
84 }
85 // Get plugins[i].path.
86 std::string path_str;
87 if (!plugin_value->GetString(keys::kPluginsPath, &path_str)) {
88 *error = ErrorUtils::FormatErrorMessageUTF16(
89 manifest_errors::kInvalidPluginsPath, base::SizeTToString(i));
90 return false;
91 }
92
93 // Get plugins[i].content (optional).
94 bool is_public = false;
95 if (plugin_value->HasKey(keys::kPluginsPublic)) {
96 if (!plugin_value->GetBoolean(keys::kPluginsPublic, &is_public)) {
97 *error = ErrorUtils::FormatErrorMessageUTF16(
98 manifest_errors::kInvalidPluginsPublic, base::SizeTToString(i));
99 return false;
100 }
101 }
102
103 // We don't allow extensions to load NPAPI plugins on Chrome OS, but still
104 // parse the entries to display consistent error messages. If the extension
105 // actually requires the plugins then LoadRequirements will prevent it
106 // loading.
107 #if defined(OS_CHROMEOS)
108 continue;
109 #endif // defined(OS_CHROMEOS).
110 plugins_data->plugins.push_back(PluginInfo(
111 extension->path().Append(base::FilePath::FromUTF8Unsafe(path_str)),
112 is_public));
113 }
114
115 if (!plugins_data->plugins.empty()) {
116 extension->SetManifestData(keys::kPlugins, std::move(plugins_data));
117 PermissionsParser::AddAPIPermission(extension, APIPermission::kPlugin);
118 }
119
120 return true;
121 }
122
123 bool PluginsHandler::Validate(const Extension* extension,
124 std::string* error,
125 std::vector<InstallWarning>* warnings) const {
126 // Validate claimed plugin paths.
127 if (extensions::PluginInfo::HasPlugins(extension)) {
128 const extensions::PluginInfo::PluginVector* plugins =
129 extensions::PluginInfo::GetPlugins(extension);
130 CHECK(plugins);
131 for (std::vector<extensions::PluginInfo>::const_iterator plugin =
132 plugins->begin();
133 plugin != plugins->end(); ++plugin) {
134 if (!base::PathExists(plugin->path)) {
135 *error = l10n_util::GetStringFUTF8(
136 IDS_EXTENSION_LOAD_PLUGIN_PATH_FAILED,
137 plugin->path.LossyDisplayName());
138 return false;
139 }
140 }
141 }
142 return true;
143 }
144
145 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/common/extensions/api/plugins/plugins_handler.h ('k') | chrome/common/extensions/chrome_manifest_handlers.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698