blob: 8b3411f2eb2c7e68be853428ff06e0b411d7acb6 [file] [log] [blame]
// Copyright 2017 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 "content/browser/generic_sensor/sensor_provider_proxy_impl.h"
#include <utility>
#include "content/public/browser/browser_context.h"
#include "content/public/browser/permission_manager.h"
#include "content/public/browser/permission_type.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/service_manager_connection.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "services/device/public/interfaces/constants.mojom.h"
#include "services/service_manager/public/cpp/connector.h"
namespace content {
SensorProviderProxyImpl::SensorProviderProxyImpl(
PermissionManager* permission_manager,
RenderFrameHost* render_frame_host)
: permission_manager_(permission_manager),
render_frame_host_(render_frame_host) {
DCHECK(permission_manager);
DCHECK(render_frame_host);
}
SensorProviderProxyImpl::~SensorProviderProxyImpl() = default;
void SensorProviderProxyImpl::Bind(
device::mojom::SensorProviderRequest request) {
binding_set_.AddBinding(this, std::move(request));
}
void SensorProviderProxyImpl::GetSensor(
device::mojom::SensorType type,
device::mojom::SensorRequest sensor_request,
GetSensorCallback callback) {
ServiceManagerConnection* connection =
ServiceManagerConnection::GetForProcess();
if (!connection || !CheckPermission(type)) {
std::move(callback).Run(nullptr, nullptr);
return;
}
if (!sensor_provider_) {
connection->GetConnector()->BindInterface(
device::mojom::kServiceName, mojo::MakeRequest(&sensor_provider_));
sensor_provider_.set_connection_error_handler(
base::Bind(&device::mojom::SensorProviderPtr::reset,
base::Unretained(&sensor_provider_)));
}
sensor_provider_->GetSensor(type, std::move(sensor_request),
std::move(callback));
}
bool SensorProviderProxyImpl::CheckPermission(
device::mojom::SensorType type) const {
content::WebContents* web_contents =
content::WebContents::FromRenderFrameHost(render_frame_host_);
if (!web_contents)
return false;
const GURL& embedding_origin = web_contents->GetLastCommittedURL();
const GURL& requesting_origin = render_frame_host_->GetLastCommittedURL();
blink::mojom::PermissionStatus permission_status =
permission_manager_->GetPermissionStatus(
PermissionType::SENSORS, requesting_origin, embedding_origin);
return permission_status == blink::mojom::PermissionStatus::GRANTED;
}
} // namespace content