| Index: third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.cpp
|
| diff --git a/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.cpp b/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.cpp
|
| index acbe79c2a68b5c2e5d41c623a96a6174feac5e56..52a38238d8408a2825692b87cc8b98d5839b704a 100644
|
| --- a/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.cpp
|
| +++ b/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.cpp
|
| @@ -9,33 +9,52 @@
|
| #include "core/dom/DOMException.h"
|
| #include "core/dom/Document.h"
|
| #include "core/dom/ExceptionCode.h"
|
| -#include "core/frame/LocalFrame.h"
|
| #include "core/frame/Navigator.h"
|
| #include "modules/webmidi/MIDIAccess.h"
|
| +#include "modules/webmidi/MIDIController.h"
|
| #include "modules/webmidi/MIDIOptions.h"
|
| #include "modules/webmidi/MIDIPort.h"
|
| -#include "platform/UserGestureIndicator.h"
|
| -#include "platform/mojo/MojoHelper.h"
|
| -#include "public/platform/ServiceRegistry.h"
|
| -#include "third_party/WebKit/public/platform/modules/permissions/permission.mojom-blink.h"
|
|
|
| namespace blink {
|
|
|
| using PortState = WebMIDIAccessorClient::MIDIPortState;
|
|
|
| -using mojom::blink::PermissionName;
|
| -using mojom::blink::PermissionStatus;
|
| -
|
| MIDIAccessInitializer::MIDIAccessInitializer(ScriptState* scriptState, const MIDIOptions& options)
|
| : ScriptPromiseResolver(scriptState)
|
| , m_options(options)
|
| + , m_hasBeenDisposed(false)
|
| + , m_permissionResolved(false)
|
| {
|
| +}
|
| +
|
| +MIDIAccessInitializer::~MIDIAccessInitializer()
|
| +{
|
| + dispose();
|
| }
|
|
|
| void MIDIAccessInitializer::contextDestroyed()
|
| {
|
| - m_permissionService.reset();
|
| + dispose();
|
| LifecycleObserver::contextDestroyed();
|
| +}
|
| +
|
| +void MIDIAccessInitializer::dispose()
|
| +{
|
| + if (m_hasBeenDisposed)
|
| + return;
|
| +
|
| + if (!getExecutionContext())
|
| + return;
|
| +
|
| + if (!m_permissionResolved) {
|
| + Document* document = toDocument(getExecutionContext());
|
| + DCHECK(document);
|
| + if (MIDIController* controller = MIDIController::from(document->frame()))
|
| + controller->cancelPermissionRequest(this);
|
| + m_permissionResolved = true;
|
| + }
|
| +
|
| + m_hasBeenDisposed = true;
|
| }
|
|
|
| ScriptPromise MIDIAccessInitializer::start()
|
| @@ -45,28 +64,10 @@
|
|
|
| Document* document = toDocument(getExecutionContext());
|
| DCHECK(document);
|
| -
|
| - document->frame()->serviceRegistry()->connectToRemoteService(mojo::GetProxy(&m_permissionService));
|
| -
|
| - bool requestSysEx = m_options.hasSysex() && m_options.sysex();
|
| - if (requestSysEx) {
|
| - Vector<PermissionName> permissions = { PermissionName::MIDI, PermissionName::MIDI_SYSEX };
|
| - m_permissionService->RequestPermissions(
|
| - mojo::WTFArray<PermissionName>(std::move(permissions)),
|
| - getExecutionContext()->getSecurityOrigin()->toString(),
|
| - UserGestureIndicator::processingUserGesture(),
|
| - createBaseCallback(WTF::bind(&MIDIAccessInitializer::onPermissionsUpdated, wrapPersistent(this))));
|
| - } else {
|
| - // TODO(toyoshim): Merge this MIDI only code path to the other one for
|
| - // MIDI and MIDI_SYSEX. This is a workaround to pass
|
| - // org.chromium.android_webview.test.AwPermissionManagerTest#testRequestMultiple
|
| - // because of RequestPermissions not implemented in AndroidWebView.
|
| - m_permissionService->RequestPermission(
|
| - PermissionName::MIDI,
|
| - getExecutionContext()->getSecurityOrigin()->toString(),
|
| - UserGestureIndicator::processingUserGesture(),
|
| - createBaseCallback(WTF::bind(&MIDIAccessInitializer::onPermissionUpdated, wrapPersistent(this))));
|
| - }
|
| + if (MIDIController* controller = MIDIController::from(document->frame()))
|
| + controller->requestPermission(this, m_options);
|
| + else
|
| + reject(DOMException::create(SecurityError));
|
|
|
| return promise;
|
| }
|
| @@ -124,35 +125,23 @@
|
| }
|
| }
|
|
|
| +void MIDIAccessInitializer::resolvePermission(bool allowed)
|
| +{
|
| + m_permissionResolved = true;
|
| + if (allowed)
|
| + m_accessor->startSession();
|
| + else
|
| + reject(DOMException::create(SecurityError));
|
| +}
|
| +
|
| +SecurityOrigin* MIDIAccessInitializer::getSecurityOrigin() const
|
| +{
|
| + return getExecutionContext()->getSecurityOrigin();
|
| +}
|
| +
|
| ExecutionContext* MIDIAccessInitializer::getExecutionContext() const
|
| {
|
| return getScriptState()->getExecutionContext();
|
| }
|
|
|
| -void MIDIAccessInitializer::onPermissionsUpdated(mojo::WTFArray<PermissionStatus> statusArray)
|
| -{
|
| - bool allowed = true;
|
| - for (const auto status : statusArray.storage()) {
|
| - if (status != PermissionStatus::GRANTED) {
|
| - allowed = false;
|
| - break;
|
| - }
|
| - }
|
| - m_permissionService.reset();
|
| - if (allowed)
|
| - m_accessor->startSession();
|
| - else
|
| - reject(DOMException::create(SecurityError));
|
| -
|
| -}
|
| -
|
| -void MIDIAccessInitializer::onPermissionUpdated(PermissionStatus status)
|
| -{
|
| - m_permissionService.reset();
|
| - if (status == PermissionStatus::GRANTED)
|
| - m_accessor->startSession();
|
| - else
|
| - reject(DOMException::create(SecurityError));
|
| -}
|
| -
|
| } // namespace blink
|
|
|