Chromium Code Reviews| Index: Source/modules/webmidi/MIDIAccess.cpp |
| diff --git a/Source/modules/webmidi/MIDIAccess.cpp b/Source/modules/webmidi/MIDIAccess.cpp |
| index d0a733c1b36de4dade5bba329e1ed5ec20b4167d..36380b849487f683b189b851fe4095f5dad74437 100644 |
| --- a/Source/modules/webmidi/MIDIAccess.cpp |
| +++ b/Source/modules/webmidi/MIDIAccess.cpp |
| @@ -37,7 +37,11 @@ |
| #include "modules/webmidi/MIDIAccessInitializer.h" |
| #include "modules/webmidi/MIDIConnectionEvent.h" |
| #include "modules/webmidi/MIDIController.h" |
| +#include "modules/webmidi/MIDIInput.h" |
| +#include "modules/webmidi/MIDIInputMap.h" |
| #include "modules/webmidi/MIDIOptions.h" |
| +#include "modules/webmidi/MIDIOutput.h" |
| +#include "modules/webmidi/MIDIOutputMap.h" |
| #include "modules/webmidi/MIDIPort.h" |
| #include "platform/AsyncMethodRunner.h" |
| #include <v8.h> |
| @@ -51,14 +55,23 @@ MIDIAccess::MIDIAccess(PassOwnPtr<MIDIAccessor> accessor, bool sysexEnabled, con |
| { |
| ScriptWrappable::init(this); |
| m_accessor->setClient(this); |
| + HeapHashMap<String, Member<MIDIInput> > inputs; |
| + HeapHashMap<String, Member<MIDIOutput> > outputs; |
| for (size_t i = 0; i < ports.size(); ++i) { |
| const MIDIAccessInitializer::PortDescriptor& port = ports[i]; |
| if (port.type == MIDIPort::MIDIPortTypeInput) { |
| - m_inputs.append(MIDIInput::create(this, port.id, port.manufacturer, port.name, port.version)); |
| + inputs.add(port.id, MIDIInput::create(this, port.id, port.manufacturer, port.name, port.version)); |
| + m_inputKeys.append(port.id); |
| } else { |
| - m_outputs.append(MIDIOutput::create(this, m_outputs.size(), port.id, port.manufacturer, port.name, port.version)); |
| + outputs.add(port.id, MIDIOutput::create(this, outputs.size(), port.id, port.manufacturer, port.name, port.version)); |
| } |
| } |
| + if (inputs.size() + outputs.size() != ports.size()) { |
| + // There are id-duplicate ports that violate the spec. |
| + return; |
| + } |
| + m_inputs = new MIDIInputMap(inputs); |
| + m_outputs = new MIDIOutputMap(outputs); |
| } |
| MIDIAccess::~MIDIAccess() |
| @@ -68,20 +81,23 @@ MIDIAccess::~MIDIAccess() |
| void MIDIAccess::didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version) |
| { |
| ASSERT(isMainThread()); |
| - m_inputs.append(MIDIInput::create(this, id, manufacturer, name, version)); |
| + // We currently assume no ports are added after an MIDIAccess object is |
|
Takashi Toyoshima
2014/09/01 13:48:39
Is there any real problem on adding a new port?
Le
yhirano
2014/09/02 05:17:13
Discussed offline: We decided to delete this asser
|
| + // created. |
| + ASSERT_NOT_REACHED(); |
| } |
| void MIDIAccess::didAddOutputPort(const String& id, const String& manufacturer, const String& name, const String& version) |
| { |
| ASSERT(isMainThread()); |
| - unsigned portIndex = m_outputs.size(); |
| - m_outputs.append(MIDIOutput::create(this, portIndex, id, manufacturer, name, version)); |
| + // We currently assume no ports are added after an MIDIAccess object is |
| + // created. |
| + ASSERT_NOT_REACHED(); |
| } |
| void MIDIAccess::didReceiveMIDIData(unsigned portIndex, const unsigned char* data, size_t length, double timeStamp) |
| { |
| ASSERT(isMainThread()); |
| - if (portIndex >= m_inputs.size()) |
| + if (portIndex >= m_inputs->size()) |
| return; |
| // Convert from time in seconds which is based on the time coordinate system of monotonicallyIncreasingTime() |
| @@ -92,12 +108,13 @@ void MIDIAccess::didReceiveMIDIData(unsigned portIndex, const unsigned char* dat |
| double timeStampInMilliseconds = 1000 * document->loader()->timing()->monotonicTimeToZeroBasedDocumentTime(timeStamp); |
| - m_inputs[portIndex]->didReceiveMIDIData(portIndex, data, length, timeStampInMilliseconds); |
| + ASSERT(m_inputs->has(m_inputKeys[portIndex])); |
| + m_inputs->get(m_inputKeys[portIndex])->didReceiveMIDIData(portIndex, data, length, timeStampInMilliseconds); |
| } |
| void MIDIAccess::sendMIDIData(unsigned portIndex, const unsigned char* data, size_t length, double timeStampInMilliseconds) |
| { |
| - if (!data || !length || portIndex >= m_outputs.size()) |
| + if (!data || !length || portIndex >= m_outputs->size()) |
| return; |
| // Convert from a time in milliseconds (a DOMHighResTimeStamp) according to the same time coordinate system as performance.now() |
| // into a time in seconds which is based on the time coordinate system of monotonicallyIncreasingTime(). |