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

Unified Diff: third_party/WebKit/Source/core/dom/Fullscreen.cpp

Issue 2495423004: Convert FullscreenController to use WebCallbacks (Closed)
Patch Set: just in case Created 4 years 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/dom/Fullscreen.cpp
diff --git a/third_party/WebKit/Source/core/dom/Fullscreen.cpp b/third_party/WebKit/Source/core/dom/Fullscreen.cpp
index c168a417617edd87a6e25b1ce2aabfeda4e6ecce..acbd89c43566f47c868748fb13a61818abfb85ac 100644
--- a/third_party/WebKit/Source/core/dom/Fullscreen.cpp
+++ b/third_party/WebKit/Source/core/dom/Fullscreen.cpp
@@ -32,6 +32,7 @@
#include "bindings/core/v8/ConditionalFeatures.h"
#include "core/dom/Document.h"
#include "core/dom/ElementTraversal.h"
+#include "core/dom/FullscreenCallbacks.h"
#include "core/dom/StyleEngine.h"
#include "core/events/Event.h"
#include "core/frame/HostsUsingFeatures.h"
@@ -313,6 +314,36 @@ void Fullscreen::contextDestroyed() {
m_fullscreenElementStack.clear();
}
+// RequestFullscreenCallbacks hold the data for a pending request.
+// FullscreenController invokes the success or error callback.
+class RequestFullscreenCallbacks final : public FullscreenCallbacks {
+ USING_FAST_MALLOC(RequestFullscreenCallbacks);
+ WTF_MAKE_NONCOPYABLE(RequestFullscreenCallbacks);
+
+ public:
+ static std::unique_ptr<FullscreenCallbacks>
+ create(Document& document, Element& element, Fullscreen::RequestType type) {
+ return wrapUnique(new RequestFullscreenCallbacks(document, element, type));
+ }
+
+ void onSuccess() override {
+ Fullscreen::from(*m_document).didEnterFullscreen(*m_element);
+ }
+
+ void onError() override {
+ Fullscreen::from(*m_document).enqueueErrorEvent(*m_element, m_type);
+ }
+
+ private:
+ RequestFullscreenCallbacks(Document& document,
+ Element& element,
+ Fullscreen::RequestType type)
+ : m_document(document), m_element(element), m_type(type) {}
+ Persistent<Document> m_document;
+ Persistent<Element> m_element;
+ Fullscreen::RequestType m_type;
+};
+
// https://fullscreen.spec.whatwg.org/#dom-element-requestfullscreen
void Fullscreen::requestFullscreen(Element& element,
RequestType requestType,
@@ -432,8 +463,9 @@ void Fullscreen::requestFullscreen(Element& element,
// 5. Return, and run the remaining steps asynchronously.
// 6. Optionally, perform some animation.
- from(document).m_pendingFullscreenElement = &element;
- document.frame()->chromeClient().enterFullscreen(*document.frame());
+ document.frame()->chromeClient().enterFullscreen(
+ *document.frame(),
+ RequestFullscreenCallbacks::create(document, element, requestType));
// 7. Optionally, display a message indicating how the user can exit
// displaying the context object fullscreen.
@@ -562,8 +594,7 @@ void Fullscreen::exitFullscreen(Document& document) {
}
// Otherwise, enter fullscreen for the fullscreen element stack's top element.
- from(document).m_pendingFullscreenElement = newTop;
- from(document).didEnterFullscreen();
+ from(document).didEnterFullscreen(*newTop);
}
// https://fullscreen.spec.whatwg.org/#dom-document-fullscreenenabled
@@ -575,8 +606,8 @@ bool Fullscreen::fullscreenEnabled(Document& document) {
fullscreenIsSupported(document);
}
-void Fullscreen::didEnterFullscreen() {
- if (!document()->isActive() || !document()->frame())
+void Fullscreen::didEnterFullscreen(Element& element) {
+ if (!document() || !document()->isActive() || !document()->frame())
return;
// Start the timer for events enqueued by |requestFullscreen()|. The hover
@@ -584,14 +615,10 @@ void Fullscreen::didEnterFullscreen() {
document()->frame()->eventHandler().scheduleHoverStateUpdate();
m_eventQueueTimer.startOneShot(0, BLINK_FROM_HERE);
- Element* element = m_pendingFullscreenElement.release();
- if (!element)
- return;
-
- if (m_currentFullScreenElement == element)
+ if (m_currentFullScreenElement == &element)
return;
- if (!element->isConnected() || &element->document() != document()) {
+ if (!element.isConnected() || &element.document() != document()) {
// The element was removed or has moved to another document since the
// |requestFullscreen()| call. Exit fullscreen again to recover.
// TODO(foolip): Fire a fullscreenerror event. This is currently difficult
@@ -602,11 +629,14 @@ void Fullscreen::didEnterFullscreen() {
return;
}
+ if (m_currentFullScreenElement == &element)
+ return;
+
if (m_fullScreenLayoutObject)
m_fullScreenLayoutObject->unwrapLayoutObject();
Element* previousElement = m_currentFullScreenElement;
- m_currentFullScreenElement = element;
+ m_currentFullScreenElement = &element;
// Create a placeholder block for a the full-screen element, to keep the page
// from reflowing when the element is removed from the normal flow. Only do
@@ -650,11 +680,11 @@ void Fullscreen::didEnterFullscreen() {
document()->updateStyleAndLayoutTree();
document()->frame()->chromeClient().fullscreenElementChanged(previousElement,
- element);
+ &element);
}
void Fullscreen::didExitFullscreen() {
- if (!document()->isActive() || !document()->frame())
+ if (!document() || !document()->isActive() || !document()->frame())
return;
// Start the timer for events enqueued by |exitFullscreen()|. The hover state
@@ -807,7 +837,6 @@ void Fullscreen::pushFullscreenElementStack(Element& element,
}
DEFINE_TRACE(Fullscreen) {
- visitor->trace(m_pendingFullscreenElement);
visitor->trace(m_fullscreenElementStack);
visitor->trace(m_currentFullScreenElement);
visitor->trace(m_eventQueue);
« no previous file with comments | « third_party/WebKit/Source/core/dom/Fullscreen.h ('k') | third_party/WebKit/Source/core/dom/FullscreenCallbacks.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698