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/browser/plugin_list.h"
6 
7 #include "base/strings/string16.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "url/gurl.h"
11 
12 namespace content {
13 
14 namespace {
15 
16 base::FilePath::CharType kFooPath[] = FILE_PATH_LITERAL("/plugins/foo.plugin");
17 base::FilePath::CharType kBarPath[] = FILE_PATH_LITERAL("/plugins/bar.plugin");
18 const char* kFooName = "Foo Plugin";
19 const char* kFooMimeType = "application/x-foo-mime-type";
20 const char* kFooFileType = "foo";
21 
Equals(const WebPluginInfo & a,const WebPluginInfo & b)22 bool Equals(const WebPluginInfo& a, const WebPluginInfo& b) {
23   return (a.name == b.name && a.path == b.path && a.version == b.version &&
24           a.desc == b.desc);
25 }
26 
Contains(const std::vector<WebPluginInfo> & list,const WebPluginInfo & plugin)27 bool Contains(const std::vector<WebPluginInfo>& list,
28               const WebPluginInfo& plugin) {
29   for (std::vector<WebPluginInfo>::const_iterator it = list.begin();
30        it != list.end(); ++it) {
31     if (Equals(*it, plugin))
32       return true;
33   }
34   return false;
35 }
36 
37 }  // namespace
38 
39 class PluginListTest : public testing::Test {
40  public:
PluginListTest()41   PluginListTest()
42       : foo_plugin_(base::ASCIIToUTF16(kFooName),
43                     base::FilePath(kFooPath),
44                     base::ASCIIToUTF16("1.2.3"),
45                     base::ASCIIToUTF16("foo")),
46         bar_plugin_(base::ASCIIToUTF16("Bar Plugin"),
47                     base::FilePath(kBarPath),
48                     base::ASCIIToUTF16("2.3.4"),
49                     base::ASCIIToUTF16("bar")) {}
50 
SetUp()51   void SetUp() override {
52     plugin_list_.RegisterInternalPlugin(bar_plugin_, false);
53     foo_plugin_.mime_types.push_back(
54         WebPluginMimeType(kFooMimeType, kFooFileType, std::string()));
55     plugin_list_.RegisterInternalPlugin(foo_plugin_, false);
56   }
57 
58  protected:
59   PluginList plugin_list_;
60   WebPluginInfo foo_plugin_;
61   WebPluginInfo bar_plugin_;
62 };
63 
TEST_F(PluginListTest,GetPlugins)64 TEST_F(PluginListTest, GetPlugins) {
65   std::vector<WebPluginInfo> plugins;
66   plugin_list_.GetPlugins(&plugins);
67   EXPECT_EQ(2u, plugins.size());
68   EXPECT_TRUE(Contains(plugins, foo_plugin_));
69   EXPECT_TRUE(Contains(plugins, bar_plugin_));
70 }
71 
TEST_F(PluginListTest,BadPluginDescription)72 TEST_F(PluginListTest, BadPluginDescription) {
73   WebPluginInfo plugin_3043(
74       base::string16(), base::FilePath(FILE_PATH_LITERAL("/myplugin.3.0.43")),
75       base::string16(), base::string16());
76   // Simulate loading of the plugins.
77   plugin_list_.RegisterInternalPlugin(plugin_3043, false);
78   // Now we should have them in the state we specified above.
79   plugin_list_.RefreshPlugins();
80   std::vector<WebPluginInfo> plugins;
81   plugin_list_.GetPlugins(&plugins);
82   ASSERT_TRUE(Contains(plugins, plugin_3043));
83 }
84 
TEST_F(PluginListTest,GetPluginInfoArray)85 TEST_F(PluginListTest, GetPluginInfoArray) {
86   const char kTargetUrl[] = "http://example.com/test.foo";
87   GURL target_url(kTargetUrl);
88   std::vector<WebPluginInfo> plugins;
89   std::vector<std::string> actual_mime_types;
90   bool is_stale;
91 
92   // The PluginList starts out in a stale state.
93   is_stale = plugin_list_.GetPluginInfoArray(
94       target_url, "application/octet-stream",
95       /*allow_wildcard=*/false, &plugins, &actual_mime_types);
96   EXPECT_TRUE(is_stale);
97   EXPECT_EQ(0u, plugins.size());
98   EXPECT_EQ(0u, actual_mime_types.size());
99 
100   // Refresh it.
101   plugin_list_.GetPlugins(&plugins);
102   plugins.clear();
103 
104   // The file type of the URL is supported by |foo_plugin_|. However,
105   // GetPluginInfoArray should not match |foo_plugin_| because the MIME type is
106   // application/octet-stream.
107   is_stale = plugin_list_.GetPluginInfoArray(
108       target_url, "application/octet-stream",
109       /*allow_wildcard=*/false, &plugins, &actual_mime_types);
110   EXPECT_FALSE(is_stale);
111   EXPECT_EQ(0u, plugins.size());
112   EXPECT_EQ(0u, actual_mime_types.size());
113 
114   // |foo_plugin_| matches due to the MIME type.
115   plugins.clear();
116   actual_mime_types.clear();
117   is_stale = plugin_list_.GetPluginInfoArray(target_url, kFooMimeType,
118                                              /*allow_wildcard=*/false, &plugins,
119                                              &actual_mime_types);
120   EXPECT_FALSE(is_stale);
121   EXPECT_EQ(1u, plugins.size());
122   EXPECT_TRUE(Contains(plugins, foo_plugin_));
123   ASSERT_EQ(1u, actual_mime_types.size());
124   EXPECT_EQ(kFooMimeType, actual_mime_types.front());
125 
126   // |foo_plugin_| matches due to the file type and empty MIME type.
127   plugins.clear();
128   actual_mime_types.clear();
129   is_stale = plugin_list_.GetPluginInfoArray(target_url, "",
130                                              /*allow_wildcard=*/false, &plugins,
131                                              &actual_mime_types);
132   EXPECT_FALSE(is_stale);
133   EXPECT_EQ(1u, plugins.size());
134   EXPECT_TRUE(Contains(plugins, foo_plugin_));
135   ASSERT_EQ(1u, actual_mime_types.size());
136   EXPECT_EQ(kFooMimeType, actual_mime_types.front());
137 }
138 
139 }  // namespace content
140