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() ? ¤tDoc->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 = ¤tDoc->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