| Index: content/browser/plugin_loader_posix.cc
|
| diff --git a/content/browser/plugin_loader_posix.cc b/content/browser/plugin_loader_posix.cc
|
| deleted file mode 100644
|
| index dcfb55812ef45dcab4ce73a674b073a1d9f0f8b9..0000000000000000000000000000000000000000
|
| --- a/content/browser/plugin_loader_posix.cc
|
| +++ /dev/null
|
| @@ -1,237 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/browser/plugin_loader_posix.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/location.h"
|
| -#include "base/metrics/histogram.h"
|
| -#include "base/single_thread_task_runner.h"
|
| -#include "base/thread_task_runner_handle.h"
|
| -#include "content/browser/utility_process_host_impl.h"
|
| -#include "content/common/child_process_host_impl.h"
|
| -#include "content/common/plugin_list.h"
|
| -#include "content/common/utility_messages.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "content/public/browser/plugin_service.h"
|
| -#include "content/public/browser/user_metrics.h"
|
| -
|
| -namespace content {
|
| -
|
| -PluginLoaderPosix::PluginLoaderPosix()
|
| - : next_load_index_(0), loading_plugins_(false) {
|
| -}
|
| -
|
| -void PluginLoaderPosix::GetPlugins(
|
| - const PluginService::GetPluginsCallback& callback) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| -
|
| - std::vector<WebPluginInfo> cached_plugins;
|
| - if (PluginList::Singleton()->GetPluginsNoRefresh(&cached_plugins)) {
|
| - // Can't assume the caller is reentrant.
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, cached_plugins));
|
| - return;
|
| - }
|
| -
|
| - if (!loading_plugins_) {
|
| - loading_plugins_ = true;
|
| - callbacks_.push_back(callback);
|
| -
|
| - // When |loading_plugins_| is set to false, this instance must call
|
| - // SetPlugins().
|
| - PluginList::Singleton()->PrepareForPluginLoading();
|
| -
|
| - BrowserThread::PostTask(BrowserThread::FILE,
|
| - FROM_HERE,
|
| - base::Bind(&PluginLoaderPosix::GetPluginsToLoad,
|
| - make_scoped_refptr(this)));
|
| - } else {
|
| - // If we are currently loading plugins, the plugin list might have been
|
| - // invalidated in the mean time, or might get invalidated before we finish.
|
| - // We'll wait until we have finished the current run, then try to get them
|
| - // again from the plugin list. If it has indeed been invalidated, it will
|
| - // restart plugin loading, otherwise it will immediately run the callback.
|
| - callbacks_.push_back(base::Bind(&PluginLoaderPosix::GetPluginsWrapper,
|
| - make_scoped_refptr(this), callback));
|
| - }
|
| -}
|
| -
|
| -bool PluginLoaderPosix::OnMessageReceived(const IPC::Message& message) {
|
| - bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP(PluginLoaderPosix, message)
|
| - IPC_MESSAGE_HANDLER(UtilityHostMsg_LoadedPlugin, OnPluginLoaded)
|
| - IPC_MESSAGE_HANDLER(UtilityHostMsg_LoadPluginFailed, OnPluginLoadFailed)
|
| - IPC_MESSAGE_UNHANDLED(handled = false)
|
| - IPC_END_MESSAGE_MAP()
|
| - return handled;
|
| -}
|
| -
|
| -void PluginLoaderPosix::OnProcessCrashed(int exit_code) {
|
| - RecordAction(
|
| - base::UserMetricsAction("PluginLoaderPosix.UtilityProcessCrashed"));
|
| -
|
| - if (next_load_index_ == canonical_list_.size()) {
|
| - // How this case occurs is unknown. See crbug.com/111935.
|
| - canonical_list_.clear();
|
| - } else {
|
| - canonical_list_.erase(canonical_list_.begin(),
|
| - canonical_list_.begin() + next_load_index_ + 1);
|
| - }
|
| -
|
| - next_load_index_ = 0;
|
| -
|
| - LoadPluginsInternal();
|
| -}
|
| -
|
| -void PluginLoaderPosix::OnProcessLaunchFailed() {
|
| - FinishedLoadingPlugins();
|
| -}
|
| -
|
| -bool PluginLoaderPosix::Send(IPC::Message* message) {
|
| - if (process_host_.get())
|
| - return process_host_->Send(message);
|
| - return false;
|
| -}
|
| -
|
| -PluginLoaderPosix::~PluginLoaderPosix() {
|
| -}
|
| -
|
| -void PluginLoaderPosix::GetPluginsToLoad() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::FILE);
|
| -
|
| - base::TimeTicks start_time(base::TimeTicks::Now());
|
| -
|
| - loaded_plugins_.clear();
|
| - next_load_index_ = 0;
|
| -
|
| - canonical_list_.clear();
|
| - PluginList::Singleton()->GetPluginPathsToLoad(
|
| - &canonical_list_,
|
| - PluginService::GetInstance()->NPAPIPluginsSupported());
|
| -
|
| - internal_plugins_.clear();
|
| - PluginList::Singleton()->GetInternalPlugins(&internal_plugins_);
|
| -
|
| - BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&PluginLoaderPosix::LoadPluginsInternal,
|
| - make_scoped_refptr(this)));
|
| -
|
| - LOCAL_HISTOGRAM_TIMES("PluginLoaderPosix.GetPluginList",
|
| - (base::TimeTicks::Now() - start_time) *
|
| - base::Time::kMicrosecondsPerMillisecond);
|
| -}
|
| -
|
| -void PluginLoaderPosix::LoadPluginsInternal() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| -
|
| - // Check if the list is empty or all plugins have already been loaded before
|
| - // forking.
|
| - if (IsFinishedLoadingPlugins()) {
|
| - FinishedLoadingPlugins();
|
| - return;
|
| - }
|
| -
|
| - RecordAction(
|
| - base::UserMetricsAction("PluginLoaderPosix.LaunchUtilityProcess"));
|
| -
|
| - UtilityProcessHostImpl* host = new UtilityProcessHostImpl(
|
| - this,
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO).get());
|
| - process_host_ = host->AsWeakPtr();
|
| - process_host_->DisableSandbox();
|
| -
|
| - bool launched = LaunchUtilityProcess();
|
| - if (!launched) {
|
| - // The utility process either failed to start or failed to receive the IPC.
|
| - // This process will never receive any callbacks for OnPluginLoaded() or
|
| - // OnPluginLoadFailed().
|
| - FinishedLoadingPlugins();
|
| - }
|
| -}
|
| -
|
| -void PluginLoaderPosix::GetPluginsWrapper(
|
| - const PluginService::GetPluginsCallback& callback,
|
| - const std::vector<WebPluginInfo>& plugins_unused) {
|
| - // We are being called after plugin loading has finished, but we don't know
|
| - // whether the plugin list has been invalidated in the mean time
|
| - // (and therefore |plugins| might already be stale). So we simply ignore it
|
| - // and call regular GetPlugins() instead.
|
| - GetPlugins(callback);
|
| -}
|
| -
|
| -void PluginLoaderPosix::OnPluginLoaded(uint32_t index,
|
| - const WebPluginInfo& plugin) {
|
| - if (index != next_load_index_) {
|
| - LOG(ERROR) << "Received unexpected plugin load message for "
|
| - << plugin.path.value() << "; index=" << index;
|
| - return;
|
| - }
|
| -
|
| - auto it = FindInternalPlugin(plugin.path);
|
| - if (it != internal_plugins_.end()) {
|
| - loaded_plugins_.push_back(*it);
|
| - internal_plugins_.erase(it);
|
| - } else {
|
| - loaded_plugins_.push_back(plugin);
|
| - }
|
| -
|
| - ++next_load_index_;
|
| -
|
| - if (IsFinishedLoadingPlugins())
|
| - FinishedLoadingPlugins();
|
| -}
|
| -
|
| -void PluginLoaderPosix::OnPluginLoadFailed(uint32_t index,
|
| - const base::FilePath& plugin_path) {
|
| - if (index != next_load_index_) {
|
| - LOG(ERROR) << "Received unexpected plugin load failure message for "
|
| - << plugin_path.value() << "; index=" << index;
|
| - return;
|
| - }
|
| -
|
| - ++next_load_index_;
|
| -
|
| - auto it = FindInternalPlugin(plugin_path);
|
| - if (it != internal_plugins_.end()) {
|
| - loaded_plugins_.push_back(*it);
|
| - internal_plugins_.erase(it);
|
| - }
|
| -
|
| - if (IsFinishedLoadingPlugins())
|
| - FinishedLoadingPlugins();
|
| -}
|
| -
|
| -std::vector<WebPluginInfo>::iterator PluginLoaderPosix::FindInternalPlugin(
|
| - const base::FilePath& plugin_path) {
|
| - return std::find_if(internal_plugins_.begin(), internal_plugins_.end(),
|
| - [&plugin_path](const WebPluginInfo& plugin) {
|
| - return plugin.path == plugin_path;
|
| - });
|
| -}
|
| -
|
| -bool PluginLoaderPosix::IsFinishedLoadingPlugins() {
|
| - if (canonical_list_.empty())
|
| - return true;
|
| -
|
| - DCHECK(next_load_index_ <= canonical_list_.size());
|
| - return next_load_index_ == canonical_list_.size();
|
| -}
|
| -
|
| -void PluginLoaderPosix::FinishedLoadingPlugins() {
|
| - loading_plugins_ = false;
|
| - PluginList::Singleton()->SetPlugins(loaded_plugins_);
|
| -
|
| - for (auto& callback : callbacks_) {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, loaded_plugins_));
|
| - }
|
| - callbacks_.clear();
|
| -}
|
| -
|
| -bool PluginLoaderPosix::LaunchUtilityProcess() {
|
| - return process_host_->Send(new UtilityMsg_LoadPlugins(canonical_list_));
|
| -}
|
| -
|
| -} // namespace content
|
|
|