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

Unified Diff: chrome/common/extensions/extension.cc

Issue 6749021: Added new fileBrowserPrivate and fileHandler extension APIs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 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 side-by-side diff with in-line comments
Download patch
Index: chrome/common/extensions/extension.cc
===================================================================
--- chrome/common/extensions/extension.cc (revision 81212)
+++ 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_action.h"
#include "chrome/common/extensions/user_script.h"
#include "chrome/common/url_constants.h"
#include "googleurl/src/url_util.h"
@@ -879,6 +880,93 @@
return result.release();
}
+Extension::FileBrowserActionList* Extension::LoadFileBrowserActions(
+ const ListValue* extension_actions, std::string* error) {
+ scoped_ptr<FileBrowserActionList> result(
+ new FileBrowserActionList());
+ for (ListValue::const_iterator iter = extension_actions->begin();
+ iter != extension_actions->end();
+ ++iter) {
+ if (!(*iter)->IsType(Value::TYPE_DICTIONARY)) {
+ *error = errors::kInvalidFileBrowserAction;
+ return false;
+ }
+ scoped_ptr<FileBrowserAction> action(
+ LoadFileBrowserAction(
+ reinterpret_cast<DictionaryValue*>(*iter), error));
+ if (!action.get())
+ return NULL; // Failed to parse file browser action definition.
+ result->push_back(linked_ptr<FileBrowserAction>(action.release()));
+ }
+ return result.release();
+}
+
+FileBrowserAction* Extension::LoadFileBrowserAction(
+ const DictionaryValue* file_browser_actions, std::string* error) {
Aaron Boodman 2011/04/12 22:47:21 s/file_browser_actions/file_browser_action/
zel 2011/04/13 17:49:55 Done.
+ scoped_ptr<FileBrowserAction> result(
+ new FileBrowserAction());
+ result->set_extension_id(id());
+
+ std::string id;
+ // Read the file action |id| (mandatory).
+ if (!file_browser_actions->HasKey(keys::kPageActionId) ||
Aaron Boodman 2011/04/12 22:47:21 Can you name this property "name" instead? (We don
Aaron Boodman 2011/04/12 22:48:20 Whoops, I didn't mean to include this comment. I t
+ !file_browser_actions->GetString(keys::kPageActionId, &id)) {
+ *error = errors::kInvalidPageActionId;
Aaron Boodman 2011/04/12 22:47:21 Incorrect error message.
zel 2011/04/13 17:49:55 This message is used for generic "id is missing" e
+ return NULL;
+ }
+ result->set_id(id);
+
+ // Read the page action title from |default_title| (mandatory).
+ std::string title;
+ if (!file_browser_actions->HasKey(keys::kPageActionDefaultTitle) ||
Aaron Boodman 2011/04/12 22:47:21 It's a bit weird to reuse these constants (pageAct
zel 2011/04/13 17:49:55 Done.
+ !file_browser_actions->GetString(keys::kPageActionDefaultTitle, &title)) {
+ *error = errors::kInvalidPageActionDefaultTitle;
+ return NULL;
+ }
+ result->set_default_title(title);
+
+ // Initialize file filters (mandatory).
+ ListValue* list_value;
Aaron Boodman 2011/04/12 22:47:21 = NULL
zel 2011/04/13 17:49:55 Done.
+ if (!file_browser_actions->HasKey(keys::kFileFilters) ||
+ !file_browser_actions->GetList(keys::kFileFilters, &list_value) ||
+ list_value->empty()) {
+ *error = errors::kInvalidFileFiltersList;
+ return false;
+ }
+ 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 false;
+ }
+ URLPattern pattern(URLPattern::SCHEME_FILESYSTEM);
+ // TODO(skerner): Consider enabling strict pattern parsing
+ // if this extension's location indicates that it is under development.
+ if (URLPattern::PARSE_SUCCESS != pattern.Parse(filter,
+ URLPattern::PARSE_LENIENT)) {
Aaron Boodman 2011/04/12 22:47:21 Use PARSE_STRICT and remove the TODO(skerner). The
zel 2011/04/13 17:49:55 Done.
+ *error = ExtensionErrorUtils::FormatErrorMessage(
+ errors::kInvalidURLPatternError, filter);
+ return false;
+ }
+ result->AddPattern(pattern);
+ }
+
+ std::string default_icon;
+ // Read the page action |default_icon| (optional).
Aaron Boodman 2011/04/12 22:47:21 paste-o ('page action')
zel 2011/04/13 17:49:55 Done.
+ if (file_browser_actions->HasKey(keys::kPageActionDefaultIcon)) {
+ if (!file_browser_actions->GetString(keys::kPageActionDefaultIcon,
+ &default_icon) ||
Aaron Boodman 2011/04/12 22:47:21 intent+=4
zel 2011/04/13 17:49:55 Done.
+ default_icon.empty()) {
+ *error = errors::kInvalidPageActionIconPath;
+ return NULL;
+ }
+ result->set_default_icon_path(default_icon);
+ }
+
+ return result.release();
+}
+
ExtensionSidebarDefaults* Extension::LoadExtensionSidebarDefaults(
const DictionaryValue* extension_sidebar, std::string* error) {
scoped_ptr<ExtensionSidebarDefaults> result(new ExtensionSidebarDefaults());
@@ -1910,6 +1998,21 @@
return false; // Failed to parse browser action definition.
}
+ // Initialize browser action (optional).
asargent_no_longer_on_chrome 2011/04/12 21:09:38 nit: comment should be "Initialize file browser ac
zel 2011/04/13 17:49:55 Done.
+ if (source.HasKey(keys::kFileBrowserActions)) {
+ ListValue* file_browser_actions_value = NULL;
+ if (!source.GetList(keys::kFileBrowserActions,
+ &file_browser_actions_value)) {
+ *error = errors::kInvalidFileBrowserAction;
+ return false;
+ }
+
+ file_browser_actions_.reset(
+ LoadFileBrowserActions(file_browser_actions_value, error));
+ if (!file_browser_actions_.get())
+ return false; // Failed to parse browser action definition.
asargent_no_longer_on_chrome 2011/04/12 21:09:38 same naming nit on comment here
zel 2011/04/13 17:49:55 Done.
+ }
+
// Load App settings.
if (!LoadIsApp(manifest_value_.get(), error) ||
!LoadExtent(manifest_value_.get(), keys::kWebURLs,
@@ -1976,7 +2079,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(
Aaron Boodman 2011/04/12 22:47:21 Is this testing code? Can we remove it?
zel 2011/04/13 17:49:55 This is super useful for us while debugging compon
+ switches::kExposePrivateExtensionApi)
+#endif
+ ) {
continue;
}
@@ -2573,7 +2681,12 @@
}
bool Extension::CanExecuteScriptEverywhere() const {
- if (location() == Extension::COMPONENT)
+ if (location() == Extension::COMPONENT
+#ifndef NDEBUG
+ || CommandLine::ForCurrentProcess()->HasSwitch(
Aaron Boodman 2011/04/12 22:47:21 Is this testing code? Can we remove it?
zel 2011/04/13 17:49:55 see comments above
+ switches::kExposePrivateExtensionApi)
+#endif
+ )
return true;
ScriptingWhitelist* whitelist =

Powered by Google App Engine
This is Rietveld 408576698