Index: Source/modules/presentation/Presentation.cpp |
diff --git a/Source/modules/presentation/Presentation.cpp b/Source/modules/presentation/Presentation.cpp |
index 6213d4f13505572dec88ee06057941372f2fe0df..f8c23793164f8ce08199999066bb62ba88d28ff9 100644 |
--- a/Source/modules/presentation/Presentation.cpp |
+++ b/Source/modules/presentation/Presentation.cpp |
@@ -14,11 +14,32 @@ |
#include "core/frame/LocalFrame.h" |
#include "modules/EventTargetModules.h" |
#include "modules/presentation/AvailableChangeEvent.h" |
+#include "modules/presentation/DefaultPresentationStartEvent.h" |
#include "modules/presentation/PresentationController.h" |
#include "modules/presentation/PresentationSessionClientCallbacks.h" |
namespace blink { |
+struct PresentationEventInfo { |
+ using EventWatcherUpdateFunc = void (PresentationController::*)(bool); |
+ |
+ AtomicString eventType; |
+ EventWatcherUpdateFunc updateFunc; |
+}; |
+ |
+// Maps the event type to the corresponding update method of PresentationController. |
+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
|
+{ |
+ static PresentationEventInfo eventInfos[] = { |
+ { EventTypeNames::availablechange, &PresentationController::updateAvailableChangeWatched }, |
Peter Beverloo
2015/03/03 21:19:25
You're introducing a static initializer here.
Pre
whywhat
2015/03/05 18:41:47
Acknowledged.
|
+ { EventTypeNames::defaultpresentationstart, &PresentationController::updateDefaultPresentationStartWatched }, |
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.
|
+ }; |
+ length = WTF_ARRAY_LENGTH(eventInfos); |
+ |
+ return eventInfos; |
+} |
+ |
+ |
Peter Beverloo
2015/03/03 21:19:25
nit: double blank line
whywhat
2015/03/05 18:41:47
Done.
|
Presentation::Presentation(LocalFrame* frame) |
: DOMWindowProperty(frame) |
{ |
@@ -95,44 +116,74 @@ ScriptPromise Presentation::joinSession(ScriptState* state, const String& presen |
bool Presentation::addEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture) |
{ |
- bool hadEventListeners = hasEventListeners(EventTypeNames::availablechange); |
- if (!RefCountedGarbageCollectedEventTargetWithInlineData<Presentation>::addEventListener(eventType, listener, useCapture)) |
- return false; |
+ unsigned length = 0; |
+ 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.
|
- if (hasEventListeners(EventTypeNames::availablechange) && !hadEventListeners) { |
- PresentationController* controller = presentationController(); |
- if (controller) |
- controller->updateAvailableChangeWatched(true); |
+ for (unsigned i = 0; i < length; ++i) { |
+ PresentationEventInfo& eventInfo = eventInfos[i]; |
+ if (eventInfo.eventType != eventType) |
+ continue; |
+ |
+ bool hadEventListeners = hasEventListeners(eventType); |
+ if (!RefCountedGarbageCollectedEventTargetWithInlineData<Presentation>::addEventListener(eventType, listener, useCapture)) |
+ return false; |
+ |
+ if (hasEventListeners(eventType) && !hadEventListeners) { |
+ PresentationController* controller = presentationController(); |
+ if (controller) |
+ (controller->*eventInfo.updateFunc)(true); |
+ } |
+ |
+ return true; |
} |
- return true; |
+ return RefCountedGarbageCollectedEventTargetWithInlineData<Presentation>::addEventListener(eventType, listener, useCapture); |
} |
bool Presentation::removeEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture) |
{ |
- bool hadEventListeners = hasEventListeners(EventTypeNames::availablechange); |
- if (!RefCountedGarbageCollectedEventTargetWithInlineData<Presentation>::removeEventListener(eventType, listener, useCapture)) |
- return false; |
+ unsigned length = 0; |
+ PresentationEventInfo* eventInfos = presentationEventInfos(length); |
- if (hadEventListeners && !hasEventListeners(EventTypeNames::availablechange)) { |
- PresentationController* controller = presentationController(); |
- if (controller) |
- controller->updateAvailableChangeWatched(false); |
+ for (unsigned i = 0; i < length; ++i) { |
+ PresentationEventInfo& eventInfo = eventInfos[i]; |
+ if (eventInfo.eventType != eventType) |
+ continue; |
+ |
+ bool hadEventListeners = hasEventListeners(eventType); |
+ if (!RefCountedGarbageCollectedEventTargetWithInlineData<Presentation>::removeEventListener(eventType, listener, useCapture)) |
+ return false; |
+ |
+ if (hadEventListeners && !hasEventListeners(eventType)) { |
+ PresentationController* controller = presentationController(); |
+ if (controller) |
+ (controller->*eventInfo.updateFunc)(false); |
+ } |
+ |
+ return true; |
} |
- return true; |
+ return RefCountedGarbageCollectedEventTargetWithInlineData<Presentation>::removeEventListener(eventType, listener, useCapture); |
} |
void Presentation::removeAllEventListeners() |
{ |
- bool hadEventListeners = hasEventListeners(EventTypeNames::availablechange); |
- RefCountedGarbageCollectedEventTargetWithInlineData<Presentation>::removeAllEventListeners(); |
+ unsigned length = 0; |
+ PresentationEventInfo* eventInfos = presentationEventInfos(length); |
+ |
+ for (unsigned i = 0; i < length; ++i) { |
+ PresentationEventInfo& eventInfo = eventInfos[i]; |
+ if (!hasEventListeners(eventInfo.eventType)) |
+ continue; |
- if (hadEventListeners) { |
PresentationController* controller = presentationController(); |
- if (controller) |
- controller->updateAvailableChangeWatched(false); |
+ if (!controller) |
+ continue; |
+ |
+ (controller->*eventInfo.updateFunc)(false); |
} |
+ |
+ RefCountedGarbageCollectedEventTargetWithInlineData<Presentation>::removeAllEventListeners(); |
} |
void Presentation::didChangeAvailability(bool available) |
@@ -145,6 +196,16 @@ bool Presentation::isAvailableChangeWatched() const |
return hasEventListeners(EventTypeNames::availablechange); |
} |
+void Presentation::didStartDefaultPresentation(PresentationSession* session) |
+{ |
+ dispatchEvent(DefaultPresentationStartEvent::create(EventTypeNames::defaultpresentationstart, session)); |
+} |
+ |
+bool Presentation::isDefaultPresentationStartWatched() const |
+{ |
+ return hasEventListeners(EventTypeNames::defaultpresentationstart); |
+} |
+ |
void Presentation::registerSession(PresentationSession* session) |
{ |
m_openSessions.add(session); |