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

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

Issue 2573573002: Switch PermissionStatus events to an observer model. (Closed)
Patch Set: Remove call to registerPreFinalizer(). Created 4 years 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 21 matching lines...) Expand all
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 : ActiveScriptWrappable(this), 39 : ActiveScriptWrappable(this),
40 SuspendableObject(executionContext), 40 SuspendableObject(executionContext),
41 m_status(status), 41 m_status(status),
42 m_descriptor(std::move(descriptor)) {} 42 m_descriptor(std::move(descriptor)),
43 m_binding(this) {}
43 44
44 PermissionStatus::~PermissionStatus() { 45 PermissionStatus::~PermissionStatus() {}
mlamouri (slow - plz ping) 2016/12/19 13:37:45 = default;
Reilly Grant (use Gerrit) 2016/12/19 22:23:59 Done.
46
47 void PermissionStatus::dispose() {
45 stopListening(); 48 stopListening();
46 } 49 }
47 50
48 const AtomicString& PermissionStatus::interfaceName() const { 51 const AtomicString& PermissionStatus::interfaceName() const {
49 return EventTargetNames::PermissionStatus; 52 return EventTargetNames::PermissionStatus;
50 } 53 }
51 54
52 ExecutionContext* PermissionStatus::getExecutionContext() const { 55 ExecutionContext* PermissionStatus::getExecutionContext() const {
53 return SuspendableObject::getExecutionContext(); 56 return SuspendableObject::getExecutionContext();
54 } 57 }
55 58
56 void PermissionStatus::permissionChanged(MojoPermissionStatus status) {
57 if (m_status == status)
58 return;
59
60 m_status = status;
61 dispatchEvent(Event::create(EventTypeNames::change));
62
63 m_service->GetNextPermissionChange(
64 m_descriptor->Clone(), getExecutionContext()->getSecurityOrigin(),
65 m_status,
66 convertToBaseCallback(WTF::bind(&PermissionStatus::permissionChanged,
67 wrapWeakPersistent(this))));
68 }
69
70 bool PermissionStatus::hasPendingActivity() const { 59 bool PermissionStatus::hasPendingActivity() const {
71 return m_service; 60 return m_binding.is_bound();
72 } 61 }
73 62
74 void PermissionStatus::resume() { 63 void PermissionStatus::resume() {
75 startListening(); 64 startListening();
76 } 65 }
77 66
78 void PermissionStatus::suspend() { 67 void PermissionStatus::suspend() {
79 stopListening(); 68 stopListening();
80 } 69 }
81 70
82 void PermissionStatus::contextDestroyed() { 71 void PermissionStatus::contextDestroyed() {
83 stopListening(); 72 stopListening();
84 } 73 }
85 74
86 void PermissionStatus::startListening() {
87 DCHECK(!m_service);
88 connectToPermissionService(getExecutionContext(), mojo::GetProxy(&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 { 75 String PermissionStatus::state() const {
101 switch (m_status) { 76 switch (m_status) {
102 case MojoPermissionStatus::GRANTED: 77 case MojoPermissionStatus::GRANTED:
103 return "granted"; 78 return "granted";
104 case MojoPermissionStatus::DENIED: 79 case MojoPermissionStatus::DENIED:
105 return "denied"; 80 return "denied";
106 case MojoPermissionStatus::ASK: 81 case MojoPermissionStatus::ASK:
107 return "prompt"; 82 return "prompt";
108 } 83 }
109 84
110 ASSERT_NOT_REACHED(); 85 ASSERT_NOT_REACHED();
111 return "denied"; 86 return "denied";
112 } 87 }
113 88
89 void PermissionStatus::startListening() {
90 DCHECK(!m_binding.is_bound());
91 mojom::blink::PermissionObserverPtr observer;
92 m_binding.Bind(mojo::GetProxy(&observer));
93
94 mojom::blink::PermissionServicePtr service;
95 connectToPermissionService(getExecutionContext(), mojo::GetProxy(&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) {
mlamouri (slow - plz ping) 2016/12/19 13:37:45 You should ideally prefer early returns: ``` if (m
Reilly Grant (use Gerrit) 2016/12/19 22:23:59 Done.
107 m_status = status;
108 dispatchEvent(Event::create(EventTypeNames::change));
109 }
110 }
111
114 DEFINE_TRACE(PermissionStatus) { 112 DEFINE_TRACE(PermissionStatus) {
115 EventTargetWithInlineData::trace(visitor); 113 EventTargetWithInlineData::trace(visitor);
116 SuspendableObject::trace(visitor); 114 SuspendableObject::trace(visitor);
117 } 115 }
118 116
119 } // namespace blink 117 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698