Home | History | Annotate | Download | only in file_browser_handlers
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/strings/string_number_conversions.h"
      6 #include "chrome/common/extensions/api/file_browser_handlers/file_browser_handler.h"
      7 #include "chrome/common/extensions/extension_builder.h"
      8 #include "chrome/common/extensions/extension_manifest_constants.h"
      9 #include "chrome/common/extensions/manifest_tests/extension_manifest_test.h"
     10 #include "chrome/common/extensions/value_builder.h"
     11 #include "extensions/common/error_utils.h"
     12 #include "testing/gtest/include/gtest/gtest.h"
     13 
     14 namespace errors = extension_manifest_errors;
     15 
     16 using extensions::DictionaryBuilder;
     17 using extensions::Extension;
     18 using extensions::ExtensionBuilder;
     19 using extensions::ListBuilder;
     20 
     21 namespace {
     22 
     23 class FileBrowserHandlerManifestTest : public ExtensionManifestTest {
     24 };
     25 
     26 TEST_F(FileBrowserHandlerManifestTest, InvalidFileBrowserHandlers) {
     27   Testcase testcases[] = {
     28     Testcase("filebrowser_invalid_access_permission.json",
     29              extensions::ErrorUtils::FormatErrorMessage(
     30                  errors::kInvalidFileAccessValue, base::IntToString(1))),
     31     Testcase("filebrowser_invalid_access_permission_list.json",
     32              errors::kInvalidFileAccessList),
     33     Testcase("filebrowser_invalid_empty_access_permission_list.json",
     34              errors::kInvalidFileAccessList),
     35     Testcase("filebrowser_invalid_actions_1.json",
     36              errors::kInvalidFileBrowserHandler),
     37     Testcase("filebrowser_invalid_actions_2.json",
     38              errors::kInvalidFileBrowserHandler),
     39     Testcase("filebrowser_invalid_action_id.json",
     40              errors::kInvalidPageActionId),
     41     Testcase("filebrowser_invalid_action_title.json",
     42              errors::kInvalidPageActionDefaultTitle),
     43     Testcase("filebrowser_invalid_file_filters_1.json",
     44              errors::kInvalidFileFiltersList),
     45     Testcase("filebrowser_invalid_file_filters_2.json",
     46              extensions::ErrorUtils::FormatErrorMessage(
     47                 errors::kInvalidFileFilterValue, base::IntToString(0))),
     48     Testcase("filebrowser_invalid_file_filters_url.json",
     49              extensions::ErrorUtils::FormatErrorMessage(
     50                 errors::kInvalidURLPatternError, "http:*.html"))
     51   };
     52   RunTestcases(testcases, arraysize(testcases), EXPECT_TYPE_ERROR);
     53 }
     54 
     55 TEST_F(FileBrowserHandlerManifestTest, ValidFileBrowserHandler) {
     56   scoped_refptr<const Extension> extension =
     57       ExtensionBuilder()
     58       .SetManifest(DictionaryBuilder()
     59                    .Set("name", "file browser handler test")
     60                    .Set("version", "1.0.0")
     61                    .Set("manifest_version", 2)
     62                    .Set("file_browser_handlers", ListBuilder()
     63                        .Append(DictionaryBuilder()
     64                            .Set("id", "ExtremelyCoolAction")
     65                            .Set("default_title", "Be Amazed")
     66                            .Set("default_icon", "icon.png")
     67                            .Set("file_filters", ListBuilder()
     68                                .Append("filesystem:*.txt")))))
     69       .Build();
     70 
     71   ASSERT_TRUE(extension.get());
     72   FileBrowserHandler::List* handlers =
     73       FileBrowserHandler::GetHandlers(extension.get());
     74   ASSERT_TRUE(handlers != NULL);
     75   ASSERT_EQ(1U, handlers->size());
     76   const FileBrowserHandler* action = handlers->at(0).get();
     77 
     78   EXPECT_EQ("ExtremelyCoolAction", action->id());
     79   EXPECT_EQ("Be Amazed", action->title());
     80   EXPECT_EQ("icon.png", action->icon_path());
     81   const extensions::URLPatternSet& patterns = action->file_url_patterns();
     82   ASSERT_EQ(1U, patterns.patterns().size());
     83   EXPECT_TRUE(action->MatchesURL(
     84       GURL("filesystem:chrome-extension://foo/local/test.txt")));
     85   EXPECT_FALSE(action->HasCreateAccessPermission());
     86   EXPECT_TRUE(action->CanRead());
     87   EXPECT_TRUE(action->CanWrite());
     88 }
     89 
     90 TEST_F(FileBrowserHandlerManifestTest, ValidFileBrowserHandlerMIMETypes) {
     91   scoped_refptr<const Extension> extension =
     92       ExtensionBuilder()
     93       .SetID(extension_misc::kQuickOfficeExtensionId)
     94       .SetManifest(DictionaryBuilder()
     95                    .Set("name", "file browser handler test")
     96                    .Set("version", "1.0.0")
     97                    .Set("manifest_version", 2)
     98                    .Set("file_browser_handlers", ListBuilder()
     99                        .Append(DictionaryBuilder()
    100                            .Set("id", "ID")
    101                            .Set("default_title", "Default title")
    102                            .Set("default_icon", "icon.png")
    103                            .Set("file_filters", ListBuilder()
    104                                .Append("filesystem:*.txt")))))
    105       .Build();
    106 
    107   ASSERT_TRUE(extension.get());
    108   FileBrowserHandler::List* handlers =
    109       FileBrowserHandler::GetHandlers(extension.get());
    110   ASSERT_TRUE(handlers != NULL);
    111   ASSERT_EQ(1U, handlers->size());
    112   const FileBrowserHandler* action = handlers->at(0).get();
    113 
    114   const extensions::URLPatternSet& patterns = action->file_url_patterns();
    115   ASSERT_EQ(1U, patterns.patterns().size());
    116   EXPECT_TRUE(action->MatchesURL(
    117       GURL("filesystem:chrome-extension://foo/local/test.txt")));
    118 }
    119 
    120 TEST_F(FileBrowserHandlerManifestTest, ValidFileBrowserHandlerWithCreate) {
    121   scoped_refptr<const Extension> extension =
    122       ExtensionBuilder()
    123       .SetManifest(DictionaryBuilder()
    124                    .Set("name", "file browser handler test create")
    125                    .Set("version", "1.0.0")
    126                    .Set("manifest_version", 2)
    127                    .Set("file_browser_handlers", ListBuilder()
    128                        .Append(DictionaryBuilder()
    129                            .Set("id", "ID")
    130                            .Set("default_title", "Default title")
    131                            .Set("default_icon", "icon.png")
    132                            .Set("file_filters", ListBuilder()
    133                                .Append("filesystem:*.txt"))
    134                            .Set("file_access", ListBuilder()
    135                                .Append("create")))))
    136       .Build();
    137 
    138   ASSERT_TRUE(extension.get());
    139   FileBrowserHandler::List* handlers =
    140       FileBrowserHandler::GetHandlers(extension.get());
    141   ASSERT_TRUE(handlers != NULL);
    142   ASSERT_EQ(1U, handlers->size());
    143   const FileBrowserHandler* action = handlers->at(0).get();
    144   const extensions::URLPatternSet& patterns = action->file_url_patterns();
    145 
    146   EXPECT_EQ(0U, patterns.patterns().size());
    147   EXPECT_TRUE(action->HasCreateAccessPermission());
    148   EXPECT_FALSE(action->CanRead());
    149   EXPECT_FALSE(action->CanWrite());
    150 }
    151 
    152 TEST_F(FileBrowserHandlerManifestTest, FileManagerURLOverride) {
    153   scoped_ptr<DictionaryValue> manifest_value =
    154       DictionaryBuilder()
    155           .Set("name", "override_files")
    156           .Set("version", "1.0.0")
    157           .Set("manifest_version", 2)
    158           .Set("chrome_url_overrides", DictionaryBuilder()
    159               .Set("files", "main.html"))
    160       .Build();
    161 
    162   // Non component extensions can't override chrome://files/ URL.
    163   LoadAndExpectError(Manifest(manifest_value.get(), "override_files"),
    164                      errors::kInvalidChromeURLOverrides);
    165 
    166   // A component extension can override chrome://files/ URL.
    167   std::string error;
    168   LoadExtension(Manifest(manifest_value.get(), "override_files"),
    169                 &error, extensions::Manifest::COMPONENT, Extension::NO_FLAGS);
    170 #if defined(FILE_MANAGER_EXTENSION)
    171   EXPECT_EQ("", error);
    172 #else
    173   EXPECT_EQ(std::string(errors::kInvalidChromeURLOverrides), error);
    174 #endif
    175 }
    176 
    177 }  // namespace
    178