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