| Index: chrome/browser/download/download_target_determiner_unittest.cc
|
| diff --git a/chrome/browser/download/download_target_determiner_unittest.cc b/chrome/browser/download/download_target_determiner_unittest.cc
|
| index aca072031be40246ed4813d1f1849069456397b0..5b4b8f288e4ff1f43c5bcda0d946f35660e072a9 100644
|
| --- a/chrome/browser/download/download_target_determiner_unittest.cc
|
| +++ b/chrome/browser/download/download_target_determiner_unittest.cc
|
| @@ -2,6 +2,7 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include "base/at_exit.h"
|
| #include "base/files/file_path.h"
|
| #include "base/files/scoped_temp_dir.h"
|
| #include "base/message_loop/message_loop.h"
|
| @@ -15,6 +16,7 @@
|
| #include "chrome/browser/download/download_extensions.h"
|
| #include "chrome/browser/download/download_prefs.h"
|
| #include "chrome/browser/download/download_target_determiner.h"
|
| +#include "chrome/browser/download/download_target_info.h"
|
| #include "chrome/browser/history/history_service.h"
|
| #include "chrome/browser/history/history_service_factory.h"
|
| #include "chrome/browser/history/history_types.h"
|
| @@ -24,15 +26,23 @@
|
| #include "chrome/test/base/testing_pref_service_syncable.h"
|
| #include "chrome/test/base/testing_profile.h"
|
| #include "content/public/browser/download_interrupt_reasons.h"
|
| +#include "content/public/browser/render_process_host.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "content/public/browser/web_contents_delegate.h"
|
| #include "content/public/test/mock_download_item.h"
|
| #include "content/public/test/test_browser_thread.h"
|
| #include "content/public/test/test_renderer_host.h"
|
| #include "content/public/test/web_contents_tester.h"
|
| +#include "net/base/mime_util.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| +#if defined(ENABLE_PLUGINS)
|
| +#include "chrome/browser/plugins/plugin_prefs.h"
|
| +#include "content/public/browser/plugin_service.h"
|
| +#include "content/public/common/webplugininfo.h"
|
| +#endif
|
| +
|
| using ::testing::AnyNumber;
|
| using ::testing::Invoke;
|
| using ::testing::Ref;
|
| @@ -143,6 +153,9 @@ class MockDownloadTargetDeterminerDelegate
|
| void(DownloadItem*, const base::FilePath&, bool,
|
| DownloadPathReservationTracker::FilenameConflictAction,
|
| const ReservedPathCallback&));
|
| + MOCK_METHOD2(GetFileMimeType,
|
| + void(const base::FilePath&,
|
| + const GetFileMimeTypeCallback&));
|
|
|
| void SetupDefaults() {
|
| ON_CALL(*this, CheckDownloadUrl(_, _, _))
|
| @@ -161,6 +174,9 @@ class MockDownloadTargetDeterminerDelegate
|
| ON_CALL(*this, DetermineLocalPath(_, _, _))
|
| .WillByDefault(Invoke(
|
| &MockDownloadTargetDeterminerDelegate::NullDetermineLocalPath));
|
| + ON_CALL(*this, GetFileMimeType(_, _))
|
| + .WillByDefault(WithArg<1>(
|
| + ScheduleCallback("")));
|
| }
|
| private:
|
| static void NullReserveVirtualPath(
|
| @@ -206,6 +222,12 @@ class DownloadTargetDeterminerTest : public ChromeRenderViewHostTestHarness {
|
| const base::FilePath& initial_virtual_path,
|
| content::MockDownloadItem* item);
|
|
|
| + // Runs |test_case| with |item|. When the DownloadTargetDeterminer is done,
|
| + // returns the resulting DownloadTargetInfo.
|
| + scoped_ptr<DownloadTargetInfo> RunDownloadTargetDeterminer(
|
| + const base::FilePath& initial_virtual_path,
|
| + content::MockDownloadItem* item);
|
| +
|
| // Run through |test_case_count| tests in |test_cases|. A new MockDownloadItem
|
| // will be created for each test case and destroyed when the test case is
|
| // complete.
|
| @@ -215,12 +237,8 @@ class DownloadTargetDeterminerTest : public ChromeRenderViewHostTestHarness {
|
| // Verifies that |target_path|, |disposition|, |expected_danger_type| and
|
| // |intermediate_path| matches the expectations of |test_case|. Posts
|
| // |closure| to the current message loop when done.
|
| - void DownloadTargetVerifier(const base::Closure& closure,
|
| - const DownloadTestCase& test_case,
|
| - const base::FilePath& local_path,
|
| - DownloadItem::TargetDisposition disposition,
|
| - content::DownloadDangerType danger_type,
|
| - const base::FilePath& intermediate_path);
|
| + void VerifyDownloadTarget(const DownloadTestCase& test_case,
|
| + const DownloadTargetInfo* target_info);
|
|
|
| const base::FilePath& test_download_dir() const {
|
| return test_download_dir_.path();
|
| @@ -350,15 +368,33 @@ void DownloadTargetDeterminerTest::RunTestCase(
|
| const DownloadTestCase& test_case,
|
| const base::FilePath& initial_virtual_path,
|
| content::MockDownloadItem* item) {
|
| - // Kick off the test.
|
| - base::WeakPtrFactory<DownloadTargetDeterminerTest> factory(this);
|
| + scoped_ptr<DownloadTargetInfo> target_info =
|
| + RunDownloadTargetDeterminer(initial_virtual_path, item);
|
| + VerifyDownloadTarget(test_case, target_info.get());
|
| +}
|
| +
|
| +void CompletionCallbackWrapper(
|
| + const base::Closure& closure,
|
| + scoped_ptr<DownloadTargetInfo>* target_info_receiver,
|
| + scoped_ptr<DownloadTargetInfo> target_info) {
|
| + target_info_receiver->swap(target_info);
|
| + base::MessageLoop::current()->PostTask(FROM_HERE, closure);
|
| +}
|
| +
|
| +scoped_ptr<DownloadTargetInfo>
|
| +DownloadTargetDeterminerTest::RunDownloadTargetDeterminer(
|
| + const base::FilePath& initial_virtual_path,
|
| + content::MockDownloadItem* item) {
|
| + scoped_ptr<DownloadTargetInfo> target_info;
|
| base::RunLoop run_loop;
|
| DownloadTargetDeterminer::Start(
|
| item, initial_virtual_path, download_prefs_.get(), delegate(),
|
| - base::Bind(&DownloadTargetDeterminerTest::DownloadTargetVerifier,
|
| - factory.GetWeakPtr(), run_loop.QuitClosure(), test_case));
|
| + base::Bind(&CompletionCallbackWrapper,
|
| + run_loop.QuitClosure(),
|
| + &target_info));
|
| run_loop.Run();
|
| ::testing::Mock::VerifyAndClearExpectations(delegate());
|
| + return target_info.Pass();
|
| }
|
|
|
| void DownloadTargetDeterminerTest::RunTestCasesWithActiveItem(
|
| @@ -372,23 +408,20 @@ void DownloadTargetDeterminerTest::RunTestCasesWithActiveItem(
|
| }
|
| }
|
|
|
| -void DownloadTargetDeterminerTest::DownloadTargetVerifier(
|
| - const base::Closure& closure,
|
| +void DownloadTargetDeterminerTest::VerifyDownloadTarget(
|
| const DownloadTestCase& test_case,
|
| - const base::FilePath& local_path,
|
| - DownloadItem::TargetDisposition disposition,
|
| - content::DownloadDangerType danger_type,
|
| - const base::FilePath& intermediate_path) {
|
| + const DownloadTargetInfo* target_info) {
|
| base::FilePath expected_local_path(
|
| GetPathInDownloadDir(test_case.expected_local_path));
|
| - EXPECT_EQ(expected_local_path.value(), local_path.value());
|
| - EXPECT_EQ(test_case.expected_disposition, disposition);
|
| - EXPECT_EQ(test_case.expected_danger_type, danger_type);
|
| + EXPECT_EQ(expected_local_path.value(), target_info->target_path.value());
|
| + EXPECT_EQ(test_case.expected_disposition, target_info->target_disposition);
|
| + EXPECT_EQ(test_case.expected_danger_type, target_info->danger_type);
|
|
|
| switch (test_case.expected_intermediate) {
|
| case EXPECT_CRDOWNLOAD:
|
| - EXPECT_EQ(DownloadTargetDeterminer::GetCrDownloadPath(local_path).value(),
|
| - intermediate_path.value());
|
| + EXPECT_EQ(DownloadTargetDeterminer::GetCrDownloadPath(
|
| + target_info->target_path).value(),
|
| + target_info->intermediate_path.value());
|
| break;
|
|
|
| case EXPECT_UNCONFIRMED:
|
| @@ -400,20 +433,21 @@ void DownloadTargetDeterminerTest::DownloadTargetVerifier(
|
| // 4. Basename starts with "Unconfirmed ".
|
| EXPECT_NE(DownloadTargetDeterminer::GetCrDownloadPath(expected_local_path)
|
| .value(),
|
| - intermediate_path.value());
|
| + target_info->intermediate_path.value());
|
| EXPECT_EQ(expected_local_path.DirName().value(),
|
| - intermediate_path.DirName().value());
|
| - EXPECT_TRUE(intermediate_path.MatchesExtension(
|
| + target_info->intermediate_path.DirName().value());
|
| + EXPECT_TRUE(target_info->intermediate_path.MatchesExtension(
|
| FILE_PATH_LITERAL(".crdownload")));
|
| - EXPECT_EQ(0u, intermediate_path.BaseName().value().find(
|
| - FILE_PATH_LITERAL("Unconfirmed ")));
|
| + EXPECT_EQ(0u,
|
| + target_info->intermediate_path.BaseName().value().find(
|
| + FILE_PATH_LITERAL("Unconfirmed ")));
|
| break;
|
|
|
| case EXPECT_LOCAL_PATH:
|
| - EXPECT_EQ(expected_local_path.value(), intermediate_path.value());
|
| + EXPECT_EQ(expected_local_path.value(),
|
| + target_info->intermediate_path.value());
|
| break;
|
| }
|
| - base::MessageLoop::current()->PostTask(FROM_HERE, closure);
|
| }
|
|
|
| // static
|
| @@ -1704,21 +1738,6 @@ TEST_F(DownloadTargetDeterminerTest, TargetDeterminer_ResumedWithPrompt) {
|
| }
|
| }
|
|
|
| -// Used with TargetDeterminer_IntermediateNameForResumed test. Verifies that
|
| -// |intermediate_path| == |expected_intermediate_path| if the latter is
|
| -// non-empty.
|
| -void IntermediatePathVerifier(
|
| - const base::FilePath& expected_intermediate_path,
|
| - const content::DownloadTargetCallback& callback,
|
| - const base::FilePath& target_path,
|
| - content::DownloadItem::TargetDisposition disposition,
|
| - content::DownloadDangerType danger_type,
|
| - const base::FilePath& intermediate_path) {
|
| - if (!expected_intermediate_path.empty())
|
| - EXPECT_EQ(expected_intermediate_path, intermediate_path);
|
| - callback.Run(target_path, disposition, danger_type, intermediate_path);
|
| -}
|
| -
|
| // Test intermediate filename generation for resumed downloads.
|
| TEST_F(DownloadTargetDeterminerTest,
|
| TargetDeterminer_IntermediateNameForResumed) {
|
| @@ -1855,25 +1874,374 @@ TEST_F(DownloadTargetDeterminerTest,
|
| ON_CALL(*item.get(), GetDangerType())
|
| .WillByDefault(Return(test_case.general.expected_danger_type));
|
|
|
| - base::WeakPtrFactory<DownloadTargetDeterminerTest> factory(this);
|
| - base::RunLoop run_loop;
|
| - content::DownloadTargetCallback verifier_callback =
|
| - base::Bind(&DownloadTargetDeterminerTest::DownloadTargetVerifier,
|
| - factory.GetWeakPtr(),
|
| - run_loop.QuitClosure(),
|
| - test_case.general);
|
| - content::DownloadTargetCallback test_callback =
|
| - base::Bind(&IntermediatePathVerifier,
|
| - GetPathInDownloadDir(test_case.expected_intermediate_path),
|
| - verifier_callback);
|
| - DownloadTargetDeterminer::Start(item.get(),
|
| - GetPathInDownloadDir(kInitialPath),
|
| - download_prefs(),
|
| - delegate(),
|
| - test_callback);
|
| - run_loop.Run();
|
| - ::testing::Mock::VerifyAndClearExpectations(delegate());
|
| + scoped_ptr<DownloadTargetInfo> target_info =
|
| + RunDownloadTargetDeterminer(GetPathInDownloadDir(kInitialPath),
|
| + item.get());
|
| + VerifyDownloadTarget(test_case.general, target_info.get());
|
| + base::FilePath expected_intermediate_path =
|
| + GetPathInDownloadDir(test_case.expected_intermediate_path);
|
| + if (!expected_intermediate_path.empty())
|
| + EXPECT_EQ(expected_intermediate_path, target_info->intermediate_path);
|
| + }
|
| +}
|
| +
|
| +// Test MIME type determination based on the target filename.
|
| +TEST_F(DownloadTargetDeterminerTest,
|
| + TargetDeterminer_MIMETypeDetermination) {
|
| + // All test cases run with GetPathInDownloadDir(kInitialPath) as the inital
|
| + // path.
|
| + const base::FilePath::CharType kInitialPath[] =
|
| + FILE_PATH_LITERAL("some_path/bar.txt");
|
| +
|
| + struct MIMETypeTestCase {
|
| + // General test case settings.
|
| + DownloadTestCase general;
|
| +
|
| + // Expected MIME type for test case.
|
| + const char* expected_mime_type;
|
| + } kMIMETypeTestCases[] = {
|
| + {
|
| + {
|
| + // 0:
|
| + AUTOMATIC,
|
| + content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| + "http://example.com/foo.png", "image/png",
|
| + FILE_PATH_LITERAL(""),
|
| +
|
| + FILE_PATH_LITERAL(""),
|
| + FILE_PATH_LITERAL("foo.png"),
|
| + DownloadItem::TARGET_DISPOSITION_OVERWRITE,
|
| +
|
| + EXPECT_CRDOWNLOAD
|
| + },
|
| + "image/png"
|
| + },
|
| + {
|
| + {
|
| + // 1: Empty MIME type in response.
|
| + AUTOMATIC,
|
| + content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| + "http://example.com/foo.png", "",
|
| + FILE_PATH_LITERAL(""),
|
| +
|
| + FILE_PATH_LITERAL(""),
|
| + FILE_PATH_LITERAL("foo.png"),
|
| + DownloadItem::TARGET_DISPOSITION_OVERWRITE,
|
| +
|
| + EXPECT_CRDOWNLOAD
|
| + },
|
| + "image/png"
|
| + },
|
| + {
|
| + {
|
| + // 2: Forced path.
|
| + FORCED,
|
| + content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| + "http://example.com/foo.abc", "",
|
| + FILE_PATH_LITERAL("foo.png"),
|
| +
|
| + FILE_PATH_LITERAL(""),
|
| + FILE_PATH_LITERAL("foo.png"),
|
| + DownloadItem::TARGET_DISPOSITION_OVERWRITE,
|
| +
|
| + EXPECT_CRDOWNLOAD
|
| + },
|
| + "image/png"
|
| + },
|
| + {
|
| + {
|
| + // 3: Unknown file type.
|
| + AUTOMATIC,
|
| + content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| + "http://example.com/foo.notarealext", "",
|
| + FILE_PATH_LITERAL(""),
|
| +
|
| + FILE_PATH_LITERAL(""),
|
| + FILE_PATH_LITERAL("foo.notarealext"),
|
| + DownloadItem::TARGET_DISPOSITION_OVERWRITE,
|
| +
|
| + EXPECT_CRDOWNLOAD
|
| + },
|
| + ""
|
| + },
|
| + {
|
| + {
|
| + // 4: Unknown file type.
|
| + AUTOMATIC,
|
| + content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| + "http://example.com/foo.notarealext", "image/png",
|
| + FILE_PATH_LITERAL(""),
|
| +
|
| + FILE_PATH_LITERAL(""),
|
| + FILE_PATH_LITERAL("foo.notarealext"),
|
| + DownloadItem::TARGET_DISPOSITION_OVERWRITE,
|
| +
|
| + EXPECT_CRDOWNLOAD
|
| + },
|
| + ""
|
| + },
|
| + };
|
| +
|
| + ON_CALL(*delegate(), GetFileMimeType(
|
| + GetPathInDownloadDir(FILE_PATH_LITERAL("foo.png")), _))
|
| + .WillByDefault(WithArg<1>(
|
| + ScheduleCallback("image/png")));
|
| +
|
| + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kMIMETypeTestCases); ++i) {
|
| + SCOPED_TRACE(testing::Message() << "Running test case " << i);
|
| + const MIMETypeTestCase& test_case = kMIMETypeTestCases[i];
|
| + scoped_ptr<content::MockDownloadItem> item(
|
| + CreateActiveDownloadItem(i, test_case.general));
|
| + scoped_ptr<DownloadTargetInfo> target_info =
|
| + RunDownloadTargetDeterminer(GetPathInDownloadDir(kInitialPath),
|
| + item.get());
|
| + EXPECT_EQ(test_case.expected_mime_type, target_info->mime_type);
|
| + }
|
| +}
|
| +
|
| +#if defined(ENABLE_PLUGINS)
|
| +
|
| +void DummyGetPluginsCallback(
|
| + const base::Closure& closure,
|
| + const std::vector<content::WebPluginInfo>& plugins) {
|
| + closure.Run();
|
| +}
|
| +
|
| +void ForceRefreshOfPlugins() {
|
| +#if !defined(OS_WIN)
|
| + // Prevent creation of a utility process for loading plugins. Doing so breaks
|
| + // unit_tests since /proc/self/exe can't be run as a utility process.
|
| + content::RenderProcessHost::SetRunRendererInProcess(true);
|
| +#endif
|
| + base::RunLoop run_loop;
|
| + content::PluginService::GetInstance()->GetPlugins(
|
| + base::Bind(&DummyGetPluginsCallback, run_loop.QuitClosure()));
|
| + run_loop.Run();
|
| +#if !defined(OS_WIN)
|
| + content::RenderProcessHost::SetRunRendererInProcess(false);
|
| +#endif
|
| +}
|
| +
|
| +void PluginEnabledCallback(const base::Closure& closure,
|
| + bool result) {
|
| + EXPECT_TRUE(result);
|
| + closure.Run();
|
| +}
|
| +
|
| +void EnablePlugin(bool enable, PluginPrefs* prefs, const base::FilePath& path) {
|
| + base::RunLoop run_loop;
|
| + prefs->EnablePlugin(enable, path,
|
| + base::Bind(&PluginEnabledCallback,
|
| + run_loop.QuitClosure()));
|
| + run_loop.Run();
|
| +}
|
| +
|
| +class ScopedRegisterInternalPlugin {
|
| + public:
|
| + ScopedRegisterInternalPlugin(content::PluginService* plugin_service,
|
| + content::WebPluginInfo::PluginType type,
|
| + const base::FilePath& path,
|
| + const char* mime_type,
|
| + const char* extension)
|
| + : plugin_service_(plugin_service),
|
| + plugin_path_(path) {
|
| + content::WebPluginMimeType plugin_mime_type(mime_type,
|
| + extension,
|
| + "Test file");
|
| + content::WebPluginInfo plugin_info(base::string16(),
|
| + path,
|
| + base::string16(),
|
| + base::string16());
|
| + plugin_info.mime_types.push_back(plugin_mime_type);
|
| + plugin_info.type = type;
|
| +
|
| + plugin_service->RegisterInternalPlugin(plugin_info, true);
|
| + plugin_service->RefreshPlugins();
|
| + ForceRefreshOfPlugins();
|
| + }
|
| +
|
| + ~ScopedRegisterInternalPlugin() {
|
| + plugin_service_->UnregisterInternalPlugin(plugin_path_);
|
| + plugin_service_->RefreshPlugins();
|
| + ForceRefreshOfPlugins();
|
| + }
|
| +
|
| + const base::FilePath& path() { return plugin_path_; }
|
| +
|
| + private:
|
| + content::PluginService* plugin_service_;
|
| + base::FilePath plugin_path_;
|
| +};
|
| +
|
| +// We use a slightly different test fixture for tests that touch plugins. SetUp
|
| +// needs to disable plugin discovery and we need to use a
|
| +// ShadowingAtExitManager to discard the tainted PluginService. Unfortunately,
|
| +// PluginService carries global state.
|
| +class DownloadTargetDeterminerTestWithPlugin :
|
| + public DownloadTargetDeterminerTest {
|
| + public:
|
| + virtual void SetUp() OVERRIDE {
|
| + content::PluginService::GetInstance()->Init();
|
| + content::PluginService::GetInstance()->DisablePluginsDiscoveryForTesting();
|
| + DownloadTargetDeterminerTest::SetUp();
|
| + }
|
| +
|
| + protected:
|
| + // The ShadowingAtExitManager destroys the tainted PluginService instance.
|
| + base::ShadowingAtExitManager at_exit_manager_;
|
| +};
|
| +
|
| +// Check if secure handling of filetypes is determined correctly for PPAPI
|
| +// plugins.
|
| +TEST_F(DownloadTargetDeterminerTestWithPlugin,
|
| + TargetDeterminer_CheckForSecureHandling_PPAPI) {
|
| + // All test cases run with GetPathInDownloadDir(kInitialPath) as the inital
|
| + // path.
|
| + const base::FilePath::CharType kInitialPath[] =
|
| + FILE_PATH_LITERAL("some_path/bar.txt");
|
| + const char kTestMIMEType[] = "application/x-example-should-not-exist";
|
| +
|
| + DownloadTestCase kSecureHandlingTestCase = {
|
| + AUTOMATIC,
|
| + content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| + "http://example.com/foo.fakeext", "",
|
| + FILE_PATH_LITERAL(""),
|
| +
|
| + FILE_PATH_LITERAL(""),
|
| + FILE_PATH_LITERAL("foo.fakeext"),
|
| + DownloadItem::TARGET_DISPOSITION_OVERWRITE,
|
| +
|
| + EXPECT_CRDOWNLOAD
|
| + };
|
| +
|
| + content::PluginService* plugin_service =
|
| + content::PluginService::GetInstance();
|
| + // This creates a PluginPrefs for our TestingProfile.
|
| + scoped_refptr<PluginPrefs> plugin_prefs =
|
| + PluginPrefs::GetForTestingProfile(profile());
|
| +
|
| + // Verify our test assumptions.
|
| + {
|
| + ForceRefreshOfPlugins();
|
| + std::vector<content::WebPluginInfo> info;
|
| + ASSERT_FALSE(plugin_service->GetPluginInfoArray(
|
| + GURL(), kTestMIMEType, false, &info, NULL));
|
| + ASSERT_EQ(0u, info.size())
|
| + << "Name: " << info[0].name << ", Path: " << info[0].path.value();
|
| + }
|
| +
|
| + ON_CALL(*delegate(), GetFileMimeType(
|
| + GetPathInDownloadDir(FILE_PATH_LITERAL("foo.fakeext")), _))
|
| + .WillByDefault(WithArg<1>(
|
| + ScheduleCallback(kTestMIMEType)));
|
| + scoped_ptr<content::MockDownloadItem> item(
|
| + CreateActiveDownloadItem(1, kSecureHandlingTestCase));
|
| + scoped_ptr<DownloadTargetInfo> target_info =
|
| + RunDownloadTargetDeterminer(GetPathInDownloadDir(kInitialPath),
|
| + item.get());
|
| + EXPECT_FALSE(target_info->is_filetype_handled_securely);
|
| +
|
| + // Register a PPAPI plugin. This should count as handling the filetype
|
| + // securely.
|
| + ScopedRegisterInternalPlugin ppapi_plugin(
|
| + plugin_service,
|
| + content::WebPluginInfo::PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS,
|
| + test_download_dir().AppendASCII("ppapi"),
|
| + kTestMIMEType,
|
| + "fakeext");
|
| +
|
| + target_info = RunDownloadTargetDeterminer(
|
| + GetPathInDownloadDir(kInitialPath), item.get());
|
| + EXPECT_TRUE(target_info->is_filetype_handled_securely);
|
| +
|
| + // Try disabling the plugin. Handling should no longer be considered secure.
|
| + EnablePlugin(false, plugin_prefs, ppapi_plugin.path());
|
| + target_info = RunDownloadTargetDeterminer(
|
| + GetPathInDownloadDir(kInitialPath), item.get());
|
| + EXPECT_FALSE(target_info->is_filetype_handled_securely);
|
| +
|
| + // Now register an unsandboxed PPAPI plug-in. This plugin should not be
|
| + // considered secure.
|
| + ScopedRegisterInternalPlugin ppapi_unsandboxed_plugin(
|
| + plugin_service,
|
| + content::WebPluginInfo::PLUGIN_TYPE_PEPPER_UNSANDBOXED,
|
| + test_download_dir().AppendASCII("ppapi-nosandbox"),
|
| + kTestMIMEType,
|
| + "fakeext");
|
| +
|
| + target_info = RunDownloadTargetDeterminer(
|
| + GetPathInDownloadDir(kInitialPath), item.get());
|
| + EXPECT_FALSE(target_info->is_filetype_handled_securely);
|
| +}
|
| +
|
| +// Check if secure handling of filetypes is determined correctly for NPAPI
|
| +// plugins.
|
| +TEST_F(DownloadTargetDeterminerTestWithPlugin,
|
| + TargetDeterminer_CheckForSecureHandling_NPAPI) {
|
| + // All test cases run with GetPathInDownloadDir(kInitialPath) as the inital
|
| + // path.
|
| + const base::FilePath::CharType kInitialPath[] =
|
| + FILE_PATH_LITERAL("some_path/bar.txt");
|
| + const char kTestMIMEType[] = "application/x-example-should-not-exist";
|
| +
|
| + DownloadTestCase kSecureHandlingTestCase = {
|
| + AUTOMATIC,
|
| + content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
|
| + "http://example.com/foo.fakeext", "",
|
| + FILE_PATH_LITERAL(""),
|
| +
|
| + FILE_PATH_LITERAL(""),
|
| + FILE_PATH_LITERAL("foo.fakeext"),
|
| + DownloadItem::TARGET_DISPOSITION_OVERWRITE,
|
| +
|
| + EXPECT_CRDOWNLOAD
|
| + };
|
| +
|
| + content::PluginService* plugin_service =
|
| + content::PluginService::GetInstance();
|
| +
|
| + // Can't run this test if NPAPI isn't supported.
|
| + if (!plugin_service->NPAPIPluginsSupported())
|
| + return;
|
| +
|
| + // This creates a PluginPrefs for our TestingProfile.
|
| + scoped_refptr<PluginPrefs> plugin_prefs =
|
| + PluginPrefs::GetForTestingProfile(profile());
|
| +
|
| + // Verify our test assumptions.
|
| + {
|
| + ForceRefreshOfPlugins();
|
| + std::vector<content::WebPluginInfo> info;
|
| + ASSERT_FALSE(plugin_service->GetPluginInfoArray(
|
| + GURL(), kTestMIMEType, false, &info, NULL));
|
| + ASSERT_EQ(0u, info.size())
|
| + << "Name: " << info[0].name << ", Path: " << info[0].path.value();
|
| }
|
| +
|
| + ON_CALL(*delegate(), GetFileMimeType(
|
| + GetPathInDownloadDir(FILE_PATH_LITERAL("foo.fakeext")), _))
|
| + .WillByDefault(WithArg<1>(
|
| + ScheduleCallback(kTestMIMEType)));
|
| + scoped_ptr<content::MockDownloadItem> item(
|
| + CreateActiveDownloadItem(1, kSecureHandlingTestCase));
|
| + scoped_ptr<DownloadTargetInfo> target_info =
|
| + RunDownloadTargetDeterminer(GetPathInDownloadDir(kInitialPath),
|
| + item.get());
|
| + EXPECT_FALSE(target_info->is_filetype_handled_securely);
|
| +
|
| + // Register a NPAPI plugin. This should not count as handling the filetype
|
| + // securely.
|
| + ScopedRegisterInternalPlugin npapi_plugin(
|
| + plugin_service,
|
| + content::WebPluginInfo::PLUGIN_TYPE_NPAPI,
|
| + test_download_dir().AppendASCII("npapi"),
|
| + kTestMIMEType,
|
| + "fakeext");
|
| +
|
| + target_info = RunDownloadTargetDeterminer(
|
| + GetPathInDownloadDir(kInitialPath), item.get());
|
| + EXPECT_FALSE(target_info->is_filetype_handled_securely);
|
| }
|
| +#endif // ENABLE_PLUGINS
|
|
|
| } // namespace
|
|
|