| Index: Source/core/dom/FullscreenElementStack.cpp
|
| diff --git a/Source/core/dom/FullscreenElementStack.cpp b/Source/core/dom/FullscreenElementStack.cpp
|
| index 635639bb230857bf95f26c44635fe255b98068c5..4868011a43ed6e851d5736782a4ad9b7cc9b24b8 100644
|
| --- a/Source/core/dom/FullscreenElementStack.cpp
|
| +++ b/Source/core/dom/FullscreenElementStack.cpp
|
| @@ -60,7 +60,7 @@ const char* FullscreenElementStack::supplementName()
|
| return "FullscreenElementStack";
|
| }
|
|
|
| -FullscreenElementStack* FullscreenElementStack::from(Document* document)
|
| +FullscreenElementStack& FullscreenElementStack::from(Document& document)
|
| {
|
| FullscreenElementStack* fullscreen = fromIfExists(document);
|
| if (!fullscreen) {
|
| @@ -68,42 +68,42 @@ FullscreenElementStack* FullscreenElementStack::from(Document* document)
|
| DocumentSupplement::provideTo(document, supplementName(), adoptPtr(fullscreen));
|
| }
|
|
|
| - return fullscreen;
|
| + return *fullscreen;
|
| }
|
|
|
| -FullscreenElementStack* FullscreenElementStack::fromIfExistsSlow(Document* document)
|
| +FullscreenElementStack* FullscreenElementStack::fromIfExistsSlow(Document& document)
|
| {
|
| return static_cast<FullscreenElementStack*>(DocumentSupplement::from(document, supplementName()));
|
| }
|
|
|
| -Element* FullscreenElementStack::fullscreenElementFrom(Document* document)
|
| +Element* FullscreenElementStack::fullscreenElementFrom(Document& document)
|
| {
|
| if (FullscreenElementStack* found = fromIfExists(document))
|
| return found->webkitFullscreenElement();
|
| return 0;
|
| }
|
|
|
| -Element* FullscreenElementStack::currentFullScreenElementFrom(Document* document)
|
| +Element* FullscreenElementStack::currentFullScreenElementFrom(Document& document)
|
| {
|
| if (FullscreenElementStack* found = fromIfExists(document))
|
| return found->webkitCurrentFullScreenElement();
|
| return 0;
|
| }
|
|
|
| -bool FullscreenElementStack::isFullScreen(Document* document)
|
| +bool FullscreenElementStack::isFullScreen(Document& document)
|
| {
|
| if (FullscreenElementStack* found = fromIfExists(document))
|
| return found->webkitIsFullScreen();
|
| return false;
|
| }
|
|
|
| -FullscreenElementStack::FullscreenElementStack(Document* document)
|
| - : DocumentLifecycleObserver(document)
|
| +FullscreenElementStack::FullscreenElementStack(Document& document)
|
| + : DocumentLifecycleObserver(&document)
|
| , m_areKeysEnabledInFullScreen(false)
|
| , m_fullScreenRenderer(0)
|
| , m_fullScreenChangeDelayTimer(this, &FullscreenElementStack::fullScreenChangeDelayTimerFired)
|
| {
|
| - document->setHasFullscreenElementStack();
|
| + document.setHasFullscreenElementStack();
|
| }
|
|
|
| FullscreenElementStack::~FullscreenElementStack()
|
| @@ -171,7 +171,8 @@ void FullscreenElementStack::requestFullScreenForElement(Element* element, unsig
|
| // A descendant browsing context's document has a non-empty fullscreen element stack.
|
| bool descendentHasNonEmptyStack = false;
|
| for (Frame* descendant = document()->frame() ? document()->frame()->tree().traverseNext() : 0; descendant; descendant = descendant->tree().traverseNext()) {
|
| - if (fullscreenElementFrom(descendant->document())) {
|
| + ASSERT(descendant->document());
|
| + if (fullscreenElementFrom(*descendant->document())) {
|
| descendentHasNonEmptyStack = true;
|
| break;
|
| }
|
| @@ -217,19 +218,19 @@ void FullscreenElementStack::requestFullScreenForElement(Element* element, unsig
|
| // stack, and queue a task to fire an event named fullscreenchange with its bubbles attribute
|
| // set to true on the document.
|
| if (!followingDoc) {
|
| - from(currentDoc)->pushFullscreenElementStack(element);
|
| + from(*currentDoc).pushFullscreenElementStack(element);
|
| addDocumentToFullScreenChangeEventQueue(currentDoc);
|
| continue;
|
| }
|
|
|
| // 3. Otherwise, if document's fullscreen element stack is either empty or its top element
|
| // is not following document's browsing context container,
|
| - Element* topElement = fullscreenElementFrom(currentDoc);
|
| + Element* topElement = fullscreenElementFrom(*currentDoc);
|
| if (!topElement || topElement != followingDoc->ownerElement()) {
|
| // ...push following document's browsing context container on document's fullscreen element
|
| // 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());
|
| + from(*currentDoc).pushFullscreenElementStack(followingDoc->ownerElement());
|
| addDocumentToFullScreenChangeEventQueue(currentDoc);
|
| continue;
|
| }
|
| @@ -252,20 +253,21 @@ void FullscreenElementStack::requestFullScreenForElement(Element* element, unsig
|
|
|
| void FullscreenElementStack::webkitCancelFullScreen()
|
| {
|
| + ASSERT(document()->topDocument());
|
| // The Mozilla "cancelFullScreen()" API behaves like the W3C "fully exit fullscreen" behavior, which
|
| // is defined as:
|
| // "To fully exit fullscreen act as if the exitFullscreen() method was invoked on the top-level browsing
|
| // context's document and subsequently empty that document's fullscreen element stack."
|
| - if (!fullscreenElementFrom(document()->topDocument()))
|
| + if (!fullscreenElementFrom(*document()->topDocument()))
|
| return;
|
|
|
| // To achieve that aim, remove all the elements from the top document's stack except for the first before
|
| // calling webkitExitFullscreen():
|
| Vector<RefPtr<Element> > replacementFullscreenElementStack;
|
| - replacementFullscreenElementStack.append(fullscreenElementFrom(document()->topDocument()));
|
| - FullscreenElementStack* topFullscreenElementStack = from(document()->topDocument());
|
| - topFullscreenElementStack->m_fullScreenElementStack.swap(replacementFullscreenElementStack);
|
| - topFullscreenElementStack->webkitExitFullscreen();
|
| + replacementFullscreenElementStack.append(fullscreenElementFrom(*document()->topDocument()));
|
| + FullscreenElementStack& topFullscreenElementStack = from(*document()->topDocument());
|
| + topFullscreenElementStack.m_fullScreenElementStack.swap(replacementFullscreenElementStack);
|
| + topFullscreenElementStack.webkitExitFullscreen();
|
| }
|
|
|
| void FullscreenElementStack::webkitExitFullscreen()
|
| @@ -285,14 +287,16 @@ void FullscreenElementStack::webkitExitFullscreen()
|
| // away from the doc is first.
|
| Deque<RefPtr<Document> > descendants;
|
| for (Frame* descendant = document()->frame() ? document()->frame()->tree().traverseNext() : 0; descendant; descendant = descendant->tree().traverseNext()) {
|
| - if (fullscreenElementFrom(descendant->document()))
|
| + ASSERT(descendant->document());
|
| + if (fullscreenElementFrom(*descendant->document()))
|
| descendants.prepend(descendant->document());
|
| }
|
|
|
| // 4. For each descendant in descendants, empty descendant's fullscreen element stack, and queue a
|
| // task to fire an event named fullscreenchange with its bubbles attribute set to true on descendant.
|
| for (Deque<RefPtr<Document> >::iterator i = descendants.begin(); i != descendants.end(); ++i) {
|
| - from(i->get())->clearFullscreenElementStack();
|
| + ASSERT(*i);
|
| + from(**i).clearFullscreenElementStack();
|
| addDocumentToFullScreenChangeEventQueue(i->get());
|
| }
|
|
|
| @@ -300,11 +304,11 @@ void FullscreenElementStack::webkitExitFullscreen()
|
| Element* newTop = 0;
|
| while (currentDoc) {
|
| // 1. Pop the top element of doc's fullscreen element stack.
|
| - from(currentDoc)->popFullscreenElementStack();
|
| + from(*currentDoc).popFullscreenElementStack();
|
|
|
| // If doc's fullscreen element stack is non-empty and the element now at the top is either
|
| // not in a document or its node document is not doc, repeat this substep.
|
| - newTop = fullscreenElementFrom(currentDoc);
|
| + newTop = fullscreenElementFrom(*currentDoc);
|
| if (newTop && (!newTop->inDocument() || newTop->document() != currentDoc))
|
| continue;
|
|
|
| @@ -345,13 +349,13 @@ void FullscreenElementStack::webkitExitFullscreen()
|
| host->chrome().client().enterFullScreenForElement(newTop);
|
| }
|
|
|
| -bool FullscreenElementStack::webkitFullscreenEnabled(Document* document)
|
| +bool FullscreenElementStack::webkitFullscreenEnabled(Document& document)
|
| {
|
| // 4. The fullscreenEnabled attribute must return true if the context object and all ancestor
|
| // browsing context's documents have their fullscreen enabled flag set, or false otherwise.
|
|
|
| // Top-level browsing contexts are implied to have their allowFullScreen attribute set.
|
| - return isAttributeOnAllOwners(allowfullscreenAttr, webkitallowfullscreenAttr, document->ownerElement());
|
| + return isAttributeOnAllOwners(allowfullscreenAttr, webkitallowfullscreenAttr, document.ownerElement());
|
|
|
| }
|
|
|
| @@ -438,7 +442,8 @@ void FullscreenElementStack::webkitDidExitFullScreenForElement(Element*)
|
| Document* exitingDocument = document();
|
| if (m_fullScreenChangeEventTargetQueue.isEmpty() && m_fullScreenErrorEventTargetQueue.isEmpty())
|
| exitingDocument = document()->topDocument();
|
| - from(exitingDocument)->m_fullScreenChangeDelayTimer.startOneShot(0);
|
| + ASSERT(exitingDocument);
|
| + from(*exitingDocument).m_fullScreenChangeDelayTimer.startOneShot(0);
|
| }
|
|
|
| void FullscreenElementStack::setFullScreenRenderer(RenderFullScreen* renderer)
|
| @@ -557,7 +562,7 @@ void FullscreenElementStack::addDocumentToFullScreenChangeEventQueue(Document* d
|
| ASSERT(doc);
|
|
|
| Node* target = 0;
|
| - if (FullscreenElementStack* fullscreen = fromIfExists(doc)) {
|
| + if (FullscreenElementStack* fullscreen = fromIfExists(*doc)) {
|
| target = fullscreen->webkitFullscreenElement();
|
| if (!target)
|
| target = fullscreen->webkitCurrentFullScreenElement();
|
|
|