summaryrefslogtreecommitdiffstats
path: root/chrome/browser/usb/web_usb_permission_bubble.cc
blob: 6ba7d266ef6fbdb2dbaee68bfb40641487393b64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// Copyright 2015 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.

#include "chrome/browser/usb/web_usb_permission_bubble.h"

#include <utility>

#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/chrome_bubble_manager.h"
#include "chrome/browser/usb/usb_chooser_bubble_delegate.h"
#include "components/bubble/bubble_controller.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_frame_host.h"

ChromeWebUsbPermissionBubble::ChromeWebUsbPermissionBubble(
    content::RenderFrameHost* render_frame_host)
    : render_frame_host_(render_frame_host) {
  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
  DCHECK(render_frame_host);
}

ChromeWebUsbPermissionBubble::~ChromeWebUsbPermissionBubble() {
  for (const auto& bubble : bubbles_) {
    if (bubble)
      bubble->CloseBubble(BUBBLE_CLOSE_FORCED);
  }
}

void ChromeWebUsbPermissionBubble::GetPermission(
    mojo::Array<device::usb::DeviceFilterPtr> device_filters,
    const GetPermissionCallback& callback) {
  content::WebContents* web_contents =
      content::WebContents::FromRenderFrameHost(render_frame_host_);
  Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
  scoped_ptr<UsbChooserBubbleDelegate> bubble_delegate(
      new UsbChooserBubbleDelegate(render_frame_host_,
                                   std::move(device_filters),
                                   render_frame_host_, callback));
  UsbChooserBubbleDelegate* bubble_delegate_ptr = bubble_delegate.get();
  BubbleReference bubble_controller =
      browser->GetBubbleManager()->ShowBubble(std::move(bubble_delegate));
  bubble_delegate_ptr->set_bubble_controller(bubble_controller);
  bubbles_.push_back(bubble_controller);
}

void ChromeWebUsbPermissionBubble::Bind(
    mojo::InterfaceRequest<webusb::WebUsbPermissionBubble> request) {
  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
  bindings_.AddBinding(this, std::move(request));
}