Home | History | Annotate | Download | only in media
      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 
     14 using blink::WebMIDIPermissionRequest;
     15 using blink::WebSecurityOrigin;
     16 
     17 namespace content {
     18 
     19 MIDIDispatcher::MIDIDispatcher(RenderViewImpl* render_view)
     20     : RenderViewObserver(render_view) {
     21 }
     22 
     23 MIDIDispatcher::~MIDIDispatcher() {}
     24 
     25 bool 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 
     35 void 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 
     44 void 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 
     60 void MIDIDispatcher::OnSysExPermissionApproved(int bridge_id, bool is_allowed) {
     61   // |request| can be NULL when the request is canceled.
     62   WebMIDIPermissionRequest* request = requests_.Lookup(bridge_id);
     63   if (!request)
     64     return;
     65   request->setIsAllowed(is_allowed);
     66   requests_.Remove(bridge_id);
     67 }
     68 
     69 }  // namespace content
     70