blob: b9560026a6ad8006e59dde879ae465479a60bea5 [file]
// Copyright 2014 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 "modules/permissions/PermissionStatus.h"
#include "bindings/core/v8/ScriptPromiseResolver.h"
#include "core/dom/Document.h"
#include "core/events/Event.h"
#include "modules/EventTargetModulesNames.h"
#include "modules/permissions/PermissionUtils.h"
#include "public/platform/Platform.h"
#include "wtf/Functional.h"
namespace blink {
// static
PermissionStatus* PermissionStatus::take(ScriptPromiseResolver* resolver,
MojoPermissionStatus status,
MojoPermissionDescriptor descriptor) {
return PermissionStatus::createAndListen(resolver->getExecutionContext(),
status, std::move(descriptor));
}
PermissionStatus* PermissionStatus::createAndListen(
ExecutionContext* executionContext,
MojoPermissionStatus status,
MojoPermissionDescriptor descriptor) {
PermissionStatus* permissionStatus =
new PermissionStatus(executionContext, status, std::move(descriptor));
permissionStatus->suspendIfNeeded();
permissionStatus->startListening();
return permissionStatus;
}
PermissionStatus::PermissionStatus(ExecutionContext* executionContext,
MojoPermissionStatus status,
MojoPermissionDescriptor descriptor)
: SuspendableObject(executionContext),
m_status(status),
m_descriptor(std::move(descriptor)),
m_binding(this) {}
PermissionStatus::~PermissionStatus() = default;
void PermissionStatus::dispose() {
stopListening();
}
const AtomicString& PermissionStatus::interfaceName() const {
return EventTargetNames::PermissionStatus;
}
ExecutionContext* PermissionStatus::getExecutionContext() const {
return SuspendableObject::getExecutionContext();
}
bool PermissionStatus::hasPendingActivity() const {
return m_binding.is_bound();
}
void PermissionStatus::resume() {
startListening();
}
void PermissionStatus::suspend() {
stopListening();
}
void PermissionStatus::contextDestroyed(ExecutionContext*) {
stopListening();
}
String PermissionStatus::state() const {
switch (m_status) {
case MojoPermissionStatus::GRANTED:
return "granted";
case MojoPermissionStatus::DENIED:
return "denied";
case MojoPermissionStatus::ASK:
return "prompt";
}
ASSERT_NOT_REACHED();
return "denied";
}
void PermissionStatus::startListening() {
DCHECK(!m_binding.is_bound());
mojom::blink::PermissionObserverPtr observer;
m_binding.Bind(mojo::MakeRequest(&observer));
mojom::blink::PermissionServicePtr service;
connectToPermissionService(getExecutionContext(),
mojo::MakeRequest(&service));
service->AddPermissionObserver(m_descriptor->Clone(),
getExecutionContext()->getSecurityOrigin(),
m_status, std::move(observer));
}
void PermissionStatus::stopListening() {
m_binding.Close();
}
void PermissionStatus::OnPermissionStatusChange(MojoPermissionStatus status) {
if (m_status == status)
return;
m_status = status;
dispatchEvent(Event::create(EventTypeNames::change));
}
DEFINE_TRACE(PermissionStatus) {
EventTargetWithInlineData::trace(visitor);
SuspendableObject::trace(visitor);
}
} // namespace blink