1 /* 2 * Copyright (C) 1999 Lars Knoll (knoll (at) kde.org) 3 * (C) 1999 Antti Koivisto (koivisto (at) kde.org) 4 * (C) 2001 Dirk Mueller (mueller (at) kde.org) 5 * (C) 2006 Alexey Proskuryakov (ap (at) webkit.org) 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All rights reserved. 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 8 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 9 * Copyright (C) 2013 Google Inc. All rights reserved. 10 * 11 * This library is free software; you can redistribute it and/or 12 * modify it under the terms of the GNU Library General Public 13 * License as published by the Free Software Foundation; either 14 * version 2 of the License, or (at your option) any later version. 15 * 16 * This library is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19 * Library General Public License for more details. 20 * 21 * You should have received a copy of the GNU Library General Public License 22 * along with this library; see the file COPYING.LIB. If not, write to 23 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 24 * Boston, MA 02110-1301, USA. 25 * 26 */ 27 28 #ifndef FullscreenElementStack_h 29 #define FullscreenElementStack_h 30 31 #include "core/dom/DocumentLifecycleObserver.h" 32 #include "core/dom/Element.h" 33 #include "platform/Supplementable.h" 34 #include "platform/Timer.h" 35 #include "platform/geometry/LayoutRect.h" 36 #include "wtf/Deque.h" 37 #include "wtf/RefPtr.h" 38 #include "wtf/Vector.h" 39 40 namespace WebCore { 41 42 class Document; 43 class Element; 44 class Node; 45 class RenderFullScreen; 46 class RenderStyle; 47 class ExecutionContext; 48 49 class FullscreenElementStack 50 : public DocumentSupplement 51 , public DocumentLifecycleObserver { 52 public: 53 virtual ~FullscreenElementStack(); 54 static const char* supplementName(); 55 static FullscreenElementStack* from(Document*); 56 static FullscreenElementStack* fromIfExists(Document*); 57 static Element* fullscreenElementFrom(Document*); 58 static Element* currentFullScreenElementFrom(Document*); 59 static bool isFullScreen(Document*); 60 static bool isActiveFullScreenElement(const Element*); 61 62 enum FullScreenCheckType { 63 EnforceIFrameAllowFullScreenRequirement, 64 ExemptIFrameAllowFullScreenRequirement, 65 }; 66 67 void requestFullScreenForElement(Element*, unsigned short flags, FullScreenCheckType); 68 void webkitCancelFullScreen(); 69 70 void webkitWillEnterFullScreenForElement(Element*); 71 void webkitDidEnterFullScreenForElement(Element*); 72 void webkitWillExitFullScreenForElement(Element*); 73 void webkitDidExitFullScreenForElement(Element*); 74 75 void setFullScreenRenderer(RenderFullScreen*); 76 RenderFullScreen* fullScreenRenderer() const { return m_fullScreenRenderer; } 77 void fullScreenRendererDestroyed(); 78 79 void clearFullscreenElementStack(); 80 void popFullscreenElementStack(); 81 void pushFullscreenElementStack(Element*); 82 void addDocumentToFullScreenChangeEventQueue(Document*); 83 84 bool fullScreenIsAllowedForElement(Element*) const; 85 void fullScreenElementRemoved(); 86 void removeFullScreenElementOfSubtree(Node*, bool amongChildrenOnly = false); 87 88 // W3C API 89 static bool webkitFullscreenEnabled(Document*); 90 Element* webkitFullscreenElement() const { return !m_fullScreenElementStack.isEmpty() ? m_fullScreenElementStack.last().get() : 0; } 91 void webkitExitFullscreen(); 92 93 bool webkitIsFullScreen() const { return m_fullScreenElement.get(); } 94 bool webkitFullScreenKeyboardInputAllowed() const { return m_fullScreenElement.get() && m_areKeysEnabledInFullScreen; } 95 Element* webkitCurrentFullScreenElement() const { return m_fullScreenElement.get(); } 96 97 virtual void documentWasDetached() OVERRIDE; 98 virtual void documentWasDisposed() OVERRIDE; 99 100 private: 101 static FullscreenElementStack* fromIfExistsSlow(Document*); 102 103 explicit FullscreenElementStack(Document*); 104 105 Document* document(); 106 void fullScreenChangeDelayTimerFired(Timer<FullscreenElementStack>*); 107 108 bool m_areKeysEnabledInFullScreen; 109 RefPtr<Element> m_fullScreenElement; 110 Vector<RefPtr<Element> > m_fullScreenElementStack; 111 RenderFullScreen* m_fullScreenRenderer; 112 Timer<FullscreenElementStack> m_fullScreenChangeDelayTimer; 113 Deque<RefPtr<Node> > m_fullScreenChangeEventTargetQueue; 114 Deque<RefPtr<Node> > m_fullScreenErrorEventTargetQueue; 115 LayoutRect m_savedPlaceholderFrameRect; 116 RefPtr<RenderStyle> m_savedPlaceholderRenderStyle; 117 }; 118 119 inline bool FullscreenElementStack::isActiveFullScreenElement(const Element* element) 120 { 121 FullscreenElementStack* controller = fromIfExists(&element->document()); 122 if (!controller) 123 return false; 124 return controller->webkitIsFullScreen() && controller->webkitCurrentFullScreenElement() == element; 125 } 126 127 inline FullscreenElementStack* FullscreenElementStack::fromIfExists(Document* document) 128 { 129 if (!document->hasFullscreenElementStack()) 130 return 0; 131 return fromIfExistsSlow(document); 132 } 133 134 } // namespace WebCore 135 136 #endif // FullscreenElementStack_h 137