fix: navigator.setAppBadge/clearAppBadge from a service worker (#27950)
This commit is contained in:
parent
d92bab0e29
commit
afb7d9f550
7 changed files with 202 additions and 26 deletions
|
@ -47,6 +47,27 @@ void BadgeManager::BindFrameReceiver(
|
|||
std::move(context));
|
||||
}
|
||||
|
||||
void BadgeManager::BindServiceWorkerReceiver(
|
||||
content::RenderProcessHost* service_worker_process_host,
|
||||
const GURL& service_worker_scope,
|
||||
mojo::PendingReceiver<blink::mojom::BadgeService> receiver) {
|
||||
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
||||
|
||||
auto* browser_context = service_worker_process_host->GetBrowserContext();
|
||||
|
||||
auto* badge_manager =
|
||||
badging::BadgeManagerFactory::GetInstance()->GetForBrowserContext(
|
||||
browser_context);
|
||||
if (!badge_manager)
|
||||
return;
|
||||
|
||||
auto context = std::make_unique<BadgeManager::ServiceWorkerBindingContext>(
|
||||
service_worker_process_host->GetID(), service_worker_scope);
|
||||
|
||||
badge_manager->receivers_.Add(badge_manager, std::move(receiver),
|
||||
std::move(context));
|
||||
}
|
||||
|
||||
std::string BadgeManager::GetBadgeString(base::Optional<int> badge_content) {
|
||||
if (!badge_content)
|
||||
return "•";
|
||||
|
|
|
@ -37,6 +37,10 @@ class BadgeManager : public KeyedService, public blink::mojom::BadgeService {
|
|||
static void BindFrameReceiver(
|
||||
content::RenderFrameHost* frame,
|
||||
mojo::PendingReceiver<blink::mojom::BadgeService> receiver);
|
||||
static void BindServiceWorkerReceiver(
|
||||
content::RenderProcessHost* service_worker_process_host,
|
||||
const GURL& service_worker_scope,
|
||||
mojo::PendingReceiver<blink::mojom::BadgeService> receiver);
|
||||
|
||||
// Determines the text to put on the badge based on some badge_content.
|
||||
static std::string GetBadgeString(base::Optional<int> badge_content);
|
||||
|
@ -66,6 +70,21 @@ class BadgeManager : public KeyedService, public blink::mojom::BadgeService {
|
|||
int frame_id_;
|
||||
};
|
||||
|
||||
// The BindingContext for ServiceWorkerGlobalScope execution contexts.
|
||||
class ServiceWorkerBindingContext final : public BindingContext {
|
||||
public:
|
||||
ServiceWorkerBindingContext(int process_id, const GURL& scope)
|
||||
: process_id_(process_id), scope_(scope) {}
|
||||
~ServiceWorkerBindingContext() override = default;
|
||||
|
||||
int GetProcessId() { return process_id_; }
|
||||
GURL GetScope() { return scope_; }
|
||||
|
||||
private:
|
||||
int process_id_;
|
||||
GURL scope_;
|
||||
};
|
||||
|
||||
// blink::mojom::BadgeService:
|
||||
// Note: These are private to stop them being called outside of mojo as they
|
||||
// require a mojo binding context.
|
||||
|
|
|
@ -1776,4 +1776,12 @@ content::BluetoothDelegate* ElectronBrowserClient::GetBluetoothDelegate() {
|
|||
return bluetooth_delegate_.get();
|
||||
}
|
||||
|
||||
void ElectronBrowserClient::BindBadgeServiceReceiverFromServiceWorker(
|
||||
content::RenderProcessHost* service_worker_process_host,
|
||||
const GURL& service_worker_scope,
|
||||
mojo::PendingReceiver<blink::mojom::BadgeService> receiver) {
|
||||
badging::BadgeManager::BindServiceWorkerReceiver(
|
||||
service_worker_process_host, service_worker_scope, std::move(receiver));
|
||||
}
|
||||
|
||||
} // namespace electron
|
||||
|
|
|
@ -73,6 +73,10 @@ class ElectronBrowserClient : public content::ContentBrowserClient,
|
|||
void RegisterBrowserInterfaceBindersForFrame(
|
||||
content::RenderFrameHost* render_frame_host,
|
||||
mojo::BinderMapWithContext<content::RenderFrameHost*>* map) override;
|
||||
void BindBadgeServiceReceiverFromServiceWorker(
|
||||
content::RenderProcessHost* service_worker_process_host,
|
||||
const GURL& service_worker_scope,
|
||||
mojo::PendingReceiver<blink::mojom::BadgeService> receiver) override;
|
||||
#if defined(OS_LINUX)
|
||||
void GetAdditionalMappedFilesForChildProcess(
|
||||
const base::CommandLine& command_line,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue