Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(314)

Side by Side Diff: third_party/WebKit/Source/modules/permissions/PermissionStatus.cpp

Issue 2573573002: Switch PermissionStatus events to an observer model. (Closed)
Patch Set: Rebased. Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/permissions/PermissionStatus.h" 5 #include "modules/permissions/PermissionStatus.h"
6 6
7 #include "bindings/core/v8/ScriptPromiseResolver.h" 7 #include "bindings/core/v8/ScriptPromiseResolver.h"
8 #include "core/dom/Document.h" 8 #include "core/dom/Document.h"
9 #include "core/events/Event.h" 9 #include "core/events/Event.h"
10 #include "modules/EventTargetModulesNames.h" 10 #include "modules/EventTargetModulesNames.h"
(...skipping 20 matching lines...) Expand all
31 permissionStatus->suspendIfNeeded(); 31 permissionStatus->suspendIfNeeded();
32 permissionStatus->startListening(); 32 permissionStatus->startListening();
33 return permissionStatus; 33 return permissionStatus;
34 } 34 }
35 35
36 PermissionStatus::PermissionStatus(ExecutionContext* executionContext, 36 PermissionStatus::PermissionStatus(ExecutionContext* executionContext,
37 MojoPermissionStatus status, 37 MojoPermissionStatus status,
38 MojoPermissionDescriptor descriptor) 38 MojoPermissionDescriptor descriptor)
39 : SuspendableObject(executionContext), 39 : SuspendableObject(executionContext),
40 m_status(status), 40 m_status(status),
41 m_descriptor(std::move(descriptor)) {} 41 m_descriptor(std::move(descriptor)),
42 m_binding(this) {}
42 43
43 PermissionStatus::~PermissionStatus() { 44 PermissionStatus::~PermissionStatus() = default;
45
46 void PermissionStatus::dispose() {
44 stopListening(); 47 stopListening();
45 } 48 }
46 49
47 const AtomicString& PermissionStatus::interfaceName() const { 50 const AtomicString& PermissionStatus::interfaceName() const {
48 return EventTargetNames::PermissionStatus; 51 return EventTargetNames::PermissionStatus;
49 } 52 }
50 53
51 ExecutionContext* PermissionStatus::getExecutionContext() const { 54 ExecutionContext* PermissionStatus::getExecutionContext() const {
52 return SuspendableObject::getExecutionContext(); 55 return SuspendableObject::getExecutionContext();
53 } 56 }
54 57
55 void PermissionStatus::permissionChanged(MojoPermissionStatus status) {
56 if (m_status == status)
57 return;
58
59 m_status = status;
60 dispatchEvent(Event::create(EventTypeNames::change));
61
62 m_service->GetNextPermissionChange(
63 m_descriptor->Clone(), getExecutionContext()->getSecurityOrigin(),
64 m_status,
65 convertToBaseCallback(WTF::bind(&PermissionStatus::permissionChanged,
66 wrapWeakPersistent(this))));
67 }
68
69 bool PermissionStatus::hasPendingActivity() const { 58 bool PermissionStatus::hasPendingActivity() const {
70 return m_service; 59 return m_binding.is_bound();
71 } 60 }
72 61
73 void PermissionStatus::resume() { 62 void PermissionStatus::resume() {
74 startListening(); 63 startListening();
75 } 64 }
76 65
77 void PermissionStatus::suspend() { 66 void PermissionStatus::suspend() {
78 stopListening(); 67 stopListening();
79 } 68 }
80 69
81 void PermissionStatus::contextDestroyed() { 70 void PermissionStatus::contextDestroyed() {
82 stopListening(); 71 stopListening();
83 } 72 }
84 73
85 void PermissionStatus::startListening() {
86 DCHECK(!m_service);
87 connectToPermissionService(getExecutionContext(),
88 mojo::MakeRequest(&m_service));
89 m_service->GetNextPermissionChange(
90 m_descriptor->Clone(), getExecutionContext()->getSecurityOrigin(),
91 m_status,
92 convertToBaseCallback(WTF::bind(&PermissionStatus::permissionChanged,
93 wrapWeakPersistent(this))));
94 }
95
96 void PermissionStatus::stopListening() {
97 m_service.reset();
98 }
99
100 String PermissionStatus::state() const { 74 String PermissionStatus::state() const {
101 switch (m_status) { 75 switch (m_status) {
102 case MojoPermissionStatus::GRANTED: 76 case MojoPermissionStatus::GRANTED:
103 return "granted"; 77 return "granted";
104 case MojoPermissionStatus::DENIED: 78 case MojoPermissionStatus::DENIED:
105 return "denied"; 79 return "denied";
106 case MojoPermissionStatus::ASK: 80 case MojoPermissionStatus::ASK:
107 return "prompt"; 81 return "prompt";
108 } 82 }
109 83
110 ASSERT_NOT_REACHED(); 84 ASSERT_NOT_REACHED();
111 return "denied"; 85 return "denied";
112 } 86 }
113 87
88 void PermissionStatus::startListening() {
89 DCHECK(!m_binding.is_bound());
90 mojom::blink::PermissionObserverPtr observer;
91 m_binding.Bind(mojo::MakeRequest(&observer));
92
93 mojom::blink::PermissionServicePtr service;
94 connectToPermissionService(getExecutionContext(),
95 mojo::MakeRequest(&service));
96 service->AddPermissionObserver(m_descriptor->Clone(),
97 getExecutionContext()->getSecurityOrigin(),
98 m_status, std::move(observer));
99 }
100
101 void PermissionStatus::stopListening() {
102 m_binding.Close();
103 }
104
105 void PermissionStatus::OnPermissionStatusChange(MojoPermissionStatus status) {
106 if (m_status == status)
107 return;
108
109 m_status = status;
110 dispatchEvent(Event::create(EventTypeNames::change));
111 }
112
114 DEFINE_TRACE(PermissionStatus) { 113 DEFINE_TRACE(PermissionStatus) {
115 EventTargetWithInlineData::trace(visitor); 114 EventTargetWithInlineData::trace(visitor);
116 SuspendableObject::trace(visitor); 115 SuspendableObject::trace(visitor);
117 } 116 }
118 117
119 } // namespace blink 118 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698