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

Unified Diff: Source/core/dom/FullscreenElementStack.cpp

Issue 365903006: Merge the fullscreen event queues (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: introduce enqueueChangeEvent/enqueueErrorEvent Created 6 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/dom/FullscreenElementStack.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/dom/FullscreenElementStack.cpp
diff --git a/Source/core/dom/FullscreenElementStack.cpp b/Source/core/dom/FullscreenElementStack.cpp
index 934b0eb7e4fe1de75081d73e22c1443ddb4e6114..378084a43638a761a281017a1b0f889e80e56904 100644
--- a/Source/core/dom/FullscreenElementStack.cpp
+++ b/Source/core/dom/FullscreenElementStack.cpp
@@ -58,6 +58,13 @@ static bool fullscreenIsAllowedForAllOwners(const Document& document)
return true;
}
+static PassRefPtrWillBeRawPtr<Event> createEvent(const AtomicString& type, EventTarget& target)
+{
+ RefPtrWillBeRawPtr<Event> event = Event::createBubble(type);
+ event->setTarget(&target);
+ return event;
+}
+
const char* FullscreenElementStack::supplementName()
{
return "FullscreenElementStack";
@@ -104,7 +111,7 @@ FullscreenElementStack::FullscreenElementStack(Document& document)
: DocumentLifecycleObserver(&document)
, m_areKeysEnabledInFullScreen(false)
, m_fullScreenRenderer(0)
- , m_fullScreenChangeDelayTimer(this, &FullscreenElementStack::fullScreenChangeDelayTimerFired)
+ , m_eventQueueTimer(this, &FullscreenElementStack::eventQueueTimerFired)
{
document.setHasFullscreenElementStack();
}
@@ -120,8 +127,7 @@ inline Document* FullscreenElementStack::document()
void FullscreenElementStack::documentWasDetached()
{
- m_fullScreenChangeEventTargetQueue.clear();
- m_fullScreenErrorEventTargetQueue.clear();
+ m_eventQueue.clear();
if (m_fullScreenRenderer)
setFullScreenRenderer(0);
@@ -234,7 +240,7 @@ void FullscreenElementStack::requestFullScreenForElement(Element& element, Reque
// set to true on the document.
if (!followingDoc) {
from(*currentDoc).pushFullscreenElementStack(element);
- addDocumentToFullScreenChangeEventQueue(*currentDoc);
+ enqueueChangeEvent(*currentDoc);
continue;
}
@@ -246,7 +252,7 @@ void FullscreenElementStack::requestFullScreenForElement(Element& element, Reque
// stack, and queue a task to fire an event named fullscreenchange with its bubbles attribute
// set to true on document.
from(*currentDoc).pushFullscreenElementStack(*followingDoc->ownerElement());
- addDocumentToFullScreenChangeEventQueue(*currentDoc);
+ enqueueChangeEvent(*currentDoc);
continue;
}
@@ -262,8 +268,7 @@ void FullscreenElementStack::requestFullScreenForElement(Element& element, Reque
return;
} while (0);
- m_fullScreenErrorEventTargetQueue.append(&element);
- m_fullScreenChangeDelayTimer.startOneShot(0, FROM_HERE);
+ enqueueErrorEvent(element);
}
void FullscreenElementStack::webkitCancelFullScreen()
@@ -314,7 +319,7 @@ void FullscreenElementStack::webkitExitFullscreen()
for (WillBeHeapDeque<RefPtrWillBeMember<Document> >::iterator i = descendants.begin(); i != descendants.end(); ++i) {
ASSERT(*i);
from(**i).clearFullscreenElementStack();
- addDocumentToFullScreenChangeEventQueue(**i);
+ enqueueChangeEvent(**i);
}
// 5. While doc is not null, run these substeps:
@@ -331,7 +336,7 @@ void FullscreenElementStack::webkitExitFullscreen()
// 2. Queue a task to fire an event named fullscreenchange with its bubbles attribute set to true
// on doc.
- addDocumentToFullScreenChangeEventQueue(*currentDoc);
+ enqueueChangeEvent(*currentDoc);
// 3. If doc's fullscreen element stack is empty and doc's browsing context has a browsing context
// container, set doc to that browsing context container's node document.
@@ -417,7 +422,7 @@ void FullscreenElementStack::webkitDidEnterFullScreenForElement(Element*)
m_fullScreenElement->didBecomeFullscreenElement();
- m_fullScreenChangeDelayTimer.startOneShot(0, FROM_HERE);
+ m_eventQueueTimer.startOneShot(0, FROM_HERE);
}
void FullscreenElementStack::webkitWillExitFullScreenForElement(Element*)
@@ -453,10 +458,10 @@ void FullscreenElementStack::webkitDidExitFullScreenForElement(Element*)
// means that the events will be queued there. So if we have no events here, start the timer on
// the exiting document.
Document* exitingDocument = document();
- if (m_fullScreenChangeEventTargetQueue.isEmpty() && m_fullScreenErrorEventTargetQueue.isEmpty())
+ if (m_eventQueue.isEmpty())
exitingDocument = &document()->topDocument();
ASSERT(exitingDocument);
- from(*exitingDocument).m_fullScreenChangeDelayTimer.startOneShot(0, FROM_HERE);
+ from(*exitingDocument).m_eventQueueTimer.startOneShot(0, FROM_HERE);
}
void FullscreenElementStack::setFullScreenRenderer(RenderFullScreen* renderer)
@@ -483,35 +488,44 @@ void FullscreenElementStack::fullScreenRendererDestroyed()
m_fullScreenRenderer = 0;
}
-void FullscreenElementStack::fullScreenChangeDelayTimerFired(Timer<FullscreenElementStack>*)
+void FullscreenElementStack::enqueueChangeEvent(Document& document)
+{
+ ASSERT(document.hasFullscreenElementStack());
+ FullscreenElementStack& fullscreen = from(document);
+
+ EventTarget* target = fullscreen.webkitFullscreenElement();
+ if (!target)
+ target = fullscreen.webkitCurrentFullScreenElement();
+ if (!target)
+ target = &document;
+ m_eventQueue.append(createEvent(EventTypeNames::webkitfullscreenchange, *target));
+ // NOTE: The timer is started in webkitDidEnterFullScreenForElement/webkitDidExitFullScreenForElement.
+}
+
+void FullscreenElementStack::enqueueErrorEvent(Element& element)
+{
+ m_eventQueue.append(createEvent(EventTypeNames::webkitfullscreenerror, element));
+ m_eventQueueTimer.startOneShot(0, FROM_HERE);
+}
+
+void FullscreenElementStack::eventQueueTimerFired(Timer<FullscreenElementStack>*)
{
// Since we dispatch events in this function, it's possible that the
// document will be detached and GC'd. We protect it here to make sure we
// can finish the function successfully.
RefPtrWillBeRawPtr<Document> protectDocument(document());
- WillBeHeapDeque<RefPtrWillBeMember<Node> > changeQueue;
- m_fullScreenChangeEventTargetQueue.swap(changeQueue);
- WillBeHeapDeque<RefPtrWillBeMember<Node> > errorQueue;
- m_fullScreenErrorEventTargetQueue.swap(errorQueue);
+ WillBeHeapDeque<RefPtrWillBeRawPtr<Event> > eventQueue;
+ m_eventQueue.swap(eventQueue);
- while (!changeQueue.isEmpty()) {
- RefPtrWillBeRawPtr<Node> node = changeQueue.takeFirst();
+ while (!eventQueue.isEmpty()) {
+ RefPtrWillBeRawPtr<Event> event = eventQueue.takeFirst();
+ Node* target = event->target()->toNode();
// If the element was removed from our tree, also message the documentElement.
- if (!node->inDocument() && document()->documentElement())
- changeQueue.append(document()->documentElement());
+ if (!target->inDocument() && document()->documentElement())
+ eventQueue.append(createEvent(event->type(), *document()->documentElement()));
- node->dispatchEvent(Event::createBubble(EventTypeNames::webkitfullscreenchange));
- }
-
- while (!errorQueue.isEmpty()) {
- RefPtrWillBeRawPtr<Node> node = errorQueue.takeFirst();
-
- // If the element was removed from our tree, also message the documentElement.
- if (!node->inDocument() && document()->documentElement())
- errorQueue.append(document()->documentElement());
-
- node->dispatchEvent(Event::createBubble(EventTypeNames::webkitfullscreenerror));
+ target->dispatchEvent(event);
}
}
@@ -558,25 +572,11 @@ void FullscreenElementStack::pushFullscreenElementStack(Element& element)
m_fullScreenElementStack.append(&element);
}
-void FullscreenElementStack::addDocumentToFullScreenChangeEventQueue(Document& doc)
-{
- ASSERT(doc.hasFullscreenElementStack());
- FullscreenElementStack& fullscreen = from(doc);
-
- Node* target = fullscreen.webkitFullscreenElement();
- if (!target)
- target = fullscreen.webkitCurrentFullScreenElement();
- if (!target)
- target = &doc;
- m_fullScreenChangeEventTargetQueue.append(target);
-}
-
void FullscreenElementStack::trace(Visitor* visitor)
{
visitor->trace(m_fullScreenElement);
visitor->trace(m_fullScreenElementStack);
- visitor->trace(m_fullScreenChangeEventTargetQueue);
- visitor->trace(m_fullScreenErrorEventTargetQueue);
+ visitor->trace(m_eventQueue);
DocumentSupplement::trace(visitor);
}
« no previous file with comments | « Source/core/dom/FullscreenElementStack.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698