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

Unified Diff: Source/modules/screen_orientation/ScreenOrientationController.cpp

Issue 277413002: Make screen.orientation implementation use WebScreenInfo::orientationType (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Add FIXME comment Created 6 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: Source/modules/screen_orientation/ScreenOrientationController.cpp
diff --git a/Source/modules/screen_orientation/ScreenOrientationController.cpp b/Source/modules/screen_orientation/ScreenOrientationController.cpp
index 86066d5bf105db2b270a47f0552161984baeb544..e3d75596605f1c4ad16a60b6c633c0f784ba0b7f 100644
--- a/Source/modules/screen_orientation/ScreenOrientationController.cpp
+++ b/Source/modules/screen_orientation/ScreenOrientationController.cpp
@@ -8,18 +8,17 @@
#include "core/dom/Document.h"
#include "core/events/Event.h"
#include "core/frame/DOMWindow.h"
+#include "core/frame/FrameView.h"
+#include "core/frame/LocalFrame.h"
#include "core/frame/Screen.h"
-#include "modules/screen_orientation/ScreenOrientationDispatcher.h"
+#include "platform/LayoutTestSupport.h"
+#include "platform/PlatformScreen.h"
namespace WebCore {
-#if !ENABLE(OILPAN)
ScreenOrientationController::~ScreenOrientationController()
{
- // With oilpan, weak processing removes the controller once it is dead.
- ScreenOrientationDispatcher::instance().removeController(this);
}
-#endif
ScreenOrientationController& ScreenOrientationController::from(Document& document)
{
@@ -33,18 +32,7 @@ ScreenOrientationController& ScreenOrientationController::from(Document& documen
ScreenOrientationController::ScreenOrientationController(Document& document)
: m_document(document)
- , m_orientation(blink::WebScreenOrientationPortraitPrimary)
{
- // FIXME: We should listen for screen orientation change events only when the page is visible.
- ScreenOrientationDispatcher::instance().addController(this);
-}
-
-void ScreenOrientationController::dispatchOrientationChangeEvent()
-{
- if (m_document.domWindow()
- && !m_document.activeDOMObjectsAreSuspended()
- && !m_document.activeDOMObjectsAreStopped())
- m_document.domWindow()->dispatchEvent(Event::create(EventTypeNames::orientationchange));
}
const char* ScreenOrientationController::supplementName()
@@ -52,13 +40,45 @@ const char* ScreenOrientationController::supplementName()
return "ScreenOrientationController";
}
-void ScreenOrientationController::didChangeScreenOrientation(blink::WebScreenOrientationType orientation)
+// Compute the screen orientation using the orientation angle and the screen width / height.
+blink::WebScreenOrientationType ScreenOrientationController::computeOrientation(FrameView* view)
{
- if (orientation == m_orientation)
- return;
+ // Bypass orientation detection in layout tests to get consistent results.
+ // FIXME: The screen dimension should be fixed when running the layout tests to avoid such
+ // issues.
+ if (isRunningLayoutTest())
+ return blink::WebScreenOrientationPortraitPrimary;
+
+ FloatRect rect = screenRect(view);
+ uint16_t rotation = screenOrientationAngle(view);
+ bool isTallDisplay = rotation % 180 ? rect.height() < rect.width() : rect.height() > rect.width();
+ switch (rotation) {
+ case 0:
+ return isTallDisplay ? blink::WebScreenOrientationPortraitPrimary : blink::WebScreenOrientationLandscapePrimary;
+ case 90:
+ return isTallDisplay ? blink::WebScreenOrientationLandscapePrimary : blink::WebScreenOrientationPortraitSecondary;
+ case 180:
+ return isTallDisplay ? blink::WebScreenOrientationPortraitSecondary : blink::WebScreenOrientationLandscapeSecondary;
+ case 270:
+ return isTallDisplay ? blink::WebScreenOrientationLandscapeSecondary : blink::WebScreenOrientationPortraitPrimary;
+ default:
+ ASSERT_NOT_REACHED();
+ return blink::WebScreenOrientationPortraitPrimary;
+ }
+}
- m_orientation = orientation;
- dispatchOrientationChangeEvent();
+blink::WebScreenOrientationType ScreenOrientationController::orientation() const
+{
+ LocalFrame* mainFrame = m_document.frame();
+ if (!mainFrame)
+ return blink::WebScreenOrientationPortraitPrimary;
+ blink::WebScreenOrientationType orientationType = screenOrientationType(mainFrame->view());
+ if (orientationType == blink::WebScreenOrientationUndefined) {
+ // The embedder could not provide us with an orientation, deduce it ourselves.
+ orientationType = computeOrientation(mainFrame->view());
+ }
+ ASSERT(orientationType != blink::WebScreenOrientationUndefined);
+ return orientationType;
}
} // namespace WebCore

Powered by Google App Engine
This is Rietveld 408576698