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