blob: 104f9478239aa8c71b89a218c7d0104d145f47ee [file] [log] [blame]
// 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_BROWSER_FONT_ACCESS_FONT_ACCESS_MANAGER_IMPL_H_
#define CONTENT_BROWSER_FONT_ACCESS_FONT_ACCESS_MANAGER_IMPL_H_
#include "base/sequence_checker.h"
#include "content/common/content_export.h"
#include "content/public/browser/font_access_chooser.h"
#include "content/public/browser/font_access_context.h"
#include "content/public/browser/global_routing_id.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "third_party/blink/public/mojom/font_access/font_access.mojom.h"
#include "url/origin.h"
namespace content {
// The ownership hierarchy for this class is:
//
// StoragePartitionImpl (1) <- (1) FontAccessManagerImpl
//
// FontAccessManagerImpl (1) <- (*) BindingContext
// FontAccessManagerImpl (1) <- (*) FontAccessChooser
//
// BindingContext (1) <- (1) GlobalFrameRoutingId
// GlobalFrameRoutingId (1) <-- (1) FontAccessChooser
//
// Legend:
//
// <- : owns
// <-- : corresponds to
// (N) : N is a number or *, which denotes zero or more
//
// In English:
// * There's one FontAccessManagerImpl per StoragePartitionImpl
// * Frames are bound to FontAccessManangerImpl via a BindingContext
// * The FontAccessManagerImpl owns the lifetimes of FontAccessChoosers
// * There is one FontAccessChooser for each Frame via its GlobalFrameRoutingId,
// obtained from a corresponding BindingContext
class CONTENT_EXPORT FontAccessManagerImpl
: public blink::mojom::FontAccessManager,
public FontAccessContext {
public:
FontAccessManagerImpl();
~FontAccessManagerImpl() override;
// Disallow copy and assign.
FontAccessManagerImpl(const FontAccessManagerImpl&) = delete;
FontAccessManagerImpl operator=(const FontAccessManagerImpl&) = delete;
struct BindingContext {
BindingContext(const url::Origin& origin, GlobalFrameRoutingId frame_id)
: origin(origin), frame_id(frame_id) {}
url::Origin origin;
GlobalFrameRoutingId frame_id;
};
void BindReceiver(
const BindingContext& context,
mojo::PendingReceiver<blink::mojom::FontAccessManager> receiver);
// blink.mojom.FontAccessManager:
void EnumerateLocalFonts(EnumerateLocalFontsCallback callback) override;
void ChooseLocalFonts(ChooseLocalFontsCallback callback) override;
// content::FontAccessContext:
void FindAllFonts(FindAllFontsCallback callback) override;
void SkipPrivacyChecksForTesting(bool skip) {
skip_privacy_checks_for_testing_ = skip;
}
private:
void DidRequestPermission(EnumerateLocalFontsCallback callback,
blink::mojom::PermissionStatus status);
void DidFindAllFonts(FindAllFontsCallback callback,
blink::mojom::FontEnumerationStatus,
base::ReadOnlySharedMemoryRegion);
void DidChooseLocalFonts(ChooseLocalFontsCallback callback,
blink::mojom::FontEnumerationStatus status,
std::vector<blink::mojom::FontMetadataPtr> fonts);
// Registered clients.
mojo::ReceiverSet<blink::mojom::FontAccessManager, BindingContext> receivers_;
scoped_refptr<base::SequencedTaskRunner> ipc_task_runner_;
scoped_refptr<base::TaskRunner> results_task_runner_;
bool skip_privacy_checks_for_testing_ = false;
// Here to keep the choosers alive for the user to interact with.
std::map<GlobalFrameRoutingId, std::unique_ptr<FontAccessChooser>> choosers_;
SEQUENCE_CHECKER(sequence_checker_);
};
} // namespace content
#endif // CONTENT_BROWSER_FONT_ACCESS_FONT_ACCESS_MANAGER_IMPL_H_