Home | History | Annotate | Download | only in plugins
      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