1521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)/*
2521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) *           (C) 2001 Dirk Mueller (mueller@kde.org)
5521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) *           (C) 2006 Alexey Proskuryakov (ap@webkit.org)
6521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All rights reserved.
7521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
8521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
9521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
10521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) *
11521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * This library is free software; you can redistribute it and/or
12521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
13521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * License as published by the Free Software Foundation; either
14521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
15521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) *
16521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
17521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
18521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * Library General Public License for more details.
20521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) *
21521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
22521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
23521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) * Boston, MA 02110-1301, USA.
25521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) *
26521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) */
27521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
28521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "config.h"
299e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "core/dom/Fullscreen.h"
30521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h"
32521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "core/dom/Document.h"
3306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/Event.h"
3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/FrameHost.h"
35d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/frame/Settings.h"
3707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "core/frame/UseCounter.h"
38e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/html/HTMLIFrameElement.h"
39c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/html/HTMLMediaElement.h"
40521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "core/page/Chrome.h"
41521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "core/page/ChromeClient.h"
427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/page/EventHandler.h"
43521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "core/rendering/RenderFullScreen.h"
441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/UserGestureIndicator.h"
45521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
46c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
47521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
48521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)using namespace HTMLNames;
49521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
5007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochstatic bool fullscreenIsAllowedForAllOwners(const Document& document)
51521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
529e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    for (const Element* owner = document.ownerElement(); owner; owner = owner->document().ownerElement()) {
53197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (!isHTMLIFrameElement(owner))
54197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return false;
55197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (!owner->hasAttribute(allowfullscreenAttr))
56197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return false;
57197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
58521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    return true;
59521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
60521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
61c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)static bool fullscreenIsSupported(const Document& document)
62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
63c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // Fullscreen is supported if there is no previously-established user preference,
64c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // security risk, or platform limitation.
65e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return !document.settings() || document.settings()->fullscreenSupported();
66c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
67c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
68c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)static bool fullscreenIsSupported(const Document& document, const Element& element)
69c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
70e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document.settings() || (document.settings()->disallowFullscreenForNonMediaElements() && !isHTMLMediaElement(element)))
71c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return false;
72c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return fullscreenIsSupported(document);
73c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
74c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
759e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)static bool fullscreenElementReady(const Element& element, Fullscreen::RequestType requestType)
769e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles){
779e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // A fullscreen element ready check for an element |element| returns true if all of the
789e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // following are true, and false otherwise:
799e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
809e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // |element| is in a document.
819e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (!element.inDocument())
829e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        return false;
839e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
849e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // |element|'s node document's fullscreen enabled flag is set.
859e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (!fullscreenIsAllowedForAllOwners(element.document())) {
869e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        if (requestType == Fullscreen::PrefixedVideoRequest)
879e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            UseCounter::count(element.document(), UseCounter::VideoFullscreenAllowedExemption);
889e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        else
899e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            return false;
909e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    }
919e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
929e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // |element|'s node document's fullscreen element stack is either empty or its top element is an
939e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // inclusive ancestor of |element|.
949e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (const Element* topElement = Fullscreen::fullscreenElementFrom(element.document())) {
959e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        if (!topElement->contains(&element))
969e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            return false;
979e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    }
989e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
999e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // |element| has no ancestor element whose local name is iframe and namespace is the HTML
1009e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // namespace.
1019e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (Traversal<HTMLIFrameElement>::firstAncestor(element))
1029e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        return false;
1039e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
1049e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // |element|'s node document's browsing context either has a browsing context container and the
1059e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // fullscreen element ready check returns true for |element|'s node document's browsing
1069e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // context's browsing context container, or it has no browsing context container.
1079e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (const Element* owner = element.document().ownerElement()) {
1089e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        if (!fullscreenElementReady(*owner, requestType))
1099e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            return false;
1109e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    }
1119e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
1129e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return true;
1139e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)}
1149e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
115e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)static bool isPrefixed(const AtomicString& type)
116e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
117e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return type == EventTypeNames::webkitfullscreenchange || type == EventTypeNames::webkitfullscreenerror;
118e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
119e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
120197021e6b966cfb06891637935ef33fff06433d1Ben Murdochstatic PassRefPtrWillBeRawPtr<Event> createEvent(const AtomicString& type, EventTarget& target)
121197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
122e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EventInit initializer;
123e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    initializer.bubbles = isPrefixed(type);
124e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    RefPtrWillBeRawPtr<Event> event = Event::create(type, initializer);
125197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    event->setTarget(&target);
126197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return event;
127197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
128197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1299e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)const char* Fullscreen::supplementName()
130521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
1319e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return "Fullscreen";
132521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
133521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1349e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)Fullscreen& Fullscreen::from(Document& document)
135521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
1369e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    Fullscreen* fullscreen = fromIfExists(document);
137f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (!fullscreen) {
1389e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        fullscreen = new Fullscreen(document);
139f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        DocumentSupplement::provideTo(document, supplementName(), adoptPtrWillBeNoop(fullscreen));
140521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    }
141521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return *fullscreen;
143521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
144521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1459e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)Fullscreen* Fullscreen::fromIfExistsSlow(Document& document)
146521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
1479e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return static_cast<Fullscreen*>(DocumentSupplement::from(document, supplementName()));
148521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
149521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1509e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)Element* Fullscreen::fullscreenElementFrom(Document& document)
151521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
1529e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (Fullscreen* found = fromIfExists(document))
153197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return found->fullscreenElement();
154521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    return 0;
155521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
156521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1579e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)Element* Fullscreen::currentFullScreenElementFrom(Document& document)
158521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
1599e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (Fullscreen* found = fromIfExists(document))
160521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return found->webkitCurrentFullScreenElement();
161521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    return 0;
162521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
163521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1649e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)bool Fullscreen::isFullScreen(Document& document)
165521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
1669e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return currentFullScreenElementFrom(document);
167521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
168521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1699e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)Fullscreen::Fullscreen(Document& document)
170d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : DocumentLifecycleObserver(&document)
171521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    , m_areKeysEnabledInFullScreen(false)
172e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    , m_fullScreenRenderer(nullptr)
1739e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    , m_eventQueueTimer(this, &Fullscreen::eventQueueTimerFired)
174521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
1759e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    document.setHasFullscreenSupplement();
176521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
177521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1789e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)Fullscreen::~Fullscreen()
179521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
180521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
181521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1829e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)inline Document* Fullscreen::document()
183521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
184f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return lifecycleContext();
185521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
186521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1879e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void Fullscreen::documentWasDetached()
188521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
189197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_eventQueue.clear();
190521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
191521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (m_fullScreenRenderer)
192c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_fullScreenRenderer->destroy();
193f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
194f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#if ENABLE(OILPAN)
195f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    m_fullScreenElement = nullptr;
196f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    m_fullScreenElementStack.clear();
197f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#endif
198f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
199521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
200521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
201f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#if !ENABLE(OILPAN)
2029e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void Fullscreen::documentWasDisposed()
203521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
204f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // NOTE: the context dispose phase is not supported in oilpan. Please
205f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // consider using the detach phase instead.
206d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_fullScreenElement = nullptr;
207521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    m_fullScreenElementStack.clear();
208521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
209f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#endif
210521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
2119e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void Fullscreen::requestFullscreen(Element& element, RequestType requestType)
212521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
213d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Ignore this request if the document is not in a live frame.
214d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!document()->isActive())
215d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
216d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2179e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // If |element| is on top of |doc|'s fullscreen element stack, terminate these substeps.
2189e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (&element == fullscreenElement())
2199e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        return;
2209e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
221521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    do {
222521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // 1. If any of the following conditions are true, terminate these steps and queue a task to fire
223521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // an event named fullscreenerror with its bubbles attribute set to true on the context object's
224521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // node document:
225521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
226e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        // The fullscreen element ready check returns false.
2279e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        if (!fullscreenElementReady(element, requestType))
228521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            break;
229521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
230521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // This algorithm is not allowed to show a pop-up:
231521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        //   An algorithm is allowed to show a pop-up if, in the task in which the algorithm is running, either:
232521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        //   - an activation behavior is currently being processed whose click event was trusted, or
233521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        //   - the event listener for a trusted click event is being handled.
23407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (!UserGestureIndicator::processingUserGesture())
235521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            break;
236521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
237c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        // Fullscreen is not supported.
238c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (!fullscreenIsSupported(element.document(), element))
239c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            break;
240521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
241521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // 2. Let doc be element's node document. (i.e. "this")
242521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        Document* currentDoc = document();
243521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
244521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // 3. Let docs be all doc's ancestor browsing context's documents (if any) and doc.
245521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        Deque<Document*> docs;
246521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
247521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        do {
248521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            docs.prepend(currentDoc);
2498abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            currentDoc = currentDoc->ownerElement() ? &currentDoc->ownerElement()->document() : 0;
250521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        } while (currentDoc);
251521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
252521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // 4. For each document in docs, run these substeps:
253521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        Deque<Document*>::iterator current = docs.begin(), following = docs.begin();
254521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
255521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        do {
256521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            ++following;
257521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
258521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            // 1. Let following document be the document after document in docs, or null if there is no
259521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            // such document.
260521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            Document* currentDoc = *current;
261521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            Document* followingDoc = following != docs.end() ? *following : 0;
262521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
263521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            // 2. If following document is null, push context object on document's fullscreen element
264521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            // stack, and queue a task to fire an event named fullscreenchange with its bubbles attribute
265521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            // set to true on the document.
266521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            if (!followingDoc) {
267e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                from(*currentDoc).pushFullscreenElementStack(element, requestType);
268e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                enqueueChangeEvent(*currentDoc, requestType);
269521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)                continue;
270521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            }
271521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
272521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            // 3. Otherwise, if document's fullscreen element stack is either empty or its top element
273521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            // is not following document's browsing context container,
274d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            Element* topElement = fullscreenElementFrom(*currentDoc);
275521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            if (!topElement || topElement != followingDoc->ownerElement()) {
276521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)                // ...push following document's browsing context container on document's fullscreen element
277521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)                // stack, and queue a task to fire an event named fullscreenchange with its bubbles attribute
278521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)                // set to true on document.
279e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                from(*currentDoc).pushFullscreenElementStack(*followingDoc->ownerElement(), requestType);
280e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                enqueueChangeEvent(*currentDoc, requestType);
281521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)                continue;
282521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            }
283521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
284521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            // 4. Otherwise, do nothing for this document. It stays the same.
285521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        } while (++current != docs.end());
286521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
287521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // 5. Return, and run the remaining steps asynchronously.
288521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // 6. Optionally, perform some animation.
289197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        m_areKeysEnabledInFullScreen = requestType != PrefixedMozillaRequest && requestType != PrefixedVideoRequest;
290197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        document()->frameHost()->chrome().client().enterFullScreenForElement(&element);
291521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
292521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // 7. Optionally, display a message indicating how the user can exit displaying the context object fullscreen.
293521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
294521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    } while (0);
295521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
296e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    enqueueErrorEvent(element, requestType);
297521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
298521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
2999e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void Fullscreen::fullyExitFullscreen(Document& document)
300521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
3019e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // To fully exit fullscreen, run these steps:
3029e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
3039e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // 1. Let |doc| be the top-level browsing context's document.
3049e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    Document& doc = document.topDocument();
3059e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
3069e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // 2. If |doc|'s fullscreen element stack is empty, terminate these steps.
3079e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (!fullscreenElementFrom(doc))
308521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
309521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
3109e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // 3. Remove elements from |doc|'s fullscreen element stack until only the top element is left.
3119e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    size_t stackSize = from(doc).m_fullScreenElementStack.size();
3129e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    from(doc).m_fullScreenElementStack.remove(0, stackSize - 1);
3139e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    ASSERT(from(doc).m_fullScreenElementStack.size() == 1);
3149e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
3159e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // 4. Act as if the exitFullscreen() method was invoked on |doc|.
3169e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    from(doc).exitFullscreen();
317521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
318521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
3199e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void Fullscreen::exitFullscreen()
320521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
321521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // The exitFullscreen() method must run these steps:
322521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
323521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // 1. Let doc be the context object. (i.e. "this")
324521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    Document* currentDoc = document();
325a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (!currentDoc->isActive())
326a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return;
327521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
328521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // 2. If doc's fullscreen element stack is empty, terminate these steps.
329521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (m_fullScreenElementStack.isEmpty())
330521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
331521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
332521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // 3. Let descendants be all the doc's descendant browsing context's documents with a non-empty fullscreen
333521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // element stack (if any), ordered so that the child of the doc is last and the document furthest
334521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // away from the doc is first.
335f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    WillBeHeapDeque<RefPtrWillBeMember<Document> > descendants;
3365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    for (Frame* descendant = document()->frame() ? document()->frame()->tree().traverseNext() : 0; descendant; descendant = descendant->tree().traverseNext()) {
3375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (!descendant->isLocalFrame())
3385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            continue;
3395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        ASSERT(toLocalFrame(descendant)->document());
3405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (fullscreenElementFrom(*toLocalFrame(descendant)->document()))
3415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            descendants.prepend(toLocalFrame(descendant)->document());
342521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    }
343521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
344521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // 4. For each descendant in descendants, empty descendant's fullscreen element stack, and queue a
345521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // task to fire an event named fullscreenchange with its bubbles attribute set to true on descendant.
346f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    for (WillBeHeapDeque<RefPtrWillBeMember<Document> >::iterator i = descendants.begin(); i != descendants.end(); ++i) {
347d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ASSERT(*i);
348e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        RequestType requestType = from(**i).m_fullScreenElementStack.last().second;
349d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        from(**i).clearFullscreenElementStack();
350e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        enqueueChangeEvent(**i, requestType);
351521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    }
352521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
353521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // 5. While doc is not null, run these substeps:
354521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    Element* newTop = 0;
355521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    while (currentDoc) {
356e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        RequestType requestType = from(*currentDoc).m_fullScreenElementStack.last().second;
357e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
358521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // 1. Pop the top element of doc's fullscreen element stack.
359d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        from(*currentDoc).popFullscreenElementStack();
360521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
361521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        //    If doc's fullscreen element stack is non-empty and the element now at the top is either
362521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        //    not in a document or its node document is not doc, repeat this substep.
363d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        newTop = fullscreenElementFrom(*currentDoc);
3641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (newTop && (!newTop->inDocument() || newTop->document() != currentDoc))
365521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            continue;
366521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
367521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // 2. Queue a task to fire an event named fullscreenchange with its bubbles attribute set to true
368521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // on doc.
369e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        enqueueChangeEvent(*currentDoc, requestType);
370521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
371521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // 3. If doc's fullscreen element stack is empty and doc's browsing context has a browsing context
372521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // container, set doc to that browsing context container's node document.
373521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (!newTop && currentDoc->ownerElement()) {
3748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            currentDoc = &currentDoc->ownerElement()->document();
375521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            continue;
376521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        }
377521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
378521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // 4. Otherwise, set doc to null.
379521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        currentDoc = 0;
380521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    }
381521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
382521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // 6. Return, and run the remaining steps asynchronously.
383521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // 7. Optionally, perform some animation.
384521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
38509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    FrameHost* host = document()->frameHost();
38609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
38709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Speculative fix for engaget.com/videos per crbug.com/336239.
38809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // FIXME: This check is wrong. We ASSERT(document->isActive()) above
38909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // so this should be redundant and should be removed!
39009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!host)
391521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
392521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
393521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // Only exit out of full screen window mode if there are no remaining elements in the
394521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // full screen stack.
395521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (!newTop) {
39609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        host->chrome().client().exitFullScreenForElement(m_fullScreenElement.get());
397521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
398521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    }
399521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
400521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // Otherwise, notify the chrome of the new full screen element.
40109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    host->chrome().client().enterFullScreenForElement(newTop);
402521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
403521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
4049e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)bool Fullscreen::fullscreenEnabled(Document& document)
405521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
406c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // 4. The fullscreenEnabled attribute must return true if the context object has its
407c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    //    fullscreen enabled flag set and fullscreen is supported, and false otherwise.
408521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
409521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // Top-level browsing contexts are implied to have their allowFullScreen attribute set.
410c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return fullscreenIsAllowedForAllOwners(document) && fullscreenIsSupported(document);
411521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
412521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
4137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid Fullscreen::didEnterFullScreenForElement(Element* element)
414521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
415521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    ASSERT(element);
41609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!document()->isActive())
417521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
418521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
419521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (m_fullScreenRenderer)
420521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        m_fullScreenRenderer->unwrapRenderer();
421521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
422521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    m_fullScreenElement = element;
423521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
424521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // Create a placeholder block for a the full-screen element, to keep the page from reflowing
425521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // when the element is removed from the normal flow. Only do this for a RenderBox, as only
426521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // a box will have a frameRect. The placeholder will be created in setFullScreenRenderer()
427521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // during layout.
428521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    RenderObject* renderer = m_fullScreenElement->renderer();
429521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    bool shouldCreatePlaceholder = renderer && renderer->isBox();
430521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (shouldCreatePlaceholder) {
431521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        m_savedPlaceholderFrameRect = toRenderBox(renderer)->frameRect();
432521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        m_savedPlaceholderRenderStyle = RenderStyle::clone(renderer->style());
433521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    }
434521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
435521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (m_fullScreenElement != document()->documentElement())
436521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        RenderFullScreen::wrapRenderer(renderer, renderer ? renderer->parent() : 0, document());
437521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
438521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    m_fullScreenElement->setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(true);
439521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
44009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // FIXME: This should not call updateStyleIfNeeded.
44109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    document()->setNeedsStyleRecalc(SubtreeStyleChange);
44207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    document()->updateRenderTreeIfNeeded();
443521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
444521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    m_fullScreenElement->didBecomeFullscreenElement();
445521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
4467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (document()->frame())
4477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        document()->frame()->eventHandler().scheduleHoverStateUpdate();
4487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
449197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_eventQueueTimer.startOneShot(0, FROM_HERE);
450521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
451521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
4527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid Fullscreen::didExitFullScreenForElement(Element*)
453521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
454521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (!m_fullScreenElement)
455521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
456521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
457f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (!document()->isActive())
458521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
459521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
460521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    m_fullScreenElement->willStopBeingFullscreenElement();
461521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
462521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    m_fullScreenElement->setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(false);
463521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
464521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    m_areKeysEnabledInFullScreen = false;
465521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
466521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (m_fullScreenRenderer)
467521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        m_fullScreenRenderer->unwrapRenderer();
468521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
469d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_fullScreenElement = nullptr;
47009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    document()->setNeedsStyleRecalc(SubtreeStyleChange);
471521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
4727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (document()->frame())
4737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        document()->frame()->eventHandler().scheduleHoverStateUpdate();
4747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
475197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // When fullyExitFullscreen is called, we call exitFullscreen on the topDocument(). That means
476197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // that the events will be queued there. So if we have no events here, start the timer on the
477197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // exiting document.
478521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    Document* exitingDocument = document();
479197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (m_eventQueue.isEmpty())
480d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        exitingDocument = &document()->topDocument();
481d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(exitingDocument);
482197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    from(*exitingDocument).m_eventQueueTimer.startOneShot(0, FROM_HERE);
483521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
484521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
4859e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void Fullscreen::setFullScreenRenderer(RenderFullScreen* renderer)
486521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
487521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (renderer == m_fullScreenRenderer)
488521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
489521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
490521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (renderer && m_savedPlaceholderRenderStyle) {
491521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        renderer->createPlaceholder(m_savedPlaceholderRenderStyle.release(), m_savedPlaceholderFrameRect);
492521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    } else if (renderer && m_fullScreenRenderer && m_fullScreenRenderer->placeholder()) {
493521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        RenderBlock* placeholder = m_fullScreenRenderer->placeholder();
494521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        renderer->createPlaceholder(RenderStyle::clone(placeholder->style()), placeholder->frameRect());
495521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    }
496521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
497521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (m_fullScreenRenderer)
498c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_fullScreenRenderer->unwrapRenderer();
499521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    ASSERT(!m_fullScreenRenderer);
500521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
501521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    m_fullScreenRenderer = renderer;
502521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
503521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
5049e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void Fullscreen::fullScreenRendererDestroyed()
505521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
506e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    m_fullScreenRenderer = nullptr;
507521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
508521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
5099e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void Fullscreen::enqueueChangeEvent(Document& document, RequestType requestType)
510197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
511e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    RefPtrWillBeRawPtr<Event> event;
512e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (requestType == UnprefixedRequest) {
513e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        event = createEvent(EventTypeNames::fullscreenchange, document);
514e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    } else {
5159e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        ASSERT(document.hasFullscreenSupplement());
5169e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        Fullscreen& fullscreen = from(document);
517e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        EventTarget* target = fullscreen.fullscreenElement();
518e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (!target)
519e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            target = fullscreen.webkitCurrentFullScreenElement();
520e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (!target)
521e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            target = &document;
522e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        event = createEvent(EventTypeNames::webkitfullscreenchange, *target);
523e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    }
524e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    m_eventQueue.append(event);
525197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // NOTE: The timer is started in didEnterFullScreenForElement/didExitFullScreenForElement.
526197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
527197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
5289e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void Fullscreen::enqueueErrorEvent(Element& element, RequestType requestType)
529197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
530e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    RefPtrWillBeRawPtr<Event> event;
531e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (requestType == UnprefixedRequest)
532e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        event = createEvent(EventTypeNames::fullscreenerror, element.document());
533e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    else
534e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        event = createEvent(EventTypeNames::webkitfullscreenerror, element);
535e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    m_eventQueue.append(event);
536197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_eventQueueTimer.startOneShot(0, FROM_HERE);
537197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
538197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
5399e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void Fullscreen::eventQueueTimerFired(Timer<Fullscreen>*)
540521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
541521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // Since we dispatch events in this function, it's possible that the
542521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // document will be detached and GC'd. We protect it here to make sure we
543521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // can finish the function successfully.
544323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtrWillBeRawPtr<Document> protectDocument(document());
545197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WillBeHeapDeque<RefPtrWillBeMember<Event> > eventQueue;
546197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_eventQueue.swap(eventQueue);
547521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
548197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    while (!eventQueue.isEmpty()) {
549197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        RefPtrWillBeRawPtr<Event> event = eventQueue.takeFirst();
550197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        Node* target = event->target()->toNode();
551521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
552197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // If the element was removed from our tree, also message the documentElement.
553e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (!target->inDocument() && document()->documentElement()) {
554e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            ASSERT(isPrefixed(event->type()));
555197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            eventQueue.append(createEvent(event->type(), *document()->documentElement()));
556e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
557521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
558197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        target->dispatchEvent(event);
559521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    }
560521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
561521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
5629e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void Fullscreen::elementRemoved(Element& oldNode)
563521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
5649e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // Whenever the removing steps run with an |oldNode| and |oldNode| is in its node document's
5659e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // fullscreen element stack, run these steps:
566521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
5679e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // 1. If |oldNode| is at the top of its node document's fullscreen element stack, act as if the
5689e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    //    exitFullscreen() method was invoked on that document.
5699e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (fullscreenElement() == &oldNode) {
570e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exitFullscreen();
57151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return;
572e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    }
57351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
5749e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // 2. Otherwise, remove |oldNode| from its node document's fullscreen element stack.
575e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    for (size_t i = 0; i < m_fullScreenElementStack.size(); ++i) {
5769e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        if (m_fullScreenElementStack[i].first.get() == &oldNode) {
577e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            m_fullScreenElementStack.remove(i);
578e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            return;
579e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
580e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    }
581521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
5829e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // NOTE: |oldNode| was not in the fullscreen element stack.
583521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
584521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
5859e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void Fullscreen::clearFullscreenElementStack()
586521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
587521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    m_fullScreenElementStack.clear();
588521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
589521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
5909e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void Fullscreen::popFullscreenElementStack()
591521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
592521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (m_fullScreenElementStack.isEmpty())
593521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
594521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
595521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    m_fullScreenElementStack.removeLast();
596521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
597521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
5989e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void Fullscreen::pushFullscreenElementStack(Element& element, RequestType requestType)
599521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
600e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    m_fullScreenElementStack.append(std::make_pair(&element, requestType));
601521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
602521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
6039e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void Fullscreen::trace(Visitor* visitor)
604323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
605323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    visitor->trace(m_fullScreenElement);
606323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    visitor->trace(m_fullScreenElementStack);
607e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    visitor->trace(m_fullScreenRenderer);
608197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    visitor->trace(m_eventQueue);
609323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    DocumentSupplement::trace(visitor);
610323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
611323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
612c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
613