| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/extension_service.h" | 5 #include "chrome/browser/extensions/extension_service.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 1839 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1850 InitializeEmptyExtensionService(); | 1850 InitializeEmptyExtensionService(); |
| 1851 base::FilePath input_directory = | 1851 base::FilePath input_directory = |
| 1852 data_dir() | 1852 data_dir() |
| 1853 .AppendASCII("good") | 1853 .AppendASCII("good") |
| 1854 .AppendASCII("Extensions") | 1854 .AppendASCII("Extensions") |
| 1855 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") | 1855 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") |
| 1856 .AppendASCII("1.0.0.0"); | 1856 .AppendASCII("1.0.0.0"); |
| 1857 | 1857 |
| 1858 base::ScopedTempDir temp_dir; | 1858 base::ScopedTempDir temp_dir; |
| 1859 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 1859 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 1860 base::FilePath output_directory = temp_dir.path(); | 1860 base::FilePath output_directory = temp_dir.GetPath(); |
| 1861 | 1861 |
| 1862 base::FilePath crx_path(output_directory.AppendASCII("ex1.crx")); | 1862 base::FilePath crx_path(output_directory.AppendASCII("ex1.crx")); |
| 1863 base::FilePath privkey_path(output_directory.AppendASCII("privkey.pem")); | 1863 base::FilePath privkey_path(output_directory.AppendASCII("privkey.pem")); |
| 1864 | 1864 |
| 1865 std::unique_ptr<ExtensionCreator> creator(new ExtensionCreator()); | 1865 std::unique_ptr<ExtensionCreator> creator(new ExtensionCreator()); |
| 1866 ASSERT_TRUE(creator->Run(input_directory, crx_path, base::FilePath(), | 1866 ASSERT_TRUE(creator->Run(input_directory, crx_path, base::FilePath(), |
| 1867 privkey_path, ExtensionCreator::kNoRunFlags)); | 1867 privkey_path, ExtensionCreator::kNoRunFlags)); |
| 1868 ASSERT_TRUE(base::PathExists(crx_path)); | 1868 ASSERT_TRUE(base::PathExists(crx_path)); |
| 1869 ASSERT_TRUE(base::PathExists(privkey_path)); | 1869 ASSERT_TRUE(base::PathExists(privkey_path)); |
| 1870 | 1870 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1890 creator.reset(new ExtensionCreator()); | 1890 creator.reset(new ExtensionCreator()); |
| 1891 ASSERT_FALSE( | 1891 ASSERT_FALSE( |
| 1892 creator->Run(base::FilePath(), base::FilePath(), base::FilePath(), | 1892 creator->Run(base::FilePath(), base::FilePath(), base::FilePath(), |
| 1893 base::FilePath(), ExtensionCreator::kOverwriteCRX)); | 1893 base::FilePath(), ExtensionCreator::kOverwriteCRX)); |
| 1894 | 1894 |
| 1895 // Try packing an empty directory. Should fail because an empty directory is | 1895 // Try packing an empty directory. Should fail because an empty directory is |
| 1896 // not a valid extension. | 1896 // not a valid extension. |
| 1897 base::ScopedTempDir temp_dir2; | 1897 base::ScopedTempDir temp_dir2; |
| 1898 ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); | 1898 ASSERT_TRUE(temp_dir2.CreateUniqueTempDir()); |
| 1899 creator.reset(new ExtensionCreator()); | 1899 creator.reset(new ExtensionCreator()); |
| 1900 ASSERT_FALSE(creator->Run(temp_dir2.path(), crx_path, privkey_path, | 1900 ASSERT_FALSE(creator->Run(temp_dir2.GetPath(), crx_path, privkey_path, |
| 1901 base::FilePath(), ExtensionCreator::kOverwriteCRX)); | 1901 base::FilePath(), ExtensionCreator::kOverwriteCRX)); |
| 1902 | 1902 |
| 1903 // Try packing with an invalid manifest. | 1903 // Try packing with an invalid manifest. |
| 1904 std::string invalid_manifest_content = "I am not a manifest."; | 1904 std::string invalid_manifest_content = "I am not a manifest."; |
| 1905 ASSERT_TRUE(base::WriteFile( | 1905 ASSERT_TRUE(base::WriteFile( |
| 1906 temp_dir2.path().Append(extensions::kManifestFilename), | 1906 temp_dir2.GetPath().Append(extensions::kManifestFilename), |
| 1907 invalid_manifest_content.c_str(), invalid_manifest_content.size())); | 1907 invalid_manifest_content.c_str(), invalid_manifest_content.size())); |
| 1908 creator.reset(new ExtensionCreator()); | 1908 creator.reset(new ExtensionCreator()); |
| 1909 ASSERT_FALSE(creator->Run(temp_dir2.path(), crx_path, privkey_path, | 1909 ASSERT_FALSE(creator->Run(temp_dir2.GetPath(), crx_path, privkey_path, |
| 1910 base::FilePath(), ExtensionCreator::kOverwriteCRX)); | 1910 base::FilePath(), ExtensionCreator::kOverwriteCRX)); |
| 1911 | 1911 |
| 1912 // Try packing with a private key that is a valid key, but invalid for the | 1912 // Try packing with a private key that is a valid key, but invalid for the |
| 1913 // extension. | 1913 // extension. |
| 1914 base::FilePath bad_private_key_dir = | 1914 base::FilePath bad_private_key_dir = |
| 1915 data_dir().AppendASCII("bad_private_key"); | 1915 data_dir().AppendASCII("bad_private_key"); |
| 1916 crx_path = output_directory.AppendASCII("bad_private_key.crx"); | 1916 crx_path = output_directory.AppendASCII("bad_private_key.crx"); |
| 1917 privkey_path = data_dir().AppendASCII("bad_private_key.pem"); | 1917 privkey_path = data_dir().AppendASCII("bad_private_key.pem"); |
| 1918 ASSERT_FALSE(creator->Run(bad_private_key_dir, crx_path, base::FilePath(), | 1918 ASSERT_FALSE(creator->Run(bad_private_key_dir, crx_path, base::FilePath(), |
| 1919 privkey_path, ExtensionCreator::kOverwriteCRX)); | 1919 privkey_path, ExtensionCreator::kOverwriteCRX)); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1947 }; | 1947 }; |
| 1948 const base::FilePath expected_private_key_names[] = { | 1948 const base::FilePath expected_private_key_names[] = { |
| 1949 base::FilePath(FILE_PATH_LITERAL("this.extensions.name.has.periods.pem")), | 1949 base::FilePath(FILE_PATH_LITERAL("this.extensions.name.has.periods.pem")), |
| 1950 base::FilePath( | 1950 base::FilePath( |
| 1951 FILE_PATH_LITERAL(".thisextensionsnamestartswithaperiod.pem")), | 1951 FILE_PATH_LITERAL(".thisextensionsnamestartswithaperiod.pem")), |
| 1952 base::FilePath(FILE_PATH_LITERAL("thisextensionhasaslashinitsname.pem")), | 1952 base::FilePath(FILE_PATH_LITERAL("thisextensionhasaslashinitsname.pem")), |
| 1953 }; | 1953 }; |
| 1954 | 1954 |
| 1955 for (size_t i = 0; i < arraysize(punctuated_names); ++i) { | 1955 for (size_t i = 0; i < arraysize(punctuated_names); ++i) { |
| 1956 SCOPED_TRACE(punctuated_names[i].value().c_str()); | 1956 SCOPED_TRACE(punctuated_names[i].value().c_str()); |
| 1957 base::FilePath output_dir = temp_dir.path().Append(punctuated_names[i]); | 1957 base::FilePath output_dir = temp_dir.GetPath().Append(punctuated_names[i]); |
| 1958 | 1958 |
| 1959 // Copy the extension into the output directory, as PackExtensionJob doesn't | 1959 // Copy the extension into the output directory, as PackExtensionJob doesn't |
| 1960 // let us choose where to output the packed extension. | 1960 // let us choose where to output the packed extension. |
| 1961 ASSERT_TRUE(base::CopyDirectory(input_directory, output_dir, true)); | 1961 ASSERT_TRUE(base::CopyDirectory(input_directory, output_dir, true)); |
| 1962 | 1962 |
| 1963 base::FilePath expected_crx_path = | 1963 base::FilePath expected_crx_path = |
| 1964 temp_dir.path().Append(expected_crx_names[i]); | 1964 temp_dir.GetPath().Append(expected_crx_names[i]); |
| 1965 base::FilePath expected_private_key_path = | 1965 base::FilePath expected_private_key_path = |
| 1966 temp_dir.path().Append(expected_private_key_names[i]); | 1966 temp_dir.GetPath().Append(expected_private_key_names[i]); |
| 1967 PackExtensionTestClient pack_client(expected_crx_path, | 1967 PackExtensionTestClient pack_client(expected_crx_path, |
| 1968 expected_private_key_path); | 1968 expected_private_key_path); |
| 1969 scoped_refptr<extensions::PackExtensionJob> packer( | 1969 scoped_refptr<extensions::PackExtensionJob> packer( |
| 1970 new extensions::PackExtensionJob(&pack_client, output_dir, | 1970 new extensions::PackExtensionJob(&pack_client, output_dir, |
| 1971 base::FilePath(), | 1971 base::FilePath(), |
| 1972 ExtensionCreator::kOverwriteCRX)); | 1972 ExtensionCreator::kOverwriteCRX)); |
| 1973 packer->Start(); | 1973 packer->Start(); |
| 1974 | 1974 |
| 1975 // The packer will post a notification task to the current thread's message | 1975 // The packer will post a notification task to the current thread's message |
| 1976 // loop when it is finished. We manually run the loop here so that we | 1976 // loop when it is finished. We manually run the loop here so that we |
| 1977 // block and catch the notification; otherwise, the process would exit. | 1977 // block and catch the notification; otherwise, the process would exit. |
| 1978 // This call to |Run()| is matched by a call to |Quit()| in the | 1978 // This call to |Run()| is matched by a call to |Quit()| in the |
| 1979 // |PackExtensionTestClient|'s notification handling code. | 1979 // |PackExtensionTestClient|'s notification handling code. |
| 1980 base::RunLoop().Run(); | 1980 base::RunLoop().Run(); |
| 1981 | 1981 |
| 1982 if (HasFatalFailure()) | 1982 if (HasFatalFailure()) |
| 1983 return; | 1983 return; |
| 1984 | 1984 |
| 1985 InstallCRX(expected_crx_path, INSTALL_NEW); | 1985 InstallCRX(expected_crx_path, INSTALL_NEW); |
| 1986 } | 1986 } |
| 1987 } | 1987 } |
| 1988 | 1988 |
| 1989 TEST_F(ExtensionServiceTest, PackExtensionContainingKeyFails) { | 1989 TEST_F(ExtensionServiceTest, PackExtensionContainingKeyFails) { |
| 1990 InitializeEmptyExtensionService(); | 1990 InitializeEmptyExtensionService(); |
| 1991 | 1991 |
| 1992 base::ScopedTempDir extension_temp_dir; | 1992 base::ScopedTempDir extension_temp_dir; |
| 1993 ASSERT_TRUE(extension_temp_dir.CreateUniqueTempDir()); | 1993 ASSERT_TRUE(extension_temp_dir.CreateUniqueTempDir()); |
| 1994 base::FilePath input_directory = extension_temp_dir.path().AppendASCII("ext"); | 1994 base::FilePath input_directory = |
| 1995 extension_temp_dir.GetPath().AppendASCII("ext"); |
| 1995 ASSERT_TRUE( | 1996 ASSERT_TRUE( |
| 1996 base::CopyDirectory(data_dir() | 1997 base::CopyDirectory(data_dir() |
| 1997 .AppendASCII("good") | 1998 .AppendASCII("good") |
| 1998 .AppendASCII("Extensions") | 1999 .AppendASCII("Extensions") |
| 1999 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") | 2000 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") |
| 2000 .AppendASCII("1.0.0.0"), | 2001 .AppendASCII("1.0.0.0"), |
| 2001 input_directory, | 2002 input_directory, |
| 2002 /*recursive=*/true)); | 2003 /*recursive=*/true)); |
| 2003 | 2004 |
| 2004 base::ScopedTempDir output_temp_dir; | 2005 base::ScopedTempDir output_temp_dir; |
| 2005 ASSERT_TRUE(output_temp_dir.CreateUniqueTempDir()); | 2006 ASSERT_TRUE(output_temp_dir.CreateUniqueTempDir()); |
| 2006 base::FilePath output_directory = output_temp_dir.path(); | 2007 base::FilePath output_directory = output_temp_dir.GetPath(); |
| 2007 | 2008 |
| 2008 base::FilePath crx_path(output_directory.AppendASCII("ex1.crx")); | 2009 base::FilePath crx_path(output_directory.AppendASCII("ex1.crx")); |
| 2009 base::FilePath privkey_path(output_directory.AppendASCII("privkey.pem")); | 2010 base::FilePath privkey_path(output_directory.AppendASCII("privkey.pem")); |
| 2010 | 2011 |
| 2011 // Pack the extension once to get a private key. | 2012 // Pack the extension once to get a private key. |
| 2012 std::unique_ptr<ExtensionCreator> creator(new ExtensionCreator()); | 2013 std::unique_ptr<ExtensionCreator> creator(new ExtensionCreator()); |
| 2013 ASSERT_TRUE(creator->Run(input_directory, crx_path, base::FilePath(), | 2014 ASSERT_TRUE(creator->Run(input_directory, crx_path, base::FilePath(), |
| 2014 privkey_path, ExtensionCreator::kNoRunFlags)) | 2015 privkey_path, ExtensionCreator::kNoRunFlags)) |
| 2015 << creator->error_message(); | 2016 << creator->error_message(); |
| 2016 ASSERT_TRUE(base::PathExists(crx_path)); | 2017 ASSERT_TRUE(base::PathExists(crx_path)); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2042 .AppendASCII("good") | 2043 .AppendASCII("good") |
| 2043 .AppendASCII("Extensions") | 2044 .AppendASCII("Extensions") |
| 2044 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") | 2045 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") |
| 2045 .AppendASCII("1.0.0.0"); | 2046 .AppendASCII("1.0.0.0"); |
| 2046 base::FilePath privkey_path( | 2047 base::FilePath privkey_path( |
| 2047 data_dir().AppendASCII("openssl_privkey_asn1.pem")); | 2048 data_dir().AppendASCII("openssl_privkey_asn1.pem")); |
| 2048 ASSERT_TRUE(base::PathExists(privkey_path)); | 2049 ASSERT_TRUE(base::PathExists(privkey_path)); |
| 2049 | 2050 |
| 2050 base::ScopedTempDir temp_dir; | 2051 base::ScopedTempDir temp_dir; |
| 2051 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 2052 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 2052 base::FilePath output_directory = temp_dir.path(); | 2053 base::FilePath output_directory = temp_dir.GetPath(); |
| 2053 | 2054 |
| 2054 base::FilePath crx_path(output_directory.AppendASCII("ex1.crx")); | 2055 base::FilePath crx_path(output_directory.AppendASCII("ex1.crx")); |
| 2055 | 2056 |
| 2056 std::unique_ptr<ExtensionCreator> creator(new ExtensionCreator()); | 2057 std::unique_ptr<ExtensionCreator> creator(new ExtensionCreator()); |
| 2057 ASSERT_TRUE(creator->Run(input_directory, crx_path, privkey_path, | 2058 ASSERT_TRUE(creator->Run(input_directory, crx_path, privkey_path, |
| 2058 base::FilePath(), ExtensionCreator::kOverwriteCRX)); | 2059 base::FilePath(), ExtensionCreator::kOverwriteCRX)); |
| 2059 | 2060 |
| 2060 InstallCRX(crx_path, INSTALL_NEW); | 2061 InstallCRX(crx_path, INSTALL_NEW); |
| 2061 } | 2062 } |
| 2062 | 2063 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2142 | 2143 |
| 2143 // Paths to test data files. | 2144 // Paths to test data files. |
| 2144 base::FilePath source_manifest = source_data_dir.AppendASCII("manifest.json"); | 2145 base::FilePath source_manifest = source_data_dir.AppendASCII("manifest.json"); |
| 2145 ASSERT_TRUE(base::PathExists(source_manifest)); | 2146 ASSERT_TRUE(base::PathExists(source_manifest)); |
| 2146 base::FilePath source_icon = source_data_dir.AppendASCII("icon.png"); | 2147 base::FilePath source_icon = source_data_dir.AppendASCII("icon.png"); |
| 2147 ASSERT_TRUE(base::PathExists(source_icon)); | 2148 ASSERT_TRUE(base::PathExists(source_icon)); |
| 2148 | 2149 |
| 2149 // Set up the temporary extension directory. | 2150 // Set up the temporary extension directory. |
| 2150 base::ScopedTempDir temp; | 2151 base::ScopedTempDir temp; |
| 2151 ASSERT_TRUE(temp.CreateUniqueTempDir()); | 2152 ASSERT_TRUE(temp.CreateUniqueTempDir()); |
| 2152 base::FilePath extension_path = temp.path(); | 2153 base::FilePath extension_path = temp.GetPath(); |
| 2153 base::FilePath manifest = extension_path.Append( | 2154 base::FilePath manifest = extension_path.Append( |
| 2154 extensions::kManifestFilename); | 2155 extensions::kManifestFilename); |
| 2155 base::FilePath icon_symlink = extension_path.AppendASCII("icon.png"); | 2156 base::FilePath icon_symlink = extension_path.AppendASCII("icon.png"); |
| 2156 base::CopyFile(source_manifest, manifest); | 2157 base::CopyFile(source_manifest, manifest); |
| 2157 base::CreateSymbolicLink(source_icon, icon_symlink); | 2158 base::CreateSymbolicLink(source_icon, icon_symlink); |
| 2158 | 2159 |
| 2159 // Load extension. | 2160 // Load extension. |
| 2160 InitializeEmptyExtensionService(); | 2161 InitializeEmptyExtensionService(); |
| 2161 extensions::UnpackedInstaller::Create(service())->Load(extension_path); | 2162 extensions::UnpackedInstaller::Create(service())->Load(extension_path); |
| 2162 base::RunLoop().RunUntilIdle(); | 2163 base::RunLoop().RunUntilIdle(); |
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2594 | 2595 |
| 2595 // Makes sure that LOAD extension types can downgrade. | 2596 // Makes sure that LOAD extension types can downgrade. |
| 2596 TEST_F(ExtensionServiceTest, LoadExtensionsCanDowngrade) { | 2597 TEST_F(ExtensionServiceTest, LoadExtensionsCanDowngrade) { |
| 2597 InitializeEmptyExtensionService(); | 2598 InitializeEmptyExtensionService(); |
| 2598 | 2599 |
| 2599 base::ScopedTempDir temp; | 2600 base::ScopedTempDir temp; |
| 2600 ASSERT_TRUE(temp.CreateUniqueTempDir()); | 2601 ASSERT_TRUE(temp.CreateUniqueTempDir()); |
| 2601 | 2602 |
| 2602 // We'll write the extension manifest dynamically to a temporary path | 2603 // We'll write the extension manifest dynamically to a temporary path |
| 2603 // to make it easier to change the version number. | 2604 // to make it easier to change the version number. |
| 2604 base::FilePath extension_path = temp.path(); | 2605 base::FilePath extension_path = temp.GetPath(); |
| 2605 base::FilePath manifest_path = | 2606 base::FilePath manifest_path = |
| 2606 extension_path.Append(extensions::kManifestFilename); | 2607 extension_path.Append(extensions::kManifestFilename); |
| 2607 ASSERT_FALSE(base::PathExists(manifest_path)); | 2608 ASSERT_FALSE(base::PathExists(manifest_path)); |
| 2608 | 2609 |
| 2609 // Start with version 2.0. | 2610 // Start with version 2.0. |
| 2610 base::DictionaryValue manifest; | 2611 base::DictionaryValue manifest; |
| 2611 manifest.SetString("version", "2.0"); | 2612 manifest.SetString("version", "2.0"); |
| 2612 manifest.SetString("name", "LOAD Downgrade Test"); | 2613 manifest.SetString("name", "LOAD Downgrade Test"); |
| 2613 manifest.SetInteger("manifest_version", 2); | 2614 manifest.SetInteger("manifest_version", 2); |
| 2614 | 2615 |
| (...skipping 1358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3973 // Tests that extension supposed to be force installed but with conflicting | 3974 // Tests that extension supposed to be force installed but with conflicting |
| 3974 // required permissions cannot be installed. | 3975 // required permissions cannot be installed. |
| 3975 TEST_F(ExtensionServiceTest, PolicyBlockedPermissionConflictsWithForceInstall) { | 3976 TEST_F(ExtensionServiceTest, PolicyBlockedPermissionConflictsWithForceInstall) { |
| 3976 InitializeEmptyExtensionServiceWithTestingPrefs(); | 3977 InitializeEmptyExtensionServiceWithTestingPrefs(); |
| 3977 | 3978 |
| 3978 // Pack the crx file. | 3979 // Pack the crx file. |
| 3979 base::FilePath path = data_dir().AppendASCII("permissions_blocklist"); | 3980 base::FilePath path = data_dir().AppendASCII("permissions_blocklist"); |
| 3980 base::FilePath pem_path = data_dir().AppendASCII("permissions_blocklist.pem"); | 3981 base::FilePath pem_path = data_dir().AppendASCII("permissions_blocklist.pem"); |
| 3981 base::ScopedTempDir temp_dir; | 3982 base::ScopedTempDir temp_dir; |
| 3982 EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); | 3983 EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 3983 base::FilePath crx_path = temp_dir.path().AppendASCII("temp.crx"); | 3984 base::FilePath crx_path = temp_dir.GetPath().AppendASCII("temp.crx"); |
| 3984 | 3985 |
| 3985 PackCRX(path, pem_path, crx_path); | 3986 PackCRX(path, pem_path, crx_path); |
| 3986 | 3987 |
| 3987 { | 3988 { |
| 3988 // Block one of the required permissions. | 3989 // Block one of the required permissions. |
| 3989 ManagementPrefUpdater pref(profile_->GetTestingPrefService()); | 3990 ManagementPrefUpdater pref(profile_->GetTestingPrefService()); |
| 3990 pref.AddBlockedPermission("*", "tabs"); | 3991 pref.AddBlockedPermission("*", "tabs"); |
| 3991 } | 3992 } |
| 3992 | 3993 |
| 3993 // Use MockExtensionProvider to simulate force installing extension. | 3994 // Use MockExtensionProvider to simulate force installing extension. |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4073 TEST_F(ExtensionServiceTest, PolicyBlockedPermissionPolicyUpdate) { | 4074 TEST_F(ExtensionServiceTest, PolicyBlockedPermissionPolicyUpdate) { |
| 4074 InitializeEmptyExtensionServiceWithTestingPrefs(); | 4075 InitializeEmptyExtensionServiceWithTestingPrefs(); |
| 4075 | 4076 |
| 4076 base::FilePath path = data_dir().AppendASCII("permissions_blocklist"); | 4077 base::FilePath path = data_dir().AppendASCII("permissions_blocklist"); |
| 4077 base::FilePath path2 = data_dir().AppendASCII("permissions_blocklist2"); | 4078 base::FilePath path2 = data_dir().AppendASCII("permissions_blocklist2"); |
| 4078 base::FilePath pem_path = data_dir().AppendASCII("permissions_blocklist.pem"); | 4079 base::FilePath pem_path = data_dir().AppendASCII("permissions_blocklist.pem"); |
| 4079 | 4080 |
| 4080 // Pack the crx file. | 4081 // Pack the crx file. |
| 4081 base::ScopedTempDir temp_dir; | 4082 base::ScopedTempDir temp_dir; |
| 4082 EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); | 4083 EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 4083 base::FilePath crx_path = temp_dir.path().AppendASCII("temp.crx"); | 4084 base::FilePath crx_path = temp_dir.GetPath().AppendASCII("temp.crx"); |
| 4084 | 4085 |
| 4085 PackCRX(path2, pem_path, crx_path); | 4086 PackCRX(path2, pem_path, crx_path); |
| 4086 | 4087 |
| 4087 // Install two arbitary extensions with specified manifest. | 4088 // Install two arbitary extensions with specified manifest. |
| 4088 std::string ext1 = PackAndInstallCRX(path, INSTALL_NEW)->id(); | 4089 std::string ext1 = PackAndInstallCRX(path, INSTALL_NEW)->id(); |
| 4089 std::string ext2 = PackAndInstallCRX(path2, INSTALL_NEW)->id(); | 4090 std::string ext2 = PackAndInstallCRX(path2, INSTALL_NEW)->id(); |
| 4090 ASSERT_NE(ext1, permissions_blocklist); | 4091 ASSERT_NE(ext1, permissions_blocklist); |
| 4091 ASSERT_NE(ext2, permissions_blocklist); | 4092 ASSERT_NE(ext2, permissions_blocklist); |
| 4092 ASSERT_NE(ext1, ext2); | 4093 ASSERT_NE(ext1, ext2); |
| 4093 | 4094 |
| (...skipping 2340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6434 // post-first run. | 6435 // post-first run. |
| 6435 ExtensionServiceInitParams params = CreateDefaultInitParams(); | 6436 ExtensionServiceInitParams params = CreateDefaultInitParams(); |
| 6436 params.is_first_run = false; | 6437 params.is_first_run = false; |
| 6437 InitializeExtensionService(params); | 6438 InitializeExtensionService(params); |
| 6438 | 6439 |
| 6439 MockExtensionProvider* provider = | 6440 MockExtensionProvider* provider = |
| 6440 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); | 6441 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); |
| 6441 AddMockExternalProvider(provider); | 6442 AddMockExternalProvider(provider); |
| 6442 | 6443 |
| 6443 std::vector<BubbleErrorsTestData> data; | 6444 std::vector<BubbleErrorsTestData> data; |
| 6444 data.push_back( | 6445 data.push_back(BubbleErrorsTestData( |
| 6445 BubbleErrorsTestData(updates_from_webstore, "1", | 6446 updates_from_webstore, "1", |
| 6446 temp_dir().path().AppendASCII("webstore.crx"), 1u)); | 6447 temp_dir().GetPath().AppendASCII("webstore.crx"), 1u)); |
| 6447 data.push_back( | 6448 data.push_back(BubbleErrorsTestData( |
| 6448 BubbleErrorsTestData(updates_from_webstore2, "1", | 6449 updates_from_webstore2, "1", |
| 6449 temp_dir().path().AppendASCII("webstore2.crx"), 2u)); | 6450 temp_dir().GetPath().AppendASCII("webstore2.crx"), 2u)); |
| 6450 data.push_back(BubbleErrorsTestData(good_crx, "1.0.0.0", | 6451 data.push_back(BubbleErrorsTestData(good_crx, "1.0.0.0", |
| 6451 data_dir().AppendASCII("good.crx"), 2u)); | 6452 data_dir().AppendASCII("good.crx"), 2u)); |
| 6452 | 6453 |
| 6453 PackCRX(data_dir().AppendASCII("update_from_webstore"), | 6454 PackCRX(data_dir().AppendASCII("update_from_webstore"), |
| 6454 data_dir().AppendASCII("update_from_webstore.pem"), data[0].crx_path); | 6455 data_dir().AppendASCII("update_from_webstore.pem"), data[0].crx_path); |
| 6455 PackCRX(data_dir().AppendASCII("update_from_webstore2"), | 6456 PackCRX(data_dir().AppendASCII("update_from_webstore2"), |
| 6456 data_dir().AppendASCII("update_from_webstore2.pem"), | 6457 data_dir().AppendASCII("update_from_webstore2.pem"), |
| 6457 data[1].crx_path); | 6458 data[1].crx_path); |
| 6458 | 6459 |
| 6459 // Install extensions from |data| one by one and expect each of them to result | 6460 // Install extensions from |data| one by one and expect each of them to result |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6503 ->external_install_manager() | 6504 ->external_install_manager() |
| 6504 ->has_currently_visible_install_alert()); | 6505 ->has_currently_visible_install_alert()); |
| 6505 EXPECT_EQ(0u, GetExternalInstallBubbleCount(service())); | 6506 EXPECT_EQ(0u, GetExternalInstallBubbleCount(service())); |
| 6506 EXPECT_FALSE(HasExternalInstallErrors(service())); | 6507 EXPECT_FALSE(HasExternalInstallErrors(service())); |
| 6507 | 6508 |
| 6508 // Add a new webstore install. Verify that this shows an error bubble since | 6509 // Add a new webstore install. Verify that this shows an error bubble since |
| 6509 // there are no error bubbles pending at this point. Also verify that the | 6510 // there are no error bubbles pending at this point. Also verify that the |
| 6510 // error bubble is for this newly added extension. | 6511 // error bubble is for this newly added extension. |
| 6511 { | 6512 { |
| 6512 base::FilePath webstore_crx_three = | 6513 base::FilePath webstore_crx_three = |
| 6513 temp_dir().path().AppendASCII("webstore3.crx"); | 6514 temp_dir().GetPath().AppendASCII("webstore3.crx"); |
| 6514 PackCRX(data_dir().AppendASCII("update_from_webstore3"), | 6515 PackCRX(data_dir().AppendASCII("update_from_webstore3"), |
| 6515 data_dir().AppendASCII("update_from_webstore3.pem"), | 6516 data_dir().AppendASCII("update_from_webstore3.pem"), |
| 6516 webstore_crx_three); | 6517 webstore_crx_three); |
| 6517 | 6518 |
| 6518 content::WindowedNotificationObserver global_error_observer( | 6519 content::WindowedNotificationObserver global_error_observer( |
| 6519 chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED, | 6520 chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED, |
| 6520 content::NotificationService::AllSources()); | 6521 content::NotificationService::AllSources()); |
| 6521 content::WindowedNotificationObserver observer( | 6522 content::WindowedNotificationObserver observer( |
| 6522 extensions::NOTIFICATION_CRX_INSTALLER_DONE, | 6523 extensions::NOTIFICATION_CRX_INSTALLER_DONE, |
| 6523 content::NotificationService::AllSources()); | 6524 content::NotificationService::AllSources()); |
| 6524 provider->UpdateOrAddExtension( | 6525 provider->UpdateOrAddExtension( |
| 6525 updates_from_webstore3, "1", | 6526 updates_from_webstore3, "1", |
| 6526 temp_dir().path().AppendASCII("webstore3.crx")); | 6527 temp_dir().GetPath().AppendASCII("webstore3.crx")); |
| 6527 service()->CheckForExternalUpdates(); | 6528 service()->CheckForExternalUpdates(); |
| 6528 observer.Wait(); | 6529 observer.Wait(); |
| 6529 // Make sure ExternalInstallError::OnDialogReady() fires. | 6530 // Make sure ExternalInstallError::OnDialogReady() fires. |
| 6530 global_error_observer.Wait(); | 6531 global_error_observer.Wait(); |
| 6531 | 6532 |
| 6532 std::vector<ExternalInstallError*> errors = | 6533 std::vector<ExternalInstallError*> errors = |
| 6533 service_->external_install_manager()->GetErrorsForTesting(); | 6534 service_->external_install_manager()->GetErrorsForTesting(); |
| 6534 EXPECT_EQ(1u, errors.size()); | 6535 EXPECT_EQ(1u, errors.size()); |
| 6535 EXPECT_EQ(1u, GetExternalInstallBubbleCount(service())); | 6536 EXPECT_EQ(1u, GetExternalInstallBubbleCount(service())); |
| 6536 EXPECT_TRUE(service() | 6537 EXPECT_TRUE(service() |
| (...skipping 16 matching lines...) Expand all Loading... |
| 6553 // post-first run. | 6554 // post-first run. |
| 6554 ExtensionServiceInitParams params = CreateDefaultInitParams(); | 6555 ExtensionServiceInitParams params = CreateDefaultInitParams(); |
| 6555 params.is_first_run = false; | 6556 params.is_first_run = false; |
| 6556 InitializeExtensionService(params); | 6557 InitializeExtensionService(params); |
| 6557 | 6558 |
| 6558 MockExtensionProvider* provider = | 6559 MockExtensionProvider* provider = |
| 6559 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); | 6560 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); |
| 6560 AddMockExternalProvider(provider); | 6561 AddMockExternalProvider(provider); |
| 6561 | 6562 |
| 6562 std::vector<BubbleErrorsTestData> data; | 6563 std::vector<BubbleErrorsTestData> data; |
| 6563 data.push_back( | 6564 data.push_back(BubbleErrorsTestData( |
| 6564 BubbleErrorsTestData(updates_from_webstore, "1", | 6565 updates_from_webstore, "1", |
| 6565 temp_dir().path().AppendASCII("webstore.crx"), 1u)); | 6566 temp_dir().GetPath().AppendASCII("webstore.crx"), 1u)); |
| 6566 data.push_back( | 6567 data.push_back(BubbleErrorsTestData( |
| 6567 BubbleErrorsTestData(updates_from_webstore2, "1", | 6568 updates_from_webstore2, "1", |
| 6568 temp_dir().path().AppendASCII("webstore2.crx"), 2u)); | 6569 temp_dir().GetPath().AppendASCII("webstore2.crx"), 2u)); |
| 6569 | 6570 |
| 6570 PackCRX(data_dir().AppendASCII("update_from_webstore"), | 6571 PackCRX(data_dir().AppendASCII("update_from_webstore"), |
| 6571 data_dir().AppendASCII("update_from_webstore.pem"), data[0].crx_path); | 6572 data_dir().AppendASCII("update_from_webstore.pem"), data[0].crx_path); |
| 6572 PackCRX(data_dir().AppendASCII("update_from_webstore2"), | 6573 PackCRX(data_dir().AppendASCII("update_from_webstore2"), |
| 6573 data_dir().AppendASCII("update_from_webstore2.pem"), | 6574 data_dir().AppendASCII("update_from_webstore2.pem"), |
| 6574 data[1].crx_path); | 6575 data[1].crx_path); |
| 6575 { | 6576 { |
| 6576 content::WindowedNotificationObserver global_error_observer( | 6577 content::WindowedNotificationObserver global_error_observer( |
| 6577 chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED, | 6578 chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED, |
| 6578 content::NotificationService::AllSources()); | 6579 content::NotificationService::AllSources()); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6647 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreOldProfile) { | 6648 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreOldProfile) { |
| 6648 FeatureSwitch::ScopedOverride prompt( | 6649 FeatureSwitch::ScopedOverride prompt( |
| 6649 FeatureSwitch::prompt_for_external_extensions(), true); | 6650 FeatureSwitch::prompt_for_external_extensions(), true); |
| 6650 | 6651 |
| 6651 // This sets up the ExtensionPrefs used by our ExtensionService to be | 6652 // This sets up the ExtensionPrefs used by our ExtensionService to be |
| 6652 // post-first run. | 6653 // post-first run. |
| 6653 ExtensionServiceInitParams params = CreateDefaultInitParams(); | 6654 ExtensionServiceInitParams params = CreateDefaultInitParams(); |
| 6654 params.is_first_run = false; | 6655 params.is_first_run = false; |
| 6655 InitializeExtensionService(params); | 6656 InitializeExtensionService(params); |
| 6656 | 6657 |
| 6657 base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); | 6658 base::FilePath crx_path = temp_dir().GetPath().AppendASCII("webstore.crx"); |
| 6658 PackCRX(data_dir().AppendASCII("update_from_webstore"), | 6659 PackCRX(data_dir().AppendASCII("update_from_webstore"), |
| 6659 data_dir().AppendASCII("update_from_webstore.pem"), | 6660 data_dir().AppendASCII("update_from_webstore.pem"), |
| 6660 crx_path); | 6661 crx_path); |
| 6661 | 6662 |
| 6662 MockExtensionProvider* provider = | 6663 MockExtensionProvider* provider = |
| 6663 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); | 6664 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); |
| 6664 AddMockExternalProvider(provider); | 6665 AddMockExternalProvider(provider); |
| 6665 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); | 6666 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); |
| 6666 | 6667 |
| 6667 content::WindowedNotificationObserver observer( | 6668 content::WindowedNotificationObserver observer( |
| 6668 extensions::NOTIFICATION_CRX_INSTALLER_DONE, | 6669 extensions::NOTIFICATION_CRX_INSTALLER_DONE, |
| 6669 content::NotificationService::AllSources()); | 6670 content::NotificationService::AllSources()); |
| 6670 service()->CheckForExternalUpdates(); | 6671 service()->CheckForExternalUpdates(); |
| 6671 observer.Wait(); | 6672 observer.Wait(); |
| 6672 EXPECT_TRUE(HasExternalInstallErrors(service())); | 6673 EXPECT_TRUE(HasExternalInstallErrors(service())); |
| 6673 ASSERT_TRUE(GetError(updates_from_webstore)); | 6674 ASSERT_TRUE(GetError(updates_from_webstore)); |
| 6674 EXPECT_EQ(ExternalInstallError::BUBBLE_ALERT, | 6675 EXPECT_EQ(ExternalInstallError::BUBBLE_ALERT, |
| 6675 GetError(updates_from_webstore)->alert_type()); | 6676 GetError(updates_from_webstore)->alert_type()); |
| 6676 EXPECT_FALSE(service()->IsExtensionEnabled(updates_from_webstore)); | 6677 EXPECT_FALSE(service()->IsExtensionEnabled(updates_from_webstore)); |
| 6677 } | 6678 } |
| 6678 | 6679 |
| 6679 // Test that there is no bubble for external extensions if the profile is new. | 6680 // Test that there is no bubble for external extensions if the profile is new. |
| 6680 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreNewProfile) { | 6681 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreNewProfile) { |
| 6681 FeatureSwitch::ScopedOverride prompt( | 6682 FeatureSwitch::ScopedOverride prompt( |
| 6682 FeatureSwitch::prompt_for_external_extensions(), true); | 6683 FeatureSwitch::prompt_for_external_extensions(), true); |
| 6683 | 6684 |
| 6684 InitializeEmptyExtensionService(); | 6685 InitializeEmptyExtensionService(); |
| 6685 | 6686 |
| 6686 base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); | 6687 base::FilePath crx_path = temp_dir().GetPath().AppendASCII("webstore.crx"); |
| 6687 PackCRX(data_dir().AppendASCII("update_from_webstore"), | 6688 PackCRX(data_dir().AppendASCII("update_from_webstore"), |
| 6688 data_dir().AppendASCII("update_from_webstore.pem"), | 6689 data_dir().AppendASCII("update_from_webstore.pem"), |
| 6689 crx_path); | 6690 crx_path); |
| 6690 | 6691 |
| 6691 MockExtensionProvider* provider = | 6692 MockExtensionProvider* provider = |
| 6692 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); | 6693 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); |
| 6693 AddMockExternalProvider(provider); | 6694 AddMockExternalProvider(provider); |
| 6694 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); | 6695 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); |
| 6695 | 6696 |
| 6696 content::WindowedNotificationObserver observer( | 6697 content::WindowedNotificationObserver observer( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 6708 // Test that clicking to remove the extension on an external install warning | 6709 // Test that clicking to remove the extension on an external install warning |
| 6709 // uninstalls the extension. | 6710 // uninstalls the extension. |
| 6710 TEST_F(ExtensionServiceTest, ExternalInstallClickToRemove) { | 6711 TEST_F(ExtensionServiceTest, ExternalInstallClickToRemove) { |
| 6711 FeatureSwitch::ScopedOverride prompt( | 6712 FeatureSwitch::ScopedOverride prompt( |
| 6712 FeatureSwitch::prompt_for_external_extensions(), true); | 6713 FeatureSwitch::prompt_for_external_extensions(), true); |
| 6713 | 6714 |
| 6714 ExtensionServiceInitParams params = CreateDefaultInitParams(); | 6715 ExtensionServiceInitParams params = CreateDefaultInitParams(); |
| 6715 params.is_first_run = false; | 6716 params.is_first_run = false; |
| 6716 InitializeExtensionService(params); | 6717 InitializeExtensionService(params); |
| 6717 | 6718 |
| 6718 base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); | 6719 base::FilePath crx_path = temp_dir().GetPath().AppendASCII("webstore.crx"); |
| 6719 PackCRX(data_dir().AppendASCII("update_from_webstore"), | 6720 PackCRX(data_dir().AppendASCII("update_from_webstore"), |
| 6720 data_dir().AppendASCII("update_from_webstore.pem"), | 6721 data_dir().AppendASCII("update_from_webstore.pem"), |
| 6721 crx_path); | 6722 crx_path); |
| 6722 | 6723 |
| 6723 MockExtensionProvider* provider = | 6724 MockExtensionProvider* provider = |
| 6724 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); | 6725 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); |
| 6725 AddMockExternalProvider(provider); | 6726 AddMockExternalProvider(provider); |
| 6726 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); | 6727 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); |
| 6727 | 6728 |
| 6728 content::WindowedNotificationObserver observer( | 6729 content::WindowedNotificationObserver observer( |
| (...skipping 22 matching lines...) Expand all Loading... |
| 6751 // Test that clicking to keep the extension on an external install warning | 6752 // Test that clicking to keep the extension on an external install warning |
| 6752 // re-enables the extension. | 6753 // re-enables the extension. |
| 6753 TEST_F(ExtensionServiceTest, ExternalInstallClickToKeep) { | 6754 TEST_F(ExtensionServiceTest, ExternalInstallClickToKeep) { |
| 6754 FeatureSwitch::ScopedOverride prompt( | 6755 FeatureSwitch::ScopedOverride prompt( |
| 6755 FeatureSwitch::prompt_for_external_extensions(), true); | 6756 FeatureSwitch::prompt_for_external_extensions(), true); |
| 6756 | 6757 |
| 6757 ExtensionServiceInitParams params = CreateDefaultInitParams(); | 6758 ExtensionServiceInitParams params = CreateDefaultInitParams(); |
| 6758 params.is_first_run = false; | 6759 params.is_first_run = false; |
| 6759 InitializeExtensionService(params); | 6760 InitializeExtensionService(params); |
| 6760 | 6761 |
| 6761 base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); | 6762 base::FilePath crx_path = temp_dir().GetPath().AppendASCII("webstore.crx"); |
| 6762 PackCRX(data_dir().AppendASCII("update_from_webstore"), | 6763 PackCRX(data_dir().AppendASCII("update_from_webstore"), |
| 6763 data_dir().AppendASCII("update_from_webstore.pem"), | 6764 data_dir().AppendASCII("update_from_webstore.pem"), |
| 6764 crx_path); | 6765 crx_path); |
| 6765 | 6766 |
| 6766 MockExtensionProvider* provider = | 6767 MockExtensionProvider* provider = |
| 6767 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); | 6768 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); |
| 6768 AddMockExternalProvider(provider); | 6769 AddMockExternalProvider(provider); |
| 6769 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); | 6770 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); |
| 6770 | 6771 |
| 6771 content::WindowedNotificationObserver observer( | 6772 content::WindowedNotificationObserver observer( |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6916 | 6917 |
| 6917 service()->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED, | 6918 service()->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED, |
| 6918 content::Source<Profile>(profile()), | 6919 content::Source<Profile>(profile()), |
| 6919 content::NotificationService::NoDetails()); | 6920 content::NotificationService::NoDetails()); |
| 6920 EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); | 6921 EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); |
| 6921 EXPECT_EQ(0u, registry()->enabled_extensions().size()); | 6922 EXPECT_EQ(0u, registry()->enabled_extensions().size()); |
| 6922 EXPECT_EQ(0u, registry()->disabled_extensions().size()); | 6923 EXPECT_EQ(0u, registry()->disabled_extensions().size()); |
| 6923 EXPECT_EQ(0u, registry()->terminated_extensions().size()); | 6924 EXPECT_EQ(0u, registry()->terminated_extensions().size()); |
| 6924 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); | 6925 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); |
| 6925 } | 6926 } |
| OLD | NEW |