blob: 726efa6350c138f618b58010ec5f745eb6650d02 [file] [log] [blame]
// 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/renderer_host/render_message_filter.h"
#include <errno.h>
#include <string.h>
#include <map>
#include <utility>
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/command_line.h"
#include "base/debug/alias.h"
#include "base/numerics/safe_math.h"
#include "base/stl_util.h"
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/post_task.h"
#include "base/task/thread_pool.h"
#include "base/threading/thread.h"
#include "build/build_config.h"
#include "components/download/public/common/download_stats.h"
#include "content/browser/bad_message.h"
#include "content/browser/blob_storage/chrome_blob_storage_context.h"
#include "content/browser/browser_main_loop.h"
#include "content/browser/child_process_security_policy_impl.h"
#include "content/browser/gpu/gpu_data_manager_impl.h"
#include "content/browser/gpu/gpu_process_host.h"
#include "content/browser/media/media_internals.h"
#include "content/browser/renderer_host/pepper/pepper_security_helper.h"
#include "content/browser/renderer_host/render_process_host_impl.h"
#include "content/browser/renderer_host/render_view_host_delegate.h"
#include "content/browser/renderer_host/render_widget_helper.h"
#include "content/browser/resource_context_impl.h"
#include "content/common/content_constants_internal.h"
#include "content/common/render_message_filter.mojom.h"
#include "content/public/browser/browser_child_process_host.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/resource_context.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/url_constants.h"
#include "gpu/ipc/common/gpu_memory_buffer_impl.h"
#include "ipc/ipc_channel_handle.h"
#include "ipc/ipc_platform_file.h"
#include "media/base/media_log_record.h"
#include "mojo/public/cpp/system/platform_handle.h"
#include "net/base/io_buffer.h"
#include "net/base/mime_util.h"
#include "net/base/request_priority.h"
#include "services/network/public/mojom/network_context.mojom.h"
#include "url/gurl.h"
#include "url/origin.h"
#if defined(OS_WIN)
#include "content/public/common/font_cache_dispatcher_win.h"
#endif
#if defined(OS_POSIX)
#include "base/file_descriptor_posix.h"
#endif
#if defined(OS_MAC)
#include "ui/accelerated_widget_mac/window_resize_helper_mac.h"
#endif
#if defined(OS_LINUX) || defined(OS_CHROMEOS)
#include "base/linux_util.h"
#include "base/threading/platform_thread.h"
#endif
namespace content {
namespace {
const uint32_t kRenderFilteredMessageClasses[] = {FrameMsgStart};
} // namespace
RenderMessageFilter::RenderMessageFilter(
int render_process_id,
BrowserContext* browser_context,
RenderWidgetHelper* render_widget_helper,
MediaInternals* media_internals)
: BrowserMessageFilter(kRenderFilteredMessageClasses,
base::size(kRenderFilteredMessageClasses)),
BrowserAssociatedInterface<mojom::RenderMessageFilter>(this, this),
resource_context_(browser_context->GetResourceContext()),
render_widget_helper_(render_widget_helper),
render_process_id_(render_process_id),
media_internals_(media_internals) {
if (render_widget_helper)
render_widget_helper_->Init(render_process_id_);
}
RenderMessageFilter::~RenderMessageFilter() {
// This function should be called on the IO thread.
DCHECK_CURRENTLY_ON(BrowserThread::IO);
}
bool RenderMessageFilter::OnMessageReceived(const IPC::Message& message) {
return false;
}
void RenderMessageFilter::OnDestruct() const {
const_cast<RenderMessageFilter*>(this)->resource_context_ = nullptr;
BrowserThread::DeleteOnIOThread::Destruct(this);
}
void RenderMessageFilter::GenerateRoutingID(
GenerateRoutingIDCallback callback) {
std::move(callback).Run(render_widget_helper_->GetNextRoutingID());
}
void RenderMessageFilter::GenerateFrameRoutingID(
GenerateFrameRoutingIDCallback callback) {
int32_t routing_id = render_widget_helper_->GetNextRoutingID();
auto frame_token = base::UnguessableToken::Create();
auto devtools_frame_token = base::UnguessableToken::Create();
render_widget_helper_->StoreNextFrameRoutingID(routing_id, frame_token,
devtools_frame_token);
std::move(callback).Run(routing_id, frame_token, devtools_frame_token);
}
#if defined(OS_LINUX) || defined(OS_CHROMEOS)
void RenderMessageFilter::SetThreadPriorityOnFileThread(
base::PlatformThreadId ns_tid,
base::ThreadPriority priority) {
bool ns_pid_supported = false;
pid_t peer_tid = base::FindThreadID(peer_pid(), ns_tid, &ns_pid_supported);
if (peer_tid == -1) {
if (ns_pid_supported)
DLOG(WARNING) << "Could not find tid";
return;
}
if (peer_tid == peer_pid()) {
DLOG(WARNING) << "Changing priority of main thread is not allowed";
return;
}
base::PlatformThread::SetThreadPriority(peer_pid(), peer_tid, priority);
}
#endif
#if defined(OS_LINUX) || defined(OS_CHROMEOS)
void RenderMessageFilter::SetThreadPriority(int32_t ns_tid,
base::ThreadPriority priority) {
constexpr base::TaskTraits kTraits = {
base::MayBlock(), base::TaskPriority::USER_BLOCKING,
base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN};
base::ThreadPool::PostTask(
FROM_HERE, kTraits,
base::BindOnce(&RenderMessageFilter::SetThreadPriorityOnFileThread, this,
static_cast<base::PlatformThreadId>(ns_tid), priority));
}
#endif
void RenderMessageFilter::OnMediaLogRecords(
const std::vector<media::MediaLogRecord>& events) {
// OnMediaLogRecords() is always dispatched to the UI thread for handling.
// See OverrideThreadForMessage().
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (media_internals_)
media_internals_->OnMediaEvents(render_process_id_, events);
}
void RenderMessageFilter::HasGpuProcess(HasGpuProcessCallback callback) {
GpuProcessHost::GetHasGpuProcess(std::move(callback));
}
} // namespace content