Index: Source/modules/webmidi/MIDIPort.cpp |
diff --git a/Source/modules/webmidi/MIDIPort.cpp b/Source/modules/webmidi/MIDIPort.cpp |
index 519de7fa4cc98b9707f8da8b4ae30b82768f1b8a..20824dcf3820de76b078dbf5f85535599665bfa1 100644 |
--- a/Source/modules/webmidi/MIDIPort.cpp |
+++ b/Source/modules/webmidi/MIDIPort.cpp |
@@ -47,6 +47,7 @@ MIDIPort::MIDIPort(MIDIAccess* access, const String& id, const String& manufactu |
, m_type(type) |
, m_version(version) |
, m_access(access) |
+ , m_connection(MIDIPortConnectionStateClosed) |
{ |
ASSERT(access); |
ASSERT(type == MIDIPortTypeInput || type == MIDIPortTypeOutput); |
@@ -60,6 +61,21 @@ MIDIPort::MIDIPort(MIDIAccess* access, const String& id, const String& manufactu |
m_state = state; |
} |
+String MIDIPort::connection() const |
+{ |
+ switch (m_connection) { |
+ case MIDIPortConnectionStateOpen: |
+ return "open"; |
+ case MIDIPortConnectionStateClosed: |
+ return "closed"; |
+ case MIDIPortConnectionStatePending: |
+ return "pending"; |
+ default: |
+ ASSERT_NOT_REACHED(); |
+ } |
+ return emptyString(); |
+} |
+ |
String MIDIPort::state() const |
{ |
switch (m_state) { |
@@ -67,8 +83,6 @@ String MIDIPort::state() const |
return "disconnected"; |
case PortState::MIDIPortStateConnected: |
return "connected"; |
- case PortState::MIDIPortStateOpened: |
- return "opened"; |
default: |
ASSERT_NOT_REACHED(); |
} |
@@ -90,14 +104,13 @@ String MIDIPort::type() const |
ScriptPromise MIDIPort::open(ScriptState* scriptState) |
{ |
+ // FIXME: Implement the latest open() algorithm. |
switch (m_state) { |
case PortState::MIDIPortStateDisconnected: |
return reject(scriptState, InvalidStateError, "The port has been disconnected."); |
case PortState::MIDIPortStateConnected: |
// FIXME: Add blink API to perform a real open operation. |
- setState(PortState::MIDIPortStateOpened); |
- // fall through |
- case PortState::MIDIPortStateOpened: |
+ setStates(m_state, MIDIPortConnectionStateOpen); |
return accept(scriptState); |
default: |
ASSERT_NOT_REACHED(); |
@@ -107,14 +120,13 @@ ScriptPromise MIDIPort::open(ScriptState* scriptState) |
ScriptPromise MIDIPort::close(ScriptState* scriptState) |
{ |
+ // FIXME: Implement the latest close() algorithm. |
switch (m_state) { |
case PortState::MIDIPortStateDisconnected: |
return reject(scriptState, InvalidStateError, "The port has been disconnected."); |
- case PortState::MIDIPortStateOpened: |
- // FIXME: Add blink API to perform a real close operation. |
- setState(PortState::MIDIPortStateConnected); |
- // fall through |
case PortState::MIDIPortStateConnected: |
+ // FIXME: Add blink API to perform a real close operation. |
+ setStates(m_state, MIDIPortConnectionStateClosed); |
return accept(scriptState); |
default: |
ASSERT_NOT_REACHED(); |
@@ -124,10 +136,7 @@ ScriptPromise MIDIPort::close(ScriptState* scriptState) |
void MIDIPort::setState(PortState state) |
{ |
- if (m_state == state) |
- return; |
- m_state = state; |
- dispatchEvent(MIDIConnectionEvent::create(this)); |
+ setStates(state, m_connection); |
} |
ExecutionContext* MIDIPort::executionContext() const |
@@ -151,4 +160,13 @@ ScriptPromise MIDIPort::reject(ScriptState* scriptState, ExceptionCode ec, const |
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(ec, message)); |
} |
+void MIDIPort::setStates(PortState state, MIDIPortConnectionState connection) |
+{ |
+ if (m_state == state && m_connection == connection) |
+ return; |
+ m_state = state; |
+ m_connection = connection; |
+ dispatchEvent(MIDIConnectionEvent::create(this)); |
+} |
+ |
} // namespace blink |