Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 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 "chrome/browser/file_associations_win.h" | |
| 6 | |
| 7 #include "base/command_line.h" | |
| 8 #include "base/files/file_path.h" | |
| 9 #include "base/macros.h" | |
| 10 #include "base/strings/utf_string_conversions.h" | |
| 11 #include "base/win/registry.h" | |
| 12 #include "testing/gtest/include/gtest/gtest.h" | |
| 13 | |
| 14 namespace { | |
| 15 | |
| 16 // These will be written directly into the registry, so clearly mark them as | |
| 17 // 'Chrome' and avoid clobbering common extensions. Note: By running this test, | |
|
grt (UTC plus 2)
2014/09/15 13:38:37
personally, i'd go with Chromium here
Matt Giuca
2014/09/16 07:29:13
Just removed the prefix (no longer necessary since
grt (UTC plus 2)
2014/09/16 13:34:56
Acknowledged.
| |
| 18 // these classes and extensions will be deleted from the real registry! | |
| 19 const char kTestProgid[] = "Chrome.TestApp"; | |
| 20 const wchar_t kTestOpenCommand[] = L"C:\\test.exe"; | |
| 21 const char kTestFileTypeName[] = "Chrome Test File Type"; | |
| 22 const wchar_t kTestIconPath[] = L"D:\\test.ico"; | |
| 23 const char* kTestFileExtensions[] = { | |
| 24 "chrometest1", "chrometest2", | |
| 25 }; | |
| 26 | |
| 27 // TODO(mgiuca): Use RegistryOverrideManager instead of writing directly to the | |
| 28 // real registry. DO NOT SUBMIT. | |
| 29 class FileAssociationsTest : public testing::Test { | |
| 30 public: | |
| 31 FileAssociationsTest() {} | |
| 32 | |
| 33 virtual void SetUp() OVERRIDE { | |
| 34 // .chrometest2 files already have a default application. | |
| 35 base::win::RegKey key; | |
| 36 ASSERT_EQ(ERROR_SUCCESS, | |
| 37 key.Create(HKEY_CURRENT_USER, | |
| 38 L"Software\\Classes\\.chrometest2", | |
| 39 KEY_ALL_ACCESS)); | |
| 40 EXPECT_EQ(ERROR_SUCCESS, key.WriteValue(L"", L"SomeOtherApp")); | |
| 41 } | |
| 42 | |
| 43 virtual void TearDown() OVERRIDE { | |
| 44 // Clean up all keys that might have been created by this test. | |
| 45 base::win::RegKey classes_key; | |
| 46 ASSERT_EQ(ERROR_SUCCESS, | |
| 47 classes_key.Open( | |
| 48 HKEY_CURRENT_USER, L"Software\\Classes", KEY_ALL_ACCESS)); | |
| 49 | |
| 50 // Delete the class key in the registry. | |
| 51 classes_key.DeleteKey(base::ASCIIToUTF16(kTestProgid).c_str()); | |
| 52 | |
| 53 // Delete the extension keys for our test extensions. | |
| 54 for (size_t i = 0; i < arraysize(kTestFileExtensions); ++i) { | |
| 55 base::string16 ext(L"." + base::ASCIIToUTF16(kTestFileExtensions[i])); | |
| 56 classes_key.DeleteKey(ext.c_str()); | |
| 57 } | |
| 58 } | |
| 59 | |
| 60 protected: | |
| 61 static base::CommandLine OpenCommand() { | |
| 62 base::FilePath open_command_path(kTestOpenCommand); | |
| 63 return base::CommandLine(open_command_path); | |
| 64 } | |
| 65 | |
| 66 static std::set<std::string> FileExtensions() { | |
| 67 std::set<std::string> file_extensions; | |
| 68 for (size_t i = 0; i < arraysize(kTestFileExtensions); ++i) | |
| 69 file_extensions.insert(kTestFileExtensions[i]); | |
| 70 return file_extensions; | |
| 71 } | |
| 72 | |
| 73 private: | |
| 74 DISALLOW_COPY_AND_ASSIGN(FileAssociationsTest); | |
| 75 }; | |
| 76 | |
| 77 TEST_F(FileAssociationsTest, AddWindowsFileAssociations) { | |
| 78 // Create file associations. | |
| 79 EXPECT_TRUE(AddWindowsFileAssociations(kTestProgid, | |
| 80 OpenCommand(), | |
| 81 kTestFileTypeName, | |
| 82 base::FilePath(kTestIconPath), | |
| 83 FileExtensions())); | |
| 84 | |
| 85 // Ensure that the registry keys have been correctly set. We'll read from | |
| 86 // HKEY_CLASSES_ROOT (not HKEY_CURRENT_USER) to ensure that when we write to | |
| 87 // HKEY_CURRENT_USER\Software\Classes, it is correctly being mirrored to | |
| 88 // HKEY_CLASSES_ROOT. | |
| 89 base::win::RegKey key; | |
| 90 std::wstring value; | |
| 91 ASSERT_EQ(ERROR_SUCCESS, | |
| 92 key.Open(HKEY_CLASSES_ROOT, L"Chrome.TestApp", KEY_READ)); | |
| 93 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(L"", &value)); | |
| 94 EXPECT_EQ(L"Chrome Test File Type", value); | |
| 95 ASSERT_EQ( | |
| 96 ERROR_SUCCESS, | |
| 97 key.Open(HKEY_CLASSES_ROOT, L"Chrome.TestApp\\DefaultIcon", KEY_READ)); | |
| 98 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(L"", &value)); | |
| 99 EXPECT_EQ(L"D:\\test.ico,0", value); | |
| 100 ASSERT_EQ(ERROR_SUCCESS, | |
| 101 key.Open(HKEY_CLASSES_ROOT, | |
| 102 L"Chrome.TestApp\\shell\\open\\command", | |
| 103 KEY_READ)); | |
| 104 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(L"", &value)); | |
| 105 EXPECT_EQ(L"\"C:\\test.exe\"", value); | |
| 106 | |
| 107 // .chrometest1 should be default-associated with our test app. | |
| 108 ASSERT_EQ(ERROR_SUCCESS, | |
| 109 key.Open(HKEY_CLASSES_ROOT, L".chrometest1", KEY_READ)); | |
| 110 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(L"", &value)); | |
| 111 EXPECT_EQ(L"Chrome.TestApp", value); | |
| 112 ASSERT_EQ( | |
| 113 ERROR_SUCCESS, | |
| 114 key.Open(HKEY_CLASSES_ROOT, L".chrometest1\\OpenWithProgids", KEY_READ)); | |
| 115 EXPECT_TRUE(key.HasValue(L"Chrome.TestApp")); | |
| 116 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(L"Chrome.TestApp", &value)); | |
| 117 EXPECT_EQ(L"", value); | |
| 118 | |
| 119 // .chrometest2 should still be associated with the other app (should not have | |
| 120 // been overridden). But it should have our app in its Open With list. | |
| 121 ASSERT_EQ(ERROR_SUCCESS, | |
| 122 key.Open(HKEY_CLASSES_ROOT, L".chrometest2", KEY_READ)); | |
| 123 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(L"", &value)); | |
| 124 EXPECT_EQ(L"SomeOtherApp", value); | |
| 125 ASSERT_EQ( | |
| 126 ERROR_SUCCESS, | |
| 127 key.Open(HKEY_CLASSES_ROOT, L".chrometest2\\OpenWithProgids", KEY_READ)); | |
| 128 EXPECT_TRUE(key.HasValue(L"Chrome.TestApp")); | |
| 129 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(L"Chrome.TestApp", &value)); | |
| 130 EXPECT_EQ(L"", value); | |
| 131 } | |
| 132 | |
| 133 TEST_F(FileAssociationsTest, DeleteWindowsFileAssociations) { | |
| 134 // Create file associations. | |
| 135 EXPECT_TRUE(AddWindowsFileAssociations(kTestProgid, | |
| 136 OpenCommand(), | |
| 137 kTestFileTypeName, | |
| 138 base::FilePath(kTestIconPath), | |
| 139 FileExtensions())); | |
| 140 | |
| 141 // Delete them again. | |
| 142 EXPECT_TRUE(DeleteWindowsFileAssociations(kTestProgid)); | |
| 143 | |
| 144 // The class key should have been completely deleted. | |
| 145 base::win::RegKey key; | |
| 146 std::wstring value; | |
| 147 ASSERT_NE(ERROR_SUCCESS, | |
| 148 key.Open(HKEY_CLASSES_ROOT, L"Chrome.TestApp", KEY_READ)); | |
| 149 | |
| 150 // We don't need to delete the associations with the particular extensions | |
| 151 // (Windows will ignore those). However, we must ensure that .chrometest2 is | |
| 152 // still associated with the other app. | |
| 153 ASSERT_EQ(ERROR_SUCCESS, | |
| 154 key.Open(HKEY_CLASSES_ROOT, L".chrometest2", KEY_READ)); | |
| 155 EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(L"", &value)); | |
| 156 EXPECT_EQ(L"SomeOtherApp", value); | |
| 157 } | |
| 158 | |
| 159 } // namespace | |
| OLD | NEW |