Commit 71d21daf authored by toyoshim's avatar toyoshim Committed by Commit bot

Web MIDI: Ask permissions of the content layer always

Originally only sysex permission requests are exposed to the
content layer, but with this series of patches, all Web MIDI requests
will be exposed to the content layer so that each chromium embedder
can decide how to decide several permissions.

First of all, expose all requests outside Blink.
Changes for the permission service will follow as a separate patch.

BUG=535181

Review URL: https://codereview.chromium.org/1602703005

Cr-Commit-Position: refs/heads/master@{#372044}
parent 8a9e9167
...@@ -10,9 +10,11 @@ ...@@ -10,9 +10,11 @@
#include "third_party/WebKit/public/platform/WebString.h" #include "third_party/WebKit/public/platform/WebString.h"
#include "third_party/WebKit/public/web/WebSecurityOrigin.h" #include "third_party/WebKit/public/web/WebSecurityOrigin.h"
#include "third_party/WebKit/public/web/WebUserGestureIndicator.h" #include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
#include "third_party/WebKit/public/web/modules/webmidi/WebMIDIOptions.h"
#include "third_party/WebKit/public/web/modules/webmidi/WebMIDIPermissionRequest.h" #include "third_party/WebKit/public/web/modules/webmidi/WebMIDIPermissionRequest.h"
using blink::WebMIDIPermissionRequest; using blink::WebMIDIPermissionRequest;
using blink::WebMIDIOptions;
using blink::WebSecurityOrigin; using blink::WebSecurityOrigin;
namespace content { namespace content {
...@@ -23,8 +25,11 @@ MidiDispatcher::MidiDispatcher(RenderFrame* render_frame) ...@@ -23,8 +25,11 @@ MidiDispatcher::MidiDispatcher(RenderFrame* render_frame)
MidiDispatcher::~MidiDispatcher() {} MidiDispatcher::~MidiDispatcher() {}
void MidiDispatcher::requestSysexPermission( void MidiDispatcher::requestPermission(const WebMIDIPermissionRequest& request,
const WebMIDIPermissionRequest& request) { const WebMIDIOptions& options) {
if (options.sysex == WebMIDIOptions::SysexPermission::WithoutSysex)
return WebMIDIPermissionRequest(request).setIsAllowed(true);
if (!permission_service_.get()) { if (!permission_service_.get()) {
render_frame()->GetServiceRegistry()->ConnectToRemoteService( render_frame()->GetServiceRegistry()->ConnectToRemoteService(
mojo::GetProxy(&permission_service_)); mojo::GetProxy(&permission_service_));
...@@ -36,11 +41,11 @@ void MidiDispatcher::requestSysexPermission( ...@@ -36,11 +41,11 @@ void MidiDispatcher::requestSysexPermission(
permission_service_->RequestPermission( permission_service_->RequestPermission(
PermissionName::MIDI_SYSEX, request.securityOrigin().toString().utf8(), PermissionName::MIDI_SYSEX, request.securityOrigin().toString().utf8(),
blink::WebUserGestureIndicator::isProcessingUserGesture(), blink::WebUserGestureIndicator::isProcessingUserGesture(),
base::Bind(&MidiDispatcher::OnSysExPermissionSet, base::Unretained(this), base::Bind(&MidiDispatcher::OnPermissionSet, base::Unretained(this),
permission_request_id)); permission_request_id));
} }
void MidiDispatcher::cancelSysexPermissionRequest( void MidiDispatcher::cancelPermissionRequest(
const WebMIDIPermissionRequest& request) { const WebMIDIPermissionRequest& request) {
for (Requests::iterator it(&requests_); !it.IsAtEnd(); it.Advance()) { for (Requests::iterator it(&requests_); !it.IsAtEnd(); it.Advance()) {
WebMIDIPermissionRequest* value = it.GetCurrentValue(); WebMIDIPermissionRequest* value = it.GetCurrentValue();
...@@ -51,8 +56,7 @@ void MidiDispatcher::cancelSysexPermissionRequest( ...@@ -51,8 +56,7 @@ void MidiDispatcher::cancelSysexPermissionRequest(
} }
} }
void MidiDispatcher::OnSysExPermissionSet(int request_id, void MidiDispatcher::OnPermissionSet(int request_id, PermissionStatus status) {
PermissionStatus status) {
// |request| can be NULL when the request is canceled. // |request| can be NULL when the request is canceled.
WebMIDIPermissionRequest* request = requests_.Lookup(request_id); WebMIDIPermissionRequest* request = requests_.Lookup(request_id);
if (!request) if (!request)
......
...@@ -29,13 +29,13 @@ class MidiDispatcher : public RenderFrameObserver, ...@@ -29,13 +29,13 @@ class MidiDispatcher : public RenderFrameObserver,
private: private:
// blink::WebMIDIClient implementation. // blink::WebMIDIClient implementation.
void requestSysexPermission( void requestPermission(const blink::WebMIDIPermissionRequest& request,
const blink::WebMIDIPermissionRequest& request) override; const blink::WebMIDIOptions& options) override;
void cancelSysexPermissionRequest( void cancelPermissionRequest(
const blink::WebMIDIPermissionRequest& request) override; const blink::WebMIDIPermissionRequest& request) override;
// Permission for using system exclusive messages has been set. // Permission for using MIDI system has been set.
void OnSysExPermissionSet(int request_id, PermissionStatus status); void OnPermissionSet(int request_id, PermissionStatus status);
// Each WebMIDIPermissionRequest object is valid until // Each WebMIDIPermissionRequest object is valid until
// cancelSysexPermissionRequest() is called with the object, or used to call // cancelSysexPermissionRequest() is called with the object, or used to call
......
...@@ -21,12 +21,10 @@ using PortState = WebMIDIAccessorClient::MIDIPortState; ...@@ -21,12 +21,10 @@ using PortState = WebMIDIAccessorClient::MIDIPortState;
MIDIAccessInitializer::MIDIAccessInitializer(ScriptState* scriptState, const MIDIOptions& options) MIDIAccessInitializer::MIDIAccessInitializer(ScriptState* scriptState, const MIDIOptions& options)
: ScriptPromiseResolver(scriptState) : ScriptPromiseResolver(scriptState)
, m_requestSysex(false) , m_options(options)
, m_hasBeenDisposed(false) , m_hasBeenDisposed(false)
, m_sysexPermissionResolved(false) , m_permissionResolved(false)
{ {
if (options.hasSysex())
m_requestSysex = options.sysex();
} }
MIDIAccessInitializer::~MIDIAccessInitializer() MIDIAccessInitializer::~MIDIAccessInitializer()
...@@ -48,12 +46,12 @@ void MIDIAccessInitializer::dispose() ...@@ -48,12 +46,12 @@ void MIDIAccessInitializer::dispose()
if (!executionContext()) if (!executionContext())
return; return;
if (!m_sysexPermissionResolved) { if (!m_permissionResolved) {
Document* document = toDocument(executionContext()); Document* document = toDocument(executionContext());
ASSERT(document); ASSERT(document);
if (MIDIController* controller = MIDIController::from(document->frame())) if (MIDIController* controller = MIDIController::from(document->frame()))
controller->cancelSysexPermissionRequest(this); controller->cancelPermissionRequest(this);
m_sysexPermissionResolved = true; m_permissionResolved = true;
} }
m_hasBeenDisposed = true; m_hasBeenDisposed = true;
...@@ -64,14 +62,10 @@ ScriptPromise MIDIAccessInitializer::start() ...@@ -64,14 +62,10 @@ ScriptPromise MIDIAccessInitializer::start()
ScriptPromise promise = this->promise(); ScriptPromise promise = this->promise();
m_accessor = MIDIAccessor::create(this); m_accessor = MIDIAccessor::create(this);
if (!m_requestSysex) {
m_accessor->startSession();
return promise;
}
Document* document = toDocument(executionContext()); Document* document = toDocument(executionContext());
ASSERT(document); ASSERT(document);
if (MIDIController* controller = MIDIController::from(document->frame())) if (MIDIController* controller = MIDIController::from(document->frame()))
controller->requestSysexPermission(this); controller->requestPermission(this, m_options);
else else
reject(DOMException::create(SecurityError)); reject(DOMException::create(SecurityError));
...@@ -108,7 +102,7 @@ void MIDIAccessInitializer::didStartSession(bool success, const String& error, c ...@@ -108,7 +102,7 @@ void MIDIAccessInitializer::didStartSession(bool success, const String& error, c
{ {
ASSERT(m_accessor); ASSERT(m_accessor);
if (success) { if (success) {
resolve(MIDIAccess::create(m_accessor.release(), m_requestSysex, m_portDescriptors, executionContext())); resolve(MIDIAccess::create(m_accessor.release(), m_options.hasSysex(), m_portDescriptors, executionContext()));
} else { } else {
// The spec says the name is one of // The spec says the name is one of
// - SecurityError // - SecurityError
...@@ -131,9 +125,9 @@ void MIDIAccessInitializer::didStartSession(bool success, const String& error, c ...@@ -131,9 +125,9 @@ void MIDIAccessInitializer::didStartSession(bool success, const String& error, c
} }
} }
void MIDIAccessInitializer::resolveSysexPermission(bool allowed) void MIDIAccessInitializer::resolvePermission(bool allowed)
{ {
m_sysexPermissionResolved = true; m_permissionResolved = true;
if (allowed) if (allowed)
m_accessor->startSession(); m_accessor->startSession();
else else
......
...@@ -10,13 +10,13 @@ ...@@ -10,13 +10,13 @@
#include "modules/ModulesExport.h" #include "modules/ModulesExport.h"
#include "modules/webmidi/MIDIAccessor.h" #include "modules/webmidi/MIDIAccessor.h"
#include "modules/webmidi/MIDIAccessorClient.h" #include "modules/webmidi/MIDIAccessorClient.h"
#include "modules/webmidi/MIDIOptions.h"
#include "modules/webmidi/MIDIPort.h" #include "modules/webmidi/MIDIPort.h"
#include "wtf/OwnPtr.h" #include "wtf/OwnPtr.h"
#include "wtf/Vector.h" #include "wtf/Vector.h"
namespace blink { namespace blink {
class MIDIOptions;
class ScriptState; class ScriptState;
class MODULES_EXPORT MIDIAccessInitializer : public ScriptPromiseResolver, public MIDIAccessorClient { class MODULES_EXPORT MIDIAccessInitializer : public ScriptPromiseResolver, public MIDIAccessorClient {
...@@ -61,7 +61,7 @@ public: ...@@ -61,7 +61,7 @@ public:
void didStartSession(bool success, const String& error, const String& message) override; void didStartSession(bool success, const String& error, const String& message) override;
void didReceiveMIDIData(unsigned portIndex, const unsigned char* data, size_t length, double timeStamp) override { } void didReceiveMIDIData(unsigned portIndex, const unsigned char* data, size_t length, double timeStamp) override { }
void resolveSysexPermission(bool allowed); void resolvePermission(bool allowed);
SecurityOrigin* securityOrigin() const; SecurityOrigin* securityOrigin() const;
private: private:
...@@ -75,9 +75,9 @@ private: ...@@ -75,9 +75,9 @@ private:
OwnPtr<MIDIAccessor> m_accessor; OwnPtr<MIDIAccessor> m_accessor;
Vector<PortDescriptor> m_portDescriptors; Vector<PortDescriptor> m_portDescriptors;
bool m_requestSysex; MIDIOptions m_options;
bool m_hasBeenDisposed; bool m_hasBeenDisposed;
bool m_sysexPermissionResolved; bool m_permissionResolved;
}; };
} // namespace blink } // namespace blink
......
...@@ -38,11 +38,12 @@ namespace blink { ...@@ -38,11 +38,12 @@ namespace blink {
class LocalFrame; class LocalFrame;
class MIDIAccessInitializer; class MIDIAccessInitializer;
class MIDIOptions;
class MODULES_EXPORT MIDIClient { class MODULES_EXPORT MIDIClient {
public: public:
virtual void requestSysexPermission(MIDIAccessInitializer*) = 0; virtual void requestPermission(MIDIAccessInitializer*, const MIDIOptions&) = 0;
virtual void cancelSysexPermissionRequest(MIDIAccessInitializer*) = 0; virtual void cancelPermissionRequest(MIDIAccessInitializer*) = 0;
virtual ~MIDIClient() { } virtual ~MIDIClient() { }
}; };
......
...@@ -55,14 +55,14 @@ PassOwnPtrWillBeRawPtr<MIDIController> MIDIController::create(PassOwnPtr<MIDICli ...@@ -55,14 +55,14 @@ PassOwnPtrWillBeRawPtr<MIDIController> MIDIController::create(PassOwnPtr<MIDICli
return adoptPtrWillBeNoop(new MIDIController(client)); return adoptPtrWillBeNoop(new MIDIController(client));
} }
void MIDIController::requestSysexPermission(MIDIAccessInitializer* initializer) void MIDIController::requestPermission(MIDIAccessInitializer* initializer, const MIDIOptions& options)
{ {
m_client->requestSysexPermission(initializer); m_client->requestPermission(initializer, options);
} }
void MIDIController::cancelSysexPermissionRequest(MIDIAccessInitializer* initializer) void MIDIController::cancelPermissionRequest(MIDIAccessInitializer* initializer)
{ {
m_client->cancelSysexPermissionRequest(initializer); m_client->cancelPermissionRequest(initializer);
} }
void provideMIDITo(LocalFrame& frame, PassOwnPtr<MIDIClient> client) void provideMIDITo(LocalFrame& frame, PassOwnPtr<MIDIClient> client)
......
...@@ -38,6 +38,7 @@ namespace blink { ...@@ -38,6 +38,7 @@ namespace blink {
class MIDIAccessInitializer; class MIDIAccessInitializer;
class MIDIClient; class MIDIClient;
class MIDIOptions;
class MIDIController final : public NoBaseWillBeGarbageCollectedFinalized<MIDIController>, public WillBeHeapSupplement<LocalFrame> { class MIDIController final : public NoBaseWillBeGarbageCollectedFinalized<MIDIController>, public WillBeHeapSupplement<LocalFrame> {
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(MIDIController); WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(MIDIController);
...@@ -45,8 +46,8 @@ class MIDIController final : public NoBaseWillBeGarbageCollectedFinalized<MIDICo ...@@ -45,8 +46,8 @@ class MIDIController final : public NoBaseWillBeGarbageCollectedFinalized<MIDICo
public: public:
virtual ~MIDIController(); virtual ~MIDIController();
void requestSysexPermission(MIDIAccessInitializer*); void requestPermission(MIDIAccessInitializer*, const MIDIOptions&);
void cancelSysexPermissionRequest(MIDIAccessInitializer*); void cancelPermissionRequest(MIDIAccessInitializer*);
static PassOwnPtrWillBeRawPtr<MIDIController> create(PassOwnPtr<MIDIClient>); static PassOwnPtrWillBeRawPtr<MIDIController> create(PassOwnPtr<MIDIClient>);
static const char* supplementName(); static const char* supplementName();
......
...@@ -6,4 +6,5 @@ ...@@ -6,4 +6,5 @@
dictionary MIDIOptions { dictionary MIDIOptions {
boolean sysex; boolean sysex;
// TODO(crbug.com/502127): Add bool software to follow the latest spec.
}; };
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "modules/webmidi/MIDIAccessInitializer.h" #include "modules/webmidi/MIDIAccessInitializer.h"
#include "public/web/modules/webmidi/WebMIDIClient.h" #include "public/web/modules/webmidi/WebMIDIClient.h"
#include "public/web/modules/webmidi/WebMIDIOptions.h"
#include "public/web/modules/webmidi/WebMIDIPermissionRequest.h" #include "public/web/modules/webmidi/WebMIDIPermissionRequest.h"
namespace blink { namespace blink {
...@@ -41,18 +42,21 @@ MIDIClientProxy::MIDIClientProxy(WebMIDIClient* client) ...@@ -41,18 +42,21 @@ MIDIClientProxy::MIDIClientProxy(WebMIDIClient* client)
{ {
} }
void MIDIClientProxy::requestSysexPermission(MIDIAccessInitializer* initializer) void MIDIClientProxy::requestPermission(MIDIAccessInitializer* initializer, const MIDIOptions& options)
{ {
if (m_client) if (m_client) {
m_client->requestSysexPermission(WebMIDIPermissionRequest(initializer)); m_client->requestPermission(
else WebMIDIPermissionRequest(initializer),
initializer->resolveSysexPermission(false); WebMIDIOptions(options.hasSysex() ? WebMIDIOptions::SysexPermission::WithSysex : WebMIDIOptions::SysexPermission::WithoutSysex));
} else {
initializer->resolvePermission(false);
}
} }
void MIDIClientProxy::cancelSysexPermissionRequest(MIDIAccessInitializer* initializer) void MIDIClientProxy::cancelPermissionRequest(MIDIAccessInitializer* initializer)
{ {
if (m_client) if (m_client)
m_client->cancelSysexPermissionRequest(WebMIDIPermissionRequest(initializer)); m_client->cancelPermissionRequest(WebMIDIPermissionRequest(initializer));
} }
} // namespace blink } // namespace blink
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
namespace blink { namespace blink {
class MIDIAccessInitializer; class MIDIAccessInitializer;
class MIDIOptions;
class WebMIDIClient; class WebMIDIClient;
class MIDIClientProxy final : public MIDIClient { class MIDIClientProxy final : public MIDIClient {
...@@ -47,8 +48,8 @@ public: ...@@ -47,8 +48,8 @@ public:
} }
// MIDIClient // MIDIClient
void requestSysexPermission(MIDIAccessInitializer*) override; void requestPermission(MIDIAccessInitializer*, const MIDIOptions&) override;
void cancelSysexPermissionRequest(MIDIAccessInitializer*) override; void cancelPermissionRequest(MIDIAccessInitializer*) override;
private: private:
explicit MIDIClientProxy(WebMIDIClient*); explicit MIDIClientProxy(WebMIDIClient*);
......
...@@ -63,7 +63,7 @@ WebSecurityOrigin WebMIDIPermissionRequest::securityOrigin() const ...@@ -63,7 +63,7 @@ WebSecurityOrigin WebMIDIPermissionRequest::securityOrigin() const
void WebMIDIPermissionRequest::setIsAllowed(bool allowed) void WebMIDIPermissionRequest::setIsAllowed(bool allowed)
{ {
m_private->resolveSysexPermission(allowed); m_private->resolvePermission(allowed);
} }
} // namespace blink } // namespace blink
...@@ -524,6 +524,7 @@ ...@@ -524,6 +524,7 @@
"web/modules/serviceworker/WebServiceWorkerContextProxy.h", "web/modules/serviceworker/WebServiceWorkerContextProxy.h",
"web/modules/serviceworker/WebServiceWorkerNetworkProvider.h", "web/modules/serviceworker/WebServiceWorkerNetworkProvider.h",
"web/modules/webmidi/WebMIDIClient.h", "web/modules/webmidi/WebMIDIClient.h",
"web/modules/webmidi/WebMIDIOptions.h",
"web/modules/webmidi/WebMIDIPermissionRequest.h", "web/modules/webmidi/WebMIDIPermissionRequest.h",
"web/win/WebFontRendering.h", "web/win/WebFontRendering.h",
], ],
......
...@@ -33,23 +33,24 @@ ...@@ -33,23 +33,24 @@
namespace blink { namespace blink {
struct WebMIDIOptions;
class WebMIDIPermissionRequest; class WebMIDIPermissionRequest;
class WebMIDIClient { class WebMIDIClient {
public: public:
virtual ~WebMIDIClient() { } virtual ~WebMIDIClient() { }
// Request a permission to use system exclusive messages. Called when // Request a permission to use MIDI system. Called when requestMIDIAccess()
// MIDIOptions.sysex is true. // is called with any option.
// Once the request is done, any WebMIDIPermissionRequest instances equal to // Once the request is done, any WebMIDIPermissionRequest instances equal to
// |request| must not be accessed after that. // |request| must not be accessed after that.
virtual void requestSysexPermission(const WebMIDIPermissionRequest& /* request */) = 0; virtual void requestPermission(const WebMIDIPermissionRequest& /* request */, const WebMIDIOptions& /* options */) = 0;
// Cancel the request since the requesting frame may be moving to // Cancel the request since the requesting frame may be moving to
// a new page. // a new page.
// Once canceled, any WebMIDIPermissionRequest instances equal to // Once canceled, any WebMIDIPermissionRequest instances equal to
// |request| must not be accessed after that. // |request| must not be accessed after that.
virtual void cancelSysexPermissionRequest(const WebMIDIPermissionRequest& /* request */) = 0; virtual void cancelPermissionRequest(const WebMIDIPermissionRequest& /* request */) = 0;
}; };
} // namespace blink } // namespace blink
......
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef WebMIDIOptions_h
#define WebMIDIOptions_h
namespace blink {
struct WebMIDIOptions {
enum class SysexPermission { WithSysex, WithoutSysex };
explicit WebMIDIOptions(SysexPermission sysex)
: sysex(sysex)
{
}
const SysexPermission sysex;
// TODO(crbug.com/502127): Add bool software to follow the latest spec.
};
} // namespace blink
#endif // WebMIDIOptions_h
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment