File: hid_device.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (138 lines) | stat: -rw-r--r-- 5,985 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_DEVICE_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_DEVICE_H_

#include "mojo/public/cpp/bindings/pending_remote.h"
#include "services/device/public/mojom/hid.mojom-blink-forward.h"
#include "third_party/blink/public/mojom/hid/hid.mojom-blink.h"
#include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_hid_report_item.h"
#include "third_party/blink/renderer/core/dom/events/event_target.h"
#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
#include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h"
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
#include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h"
#include "third_party/blink/renderer/platform/heap/collection_support/heap_vector.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/heap/member.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_receiver.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"

namespace blink {
class DOMDataView;
class ExecutionContext;
class HIDCollectionInfo;
class ScriptState;

class MODULES_EXPORT HIDDevice
    : public EventTarget,
      public ExecutionContextLifecycleObserver,
      public ActiveScriptWrappable<HIDDevice>,
      public device::mojom::blink::HidConnectionClient {
  DEFINE_WRAPPERTYPEINFO();

 public:
  // ServiceInterface provides a pure-virtual HID service interface for
  // HIDDevice creators to, for example, open a device.
  class ServiceInterface : public GarbageCollectedMixin {
   public:
    virtual void Connect(
        const String& device_guid,
        mojo::PendingRemote<device::mojom::blink::HidConnectionClient>
            connection_client,
        device::mojom::blink::HidManager::ConnectCallback callback) = 0;
    virtual void Forget(device::mojom::blink::HidDeviceInfoPtr device_info,
                        mojom::blink::HidService::ForgetCallback callback) = 0;
  };

  HIDDevice(ServiceInterface* parent,
            device::mojom::blink::HidDeviceInfoPtr info,
            ExecutionContext* execution_context);
  ~HIDDevice() override;

  // EventTarget:
  ExecutionContext* GetExecutionContext() const override;
  const AtomicString& InterfaceName() const override;

  // device::mojom::blink::HidConnectionClient:
  void OnInputReport(uint8_t report_id, const Vector<uint8_t>& buffer) override;

  // Web-exposed interfaces:
  DEFINE_ATTRIBUTE_EVENT_LISTENER(inputreport, kInputreport)

  bool opened() const;
  uint16_t vendorId() const;
  uint16_t productId() const;
  String productName() const;
  const HeapVector<Member<HIDCollectionInfo>>& collections() const;

  ScriptPromise<IDLUndefined> open(ScriptState* script_state,
                                   ExceptionState& exception_state);
  ScriptPromise<IDLUndefined> close(ScriptState*);
  ScriptPromise<IDLUndefined> forget(ScriptState*,
                                     ExceptionState& exception_state);
  ScriptPromise<IDLUndefined> sendReport(ScriptState*,
                                         uint8_t report_id,
                                         base::span<const uint8_t> data);
  ScriptPromise<IDLUndefined> sendFeatureReport(ScriptState*,
                                                uint8_t report_id,
                                                base::span<const uint8_t> data);
  ScriptPromise<NotShared<DOMDataView>> receiveFeatureReport(ScriptState*,
                                                             uint8_t report_id);

  // ExecutionContextLifecycleObserver:
  void ContextDestroyed() override;

  // ActiveScriptWrappable:
  bool HasPendingActivity() const override;

  void UpdateDeviceInfo(device::mojom::blink::HidDeviceInfoPtr info);
  void ResetIsForgotten();

  static HIDReportItem* ToHIDReportItem(
      const device::mojom::blink::HidReportItem& report_item);

  void Trace(Visitor*) const override;

 private:
  bool EnsureNoDeviceChangeInProgress(
      ScriptPromiseResolverBase* resolver) const;
  bool EnsureDeviceIsNotForgotten(ScriptPromiseResolverBase* resolver) const;

  void OnServiceConnectionError();

  void FinishOpen(ScriptPromiseResolver<IDLUndefined>*,
                  mojo::PendingRemote<device::mojom::blink::HidConnection>);
  void FinishForget(ScriptPromiseResolver<IDLUndefined>*);
  void FinishSendReport(ScriptPromiseResolver<IDLUndefined>*, bool success);
  void FinishSendFeatureReport(ScriptPromiseResolver<IDLUndefined>*,
                               bool success);
  void FinishReceiveFeatureReport(
      ScriptPromiseResolver<NotShared<DOMDataView>>*,
      bool success,
      const std::optional<Vector<uint8_t>>&);

  void MarkRequestComplete(ScriptPromiseResolverBase*);

  Member<ServiceInterface> parent_;
  device::mojom::blink::HidDeviceInfoPtr device_info_;
  HeapMojoRemote<device::mojom::blink::HidConnection> connection_;
  HeapMojoReceiver<device::mojom::blink::HidConnectionClient, HIDDevice>
      receiver_;
  HeapHashSet<Member<ScriptPromiseResolverBase>> device_requests_;
  HeapVector<Member<HIDCollectionInfo>> collections_;
  bool device_state_change_in_progress_ = false;
  bool device_is_forgotten_ = false;
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_DEVICE_H_