mirror of https://github.com/electron/electron
109 lines
3.6 KiB
C++
109 lines
3.6 KiB
C++
// 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.
|
|
|
|
#ifndef ELECTRON_SHELL_BROWSER_BADGING_BADGE_MANAGER_H_
|
|
#define ELECTRON_SHELL_BROWSER_BADGING_BADGE_MANAGER_H_
|
|
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <string>
|
|
|
|
#include "components/keyed_service/core/keyed_service.h"
|
|
#include "mojo/public/cpp/bindings/receiver_set.h"
|
|
#include "third_party/blink/public/mojom/badging/badging.mojom.h"
|
|
#include "url/gurl.h"
|
|
|
|
namespace content {
|
|
class RenderFrameHost;
|
|
class RenderProcessHost;
|
|
} // namespace content
|
|
|
|
namespace badging {
|
|
|
|
// The maximum value of badge contents before saturation occurs.
|
|
constexpr int kMaxBadgeContent = 99;
|
|
|
|
// Maintains a record of badge contents and dispatches badge changes to a
|
|
// delegate.
|
|
class BadgeManager : public KeyedService, public blink::mojom::BadgeService {
|
|
public:
|
|
BadgeManager();
|
|
~BadgeManager() override;
|
|
|
|
// disable copy
|
|
BadgeManager(const BadgeManager&) = delete;
|
|
BadgeManager& operator=(const BadgeManager&) = delete;
|
|
|
|
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(std::optional<int> badge_content);
|
|
|
|
private:
|
|
// The BindingContext of a mojo request. Allows mojo calls to be tied back
|
|
// to the execution context they belong to without trusting the renderer for
|
|
// that information. This is an abstract base class that different types of
|
|
// execution contexts derive.
|
|
class BindingContext {
|
|
public:
|
|
virtual ~BindingContext() = default;
|
|
};
|
|
|
|
// The BindingContext for Window execution contexts.
|
|
class FrameBindingContext final : public BindingContext {
|
|
public:
|
|
FrameBindingContext(int process_id, int frame_id)
|
|
: process_id_(process_id), frame_id_(frame_id) {}
|
|
~FrameBindingContext() override = default;
|
|
|
|
int GetProcessId() { return process_id_; }
|
|
int GetFrameId() { return frame_id_; }
|
|
|
|
private:
|
|
int process_id_;
|
|
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.
|
|
void SetBadge(blink::mojom::BadgeValuePtr value) override;
|
|
void ClearBadge() override;
|
|
|
|
// All the mojo receivers for the BadgeManager. Keeps track of the
|
|
// render_frame the binding is associated with, so as to not have to rely
|
|
// on the renderer passing it in.
|
|
mojo::ReceiverSet<blink::mojom::BadgeService, std::unique_ptr<BindingContext>>
|
|
receivers_;
|
|
|
|
// Delegate which handles actual setting and clearing of the badge.
|
|
// Note: This is currently only set on Windows and MacOS.
|
|
// std::unique_ptr<BadgeManagerDelegate> delegate_;
|
|
};
|
|
|
|
} // namespace badging
|
|
|
|
#endif // ELECTRON_SHELL_BROWSER_BADGING_BADGE_MANAGER_H_
|