midi_dispatcher.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/renderer/media/midi_dispatcher.h"
6
7#include "base/bind.h"
8#include "base/message_loop/message_loop.h"
9#include "content/common/media/midi_messages.h"
10#include "content/renderer/render_view_impl.h"
11#include "third_party/WebKit/public/web/WebMIDIPermissionRequest.h"
12#include "third_party/WebKit/public/web/WebSecurityOrigin.h"
13
14using blink::WebMIDIPermissionRequest;
15using blink::WebSecurityOrigin;
16
17namespace content {
18
19MidiDispatcher::MidiDispatcher(RenderViewImpl* render_view)
20    : RenderViewObserver(render_view) {
21}
22
23MidiDispatcher::~MidiDispatcher() {}
24
25bool MidiDispatcher::OnMessageReceived(const IPC::Message& message) {
26  bool handled = true;
27  IPC_BEGIN_MESSAGE_MAP(MidiDispatcher, message)
28    IPC_MESSAGE_HANDLER(MidiMsg_SysExPermissionApproved,
29                        OnSysExPermissionApproved)
30    IPC_MESSAGE_UNHANDLED(handled = false)
31  IPC_END_MESSAGE_MAP()
32  return handled;
33}
34
35void MidiDispatcher::requestSysExPermission(
36      const WebMIDIPermissionRequest& request) {
37  int bridge_id = requests_.Add(new WebMIDIPermissionRequest(request));
38  WebSecurityOrigin security_origin = request.securityOrigin();
39  std::string origin = security_origin.toString().utf8();
40  GURL url(origin);
41  Send(new MidiHostMsg_RequestSysExPermission(routing_id(), bridge_id, url));
42}
43
44void MidiDispatcher::cancelSysExPermissionRequest(
45    const WebMIDIPermissionRequest& request) {
46  for (IDMap<WebMIDIPermissionRequest>::iterator it(&requests_);
47       !it.IsAtEnd();
48       it.Advance()) {
49    WebMIDIPermissionRequest* value = it.GetCurrentValue();
50    if (value->equals(request)) {
51      base::string16 origin = request.securityOrigin().toString();
52      Send(new MidiHostMsg_CancelSysExPermissionRequest(
53          routing_id(), it.GetCurrentKey(), GURL(origin)));
54      requests_.Remove(it.GetCurrentKey());
55      break;
56    }
57  }
58}
59
60void MidiDispatcher::OnSysExPermissionApproved(int bridge_id,
61                                               bool is_allowed) {
62  // |request| can be NULL when the request is canceled.
63  WebMIDIPermissionRequest* request = requests_.Lookup(bridge_id);
64  if (!request)
65    return;
66  request->setIsAllowed(is_allowed);
67  requests_.Remove(bridge_id);
68}
69
70}  // namespace content
71