15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/common/plugin_list.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string16.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 10a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "url/gurl.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace content { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbase::FilePath::CharType kFooPath[] = FILE_PATH_LITERAL("/plugins/foo.plugin"); 17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbase::FilePath::CharType kBarPath[] = FILE_PATH_LITERAL("/plugins/bar.plugin"); 18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char* kFooName = "Foo Plugin"; 19a3f7b4e666c476898878fa745f637129375cd889Ben Murdochconst char* kFooMimeType = "application/x-foo-mime-type"; 20a3f7b4e666c476898878fa745f637129375cd889Ben Murdochconst char* kFooFileType = "foo"; 21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Equals(const WebPluginInfo& a, const WebPluginInfo& b) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (a.name == b.name && 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.path == b.path && 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.version == b.version && 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.desc == b.desc); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Contains(const std::vector<WebPluginInfo>& list, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebPluginInfo& plugin) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<WebPluginInfo>::const_iterator it = list.begin(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != list.end(); ++it) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Equals(*it, plugin)) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginListTest : public testing::Test { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginListTest() 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : foo_plugin_(base::ASCIIToUTF16(kFooName), 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(kFooPath), 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16("1.2.3"), 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16("foo")), 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bar_plugin_(base::ASCIIToUTF16("Bar Plugin"), 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(kBarPath), 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16("2.3.4"), 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16("bar")) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch plugin_list_.DisablePluginsDiscovery(); 56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch plugin_list_.RegisterInternalPlugin(bar_plugin_, false); 57a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch foo_plugin_.mime_types.push_back( 58a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch WebPluginMimeType(kFooMimeType, kFooFileType, std::string())); 59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch plugin_list_.RegisterInternalPlugin(foo_plugin_, false); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PluginList plugin_list_; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPluginInfo foo_plugin_; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPluginInfo bar_plugin_; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PluginListTest, GetPlugins) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<WebPluginInfo> plugins; 70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch plugin_list_.GetPlugins(&plugins, true); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, plugins.size()); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Contains(plugins, foo_plugin_)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Contains(plugins, bar_plugin_)); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PluginListTest, BadPluginDescription) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPluginInfo plugin_3043( 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16(), base::FilePath(FILE_PATH_LITERAL("/myplugin.3.0.43")), 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16(), base::string16()); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate loading of the plugins. 81ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch plugin_list_.RegisterInternalPlugin(plugin_3043, false); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we should have them in the state we specified above. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_list_.RefreshPlugins(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<WebPluginInfo> plugins; 85ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch plugin_list_.GetPlugins(&plugins, true); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Contains(plugins, plugin_3043)); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(PluginListTest, GetPluginInfoArray) { 90a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch const char kTargetUrl[] = "http://example.com/test.foo"; 91a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch GURL target_url(kTargetUrl); 92a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch std::vector<WebPluginInfo> plugins; 93a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch std::vector<std::string> actual_mime_types; 94a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 95a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // The file type of the URL is supported by foo_plugin_. However, 96a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // GetPluginInfoArray should not match foo_plugin_ because the MIME type is 97a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // application/octet-stream. 98a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch plugin_list_.GetPluginInfoArray(target_url, 99a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch "application/octet-stream", 100a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch false, // allow_wildcard 101a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch NULL, // use_stale 102a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch false, // include_npapi 103a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch &plugins, 104a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch &actual_mime_types); 105a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EXPECT_EQ(0u, plugins.size()); 106a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EXPECT_EQ(0u, actual_mime_types.size()); 107a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 108a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // foo_plugin_ matches due to the MIME type. 109a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch plugins.clear(); 110a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch actual_mime_types.clear(); 111a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch plugin_list_.GetPluginInfoArray(target_url, 112a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch kFooMimeType, 113a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch false, // allow_wildcard 114a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch NULL, // use_stale 115a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch false, // include_npapi 116a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch &plugins, 117a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch &actual_mime_types); 118a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EXPECT_EQ(1u, plugins.size()); 119a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EXPECT_TRUE(Contains(plugins, foo_plugin_)); 120a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch ASSERT_EQ(1u, actual_mime_types.size()); 121a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EXPECT_EQ(kFooMimeType, actual_mime_types.front()); 122a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 123a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // foo_plugin_ matches due to the file type and empty MIME type. 124a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch plugins.clear(); 125a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch actual_mime_types.clear(); 126a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch plugin_list_.GetPluginInfoArray(target_url, 127a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch "", 128a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch false, // allow_wildcard 129a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch NULL, // use_stale 130a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch false, // include_npapi 131a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch &plugins, 132a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch &actual_mime_types); 133a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EXPECT_EQ(1u, plugins.size()); 134a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EXPECT_TRUE(Contains(plugins, foo_plugin_)); 135a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch ASSERT_EQ(1u, actual_mime_types.size()); 136a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EXPECT_EQ(kFooMimeType, actual_mime_types.front()); 137a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 138a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 139ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} // namespace content 140