OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All r
ights reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All r
ights reserved. |
7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
8 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) | 8 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) |
9 * Copyright (C) 2013 Google Inc. All rights reserved. | 9 * Copyright (C) 2013 Google Inc. All rights reserved. |
10 * | 10 * |
(...skipping 17 matching lines...) Expand all Loading... |
28 #include "config.h" | 28 #include "config.h" |
29 #include "core/dom/FullscreenElementStack.h" | 29 #include "core/dom/FullscreenElementStack.h" |
30 | 30 |
31 #include "core/HTMLNames.h" | 31 #include "core/HTMLNames.h" |
32 #include "core/dom/Document.h" | 32 #include "core/dom/Document.h" |
33 #include "core/events/Event.h" | 33 #include "core/events/Event.h" |
34 #include "core/frame/FrameHost.h" | 34 #include "core/frame/FrameHost.h" |
35 #include "core/frame/LocalFrame.h" | 35 #include "core/frame/LocalFrame.h" |
36 #include "core/frame/Settings.h" | 36 #include "core/frame/Settings.h" |
37 #include "core/frame/UseCounter.h" | 37 #include "core/frame/UseCounter.h" |
38 #include "core/html/HTMLFrameOwnerElement.h" | 38 #include "core/html/HTMLIFrameElement.h" |
39 #include "core/html/HTMLMediaElement.h" | 39 #include "core/html/HTMLMediaElement.h" |
40 #include "core/page/Chrome.h" | 40 #include "core/page/Chrome.h" |
41 #include "core/page/ChromeClient.h" | 41 #include "core/page/ChromeClient.h" |
42 #include "core/rendering/RenderFullScreen.h" | 42 #include "core/rendering/RenderFullScreen.h" |
43 #include "platform/UserGestureIndicator.h" | 43 #include "platform/UserGestureIndicator.h" |
44 | 44 |
45 namespace blink { | 45 namespace blink { |
46 | 46 |
47 using namespace HTMLNames; | 47 using namespace HTMLNames; |
48 | 48 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 #if !ENABLE(OILPAN) | 162 #if !ENABLE(OILPAN) |
163 void FullscreenElementStack::documentWasDisposed() | 163 void FullscreenElementStack::documentWasDisposed() |
164 { | 164 { |
165 // NOTE: the context dispose phase is not supported in oilpan. Please | 165 // NOTE: the context dispose phase is not supported in oilpan. Please |
166 // consider using the detach phase instead. | 166 // consider using the detach phase instead. |
167 m_fullScreenElement = nullptr; | 167 m_fullScreenElement = nullptr; |
168 m_fullScreenElementStack.clear(); | 168 m_fullScreenElementStack.clear(); |
169 } | 169 } |
170 #endif | 170 #endif |
171 | 171 |
| 172 bool FullscreenElementStack::elementReady(Element& element, RequestType requestT
ype) |
| 173 { |
| 174 // A fullscreen element ready check for an element returns true if all of th
e following are |
| 175 // true, and false otherwise: |
| 176 |
| 177 // element is in a document. |
| 178 if (!element.inDocument()) |
| 179 return false; |
| 180 |
| 181 // element's node document's fullscreen enabled flag is set. |
| 182 if (!fullscreenIsAllowedForAllOwners(element.document())) { |
| 183 if (requestType == PrefixedVideoRequest) |
| 184 UseCounter::count(element.document(), UseCounter::VideoFullscreenAll
owedExemption); |
| 185 else |
| 186 return false; |
| 187 } |
| 188 |
| 189 // element's node document fullscreen element stack is either empty or its t
op element is an |
| 190 // ancestor of element. |
| 191 if (Element* lastElementOnStack = fullscreenElementFrom(element.document()))
{ |
| 192 if (!element.isDescendantOf(lastElementOnStack)) { |
| 193 if (requestType == PrefixedMozillaRequest || requestType == Prefixed
MozillaAllowKeyboardInputRequest) |
| 194 UseCounter::count(element.document(), UseCounter::LegacyFullScre
enErrorExemption); |
| 195 else |
| 196 return false; |
| 197 } |
| 198 } |
| 199 |
| 200 // element has no ancestor element whose local name is iframe and namespace
is the HTML |
| 201 // namespace. |
| 202 if (Traversal<HTMLIFrameElement>::firstAncestor(element)) |
| 203 return false; |
| 204 |
| 205 return true; |
| 206 } |
| 207 |
172 void FullscreenElementStack::requestFullscreen(Element& element, RequestType req
uestType) | 208 void FullscreenElementStack::requestFullscreen(Element& element, RequestType req
uestType) |
173 { | 209 { |
174 // Ignore this request if the document is not in a live frame. | 210 // Ignore this request if the document is not in a live frame. |
175 if (!document()->isActive()) | 211 if (!document()->isActive()) |
176 return; | 212 return; |
177 | 213 |
178 // The Mozilla Full Screen API <https://wiki.mozilla.org/Gecko:FullScreenAPI
> has different requirements | |
179 // for full screen mode, and do not have the concept of a full screen elemen
t stack. | |
180 bool inLegacyMozillaMode = requestType == PrefixedMozillaRequest || requestT
ype == PrefixedMozillaAllowKeyboardInputRequest; | |
181 | |
182 do { | 214 do { |
183 // 1. If any of the following conditions are true, terminate these steps
and queue a task to fire | 215 // 1. If any of the following conditions are true, terminate these steps
and queue a task to fire |
184 // an event named fullscreenerror with its bubbles attribute set to true
on the context object's | 216 // an event named fullscreenerror with its bubbles attribute set to true
on the context object's |
185 // node document: | 217 // node document: |
186 | 218 |
187 // The context object is not in a document. | 219 // The fullscreen element ready check returns false. |
188 if (!element.inDocument()) | 220 if (!elementReady(element, requestType)) |
189 break; | 221 break; |
190 | 222 |
191 // The context object's node document, or an ancestor browsing context's
document does not have | |
192 // the fullscreen enabled flag set. | |
193 if (!fullscreenIsAllowedForAllOwners(element.document())) { | |
194 if (requestType == PrefixedVideoRequest) | |
195 UseCounter::count(element.document(), UseCounter::VideoFullscree
nAllowedExemption); | |
196 else | |
197 break; | |
198 } | |
199 | |
200 // The context object's node document fullscreen element stack is not em
pty and its top element | |
201 // is not an ancestor of the context object. (NOTE: Ignore this requirem
ent if the request was | |
202 // made via the legacy Mozilla-style API.) | |
203 if (Element* lastElementOnStack = fullscreenElement()) { | |
204 if (!element.isDescendantOf(lastElementOnStack)) { | |
205 if (inLegacyMozillaMode) | |
206 UseCounter::count(element.document(), UseCounter::LegacyFull
ScreenErrorExemption); | |
207 else | |
208 break; | |
209 } | |
210 } | |
211 | |
212 // A descendant browsing context's document has a non-empty fullscreen e
lement stack. | |
213 bool descendentHasNonEmptyStack = false; | |
214 for (Frame* descendant = document()->frame() ? document()->frame()->tree
().traverseNext() : 0; descendant; descendant = descendant->tree().traverseNext(
)) { | |
215 if (!descendant->isLocalFrame()) | |
216 continue; | |
217 ASSERT(toLocalFrame(descendant)->document()); | |
218 if (fullscreenElementFrom(*toLocalFrame(descendant)->document())) { | |
219 descendentHasNonEmptyStack = true; | |
220 break; | |
221 } | |
222 } | |
223 if (descendentHasNonEmptyStack) { | |
224 if (inLegacyMozillaMode) | |
225 UseCounter::count(element.document(), UseCounter::LegacyFullScre
enErrorExemption); | |
226 else | |
227 break; | |
228 } | |
229 | |
230 // This algorithm is not allowed to show a pop-up: | 223 // This algorithm is not allowed to show a pop-up: |
231 // An algorithm is allowed to show a pop-up if, in the task in which t
he algorithm is running, either: | 224 // An algorithm is allowed to show a pop-up if, in the task in which t
he algorithm is running, either: |
232 // - an activation behavior is currently being processed whose click e
vent was trusted, or | 225 // - an activation behavior is currently being processed whose click e
vent was trusted, or |
233 // - the event listener for a trusted click event is being handled. | 226 // - the event listener for a trusted click event is being handled. |
234 if (!UserGestureIndicator::processingUserGesture()) | 227 if (!UserGestureIndicator::processingUserGesture()) |
235 break; | 228 break; |
236 | 229 |
237 // Fullscreen is not supported. | 230 // Fullscreen is not supported. |
238 if (!fullscreenIsSupported(element.document(), element)) | 231 if (!fullscreenIsSupported(element.document(), element)) |
239 break; | 232 break; |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 void FullscreenElementStack::trace(Visitor* visitor) | 606 void FullscreenElementStack::trace(Visitor* visitor) |
614 { | 607 { |
615 visitor->trace(m_fullScreenElement); | 608 visitor->trace(m_fullScreenElement); |
616 visitor->trace(m_fullScreenElementStack); | 609 visitor->trace(m_fullScreenElementStack); |
617 visitor->trace(m_fullScreenRenderer); | 610 visitor->trace(m_fullScreenRenderer); |
618 visitor->trace(m_eventQueue); | 611 visitor->trace(m_eventQueue); |
619 DocumentSupplement::trace(visitor); | 612 DocumentSupplement::trace(visitor); |
620 } | 613 } |
621 | 614 |
622 } // namespace blink | 615 } // namespace blink |
OLD | NEW |