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

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

Issue 18896003: [WIP] Migrate Fullscreen to use top layer instead of RenderFullScreen (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 5 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
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 21 matching lines...) Expand all
32 #include "bindings/v8/ScriptController.h" 32 #include "bindings/v8/ScriptController.h"
33 #include "core/dom/Document.h" 33 #include "core/dom/Document.h"
34 #include "core/dom/Element.h" 34 #include "core/dom/Element.h"
35 #include "core/dom/Event.h" 35 #include "core/dom/Event.h"
36 #include "core/html/HTMLFrameOwnerElement.h" 36 #include "core/html/HTMLFrameOwnerElement.h"
37 #include "core/page/Chrome.h" 37 #include "core/page/Chrome.h"
38 #include "core/page/ChromeClient.h" 38 #include "core/page/ChromeClient.h"
39 #include "core/page/Frame.h" 39 #include "core/page/Frame.h"
40 #include "core/page/Page.h" 40 #include "core/page/Page.h"
41 #include "core/page/Settings.h" 41 #include "core/page/Settings.h"
42 #include "core/rendering/RenderFullScreen.h"
43 42
44 namespace WebCore { 43 namespace WebCore {
45 44
46 using namespace HTMLNames; 45 using namespace HTMLNames;
47 46
48 static bool isAttributeOnAllOwners(const WebCore::QualifiedName& attribute, cons t WebCore::QualifiedName& prefixedAttribute, const HTMLFrameOwnerElement* owner) 47 static bool isAttributeOnAllOwners(const WebCore::QualifiedName& attribute, cons t WebCore::QualifiedName& prefixedAttribute, const HTMLFrameOwnerElement* owner)
49 { 48 {
50 if (!owner) 49 if (!owner)
51 return true; 50 return true;
52 do { 51 do {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 bool FullscreenController::isFullScreen(Document* document) 93 bool FullscreenController::isFullScreen(Document* document)
95 { 94 {
96 if (FullscreenController* found = fromIfExists(document)) 95 if (FullscreenController* found = fromIfExists(document))
97 return found->webkitIsFullScreen(); 96 return found->webkitIsFullScreen();
98 return false; 97 return false;
99 } 98 }
100 99
101 FullscreenController::FullscreenController(Document* document) 100 FullscreenController::FullscreenController(Document* document)
102 : DocumentLifecycleObserver(document) 101 : DocumentLifecycleObserver(document)
103 , m_areKeysEnabledInFullScreen(false) 102 , m_areKeysEnabledInFullScreen(false)
104 , m_fullScreenRenderer(0)
105 , m_fullScreenChangeDelayTimer(this, &FullscreenController::fullScreenChange DelayTimerFired) 103 , m_fullScreenChangeDelayTimer(this, &FullscreenController::fullScreenChange DelayTimerFired)
106 { 104 {
107 document->setHasFullscreenController(); 105 document->setHasFullscreenController();
108 } 106 }
109 107
110 FullscreenController::~FullscreenController() 108 FullscreenController::~FullscreenController()
111 { 109 {
112 } 110 }
113 111
114 inline Document* FullscreenController::document() 112 inline Document* FullscreenController::document()
115 { 113 {
116 return toDocument(scriptExecutionContext()); 114 return toDocument(scriptExecutionContext());
117 } 115 }
118 116
119 void FullscreenController::documentWasDetached() 117 void FullscreenController::documentWasDetached()
120 { 118 {
121 m_fullScreenChangeEventTargetQueue.clear(); 119 m_fullScreenChangeEventTargetQueue.clear();
122 m_fullScreenErrorEventTargetQueue.clear(); 120 m_fullScreenErrorEventTargetQueue.clear();
123
124 if (m_fullScreenRenderer)
125 setFullScreenRenderer(0);
126 } 121 }
127 122
128 void FullscreenController::documentWasDisposed() 123 void FullscreenController::documentWasDisposed()
129 { 124 {
130 m_fullScreenElement = 0; 125 m_fullScreenElement = 0;
131 m_fullScreenElementStack.clear(); 126 m_fullScreenElementStack.clear();
132 } 127 }
133 128
134 bool FullscreenController::fullScreenIsAllowedForElement(Element* element) const 129 bool FullscreenController::fullScreenIsAllowedForElement(Element* element) const
135 { 130 {
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 if (!document()->attached()) 349 if (!document()->attached())
355 return; 350 return;
356 351
357 ASSERT(element); 352 ASSERT(element);
358 353
359 // Protect against being called after the document has been removed from the page. 354 // Protect against being called after the document has been removed from the page.
360 if (!document()->page()) 355 if (!document()->page())
361 return; 356 return;
362 357
363 ASSERT(document()->page()->settings()->fullScreenEnabled()); 358 ASSERT(document()->page()->settings()->fullScreenEnabled());
364
365 if (m_fullScreenRenderer)
366 m_fullScreenRenderer->unwrapRenderer();
367
368 m_fullScreenElement = element; 359 m_fullScreenElement = element;
360 document()->addToTopLayer(element);
369 361
370 #if USE(NATIVE_FULLSCREEN_VIDEO) 362 #if USE(NATIVE_FULLSCREEN_VIDEO)
371 if (element && element->isMediaElement()) 363 if (element && element->isMediaElement())
372 return; 364 return;
373 #endif 365 #endif
374 366
375 // Create a placeholder block for a the full-screen element, to keep the pag e from reflowing
376 // when the element is removed from the normal flow. Only do this for a Rend erBox, as only
377 // a box will have a frameRect. The placeholder will be created in setFullSc reenRenderer()
378 // during layout.
379 RenderObject* renderer = m_fullScreenElement->renderer();
380 bool shouldCreatePlaceholder = renderer && renderer->isBox();
381 if (shouldCreatePlaceholder) {
382 m_savedPlaceholderFrameRect = toRenderBox(renderer)->frameRect();
383 m_savedPlaceholderRenderStyle = RenderStyle::clone(renderer->style());
384 }
trchen 2013/07/18 22:26:29 I'm not sure how Document::addToTopLayer() works,
falken 2013/07/22 17:51:44 Yes, I think so. I thought we should remove it sin
385
386 if (m_fullScreenElement != document()->documentElement())
387 RenderFullScreen::wrapRenderer(renderer, renderer ? renderer->parent() : 0, document());
388
389 m_fullScreenElement->setContainsFullScreenElementOnAncestorsCrossingFrameBou ndaries(true); 367 m_fullScreenElement->setContainsFullScreenElementOnAncestorsCrossingFrameBou ndaries(true);
390
391 document()->recalcStyle(Node::Force);
falken 2013/07/09 12:50:22 I think this recalcStyle was a quirk needed for Re
392 } 368 }
393 369
394 void FullscreenController::webkitDidEnterFullScreenForElement(Element*) 370 void FullscreenController::webkitDidEnterFullScreenForElement(Element*)
395 { 371 {
396 if (!m_fullScreenElement) 372 if (!m_fullScreenElement)
397 return; 373 return;
398 374
399 if (!document()->attached()) 375 if (!document()->attached())
400 return; 376 return;
401 377
402 m_fullScreenElement->didBecomeFullscreenElement(); 378 m_fullScreenElement->didBecomeFullscreenElement();
403 379
404 m_fullScreenChangeDelayTimer.startOneShot(0); 380 m_fullScreenChangeDelayTimer.startOneShot(0);
405 } 381 }
406 382
407 void FullscreenController::webkitWillExitFullScreenForElement(Element*) 383 void FullscreenController::webkitWillExitFullScreenForElement(Element*)
408 { 384 {
409 if (!m_fullScreenElement) 385 if (!m_fullScreenElement)
410 return; 386 return;
411 387
412 if (!document()->attached()) 388 if (!document()->attached())
413 return; 389 return;
414 390
391 document()->removeFromTopLayer(m_fullScreenElement.get());
415 m_fullScreenElement->willStopBeingFullscreenElement(); 392 m_fullScreenElement->willStopBeingFullscreenElement();
416 } 393 }
417 394
418 void FullscreenController::webkitDidExitFullScreenForElement(Element*) 395 void FullscreenController::webkitDidExitFullScreenForElement(Element*)
419 { 396 {
420 if (!m_fullScreenElement) 397 if (!m_fullScreenElement)
421 return; 398 return;
422 399
423 if (!document()->attached()) 400 if (!document()->attached())
424 return; 401 return;
425 402
426 m_fullScreenElement->setContainsFullScreenElementOnAncestorsCrossingFrameBou ndaries(false); 403 m_fullScreenElement->setContainsFullScreenElementOnAncestorsCrossingFrameBou ndaries(false);
427
428 m_areKeysEnabledInFullScreen = false; 404 m_areKeysEnabledInFullScreen = false;
429 405
430 if (m_fullScreenRenderer)
431 m_fullScreenRenderer->unwrapRenderer();
432
433 m_fullScreenElement = 0; 406 m_fullScreenElement = 0;
434 document()->scheduleForcedStyleRecalc(); 407 document()->scheduleForcedStyleRecalc();
435 408
436 // When webkitCancelFullScreen is called, we call webkitExitFullScreen on th e topDocument(). That 409 // When webkitCancelFullScreen is called, we call webkitExitFullScreen on th e topDocument(). That
437 // means that the events will be queued there. So if we have no events here, start the timer on 410 // means that the events will be queued there. So if we have no events here, start the timer on
438 // the exiting document. 411 // the exiting document.
439 Document* exitingDocument = document(); 412 Document* exitingDocument = document();
440 if (m_fullScreenChangeEventTargetQueue.isEmpty() && m_fullScreenErrorEventTa rgetQueue.isEmpty()) 413 if (m_fullScreenChangeEventTargetQueue.isEmpty() && m_fullScreenErrorEventTa rgetQueue.isEmpty())
441 exitingDocument = document()->topDocument(); 414 exitingDocument = document()->topDocument();
442 from(exitingDocument)->m_fullScreenChangeDelayTimer.startOneShot(0); 415 from(exitingDocument)->m_fullScreenChangeDelayTimer.startOneShot(0);
443 } 416 }
444 417
445 void FullscreenController::setFullScreenRenderer(RenderFullScreen* renderer)
446 {
447 if (renderer == m_fullScreenRenderer)
448 return;
449
450 if (renderer && m_savedPlaceholderRenderStyle) {
451 renderer->createPlaceholder(m_savedPlaceholderRenderStyle.release(), m_s avedPlaceholderFrameRect);
452 } else if (renderer && m_fullScreenRenderer && m_fullScreenRenderer->placeho lder()) {
453 RenderBlock* placeholder = m_fullScreenRenderer->placeholder();
454 renderer->createPlaceholder(RenderStyle::clone(placeholder->style()), pl aceholder->frameRect());
455 }
456
457 if (m_fullScreenRenderer)
458 m_fullScreenRenderer->destroy();
459 ASSERT(!m_fullScreenRenderer);
460
461 m_fullScreenRenderer = renderer;
462 }
463
464 void FullscreenController::fullScreenRendererDestroyed()
465 {
466 m_fullScreenRenderer = 0;
467 }
468
469 void FullscreenController::fullScreenChangeDelayTimerFired(Timer<FullscreenContr oller>*) 418 void FullscreenController::fullScreenChangeDelayTimerFired(Timer<FullscreenContr oller>*)
470 { 419 {
471 // Since we dispatch events in this function, it's possible that the 420 // Since we dispatch events in this function, it's possible that the
472 // document will be detached and GC'd. We protect it here to make sure we 421 // document will be detached and GC'd. We protect it here to make sure we
473 // can finish the function successfully. 422 // can finish the function successfully.
474 RefPtr<Document> protectDocument(document()); 423 RefPtr<Document> protectDocument(document());
475 Deque<RefPtr<Node> > changeQueue; 424 Deque<RefPtr<Node> > changeQueue;
476 m_fullScreenChangeEventTargetQueue.swap(changeQueue); 425 m_fullScreenChangeEventTargetQueue.swap(changeQueue);
477 Deque<RefPtr<Node> > errorQueue; 426 Deque<RefPtr<Node> > errorQueue;
478 m_fullScreenErrorEventTargetQueue.swap(errorQueue); 427 m_fullScreenErrorEventTargetQueue.swap(errorQueue);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 void FullscreenController::clearFullscreenElementStack() 483 void FullscreenController::clearFullscreenElementStack()
535 { 484 {
536 m_fullScreenElementStack.clear(); 485 m_fullScreenElementStack.clear();
537 } 486 }
538 487
539 void FullscreenController::popFullscreenElementStack() 488 void FullscreenController::popFullscreenElementStack()
540 { 489 {
541 if (m_fullScreenElementStack.isEmpty()) 490 if (m_fullScreenElementStack.isEmpty())
542 return; 491 return;
543 492
493 document()->removeFromTopLayer(m_fullScreenElementStack.last().get());
544 m_fullScreenElementStack.removeLast(); 494 m_fullScreenElementStack.removeLast();
545 } 495 }
546 496
547 void FullscreenController::pushFullscreenElementStack(Element* element) 497 void FullscreenController::pushFullscreenElementStack(Element* element)
548 { 498 {
499 document()->addToTopLayer(element);
549 m_fullScreenElementStack.append(element); 500 m_fullScreenElementStack.append(element);
550 } 501 }
551 502
552 void FullscreenController::addDocumentToFullScreenChangeEventQueue(Document* doc ) 503 void FullscreenController::addDocumentToFullScreenChangeEventQueue(Document* doc )
553 { 504 {
554 ASSERT(doc); 505 ASSERT(doc);
555 506
556 Node* target = 0; 507 Node* target = 0;
557 if (FullscreenController* controller = fromIfExists(doc)) { 508 if (FullscreenController* controller = fromIfExists(doc)) {
558 target = controller->webkitFullscreenElement(); 509 target = controller->webkitFullscreenElement();
559 if (!target) 510 if (!target)
560 target = controller->webkitCurrentFullScreenElement(); 511 target = controller->webkitCurrentFullScreenElement();
561 } 512 }
562 513
563 if (!target) 514 if (!target)
564 target = doc; 515 target = doc;
565 m_fullScreenChangeEventTargetQueue.append(target); 516 m_fullScreenChangeEventTargetQueue.append(target);
566 } 517 }
567 518
568 } // namespace WebCore 519 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698