forked from nwjs/chromium.src
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmock_web_midi_accessor.cc
More file actions
132 lines (114 loc) · 4.71 KB
/
mock_web_midi_accessor.cc
File metadata and controls
132 lines (114 loc) · 4.71 KB
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
// Copyright 2014 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.
#include "content/shell/test_runner/mock_web_midi_accessor.h"
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/macros.h"
#include "base/strings/stringprintf.h"
#include "content/shell/test_runner/test_interfaces.h"
#include "content/shell/test_runner/test_runner.h"
#include "content/shell/test_runner/web_test_delegate.h"
#include "content/shell/test_runner/web_test_runner.h"
#include "third_party/blink/public/platform/modules/webmidi/web_midi_accessor_client.h"
#include "third_party/blink/public/platform/web_string.h"
using midi::mojom::PortState;
using midi::mojom::Result;
namespace test_runner {
namespace {
constexpr unsigned char kSysexHeader[] = {0xf0, 0x00, 0x02, 0x0d, 0x7f};
constexpr unsigned char kSysexFooter = 0xf7;
constexpr size_t kSysexMinimumLength =
arraysize(kSysexHeader) + sizeof(kSysexFooter) + 1;
bool isSysexForTesting(const unsigned char* data, size_t length) {
// It should have five bytes header, one byte footer, and at least one byte
// payload.
if (length < kSysexMinimumLength)
return false;
if (memcmp(data, kSysexHeader, arraysize(kSysexHeader)))
return false;
return data[length - 1] == kSysexFooter;
}
} // namespace
MockWebMIDIAccessor::MockWebMIDIAccessor(blink::WebMIDIAccessorClient* client,
TestInterfaces* interfaces)
: client_(client),
interfaces_(interfaces),
next_input_port_index_(0),
next_output_port_index_(0),
weak_factory_(this) {}
MockWebMIDIAccessor::~MockWebMIDIAccessor() {}
void MockWebMIDIAccessor::StartSession() {
// Add a mock input and output port.
addInputPort(PortState::CONNECTED);
addOutputPort(PortState::CONNECTED);
interfaces_->GetDelegate()->PostTask(base::BindOnce(
&MockWebMIDIAccessor::reportStartedSession, weak_factory_.GetWeakPtr(),
interfaces_->GetTestRunner()->midiAccessorResult()));
}
void MockWebMIDIAccessor::RunDidReceiveMIDIData(unsigned port_index,
std::vector<unsigned char> data,
base::TimeTicks timestamp) {
client_->DidReceiveMIDIData(port_index, data.data(), data.size(), timestamp);
}
void MockWebMIDIAccessor::SendMIDIData(unsigned port_index,
const unsigned char* data,
size_t length,
base::TimeTicks timestamp) {
// Emulate a loopback device for testing. Make sure if an input port that has
// the same index exists.
if (port_index < next_input_port_index_) {
std::vector<unsigned char> copied_data(data, data + length);
interfaces_->GetDelegate()->PostDelayedTask(
base::BindOnce(&MockWebMIDIAccessor::RunDidReceiveMIDIData,
weak_factory_.GetWeakPtr(), port_index,
std::move(copied_data), timestamp),
std::max(base::TimeDelta(), timestamp - base::TimeTicks::Now()));
}
// Handle special sysex messages for testing.
// A special sequence is [0xf0, 0x00, 0x02, 0x0d, 0x7f, <function>, 0xf7].
// <function> should be one of following sequences.
// - [0x00, 0x00]: Add an input port as connected.
// - [0x00, 0x01]: Add an output port as connected.
// - [0x00, 0x02]: Add an input port as opened.
// - [0x00, 0x03]: Add an output port as opened.
if (!isSysexForTesting(data, length))
return;
size_t offset = arraysize(kSysexHeader);
if (data[offset++] != 0)
return;
switch (data[offset]) {
case 0:
addInputPort(PortState::CONNECTED);
break;
case 1:
addOutputPort(PortState::CONNECTED);
break;
case 2:
addInputPort(PortState::OPENED);
break;
case 3:
addOutputPort(PortState::OPENED);
break;
default:
break;
}
}
void MockWebMIDIAccessor::addInputPort(PortState state) {
std::string id =
base::StringPrintf("MockInputID-%d", next_input_port_index_++);
client_->DidAddInputPort(blink::WebString::FromUTF8(id),
"MockInputManufacturer", "MockInputName",
"MockInputVersion", state);
}
void MockWebMIDIAccessor::addOutputPort(PortState state) {
std::string id =
base::StringPrintf("MockOutputID-%d", next_output_port_index_++);
client_->DidAddOutputPort(blink::WebString::FromUTF8(id),
"MockOutputManufacturer", "MockOutputName",
"MockOutputVersion", state);
}
void MockWebMIDIAccessor::reportStartedSession(Result result) {
client_->DidStartSession(result);
}
} // namespace test_runner