summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryoz@chromium.org <yoz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-20 21:46:59 +0000
committeryoz@chromium.org <yoz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-20 21:46:59 +0000
commit73680c5385d8e1354fd749d0d9b9a5562ec78e21 (patch)
treeeec41c9c66ffbf88471e869c7271782bc5a09968
parent4ba7af4ea34ea2192b63db18009a9725e1af8b8e (diff)
downloadchromium_src-73680c5385d8e1354fd749d0d9b9a5562ec78e21.zip
chromium_src-73680c5385d8e1354fd749d0d9b9a5562ec78e21.tar.gz
chromium_src-73680c5385d8e1354fd749d0d9b9a5562ec78e21.tar.bz2
Move the fileBrowserPrivate API out of extensions entirely.
BUG=159265 TBR=ben@chromium.org Review URL: https://chromiumcodereview.appspot.com/11572058 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@174247 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/chromeos/extensions/file_browser_event_router.cc71
-rw-r--r--chrome/browser/chromeos/extensions/file_browser_event_router.h37
-rw-r--r--chrome/browser/chromeos/extensions/file_browser_handler.cc355
-rw-r--r--chrome/browser/chromeos/extensions/file_browser_handler.h (renamed from chrome/common/extensions/file_browser_handler.h)24
-rw-r--r--chrome/browser/chromeos/extensions/file_browser_manifest_unittest.cc (renamed from chrome/common/extensions/manifest_tests/extension_manifests_filebrowser_unittest.cc)75
-rw-r--r--chrome/browser/chromeos/extensions/file_browser_private_api.cc68
-rw-r--r--chrome/browser/chromeos/extensions/file_browser_private_api.h27
-rw-r--r--chrome/browser/chromeos/extensions/file_browser_private_api_factory.cc55
-rw-r--r--chrome/browser/chromeos/extensions/file_browser_private_api_factory.h40
-rw-r--r--chrome/browser/chromeos/extensions/file_browser_resource_throttle.cc11
-rw-r--r--chrome/browser/chromeos/extensions/file_browser_resource_throttle_browsertest.cc9
-rw-r--r--chrome/browser/chromeos/extensions/file_browser_resource_throttle_unittest.cc9
-rw-r--r--chrome/browser/chromeos/extensions/file_handler_util.cc22
-rw-r--r--chrome/browser/chromeos/extensions/file_handler_util.h2
-rw-r--r--chrome/browser/chromeos/extensions/file_manager_util.cc2
-rw-r--r--chrome/browser/chromeos/login/login_utils_browsertest.cc8
-rw-r--r--chrome/browser/extensions/extension_function_registry.cc42
-rw-r--r--chrome/browser/extensions/extension_service.cc3
-rw-r--r--chrome/browser/profiles/profile_dependency_manager.cc6
-rw-r--r--chrome/chrome_browser_chromeos.gypi6
-rw-r--r--chrome/chrome_common.gypi2
-rw-r--r--chrome/chrome_tests_unit.gypi2
-rw-r--r--chrome/common/extensions/extension.cc176
-rw-r--r--chrome/common/extensions/extension.h15
-rw-r--r--chrome/common/extensions/file_browser_handler.cc127
25 files changed, 688 insertions, 506 deletions
diff --git a/chrome/browser/chromeos/extensions/file_browser_event_router.cc b/chrome/browser/chromeos/extensions/file_browser_event_router.cc
index 18f17c2..c861a9c 100644
--- a/chrome/browser/chromeos/extensions/file_browser_event_router.cc
+++ b/chrome/browser/chromeos/extensions/file_browser_event_router.cc
@@ -27,7 +27,6 @@
#include "chrome/browser/google_apis/drive_service_interface.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_dependency_manager.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/pref_names.h"
#include "content/public/browser/notification_source.h"
@@ -108,7 +107,7 @@ FileBrowserEventRouter::~FileBrowserEventRouter() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
}
-void FileBrowserEventRouter::ShutdownOnUIThread() {
+void FileBrowserEventRouter::Shutdown() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(file_watchers_.empty());
@@ -117,7 +116,10 @@ void FileBrowserEventRouter::ShutdownOnUIThread() {
NOTREACHED();
return;
}
- DiskMountManager::GetInstance()->RemoveObserver(this);
+
+ DiskMountManager* disk_mount_manager = DiskMountManager::GetInstance();
+ if (disk_mount_manager)
+ disk_mount_manager->RemoveObserver(this);
DriveSystemService* system_service =
DriveSystemServiceFactory::FindForProfileRegardlessOfStates(profile_);
@@ -126,10 +128,13 @@ void FileBrowserEventRouter::ShutdownOnUIThread() {
system_service->drive_service()->RemoveObserver(this);
}
- chromeos::NetworkLibrary* network_library =
- chromeos::CrosLibrary::Get()->GetNetworkLibrary();
- if (network_library)
- network_library->RemoveNetworkManagerObserver(this);
+ chromeos::CrosLibrary* cros_library = chromeos::CrosLibrary::Get();
+ if (cros_library) {
+ chromeos::NetworkLibrary* network_library =
+ cros_library->GetNetworkLibrary();
+ if (network_library)
+ network_library->RemoveNetworkManagerObserver(this);
+ }
profile_ = NULL;
}
@@ -143,9 +148,11 @@ void FileBrowserEventRouter::ObserveFileSystemEvents() {
return;
DiskMountManager* disk_mount_manager = DiskMountManager::GetInstance();
- disk_mount_manager->RemoveObserver(this);
- disk_mount_manager->AddObserver(this);
- disk_mount_manager->RequestMountInfoRefresh();
+ if (disk_mount_manager) {
+ disk_mount_manager->RemoveObserver(this);
+ disk_mount_manager->AddObserver(this);
+ disk_mount_manager->RequestMountInfoRefresh();
+ }
DriveSystemService* system_service =
DriveSystemServiceFactory::GetForProfileRegardlessOfStates(profile_);
@@ -154,10 +161,13 @@ void FileBrowserEventRouter::ObserveFileSystemEvents() {
system_service->file_system()->AddObserver(this);
}
- chromeos::NetworkLibrary* network_library =
- chromeos::CrosLibrary::Get()->GetNetworkLibrary();
- if (network_library)
+ chromeos::CrosLibrary* cros_library = chromeos::CrosLibrary::Get();
+ if (cros_library) {
+ chromeos::NetworkLibrary* network_library =
+ cros_library->GetNetworkLibrary();
+ if (network_library)
network_library->AddNetworkManagerObserver(this);
+ }
pref_change_registrar_->Init(profile_->GetPrefs());
@@ -848,38 +858,3 @@ bool FileBrowserEventRouter::FileWatcherExtensions::Watch
return file_watcher_->Watch(path, delegate);
}
-
-// static
-scoped_refptr<FileBrowserEventRouter>
-FileBrowserEventRouterFactory::GetForProfile(Profile* profile) {
- return static_cast<FileBrowserEventRouter*>(
- GetInstance()->GetServiceForProfile(profile, true).get());
-}
-
-// static
-FileBrowserEventRouterFactory*
-FileBrowserEventRouterFactory::GetInstance() {
- return Singleton<FileBrowserEventRouterFactory>::get();
-}
-
-FileBrowserEventRouterFactory::FileBrowserEventRouterFactory()
- : RefcountedProfileKeyedServiceFactory("FileBrowserEventRouter",
- ProfileDependencyManager::GetInstance()) {
- DependsOn(DriveSystemServiceFactory::GetInstance());
-}
-
-FileBrowserEventRouterFactory::~FileBrowserEventRouterFactory() {
-}
-
-scoped_refptr<RefcountedProfileKeyedService>
-FileBrowserEventRouterFactory::BuildServiceInstanceFor(Profile* profile) const {
- return scoped_refptr<RefcountedProfileKeyedService>(
- new FileBrowserEventRouter(profile));
-}
-
-bool FileBrowserEventRouterFactory::ServiceHasOwnInstanceInIncognito() const {
- // Explicitly and always allow this router in guest login mode. see
- // chrome/browser/profiles/profile_keyed_base_factory.h comment
- // for the details.
- return true;
-}
diff --git a/chrome/browser/chromeos/extensions/file_browser_event_router.h b/chrome/browser/chromeos/extensions/file_browser_event_router.h
index 5c7b79e..b3e7916 100644
--- a/chrome/browser/chromeos/extensions/file_browser_event_router.h
+++ b/chrome/browser/chromeos/extensions/file_browser_event_router.h
@@ -19,8 +19,6 @@
#include "chrome/browser/chromeos/drive/drive_resource_metadata.h"
#include "chrome/browser/google_apis/drive_service_interface.h"
#include "chrome/browser/google_apis/operation_registry.h"
-#include "chrome/browser/profiles/refcounted_profile_keyed_service.h"
-#include "chrome/browser/profiles/refcounted_profile_keyed_service_factory.h"
#include "chromeos/disks/disk_mount_manager.h"
class FileBrowserNotifications;
@@ -35,14 +33,13 @@ class DriveFileSystemInterface;
// Monitors changes in disk mounts, network connection state and preferences
// affecting File Manager. Dispatches appropriate File Browser events.
class FileBrowserEventRouter
- : public RefcountedProfileKeyedService,
+ : public base::RefCountedThreadSafe<FileBrowserEventRouter>,
public chromeos::disks::DiskMountManager::Observer,
public chromeos::NetworkLibrary::NetworkManagerObserver,
public drive::DriveFileSystemObserver,
public google_apis::DriveServiceObserver {
public:
- // RefcountedProfileKeyedService overrides.
- virtual void ShutdownOnUIThread() OVERRIDE;
+ void Shutdown();
// Starts observing file system change events.
void ObserveFileSystemEvents();
@@ -92,7 +89,8 @@ class FileBrowserEventRouter
virtual void OnFileSystemBeingUnmounted() OVERRIDE;
private:
- friend class FileBrowserEventRouterFactory;
+ friend class FileBrowserPrivateAPI;
+ friend class base::RefCountedThreadSafe<FileBrowserEventRouter>;
// Helper class for passing through file watch notification events.
class FileWatcherDelegate : public base::files::FilePathWatcher::Delegate {
@@ -216,31 +214,4 @@ class FileBrowserEventRouter
DISALLOW_COPY_AND_ASSIGN(FileBrowserEventRouter);
};
-// Singleton that owns all FileBrowserEventRouter and associates
-// them with Profiles.
-class FileBrowserEventRouterFactory
- : public RefcountedProfileKeyedServiceFactory {
- public:
- // Returns the FileBrowserEventRouter for |profile|, creating it if
- // it is not yet created.
- static scoped_refptr<FileBrowserEventRouter> GetForProfile(Profile* profile);
-
- // Returns the FileBrowserEventRouterFactory instance.
- static FileBrowserEventRouterFactory* GetInstance();
-
- protected:
- // ProfileKeyedBasedFactory overrides:
- virtual bool ServiceHasOwnInstanceInIncognito() const OVERRIDE;
-
- private:
- friend struct DefaultSingletonTraits<FileBrowserEventRouterFactory>;
-
- FileBrowserEventRouterFactory();
- virtual ~FileBrowserEventRouterFactory();
-
- // ProfileKeyedServiceFactory:
- virtual scoped_refptr<RefcountedProfileKeyedService> BuildServiceInstanceFor(
- Profile* profile) const OVERRIDE;
-};
-
#endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_BROWSER_EVENT_ROUTER_H_
diff --git a/chrome/browser/chromeos/extensions/file_browser_handler.cc b/chrome/browser/chromeos/extensions/file_browser_handler.cc
new file mode 100644
index 0000000..697a0a4
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/file_browser_handler.cc
@@ -0,0 +1,355 @@
+// Copyright (c) 2012 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/chromeos/extensions/file_browser_handler.h"
+
+#include "base/logging.h"
+#include "base/string_number_conversions.h"
+#include "base/string_util.h"
+#include "base/utf_string_conversions.h"
+#include "base/values.h"
+#include "chrome/common/extensions/extension_constants.h"
+#include "chrome/common/extensions/extension_manifest_constants.h"
+#include "content/public/common/url_constants.h"
+#include "extensions/common/error_utils.h"
+#include "extensions/common/url_pattern.h"
+#include "googleurl/src/gurl.h"
+#include "googleurl/src/url_util.h"
+
+namespace keys = extension_manifest_keys;
+namespace errors = extension_manifest_errors;
+
+namespace {
+
+const char kReadAccessString[] = "read";
+const char kReadWriteAccessString[] = "read-write";
+const char kCreateAccessString[] = "create";
+
+unsigned int kPermissionsNotDefined = 0;
+unsigned int kReadPermission = 1;
+unsigned int kWritePermission = 1 << 1;
+unsigned int kCreatePermission = 1 << 2;
+unsigned int kInvalidPermission = 1 << 3;
+
+unsigned int GetAccessPermissionFlagFromString(const std::string& access_str) {
+ if (access_str == kReadAccessString)
+ return kReadPermission;
+ if (access_str == kReadWriteAccessString)
+ return kReadPermission | kWritePermission;
+ if (access_str == kCreateAccessString)
+ return kCreatePermission;
+ return kInvalidPermission;
+}
+
+const char* const kMIMETypeHandlersWhitelist[] = {
+ extension_misc::kQuickOfficeExtensionId,
+ extension_misc::kQuickOfficeDevExtensionId
+};
+
+// Stored on the Extension.
+struct FileBrowserHandlerInfo : public extensions::Extension::ManifestData {
+ FileBrowserHandler::List file_browser_handlers;
+
+ FileBrowserHandlerInfo();
+ virtual ~FileBrowserHandlerInfo();
+};
+
+FileBrowserHandlerInfo::FileBrowserHandlerInfo() {
+}
+
+FileBrowserHandlerInfo::~FileBrowserHandlerInfo() {
+}
+
+} // namespace
+
+// static
+bool FileBrowserHandler::ExtensionWhitelistedForMIMETypes(
+ const std::string& extension_id) {
+ if (g_test_extension_id_ && extension_id == *g_test_extension_id_)
+ return true;
+ for (size_t i = 0; i < arraysize(kMIMETypeHandlersWhitelist); ++i) {
+ if (extension_id == kMIMETypeHandlersWhitelist[i])
+ return true;
+ }
+ return false;
+}
+
+// static
+std::vector<std::string> FileBrowserHandler::GetMIMETypeWhitelist() {
+ std::vector<std::string> whitelist;
+ if (g_test_extension_id_)
+ whitelist.push_back(*g_test_extension_id_);
+ for (size_t i = 0; i < arraysize(kMIMETypeHandlersWhitelist); ++i)
+ whitelist.push_back(kMIMETypeHandlersWhitelist[i]);
+ return whitelist;
+}
+
+FileBrowserHandler::FileBrowserHandler()
+ : file_access_permission_flags_(kPermissionsNotDefined) {
+}
+
+FileBrowserHandler::~FileBrowserHandler() {
+}
+
+void FileBrowserHandler::AddPattern(const URLPattern& pattern) {
+ url_set_.AddPattern(pattern);
+}
+
+void FileBrowserHandler::ClearPatterns() {
+ url_set_.ClearPatterns();
+}
+
+bool FileBrowserHandler::MatchesURL(const GURL& url) const {
+ return url_set_.MatchesURL(url);
+}
+
+void FileBrowserHandler::AddMIMEType(const std::string& mime_type) {
+ DCHECK(ExtensionWhitelistedForMIMETypes(extension_id()));
+ mime_type_set_.insert(mime_type);
+}
+
+bool FileBrowserHandler::CanHandleMIMEType(const std::string& mime_type) const {
+ return mime_type_set_.find(mime_type) != mime_type_set_.end();
+}
+
+bool FileBrowserHandler::AddFileAccessPermission(
+ const std::string& access) {
+ file_access_permission_flags_ |= GetAccessPermissionFlagFromString(access);
+ return (file_access_permission_flags_ & kInvalidPermission) != 0U;
+}
+
+bool FileBrowserHandler::ValidateFileAccessPermissions() {
+ bool is_invalid = (file_access_permission_flags_ & kInvalidPermission) != 0U;
+ bool can_create = (file_access_permission_flags_ & kCreatePermission) != 0U;
+ bool can_read_or_write = (file_access_permission_flags_ &
+ (kReadPermission | kWritePermission)) != 0U;
+ if (is_invalid || (can_create && can_read_or_write)) {
+ file_access_permission_flags_ = kInvalidPermission;
+ return false;
+ }
+
+ if (file_access_permission_flags_ == kPermissionsNotDefined)
+ file_access_permission_flags_ = kReadPermission | kWritePermission;
+ return true;
+}
+
+bool FileBrowserHandler::CanRead() const {
+ DCHECK(!(file_access_permission_flags_ & kInvalidPermission));
+ return (file_access_permission_flags_ & kReadPermission) != 0;
+}
+
+bool FileBrowserHandler::CanWrite() const {
+ DCHECK(!(file_access_permission_flags_ & kInvalidPermission));
+ return (file_access_permission_flags_ & kWritePermission) != 0;
+}
+
+bool FileBrowserHandler::HasCreateAccessPermission() const {
+ DCHECK(!(file_access_permission_flags_ & kInvalidPermission));
+ return (file_access_permission_flags_ & kCreatePermission) != 0;
+}
+
+// static
+FileBrowserHandler::List*
+FileBrowserHandler::GetHandlers(const extensions::Extension* extension) {
+ FileBrowserHandlerInfo* info = static_cast<FileBrowserHandlerInfo*>(
+ extension->GetManifestData(keys::kFileBrowserHandlers));
+ if (info)
+ return &info->file_browser_handlers;
+ return NULL;
+}
+
+std::string* FileBrowserHandler::g_test_extension_id_ = NULL;
+
+FileBrowserHandlerParser::FileBrowserHandlerParser() {
+}
+
+FileBrowserHandlerParser::~FileBrowserHandlerParser() {
+}
+
+namespace {
+
+FileBrowserHandler* LoadFileBrowserHandler(
+ const std::string& extension_id,
+ const DictionaryValue* file_browser_handler,
+ string16* error) {
+ scoped_ptr<FileBrowserHandler> result(new FileBrowserHandler());
+ result->set_extension_id(extension_id);
+
+ std::string handler_id;
+ // Read the file action |id| (mandatory).
+ if (!file_browser_handler->HasKey(keys::kPageActionId) ||
+ !file_browser_handler->GetString(keys::kPageActionId, &handler_id)) {
+ *error = ASCIIToUTF16(errors::kInvalidPageActionId);
+ return NULL;
+ }
+ result->set_id(handler_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 = ASCIIToUTF16(errors::kInvalidPageActionDefaultTitle);
+ return NULL;
+ }
+ result->set_title(title);
+
+ // Initialize access permissions (optional).
+ const ListValue* access_list_value = NULL;
+ if (file_browser_handler->HasKey(keys::kFileAccessList)) {
+ if (!file_browser_handler->GetList(keys::kFileAccessList,
+ &access_list_value) ||
+ access_list_value->empty()) {
+ *error = ASCIIToUTF16(errors::kInvalidFileAccessList);
+ return NULL;
+ }
+ for (size_t i = 0; i < access_list_value->GetSize(); ++i) {
+ std::string access;
+ if (!access_list_value->GetString(i, &access) ||
+ result->AddFileAccessPermission(access)) {
+ *error = extensions::ErrorUtils::FormatErrorMessageUTF16(
+ errors::kInvalidFileAccessValue, base::IntToString(i));
+ return NULL;
+ }
+ }
+ }
+ if (!result->ValidateFileAccessPermissions()) {
+ *error = ASCIIToUTF16(errors::kInvalidFileAccessList);
+ return NULL;
+ }
+
+ // Initialize file filters (mandatory, unless "create" access is specified,
+ // in which case is ignored).
+ if (!result->HasCreateAccessPermission()) {
+ const ListValue* file_filters = NULL;
+ if (!file_browser_handler->HasKey(keys::kFileFilters) ||
+ !file_browser_handler->GetList(keys::kFileFilters, &file_filters) ||
+ file_filters->empty()) {
+ *error = ASCIIToUTF16(errors::kInvalidFileFiltersList);
+ return NULL;
+ }
+ for (size_t i = 0; i < file_filters->GetSize(); ++i) {
+ std::string filter;
+ if (!file_filters->GetString(i, &filter)) {
+ *error = extensions::ErrorUtils::FormatErrorMessageUTF16(
+ errors::kInvalidFileFilterValue, base::IntToString(i));
+ return NULL;
+ }
+ StringToLowerASCII(&filter);
+ if (!StartsWithASCII(filter,
+ std::string(chrome::kFileSystemScheme) + ':',
+ true)) {
+ *error = extensions::ErrorUtils::FormatErrorMessageUTF16(
+ errors::kInvalidURLPatternError, filter);
+ return NULL;
+ }
+ // The user inputs filesystem:*; we don't actually implement scheme
+ // wildcards in URLPattern, so transform to what will match correctly.
+ filter.replace(0, 11, "chrome-extension://*/");
+ URLPattern pattern(URLPattern::SCHEME_EXTENSION);
+ if (pattern.Parse(filter) != URLPattern::PARSE_SUCCESS) {
+ *error = extensions::ErrorUtils::FormatErrorMessageUTF16(
+ errors::kInvalidURLPatternError, filter);
+ return NULL;
+ }
+ std::string path = pattern.path();
+ bool allowed = path == "/*" || path == "/*.*" ||
+ (path.compare(0, 3, "/*.") == 0 &&
+ path.find_first_of('*', 3) == std::string::npos);
+ if (!allowed) {
+ *error = extensions::ErrorUtils::FormatErrorMessageUTF16(
+ errors::kInvalidURLPatternError, filter);
+ return NULL;
+ }
+ result->AddPattern(pattern);
+ }
+
+ // Initialize MIME type filters (optional).
+ // NOTE: This is only used by QuickOffice extension to register MIME types
+ // it can handle by directly downloading them. It will *not* be used in File
+ // Manager UI. This is why file filters are mandatory even when MIME type
+ // filters are specified.
+ const ListValue* mime_type_filters = NULL;
+ if (file_browser_handler->HasKey(keys::kMIMETypes)) {
+ if (!FileBrowserHandler::ExtensionWhitelistedForMIMETypes(extension_id)) {
+ *error = ASCIIToUTF16(
+ errors::kNoPermissionForFileBrowserHandlerMIMETypes);
+ return NULL;
+ }
+
+ if (!file_browser_handler->GetList(keys::kMIMETypes,
+ &mime_type_filters)) {
+ *error = ASCIIToUTF16(errors::kInvalidFileBrowserHandlerMIMETypes);
+ return NULL;
+ }
+
+ for (size_t i = 0; i < mime_type_filters->GetSize(); ++i) {
+ std::string filter;
+ if (!mime_type_filters->GetString(i, &filter)) {
+ *error = ASCIIToUTF16(errors::kInvalidFileBrowserHandlerMIMETypes);
+ return NULL;
+ }
+ result->AddMIMEType(filter);
+ }
+ }
+ }
+
+ 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 = ASCIIToUTF16(errors::kInvalidPageActionIconPath);
+ return NULL;
+ }
+ result->set_icon_path(default_icon);
+ }
+
+ return result.release();
+}
+
+// Loads FileBrowserHandlers from |extension_actions| into a list in |result|.
+bool LoadFileBrowserHandlers(
+ const std::string& extension_id,
+ const ListValue* extension_actions,
+ FileBrowserHandler::List* result,
+ string16* error) {
+ for (ListValue::const_iterator iter = extension_actions->begin();
+ iter != extension_actions->end();
+ ++iter) {
+ if (!(*iter)->IsType(Value::TYPE_DICTIONARY)) {
+ *error = ASCIIToUTF16(errors::kInvalidFileBrowserHandler);
+ return false;
+ }
+ scoped_ptr<FileBrowserHandler> action(
+ LoadFileBrowserHandler(
+ extension_id, reinterpret_cast<DictionaryValue*>(*iter), error));
+ if (!action.get())
+ return false; // Failed to parse file browser action definition.
+ result->push_back(linked_ptr<FileBrowserHandler>(action.release()));
+ }
+ return true;
+}
+
+} // namespace
+
+bool FileBrowserHandlerParser::Parse(const base::Value* value,
+ extensions::Extension* extension,
+ string16* error) {
+ const ListValue* file_browser_handlers_value = NULL;
+ if (!value->GetAsList(&file_browser_handlers_value)) {
+ *error = ASCIIToUTF16(errors::kInvalidFileBrowserHandler);
+ return false;
+ }
+ scoped_ptr<FileBrowserHandlerInfo> info(new FileBrowserHandlerInfo);
+ if (!LoadFileBrowserHandlers(extension->id(),
+ file_browser_handlers_value,
+ &info->file_browser_handlers,
+ error)) {
+ return false; // Failed to parse file browser actions definition.
+ }
+
+ extension->SetManifestData(keys::kFileBrowserHandlers, info.release());
+ return true;
+}
diff --git a/chrome/common/extensions/file_browser_handler.h b/chrome/browser/chromeos/extensions/file_browser_handler.h
index 90e2384..4dfbd69 100644
--- a/chrome/common/extensions/file_browser_handler.h
+++ b/chrome/browser/chromeos/extensions/file_browser_handler.h
@@ -2,14 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CHROME_COMMON_EXTENSIONS_FILE_BROWSER_HANDLER_H_
-#define CHROME_COMMON_EXTENSIONS_FILE_BROWSER_HANDLER_H_
+#ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_BROWSER_HANDLER_H_
+#define CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_BROWSER_HANDLER_H_
#include <set>
#include <string>
#include <vector>
#include "base/basictypes.h"
+#include "chrome/common/extensions/extension.h"
+#include "chrome/common/extensions/manifest_handler.h"
#include "extensions/common/url_pattern.h"
#include "extensions/common/url_pattern_set.h"
#include "googleurl/src/gurl.h"
@@ -19,6 +21,8 @@ class URLPattern;
// FileBrowserHandler encapsulates the state of a file browser action.
class FileBrowserHandler {
public:
+ typedef std::vector<linked_ptr<FileBrowserHandler> > List;
+
// Returns true iff the extension with id |extension_id| is allowed to use
// MIME type filters.
static bool ExtensionWhitelistedForMIMETypes(const std::string& extension_id);
@@ -83,6 +87,9 @@ class FileBrowserHandler {
// Checks if handler has "create" access specified.
bool HasCreateAccessPermission() const;
+ // Returns the file browser handlers associated with the |extension|.
+ static List* GetHandlers(const extensions::Extension* extension);
+
private:
// The id of the extension that will be whitelisted to use MIME type filters
// during tests.
@@ -103,4 +110,15 @@ class FileBrowserHandler {
std::set<std::string> mime_type_set_;
};
-#endif // CHROME_COMMON_EXTENSIONS_FILE_BROWSER_HANDLER_H_
+// Parses the "file_browser_handlers" extension manifest key.
+class FileBrowserHandlerParser : public extensions::ManifestHandler {
+ public:
+ FileBrowserHandlerParser();
+ virtual ~FileBrowserHandlerParser();
+
+ virtual bool Parse(const base::Value* value,
+ extensions::Extension* extension,
+ string16* error) OVERRIDE;
+};
+
+#endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_BROWSER_HANDLER_H_
diff --git a/chrome/common/extensions/manifest_tests/extension_manifests_filebrowser_unittest.cc b/chrome/browser/chromeos/extensions/file_browser_manifest_unittest.cc
index 7dd98a8..58d8314 100644
--- a/chrome/common/extensions/manifest_tests/extension_manifests_filebrowser_unittest.cc
+++ b/chrome/browser/chromeos/extensions/file_browser_manifest_unittest.cc
@@ -2,25 +2,38 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/common/extensions/manifest_tests/extension_manifest_test.h"
-
#include "base/string_number_conversions.h"
+#include "chrome/browser/chromeos/extensions/file_browser_handler.h"
#include "chrome/common/extensions/extension_builder.h"
#include "chrome/common/extensions/extension_manifest_constants.h"
-#include "chrome/common/extensions/file_browser_handler.h"
+#include "chrome/common/extensions/manifest_handler.h"
+#include "chrome/common/extensions/manifest_tests/extension_manifest_test.h"
#include "chrome/common/extensions/value_builder.h"
#include "extensions/common/error_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace errors = extension_manifest_errors;
-namespace extensions {
+using extensions::DictionaryBuilder;
+using extensions::Extension;
+using extensions::ExtensionBuilder;
+using extensions::ListBuilder;
+
namespace {
-TEST_F(ExtensionManifestTest, InvalidFileBrowserHandlers) {
+class FileBrowserHandlerManifestTest : public ExtensionManifestTest {
+ virtual void SetUp() OVERRIDE {
+ ExtensionManifestTest::SetUp();
+ extensions::ManifestHandler::Register(
+ extension_manifest_keys::kFileBrowserHandlers,
+ new FileBrowserHandlerParser);
+ }
+};
+
+TEST_F(FileBrowserHandlerManifestTest, InvalidFileBrowserHandlers) {
Testcase testcases[] = {
Testcase("filebrowser_invalid_access_permission.json",
- ErrorUtils::FormatErrorMessage(
+ extensions::ErrorUtils::FormatErrorMessage(
errors::kInvalidFileAccessValue, base::IntToString(1))),
Testcase("filebrowser_invalid_access_permission_list.json",
errors::kInvalidFileAccessList),
@@ -37,16 +50,16 @@ TEST_F(ExtensionManifestTest, InvalidFileBrowserHandlers) {
Testcase("filebrowser_invalid_file_filters_1.json",
errors::kInvalidFileFiltersList),
Testcase("filebrowser_invalid_file_filters_2.json",
- ErrorUtils::FormatErrorMessage(
+ extensions::ErrorUtils::FormatErrorMessage(
errors::kInvalidFileFilterValue, base::IntToString(0))),
Testcase("filebrowser_invalid_file_filters_url.json",
- ErrorUtils::FormatErrorMessage(
+ extensions::ErrorUtils::FormatErrorMessage(
errors::kInvalidURLPatternError, "http:*.html"))
};
RunTestcases(testcases, arraysize(testcases), EXPECT_TYPE_ERROR);
}
-TEST_F(ExtensionManifestTest, ValidFileBrowserHandler) {
+TEST_F(FileBrowserHandlerManifestTest, ValidFileBrowserHandler) {
scoped_refptr<const Extension> extension =
ExtensionBuilder()
.SetManifest(DictionaryBuilder()
@@ -63,15 +76,16 @@ TEST_F(ExtensionManifestTest, ValidFileBrowserHandler) {
.Build();
ASSERT_TRUE(extension.get());
- ASSERT_TRUE(extension->file_browser_handlers() != NULL);
- ASSERT_EQ(extension->file_browser_handlers()->size(), 1U);
- const FileBrowserHandler* action =
- extension->file_browser_handlers()->at(0).get();
+ FileBrowserHandler::List* handlers =
+ FileBrowserHandler::GetHandlers(extension);
+ ASSERT_TRUE(handlers != NULL);
+ ASSERT_EQ(handlers->size(), 1U);
+ const FileBrowserHandler* action = handlers->at(0).get();
EXPECT_EQ(action->id(), "ExtremelyCoolAction");
EXPECT_EQ(action->title(), "Be Amazed");
EXPECT_EQ(action->icon_path(), "icon.png");
- const URLPatternSet& patterns = action->file_url_patterns();
+ const extensions::URLPatternSet& patterns = action->file_url_patterns();
ASSERT_EQ(patterns.patterns().size(), 1U);
EXPECT_TRUE(action->MatchesURL(
GURL("filesystem:chrome-extension://foo/local/test.txt")));
@@ -81,7 +95,7 @@ TEST_F(ExtensionManifestTest, ValidFileBrowserHandler) {
EXPECT_FALSE(action->CanHandleMIMEType("plain/text"));
}
-TEST_F(ExtensionManifestTest, ValidFileBrowserHandlerMIMETypes) {
+TEST_F(FileBrowserHandlerManifestTest, ValidFileBrowserHandlerMIMETypes) {
scoped_refptr<const Extension> extension =
ExtensionBuilder()
.SetID(extension_misc::kQuickOfficeExtensionId)
@@ -101,21 +115,23 @@ TEST_F(ExtensionManifestTest, ValidFileBrowserHandlerMIMETypes) {
.Build();
ASSERT_TRUE(extension.get());
- ASSERT_TRUE(extension->file_browser_handlers() != NULL);
- ASSERT_EQ(extension->file_browser_handlers()->size(), 1U);
- const FileBrowserHandler* action =
- extension->file_browser_handlers()->at(0).get();
+ FileBrowserHandler::List* handlers =
+ FileBrowserHandler::GetHandlers(extension);
+ ASSERT_TRUE(handlers != NULL);
+ ASSERT_EQ(handlers->size(), 1U);
+ const FileBrowserHandler* action = handlers->at(0).get();
EXPECT_FALSE(action->CanHandleMIMEType("plain/html"));
EXPECT_TRUE(action->CanHandleMIMEType("plain/text"));
- const URLPatternSet& patterns = action->file_url_patterns();
+ const extensions::URLPatternSet& patterns = action->file_url_patterns();
ASSERT_EQ(patterns.patterns().size(), 1U);
EXPECT_TRUE(action->MatchesURL(
GURL("filesystem:chrome-extension://foo/local/test.txt")));
}
-TEST_F(ExtensionManifestTest, FileBrowserHandlerMIMETypesNotWhitelisted) {
+TEST_F(FileBrowserHandlerManifestTest,
+ FileBrowserHandlerMIMETypesNotWhitelisted) {
scoped_ptr<DictionaryValue> manifest_value =
DictionaryBuilder()
.Set("name", "MIME types test")
@@ -136,7 +152,7 @@ TEST_F(ExtensionManifestTest, FileBrowserHandlerMIMETypesNotWhitelisted) {
errors::kNoPermissionForFileBrowserHandlerMIMETypes);
}
-TEST_F(ExtensionManifestTest, ValidFileBrowserHandlerWithCreate) {
+TEST_F(FileBrowserHandlerManifestTest, ValidFileBrowserHandlerWithCreate) {
scoped_refptr<const Extension> extension =
ExtensionBuilder()
.SetManifest(DictionaryBuilder()
@@ -154,11 +170,13 @@ TEST_F(ExtensionManifestTest, ValidFileBrowserHandlerWithCreate) {
.Append("create")))))
.Build();
- ASSERT_TRUE(extension->file_browser_handlers() != NULL);
- ASSERT_EQ(extension->file_browser_handlers()->size(), 1U);
- const FileBrowserHandler* action =
- extension->file_browser_handlers()->at(0).get();
- const URLPatternSet& patterns = action->file_url_patterns();
+ ASSERT_TRUE(extension.get());
+ FileBrowserHandler::List* handlers =
+ FileBrowserHandler::GetHandlers(extension);
+ ASSERT_TRUE(handlers != NULL);
+ ASSERT_EQ(handlers->size(), 1U);
+ const FileBrowserHandler* action = handlers->at(0).get();
+ const extensions::URLPatternSet& patterns = action->file_url_patterns();
EXPECT_EQ(patterns.patterns().size(), 0U);
EXPECT_TRUE(action->HasCreateAccessPermission());
@@ -166,7 +184,7 @@ TEST_F(ExtensionManifestTest, ValidFileBrowserHandlerWithCreate) {
EXPECT_FALSE(action->CanWrite());
}
-TEST_F(ExtensionManifestTest, FileManagerURLOverride) {
+TEST_F(FileBrowserHandlerManifestTest, FileManagerURLOverride) {
scoped_ptr<DictionaryValue> manifest_value =
DictionaryBuilder()
.Set("name", "override_files")
@@ -192,4 +210,3 @@ TEST_F(ExtensionManifestTest, FileManagerURLOverride) {
}
} // namespace
-} // namespace extensions
diff --git a/chrome/browser/chromeos/extensions/file_browser_private_api.cc b/chrome/browser/chromeos/extensions/file_browser_private_api.cc
index 96e665f..e75c81c 100644
--- a/chrome/browser/chromeos/extensions/file_browser_private_api.cc
+++ b/chrome/browser/chromeos/extensions/file_browser_private_api.cc
@@ -32,12 +32,15 @@
#include "chrome/browser/chromeos/drive/drive_file_system_util.h"
#include "chrome/browser/chromeos/drive/drive_system_service.h"
#include "chrome/browser/chromeos/drive/drive_webapps_registry.h"
+#include "chrome/browser/chromeos/extensions/file_browser_handler.h"
+#include "chrome/browser/chromeos/extensions/file_browser_private_api_factory.h"
#include "chrome/browser/chromeos/extensions/file_handler_util.h"
#include "chrome/browser/chromeos/extensions/file_manager_util.h"
#include "chrome/browser/chromeos/extensions/zip_file_creator.h"
#include "chrome/browser/chromeos/system/statistics_provider.h"
#include "chrome/browser/extensions/app_file_handler_util.h"
#include "chrome/browser/extensions/extension_function_dispatcher.h"
+#include "chrome/browser/extensions/extension_function_registry.h"
#include "chrome/browser/extensions/extension_process_manager.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_system.h"
@@ -56,7 +59,7 @@
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_constants.h"
#include "chrome/common/extensions/extension_icon_set.h"
-#include "chrome/common/extensions/file_browser_handler.h"
+#include "chrome/common/extensions/extension_manifest_constants.h"
#include "chrome/common/pref_names.h"
#include "chromeos/disks/disk_mount_manager.h"
#include "content/public/browser/child_process_security_policy.h"
@@ -530,6 +533,65 @@ class RequestLocalFileSystemFunction::LocalFileSystemCallbackDispatcher {
DISALLOW_COPY_AND_ASSIGN(LocalFileSystemCallbackDispatcher);
};
+FileBrowserPrivateAPI::FileBrowserPrivateAPI(Profile* profile)
+ : event_router_(make_scoped_refptr(new FileBrowserEventRouter(profile))) {
+ extensions::ManifestHandler::Register(
+ extension_manifest_keys::kFileBrowserHandlers,
+ new FileBrowserHandlerParser);
+
+ ExtensionFunctionRegistry* registry =
+ ExtensionFunctionRegistry::GetInstance();
+ registry->RegisterFunction<CancelFileDialogFunction>();
+ registry->RegisterFunction<ExecuteTasksFileBrowserFunction>();
+ registry->RegisterFunction<SetDefaultTaskFileBrowserFunction>();
+ registry->RegisterFunction<FileDialogStringsFunction>();
+ registry->RegisterFunction<GetFileTasksFileBrowserFunction>();
+ registry->RegisterFunction<GetVolumeMetadataFunction>();
+ registry->RegisterFunction<RequestLocalFileSystemFunction>();
+ registry->RegisterFunction<AddFileWatchBrowserFunction>();
+ registry->RegisterFunction<RemoveFileWatchBrowserFunction>();
+ registry->RegisterFunction<SelectFileFunction>();
+ registry->RegisterFunction<SelectFilesFunction>();
+ registry->RegisterFunction<AddMountFunction>();
+ registry->RegisterFunction<RemoveMountFunction>();
+ registry->RegisterFunction<GetMountPointsFunction>();
+ registry->RegisterFunction<GetSizeStatsFunction>();
+ registry->RegisterFunction<FormatDeviceFunction>();
+ registry->RegisterFunction<ViewFilesFunction>();
+ registry->RegisterFunction<ToggleFullscreenFunction>();
+ registry->RegisterFunction<IsFullscreenFunction>();
+ registry->RegisterFunction<GetDriveFilePropertiesFunction>();
+ registry->RegisterFunction<PinDriveFileFunction>();
+ registry->RegisterFunction<GetFileLocationsFunction>();
+ registry->RegisterFunction<GetDriveFilesFunction>();
+ registry->RegisterFunction<GetFileTransfersFunction>();
+ registry->RegisterFunction<CancelFileTransfersFunction>();
+ registry->RegisterFunction<TransferFileFunction>();
+ registry->RegisterFunction<GetPreferencesFunction>();
+ registry->RegisterFunction<SetPreferencesFunction>();
+ registry->RegisterFunction<SearchDriveFunction>();
+ registry->RegisterFunction<ClearDriveCacheFunction>();
+ registry->RegisterFunction<ReloadDriveFunction>();
+ registry->RegisterFunction<GetNetworkConnectionStateFunction>();
+ registry->RegisterFunction<RequestDirectoryRefreshFunction>();
+ registry->RegisterFunction<SetLastModifiedFunction>();
+ registry->RegisterFunction<ZipSelectionFunction>();
+
+ event_router_->ObserveFileSystemEvents();
+}
+
+FileBrowserPrivateAPI::~FileBrowserPrivateAPI() {
+}
+
+void FileBrowserPrivateAPI::Shutdown() {
+ event_router_->Shutdown();
+}
+
+// static
+FileBrowserPrivateAPI* FileBrowserPrivateAPI::Get(Profile* profile) {
+ return FileBrowserPrivateAPIFactory::GetForProfile(profile);
+}
+
void RequestLocalFileSystemFunction::RequestOnFileThread(
scoped_refptr<fileapi::FileSystemContext> file_system_context,
const GURL& source_url,
@@ -608,7 +670,7 @@ bool FileWatchBrowserFunctionBase::RunImpl() {
base::Bind(
&FileWatchBrowserFunctionBase::RunFileWatchOperationOnFileThread,
this,
- FileBrowserEventRouterFactory::GetForProfile(profile_),
+ FileBrowserPrivateAPI::Get(profile_)->event_router(),
file_watch_url,
extension_id()));
@@ -1428,7 +1490,7 @@ bool AddMountFunction::RunImpl() {
const std::string& drive_path =
drive::util::GetDriveMountPointPathAsString();
SetResult(new base::StringValue(drive_path));
- FileBrowserEventRouterFactory::GetForProfile(profile_)->
+ FileBrowserPrivateAPI::Get(profile_)->event_router()->
MountDrive(base::Bind(&AddMountFunction::SendResponse,
this,
success));
diff --git a/chrome/browser/chromeos/extensions/file_browser_private_api.h b/chrome/browser/chromeos/extensions/file_browser_private_api.h
index be0d43d..eadc92c 100644
--- a/chrome/browser/chromeos/extensions/file_browser_private_api.h
+++ b/chrome/browser/chromeos/extensions/file_browser_private_api.h
@@ -10,7 +10,6 @@
#include <string>
#include <vector>
-#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/platform_file.h"
#include "chrome/browser/chromeos/drive/drive_file_error.h"
@@ -18,9 +17,15 @@
#include "chrome/browser/chromeos/extensions/zip_file_creator.h"
#include "chrome/browser/extensions/extension_function.h"
#include "chrome/browser/prefs/pref_service.h"
+#include "chrome/browser/profiles/profile_keyed_service.h"
#include "googleurl/src/url_util.h"
class GURL;
+class Profile;
+
+namespace base {
+class Value;
+}
namespace fileapi {
class FileSystemContext;
@@ -37,6 +42,26 @@ namespace ui {
struct SelectedFileInfo;
}
+// Manages and registers the fileBrowserPrivate API with the extension system.
+class FileBrowserPrivateAPI : public ProfileKeyedService {
+ public:
+ explicit FileBrowserPrivateAPI(Profile* profile);
+ virtual ~FileBrowserPrivateAPI();
+
+ // ProfileKeyedService overrides.
+ virtual void Shutdown() OVERRIDE;
+
+ // Convenience function to return the FileBrowserPrivateAPI for a Profile.
+ static FileBrowserPrivateAPI* Get(Profile* profile);
+
+ scoped_refptr<FileBrowserEventRouter> event_router() {
+ return event_router_;
+ }
+
+ private:
+ scoped_refptr<FileBrowserEventRouter> event_router_;
+};
+
// Implements the chrome.fileBrowserPrivate.requestLocalFileSystem method.
class RequestLocalFileSystemFunction : public AsyncExtensionFunction {
public:
diff --git a/chrome/browser/chromeos/extensions/file_browser_private_api_factory.cc b/chrome/browser/chromeos/extensions/file_browser_private_api_factory.cc
new file mode 100644
index 0000000..ce6e337
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/file_browser_private_api_factory.cc
@@ -0,0 +1,55 @@
+// Copyright (c) 2012 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/chromeos/extensions/file_browser_private_api_factory.h"
+
+#include "chrome/browser/chromeos/drive/drive_system_service.h"
+#include "chrome/browser/chromeos/extensions/file_browser_private_api.h"
+#include "chrome/browser/extensions/extension_system_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_dependency_manager.h"
+
+// static
+FileBrowserPrivateAPI*
+FileBrowserPrivateAPIFactory::GetForProfile(Profile* profile) {
+ return static_cast<FileBrowserPrivateAPI*>(
+ GetInstance()->GetServiceForProfile(profile, true));
+}
+
+// static
+FileBrowserPrivateAPIFactory*
+FileBrowserPrivateAPIFactory::GetInstance() {
+ return Singleton<FileBrowserPrivateAPIFactory>::get();
+}
+
+FileBrowserPrivateAPIFactory::FileBrowserPrivateAPIFactory()
+ : ProfileKeyedServiceFactory(
+ "FileBrowserPrivateAPI",
+ ProfileDependencyManager::GetInstance()) {
+ DependsOn(drive::DriveSystemServiceFactory::GetInstance());
+ DependsOn(extensions::ExtensionSystemFactory::GetInstance());
+}
+
+FileBrowserPrivateAPIFactory::~FileBrowserPrivateAPIFactory() {
+}
+
+ProfileKeyedService*
+FileBrowserPrivateAPIFactory::BuildServiceInstanceFor(Profile* profile) const {
+ return new FileBrowserPrivateAPI(profile);
+}
+
+bool FileBrowserPrivateAPIFactory::ServiceHasOwnInstanceInIncognito() const {
+ // Explicitly and always allow this router in guest login mode. See
+ // chrome/browser/profiles/profile_keyed_base_factory.h comment
+ // for the details.
+ return true;
+}
+
+bool FileBrowserPrivateAPIFactory::ServiceIsCreatedWithProfile() const {
+ return true;
+}
+
+bool FileBrowserPrivateAPIFactory::ServiceIsNULLWhileTesting() const {
+ return true;
+}
diff --git a/chrome/browser/chromeos/extensions/file_browser_private_api_factory.h b/chrome/browser/chromeos/extensions/file_browser_private_api_factory.h
new file mode 100644
index 0000000..b7ed1ac
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/file_browser_private_api_factory.h
@@ -0,0 +1,40 @@
+// Copyright (c) 2012 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.
+
+#ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_BROWSER_PRIVATE_API_FACTORY_H_
+#define CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_BROWSER_PRIVATE_API_FACTORY_H_
+
+#include "base/memory/singleton.h"
+#include "chrome/browser/profiles/profile_keyed_service_factory.h"
+
+class FileBrowserPrivateAPI;
+class Profile;
+
+class FileBrowserPrivateAPIFactory : public ProfileKeyedServiceFactory {
+ public:
+ // Returns the FileBrowserPrivateAPI for |profile|, creating it if
+ // it is not yet created.
+ static FileBrowserPrivateAPI* GetForProfile(Profile* profile);
+
+ // Returns the FileBrowserPrivateAPIFactory instance.
+ static FileBrowserPrivateAPIFactory* GetInstance();
+
+ protected:
+ // ProfileKeyedBaseFactory overrides:
+ virtual bool ServiceHasOwnInstanceInIncognito() const OVERRIDE;
+ virtual bool ServiceIsCreatedWithProfile() const OVERRIDE;
+ virtual bool ServiceIsNULLWhileTesting() const OVERRIDE;
+
+ private:
+ friend struct DefaultSingletonTraits<FileBrowserPrivateAPIFactory>;
+
+ FileBrowserPrivateAPIFactory();
+ virtual ~FileBrowserPrivateAPIFactory();
+
+ // ProfileKeyedServiceFactory:
+ virtual ProfileKeyedService* BuildServiceInstanceFor(Profile* profile)
+ const OVERRIDE;
+};
+
+#endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_BROWSER_PRIVATE_API_FACTORY_H_
diff --git a/chrome/browser/chromeos/extensions/file_browser_resource_throttle.cc b/chrome/browser/chromeos/extensions/file_browser_resource_throttle.cc
index 7649929..f7aecc7 100644
--- a/chrome/browser/chromeos/extensions/file_browser_resource_throttle.cc
+++ b/chrome/browser/chromeos/extensions/file_browser_resource_throttle.cc
@@ -8,6 +8,7 @@
#include "base/bind.h"
#include "base/values.h"
+#include "chrome/browser/chromeos/extensions/file_browser_handler.h"
#include "chrome/browser/extensions/event_router.h"
#include "chrome/browser/extensions/extension_info_map.h"
#include "chrome/browser/extensions/extension_system.h"
@@ -15,7 +16,6 @@
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_constants.h"
#include "chrome/common/extensions/extension_set.h"
-#include "chrome/common/extensions/file_browser_handler.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_view_host.h"
@@ -37,12 +37,13 @@ const char* const kOnExecuteContentHandlerEvent =
// |extension| must not be NULL.
bool CanHandleMimeType(const Extension* extension,
const std::string& mime_type) {
- if (!extension->file_browser_handlers())
+ FileBrowserHandler::List* handlers =
+ FileBrowserHandler::GetHandlers(extension);
+ if (!handlers)
return false;
- for (Extension::FileBrowserHandlerList::const_iterator handler =
- extension->file_browser_handlers()->begin();
- handler != extension->file_browser_handlers()->end();
+ for (FileBrowserHandler::List::const_iterator handler = handlers->begin();
+ handler != handlers->end();
++handler) {
if ((*handler)->CanHandleMIMEType(mime_type)) {
return true;
diff --git a/chrome/browser/chromeos/extensions/file_browser_resource_throttle_browsertest.cc b/chrome/browser/chromeos/extensions/file_browser_resource_throttle_browsertest.cc
index bd24d9f..bcd4488 100644
--- a/chrome/browser/chromeos/extensions/file_browser_resource_throttle_browsertest.cc
+++ b/chrome/browser/chromeos/extensions/file_browser_resource_throttle_browsertest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "base/message_loop.h"
+#include "chrome/browser/chromeos/extensions/file_browser_handler.h"
#include "chrome/browser/chromeos/extensions/file_browser_resource_throttle.h"
#include "chrome/browser/download/download_prefs.h"
#include "chrome/browser/extensions/event_router.h"
@@ -13,7 +14,6 @@
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_tabstrip.cc"
-#include "chrome/common/extensions/file_browser_handler.h"
#include "chrome/common/pref_names.cc"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/download_item.h"
@@ -194,8 +194,9 @@ class FileBrowserResourceThrottleExtensionApiTest : public ExtensionApiTest {
if (!extension)
return NULL;
- if (!extension->file_browser_handlers() ||
- extension->file_browser_handlers()->size() == 0u) {
+ FileBrowserHandler::List* handlers =
+ FileBrowserHandler::GetHandlers(extension);
+ if (!handlers || handlers->size() == 0u) {
message_ = "No file browser handlers defined.";
return NULL;
}
@@ -209,7 +210,7 @@ class FileBrowserResourceThrottleExtensionApiTest : public ExtensionApiTest {
// that is not white-listed to handle MIME types with its file browser
// handlers.
FileBrowserHandler* file_browser_handler = const_cast<FileBrowserHandler*>(
- extension->file_browser_handlers()->at(0).get());
+ handlers->at(0).get());
file_browser_handler->AddMIMEType("application/msword");
file_browser_handler->AddMIMEType("plain/text");
diff --git a/chrome/browser/chromeos/extensions/file_browser_resource_throttle_unittest.cc b/chrome/browser/chromeos/extensions/file_browser_resource_throttle_unittest.cc
index 7456c46..8cfe5b7 100644
--- a/chrome/browser/chromeos/extensions/file_browser_resource_throttle_unittest.cc
+++ b/chrome/browser/chromeos/extensions/file_browser_resource_throttle_unittest.cc
@@ -3,12 +3,14 @@
// found in the LICENSE file.
#include "base/message_loop.h"
+#include "chrome/browser/chromeos/extensions/file_browser_handler.h"
#include "chrome/browser/chromeos/extensions/file_browser_resource_throttle.h"
#include "chrome/browser/extensions/extension_info_map.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_builder.h"
#include "chrome/common/extensions/extension_constants.h"
-#include "chrome/common/extensions/file_browser_handler.h"
+#include "chrome/common/extensions/extension_manifest_constants.h"
+#include "chrome/common/extensions/manifest_handler.h"
#include "chrome/common/extensions/value_builder.h"
#include "content/public/browser/resource_controller.h"
#include "content/public/test/test_browser_thread.h"
@@ -65,7 +67,10 @@ class FileBrowserResourceThrottleTest : public testing::Test {
virtual ~FileBrowserResourceThrottleTest() {}
virtual void SetUp() {
- // Extension info map must be created before |CreateAndIstallTestExtension|
+ extensions::ManifestHandler::Register(
+ extension_manifest_keys::kFileBrowserHandlers,
+ new FileBrowserHandlerParser);
+ // Extension info map must be created before |CreateAndInstallTestExtension|
// is called (the method will add created extension to the info map).
extension_info_map_ = new ExtensionInfoMap();
CreateAndInstallTestExtension();
diff --git a/chrome/browser/chromeos/extensions/file_handler_util.cc b/chrome/browser/chromeos/extensions/file_handler_util.cc
index 9e94e65..386d896 100644
--- a/chrome/browser/chromeos/extensions/file_handler_util.cc
+++ b/chrome/browser/chromeos/extensions/file_handler_util.cc
@@ -13,6 +13,7 @@
#include "base/utf_string_conversions.h"
#include "chrome/browser/chromeos/drive/drive_file_system_util.h"
#include "chrome/browser/chromeos/drive/drive_task_executor.h"
+#include "chrome/browser/chromeos/extensions/file_browser_handler.h"
#include "chrome/browser/chromeos/extensions/file_manager_util.h"
#include "chrome/browser/extensions/event_router.h"
#include "chrome/browser/extensions/extension_host.h"
@@ -28,7 +29,6 @@
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/host_desktop.h"
-#include "chrome/common/extensions/file_browser_handler.h"
#include "chrome/common/pref_names.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/child_process_security_policy.h"
@@ -121,9 +121,11 @@ bool MatchesAllURLs(const FileBrowserHandler* handler) {
const FileBrowserHandler* FindFileBrowserHandler(const Extension* extension,
const std::string& action_id) {
- for (Extension::FileBrowserHandlerList::const_iterator action_iter =
- extension->file_browser_handlers()->begin();
- action_iter != extension->file_browser_handlers()->end();
+ FileBrowserHandler::List* handler_list =
+ FileBrowserHandler::GetHandlers(extension);
+ for (FileBrowserHandler::List::const_iterator action_iter =
+ handler_list->begin();
+ action_iter != handler_list->end();
++action_iter) {
if (action_iter->get()->id() == action_id)
return action_iter->get();
@@ -174,12 +176,14 @@ bool GetFileBrowserHandlers(Profile* profile,
if (profile->IsOffTheRecord() &&
!service->IsIncognitoEnabled(extension->id()))
continue;
- if (!extension->file_browser_handlers())
- continue;
- for (Extension::FileBrowserHandlerList::const_iterator action_iter =
- extension->file_browser_handlers()->begin();
- action_iter != extension->file_browser_handlers()->end();
+ FileBrowserHandler::List* handler_list =
+ FileBrowserHandler::GetHandlers(extension);
+ if (!handler_list)
+ continue;
+ for (FileBrowserHandler::List::const_iterator action_iter =
+ handler_list->begin();
+ action_iter != handler_list->end();
++action_iter) {
const FileBrowserHandler* action = action_iter->get();
if (!action->MatchesURL(lowercase_url))
diff --git a/chrome/browser/chromeos/extensions/file_handler_util.h b/chrome/browser/chromeos/extensions/file_handler_util.h
index 69fd2e7..c92a9fc 100644
--- a/chrome/browser/chromeos/extensions/file_handler_util.h
+++ b/chrome/browser/chromeos/extensions/file_handler_util.h
@@ -11,10 +11,10 @@
#include "base/callback.h"
#include "base/platform_file.h"
#include "chrome/common/extensions/extension.h"
-#include "chrome/common/extensions/file_browser_handler.h"
#include "extensions/common/url_pattern_set.h"
class Browser;
+class FileBrowserHandler;
class GURL;
class Profile;
diff --git a/chrome/browser/chromeos/extensions/file_manager_util.cc b/chrome/browser/chromeos/extensions/file_manager_util.cc
index ffc8d9b..f3501c1 100644
--- a/chrome/browser/chromeos/extensions/file_manager_util.cc
+++ b/chrome/browser/chromeos/extensions/file_manager_util.cc
@@ -19,6 +19,7 @@
#include "chrome/browser/chromeos/drive/drive_file_system.h"
#include "chrome/browser/chromeos/drive/drive_file_system_util.h"
#include "chrome/browser/chromeos/drive/drive_system_service.h"
+#include "chrome/browser/chromeos/extensions/file_browser_handler.h"
#include "chrome/browser/chromeos/extensions/file_handler_util.h"
#include "chrome/browser/chromeos/media/media_player.h"
#include "chrome/browser/extensions/crx_installer.h"
@@ -39,7 +40,6 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
-#include "chrome/common/extensions/file_browser_handler.h"
#include "chrome/common/url_constants.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/plugin_service.h"
diff --git a/chrome/browser/chromeos/login/login_utils_browsertest.cc b/chrome/browser/chromeos/login/login_utils_browsertest.cc
index af31e83..699ec62 100644
--- a/chrome/browser/chromeos/login/login_utils_browsertest.cc
+++ b/chrome/browser/chromeos/login/login_utils_browsertest.cc
@@ -39,6 +39,8 @@
#include "chromeos/dbus/mock_cryptohome_client.h"
#include "chromeos/dbus/mock_dbus_thread_manager.h"
#include "chromeos/dbus/mock_session_manager_client.h"
+#include "chromeos/disks/disk_mount_manager.h"
+#include "chromeos/disks/mock_disk_mount_manager.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/test/test_browser_thread.h"
#include "content/public/test/test_utils.h"
@@ -189,8 +191,9 @@ class LoginUtilsTest : public testing::Test,
// which is part of io_thread_state_.
DBusThreadManager::InitializeForTesting(&mock_dbus_thread_manager_);
- input_method::InitializeForTesting(
- &mock_input_method_manager_);
+ input_method::InitializeForTesting(&mock_input_method_manager_);
+ disks::DiskMountManager::InitializeForTesting(&mock_disk_mount_manager_);
+ mock_disk_mount_manager_.SetupDefaultReplies();
// Likewise, SessionManagerClient should also be initialized before
// io_thread_state_.
@@ -473,6 +476,7 @@ class LoginUtilsTest : public testing::Test,
MockDBusThreadManager mock_dbus_thread_manager_;
input_method::MockInputMethodManager mock_input_method_manager_;
+ disks::MockDiskMountManager mock_disk_mount_manager_;
net::TestURLFetcherFactory test_url_fetcher_factory_;
cryptohome::MockAsyncMethodCaller* mock_async_method_caller_;
diff --git a/chrome/browser/extensions/extension_function_registry.cc b/chrome/browser/extensions/extension_function_registry.cc
index 0d0dad5..2b97ebb 100644
--- a/chrome/browser/extensions/extension_function_registry.cc
+++ b/chrome/browser/extensions/extension_function_registry.cc
@@ -60,7 +60,6 @@
#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/extensions/echo_private_api.h"
#include "chrome/browser/chromeos/extensions/file_browser_handler_api.h"
-#include "chrome/browser/chromeos/extensions/file_browser_private_api.h"
#include "chrome/browser/chromeos/extensions/info_private_api.h"
#include "chrome/browser/chromeos/extensions/input_method_api.h"
#include "chrome/browser/chromeos/extensions/power/power_api.h"
@@ -346,46 +345,7 @@ void ExtensionFunctionRegistry::ResetFunctions() {
// Device Customization.
RegisterFunction<extensions::GetChromeosInfoFunction>();
- // FileBrowserPrivate functions.
- // TODO(jamescook): Expose these on non-ChromeOS platforms so we can use
- // the extension-based file picker on Aura. crbug.com/97424
- RegisterFunction<CancelFileDialogFunction>();
- RegisterFunction<ExecuteTasksFileBrowserFunction>();
- RegisterFunction<SetDefaultTaskFileBrowserFunction>();
- RegisterFunction<FileDialogStringsFunction>();
- RegisterFunction<GetFileTasksFileBrowserFunction>();
- RegisterFunction<GetVolumeMetadataFunction>();
- RegisterFunction<RequestLocalFileSystemFunction>();
- RegisterFunction<AddFileWatchBrowserFunction>();
- RegisterFunction<RemoveFileWatchBrowserFunction>();
- RegisterFunction<SelectFileFunction>();
- RegisterFunction<SelectFilesFunction>();
- RegisterFunction<AddMountFunction>();
- RegisterFunction<RemoveMountFunction>();
- RegisterFunction<GetMountPointsFunction>();
- RegisterFunction<GetSizeStatsFunction>();
- RegisterFunction<FormatDeviceFunction>();
- RegisterFunction<ViewFilesFunction>();
- RegisterFunction<ToggleFullscreenFunction>();
- RegisterFunction<IsFullscreenFunction>();
- RegisterFunction<GetDriveFilePropertiesFunction>();
- RegisterFunction<PinDriveFileFunction>();
- RegisterFunction<GetFileLocationsFunction>();
- RegisterFunction<GetDriveFilesFunction>();
- RegisterFunction<GetFileTransfersFunction>();
- RegisterFunction<CancelFileTransfersFunction>();
- RegisterFunction<TransferFileFunction>();
- RegisterFunction<GetPreferencesFunction>();
- RegisterFunction<SetPreferencesFunction>();
- RegisterFunction<SearchDriveFunction>();
- RegisterFunction<ClearDriveCacheFunction>();
- RegisterFunction<ReloadDriveFunction>();
- RegisterFunction<GetNetworkConnectionStateFunction>();
- RegisterFunction<RequestDirectoryRefreshFunction>();
- RegisterFunction<SetLastModifiedFunction>();
- RegisterFunction<ZipSelectionFunction>();
-
- // FileBrowserHandler.
+ // FileBrowserHandlerInternal.
RegisterFunction<FileHandlerSelectFileFunction>();
// Mediaplayer
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index eb24254..91caf04 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -112,7 +112,6 @@
#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/cros/cros_library.h"
-#include "chrome/browser/chromeos/extensions/file_browser_event_router.h"
#include "chrome/browser/chromeos/extensions/media_player_event_router.h"
#include "chrome/browser/chromeos/input_method/input_method_manager.h"
#include "content/public/browser/storage_partition.h"
@@ -526,8 +525,6 @@ void ExtensionService::InitEventRouters() {
extensions::PushMessagingAPIFactory::GetForProfile(profile_);
#if defined(OS_CHROMEOS)
- FileBrowserEventRouterFactory::GetForProfile(
- profile_)->ObserveFileSystemEvents();
ExtensionMediaPlayerEventRouter::GetInstance()->Init(profile_);
#endif // defined(OS_CHROMEOS)
diff --git a/chrome/browser/profiles/profile_dependency_manager.cc b/chrome/browser/profiles/profile_dependency_manager.cc
index 3a9575f..5c8b57d 100644
--- a/chrome/browser/profiles/profile_dependency_manager.cc
+++ b/chrome/browser/profiles/profile_dependency_manager.cc
@@ -86,6 +86,9 @@
#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/extensions/input_method_api_factory.h"
#include "chrome/browser/extensions/api/input_ime/input_ime_api_factory.h"
+#if defined(FILE_MANAGER_EXTENSION)
+#include "chrome/browser/chromeos/extensions/file_browser_private_api_factory.h"
+#endif
#endif
#if defined(USE_AURA)
@@ -266,6 +269,9 @@ void ProfileDependencyManager::AssertFactoriesBuilt() {
ExtensionManagementAPIFactory::GetInstance();
#endif
FaviconServiceFactory::GetInstance();
+#if defined(OS_CHROMEOS) && defined(FILE_MANAGER_EXTENSION)
+ FileBrowserPrivateAPIFactory::GetInstance();
+#endif
FindBarStateFactory::GetInstance();
#if defined(USE_AURA)
GesturePrefsObserverFactoryAura::GetInstance();
diff --git a/chrome/chrome_browser_chromeos.gypi b/chrome/chrome_browser_chromeos.gypi
index 6f228bf..c9353ec 100644
--- a/chrome/chrome_browser_chromeos.gypi
+++ b/chrome/chrome_browser_chromeos.gypi
@@ -653,10 +653,14 @@
# Only extension API implementations should go here.
'browser/chromeos/extensions/echo_private_api.cc',
'browser/chromeos/extensions/echo_private_api.h',
+ 'browser/chromeos/extensions/file_browser_handler.cc',
+ 'browser/chromeos/extensions/file_browser_handler.h',
'browser/chromeos/extensions/file_browser_handler_api.cc',
'browser/chromeos/extensions/file_browser_handler_api.h',
'browser/chromeos/extensions/file_browser_private_api.cc',
'browser/chromeos/extensions/file_browser_private_api.h',
+ 'browser/chromeos/extensions/file_browser_private_api_factory.cc',
+ 'browser/chromeos/extensions/file_browser_private_api_factory.h',
'browser/chromeos/extensions/input_method_api.cc',
'browser/chromeos/extensions/input_method_api.h',
'browser/chromeos/extensions/input_method_api_factory.cc',
@@ -701,6 +705,8 @@
['exclude', 'browser/chromeos/extensions/file_browser_handler_api.h'],
['exclude', 'browser/chromeos/extensions/file_browser_private_api.cc'],
['exclude', 'browser/chromeos/extensions/file_browser_private_api.h'],
+ ['exclude', 'browser/chromeos/extensions/file_browser_private_api_factory.cc'],
+ ['exclude', 'browser/chromeos/extensions/file_browser_private_api_factory.h'],
['exclude', 'browser/chromeos/extensions/file_handler_util.h'],
['exclude', 'browser/chromeos/extensions/file_handler_util.cc'],
['exclude', 'browser/chromeos/extensions/file_manager_util.h'],
diff --git a/chrome/chrome_common.gypi b/chrome/chrome_common.gypi
index 9d42cc5..2f715b5 100644
--- a/chrome/chrome_common.gypi
+++ b/chrome/chrome_common.gypi
@@ -175,8 +175,6 @@
'common/extensions/features/permission_feature.h',
'common/extensions/features/simple_feature.cc',
'common/extensions/features/simple_feature.h',
- 'common/extensions/file_browser_handler.cc',
- 'common/extensions/file_browser_handler.h',
'common/extensions/manifest.cc',
'common/extensions/manifest.h',
'common/extensions/manifest_handler.cc',
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index 46f8d14..be0c23d 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -565,6 +565,7 @@
'browser/chromeos/drive/resource_entry_conversion_unittest.cc',
'browser/chromeos/drive/stale_cache_files_remover_unittest.cc',
'browser/chromeos/extensions/default_app_order_unittest.cc',
+ 'browser/chromeos/extensions/file_browser_manifest_unittest.cc',
'browser/chromeos/extensions/file_browser_notifications_unittest.cc',
'browser/chromeos/extensions/file_browser_resource_throttle_unittest.cc',
'browser/chromeos/extensions/wallpaper_private_api_unittest.cc',
@@ -1473,7 +1474,6 @@
'common/extensions/manifest_tests/extension_manifests_devtools_unittest.cc',
'common/extensions/manifest_tests/extension_manifests_excludematches_unittest.cc',
'common/extensions/manifest_tests/extension_manifests_experimental_unittest.cc',
- 'common/extensions/manifest_tests/extension_manifests_filebrowser_unittest.cc',
'common/extensions/manifest_tests/extension_manifests_homepage_unittest.cc',
'common/extensions/manifest_tests/extension_manifests_icon_unittest.cc',
'common/extensions/manifest_tests/extension_manifests_initvalue_unittest.cc',
diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc
index cbe9a2d..4aa0331 100644
--- a/chrome/common/extensions/extension.cc
+++ b/chrome/common/extensions/extension.cc
@@ -32,7 +32,6 @@
#include "chrome/common/extensions/feature_switch.h"
#include "chrome/common/extensions/features/base_feature_provider.h"
#include "chrome/common/extensions/features/feature.h"
-#include "chrome/common/extensions/file_browser_handler.h"
#include "chrome/common/extensions/manifest.h"
#include "chrome/common/extensions/manifest_handler.h"
#include "chrome/common/extensions/permissions/permission_set.h"
@@ -2798,7 +2797,6 @@ bool Extension::LoadExtensionFeatures(APIPermissionSet* api_permissions,
!LoadBrowserAction(error) ||
!LoadSystemIndicator(api_permissions, error) ||
!LoadScriptBadge(error) ||
- !LoadFileBrowserHandlers(error) ||
!LoadChromeURLOverrides(error) ||
!LoadTextToSpeechVoices(error) ||
!LoadIncognitoMode(error) ||
@@ -3140,180 +3138,6 @@ bool Extension::LoadSystemIndicator(APIPermissionSet* api_permissions,
return true;
}
-bool Extension::LoadFileBrowserHandlers(string16* error) {
- if (!manifest_->HasKey(keys::kFileBrowserHandlers))
- return true;
- ListValue* file_browser_handlers_value = NULL;
- if (!manifest_->GetList(keys::kFileBrowserHandlers,
- &file_browser_handlers_value)) {
- *error = ASCIIToUTF16(errors::kInvalidFileBrowserHandler);
- return false;
- }
- file_browser_handlers_.reset(
- LoadFileBrowserHandlersHelper(file_browser_handlers_value, error));
- if (!file_browser_handlers_.get())
- return false; // Failed to parse file browser actions definition.
- return true;
-}
-
-Extension::FileBrowserHandlerList* Extension::LoadFileBrowserHandlersHelper(
- const ListValue* extension_actions, string16* 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 = ASCIIToUTF16(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, string16* error) {
- scoped_ptr<FileBrowserHandler> result(new FileBrowserHandler());
- result->set_extension_id(id());
-
- std::string handler_id;
- // Read the file action |id| (mandatory).
- if (!file_browser_handler->HasKey(keys::kPageActionId) ||
- !file_browser_handler->GetString(keys::kPageActionId, &handler_id)) {
- *error = ASCIIToUTF16(errors::kInvalidPageActionId);
- return NULL;
- }
- result->set_id(handler_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 = ASCIIToUTF16(errors::kInvalidPageActionDefaultTitle);
- return NULL;
- }
- result->set_title(title);
-
- // Initialize access permissions (optional).
- const ListValue* access_list_value = NULL;
- if (file_browser_handler->HasKey(keys::kFileAccessList)) {
- if (!file_browser_handler->GetList(keys::kFileAccessList,
- &access_list_value) ||
- access_list_value->empty()) {
- *error = ASCIIToUTF16(errors::kInvalidFileAccessList);
- return NULL;
- }
- for (size_t i = 0; i < access_list_value->GetSize(); ++i) {
- std::string access;
- if (!access_list_value->GetString(i, &access) ||
- result->AddFileAccessPermission(access)) {
- *error = ErrorUtils::FormatErrorMessageUTF16(
- errors::kInvalidFileAccessValue, base::IntToString(i));
- return NULL;
- }
- }
- }
- if (!result->ValidateFileAccessPermissions()) {
- *error = ASCIIToUTF16(errors::kInvalidFileAccessList);
- return NULL;
- }
-
- // Initialize file filters (mandatory, unless "create" access is specified,
- // in which case is ignored).
- if (!result->HasCreateAccessPermission()) {
- const ListValue* file_filters = NULL;
- if (!file_browser_handler->HasKey(keys::kFileFilters) ||
- !file_browser_handler->GetList(keys::kFileFilters, &file_filters) ||
- file_filters->empty()) {
- *error = ASCIIToUTF16(errors::kInvalidFileFiltersList);
- return NULL;
- }
- for (size_t i = 0; i < file_filters->GetSize(); ++i) {
- std::string filter;
- if (!file_filters->GetString(i, &filter)) {
- *error = ErrorUtils::FormatErrorMessageUTF16(
- errors::kInvalidFileFilterValue, base::IntToString(i));
- return NULL;
- }
- StringToLowerASCII(&filter);
- if (!StartsWithASCII(filter,
- std::string(chrome::kFileSystemScheme) + ':',
- true)) {
- *error = ErrorUtils::FormatErrorMessageUTF16(
- errors::kInvalidURLPatternError, filter);
- return NULL;
- }
- // The user inputs filesystem:*; we don't actually implement scheme
- // wildcards in URLPattern, so transform to what will match correctly.
- filter.replace(0, 11, "chrome-extension://*/");
- URLPattern pattern(URLPattern::SCHEME_EXTENSION);
- if (pattern.Parse(filter) != URLPattern::PARSE_SUCCESS) {
- *error = ErrorUtils::FormatErrorMessageUTF16(
- errors::kInvalidURLPatternError, filter);
- return NULL;
- }
- std::string path = pattern.path();
- bool allowed = path == "/*" || path == "/*.*" ||
- (path.compare(0, 3, "/*.") == 0 &&
- path.find_first_of('*', 3) == std::string::npos);
- if (!allowed) {
- *error = ErrorUtils::FormatErrorMessageUTF16(
- errors::kInvalidURLPatternError, filter);
- return NULL;
- }
- result->AddPattern(pattern);
- }
-
- // Initialize MIME type filters (optional).
- // NOTE: This is only used by QuickOffice extension to register MIME types
- // it can handle by directly downloading them. It will *not* be used in File
- // Manager UI. This is why file filters are mandatory even when MIME type
- // filters are specified.
- const ListValue* mime_type_filters = NULL;
- if (file_browser_handler->HasKey(keys::kMIMETypes)) {
- if (!FileBrowserHandler::ExtensionWhitelistedForMIMETypes(id())) {
- *error = ASCIIToUTF16(
- errors::kNoPermissionForFileBrowserHandlerMIMETypes);
- return NULL;
- }
-
- if (!file_browser_handler->GetList(keys::kMIMETypes,
- &mime_type_filters)) {
- *error = ASCIIToUTF16(errors::kInvalidFileBrowserHandlerMIMETypes);
- return NULL;
- }
-
- for (size_t i = 0; i < mime_type_filters->GetSize(); ++i) {
- std::string filter;
- if (!mime_type_filters->GetString(i, &filter)) {
- *error = ASCIIToUTF16(errors::kInvalidFileBrowserHandlerMIMETypes);
- return NULL;
- }
- result->AddMIMEType(filter);
- }
- }
- }
-
- 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 = ASCIIToUTF16(errors::kInvalidPageActionIconPath);
- return NULL;
- }
- result->set_icon_path(default_icon);
- }
-
- return result.release();
-}
bool Extension::LoadChromeURLOverrides(string16* error) {
if (!manifest_->HasKey(keys::kChromeURLOverrides))
diff --git a/chrome/common/extensions/extension.h b/chrome/common/extensions/extension.h
index d2fd450..87ba5d5 100644
--- a/chrome/common/extensions/extension.h
+++ b/chrome/common/extensions/extension.h
@@ -35,7 +35,6 @@
class ExtensionAction;
class ExtensionResource;
-class FileBrowserHandler;
class SkBitmap;
class Version;
@@ -69,7 +68,6 @@ class Extension : public base::RefCountedThreadSafe<Extension> {
typedef std::map<const std::string, GURL> URLOverrideMap;
typedef std::vector<std::string> ScriptingWhitelist;
- typedef std::vector<linked_ptr<FileBrowserHandler> > FileBrowserHandlerList;
typedef std::vector<InstallWarning> InstallWarningVector;
typedef std::map<const std::string, linked_ptr<ManifestData> >
ManifestDataMap;
@@ -699,9 +697,6 @@ class Extension : public base::RefCountedThreadSafe<Extension> {
const ActionInfo* system_indicator_info() const {
return system_indicator_info_.get();
}
- const FileBrowserHandlerList* file_browser_handlers() const {
- return file_browser_handlers_.get();
- }
const std::vector<PluginInfo>& plugins() const { return plugins_; }
const std::vector<NaClModuleInfo>& nacl_modules() const {
return nacl_modules_;
@@ -957,13 +952,6 @@ class Extension : public base::RefCountedThreadSafe<Extension> {
bool LoadBrowserAction(string16* error);
bool LoadScriptBadge(string16* error);
bool LoadSystemIndicator(APIPermissionSet* api_permissions, string16* error);
- bool LoadFileBrowserHandlers(string16* error);
- // Helper method to load a FileBrowserHandlerList from the manifest.
- FileBrowserHandlerList* LoadFileBrowserHandlersHelper(
- const base::ListValue* extension_actions, string16* error);
- // Helper method to load an FileBrowserHandler from manifest.
- FileBrowserHandler* LoadFileBrowserHandler(
- const base::DictionaryValue* file_browser_handlers, string16* error);
bool LoadChromeURLOverrides(string16* error);
bool LoadTextToSpeechVoices(string16* error);
bool LoadIncognitoMode(string16* error);
@@ -1121,9 +1109,6 @@ class Extension : public base::RefCountedThreadSafe<Extension> {
// The extension's system indicator, if any.
scoped_ptr<ActionInfo> system_indicator_info_;
- // The extension's file browser actions, if any.
- scoped_ptr<FileBrowserHandlerList> file_browser_handlers_;
-
// Optional list of NPAPI plugins and associated properties.
std::vector<PluginInfo> plugins_;
diff --git a/chrome/common/extensions/file_browser_handler.cc b/chrome/common/extensions/file_browser_handler.cc
deleted file mode 100644
index 1587935..0000000
--- a/chrome/common/extensions/file_browser_handler.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright (c) 2012 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/common/extensions/file_browser_handler.h"
-
-#include "base/logging.h"
-#include "chrome/common/extensions/extension_constants.h"
-#include "extensions/common/url_pattern.h"
-#include "googleurl/src/gurl.h"
-
-namespace {
-
-const char kReadAccessString[] = "read";
-const char kReadWriteAccessString[] = "read-write";
-const char kCreateAccessString[] = "create";
-
-unsigned int kPermissionsNotDefined = 0;
-unsigned int kReadPermission = 1;
-unsigned int kWritePermission = 1 << 1;
-unsigned int kCreatePermission = 1 << 2;
-unsigned int kInvalidPermission = 1 << 3;
-
-unsigned int GetAccessPermissionFlagFromString(const std::string& access_str) {
- if (access_str == kReadAccessString)
- return kReadPermission;
- if (access_str == kReadWriteAccessString)
- return kReadPermission | kWritePermission;
- if (access_str == kCreateAccessString)
- return kCreatePermission;
- return kInvalidPermission;
-}
-
-const char* const kMIMETypeHandlersWhitelist[] = {
- extension_misc::kQuickOfficeExtensionId,
- extension_misc::kQuickOfficeDevExtensionId
-};
-
-} // namespace
-
-// static
-bool FileBrowserHandler::ExtensionWhitelistedForMIMETypes(
- const std::string& extension_id) {
- if (g_test_extension_id_ && extension_id == *g_test_extension_id_)
- return true;
- for (size_t i = 0; i < arraysize(kMIMETypeHandlersWhitelist); ++i) {
- if (extension_id == kMIMETypeHandlersWhitelist[i])
- return true;
- }
- return false;
-}
-
-// static
-std::vector<std::string> FileBrowserHandler::GetMIMETypeWhitelist() {
- std::vector<std::string> whitelist;
- if (g_test_extension_id_)
- whitelist.push_back(*g_test_extension_id_);
- for (size_t i = 0; i < arraysize(kMIMETypeHandlersWhitelist); ++i)
- whitelist.push_back(kMIMETypeHandlersWhitelist[i]);
- return whitelist;
-}
-
-FileBrowserHandler::FileBrowserHandler()
- : file_access_permission_flags_(kPermissionsNotDefined) {
-}
-
-FileBrowserHandler::~FileBrowserHandler() {
-}
-
-void FileBrowserHandler::AddPattern(const URLPattern& pattern) {
- url_set_.AddPattern(pattern);
-}
-
-void FileBrowserHandler::ClearPatterns() {
- url_set_.ClearPatterns();
-}
-
-bool FileBrowserHandler::MatchesURL(const GURL& url) const {
- return url_set_.MatchesURL(url);
-}
-
-void FileBrowserHandler::AddMIMEType(const std::string& mime_type) {
- DCHECK(ExtensionWhitelistedForMIMETypes(extension_id()));
- mime_type_set_.insert(mime_type);
-}
-
-bool FileBrowserHandler::CanHandleMIMEType(const std::string& mime_type) const {
- return mime_type_set_.find(mime_type) != mime_type_set_.end();
-}
-
-bool FileBrowserHandler::AddFileAccessPermission(
- const std::string& access) {
- file_access_permission_flags_ |= GetAccessPermissionFlagFromString(access);
- return (file_access_permission_flags_ & kInvalidPermission) != 0U;
-}
-
-bool FileBrowserHandler::ValidateFileAccessPermissions() {
- bool is_invalid = (file_access_permission_flags_ & kInvalidPermission) != 0U;
- bool can_create = (file_access_permission_flags_ & kCreatePermission) != 0U;
- bool can_read_or_write = (file_access_permission_flags_ &
- (kReadPermission | kWritePermission)) != 0U;
- if (is_invalid || (can_create && can_read_or_write)) {
- file_access_permission_flags_ = kInvalidPermission;
- return false;
- }
-
- if (file_access_permission_flags_ == kPermissionsNotDefined)
- file_access_permission_flags_ = kReadPermission | kWritePermission;
- return true;
-}
-
-bool FileBrowserHandler::CanRead() const {
- DCHECK(!(file_access_permission_flags_ & kInvalidPermission));
- return (file_access_permission_flags_ & kReadPermission) != 0;
-}
-
-bool FileBrowserHandler::CanWrite() const {
- DCHECK(!(file_access_permission_flags_ & kInvalidPermission));
- return (file_access_permission_flags_ & kWritePermission) != 0;
-}
-
-bool FileBrowserHandler::HasCreateAccessPermission() const {
- DCHECK(!(file_access_permission_flags_ & kInvalidPermission));
- return (file_access_permission_flags_ & kCreatePermission) != 0;
-}
-
-std::string* FileBrowserHandler::g_test_extension_id_ = NULL;