summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/modules/permissions/permission_status.cc
blob: 8fbd71da01119caf33dc8cb7f6d1081836461969 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// 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 "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->PauseIfNeeded();
  permission_status->StartListening();
  return permission_status;
}

PermissionStatus::PermissionStatus(ExecutionContext* execution_context,
                                   MojoPermissionStatus status,
                                   MojoPermissionDescriptor descriptor)
    : PausableObject(execution_context),
      status_(status),
      descriptor_(std::move(descriptor)),
      binding_(this) {}

PermissionStatus::~PermissionStatus() = default;

void PermissionStatus::Dispose() {
  StopListening();
}

const AtomicString& PermissionStatus::InterfaceName() const {
  return event_target_names::kPermissionStatus;
}

ExecutionContext* PermissionStatus::GetExecutionContext() const {
  return PausableObject::GetExecutionContext();
}

bool PermissionStatus::HasPendingActivity() const {
  return binding_.is_bound();
}

void PermissionStatus::ContextUnpaused() {
  StartListening();
}

void PermissionStatus::ContextPaused(PauseState) {
  StopListening();
}

void PermissionStatus::ContextDestroyed(ExecutionContext*) {
  StopListening();
}

String PermissionStatus::state() const {
  switch (status_) {
    case MojoPermissionStatus::GRANTED:
      return "granted";
    case MojoPermissionStatus::DENIED:
      return "denied";
    case MojoPermissionStatus::ASK:
      return "prompt";
  }

  NOTREACHED();
  return "denied";
}

void PermissionStatus::StartListening() {
  DCHECK(!binding_.is_bound());
  mojom::blink::PermissionObserverPtr observer;
  scoped_refptr<base::SingleThreadTaskRunner> task_runner =
      GetExecutionContext()->GetTaskRunner(TaskType::kPermission);
  binding_.Bind(mojo::MakeRequest(&observer, task_runner), task_runner);

  mojom::blink::PermissionServicePtr service;
  ConnectToPermissionService(GetExecutionContext(),
                             mojo::MakeRequest(&service, task_runner));
  service->AddPermissionObserver(descriptor_->Clone(), status_,
                                 std::move(observer));
}

void PermissionStatus::StopListening() {
  binding_.Close();
}

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);
  PausableObject::Trace(visitor);
}

}  // namespace blink