Index: Source/modules/webmidi/MIDIAccessPromise.cpp |
diff --git a/Source/modules/webmidi/MIDIAccessPromise.cpp b/Source/modules/webmidi/MIDIAccessPromise.cpp |
index 0c339f9d560cd5582209d5b552304d6f97ade044..647f6892e6c94292a430d36120f5813679700279 100644 |
--- a/Source/modules/webmidi/MIDIAccessPromise.cpp |
+++ b/Source/modules/webmidi/MIDIAccessPromise.cpp |
@@ -41,7 +41,6 @@ namespace WebCore { |
PassRefPtr<MIDIAccessPromise> MIDIAccessPromise::create(ScriptExecutionContext* context, const Dictionary& options) |
{ |
RefPtr<MIDIAccessPromise> midiAccessPromise(adoptRef(new MIDIAccessPromise(context, options))); |
- midiAccessPromise->setPendingActivity(midiAccessPromise.get()); |
midiAccessPromise->suspendIfNeeded(); |
return midiAccessPromise.release(); |
} |
@@ -50,7 +49,6 @@ MIDIAccessPromise::MIDIAccessPromise(ScriptExecutionContext* context, const Dict |
: ActiveDOMObject(context) |
, m_state(Pending) |
, m_options(adoptPtr(new MIDIOptions(options))) |
- , m_access(MIDIAccess::create(context, this)) |
{ |
ScriptWrappable::init(this); |
} |
@@ -65,6 +63,7 @@ void MIDIAccessPromise::fulfill() |
if (m_state == Pending) { |
if (m_successCallback) { |
m_state = Invoked; |
+ ASSERT(m_access.get()); |
m_successCallback->handleEvent(m_access.release().leakRef(), m_options->sysexEnabled); |
m_options.clear(); |
} else { |
@@ -76,15 +75,15 @@ void MIDIAccessPromise::fulfill() |
m_errorCallback.clear(); |
} |
-void MIDIAccessPromise::reject(DOMError* error) |
+void MIDIAccessPromise::reject(PassRefPtr<DOMError> error) |
{ |
if (m_state == Pending) { |
if (m_errorCallback) { |
m_state = Invoked; |
- m_errorCallback->handleEvent(error); |
+ m_errorCallback->handleEvent(error.leakRef()); |
} else { |
m_state = Rejected; |
- m_error = adoptRef(error); |
+ m_error = error; |
} |
unsetPendingActivity(this); |
} |
@@ -94,6 +93,12 @@ void MIDIAccessPromise::reject(DOMError* error) |
void MIDIAccessPromise::then(PassRefPtr<MIDISuccessCallback> successCallback, PassRefPtr<MIDIErrorCallback> errorCallback) |
{ |
+ // Lazily request access. |
+ if (!m_access) { |
+ setPendingActivity(this); |
+ m_access = MIDIAccess::create(scriptExecutionContext(), this); |
+ } |
+ |
switch (m_state) { |
case Accepted: |
successCallback->handleEvent(m_access.release().leakRef(), m_options->sysexEnabled); |