blob: 74cad31c43f6858fd63ba68f770fbfdefa71c325 [file] [log] [blame]
// Copyright 2018 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/process_internals/process_internals_ui.h"
#include <memory>
#include "base/bind.h"
#include "base/macros.h"
#include "content/grit/content_resources.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
#include "content/public/browser/web_ui_message_handler.h"
#include "content/public/common/bindings_policy.h"
#include "content/public/common/url_constants.h"
#include "content/browser/process_internals/process_internals.mojom.h"
#include "content/browser/process_internals/process_internals_handler_impl.h"
#include "content/public/common/bindings_policy.h"
#include "mojo/public/cpp/bindings/binding.h"
namespace content {
ProcessInternalsUI::ProcessInternalsUI(WebUI* web_ui)
: WebUIController(web_ui), WebContentsObserver(web_ui->GetWebContents()) {
// Grant only Mojo WebUI bindings, since this WebUI will not use
// chrome.send().
web_ui->SetBindings(content::BINDINGS_POLICY_MOJO_WEB_UI);
// Create a WebUIDataSource to serve the HTML/JS files to the WebUI.
WebUIDataSource* source =
WebUIDataSource::Create(kChromeUIProcessInternalsHost);
source->AddResourcePath("url.mojom.js", IDR_URL_MOJO_JS);
source->AddResourcePath("process_internals.js", IDR_PROCESS_INTERNALS_JS);
source->AddResourcePath("process_internals.css", IDR_PROCESS_INTERNALS_CSS);
source->AddResourcePath("process_internals.mojom.js",
IDR_PROCESS_INTERNALS_MOJO_JS);
source->SetDefaultResource(IDR_PROCESS_INTERNALS_HTML);
source->UseGzip();
WebUIDataSource::Add(web_contents()->GetBrowserContext(), source);
AddHandlerToRegistry(
base::BindRepeating(&ProcessInternalsUI::BindProcessInternalsHandler,
base::Unretained(this)));
}
ProcessInternalsUI::~ProcessInternalsUI() = default;
void ProcessInternalsUI::BindProcessInternalsHandler(
::mojom::ProcessInternalsHandlerRequest request,
RenderFrameHost* render_frame_host) {
ui_handler_ = std::make_unique<ProcessInternalsHandlerImpl>(
render_frame_host->GetSiteInstance()->GetBrowserContext(),
std::move(request));
}
void ProcessInternalsUI::OnInterfaceRequestFromFrame(
RenderFrameHost* render_frame_host,
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) {
// This should not be requested by subframes, so terminate the renderer if
// it issues such a request.
if (render_frame_host->GetParent()) {
render_frame_host->GetProcess()->ShutdownForBadMessage(
content::RenderProcessHost::CrashReportMode::GENERATE_CRASH_DUMP);
return;
}
registry_.TryBindInterface(interface_name, interface_pipe, render_frame_host);
}
} // namespace content