blob: a39645fdb0580e74b6ae71792ae62e0b446cc289 [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 "third_party/blink/renderer/modules/permissions/permission_status.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/dom/events/event.h"
#include "third_party/blink/renderer/modules/event_target_modules_names.h"
#include "third_party/blink/renderer/modules/permissions/permission_utils.h"
#include "third_party/blink/renderer/platform/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* execution_context,
MojoPermissionStatus status,
MojoPermissionDescriptor descriptor) {
PermissionStatus* permission_status = MakeGarbageCollected<PermissionStatus>(
execution_context, status, std::move(descriptor));
permission_status->UpdateStateIfNeeded();
permission_status->StartListening();
return permission_status;
}
PermissionStatus::PermissionStatus(ExecutionContext* execution_context,
MojoPermissionStatus status,
MojoPermissionDescriptor descriptor)
: ContextLifecycleStateObserver(execution_context),
status_(status),
descriptor_(std::move(descriptor)) {}
PermissionStatus::~PermissionStatus() = default;
void PermissionStatus::Dispose() {
StopListening();
}
const AtomicString& PermissionStatus::InterfaceName() const {
return event_target_names::kPermissionStatus;
}
ExecutionContext* PermissionStatus::GetExecutionContext() const {
return ContextLifecycleStateObserver::GetExecutionContext();
}
bool PermissionStatus::HasPendingActivity() const {
return receiver_.is_bound();
}
void PermissionStatus::ContextLifecycleStateChanged(
mojom::FrameLifecycleState state) {
if (state == mojom::FrameLifecycleState::kRunning)
StartListening();
else
StopListening();
}
void PermissionStatus::ContextDestroyed(ExecutionContext*) {
StopListening();
}
String PermissionStatus::state() const {
return PermissionStatusToString(status_);
}
void PermissionStatus::StartListening() {
DCHECK(!receiver_.is_bound());
mojo::PendingRemote<mojom::blink::PermissionObserver> observer;
scoped_refptr<base::SingleThreadTaskRunner> task_runner =
GetExecutionContext()->GetTaskRunner(TaskType::kPermission);
receiver_.Bind(observer.InitWithNewPipeAndPassReceiver(), task_runner);
mojo::Remote<mojom::blink::PermissionService> service;
ConnectToPermissionService(GetExecutionContext(),
service.BindNewPipeAndPassReceiver(task_runner));
service->AddPermissionObserver(descriptor_->Clone(), status_,
std::move(observer));
}
void PermissionStatus::StopListening() {
receiver_.reset();
}
void PermissionStatus::OnPermissionStatusChange(MojoPermissionStatus status) {
if (status_ == status)
return;
status_ = status;
DispatchEvent(*Event::Create(event_type_names::kChange));
}
void PermissionStatus::Trace(blink::Visitor* visitor) {
EventTargetWithInlineData::Trace(visitor);
ContextLifecycleStateObserver::Trace(visitor);
}
} // namespace blink