blob: 3730575bbe0b37ec93e09cf5adfb83fe68a517a4 [file] [log] [blame]
// 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/PermissionController.h"
#include "modules/permissions/Permissions.h"
#include "public/platform/Platform.h"
#include "public/platform/modules/permissions/WebPermissionClient.h"
namespace blink {
// static
PermissionStatus* PermissionStatus::take(ScriptPromiseResolver* resolver, WebPermissionStatus status, WebPermissionType type)
{
return PermissionStatus::createAndListen(resolver->getExecutionContext(), status, type);
}
PermissionStatus* PermissionStatus::createAndListen(ExecutionContext* executionContext, WebPermissionStatus status, WebPermissionType type)
{
PermissionStatus* permissionStatus = new PermissionStatus(executionContext, status, type);
permissionStatus->suspendIfNeeded();
permissionStatus->startListening();
return permissionStatus;
}
PermissionStatus::PermissionStatus(ExecutionContext* executionContext, WebPermissionStatus status, WebPermissionType type)
: ActiveScriptWrappable(this)
, ActiveDOMObject(executionContext)
, m_status(status)
, m_type(type)
, m_listening(false)
{
}
PermissionStatus::~PermissionStatus()
{
stopListening();
}
const AtomicString& PermissionStatus::interfaceName() const
{
return EventTargetNames::PermissionStatus;
}
ExecutionContext* PermissionStatus::getExecutionContext() const
{
return ActiveDOMObject::getExecutionContext();
}
void PermissionStatus::permissionChanged(WebPermissionType type, WebPermissionStatus status)
{
ASSERT(m_type == type);
if (m_status == status)
return;
m_status = status;
dispatchEvent(Event::create(EventTypeNames::change));
}
bool PermissionStatus::hasPendingActivity() const
{
return m_listening;
}
void PermissionStatus::resume()
{
startListening();
}
void PermissionStatus::suspend()
{
stopListening();
}
void PermissionStatus::stop()
{
stopListening();
}
void PermissionStatus::startListening()
{
ASSERT(!m_listening);
WebPermissionClient* client = Permissions::getClient(getExecutionContext());
if (!client)
return;
m_listening = true;
client->startListening(m_type, KURL(KURL(), getExecutionContext()->getSecurityOrigin()->toString()), this);
}
void PermissionStatus::stopListening()
{
if (!m_listening)
return;
ASSERT(getExecutionContext());
m_listening = false;
WebPermissionClient* client = Permissions::getClient(getExecutionContext());
if (!client)
return;
client->stopListening(this);
}
String PermissionStatus::state() const
{
switch (m_status) {
case WebPermissionStatusGranted:
return "granted";
case WebPermissionStatusDenied:
return "denied";
case WebPermissionStatusPrompt:
return "prompt";
}
ASSERT_NOT_REACHED();
return "denied";
}
DEFINE_TRACE(PermissionStatus)
{
EventTargetWithInlineData::trace(visitor);
ActiveDOMObject::trace(visitor);
}
} // namespace blink