blob: e22e6e0f449704dbb28c88be0bbced8279f7f2c8 [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_PLUGINS_PLUGIN_INFO_HOST_IMPL_H_
#define CHROME_BROWSER_PLUGINS_PLUGIN_INFO_HOST_IMPL_H_
#include <memory>
#include <string>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/task/sequenced_task_runner_helpers.h"
#include "chrome/browser/plugins/plugin_metadata.h"
#include "chrome/browser/plugins/plugin_prefs.h"
#include "chrome/common/plugin.mojom.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/keyed_service/core/keyed_service_shutdown_notifier.h"
#include "content/public/browser/browser_thread.h"
#include "extensions/buildflags/buildflags.h"
#include "media/media_buildflags.h"
class GURL;
class HostContentSettingsMap;
class Profile;
namespace content {
struct WebPluginInfo;
} // namespace content
namespace extensions {
class ExtensionRegistry;
}
namespace url {
class Origin;
}
// Implements PluginInfoHost interface.
class PluginInfoHostImpl : public chrome::mojom::PluginInfoHost {
public:
struct GetPluginInfo_Params;
// Contains all the information needed by the PluginInfoHostImpl.
class Context {
public:
Context(int render_process_id, Profile* profile);
~Context();
int render_process_id() { return render_process_id_; }
void DecidePluginStatus(const GURL& url,
const url::Origin& main_frame_origin,
const content::WebPluginInfo& plugin,
PluginMetadata::SecurityStatus security_status,
const std::string& plugin_identifier,
chrome::mojom::PluginStatus* status) const;
bool FindEnabledPlugin(
const GURL& url,
const std::string& mime_type,
chrome::mojom::PluginStatus* status,
content::WebPluginInfo* plugin,
std::string* actual_mime_type,
std::unique_ptr<PluginMetadata>* plugin_metadata) const;
void MaybeGrantAccess(chrome::mojom::PluginStatus status,
const base::FilePath& path) const;
bool IsPluginEnabled(const content::WebPluginInfo& plugin) const;
private:
int render_process_id_;
#if BUILDFLAG(ENABLE_EXTENSIONS)
raw_ptr<extensions::ExtensionRegistry, DanglingUntriaged>
extension_registry_;
#endif
raw_ptr<const HostContentSettingsMap, AcrossTasksDanglingUntriaged>
host_content_settings_map_;
scoped_refptr<PluginPrefs> plugin_prefs_;
};
PluginInfoHostImpl(int render_process_id, Profile* profile);
PluginInfoHostImpl(const PluginInfoHostImpl&) = delete;
PluginInfoHostImpl& operator=(const PluginInfoHostImpl&) = delete;
~PluginInfoHostImpl() override;
// chrome::mojom::PluginInfoHost
void GetPluginInfo(const GURL& url,
const url::Origin& origin,
const std::string& mime_type,
GetPluginInfoCallback callback) override;
static void EnsureFactoryBuilt();
private:
void ShutdownOnUIThread();
// |params| wraps the parameters passed to |OnGetPluginInfo|, because
// |base::Bind| doesn't support the required arity <http://crbug.com/98542>.
void PluginsLoaded(const GetPluginInfo_Params& params,
GetPluginInfoCallback callback,
const std::vector<content::WebPluginInfo>& plugins);
void GetPluginInfoFinish(const GetPluginInfo_Params& params,
chrome::mojom::PluginInfoPtr output,
GetPluginInfoCallback callback,
std::unique_ptr<PluginMetadata> plugin_metadata);
Context context_;
base::CallbackListSubscription shutdown_subscription_;
base::WeakPtrFactory<PluginInfoHostImpl> weak_factory_{this};
};
#endif // CHROME_BROWSER_PLUGINS_PLUGIN_INFO_HOST_IMPL_H_