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