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

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

Issue 77773003: Make WebMIDI use blink Promise. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 1 month 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
Index: Source/modules/webmidi/NavigatorWebMIDI.cpp
diff --git a/Source/modules/webmidi/NavigatorWebMIDI.cpp b/Source/modules/webmidi/NavigatorWebMIDI.cpp
index 87f7b25d31ef0fbc61ed12c4644be689c87b3033..72d3a5e1b6d1452c376cc3c6ce14c01132277f51 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,84 @@ 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()) {
Takashi Toyoshima 2013/12/03 10:48:50 optional: Can we have a layout test which confirm
yhirano 2013/12/03 12:14:16 I found that this rejection is currently not worki
+ ScriptPromise promise = ScriptPromise::createPending();
+ RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(promise);
+ resolver->reject(DOMError::create("InvalidStateError"));
Takashi Toyoshima 2013/12/03 10:48:50 This is not the case described in the spec, but I
Takashi Toyoshima 2013/12/03 11:34:49 Sent a pull request to use AbortError here. https:
yhirano 2013/12/03 12:14:16 Done.
+ return promise;
+ }
ExecutionContext* context = frame()->document();
ASSERT(context);
+ if (!m_requestState.get())
+ m_requestState = adoptPtr(new DOMRequestState(context));
+ ScriptPromise promise = ScriptPromise::createPending(context);
+ RefPtr<MIDIAccess> access = MIDIAccess::create(MIDIOptions(options), context, this);
+ m_pending.add(access, ScriptPromiseResolver::create(promise, context));
+ access->startRequest();
+ return promise;
+}
+
+void NavigatorWebMIDI::didFinishRequest(MIDIAccess* access)
+{
+ // FIXME: We should care about suspend / stop.
+ RefPtr<MIDIAccess> key(access);
+ if (!m_pending.contains(key))
+ return;
+ RefPtr<ScriptPromiseResolver> resolver = m_pending.get(key);
+ m_pending.remove(key);
+
+ if (!frame()) {
+ // We can break the promise if the frame does not exist.
+ return;
+ }
+ ASSERT(m_requestState);
+ DOMRequestState::Scope scope(*m_requestState);
+ resolver->resolve(access, access->executionContext());
Takashi Toyoshima 2013/12/03 11:34:49 I proposed to remove the second argument of the MI
+}
+
+void NavigatorWebMIDI::didFailRequest(MIDIAccess* access, PassRefPtr<DOMError> error)
+{
+ // FIXME: We should care about suspend / stop.
+ RefPtr<MIDIAccess> key(access);
+ if (!m_pending.contains(key))
+ return;
+ RefPtr<ScriptPromiseResolver> resolver = m_pending.get(key);
+ m_pending.remove(key);
+ if (!frame()) {
+ // We can break the promise if the frame does not exist.
+ return;
+ }
+ ASSERT(m_requestState);
+ DOMRequestState::Scope scope(*m_requestState);
+ resolver->reject(error, access->executionContext());
+}
+
+void NavigatorWebMIDI::clearPending()
+{
+ // FIXME: We should care about suspend / stop.
+ HashMap<RefPtr<MIDIAccess>, RefPtr<ScriptPromiseResolver> > pending;
+ pending.swap(m_pending);
+
+ if (!frame()) {
+ // We can break promises if the frame does not exist.
+ return;
+ }
- return MIDIAccessPromise::create(context, options);
+ ASSERT(m_requestState);
+ for (HashMap<RefPtr<MIDIAccess>, RefPtr<ScriptPromiseResolver> >::iterator i = pending.begin();
+ i != pending.end(); ++i) {
+ DOMRequestState::Scope scope(*m_requestState);
+ MIDIAccess* access = i->key.get();
+ i->value->reject(DOMError::create("InvalidStateError"), access->executionContext());
Takashi Toyoshima 2013/12/03 10:48:50 AbortError?
yhirano 2013/12/03 12:14:16 Done.
+ }
}
} // namespace WebCore

Powered by Google App Engine
This is Rietveld 408576698