diff options
Diffstat (limited to 'chromium/content/shell/renderer')
5 files changed, 327 insertions, 0 deletions
diff --git a/chromium/content/shell/renderer/DEPS b/chromium/content/shell/renderer/DEPS new file mode 100644 index 00000000000..be12c35170d --- /dev/null +++ b/chromium/content/shell/renderer/DEPS @@ -0,0 +1,4 @@ +include_rules = [ + "+components/cdm", + "+components/web_cache/renderer", +] diff --git a/chromium/content/shell/renderer/shell_content_renderer_client.cc b/chromium/content/shell/renderer/shell_content_renderer_client.cc new file mode 100644 index 00000000000..0194e1cad69 --- /dev/null +++ b/chromium/content/shell/renderer/shell_content_renderer_client.cc @@ -0,0 +1,204 @@ +// 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/shell/renderer/shell_content_renderer_client.h" + +#include <string> + +#include "base/bind.h" +#include "base/check_op.h" +#include "base/command_line.h" +#include "base/notreached.h" +#include "base/strings/string_number_conversions.h" +#include "components/cdm/renderer/external_clear_key_key_system_properties.h" +#include "components/web_cache/renderer/web_cache_impl.h" +#include "content/public/test/test_service.mojom.h" +#include "content/shell/common/power_monitor_test_impl.h" +#include "content/shell/common/shell_switches.h" +#include "content/shell/renderer/shell_render_frame_observer.h" +#include "mojo/public/cpp/bindings/binder_map.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/system/message_pipe.h" +#include "net/base/net_errors.h" +#include "ppapi/buildflags/buildflags.h" +#include "sandbox/policy/sandbox.h" +#include "third_party/blink/public/platform/web_url_error.h" +#include "third_party/blink/public/web/web_testing_support.h" +#include "third_party/blink/public/web/web_view.h" +#include "v8/include/v8.h" + +#if BUILDFLAG(ENABLE_PLUGINS) +#include "ppapi/shared_impl/ppapi_switches.h" // nogncheck +#endif + +#if BUILDFLAG(ENABLE_MOJO_CDM) +#include "base/feature_list.h" +#include "media/base/media_switches.h" +#endif + +namespace content { + +namespace { + +// A test service which can be driven by browser tests for various reasons. +class TestRendererServiceImpl : public mojom::TestService { + public: + explicit TestRendererServiceImpl( + mojo::PendingReceiver<mojom::TestService> receiver) + : receiver_(this, std::move(receiver)) { + receiver_.set_disconnect_handler(base::BindOnce( + &TestRendererServiceImpl::OnConnectionError, base::Unretained(this))); + } + + TestRendererServiceImpl(const TestRendererServiceImpl&) = delete; + TestRendererServiceImpl& operator=(const TestRendererServiceImpl&) = delete; + + ~TestRendererServiceImpl() override {} + + private: + void OnConnectionError() { delete this; } + + // mojom::TestService: + void DoSomething(DoSomethingCallback callback) override { + // Instead of responding normally, unbind the pipe, write some garbage, + // and go away. + const std::string kBadMessage = "This is definitely not a valid response!"; + mojo::ScopedMessagePipeHandle pipe = receiver_.Unbind().PassPipe(); + MojoResult rv = mojo::WriteMessageRaw( + pipe.get(), kBadMessage.data(), kBadMessage.size(), nullptr, 0, + MOJO_WRITE_MESSAGE_FLAG_NONE); + DCHECK_EQ(rv, MOJO_RESULT_OK); + + // Deletes this. + OnConnectionError(); + } + + void DoTerminateProcess(DoTerminateProcessCallback callback) override { + NOTREACHED(); + } + + void DoCrashImmediately(DoCrashImmediatelyCallback callback) override { + NOTREACHED(); + } + + void CreateFolder(CreateFolderCallback callback) override { NOTREACHED(); } + + void GetRequestorName(GetRequestorNameCallback callback) override { + std::move(callback).Run("Not implemented."); + } + + void CreateReadOnlySharedMemoryRegion( + const std::string& message, + CreateReadOnlySharedMemoryRegionCallback callback) override { + NOTREACHED(); + } + + void CreateWritableSharedMemoryRegion( + const std::string& message, + CreateWritableSharedMemoryRegionCallback callback) override { + NOTREACHED(); + } + + void CreateUnsafeSharedMemoryRegion( + const std::string& message, + CreateUnsafeSharedMemoryRegionCallback callback) override { + NOTREACHED(); + } + + void IsProcessSandboxed(IsProcessSandboxedCallback callback) override { + std::move(callback).Run(sandbox::policy::Sandbox::IsProcessSandboxed()); + } + + mojo::Receiver<mojom::TestService> receiver_; +}; + +void CreateRendererTestService( + mojo::PendingReceiver<mojom::TestService> receiver) { + // Owns itself. + new TestRendererServiceImpl(std::move(receiver)); +} + +} // namespace + +ShellContentRendererClient::ShellContentRendererClient() {} + +ShellContentRendererClient::~ShellContentRendererClient() { +} + +void ShellContentRendererClient::RenderThreadStarted() { + web_cache_impl_ = std::make_unique<web_cache::WebCacheImpl>(); +} + +void ShellContentRendererClient::ExposeInterfacesToBrowser( + mojo::BinderMap* binders) { + binders->Add(base::BindRepeating(&CreateRendererTestService), + base::ThreadTaskRunnerHandle::Get()); + binders->Add( + base::BindRepeating(&PowerMonitorTestImpl::MakeSelfOwnedReceiver), + base::ThreadTaskRunnerHandle::Get()); + binders->Add(base::BindRepeating(&web_cache::WebCacheImpl::BindReceiver, + base::Unretained(web_cache_impl_.get())), + base::ThreadTaskRunnerHandle::Get()); +} + +void ShellContentRendererClient::RenderFrameCreated(RenderFrame* render_frame) { + // TODO(danakj): The ShellRenderFrameObserver is doing stuff only for + // browser tests. If we only create that for browser tests then the override + // of this method in WebTestContentRendererClient would not be needed. + new ShellRenderFrameObserver(render_frame); +} + +void ShellContentRendererClient::PrepareErrorPage( + RenderFrame* render_frame, + const blink::WebURLError& error, + const std::string& http_method, + content::mojom::AlternativeErrorPageOverrideInfoPtr + alternative_error_page_info, + std::string* error_html) { + if (error_html && error_html->empty()) { + *error_html = + "<head><title>Error</title></head><body>Could not load the requested " + "resource.<br/>Error code: " + + base::NumberToString(error.reason()) + + (error.reason() < 0 ? " (" + net::ErrorToString(error.reason()) + ")" + : "") + + "</body>"; + } +} + +void ShellContentRendererClient::PrepareErrorPageForHttpStatusError( + content::RenderFrame* render_frame, + const blink::WebURLError& error, + const std::string& http_method, + int http_status, + content::mojom::AlternativeErrorPageOverrideInfoPtr + alternative_error_page_info, + std::string* error_html) { + if (error_html) { + *error_html = + "<head><title>Error</title></head><body>Server returned HTTP status " + + base::NumberToString(http_status) + "</body>"; + } +} + +void ShellContentRendererClient::DidInitializeWorkerContextOnWorkerThread( + v8::Local<v8::Context> context) { + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kExposeInternalsForTesting)) { + blink::WebTestingSupport::InjectInternalsObject(context); + } +} + +#if BUILDFLAG(ENABLE_MOJO_CDM) +void ShellContentRendererClient::GetSupportedKeySystems( + media::GetSupportedKeySystemsCB cb) { + media::KeySystemPropertiesVector key_systems; + if (base::FeatureList::IsEnabled(media::kExternalClearKeyForTesting)) + key_systems.push_back(std::make_unique<cdm::ExternalClearKeyProperties>()); + std::move(cb).Run(std::move(key_systems)); +} +#endif + +} // namespace content diff --git a/chromium/content/shell/renderer/shell_content_renderer_client.h b/chromium/content/shell/renderer/shell_content_renderer_client.h new file mode 100644 index 00000000000..617af079d6c --- /dev/null +++ b/chromium/content/shell/renderer/shell_content_renderer_client.h @@ -0,0 +1,59 @@ +// 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. + +#ifndef CONTENT_SHELL_RENDERER_SHELL_CONTENT_RENDERER_CLIENT_H_ +#define CONTENT_SHELL_RENDERER_SHELL_CONTENT_RENDERER_CLIENT_H_ + +#include <memory> +#include <string> + +#include "build/build_config.h" +#include "content/public/common/alternative_error_page_override_info.mojom-forward.h" +#include "content/public/renderer/content_renderer_client.h" +#include "media/mojo/buildflags.h" + +namespace web_cache { +class WebCacheImpl; +} + +namespace content { + +class ShellContentRendererClient : public ContentRendererClient { + public: + ShellContentRendererClient(); + ~ShellContentRendererClient() override; + + // ContentRendererClient implementation. + void RenderThreadStarted() override; + void ExposeInterfacesToBrowser(mojo::BinderMap* binders) override; + void RenderFrameCreated(RenderFrame* render_frame) override; + void PrepareErrorPage(RenderFrame* render_frame, + const blink::WebURLError& error, + const std::string& http_method, + content::mojom::AlternativeErrorPageOverrideInfoPtr + alternative_error_page_info, + std::string* error_html) override; + void PrepareErrorPageForHttpStatusError( + content::RenderFrame* render_frame, + const blink::WebURLError& error, + const std::string& http_method, + int http_status, + content::mojom::AlternativeErrorPageOverrideInfoPtr + alternative_error_page_info, + std::string* error_html) override; + + void DidInitializeWorkerContextOnWorkerThread( + v8::Local<v8::Context> context) override; + +#if BUILDFLAG(ENABLE_MOJO_CDM) + void GetSupportedKeySystems(media::GetSupportedKeySystemsCB cb) override; +#endif + + private: + std::unique_ptr<web_cache::WebCacheImpl> web_cache_impl_; +}; + +} // namespace content + +#endif // CONTENT_SHELL_RENDERER_SHELL_CONTENT_RENDERER_CLIENT_H_ diff --git a/chromium/content/shell/renderer/shell_render_frame_observer.cc b/chromium/content/shell/renderer/shell_render_frame_observer.cc new file mode 100644 index 00000000000..ed6134a67e3 --- /dev/null +++ b/chromium/content/shell/renderer/shell_render_frame_observer.cc @@ -0,0 +1,32 @@ +// Copyright 2020 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/shell/renderer/shell_render_frame_observer.h" + +#include "base/command_line.h" +#include "content/public/renderer/render_frame.h" +#include "content/public/renderer/render_frame_observer.h" +#include "content/shell/common/shell_switches.h" +#include "third_party/blink/public/web/web_testing_support.h" + +namespace content { + +ShellRenderFrameObserver::ShellRenderFrameObserver(RenderFrame* render_frame) + : RenderFrameObserver(render_frame) {} + +ShellRenderFrameObserver::~ShellRenderFrameObserver() = default; + +void ShellRenderFrameObserver::DidClearWindowObject() { + auto& cmd = *base::CommandLine::ForCurrentProcess(); + if (cmd.HasSwitch(switches::kExposeInternalsForTesting)) { + blink::WebTestingSupport::InjectInternalsObject( + render_frame()->GetWebFrame()); + } +} + +void ShellRenderFrameObserver::OnDestruct() { + delete this; +} + +} // namespace content diff --git a/chromium/content/shell/renderer/shell_render_frame_observer.h b/chromium/content/shell/renderer/shell_render_frame_observer.h new file mode 100644 index 00000000000..2f40722cf4b --- /dev/null +++ b/chromium/content/shell/renderer/shell_render_frame_observer.h @@ -0,0 +1,28 @@ +// Copyright 2020 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. + +#ifndef CONTENT_SHELL_RENDERER_SHELL_RENDER_FRAME_OBSERVER_H_ +#define CONTENT_SHELL_RENDERER_SHELL_RENDER_FRAME_OBSERVER_H_ + +#include "content/public/renderer/render_frame_observer.h" + +namespace content { + +class ShellRenderFrameObserver : public RenderFrameObserver { + public: + explicit ShellRenderFrameObserver(RenderFrame* frame); + ~ShellRenderFrameObserver() override; + + ShellRenderFrameObserver(const ShellRenderFrameObserver&) = delete; + ShellRenderFrameObserver& operator=(const ShellRenderFrameObserver&) = delete; + + private: + // RenderFrameObserver implementation. + void DidClearWindowObject() override; + void OnDestruct() override; +}; + +} // namespace content + +#endif // CONTENT_SHELL_RENDERER_SHELL_RENDER_FRAME_OBSERVER_H_ |