blob: 64515fb44bd23028b8286a41b995cd0f6a53449a [file] [log] [blame]
// 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 "content/renderer/media/media_permission_dispatcher_impl.h"
#include "base/bind.h"
#include "base/logging.h"
#include "base/thread_task_runner_handle.h"
#include "content/public/common/service_registry.h"
#include "content/public/renderer/render_frame.h"
#include "content/renderer/media/media_permission_dispatcher_proxy.h"
#include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
#include "url/gurl.h"
namespace {
using Type = media::MediaPermission::Type;
content::PermissionName MediaPermissionTypeToPermissionName(Type type) {
switch (type) {
case Type::PROTECTED_MEDIA_IDENTIFIER:
return content::PermissionName::PROTECTED_MEDIA_IDENTIFIER;
case Type::AUDIO_CAPTURE:
return content::PermissionName::AUDIO_CAPTURE;
case Type::VIDEO_CAPTURE:
return content::PermissionName::VIDEO_CAPTURE;
}
NOTREACHED();
return content::PermissionName::PROTECTED_MEDIA_IDENTIFIER;
}
} // namespace
namespace content {
MediaPermissionDispatcherImpl::MediaPermissionDispatcherImpl(
RenderFrame* render_frame)
: RenderFrameObserver(render_frame),
task_runner_(base::ThreadTaskRunnerHandle::Get()),
weak_ptr_factory_(this) {}
MediaPermissionDispatcherImpl::~MediaPermissionDispatcherImpl() {
DCHECK(thread_checker().CalledOnValidThread());
}
void MediaPermissionDispatcherImpl::HasPermission(
Type type,
const GURL& security_origin,
const PermissionStatusCB& permission_status_cb) {
DCHECK(thread_checker().CalledOnValidThread());
if (!permission_service_.get()) {
render_frame()->GetServiceRegistry()->ConnectToRemoteService(
mojo::GetProxy(&permission_service_));
}
permission_service_->HasPermission(
MediaPermissionTypeToPermissionName(type), security_origin.spec(),
base::Bind(&MediaPermissionDispatcherImpl::OnPermissionStatus,
weak_ptr_factory_.GetWeakPtr(),
RegisterCallback(permission_status_cb)));
}
void MediaPermissionDispatcherImpl::RequestPermission(
Type type,
const GURL& security_origin,
const PermissionStatusCB& permission_status_cb) {
DCHECK(thread_checker().CalledOnValidThread());
if (!permission_service_.get()) {
render_frame()->GetServiceRegistry()->ConnectToRemoteService(
mojo::GetProxy(&permission_service_));
}
permission_service_->RequestPermission(
MediaPermissionTypeToPermissionName(type), security_origin.spec(),
blink::WebUserGestureIndicator::isProcessingUserGesture(),
base::Bind(&MediaPermissionDispatcherImpl::OnPermissionStatus,
weak_ptr_factory_.GetWeakPtr(),
RegisterCallback(permission_status_cb)));
}
scoped_ptr<media::MediaPermission> MediaPermissionDispatcherImpl::CreateProxy(
scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner) {
scoped_ptr<media::MediaPermission> media_permission_proxy(
new MediaPermissionDispatcherProxy(task_runner_, caller_task_runner,
weak_ptr_factory_.GetWeakPtr()));
return media_permission_proxy;
}
void MediaPermissionDispatcherImpl::OnPermissionStatus(
uint32_t request_id,
PermissionStatus status) {
DCHECK(thread_checker().CalledOnValidThread());
DeliverResult(request_id, status == PermissionStatus::GRANTED);
}
} // namespace content