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

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

Issue 476763004: Rename FullscreenElementStack to just Fullscreen (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rebase 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') | Source/core/dom/FullscreenElementStack.h » ('j') | 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 *
11 * This library is free software; you can redistribute it and/or 11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Library General Public 12 * modify it under the terms of the GNU Library General Public
13 * License as published by the Free Software Foundation; either 13 * License as published by the Free Software Foundation; either
14 * version 2 of the License, or (at your option) any later version. 14 * version 2 of the License, or (at your option) any later version.
15 * 15 *
16 * This library is distributed in the hope that it will be useful, 16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Library General Public License for more details. 19 * Library General Public License for more details.
20 * 20 *
21 * You should have received a copy of the GNU Library General Public License 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 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, 23 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24 * Boston, MA 02110-1301, USA. 24 * Boston, MA 02110-1301, USA.
25 * 25 *
26 */ 26 */
27 27
28 #include "config.h" 28 #include "config.h"
29 #include "core/dom/FullscreenElementStack.h" 29 #include "core/dom/Fullscreen.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/HTMLIFrameElement.h" 38 #include "core/html/HTMLIFrameElement.h"
39 #include "core/html/HTMLMediaElement.h" 39 #include "core/html/HTMLMediaElement.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 78
79 static PassRefPtrWillBeRawPtr<Event> createEvent(const AtomicString& type, Event Target& target) 79 static PassRefPtrWillBeRawPtr<Event> createEvent(const AtomicString& type, Event Target& target)
80 { 80 {
81 EventInit initializer; 81 EventInit initializer;
82 initializer.bubbles = isPrefixed(type); 82 initializer.bubbles = isPrefixed(type);
83 RefPtrWillBeRawPtr<Event> event = Event::create(type, initializer); 83 RefPtrWillBeRawPtr<Event> event = Event::create(type, initializer);
84 event->setTarget(&target); 84 event->setTarget(&target);
85 return event; 85 return event;
86 } 86 }
87 87
88 const char* FullscreenElementStack::supplementName() 88 const char* Fullscreen::supplementName()
89 { 89 {
90 return "FullscreenElementStack"; 90 return "Fullscreen";
91 } 91 }
92 92
93 FullscreenElementStack& FullscreenElementStack::from(Document& document) 93 Fullscreen& Fullscreen::from(Document& document)
94 { 94 {
95 FullscreenElementStack* fullscreen = fromIfExists(document); 95 Fullscreen* fullscreen = fromIfExists(document);
96 if (!fullscreen) { 96 if (!fullscreen) {
97 fullscreen = new FullscreenElementStack(document); 97 fullscreen = new Fullscreen(document);
98 DocumentSupplement::provideTo(document, supplementName(), adoptPtrWillBe Noop(fullscreen)); 98 DocumentSupplement::provideTo(document, supplementName(), adoptPtrWillBe Noop(fullscreen));
99 } 99 }
100 100
101 return *fullscreen; 101 return *fullscreen;
102 } 102 }
103 103
104 FullscreenElementStack* FullscreenElementStack::fromIfExistsSlow(Document& docum ent) 104 Fullscreen* Fullscreen::fromIfExistsSlow(Document& document)
105 { 105 {
106 return static_cast<FullscreenElementStack*>(DocumentSupplement::from(documen t, supplementName())); 106 return static_cast<Fullscreen*>(DocumentSupplement::from(document, supplemen tName()));
107 } 107 }
108 108
109 Element* FullscreenElementStack::fullscreenElementFrom(Document& document) 109 Element* Fullscreen::fullscreenElementFrom(Document& document)
110 { 110 {
111 if (FullscreenElementStack* found = fromIfExists(document)) 111 if (Fullscreen* found = fromIfExists(document))
112 return found->fullscreenElement(); 112 return found->fullscreenElement();
113 return 0; 113 return 0;
114 } 114 }
115 115
116 Element* FullscreenElementStack::currentFullScreenElementFrom(Document& document ) 116 Element* Fullscreen::currentFullScreenElementFrom(Document& document)
117 { 117 {
118 if (FullscreenElementStack* found = fromIfExists(document)) 118 if (Fullscreen* found = fromIfExists(document))
119 return found->webkitCurrentFullScreenElement(); 119 return found->webkitCurrentFullScreenElement();
120 return 0; 120 return 0;
121 } 121 }
122 122
123 bool FullscreenElementStack::isFullScreen(Document& document) 123 bool Fullscreen::isFullScreen(Document& document)
124 { 124 {
125 if (FullscreenElementStack* found = fromIfExists(document)) 125 if (Fullscreen* found = fromIfExists(document))
126 return found->webkitIsFullScreen(); 126 return found->webkitIsFullScreen();
127 return false; 127 return false;
128 } 128 }
129 129
130 FullscreenElementStack::FullscreenElementStack(Document& document) 130 Fullscreen::Fullscreen(Document& document)
131 : DocumentLifecycleObserver(&document) 131 : DocumentLifecycleObserver(&document)
132 , m_areKeysEnabledInFullScreen(false) 132 , m_areKeysEnabledInFullScreen(false)
133 , m_fullScreenRenderer(nullptr) 133 , m_fullScreenRenderer(nullptr)
134 , m_eventQueueTimer(this, &FullscreenElementStack::eventQueueTimerFired) 134 , m_eventQueueTimer(this, &Fullscreen::eventQueueTimerFired)
135 { 135 {
136 document.setHasFullscreenElementStack(); 136 document.setHasFullscreenSupplement();
137 } 137 }
138 138
139 FullscreenElementStack::~FullscreenElementStack() 139 Fullscreen::~Fullscreen()
140 { 140 {
141 } 141 }
142 142
143 inline Document* FullscreenElementStack::document() 143 inline Document* Fullscreen::document()
144 { 144 {
145 return lifecycleContext(); 145 return lifecycleContext();
146 } 146 }
147 147
148 void FullscreenElementStack::documentWasDetached() 148 void Fullscreen::documentWasDetached()
149 { 149 {
150 m_eventQueue.clear(); 150 m_eventQueue.clear();
151 151
152 if (m_fullScreenRenderer) 152 if (m_fullScreenRenderer)
153 m_fullScreenRenderer->destroy(); 153 m_fullScreenRenderer->destroy();
154 154
155 #if ENABLE(OILPAN) 155 #if ENABLE(OILPAN)
156 m_fullScreenElement = nullptr; 156 m_fullScreenElement = nullptr;
157 m_fullScreenElementStack.clear(); 157 m_fullScreenElementStack.clear();
158 #endif 158 #endif
159 159
160 } 160 }
161 161
162 #if !ENABLE(OILPAN) 162 #if !ENABLE(OILPAN)
163 void FullscreenElementStack::documentWasDisposed() 163 void Fullscreen::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) 172 bool Fullscreen::elementReady(Element& element, RequestType requestType)
173 { 173 {
174 // A fullscreen element ready check for an element |element| returns true if all of the 174 // A fullscreen element ready check for an element |element| returns true if all of the
175 // following are true, and false otherwise: 175 // following are true, and false otherwise:
176 176
177 // |element| is in a document. 177 // |element| is in a document.
178 if (!element.inDocument()) 178 if (!element.inDocument())
179 return false; 179 return false;
180 180
181 // |element|'s node document's fullscreen enabled flag is set. 181 // |element|'s node document's fullscreen enabled flag is set.
182 if (!fullscreenIsAllowedForAllOwners(element.document())) { 182 if (!fullscreenIsAllowedForAllOwners(element.document())) {
(...skipping 11 matching lines...) Expand all
194 } 194 }
195 195
196 // |element| has no ancestor element whose local name is iframe and namespac e is the HTML 196 // |element| has no ancestor element whose local name is iframe and namespac e is the HTML
197 // namespace. 197 // namespace.
198 if (Traversal<HTMLIFrameElement>::firstAncestor(element)) 198 if (Traversal<HTMLIFrameElement>::firstAncestor(element))
199 return false; 199 return false;
200 200
201 return true; 201 return true;
202 } 202 }
203 203
204 void FullscreenElementStack::requestFullscreen(Element& element, RequestType req uestType) 204 void Fullscreen::requestFullscreen(Element& element, RequestType requestType)
205 { 205 {
206 // Ignore this request if the document is not in a live frame. 206 // Ignore this request if the document is not in a live frame.
207 if (!document()->isActive()) 207 if (!document()->isActive())
208 return; 208 return;
209 209
210 do { 210 do {
211 // 1. If any of the following conditions are true, terminate these steps and queue a task to fire 211 // 1. If any of the following conditions are true, terminate these steps and queue a task to fire
212 // an event named fullscreenerror with its bubbles attribute set to true on the context object's 212 // an event named fullscreenerror with its bubbles attribute set to true on the context object's
213 // node document: 213 // node document:
214 214
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 m_areKeysEnabledInFullScreen = requestType != PrefixedMozillaRequest && requestType != PrefixedVideoRequest; 278 m_areKeysEnabledInFullScreen = requestType != PrefixedMozillaRequest && requestType != PrefixedVideoRequest;
279 document()->frameHost()->chrome().client().enterFullScreenForElement(&el ement); 279 document()->frameHost()->chrome().client().enterFullScreenForElement(&el ement);
280 280
281 // 7. Optionally, display a message indicating how the user can exit dis playing the context object fullscreen. 281 // 7. Optionally, display a message indicating how the user can exit dis playing the context object fullscreen.
282 return; 282 return;
283 } while (0); 283 } while (0);
284 284
285 enqueueErrorEvent(element, requestType); 285 enqueueErrorEvent(element, requestType);
286 } 286 }
287 287
288 void FullscreenElementStack::fullyExitFullscreen() 288 void Fullscreen::fullyExitFullscreen()
289 { 289 {
290 // "To fully exit fullscreen act as if the exitFullscreen() method was invok ed on the top-level browsing 290 // "To fully exit fullscreen act as if the exitFullscreen() method was invok ed on the top-level browsing
291 // context's document and subsequently empty that document's fullscreen elem ent stack." 291 // context's document and subsequently empty that document's fullscreen elem ent stack."
292 if (!fullscreenElementFrom(document()->topDocument())) 292 if (!fullscreenElementFrom(document()->topDocument()))
293 return; 293 return;
294 294
295 // To achieve that aim, remove all the elements from the top document's stac k except for the first before 295 // To achieve that aim, remove all the elements from the top document's stac k except for the first before
296 // calling exitFullscreen(): 296 // calling exitFullscreen():
297 WillBeHeapVector<std::pair<RefPtrWillBeMember<Element>, RequestType> > repla cementFullscreenElementStack; 297 WillBeHeapVector<std::pair<RefPtrWillBeMember<Element>, RequestType> > repla cementFullscreenElementStack;
298 FullscreenElementStack& topFullscreenElementStack = from(document()->topDocu ment()); 298 Fullscreen& topFullscreen = from(document()->topDocument());
299 replacementFullscreenElementStack.append(topFullscreenElementStack.m_fullScr eenElementStack.last()); 299 replacementFullscreenElementStack.append(topFullscreen.m_fullScreenElementSt ack.last());
300 topFullscreenElementStack.m_fullScreenElementStack.swap(replacementFullscree nElementStack); 300 topFullscreen.m_fullScreenElementStack.swap(replacementFullscreenElementStac k);
301 topFullscreenElementStack.exitFullscreen(); 301 topFullscreen.exitFullscreen();
302 } 302 }
303 303
304 void FullscreenElementStack::exitFullscreen() 304 void Fullscreen::exitFullscreen()
305 { 305 {
306 // The exitFullscreen() method must run these steps: 306 // The exitFullscreen() method must run these steps:
307 307
308 // 1. Let doc be the context object. (i.e. "this") 308 // 1. Let doc be the context object. (i.e. "this")
309 Document* currentDoc = document(); 309 Document* currentDoc = document();
310 if (!currentDoc->isActive()) 310 if (!currentDoc->isActive())
311 return; 311 return;
312 312
313 // 2. If doc's fullscreen element stack is empty, terminate these steps. 313 // 2. If doc's fullscreen element stack is empty, terminate these steps.
314 if (m_fullScreenElementStack.isEmpty()) 314 if (m_fullScreenElementStack.isEmpty())
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 // full screen stack. 379 // full screen stack.
380 if (!newTop) { 380 if (!newTop) {
381 host->chrome().client().exitFullScreenForElement(m_fullScreenElement.get ()); 381 host->chrome().client().exitFullScreenForElement(m_fullScreenElement.get ());
382 return; 382 return;
383 } 383 }
384 384
385 // Otherwise, notify the chrome of the new full screen element. 385 // Otherwise, notify the chrome of the new full screen element.
386 host->chrome().client().enterFullScreenForElement(newTop); 386 host->chrome().client().enterFullScreenForElement(newTop);
387 } 387 }
388 388
389 bool FullscreenElementStack::fullscreenEnabled(Document& document) 389 bool Fullscreen::fullscreenEnabled(Document& document)
390 { 390 {
391 // 4. The fullscreenEnabled attribute must return true if the context object has its 391 // 4. The fullscreenEnabled attribute must return true if the context object has its
392 // fullscreen enabled flag set and fullscreen is supported, and false oth erwise. 392 // fullscreen enabled flag set and fullscreen is supported, and false oth erwise.
393 393
394 // Top-level browsing contexts are implied to have their allowFullScreen att ribute set. 394 // Top-level browsing contexts are implied to have their allowFullScreen att ribute set.
395 return fullscreenIsAllowedForAllOwners(document) && fullscreenIsSupported(do cument); 395 return fullscreenIsAllowedForAllOwners(document) && fullscreenIsSupported(do cument);
396 } 396 }
397 397
398 void FullscreenElementStack::willEnterFullScreenForElement(Element* element) 398 void Fullscreen::willEnterFullScreenForElement(Element* element)
399 { 399 {
400 ASSERT(element); 400 ASSERT(element);
401 if (!document()->isActive()) 401 if (!document()->isActive())
402 return; 402 return;
403 403
404 if (m_fullScreenRenderer) 404 if (m_fullScreenRenderer)
405 m_fullScreenRenderer->unwrapRenderer(); 405 m_fullScreenRenderer->unwrapRenderer();
406 406
407 m_fullScreenElement = element; 407 m_fullScreenElement = element;
408 408
(...skipping 11 matching lines...) Expand all
420 if (m_fullScreenElement != document()->documentElement()) 420 if (m_fullScreenElement != document()->documentElement())
421 RenderFullScreen::wrapRenderer(renderer, renderer ? renderer->parent() : 0, document()); 421 RenderFullScreen::wrapRenderer(renderer, renderer ? renderer->parent() : 0, document());
422 422
423 m_fullScreenElement->setContainsFullScreenElementOnAncestorsCrossingFrameBou ndaries(true); 423 m_fullScreenElement->setContainsFullScreenElementOnAncestorsCrossingFrameBou ndaries(true);
424 424
425 // FIXME: This should not call updateStyleIfNeeded. 425 // FIXME: This should not call updateStyleIfNeeded.
426 document()->setNeedsStyleRecalc(SubtreeStyleChange); 426 document()->setNeedsStyleRecalc(SubtreeStyleChange);
427 document()->updateRenderTreeIfNeeded(); 427 document()->updateRenderTreeIfNeeded();
428 } 428 }
429 429
430 void FullscreenElementStack::didEnterFullScreenForElement(Element*) 430 void Fullscreen::didEnterFullScreenForElement(Element*)
431 { 431 {
432 if (!m_fullScreenElement) 432 if (!m_fullScreenElement)
433 return; 433 return;
434 434
435 if (!document()->isActive()) 435 if (!document()->isActive())
436 return; 436 return;
437 437
438 m_fullScreenElement->didBecomeFullscreenElement(); 438 m_fullScreenElement->didBecomeFullscreenElement();
439 439
440 m_eventQueueTimer.startOneShot(0, FROM_HERE); 440 m_eventQueueTimer.startOneShot(0, FROM_HERE);
441 } 441 }
442 442
443 void FullscreenElementStack::willExitFullScreenForElement(Element*) 443 void Fullscreen::willExitFullScreenForElement(Element*)
444 { 444 {
445 if (!m_fullScreenElement) 445 if (!m_fullScreenElement)
446 return; 446 return;
447 447
448 if (!document()->isActive()) 448 if (!document()->isActive())
449 return; 449 return;
450 450
451 m_fullScreenElement->willStopBeingFullscreenElement(); 451 m_fullScreenElement->willStopBeingFullscreenElement();
452 } 452 }
453 453
454 void FullscreenElementStack::didExitFullScreenForElement(Element*) 454 void Fullscreen::didExitFullScreenForElement(Element*)
455 { 455 {
456 if (!m_fullScreenElement) 456 if (!m_fullScreenElement)
457 return; 457 return;
458 458
459 if (!document()->isActive()) 459 if (!document()->isActive())
460 return; 460 return;
461 461
462 m_fullScreenElement->setContainsFullScreenElementOnAncestorsCrossingFrameBou ndaries(false); 462 m_fullScreenElement->setContainsFullScreenElementOnAncestorsCrossingFrameBou ndaries(false);
463 463
464 m_areKeysEnabledInFullScreen = false; 464 m_areKeysEnabledInFullScreen = false;
465 465
466 if (m_fullScreenRenderer) 466 if (m_fullScreenRenderer)
467 m_fullScreenRenderer->unwrapRenderer(); 467 m_fullScreenRenderer->unwrapRenderer();
468 468
469 m_fullScreenElement = nullptr; 469 m_fullScreenElement = nullptr;
470 document()->setNeedsStyleRecalc(SubtreeStyleChange); 470 document()->setNeedsStyleRecalc(SubtreeStyleChange);
471 471
472 // When fullyExitFullscreen is called, we call exitFullscreen on the topDocu ment(). That means 472 // When fullyExitFullscreen is called, we call exitFullscreen on the topDocu ment(). That means
473 // that the events will be queued there. So if we have no events here, start the timer on the 473 // that the events will be queued there. So if we have no events here, start the timer on the
474 // exiting document. 474 // exiting document.
475 Document* exitingDocument = document(); 475 Document* exitingDocument = document();
476 if (m_eventQueue.isEmpty()) 476 if (m_eventQueue.isEmpty())
477 exitingDocument = &document()->topDocument(); 477 exitingDocument = &document()->topDocument();
478 ASSERT(exitingDocument); 478 ASSERT(exitingDocument);
479 from(*exitingDocument).m_eventQueueTimer.startOneShot(0, FROM_HERE); 479 from(*exitingDocument).m_eventQueueTimer.startOneShot(0, FROM_HERE);
480 } 480 }
481 481
482 void FullscreenElementStack::setFullScreenRenderer(RenderFullScreen* renderer) 482 void Fullscreen::setFullScreenRenderer(RenderFullScreen* renderer)
483 { 483 {
484 if (renderer == m_fullScreenRenderer) 484 if (renderer == m_fullScreenRenderer)
485 return; 485 return;
486 486
487 if (renderer && m_savedPlaceholderRenderStyle) { 487 if (renderer && m_savedPlaceholderRenderStyle) {
488 renderer->createPlaceholder(m_savedPlaceholderRenderStyle.release(), m_s avedPlaceholderFrameRect); 488 renderer->createPlaceholder(m_savedPlaceholderRenderStyle.release(), m_s avedPlaceholderFrameRect);
489 } else if (renderer && m_fullScreenRenderer && m_fullScreenRenderer->placeho lder()) { 489 } else if (renderer && m_fullScreenRenderer && m_fullScreenRenderer->placeho lder()) {
490 RenderBlock* placeholder = m_fullScreenRenderer->placeholder(); 490 RenderBlock* placeholder = m_fullScreenRenderer->placeholder();
491 renderer->createPlaceholder(RenderStyle::clone(placeholder->style()), pl aceholder->frameRect()); 491 renderer->createPlaceholder(RenderStyle::clone(placeholder->style()), pl aceholder->frameRect());
492 } 492 }
493 493
494 if (m_fullScreenRenderer) 494 if (m_fullScreenRenderer)
495 m_fullScreenRenderer->unwrapRenderer(); 495 m_fullScreenRenderer->unwrapRenderer();
496 ASSERT(!m_fullScreenRenderer); 496 ASSERT(!m_fullScreenRenderer);
497 497
498 m_fullScreenRenderer = renderer; 498 m_fullScreenRenderer = renderer;
499 } 499 }
500 500
501 void FullscreenElementStack::fullScreenRendererDestroyed() 501 void Fullscreen::fullScreenRendererDestroyed()
502 { 502 {
503 m_fullScreenRenderer = nullptr; 503 m_fullScreenRenderer = nullptr;
504 } 504 }
505 505
506 void FullscreenElementStack::enqueueChangeEvent(Document& document, RequestType requestType) 506 void Fullscreen::enqueueChangeEvent(Document& document, RequestType requestType)
507 { 507 {
508 RefPtrWillBeRawPtr<Event> event; 508 RefPtrWillBeRawPtr<Event> event;
509 if (requestType == UnprefixedRequest) { 509 if (requestType == UnprefixedRequest) {
510 event = createEvent(EventTypeNames::fullscreenchange, document); 510 event = createEvent(EventTypeNames::fullscreenchange, document);
511 } else { 511 } else {
512 ASSERT(document.hasFullscreenElementStack()); 512 ASSERT(document.hasFullscreenSupplement());
513 FullscreenElementStack& fullscreen = from(document); 513 Fullscreen& fullscreen = from(document);
514 EventTarget* target = fullscreen.fullscreenElement(); 514 EventTarget* target = fullscreen.fullscreenElement();
515 if (!target) 515 if (!target)
516 target = fullscreen.webkitCurrentFullScreenElement(); 516 target = fullscreen.webkitCurrentFullScreenElement();
517 if (!target) 517 if (!target)
518 target = &document; 518 target = &document;
519 event = createEvent(EventTypeNames::webkitfullscreenchange, *target); 519 event = createEvent(EventTypeNames::webkitfullscreenchange, *target);
520 } 520 }
521 m_eventQueue.append(event); 521 m_eventQueue.append(event);
522 // NOTE: The timer is started in didEnterFullScreenForElement/didExitFullScr eenForElement. 522 // NOTE: The timer is started in didEnterFullScreenForElement/didExitFullScr eenForElement.
523 } 523 }
524 524
525 void FullscreenElementStack::enqueueErrorEvent(Element& element, RequestType req uestType) 525 void Fullscreen::enqueueErrorEvent(Element& element, RequestType requestType)
526 { 526 {
527 RefPtrWillBeRawPtr<Event> event; 527 RefPtrWillBeRawPtr<Event> event;
528 if (requestType == UnprefixedRequest) 528 if (requestType == UnprefixedRequest)
529 event = createEvent(EventTypeNames::fullscreenerror, element.document()) ; 529 event = createEvent(EventTypeNames::fullscreenerror, element.document()) ;
530 else 530 else
531 event = createEvent(EventTypeNames::webkitfullscreenerror, element); 531 event = createEvent(EventTypeNames::webkitfullscreenerror, element);
532 m_eventQueue.append(event); 532 m_eventQueue.append(event);
533 m_eventQueueTimer.startOneShot(0, FROM_HERE); 533 m_eventQueueTimer.startOneShot(0, FROM_HERE);
534 } 534 }
535 535
536 void FullscreenElementStack::eventQueueTimerFired(Timer<FullscreenElementStack>* ) 536 void Fullscreen::eventQueueTimerFired(Timer<Fullscreen>*)
537 { 537 {
538 // Since we dispatch events in this function, it's possible that the 538 // Since we dispatch events in this function, it's possible that the
539 // document will be detached and GC'd. We protect it here to make sure we 539 // document will be detached and GC'd. We protect it here to make sure we
540 // can finish the function successfully. 540 // can finish the function successfully.
541 RefPtrWillBeRawPtr<Document> protectDocument(document()); 541 RefPtrWillBeRawPtr<Document> protectDocument(document());
542 WillBeHeapDeque<RefPtrWillBeMember<Event> > eventQueue; 542 WillBeHeapDeque<RefPtrWillBeMember<Event> > eventQueue;
543 m_eventQueue.swap(eventQueue); 543 m_eventQueue.swap(eventQueue);
544 544
545 while (!eventQueue.isEmpty()) { 545 while (!eventQueue.isEmpty()) {
546 RefPtrWillBeRawPtr<Event> event = eventQueue.takeFirst(); 546 RefPtrWillBeRawPtr<Event> event = eventQueue.takeFirst();
547 Node* target = event->target()->toNode(); 547 Node* target = event->target()->toNode();
548 548
549 // If the element was removed from our tree, also message the documentEl ement. 549 // If the element was removed from our tree, also message the documentEl ement.
550 if (!target->inDocument() && document()->documentElement()) { 550 if (!target->inDocument() && document()->documentElement()) {
551 ASSERT(isPrefixed(event->type())); 551 ASSERT(isPrefixed(event->type()));
552 eventQueue.append(createEvent(event->type(), *document()->documentEl ement())); 552 eventQueue.append(createEvent(event->type(), *document()->documentEl ement()));
553 } 553 }
554 554
555 target->dispatchEvent(event); 555 target->dispatchEvent(event);
556 } 556 }
557 } 557 }
558 558
559 void FullscreenElementStack::elementRemoved(Element& element) 559 void Fullscreen::elementRemoved(Element& element)
560 { 560 {
561 // If an element |element| in a fullscreen element stack is removed from a d ocument |document|, 561 // If an element |element| in a fullscreen element stack is removed from a d ocument |document|,
562 // run these steps: 562 // run these steps:
563 563
564 // 1. If |element| was at the top of |document|'s fullscreen element stack, act as if the 564 // 1. If |element| was at the top of |document|'s fullscreen element stack, act as if the
565 // exitFullscreen() method was invoked on that document. 565 // exitFullscreen() method was invoked on that document.
566 if (fullscreenElement() == &element) { 566 if (fullscreenElement() == &element) {
567 exitFullscreen(); 567 exitFullscreen();
568 return; 568 return;
569 } 569 }
570 570
571 // 2. Otherwise, remove |element| from |document|'s fullscreen element stack . 571 // 2. Otherwise, remove |element| from |document|'s fullscreen element stack .
572 for (size_t i = 0; i < m_fullScreenElementStack.size(); ++i) { 572 for (size_t i = 0; i < m_fullScreenElementStack.size(); ++i) {
573 if (m_fullScreenElementStack[i].first.get() == &element) { 573 if (m_fullScreenElementStack[i].first.get() == &element) {
574 m_fullScreenElementStack.remove(i); 574 m_fullScreenElementStack.remove(i);
575 return; 575 return;
576 } 576 }
577 } 577 }
578 578
579 // NOTE: |element| was not in the fullscreen element stack. 579 // NOTE: |element| was not in the fullscreen element stack.
580 } 580 }
581 581
582 void FullscreenElementStack::clearFullscreenElementStack() 582 void Fullscreen::clearFullscreenElementStack()
583 { 583 {
584 m_fullScreenElementStack.clear(); 584 m_fullScreenElementStack.clear();
585 } 585 }
586 586
587 void FullscreenElementStack::popFullscreenElementStack() 587 void Fullscreen::popFullscreenElementStack()
588 { 588 {
589 if (m_fullScreenElementStack.isEmpty()) 589 if (m_fullScreenElementStack.isEmpty())
590 return; 590 return;
591 591
592 m_fullScreenElementStack.removeLast(); 592 m_fullScreenElementStack.removeLast();
593 } 593 }
594 594
595 void FullscreenElementStack::pushFullscreenElementStack(Element& element, Reques tType requestType) 595 void Fullscreen::pushFullscreenElementStack(Element& element, RequestType reques tType)
596 { 596 {
597 m_fullScreenElementStack.append(std::make_pair(&element, requestType)); 597 m_fullScreenElementStack.append(std::make_pair(&element, requestType));
598 } 598 }
599 599
600 void FullscreenElementStack::trace(Visitor* visitor) 600 void Fullscreen::trace(Visitor* visitor)
601 { 601 {
602 visitor->trace(m_fullScreenElement); 602 visitor->trace(m_fullScreenElement);
603 visitor->trace(m_fullScreenElementStack); 603 visitor->trace(m_fullScreenElementStack);
604 visitor->trace(m_fullScreenRenderer); 604 visitor->trace(m_fullScreenRenderer);
605 visitor->trace(m_eventQueue); 605 visitor->trace(m_eventQueue);
606 DocumentSupplement::trace(visitor); 606 DocumentSupplement::trace(visitor);
607 } 607 }
608 608
609 } // namespace blink 609 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/dom/Fullscreen.h ('k') | Source/core/dom/FullscreenElementStack.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698