Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1603)

Unified Diff: Source/modules/webmidi/MIDIAccess.cpp

Issue 18325007: Web MIDI: introduce WebMIDIClient API to request a permission (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: address chris' review Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/modules/webmidi/MIDIAccess.h ('k') | Source/modules/webmidi/MIDIClient.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/modules/webmidi/MIDIAccess.cpp
diff --git a/Source/modules/webmidi/MIDIAccess.cpp b/Source/modules/webmidi/MIDIAccess.cpp
index 2e616069eee0111cc5c8435cc6c65dde87d30dcc..dbc9aaa6b4da7fcaa719c69ca018fc492e669854 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->startSession();
+ else
+ permissionDenied();
}
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,10 +91,11 @@ 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));
}
-void MIDIAccess::didAllowAccess()
+void MIDIAccess::didStartSession()
{
ASSERT(isMainThread());
@@ -88,15 +103,6 @@ void MIDIAccess::didAllowAccess()
m_promise->fulfill();
}
-void MIDIAccess::didBlockAccess()
-{
- ASSERT(isMainThread());
-
- m_hasAccess = false;
- RefPtr<DOMError> error = DOMError::create("SecurityError");
- m_promise->reject(error);
-}
-
void MIDIAccess::didReceiveMIDIData(unsigned portIndex, const unsigned char* data, size_t length, double timeStamp)
{
ASSERT(isMainThread());
@@ -117,6 +123,42 @@ 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->startSession();
+ return;
+ }
+ Document* document = toDocument(scriptExecutionContext());
+ ASSERT(document);
+ MIDIController* controller = MIDIController::from(document->page());
+ if (controller) {
+ m_requesting = true;
+ controller->requestSysExPermission(this);
+ } else {
+ permissionDenied();
+ }
+}
+
+void MIDIAccess::permissionDenied()
+{
+ ASSERT(isMainThread());
+
+ m_hasAccess = false;
+ RefPtr<DOMError> error = DOMError::create("SecurityError");
+ m_promise->reject(error);
}
+
+
} // namespace WebCore
« no previous file with comments | « Source/modules/webmidi/MIDIAccess.h ('k') | Source/modules/webmidi/MIDIClient.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698