| Index: Source/modules/webmidi/NavigatorWebMIDI.cpp
|
| diff --git a/Source/modules/webmidi/NavigatorWebMIDI.cpp b/Source/modules/webmidi/NavigatorWebMIDI.cpp
|
| index 87f7b25d31ef0fbc61ed12c4644be689c87b3033..5de010a02ff1655a29f423fbb0f721155f5a57ba 100644
|
| --- a/Source/modules/webmidi/NavigatorWebMIDI.cpp
|
| +++ b/Source/modules/webmidi/NavigatorWebMIDI.cpp
|
| @@ -31,11 +31,16 @@
|
| #include "config.h"
|
| #include "modules/webmidi/NavigatorWebMIDI.h"
|
|
|
| +#include "bindings/v8/DOMRequestState.h"
|
| +#include "bindings/v8/ScriptPromise.h"
|
| +#include "bindings/v8/ScriptPromiseResolver.h"
|
| +#include "core/dom/DOMError.h"
|
| #include "core/dom/Document.h"
|
| #include "core/dom/ExecutionContext.h"
|
| #include "core/frame/Frame.h"
|
| #include "core/frame/Navigator.h"
|
| -#include "modules/webmidi/MIDIAccessPromise.h"
|
| +#include "modules/webmidi/MIDIAccess.h"
|
| +#include "modules/webmidi/MIDIOptions.h"
|
|
|
| namespace WebCore {
|
|
|
| @@ -46,6 +51,7 @@ NavigatorWebMIDI::NavigatorWebMIDI(Frame* frame)
|
|
|
| NavigatorWebMIDI::~NavigatorWebMIDI()
|
| {
|
| + clearPending();
|
| }
|
|
|
| const char* NavigatorWebMIDI::supplementName()
|
| @@ -63,20 +69,40 @@ NavigatorWebMIDI* NavigatorWebMIDI::from(Navigator* navigator)
|
| return supplement;
|
| }
|
|
|
| -PassRefPtr<MIDIAccessPromise> NavigatorWebMIDI::requestMIDIAccess(Navigator* navigator, const Dictionary& options)
|
| +ScriptPromise NavigatorWebMIDI::requestMIDIAccess(Navigator* navigator, const Dictionary& options)
|
| {
|
| return NavigatorWebMIDI::from(navigator)->requestMIDIAccess(options);
|
| }
|
|
|
| -PassRefPtr<MIDIAccessPromise> NavigatorWebMIDI::requestMIDIAccess(const Dictionary& options)
|
| +ScriptPromise NavigatorWebMIDI::requestMIDIAccess(const Dictionary& options)
|
| {
|
| - if (!frame())
|
| - return 0;
|
| + if (!frame()) {
|
| + ScriptPromise promise = ScriptPromise::createPending();
|
| + RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(promise);
|
| + // FIXME: Currently this rejection does not work because the context is stopped.
|
| + resolver->reject(DOMError::create("AbortError"));
|
| + return promise;
|
| + }
|
| +
|
| + return MIDIAccess::create(MIDIOptions(options), frame()->document(), this)->startRequest();
|
| +}
|
|
|
| - ExecutionContext* context = frame()->document();
|
| - ASSERT(context);
|
| +void NavigatorWebMIDI::registerPending(MIDIAccess* access)
|
| +{
|
| + m_pending.add(PassRefPtr<MIDIAccess>(access));
|
| +}
|
|
|
| - return MIDIAccessPromise::create(context, options);
|
| +void NavigatorWebMIDI::unregisterPending(MIDIAccess* access)
|
| +{
|
| + m_pending.remove(PassRefPtr<MIDIAccess>(access));
|
| +}
|
| +
|
| +void NavigatorWebMIDI::clearPending()
|
| +{
|
| + HashSet<RefPtr<MIDIAccess> > pending;
|
| + pending.swap(m_pending);
|
| + for (HashSet<RefPtr<MIDIAccess> >::iterator i = pending.begin(); i != pending.end(); ++i)
|
| + (*i)->stop();
|
| }
|
|
|
| } // namespace WebCore
|
|
|