| Index: chrome/common/extensions/extension.cc
|
| ===================================================================
|
| --- chrome/common/extensions/extension.cc (revision 81868)
|
| +++ chrome/common/extensions/extension.cc (working copy)
|
| @@ -32,6 +32,7 @@
|
| #include "chrome/common/extensions/extension_resource.h"
|
| #include "chrome/common/extensions/extension_sidebar_defaults.h"
|
| #include "chrome/common/extensions/extension_sidebar_utils.h"
|
| +#include "chrome/common/extensions/file_browser_handler.h"
|
| #include "chrome/common/extensions/user_script.h"
|
| #include "chrome/common/url_constants.h"
|
| #include "googleurl/src/url_util.h"
|
| @@ -265,7 +266,6 @@
|
| const char Extension::kDebuggerPermission[] = "debugger";
|
| const char Extension::kExperimentalPermission[] = "experimental";
|
| const char Extension::kFileBrowserHandlerPermission[] = "fileBrowserHandler";
|
| -const char Extension::kFileSystemPermission[] = "fileSystem";
|
| const char Extension::kFileBrowserPrivatePermission[] = "fileBrowserPrivate";
|
| const char Extension::kGeolocationPermission[] = "geolocation";
|
| const char Extension::kHistoryPermission[] = "history";
|
| @@ -290,7 +290,6 @@
|
| { kDebuggerPermission, IDS_EXTENSION_PROMPT_WARNING_DEBUGGER },
|
| { kExperimentalPermission, 0 },
|
| { kFileBrowserHandlerPermission, 0 },
|
| - { kFileSystemPermission, 0 },
|
| { kFileBrowserPrivatePermission, 0 },
|
| { kGeolocationPermission, IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION },
|
| { kIdlePermission, 0 },
|
| @@ -952,6 +951,91 @@
|
| return result.release();
|
| }
|
|
|
| +Extension::FileBrowserHandlerList* Extension::LoadFileBrowserHandlers(
|
| + const ListValue* extension_actions, std::string* error) {
|
| + scoped_ptr<FileBrowserHandlerList> result(
|
| + new FileBrowserHandlerList());
|
| + for (ListValue::const_iterator iter = extension_actions->begin();
|
| + iter != extension_actions->end();
|
| + ++iter) {
|
| + if (!(*iter)->IsType(Value::TYPE_DICTIONARY)) {
|
| + *error = errors::kInvalidFileBrowserHandler;
|
| + return NULL;
|
| + }
|
| + scoped_ptr<FileBrowserHandler> action(
|
| + LoadFileBrowserHandler(
|
| + reinterpret_cast<DictionaryValue*>(*iter), error));
|
| + if (!action.get())
|
| + return NULL; // Failed to parse file browser action definition.
|
| + result->push_back(linked_ptr<FileBrowserHandler>(action.release()));
|
| + }
|
| + return result.release();
|
| +}
|
| +
|
| +FileBrowserHandler* Extension::LoadFileBrowserHandler(
|
| + const DictionaryValue* file_browser_handler, std::string* error) {
|
| + scoped_ptr<FileBrowserHandler> result(
|
| + new FileBrowserHandler());
|
| + result->set_extension_id(id());
|
| +
|
| + std::string id;
|
| + // Read the file action |id| (mandatory).
|
| + if (!file_browser_handler->HasKey(keys::kPageActionId) ||
|
| + !file_browser_handler->GetString(keys::kPageActionId, &id)) {
|
| + *error = errors::kInvalidPageActionId;
|
| + return NULL;
|
| + }
|
| + result->set_id(id);
|
| +
|
| + // Read the page action title from |default_title| (mandatory).
|
| + std::string title;
|
| + if (!file_browser_handler->HasKey(keys::kPageActionDefaultTitle) ||
|
| + !file_browser_handler->GetString(keys::kPageActionDefaultTitle, &title)) {
|
| + *error = errors::kInvalidPageActionDefaultTitle;
|
| + return NULL;
|
| + }
|
| + result->set_title(title);
|
| +
|
| + // Initialize file filters (mandatory).
|
| + ListValue* list_value = NULL;
|
| + if (!file_browser_handler->HasKey(keys::kFileFilters) ||
|
| + !file_browser_handler->GetList(keys::kFileFilters, &list_value) ||
|
| + list_value->empty()) {
|
| + *error = errors::kInvalidFileFiltersList;
|
| + return NULL;
|
| + }
|
| + for (size_t i = 0; i < list_value->GetSize(); ++i) {
|
| + std::string filter;
|
| + if (!list_value->GetString(i, &filter)) {
|
| + *error = ExtensionErrorUtils::FormatErrorMessage(
|
| + errors::kInvalidFileFilterValue, base::IntToString(i));
|
| + return NULL;
|
| + }
|
| + URLPattern pattern(URLPattern::SCHEME_FILESYSTEM);
|
| + if (URLPattern::PARSE_SUCCESS != pattern.Parse(filter,
|
| + URLPattern::PARSE_STRICT)) {
|
| + *error = ExtensionErrorUtils::FormatErrorMessage(
|
| + errors::kInvalidURLPatternError, filter);
|
| + return NULL;
|
| + }
|
| + result->AddPattern(pattern);
|
| + }
|
| +
|
| + std::string default_icon;
|
| + // Read the file browser action |default_icon| (optional).
|
| + if (file_browser_handler->HasKey(keys::kPageActionDefaultIcon)) {
|
| + if (!file_browser_handler->GetString(
|
| + keys::kPageActionDefaultIcon,&default_icon) ||
|
| + default_icon.empty()) {
|
| + *error = errors::kInvalidPageActionIconPath;
|
| + return NULL;
|
| + }
|
| + result->set_icon_path(default_icon);
|
| + }
|
| +
|
| + return result.release();
|
| +}
|
| +
|
| ExtensionSidebarDefaults* Extension::LoadExtensionSidebarDefaults(
|
| const DictionaryValue* extension_sidebar, std::string* error) {
|
| scoped_ptr<ExtensionSidebarDefaults> result(new ExtensionSidebarDefaults());
|
| @@ -1975,6 +2059,21 @@
|
| return false; // Failed to parse browser action definition.
|
| }
|
|
|
| + // Initialize file browser actions (optional).
|
| + if (source.HasKey(keys::kFileBrowserHandlers)) {
|
| + ListValue* file_browser_handlers_value = NULL;
|
| + if (!source.GetList(keys::kFileBrowserHandlers,
|
| + &file_browser_handlers_value)) {
|
| + *error = errors::kInvalidFileBrowserHandler;
|
| + return false;
|
| + }
|
| +
|
| + file_browser_handlers_.reset(
|
| + LoadFileBrowserHandlers(file_browser_handlers_value, error));
|
| + if (!file_browser_handlers_.get())
|
| + return false; // Failed to parse file browser actions definition.
|
| + }
|
| +
|
| // Load App settings.
|
| if (!LoadIsApp(manifest_value_.get(), error) ||
|
| !LoadExtent(manifest_value_.get(), keys::kWebURLs,
|
| @@ -2040,7 +2139,12 @@
|
| // Only COMPONENT extensions can use private APIs.
|
| // TODO(asargent) - We want a more general purpose mechanism for this,
|
| // and better error messages. (http://crbug.com/54013)
|
| - if (!IsComponentOnlyPermission(permission_str)) {
|
| + if (!IsComponentOnlyPermission(permission_str)
|
| +#ifndef NDEBUG
|
| + && !CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kExposePrivateExtensionApi)
|
| +#endif
|
| + ) {
|
| continue;
|
| }
|
|
|
| @@ -2672,7 +2776,12 @@
|
| }
|
|
|
| bool Extension::CanExecuteScriptEverywhere() const {
|
| - if (location() == Extension::COMPONENT)
|
| + if (location() == Extension::COMPONENT
|
| +#ifndef NDEBUG
|
| + || CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kExposePrivateExtensionApi)
|
| +#endif
|
| + )
|
| return true;
|
|
|
| ScriptingWhitelist* whitelist =
|
|
|