Index: Source/modules/webmidi/MIDIAccess.cpp |
diff --git a/Source/modules/webmidi/MIDIAccess.cpp b/Source/modules/webmidi/MIDIAccess.cpp |
index 2e616069eee0111cc5c8435cc6c65dde87d30dcc..ff8d34bdd21582cb6195dad56fecf186437f41cf 100644 |
--- a/Source/modules/webmidi/MIDIAccess.cpp |
+++ b/Source/modules/webmidi/MIDIAccess.cpp |
@@ -38,6 +38,7 @@ |
#include "core/loader/DocumentLoader.h" |
#include "modules/webmidi/MIDIAccessPromise.h" |
#include "modules/webmidi/MIDIConnectionEvent.h" |
+#include "modules/webmidi/MIDIController.h" |
#include "modules/webmidi/MIDIInput.h" |
#include "modules/webmidi/MIDIOutput.h" |
#include "modules/webmidi/MIDIPort.h" |
@@ -48,6 +49,7 @@ PassRefPtr<MIDIAccess> MIDIAccess::create(ScriptExecutionContext* context, MIDIA |
{ |
RefPtr<MIDIAccess> midiAccess(adoptRef(new MIDIAccess(context, promise))); |
midiAccess->suspendIfNeeded(); |
+ midiAccess->startRequest(); |
return midiAccess.release(); |
} |
@@ -60,16 +62,28 @@ MIDIAccess::MIDIAccess(ScriptExecutionContext* context, MIDIAccessPromise* promi |
: ActiveDOMObject(context) |
, m_promise(promise) |
, m_hasAccess(false) |
+ , m_enableSysEx(false) |
+ , m_requesting(false) |
{ |
ScriptWrappable::init(this); |
m_accessor = MIDIAccessor::create(this); |
- m_accessor->requestAccess(promise->options()->sysex); |
+} |
+ |
+void MIDIAccess::enableSysEx(bool enable) |
+{ |
+ m_requesting = false; |
+ m_enableSysEx = enable; |
+ if (enable) |
+ m_accessor->requestAccess(); |
+ else |
+ didBlockAccess(); |
} |
void MIDIAccess::didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version) |
{ |
ASSERT(isMainThread()); |
+ // FIXME: Pass m_enableSysEx flag to filter system exclusive messages correctly. |
m_inputs.append(MIDIInput::create(scriptExecutionContext(), id, manufacturer, name, version)); |
} |
@@ -77,6 +91,7 @@ void MIDIAccess::didAddOutputPort(const String& id, const String& manufacturer, |
{ |
ASSERT(isMainThread()); |
+ // FIXME: Pass m_enableSysEx flag to filter system exclusive messages correctly. |
m_outputs.append(MIDIOutput::create(scriptExecutionContext(), id, manufacturer, name, version)); |
} |
@@ -117,6 +132,31 @@ void MIDIAccess::didReceiveMIDIData(unsigned portIndex, const unsigned char* dat |
void MIDIAccess::stop() |
{ |
m_hasAccess = false; |
+ if (!m_requesting) |
+ return; |
+ m_requesting = false; |
+ Document* document = toDocument(scriptExecutionContext()); |
+ ASSERT(document); |
+ MIDIController* controller = MIDIController::from(document->page()); |
+ ASSERT(controller); |
+ controller->cancelSysExPermissionRequest(this); |
+} |
+ |
+void MIDIAccess::startRequest() |
+{ |
+ if (!m_promise->options()->sysex) { |
+ m_accessor->requestAccess(); |
+ return; |
+ } |
+ Document* document = toDocument(scriptExecutionContext()); |
+ ASSERT(document); |
+ MIDIController* controller = MIDIController::from(document->page()); |
+ if (controller) { |
+ m_requesting = true; |
+ controller->requestSysExPermission(this); |
+ } else { |
+ didBlockAccess(); |
+ } |
} |
} // namespace WebCore |