Commit dc219a79 authored by mtomasz's avatar mtomasz Committed by Commit bot

Add a warning for missing fileBrowserHandler permission.

If file browser handlers are specified in the manifest, and the permission is
missing, then they will be ignored. This CL adds a warning so users are aware
of it.

TEST=unit_tests: *FileBrowserHandlerManifestTest.InvalidFileBrowserHandlers*
BUG=470494

Review URL: https://codereview.chromium.org/1017163003

Cr-Commit-Position: refs/heads/master@{#322530}
parent 17b636d9
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/values.h" #include "base/values.h"
#include "chrome/common/extensions/extension_constants.h" #include "chrome/common/extensions/extension_constants.h"
#include "extensions/common/error_utils.h" #include "extensions/common/error_utils.h"
#include "extensions/common/install_warning.h"
#include "extensions/common/manifest.h" #include "extensions/common/manifest.h"
#include "extensions/common/manifest_constants.h" #include "extensions/common/manifest_constants.h"
#include "extensions/common/manifest_handlers/permissions_parser.h" #include "extensions/common/manifest_handlers/permissions_parser.h"
...@@ -131,6 +132,7 @@ FileBrowserHandlerParser::FileBrowserHandlerParser() { ...@@ -131,6 +132,7 @@ FileBrowserHandlerParser::FileBrowserHandlerParser() {
FileBrowserHandlerParser::~FileBrowserHandlerParser() { FileBrowserHandlerParser::~FileBrowserHandlerParser() {
} }
#if defined(OS_CHROMEOS)
namespace { namespace {
FileBrowserHandler* LoadFileBrowserHandler( FileBrowserHandler* LoadFileBrowserHandler(
...@@ -268,32 +270,43 @@ bool LoadFileBrowserHandlers( ...@@ -268,32 +270,43 @@ bool LoadFileBrowserHandlers(
} }
} // namespace } // namespace
#endif
bool FileBrowserHandlerParser::Parse(extensions::Extension* extension, bool FileBrowserHandlerParser::Parse(extensions::Extension* extension,
base::string16* error) { base::string16* error) {
// If the permission is missing, then skip parsing the list of handlers. #if !defined(OS_CHROMEOS)
return true;
#else
const base::Value* file_browser_handlers_value = nullptr;
if (!extension->manifest()->Get(keys::kFileBrowserHandlers,
&file_browser_handlers_value)) {
return true;
}
if (!extensions::PermissionsParser::HasAPIPermission( if (!extensions::PermissionsParser::HasAPIPermission(
extension, extensions::APIPermission::ID::kFileBrowserHandler)) { extension, extensions::APIPermission::ID::kFileBrowserHandler)) {
extension->AddInstallWarning(extensions::InstallWarning(
errors::kInvalidFileBrowserHandlerMissingPermission));
return true; return true;
} }
const base::ListValue* file_browser_handlers_value = NULL; const base::ListValue* file_browser_handlers_list_value = nullptr;
if (!extension->manifest()->GetList(keys::kFileBrowserHandlers, if (!file_browser_handlers_value->GetAsList(
&file_browser_handlers_value)) { &file_browser_handlers_list_value)) {
*error = base::ASCIIToUTF16(errors::kInvalidFileBrowserHandler); *error = base::ASCIIToUTF16(errors::kInvalidFileBrowserHandler);
return false; return false;
} }
scoped_ptr<FileBrowserHandlerInfo> info(new FileBrowserHandlerInfo); scoped_ptr<FileBrowserHandlerInfo> info(new FileBrowserHandlerInfo);
if (!LoadFileBrowserHandlers(extension->id(), if (!LoadFileBrowserHandlers(extension->id(),
file_browser_handlers_value, file_browser_handlers_list_value,
&info->file_browser_handlers, &info->file_browser_handlers, error)) {
error)) {
return false; // Failed to parse file browser actions definition. return false; // Failed to parse file browser actions definition.
} }
extension->SetManifestData(keys::kFileBrowserHandlers, info.release()); extension->SetManifestData(keys::kFileBrowserHandlers, info.release());
return true; return true;
#endif
} }
const std::vector<std::string> FileBrowserHandlerParser::Keys() const { const std::vector<std::string> FileBrowserHandlerParser::Keys() const {
......
...@@ -80,6 +80,8 @@ TEST_F(FileBrowserHandlerManifestTest, InvalidFileBrowserHandlers) { ...@@ -80,6 +80,8 @@ TEST_F(FileBrowserHandlerManifestTest, InvalidFileBrowserHandlers) {
errors::kInvalidFileAccessList), errors::kInvalidFileAccessList),
Testcase("filebrowser_invalid_empty_access_permission_list.json", Testcase("filebrowser_invalid_empty_access_permission_list.json",
errors::kInvalidFileAccessList), errors::kInvalidFileAccessList),
Testcase("filebrowser_invalid_value.json",
errors::kInvalidFileBrowserHandler),
Testcase("filebrowser_invalid_actions_1.json", Testcase("filebrowser_invalid_actions_1.json",
errors::kInvalidFileBrowserHandler), errors::kInvalidFileBrowserHandler),
Testcase("filebrowser_invalid_actions_2.json", Testcase("filebrowser_invalid_actions_2.json",
...@@ -95,9 +97,11 @@ TEST_F(FileBrowserHandlerManifestTest, InvalidFileBrowserHandlers) { ...@@ -95,9 +97,11 @@ TEST_F(FileBrowserHandlerManifestTest, InvalidFileBrowserHandlers) {
errors::kInvalidFileFilterValue, base::IntToString(0))), errors::kInvalidFileFilterValue, base::IntToString(0))),
Testcase("filebrowser_invalid_file_filters_url.json", Testcase("filebrowser_invalid_file_filters_url.json",
extensions::ErrorUtils::FormatErrorMessage( extensions::ErrorUtils::FormatErrorMessage(
errors::kInvalidURLPatternError, "http:*.html")) errors::kInvalidURLPatternError, "http:*.html"))};
};
RunTestcases(testcases, arraysize(testcases), EXPECT_TYPE_ERROR); RunTestcases(testcases, arraysize(testcases), EXPECT_TYPE_ERROR);
RunTestcase(Testcase("filebrowser_missing_permission.json",
errors::kInvalidFileBrowserHandlerMissingPermission),
EXPECT_TYPE_WARNING);
} }
TEST_F(FileBrowserHandlerManifestTest, ValidFileBrowserHandler) { TEST_F(FileBrowserHandlerManifestTest, ValidFileBrowserHandler) {
......
{
"name": "test",
"version": "1",
"permissions": [
"fileBrowserHandler"
],
"file_browser_handlers": 123
}
{
"name": "test",
"version": "1",
"file_browser_handlers": [
{
"id": "test",
"default_title" : "Test",
"default_icon" : "icon.png",
"file_filters" : [
"filesystem:*.txt"
]
}
]
}
...@@ -361,6 +361,9 @@ const char kInvalidFileAccessValue[] = ...@@ -361,6 +361,9 @@ const char kInvalidFileAccessValue[] =
"Invalid value for 'file_access[*]'."; "Invalid value for 'file_access[*]'.";
const char kInvalidFileBrowserHandler[] = const char kInvalidFileBrowserHandler[] =
"Invalid value for 'file_browser_handlers'."; "Invalid value for 'file_browser_handlers'.";
const char kInvalidFileBrowserHandlerMissingPermission[] =
"Declaring file browser handlers requires the fileBrowserHandler manifest "
"permission.";
const char kInvalidFileFiltersList[] = const char kInvalidFileFiltersList[] =
"Invalid value for 'file_filters'."; "Invalid value for 'file_filters'.";
const char kInvalidFileFilterValue[] = const char kInvalidFileFilterValue[] =
......
...@@ -302,7 +302,7 @@ extern const char kInvalidExportWhitelistString[]; ...@@ -302,7 +302,7 @@ extern const char kInvalidExportWhitelistString[];
extern const char kInvalidFileAccessList[]; extern const char kInvalidFileAccessList[];
extern const char kInvalidFileAccessValue[]; extern const char kInvalidFileAccessValue[];
extern const char kInvalidFileBrowserHandler[]; extern const char kInvalidFileBrowserHandler[];
extern const char kInvalidFileBrowserHandlerMIMETypes[]; extern const char kInvalidFileBrowserHandlerMissingPermission[];
extern const char kInvalidFileFiltersList[]; extern const char kInvalidFileFiltersList[];
extern const char kInvalidFileFilterValue[]; extern const char kInvalidFileFilterValue[];
extern const char kInvalidFileHandlers[]; extern const char kInvalidFileHandlers[];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment