blob: cdab25757f0c1af6f0e80587453079be5f5eae5a [file] [log] [blame]
// Copyright 2020 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/frame_usb_services.h"
#include "build/build_config.h"
#include "chrome/browser/usb/usb_tab_helper.h"
#include "content/public/common/content_features.h"
#include "mojo/public/cpp/bindings/message.h"
#include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom.h"
#if defined(OS_ANDROID)
#include "chrome/browser/android/usb/web_usb_chooser_android.h"
#else
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/usb/web_usb_chooser_desktop.h"
#endif // defined(OS_ANDROID)
using content::RenderFrameHost;
using content::WebContents;
namespace {
// The renderer performs its own feature policy checks so a request that gets
// to the browser process indicates malicious code.
const char kFeaturePolicyViolation[] =
"Feature policy blocks access to WebUSB.";
} // namespace
FrameUsbServices::FrameUsbServices(RenderFrameHost* render_frame_host)
: render_frame_host_(render_frame_host) {
// Create UsbTabHelper on creating FrameUsbServices.
UsbTabHelper::CreateForWebContents(
WebContents::FromRenderFrameHost(render_frame_host_));
}
FrameUsbServices::~FrameUsbServices() = default;
void FrameUsbServices::InitializeWebUsbChooser() {
if (!usb_chooser_) {
usb_chooser_.reset(
#if defined(OS_ANDROID)
new WebUsbChooserAndroid(render_frame_host_));
#else
new WebUsbChooserDesktop(render_frame_host_));
#endif // defined(OS_ANDROID)
}
}
void FrameUsbServices::InitializeWebUsbService(
mojo::PendingReceiver<blink::mojom::WebUsbService> receiver) {
if (!AllowedByFeaturePolicy()) {
mojo::ReportBadMessage(kFeaturePolicyViolation);
return;
}
InitializeWebUsbChooser();
if (!web_usb_service_) {
web_usb_service_.reset(
new WebUsbServiceImpl(render_frame_host_, usb_chooser_->GetWeakPtr()));
}
web_usb_service_->BindReceiver(std::move(receiver));
}
bool FrameUsbServices::AllowedByFeaturePolicy() const {
return render_frame_host_->IsFeatureEnabled(
blink::mojom::FeaturePolicyFeature::kUsb);
}
// static
void FrameUsbServices::CreateFrameUsbServices(
RenderFrameHost* render_frame_host,
mojo::PendingReceiver<blink::mojom::WebUsbService> receiver) {
FrameUsbServices::CreateForCurrentDocument(render_frame_host);
FrameUsbServices::GetForCurrentDocument(render_frame_host)
->InitializeWebUsbService(std::move(receiver));
}
RENDER_DOCUMENT_HOST_USER_DATA_KEY_IMPL(FrameUsbServices)