Index: Source/modules/screen_orientation/ScreenOrientationController.cpp |
diff --git a/Source/modules/screen_orientation/ScreenOrientationController.cpp b/Source/modules/screen_orientation/ScreenOrientationController.cpp |
index 8e1882d59117cf66d219d025dfcec93b491f0380..af35b986950871a69d10afc1166fb7977f197568 100644 |
--- a/Source/modules/screen_orientation/ScreenOrientationController.cpp |
+++ b/Source/modules/screen_orientation/ScreenOrientationController.cpp |
@@ -5,11 +5,11 @@ |
#include "config.h" |
#include "modules/screen_orientation/ScreenOrientationController.h" |
-#include "core/events/Event.h" |
+#include "core/frame/LocalDOMWindow.h" |
#include "core/frame/FrameView.h" |
#include "core/frame/LocalFrame.h" |
+#include "core/frame/Screen.h" |
#include "core/page/Page.h" |
-#include "modules/screen_orientation/ScreenOrientation.h" |
#include "platform/LayoutTestSupport.h" |
#include "platform/PlatformScreen.h" |
#include "public/platform/WebScreenOrientationClient.h" |
@@ -32,13 +32,14 @@ |
WillBeHeapSupplement<LocalFrame>::provideTo(frame, supplementName(), adoptPtrWillBeNoop(controller)); |
} |
-ScreenOrientationController* ScreenOrientationController::from(LocalFrame& frame) |
+ScreenOrientationController& ScreenOrientationController::from(LocalFrame& frame) |
{ |
- return static_cast<ScreenOrientationController*>(WillBeHeapSupplement<LocalFrame>::from(frame, supplementName())); |
+ return *static_cast<ScreenOrientationController*>(WillBeHeapSupplement<LocalFrame>::from(frame, supplementName())); |
} |
ScreenOrientationController::ScreenOrientationController(LocalFrame& frame, blink::WebScreenOrientationClient* client) |
: PageLifecycleObserver(frame.page()) |
+ , m_overrideOrientation(blink::WebScreenOrientationUndefined) |
, m_client(client) |
, m_frame(frame) |
{ |
@@ -76,9 +77,33 @@ |
} |
} |
-void ScreenOrientationController::updateOrientation() |
+void ScreenOrientationController::pageVisibilityChanged() |
{ |
- ASSERT(m_orientation); |
+ if (page() && page()->visibilityState() == PageVisibilityStateVisible) { |
+ blink::WebScreenOrientationType oldOrientation = m_overrideOrientation; |
+ m_overrideOrientation = blink::WebScreenOrientationUndefined; |
+ // FIXME: sendOrientationChangeEvent() currently send an event all the |
+ // children of the frame, so it should only be called on the frame on |
+ // top of the tree. We would need the embedder to call |
+ // sendOrientationChangeEvent on every WebFrame part of a WebView to be |
+ // able to remove this. |
+ if (m_frame == m_frame.localFrameRoot() && oldOrientation != orientation()) |
+ m_frame.sendOrientationChangeEvent(); |
+ } else if (m_overrideOrientation == blink::WebScreenOrientationUndefined) { |
+ // The page is no longer visible, store the last know screen orientation |
+ // so that we keep returning this orientation until the page becomes |
+ // visible again. |
+ m_overrideOrientation = orientation(); |
+ } |
+} |
+ |
+blink::WebScreenOrientationType ScreenOrientationController::orientation() const |
+{ |
+ if (m_overrideOrientation != blink::WebScreenOrientationUndefined) { |
+ // The page is not visible, keep returning the last known screen orientation. |
+ ASSERT(!page() || page()->visibilityState() != PageVisibilityStateVisible); |
+ return m_overrideOrientation; |
+ } |
blink::WebScreenOrientationType orientationType = screenOrientationType(m_frame.view()); |
if (orientationType == blink::WebScreenOrientationUndefined) { |
@@ -86,66 +111,10 @@ |
orientationType = computeOrientation(m_frame.view()); |
} |
ASSERT(orientationType != blink::WebScreenOrientationUndefined); |
- |
- m_orientation->setType(orientationType); |
- m_orientation->setAngle(screenOrientationAngle(m_frame.view())); |
+ return orientationType; |
} |
-void ScreenOrientationController::pageVisibilityChanged() |
-{ |
- if (!m_orientation || !page() || page()->visibilityState() != PageVisibilityStateVisible) |
- return; |
- |
- // The orientation type and angle are tied in a way that if the angle has |
- // changed, the type must have changed. |
- unsigned short currentAngle = screenOrientationAngle(m_frame.view()); |
- |
- // FIXME: sendOrientationChangeEvent() currently send an event all the |
- // children of the frame, so it should only be called on the frame on |
- // top of the tree. We would need the embedder to call |
- // sendOrientationChangeEvent on every WebFrame part of a WebView to be |
- // able to remove this. |
- if (m_frame == m_frame.localFrameRoot() && m_orientation->angle() != currentAngle) |
- notifyOrientationChanged(); |
-} |
- |
-void ScreenOrientationController::notifyOrientationChanged() |
-{ |
- ASSERT(RuntimeEnabledFeatures::screenOrientationEnabled()); |
- |
- if (!m_orientation || !page() || page()->visibilityState() != PageVisibilityStateVisible) |
- return; |
- |
- updateOrientation(); |
- |
- // Keep track of the frames that need to be notified before notifying the |
- // current frame as it will prevent side effects from the change event |
- // handlers. |
- Vector<RefPtr<LocalFrame> > childFrames; |
- for (Frame* child = m_frame.tree().firstChild(); child; child = child->tree().nextSibling()) { |
- if (child->isLocalFrame()) |
- childFrames.append(toLocalFrame(child)); |
- } |
- |
- // Notify current orientation object. |
- m_orientation->dispatchEvent(Event::create(EventTypeNames::change)); |
- |
- // ... and child frames, if they have a ScreenOrientationController. |
- for (size_t i = 0; i < childFrames.size(); ++i) { |
- ScreenOrientationController* controller = ScreenOrientationController::from(*childFrames[i]); |
- if (controller) |
- controller->notifyOrientationChanged(); |
- } |
-} |
- |
-void ScreenOrientationController::setOrientation(ScreenOrientation* orientation) |
-{ |
- m_orientation = orientation; |
- if (m_orientation) |
- updateOrientation(); |
-} |
- |
-void ScreenOrientationController::lock(blink::WebScreenOrientationLockType orientation, blink::WebLockOrientationCallback* callback) |
+void ScreenOrientationController::lockOrientation(blink::WebScreenOrientationLockType orientation, blink::WebLockOrientationCallback* callback) |
{ |
if (!m_client) { |
return; |
@@ -154,7 +123,7 @@ |
m_client->lockOrientation(orientation, callback); |
} |
-void ScreenOrientationController::unlock() |
+void ScreenOrientationController::unlockOrientation() |
{ |
if (!m_client) { |
return; |
@@ -163,15 +132,4 @@ |
m_client->unlockOrientation(); |
} |
-const LocalFrame& ScreenOrientationController::frame() const |
-{ |
- return m_frame; |
-} |
- |
-void ScreenOrientationController::trace(Visitor* visitor) |
-{ |
- visitor->trace(m_orientation); |
- WillBeHeapSupplement<LocalFrame>::trace(visitor); |
-} |
- |
} // namespace WebCore |