blob: 362a338f88e380b1cba387c9efac8e5b05679010 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_IOS_NFC_HOST_H_
#define CONTENT_BROWSER_IOS_NFC_HOST_H_
#include "base/memory/raw_ptr.h"
#include "content/public/browser/permission_controller.h"
#include "content/public/browser/web_contents_observer.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/device/public/mojom/nfc.mojom.h"
#include "third_party/abseil-cpp/absl/container/flat_hash_set.h"
#include "third_party/blink/public/mojom/permissions/permission_status.mojom-forward.h"
namespace content {
class NFCSessionHolder;
class NFCHost : public WebContentsObserver, public device::mojom::NFC {
public:
explicit NFCHost(WebContents* web_contents);
NFCHost(const NFCHost&) = delete;
NFCHost& operator=(const NFCHost&) = delete;
~NFCHost() override;
void GetNFC(RenderFrameHost* render_frame_host,
mojo::PendingReceiver<device::mojom::NFC> receiver);
// WebContentsObserver implementation.
void RenderFrameHostChanged(RenderFrameHost* old_host,
RenderFrameHost* new_host) override;
void OnVisibilityChanged(Visibility visibility) override;
// device::mojom::NFC implementation.
void SetClient(
mojo::PendingRemote<device::mojom::RawNFCClient> client) override;
void Push(device::mojom::NDEFMessagePtr message,
device::mojom::NDEFWriteOptionsPtr options,
device::mojom::NFC::PushCallback callback) override;
void CancelPush() override;
void MakeReadOnly(device::mojom::NFC::MakeReadOnlyCallback callback) override;
void CancelMakeReadOnly() override;
void Watch(uint32_t id, device::mojom::NFC::WatchCallback callback) override;
void CancelWatch(uint32_t id) override;
enum class TagStatus { kReadWrite, kReadOnly, kNotSupported };
void TagQueried(TagStatus status, bool error);
void TagReadComplete(device::mojom::NDEFRawMessagePtr message, bool error);
void TagWriteComplete(bool error);
void TagWriteLockComplete(bool error);
void ReaderInvalidated(bool error);
private:
void MaybeResumeOrSuspendOperations(Visibility visibility);
void OnPermissionStatusChange(blink::mojom::PermissionStatus status);
void Close();
void ClearState();
void EnableSessionIfNecessary();
void DisableSessionIfNecessary();
void PendingWatchOperationComplete(device::mojom::NDEFErrorType error);
void HandlePendingPushOperation();
void PendingPushOperationComplete(device::mojom::NDEFErrorType error);
void HandlePendingMakeReadOnlyOperation();
void PendingMakeReadOnlyOperationComplete(device::mojom::NDEFErrorType error);
// The permission controller for this browser context.
raw_ptr<PermissionController> permission_controller_;
// Permission change subscription ID provided by |permission_controller_|.
PermissionController::SubscriptionId subscription_id_;
mojo::Receiver<device::mojom::NFC> receiver_{this};
mojo::Remote<device::mojom::RawNFCClient> client_remote_;
struct PendingPush {
PendingPush(device::mojom::NDEFMessagePtr,
device::mojom::NDEFWriteOptionsPtr,
device::mojom::NFC::PushCallback);
~PendingPush();
device::mojom::NDEFMessagePtr message;
device::mojom::NDEFWriteOptionsPtr options;
device::mojom::NFC::PushCallback callback;
};
std::unique_ptr<PendingPush> pending_push_;
device::mojom::NFC::MakeReadOnlyCallback pending_read_only_;
absl::flat_hash_set<uint32_t> watches_;
std::optional<TagStatus> tag_status_;
bool tag_has_records_ = false;
std::unique_ptr<NFCSessionHolder> session_;
bool suspended_ = false;
scoped_refptr<base::SequencedTaskRunner> main_task_runner_;
base::WeakPtrFactory<NFCHost> weak_ptr_factory_{this};
};
} // namespace content
#endif // CONTENT_BROWSER_IOS_NFC_HOST_H_