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 = [
"+storage/common/quota",
"+third_party/skia/include",
"+third_party/blink/public/mojom/quota",
"+third_party/blink/public/mojom/badging",
"+third_party/blink/public/common/renderer_preferences/renderer_preferences.h",
"+ui/aura",
"+ui/compositor",
......
......@@ -20,6 +20,7 @@
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.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_view_host.h"
#include "content/public/browser/storage_partition.h"
......@@ -31,6 +32,9 @@
#include "headless/lib/browser/headless_devtools_manager_delegate.h"
#include "headless/lib/browser/headless_quota_permission_context.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/ssl/client_cert_identity.h"
#include "printing/buildflags/buildflags.h"
......@@ -109,6 +113,32 @@ int GetCrashSignalFD(const base::CommandLine& command_line,
} // 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(
HeadlessBrowserImpl* browser)
: browser_(browser),
......@@ -139,6 +169,13 @@ void HeadlessContentBrowserClient::OverrideWebkitPrefs(
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*
HeadlessContentBrowserClient::GetDevToolsManagerDelegate() {
return new HeadlessDevToolsManagerDelegate(browser_->GetWeakPtr());
......@@ -320,4 +357,13 @@ std::string HeadlessContentBrowserClient::GetUserAgent() {
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
......@@ -8,7 +8,9 @@
#include <memory>
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/render_frame_host.h"
#include "headless/public/headless_browser.h"
#include "third_party/blink/public/mojom/badging/badging.mojom.h"
namespace headless {
......@@ -24,6 +26,9 @@ class HeadlessContentBrowserClient : public content::ContentBrowserClient {
const content::MainFunctionParams&) override;
void OverrideWebkitPrefs(content::RenderViewHost* render_view_host,
blink::web_pref::WebPreferences* prefs) override;
void RegisterBrowserInterfaceBindersForFrame(
content::RenderFrameHost* render_frame_host,
mojo::BinderMapWithContext<content::RenderFrameHost*>* map) override;
content::DevToolsManagerDelegate* GetDevToolsManagerDelegate() override;
scoped_refptr<content::QuotaPermissionContext> CreateQuotaPermissionContext()
override;
......@@ -67,12 +72,20 @@ class HeadlessContentBrowserClient : public content::ContentBrowserClient {
std::string GetUserAgent() override;
private:
class StubBadgeService;
void BindBadgeService(
content::RenderFrameHost* render_frame_host,
mojo::PendingReceiver<blink::mojom::BadgeService> receiver);
HeadlessBrowserImpl* browser_; // Not owned.
// We store the callback here because we may call it from the I/O thread.
HeadlessBrowser::Options::AppendCommandLineFlagsCallback
append_command_line_flags_callback_;
std::unique_ptr<StubBadgeService> stub_badge_service_;
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) {
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
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