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 #ifndef CHROME_BROWSER_PLUGINS_PLUGIN_FINDER_H_ 6 #define CHROME_BROWSER_PLUGINS_PLUGIN_FINDER_H_ 7 8 #include <map> 9 #include <string> 10 11 #include "base/callback.h" 12 #include "base/gtest_prod_util.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/singleton.h" 15 #include "base/strings/string16.h" 16 #include "base/synchronization/lock.h" 17 #include "content/public/common/webplugininfo.h" 18 19 namespace base { 20 class DictionaryValue; 21 } 22 23 class GURL; 24 class PluginMetadata; 25 class PrefRegistrySimple; 26 27 #if defined(ENABLE_PLUGIN_INSTALLATION) 28 class PluginInstaller; 29 #endif 30 31 // This class should be created and initialized by calling 32 // |GetInstance()| and |Init()| on the UI thread. 33 // After that it can be safely used on any other thread. 34 class PluginFinder { 35 public: 36 static void RegisterPrefs(PrefRegistrySimple* registry); 37 38 static PluginFinder* GetInstance(); 39 40 // It should be called on the UI thread. 41 void Init(); 42 43 void ReinitializePlugins(const base::DictionaryValue* json_metadata); 44 45 #if defined(ENABLE_PLUGIN_INSTALLATION) 46 // Finds a plug-in for the given MIME type and language (specified as an IETF 47 // language tag, i.e. en-US). If found, sets |installer| to the 48 // corresponding PluginInstaller and |plugin_metadata| to a copy of the 49 // corresponding PluginMetadata. 50 bool FindPlugin(const std::string& mime_type, 51 const std::string& language, 52 PluginInstaller** installer, 53 scoped_ptr<PluginMetadata>* plugin_metadata); 54 55 // Finds the plug-in with the given identifier. If found, sets |installer| 56 // to the corresponding PluginInstaller and |plugin_metadata| to a copy 57 // of the corresponding PluginMetadata. |installer| may be NULL. 58 bool FindPluginWithIdentifier(const std::string& identifier, 59 PluginInstaller** installer, 60 scoped_ptr<PluginMetadata>* plugin_metadata); 61 #endif 62 63 // Returns the plug-in name with the given identifier. 64 base::string16 FindPluginNameWithIdentifier(const std::string& identifier); 65 66 // Gets plug-in metadata using |plugin|. 67 scoped_ptr<PluginMetadata> GetPluginMetadata( 68 const content::WebPluginInfo& plugin); 69 70 private: 71 friend struct DefaultSingletonTraits<PluginFinder>; 72 friend class Singleton<PluginFinder>; 73 FRIEND_TEST_ALL_PREFIXES(PluginFinderTest, JsonSyntax); 74 FRIEND_TEST_ALL_PREFIXES(PluginFinderTest, PluginGroups); 75 76 PluginFinder(); 77 ~PluginFinder(); 78 79 // Loads the plug-in information from the browser resources and parses it. 80 // Returns NULL if the plug-in list couldn't be parsed. 81 static base::DictionaryValue* LoadBuiltInPluginList(); 82 83 #if defined(ENABLE_PLUGIN_INSTALLATION) 84 std::map<std::string, PluginInstaller*> installers_; 85 #endif 86 87 std::map<std::string, PluginMetadata*> identifier_plugin_; 88 89 // Version of the metadata information. We use this to consolidate multiple 90 // sources (baked into resource and fetched from a URL), making sure that we 91 // don't overwrite newer versions with older ones. 92 int version_; 93 94 // Synchronization for the above member variables is 95 // required since multiple threads can be accessing them concurrently. 96 base::Lock mutex_; 97 98 DISALLOW_COPY_AND_ASSIGN(PluginFinder); 99 }; 100 101 #endif // CHROME_BROWSER_PLUGINS_PLUGIN_FINDER_H_ 102