Chromium Code Reviews| Index: Source/modules/screen_orientation/ScreenOrientationController.cpp |
| diff --git a/Source/modules/screen_orientation/ScreenOrientationController.cpp b/Source/modules/screen_orientation/ScreenOrientationController.cpp |
| index af35b986950871a69d10afc1166fb7977f197568..c8df9c7c25cf1f06c11210238cc314185e5f8087 100644 |
| --- a/Source/modules/screen_orientation/ScreenOrientationController.cpp |
| +++ b/Source/modules/screen_orientation/ScreenOrientationController.cpp |
| @@ -5,15 +5,18 @@ |
| #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/OrientationInformation.h" |
| #include "platform/LayoutTestSupport.h" |
| #include "platform/PlatformScreen.h" |
| #include "public/platform/WebScreenOrientationClient.h" |
| + |
|
abarth-chromium
2014/07/02 18:25:10
This blank line looks spurious
mlamouri (slow - plz ping)
2014/07/02 19:18:12
Done.
|
| namespace WebCore { |
| ScreenOrientationController::~ScreenOrientationController() |
| @@ -39,7 +42,7 @@ ScreenOrientationController& ScreenOrientationController::from(LocalFrame& frame |
| ScreenOrientationController::ScreenOrientationController(LocalFrame& frame, blink::WebScreenOrientationClient* client) |
| : PageLifecycleObserver(frame.page()) |
| - , m_overrideOrientation(blink::WebScreenOrientationUndefined) |
| + , m_orientation(new OrientationInformation) |
| , m_client(client) |
| , m_frame(frame) |
| { |
| @@ -77,41 +80,68 @@ blink::WebScreenOrientationType ScreenOrientationController::computeOrientation( |
| } |
| } |
| -void ScreenOrientationController::pageVisibilityChanged() |
| +void ScreenOrientationController::updateOrientation() |
| { |
| - 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) { |
| // The embedder could not provide us with an orientation, deduce it ourselves. |
| orientationType = computeOrientation(m_frame.view()); |
| } |
| ASSERT(orientationType != blink::WebScreenOrientationUndefined); |
| - return orientationType; |
| + |
| + m_orientation->setType(orientationType); |
| + m_orientation->setAngle(screenOrientationAngle(m_frame.view())); |
| +} |
| + |
| +void ScreenOrientationController::pageVisibilityChanged() |
| +{ |
| + if (!page() || page()->visibilityState() != PageVisibilityStateVisible) |
| + return; |
| + |
| + OrientationInformation previousOrientation = *m_orientation; |
|
abarth-chromium
2014/07/02 18:25:10
Hum.. We shouldn't keep DOM object as values on t
mlamouri (slow - plz ping)
2014/07/02 19:18:13
Done.
|
| + updateOrientation(); |
| + |
| + // 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() && previousOrientation != *m_orientation) |
|
abarth-chromium
2014/07/02 18:25:10
Here I'd just call !previousOrientation->equals(m_
mlamouri (slow - plz ping)
2014/07/02 19:18:12
Done.
|
| + ScreenOrientationController::from(m_frame).notifyOrientationChanged(); |
|
abarth-chromium
2014/07/02 18:25:10
Can ScreenOrientationController::from(m_frame) ret
mlamouri (slow - plz ping)
2014/07/02 19:18:12
Done.
|
| +} |
| + |
| +void ScreenOrientationController::notifyOrientationChanged() |
| +{ |
| + if (!RuntimeEnabledFeatures::orientationEventEnabled() && !RuntimeEnabledFeatures::screenOrientationEnabled()) |
| + return; |
| + |
| + if (!page() || page()->visibilityState() != PageVisibilityStateVisible) |
| + return; |
| + |
| + updateOrientation(); |
|
abarth-chromium
2014/07/02 18:25:10
Can we end up calling this function again when not
mlamouri (slow - plz ping)
2014/07/02 19:18:13
Done. I check changes in pageVisibilityChanged usi
|
| + |
| + LocalDOMWindow* window = m_frame.domWindow(); |
| + if (!window) |
| + return; |
| + window->dispatchEvent(Event::create(EventTypeNames::orientationchange)); |
|
abarth-chromium
2014/07/02 18:25:10
What happens if script below this point destroys |
mlamouri (slow - plz ping)
2014/07/02 19:18:12
I created the |childFrames| list before notifying
|
| + |
| + // Notify subframes. |
| + Vector<RefPtr<LocalFrame> > childFrames; |
| + for (Frame* child = m_frame.tree().firstChild(); child; child = child->tree().nextSibling()) { |
| + if (child->isLocalFrame()) |
| + childFrames.append(toLocalFrame(child)); |
| + } |
| + |
| + for (size_t i = 0; i < childFrames.size(); ++i) |
| + ScreenOrientationController::from(*childFrames[i]).notifyOrientationChanged(); |
| +} |
| + |
| +OrientationInformation* ScreenOrientationController::orientation() |
| +{ |
| + if (!m_orientation->initialized()) |
| + updateOrientation(); |
| + |
| + return m_orientation.get(); |
| } |
| void ScreenOrientationController::lockOrientation(blink::WebScreenOrientationLockType orientation, blink::WebLockOrientationCallback* callback) |
| @@ -132,4 +162,10 @@ void ScreenOrientationController::unlockOrientation() |
| m_client->unlockOrientation(); |
| } |
| +void ScreenOrientationController::trace(Visitor* visitor) |
| +{ |
| + WillBeHeapSupplement<LocalFrame>::trace(visitor); |
| + visitor->trace(m_orientation); |
| +} |
| + |
| } // namespace WebCore |