Commit c8a9fc64 authored by Peter Kvitek's avatar Peter Kvitek Committed by Commit Bot

[headless] Added blink.mojom.BadgeService stub implementation.

This is required because inbound Mojo messages which do not have
a registered handler are considered an error, and the render process
is terminated.

Bug: 1090429
Change-Id: I6979013e55a32f30bb32f2918df5fde8ba852dbc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2530198
Commit-Queue: Peter Kvitek <kvitekp@chromium.org>
Reviewed-by: default avatarAndrey Kosyakov <caseq@chromium.org>
Reviewed-by: default avatarChris Mumford <cmumford@google.com>
Cr-Commit-Position: refs/heads/master@{#827868}
parent 9d99b3b8
...@@ -12,6 +12,7 @@ include_rules = [ ...@@ -12,6 +12,7 @@ include_rules = [
"+storage/common/quota", "+storage/common/quota",
"+third_party/skia/include", "+third_party/skia/include",
"+third_party/blink/public/mojom/quota", "+third_party/blink/public/mojom/quota",
"+third_party/blink/public/mojom/badging",
"+third_party/blink/public/common/renderer_preferences/renderer_preferences.h", "+third_party/blink/public/common/renderer_preferences/renderer_preferences.h",
"+ui/aura", "+ui/aura",
"+ui/compositor", "+ui/compositor",
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/client_certificate_delegate.h" #include "content/public/browser/client_certificate_delegate.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h" #include "content/public/browser/render_view_host.h"
#include "content/public/browser/storage_partition.h" #include "content/public/browser/storage_partition.h"
...@@ -31,6 +32,9 @@ ...@@ -31,6 +32,9 @@
#include "headless/lib/browser/headless_devtools_manager_delegate.h" #include "headless/lib/browser/headless_devtools_manager_delegate.h"
#include "headless/lib/browser/headless_quota_permission_context.h" #include "headless/lib/browser/headless_quota_permission_context.h"
#include "headless/lib/headless_macros.h" #include "headless/lib/headless_macros.h"
#include "mojo/public/cpp/bindings/binder_map.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "net/base/url_util.h" #include "net/base/url_util.h"
#include "net/ssl/client_cert_identity.h" #include "net/ssl/client_cert_identity.h"
#include "printing/buildflags/buildflags.h" #include "printing/buildflags/buildflags.h"
...@@ -109,6 +113,32 @@ int GetCrashSignalFD(const base::CommandLine& command_line, ...@@ -109,6 +113,32 @@ int GetCrashSignalFD(const base::CommandLine& command_line,
} // namespace } // namespace
// Implements a stub BadgeService. This implementation does nothing, but is
// required because inbound Mojo messages which do not have a registered
// handler are considered an error, and the render process is terminated.
// See https://crbug.com/1090429
class HeadlessContentBrowserClient::StubBadgeService
: public blink::mojom::BadgeService {
public:
StubBadgeService() = default;
StubBadgeService(const StubBadgeService&) = delete;
StubBadgeService& operator=(const StubBadgeService&) = delete;
~StubBadgeService() override = default;
void Bind(mojo::PendingReceiver<blink::mojom::BadgeService> receiver) {
receivers_.Add(this, std::move(receiver));
}
void Reset() {}
// blink::mojom::BadgeService:
void SetBadge(blink::mojom::BadgeValuePtr value) override {}
void ClearBadge() override {}
private:
mojo::ReceiverSet<blink::mojom::BadgeService> receivers_;
};
HeadlessContentBrowserClient::HeadlessContentBrowserClient( HeadlessContentBrowserClient::HeadlessContentBrowserClient(
HeadlessBrowserImpl* browser) HeadlessBrowserImpl* browser)
: browser_(browser), : browser_(browser),
...@@ -139,6 +169,13 @@ void HeadlessContentBrowserClient::OverrideWebkitPrefs( ...@@ -139,6 +169,13 @@ void HeadlessContentBrowserClient::OverrideWebkitPrefs(
callback.Run(prefs); callback.Run(prefs);
} }
void HeadlessContentBrowserClient::RegisterBrowserInterfaceBindersForFrame(
content::RenderFrameHost* render_frame_host,
mojo::BinderMapWithContext<content::RenderFrameHost*>* map) {
map->Add<blink::mojom::BadgeService>(base::BindRepeating(
&HeadlessContentBrowserClient::BindBadgeService, base::Unretained(this)));
}
content::DevToolsManagerDelegate* content::DevToolsManagerDelegate*
HeadlessContentBrowserClient::GetDevToolsManagerDelegate() { HeadlessContentBrowserClient::GetDevToolsManagerDelegate() {
return new HeadlessDevToolsManagerDelegate(browser_->GetWeakPtr()); return new HeadlessDevToolsManagerDelegate(browser_->GetWeakPtr());
...@@ -320,4 +357,13 @@ std::string HeadlessContentBrowserClient::GetUserAgent() { ...@@ -320,4 +357,13 @@ std::string HeadlessContentBrowserClient::GetUserAgent() {
return browser_->options()->user_agent; return browser_->options()->user_agent;
} }
void HeadlessContentBrowserClient::BindBadgeService(
content::RenderFrameHost* render_frame_host,
mojo::PendingReceiver<blink::mojom::BadgeService> receiver) {
if (!stub_badge_service_)
stub_badge_service_ = std::make_unique<StubBadgeService>();
stub_badge_service_->Bind(std::move(receiver));
}
} // namespace headless } // namespace headless
...@@ -8,7 +8,9 @@ ...@@ -8,7 +8,9 @@
#include <memory> #include <memory>
#include "content/public/browser/content_browser_client.h" #include "content/public/browser/content_browser_client.h"
#include "content/public/browser/render_frame_host.h"
#include "headless/public/headless_browser.h" #include "headless/public/headless_browser.h"
#include "third_party/blink/public/mojom/badging/badging.mojom.h"
namespace headless { namespace headless {
...@@ -24,6 +26,9 @@ class HeadlessContentBrowserClient : public content::ContentBrowserClient { ...@@ -24,6 +26,9 @@ class HeadlessContentBrowserClient : public content::ContentBrowserClient {
const content::MainFunctionParams&) override; const content::MainFunctionParams&) override;
void OverrideWebkitPrefs(content::RenderViewHost* render_view_host, void OverrideWebkitPrefs(content::RenderViewHost* render_view_host,
blink::web_pref::WebPreferences* prefs) override; blink::web_pref::WebPreferences* prefs) override;
void RegisterBrowserInterfaceBindersForFrame(
content::RenderFrameHost* render_frame_host,
mojo::BinderMapWithContext<content::RenderFrameHost*>* map) override;
content::DevToolsManagerDelegate* GetDevToolsManagerDelegate() override; content::DevToolsManagerDelegate* GetDevToolsManagerDelegate() override;
scoped_refptr<content::QuotaPermissionContext> CreateQuotaPermissionContext() scoped_refptr<content::QuotaPermissionContext> CreateQuotaPermissionContext()
override; override;
...@@ -67,12 +72,20 @@ class HeadlessContentBrowserClient : public content::ContentBrowserClient { ...@@ -67,12 +72,20 @@ class HeadlessContentBrowserClient : public content::ContentBrowserClient {
std::string GetUserAgent() override; std::string GetUserAgent() override;
private: private:
class StubBadgeService;
void BindBadgeService(
content::RenderFrameHost* render_frame_host,
mojo::PendingReceiver<blink::mojom::BadgeService> receiver);
HeadlessBrowserImpl* browser_; // Not owned. HeadlessBrowserImpl* browser_; // Not owned.
// We store the callback here because we may call it from the I/O thread. // We store the callback here because we may call it from the I/O thread.
HeadlessBrowser::Options::AppendCommandLineFlagsCallback HeadlessBrowser::Options::AppendCommandLineFlagsCallback
append_command_line_flags_callback_; append_command_line_flags_callback_;
std::unique_ptr<StubBadgeService> stub_badge_service_;
DISALLOW_COPY_AND_ASSIGN(HeadlessContentBrowserClient); DISALLOW_COPY_AND_ASSIGN(HeadlessContentBrowserClient);
}; };
......
<!doctype html>
<html>
<body>
<script>
navigator.setAppBadge(42);
navigator.clearAppBadge();
</script>
</body>
</html>
...@@ -744,4 +744,17 @@ IN_PROC_BROWSER_TEST_F(HeadlessBrowserTest, AIAFetching) { ...@@ -744,4 +744,17 @@ IN_PROC_BROWSER_TEST_F(HeadlessBrowserTest, AIAFetching) {
EXPECT_EQ(url, last_entry->GetURL()); EXPECT_EQ(url, last_entry->GetURL());
} }
IN_PROC_BROWSER_TEST_F(HeadlessBrowserTest, BadgingAPI) {
EXPECT_TRUE(embedded_test_server()->Start());
HeadlessBrowserContext* browser_context =
browser()->CreateBrowserContextBuilder().Build();
GURL url = embedded_test_server()->GetURL("/badging_api.html");
HeadlessWebContents* web_contents =
browser_context->CreateWebContentsBuilder().SetInitialURL(url).Build();
EXPECT_TRUE(WaitForLoad(web_contents));
}
} // namespace headless } // namespace headless
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment