1 // Copyright (c) 2012 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 "content/child/npapi/plugin_lib.h" 6 7 #include "base/strings/string_util.h" 8 #include "base/strings/utf_string_conversions.h" 9 #include "build/build_config.h" 10 #include "testing/gtest/include/gtest/gtest.h" 11 12 namespace content { 13 14 // Test the unloading of plugin libs. Bug http://crbug.com/46526 showed that 15 // if UnloadAllPlugins() simply iterates through the g_loaded_libs global 16 // variable, we can get a crash if no plugin libs were marked as always loaded. 17 class PluginLibTest : public PluginLib { 18 public: 19 PluginLibTest() : PluginLib(WebPluginInfo()) {} 20 using PluginLib::Unload; 21 22 protected: 23 virtual ~PluginLibTest() {} 24 }; 25 26 TEST(PluginLibLoading, UnloadAllPlugins) { 27 // For the creation of the g_loaded_libs global variable. 28 ASSERT_EQ(static_cast<PluginLibTest*>(NULL), 29 PluginLibTest::CreatePluginLib(base::FilePath())); 30 31 // Try with a single plugin lib. 32 scoped_refptr<PluginLibTest> plugin_lib1(new PluginLibTest()); 33 PluginLib::UnloadAllPlugins(); 34 35 // Need to create it again, it should have been destroyed above. 36 ASSERT_EQ(static_cast<PluginLibTest*>(NULL), 37 PluginLibTest::CreatePluginLib(base::FilePath())); 38 39 // Try with two plugin libs. 40 plugin_lib1 = new PluginLibTest(); 41 scoped_refptr<PluginLibTest> plugin_lib2(new PluginLibTest()); 42 PluginLib::UnloadAllPlugins(); 43 44 // Need to create it again, it should have been destroyed above. 45 ASSERT_EQ(static_cast<PluginLibTest*>(NULL), 46 PluginLibTest::CreatePluginLib(base::FilePath())); 47 48 // Now try to manually Unload one and then UnloadAll. 49 plugin_lib1 = new PluginLibTest(); 50 plugin_lib2 = new PluginLibTest(); 51 plugin_lib1->Unload(); 52 PluginLib::UnloadAllPlugins(); 53 54 // Need to create it again, it should have been destroyed above. 55 ASSERT_EQ(static_cast<PluginLibTest*>(NULL), 56 PluginLibTest::CreatePluginLib(base::FilePath())); 57 58 // Now try to manually Unload the only one and then UnloadAll. 59 plugin_lib1 = new PluginLibTest(); 60 plugin_lib1->Unload(); 61 PluginLib::UnloadAllPlugins(); 62 } 63 64 } // namespace content 65