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

Side by Side Diff: Source/modules/presentation/Presentation.cpp

Issue 974993002: [Presentation API] Added the DefaultPresentationStart event and parsing of the default presentation… (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Default implementation for the new WebPresentationClient method Created 5 years, 9 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 "config.h" 5 #include "config.h"
6 #include "modules/presentation/Presentation.h" 6 #include "modules/presentation/Presentation.h"
7 7
8 #include "bindings/core/v8/ScriptPromise.h" 8 #include "bindings/core/v8/ScriptPromise.h"
9 #include "bindings/core/v8/ScriptPromiseResolver.h" 9 #include "bindings/core/v8/ScriptPromiseResolver.h"
10 #include "bindings/core/v8/ScriptState.h" 10 #include "bindings/core/v8/ScriptState.h"
11 #include "core/dom/DOMException.h" 11 #include "core/dom/DOMException.h"
12 #include "core/dom/Document.h" 12 #include "core/dom/Document.h"
13 #include "core/dom/ExceptionCode.h" 13 #include "core/dom/ExceptionCode.h"
14 #include "core/frame/LocalFrame.h" 14 #include "core/frame/LocalFrame.h"
15 #include "modules/EventTargetModules.h" 15 #include "modules/EventTargetModules.h"
16 #include "modules/presentation/AvailableChangeEvent.h" 16 #include "modules/presentation/AvailableChangeEvent.h"
17 #include "modules/presentation/DefaultPresentationStartEvent.h"
17 #include "modules/presentation/PresentationController.h" 18 #include "modules/presentation/PresentationController.h"
18 #include "modules/presentation/PresentationSessionClientCallbacks.h" 19 #include "modules/presentation/PresentationSessionClientCallbacks.h"
19 20
20 namespace blink { 21 namespace blink {
21 22
23 struct PresentationEventInfo {
24 using EventWatcherUpdateFunc = void (PresentationController::*)(bool);
25
26 AtomicString eventType;
27 EventWatcherUpdateFunc updateFunc;
28 };
29
30 // Maps the event type to the corresponding update method of PresentationControl ler.
31 static PresentationEventInfo* presentationEventInfos(unsigned& length)
Peter Beverloo 2015/03/03 21:19:25 nit: unsigned int? Not strictly required (yet), bu
whywhat 2015/03/05 18:41:47 Removed
32 {
33 static PresentationEventInfo eventInfos[] = {
34 { EventTypeNames::availablechange, &PresentationController::updateAvaila bleChangeWatched },
Peter Beverloo 2015/03/03 21:19:25 You're introducing a static initializer here. Pre
whywhat 2015/03/05 18:41:47 Acknowledged.
35 { EventTypeNames::defaultpresentationstart, &PresentationController::upd ateDefaultPresentationStartWatched },
Peter Beverloo 2015/03/03 21:19:25 How many events do you expect to have in the end?
whywhat 2015/03/05 18:41:47 Acknowledged.
36 };
37 length = WTF_ARRAY_LENGTH(eventInfos);
38
39 return eventInfos;
40 }
41
42
Peter Beverloo 2015/03/03 21:19:25 nit: double blank line
whywhat 2015/03/05 18:41:47 Done.
22 Presentation::Presentation(LocalFrame* frame) 43 Presentation::Presentation(LocalFrame* frame)
23 : DOMWindowProperty(frame) 44 : DOMWindowProperty(frame)
24 { 45 {
25 } 46 }
26 47
27 Presentation::~Presentation() 48 Presentation::~Presentation()
28 { 49 {
29 } 50 }
30 51
31 // static 52 // static
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 resolver->reject(DOMException::create(InvalidStateError, "The object is no longer attached to the frame.")); 109 resolver->reject(DOMException::create(InvalidStateError, "The object is no longer attached to the frame."));
89 return promise; 110 return promise;
90 } 111 }
91 controller->joinSession(presentationUrl, presentationId, new PresentationSes sionClientCallbacks(resolver, this)); 112 controller->joinSession(presentationUrl, presentationId, new PresentationSes sionClientCallbacks(resolver, this));
92 113
93 return promise; 114 return promise;
94 } 115 }
95 116
96 bool Presentation::addEventListener(const AtomicString& eventType, PassRefPtr<Ev entListener> listener, bool useCapture) 117 bool Presentation::addEventListener(const AtomicString& eventType, PassRefPtr<Ev entListener> listener, bool useCapture)
97 { 118 {
98 bool hadEventListeners = hasEventListeners(EventTypeNames::availablechange); 119 unsigned length = 0;
99 if (!RefCountedGarbageCollectedEventTargetWithInlineData<Presentation>::addE ventListener(eventType, listener, useCapture)) 120 PresentationEventInfo* eventInfos = presentationEventInfos(length);
Peter Beverloo 2015/03/03 21:19:24 nit: may as well pass a pointer to presentationEve
whywhat 2015/03/05 18:41:47 Acknowledged.
100 return false;
101 121
102 if (hasEventListeners(EventTypeNames::availablechange) && !hadEventListeners ) { 122 for (unsigned i = 0; i < length; ++i) {
103 PresentationController* controller = presentationController(); 123 PresentationEventInfo& eventInfo = eventInfos[i];
104 if (controller) 124 if (eventInfo.eventType != eventType)
105 controller->updateAvailableChangeWatched(true); 125 continue;
126
127 bool hadEventListeners = hasEventListeners(eventType);
128 if (!RefCountedGarbageCollectedEventTargetWithInlineData<Presentation>:: addEventListener(eventType, listener, useCapture))
129 return false;
130
131 if (hasEventListeners(eventType) && !hadEventListeners) {
132 PresentationController* controller = presentationController();
133 if (controller)
134 (controller->*eventInfo.updateFunc)(true);
135 }
136
137 return true;
106 } 138 }
107 139
108 return true; 140 return RefCountedGarbageCollectedEventTargetWithInlineData<Presentation>::ad dEventListener(eventType, listener, useCapture);
109 } 141 }
110 142
111 bool Presentation::removeEventListener(const AtomicString& eventType, PassRefPtr <EventListener> listener, bool useCapture) 143 bool Presentation::removeEventListener(const AtomicString& eventType, PassRefPtr <EventListener> listener, bool useCapture)
112 { 144 {
113 bool hadEventListeners = hasEventListeners(EventTypeNames::availablechange); 145 unsigned length = 0;
114 if (!RefCountedGarbageCollectedEventTargetWithInlineData<Presentation>::remo veEventListener(eventType, listener, useCapture)) 146 PresentationEventInfo* eventInfos = presentationEventInfos(length);
115 return false;
116 147
117 if (hadEventListeners && !hasEventListeners(EventTypeNames::availablechange) ) { 148 for (unsigned i = 0; i < length; ++i) {
118 PresentationController* controller = presentationController(); 149 PresentationEventInfo& eventInfo = eventInfos[i];
119 if (controller) 150 if (eventInfo.eventType != eventType)
120 controller->updateAvailableChangeWatched(false); 151 continue;
152
153 bool hadEventListeners = hasEventListeners(eventType);
154 if (!RefCountedGarbageCollectedEventTargetWithInlineData<Presentation>:: removeEventListener(eventType, listener, useCapture))
155 return false;
156
157 if (hadEventListeners && !hasEventListeners(eventType)) {
158 PresentationController* controller = presentationController();
159 if (controller)
160 (controller->*eventInfo.updateFunc)(false);
161 }
162
163 return true;
121 } 164 }
122 165
123 return true; 166 return RefCountedGarbageCollectedEventTargetWithInlineData<Presentation>::re moveEventListener(eventType, listener, useCapture);
124 } 167 }
125 168
126 void Presentation::removeAllEventListeners() 169 void Presentation::removeAllEventListeners()
127 { 170 {
128 bool hadEventListeners = hasEventListeners(EventTypeNames::availablechange); 171 unsigned length = 0;
172 PresentationEventInfo* eventInfos = presentationEventInfos(length);
173
174 for (unsigned i = 0; i < length; ++i) {
175 PresentationEventInfo& eventInfo = eventInfos[i];
176 if (!hasEventListeners(eventInfo.eventType))
177 continue;
178
179 PresentationController* controller = presentationController();
180 if (!controller)
181 continue;
182
183 (controller->*eventInfo.updateFunc)(false);
184 }
185
129 RefCountedGarbageCollectedEventTargetWithInlineData<Presentation>::removeAll EventListeners(); 186 RefCountedGarbageCollectedEventTargetWithInlineData<Presentation>::removeAll EventListeners();
130
131 if (hadEventListeners) {
132 PresentationController* controller = presentationController();
133 if (controller)
134 controller->updateAvailableChangeWatched(false);
135 }
136 } 187 }
137 188
138 void Presentation::didChangeAvailability(bool available) 189 void Presentation::didChangeAvailability(bool available)
139 { 190 {
140 dispatchEvent(AvailableChangeEvent::create(EventTypeNames::availablechange, available)); 191 dispatchEvent(AvailableChangeEvent::create(EventTypeNames::availablechange, available));
141 } 192 }
142 193
143 bool Presentation::isAvailableChangeWatched() const 194 bool Presentation::isAvailableChangeWatched() const
144 { 195 {
145 return hasEventListeners(EventTypeNames::availablechange); 196 return hasEventListeners(EventTypeNames::availablechange);
146 } 197 }
147 198
199 void Presentation::didStartDefaultPresentation(PresentationSession* session)
200 {
201 dispatchEvent(DefaultPresentationStartEvent::create(EventTypeNames::defaultp resentationstart, session));
202 }
203
204 bool Presentation::isDefaultPresentationStartWatched() const
205 {
206 return hasEventListeners(EventTypeNames::defaultpresentationstart);
207 }
208
148 void Presentation::registerSession(PresentationSession* session) 209 void Presentation::registerSession(PresentationSession* session)
149 { 210 {
150 m_openSessions.add(session); 211 m_openSessions.add(session);
151 } 212 }
152 213
153 PresentationController* Presentation::presentationController() 214 PresentationController* Presentation::presentationController()
154 { 215 {
155 if (!frame()) 216 if (!frame())
156 return nullptr; 217 return nullptr;
157 return PresentationController::from(*frame()); 218 return PresentationController::from(*frame());
158 } 219 }
159 220
160 } // namespace blink 221 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698