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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_PLUGINS_PLUGIN_INFO_MESSAGE_FILTER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_PLUGINS_PLUGIN_INFO_MESSAGE_FILTER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
12e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch#include "base/memory/ref_counted.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner_helpers.h"
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/plugins/plugin_prefs.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_message_filter.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ChromeViewHostMsg_GetPluginInfo_Output;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ChromeViewHostMsg_GetPluginInfo_Status;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HostContentSettingsMap;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginFinder;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginMetadata;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceContext;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct WebPluginInfo;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class filters out incoming IPC messages requesting plug-in information.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginInfoMessageFilter : public content::BrowserMessageFilter {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct GetPluginInfo_Params;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Contains all the information needed by the PluginInfoMessageFilter.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Context {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Context(int render_process_id, Profile* profile);
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~Context();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void DecidePluginStatus(
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const GetPluginInfo_Params& params,
47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        const content::WebPluginInfo& plugin,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const PluginMetadata* plugin_metadata,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ChromeViewHostMsg_GetPluginInfo_Status* status) const;
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool FindEnabledPlugin(int render_frame_id,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const GURL& url,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const GURL& top_origin_url,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& mime_type,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ChromeViewHostMsg_GetPluginInfo_Status* status,
55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                           content::WebPluginInfo* plugin,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           std::string* actual_mime_type,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           scoped_ptr<PluginMetadata>* plugin_metadata) const;
58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    void GetPluginContentSetting(const content::WebPluginInfo& plugin,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const GURL& policy_url,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const GURL& plugin_url,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const std::string& resource,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 ContentSetting* setting,
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 bool* is_default,
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 bool* is_managed) const;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void MaybeGrantAccess(const ChromeViewHostMsg_GetPluginInfo_Status& status,
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const base::FilePath& path) const;
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    bool IsPluginEnabled(const content::WebPluginInfo& plugin) const;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int render_process_id_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceContext* resource_context_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HostContentSettingsMap* host_content_settings_map_;
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<PluginPrefs> plugin_prefs_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BooleanPrefMember allow_outdated_plugins_;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BooleanPrefMember always_authorize_plugins_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginInfoMessageFilter(int render_process_id, Profile* profile);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::BrowserMessageFilter methods:
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDestruct() const OVERRIDE;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct content::BrowserThread::DeleteOnThread<
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::BrowserThread::UI>;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::DeleteHelper<PluginInfoMessageFilter>;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PluginInfoMessageFilter();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void OnGetPluginInfo(int render_frame_id,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const GURL& url,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const GURL& top_origin_url,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const std::string& mime_type,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       IPC::Message* reply_msg);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |params| wraps the parameters passed to |OnGetPluginInfo|, because
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |base::Bind| doesn't support the required arity <http://crbug.com/98542>.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PluginsLoaded(const GetPluginInfo_Params& params,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     IPC::Message* reply_msg,
102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                     const std::vector<content::WebPluginInfo>& plugins);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_PEPPER_CDMS)
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Returns whether any internal plugin supporting |mime_type| is registered
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // and enabled. Does not determine whether the plugin can actually be
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // instantiated (e.g. whether it has all its dependencies).
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // When the returned *|is_available| is true, |additional_param_names| and
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // |additional_param_values| contain the name-value pairs, if any, specified
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // for the *first* non-disabled plugin found that is registered for
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // |mime_type|.
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void OnIsInternalPluginAvailableForMimeType(
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      const std::string& mime_type,
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      bool* is_available,
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      std::vector<base::string16>* additional_param_names,
1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      std::vector<base::string16>* additional_param_values);
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Context context_;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<PluginInfoMessageFilter> weak_ptr_factory_;
122e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PluginInfoMessageFilter);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_BROWSER_PLUGINS_PLUGIN_INFO_MESSAGE_FILTER_H_
128