Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / plugins / plugin_info_message_filter.h
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_INFO_MESSAGE_FILTER_H_
6 #define CHROME_BROWSER_PLUGINS_PLUGIN_INFO_MESSAGE_FILTER_H_
7
8 #include <string>
9 #include <vector>
10
11 #include "base/compiler_specific.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/weak_ptr.h"
14 #include "base/prefs/pref_member.h"
15 #include "base/sequenced_task_runner_helpers.h"
16 #include "chrome/browser/plugins/plugin_prefs.h"
17 #include "components/content_settings/core/common/content_settings.h"
18 #include "content/public/browser/browser_message_filter.h"
19
20 struct ChromeViewHostMsg_GetPluginInfo_Output;
21 struct ChromeViewHostMsg_GetPluginInfo_Status;
22 class GURL;
23 class HostContentSettingsMap;
24 class PluginFinder;
25 class PluginMetadata;
26 class Profile;
27
28 namespace content {
29 class ResourceContext;
30 struct WebPluginInfo;
31 }
32
33 // This class filters out incoming IPC messages requesting plug-in information.
34 class PluginInfoMessageFilter : public content::BrowserMessageFilter {
35  public:
36   struct GetPluginInfo_Params;
37
38   // Contains all the information needed by the PluginInfoMessageFilter.
39   class Context {
40    public:
41     Context(int render_process_id, Profile* profile);
42
43     ~Context();
44
45     void DecidePluginStatus(
46         const GetPluginInfo_Params& params,
47         const content::WebPluginInfo& plugin,
48         const PluginMetadata* plugin_metadata,
49         ChromeViewHostMsg_GetPluginInfo_Status* status) const;
50     bool FindEnabledPlugin(int render_frame_id,
51                            const GURL& url,
52                            const GURL& top_origin_url,
53                            const std::string& mime_type,
54                            ChromeViewHostMsg_GetPluginInfo_Status* status,
55                            content::WebPluginInfo* plugin,
56                            std::string* actual_mime_type,
57                            scoped_ptr<PluginMetadata>* plugin_metadata) const;
58     void GetPluginContentSetting(const content::WebPluginInfo& plugin,
59                                  const GURL& policy_url,
60                                  const GURL& plugin_url,
61                                  const std::string& resource,
62                                  ContentSetting* setting,
63                                  bool* is_default,
64                                  bool* is_managed) const;
65     void MaybeGrantAccess(const ChromeViewHostMsg_GetPluginInfo_Status& status,
66                           const base::FilePath& path) const;
67     bool IsPluginEnabled(const content::WebPluginInfo& plugin) const;
68
69    private:
70     int render_process_id_;
71     content::ResourceContext* resource_context_;
72     const HostContentSettingsMap* host_content_settings_map_;
73     scoped_refptr<PluginPrefs> plugin_prefs_;
74
75     BooleanPrefMember allow_outdated_plugins_;
76     BooleanPrefMember always_authorize_plugins_;
77   };
78
79   PluginInfoMessageFilter(int render_process_id, Profile* profile);
80
81   // content::BrowserMessageFilter methods:
82   bool OnMessageReceived(const IPC::Message& message) override;
83   void OnDestruct() const override;
84
85  private:
86   friend struct content::BrowserThread::DeleteOnThread<
87       content::BrowserThread::UI>;
88   friend class base::DeleteHelper<PluginInfoMessageFilter>;
89
90   ~PluginInfoMessageFilter() override;
91
92   void OnGetPluginInfo(int render_frame_id,
93                        const GURL& url,
94                        const GURL& top_origin_url,
95                        const std::string& mime_type,
96                        IPC::Message* reply_msg);
97
98   // |params| wraps the parameters passed to |OnGetPluginInfo|, because
99   // |base::Bind| doesn't support the required arity <http://crbug.com/98542>.
100   void PluginsLoaded(const GetPluginInfo_Params& params,
101                      IPC::Message* reply_msg,
102                      const std::vector<content::WebPluginInfo>& plugins);
103
104 #if defined(ENABLE_PEPPER_CDMS)
105   // Returns whether any internal plugin supporting |mime_type| is registered
106   // and enabled. Does not determine whether the plugin can actually be
107   // instantiated (e.g. whether it has all its dependencies).
108   // When the returned *|is_available| is true, |additional_param_names| and
109   // |additional_param_values| contain the name-value pairs, if any, specified
110   // for the *first* non-disabled plugin found that is registered for
111   // |mime_type|.
112   void OnIsInternalPluginAvailableForMimeType(
113       const std::string& mime_type,
114       bool* is_available,
115       std::vector<base::string16>* additional_param_names,
116       std::vector<base::string16>* additional_param_values);
117 #endif
118
119   Context context_;
120
121   base::WeakPtrFactory<PluginInfoMessageFilter> weak_ptr_factory_;
122   scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
123
124   DISALLOW_COPY_AND_ASSIGN(PluginInfoMessageFilter);
125 };
126
127 #endif  // CHROME_BROWSER_PLUGINS_PLUGIN_INFO_MESSAGE_FILTER_H_