Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Side by Side Diff: Source/core/dom/Fullscreen.cpp

Issue 494743002: Make the fullscreen element ready check static (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/dom/Fullscreen.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 30 matching lines...) Expand all
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
49 static bool fullscreenIsAllowedForAllOwners(const Document& document) 49 static bool fullscreenIsAllowedForAllOwners(const Document& document)
50 { 50 {
51 for (const HTMLFrameOwnerElement* owner = document.ownerElement(); owner; ow ner = owner->document().ownerElement()) { 51 for (const Element* owner = document.ownerElement(); owner; owner = owner->d ocument().ownerElement()) {
52 if (!isHTMLIFrameElement(owner)) 52 if (!isHTMLIFrameElement(owner))
53 return false; 53 return false;
54 if (!owner->hasAttribute(allowfullscreenAttr)) 54 if (!owner->hasAttribute(allowfullscreenAttr))
55 return false; 55 return false;
56 } 56 }
57 return true; 57 return true;
58 } 58 }
59 59
60 static bool fullscreenIsSupported(const Document& document) 60 static bool fullscreenIsSupported(const Document& document)
61 { 61 {
62 // Fullscreen is supported if there is no previously-established user prefer ence, 62 // Fullscreen is supported if there is no previously-established user prefer ence,
63 // security risk, or platform limitation. 63 // security risk, or platform limitation.
64 return !document.settings() || document.settings()->fullscreenSupported(); 64 return !document.settings() || document.settings()->fullscreenSupported();
65 } 65 }
66 66
67 static bool fullscreenIsSupported(const Document& document, const Element& eleme nt) 67 static bool fullscreenIsSupported(const Document& document, const Element& eleme nt)
68 { 68 {
69 if (!document.settings() || (document.settings()->disallowFullscreenForNonMe diaElements() && !isHTMLMediaElement(element))) 69 if (!document.settings() || (document.settings()->disallowFullscreenForNonMe diaElements() && !isHTMLMediaElement(element)))
70 return false; 70 return false;
71 return fullscreenIsSupported(document); 71 return fullscreenIsSupported(document);
72 } 72 }
73 73
74 static bool fullscreenElementReady(const Element& element, Fullscreen::RequestTy pe requestType)
75 {
76 // A fullscreen element ready check for an element |element| returns true if all of the
77 // following are true, and false otherwise:
78
79 // |element| is in a document.
80 if (!element.inDocument())
81 return false;
82
83 // |element|'s node document's fullscreen enabled flag is set.
84 if (!fullscreenIsAllowedForAllOwners(element.document())) {
85 if (requestType == Fullscreen::PrefixedVideoRequest)
86 UseCounter::count(element.document(), UseCounter::VideoFullscreenAll owedExemption);
87 else
88 return false;
89 }
90
91 // |element|'s node document's fullscreen element stack is either empty or i ts top element is an
92 // inclusive ancestor of |element|.
93 if (const Element* topElement = Fullscreen::fullscreenElementFrom(element.do cument())) {
94 if (!topElement->contains(&element))
95 return false;
96 }
97
98 // |element| has no ancestor element whose local name is iframe and namespac e is the HTML
99 // namespace.
100 if (Traversal<HTMLIFrameElement>::firstAncestor(element))
101 return false;
102
103 // |element|'s node document's browsing context either has a browsing contex t container and the
104 // fullscreen element ready check returns true for |element|'s node document 's browsing
105 // context's browsing context container, or it has no browsing context conta iner.
106 if (const Element* owner = element.document().ownerElement()) {
107 if (!fullscreenElementReady(*owner, requestType))
108 return false;
109 }
110
111 return true;
112 }
113
74 static bool isPrefixed(const AtomicString& type) 114 static bool isPrefixed(const AtomicString& type)
75 { 115 {
76 return type == EventTypeNames::webkitfullscreenchange || type == EventTypeNa mes::webkitfullscreenerror; 116 return type == EventTypeNames::webkitfullscreenchange || type == EventTypeNa mes::webkitfullscreenerror;
77 } 117 }
78 118
79 static PassRefPtrWillBeRawPtr<Event> createEvent(const AtomicString& type, Event Target& target) 119 static PassRefPtrWillBeRawPtr<Event> createEvent(const AtomicString& type, Event Target& target)
80 { 120 {
81 EventInit initializer; 121 EventInit initializer;
82 initializer.bubbles = isPrefixed(type); 122 initializer.bubbles = isPrefixed(type);
83 RefPtrWillBeRawPtr<Event> event = Event::create(type, initializer); 123 RefPtrWillBeRawPtr<Event> event = Event::create(type, initializer);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 #if !ENABLE(OILPAN) 200 #if !ENABLE(OILPAN)
161 void Fullscreen::documentWasDisposed() 201 void Fullscreen::documentWasDisposed()
162 { 202 {
163 // NOTE: the context dispose phase is not supported in oilpan. Please 203 // NOTE: the context dispose phase is not supported in oilpan. Please
164 // consider using the detach phase instead. 204 // consider using the detach phase instead.
165 m_fullScreenElement = nullptr; 205 m_fullScreenElement = nullptr;
166 m_fullScreenElementStack.clear(); 206 m_fullScreenElementStack.clear();
167 } 207 }
168 #endif 208 #endif
169 209
170 bool Fullscreen::elementReady(Element& element, RequestType requestType)
171 {
172 // A fullscreen element ready check for an element |element| returns true if all of the
173 // following are true, and false otherwise:
174
175 // |element| is in a document.
176 if (!element.inDocument())
177 return false;
178
179 // |element|'s node document's fullscreen enabled flag is set.
180 if (!fullscreenIsAllowedForAllOwners(element.document())) {
181 if (requestType == PrefixedVideoRequest)
182 UseCounter::count(element.document(), UseCounter::VideoFullscreenAll owedExemption);
183 else
184 return false;
185 }
186
187 // |element|'s node document's fullscreen element stack is either empty or i ts top element is an
188 // inclusive ancestor of |element|.
189 if (Element* topElement = fullscreenElementFrom(element.document())) {
190 if (!topElement->contains(&element))
191 return false;
192 }
193
194 // |element| has no ancestor element whose local name is iframe and namespac e is the HTML
195 // namespace.
196 if (Traversal<HTMLIFrameElement>::firstAncestor(element))
197 return false;
198
199 // |element|'s node document's browsing context either has a browsing contex t container and the
200 // fullscreen element ready check returns true for |element|'s node document 's browsing
201 // context's browsing context container, or it has no browsing context conta iner.
202 if (HTMLFrameOwnerElement* container = element.document().ownerElement()) {
203 if (!elementReady(*container, requestType))
204 return false;
205 }
206
207 return true;
208 }
209
210 void Fullscreen::requestFullscreen(Element& element, RequestType requestType) 210 void Fullscreen::requestFullscreen(Element& element, RequestType requestType)
211 { 211 {
212 // Ignore this request if the document is not in a live frame. 212 // Ignore this request if the document is not in a live frame.
213 if (!document()->isActive()) 213 if (!document()->isActive())
214 return; 214 return;
215 215
216 // If |element| is on top of |doc|'s fullscreen element stack, terminate the se substeps. 216 // If |element| is on top of |doc|'s fullscreen element stack, terminate the se substeps.
217 if (&element == fullscreenElement()) 217 if (&element == fullscreenElement())
218 return; 218 return;
219 219
220 do { 220 do {
221 // 1. If any of the following conditions are true, terminate these steps and queue a task to fire 221 // 1. If any of the following conditions are true, terminate these steps and queue a task to fire
222 // an event named fullscreenerror with its bubbles attribute set to true on the context object's 222 // an event named fullscreenerror with its bubbles attribute set to true on the context object's
223 // node document: 223 // node document:
224 224
225 // The fullscreen element ready check returns false. 225 // The fullscreen element ready check returns false.
226 if (!elementReady(element, requestType)) 226 if (!fullscreenElementReady(element, requestType))
227 break; 227 break;
228 228
229 // This algorithm is not allowed to show a pop-up: 229 // This algorithm is not allowed to show a pop-up:
230 // An algorithm is allowed to show a pop-up if, in the task in which t he algorithm is running, either: 230 // An algorithm is allowed to show a pop-up if, in the task in which t he algorithm is running, either:
231 // - an activation behavior is currently being processed whose click e vent was trusted, or 231 // - an activation behavior is currently being processed whose click e vent was trusted, or
232 // - the event listener for a trusted click event is being handled. 232 // - the event listener for a trusted click event is being handled.
233 if (!UserGestureIndicator::processingUserGesture()) 233 if (!UserGestureIndicator::processingUserGesture())
234 break; 234 break;
235 235
236 // Fullscreen is not supported. 236 // Fullscreen is not supported.
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
614 void Fullscreen::trace(Visitor* visitor) 614 void Fullscreen::trace(Visitor* visitor)
615 { 615 {
616 visitor->trace(m_fullScreenElement); 616 visitor->trace(m_fullScreenElement);
617 visitor->trace(m_fullScreenElementStack); 617 visitor->trace(m_fullScreenElementStack);
618 visitor->trace(m_fullScreenRenderer); 618 visitor->trace(m_fullScreenRenderer);
619 visitor->trace(m_eventQueue); 619 visitor->trace(m_eventQueue);
620 DocumentSupplement::trace(visitor); 620 DocumentSupplement::trace(visitor);
621 } 621 }
622 622
623 } // namespace blink 623 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/dom/Fullscreen.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698