Chromium Code Reviews| Index: Source/modules/screen_orientation/ScreenOrientation.cpp |
| diff --git a/Source/modules/screen_orientation/ScreenOrientation.cpp b/Source/modules/screen_orientation/ScreenOrientation.cpp |
| index 4b147dd809a0f4ee807ee0cd9fb9fe5145c8ce0e..a1f653741bded7ccbb73cce37d345a7f0b2fbce5 100644 |
| --- a/Source/modules/screen_orientation/ScreenOrientation.cpp |
| +++ b/Source/modules/screen_orientation/ScreenOrientation.cpp |
| @@ -5,15 +5,19 @@ |
| #include "config.h" |
| #include "modules/screen_orientation/ScreenOrientation.h" |
| +#include "core/events/Event.h" |
| #include "core/frame/DOMWindow.h" |
| #include "core/frame/Frame.h" |
| #include "core/frame/Screen.h" |
| +#include "modules/screen_orientation/ScreenOrientationController.h" |
| namespace WebCore { |
| ScreenOrientation::ScreenOrientation(Screen* screen) |
| : DOMWindowProperty(screen->frame()) |
| { |
| + if (ScreenOrientationController* controller = ScreenOrientationController::from(page())) |
| + controller->addObserver(this); |
|
abarth-chromium
2014/02/18 01:34:27
Under what circumstances can |controller| be zero.
Inactive
2014/02/18 20:52:47
Done. No longer needed now that the controller is
|
| } |
| const char* ScreenOrientation::supplementName() |
| @@ -34,6 +38,8 @@ ScreenOrientation* ScreenOrientation::from(Screen* screen) |
| ScreenOrientation::~ScreenOrientation() |
| { |
| + if (ScreenOrientationController* controller = ScreenOrientationController::from(page())) |
|
Inactive
2014/02/17 18:23:13
I looked at the Geolocation module and it subclass
|
| + controller->removeObserver(this); |
|
abarth-chromium
2014/02/18 01:34:27
I believe the correct thing to do is to override w
|
| } |
| Screen* ScreenOrientation::screen() const |
| @@ -45,11 +51,56 @@ Screen* ScreenOrientation::screen() const |
| return window->screen(); |
|
abarth-chromium
2014/02/18 01:34:27
Why not just:
return m_associatedDOMWindow->scree
Inactive
2014/02/18 20:52:47
This function is no longer needed now that the con
|
| } |
| -const AtomicString& ScreenOrientation::orientation(Screen* screen) |
| +struct ScreenOrientationInfo { |
| + const AtomicString& name; |
| + ScreenOrientationValues orientation; |
| +}; |
| + |
| +static ScreenOrientationInfo* allowedOrientationsMap(unsigned& length) |
|
abarth-chromium
2014/02/18 01:34:27
Please put free static functions at the top of the
Inactive
2014/02/18 20:52:47
Done.
|
| { |
| - // FIXME: Implement. |
| + DEFINE_STATIC_LOCAL(const AtomicString, portrait, ("portrait", AtomicString::ConstructFromLiteral)); |
| DEFINE_STATIC_LOCAL(const AtomicString, portraitPrimary, ("portrait-primary", AtomicString::ConstructFromLiteral)); |
| - return portraitPrimary; |
| + DEFINE_STATIC_LOCAL(const AtomicString, portraitSecondary, ("portrait-secondary", AtomicString::ConstructFromLiteral)); |
| + DEFINE_STATIC_LOCAL(const AtomicString, landscape, ("landscape", AtomicString::ConstructFromLiteral)); |
| + DEFINE_STATIC_LOCAL(const AtomicString, landscapePrimary, ("landscape-primary", AtomicString::ConstructFromLiteral)); |
| + DEFINE_STATIC_LOCAL(const AtomicString, landscapeSecondary, ("landscape-secondary", AtomicString::ConstructFromLiteral)); |
| + |
| + static ScreenOrientationInfo orientationMap[] = { |
| + { portrait, OrientationPortrait }, |
| + { portraitPrimary, OrientationPortraitPrimary }, |
| + { portraitSecondary, OrientationPortraitSecondary }, |
| + { landscape, OrientationLandscape }, |
| + { landscapePrimary, OrientationLandscapePrimary }, |
| + { landscapeSecondary, OrientationLandscapeSecondary } |
| + }; |
| + length = WTF_ARRAY_LENGTH(orientationMap); |
| + return orientationMap; |
| +} |
| + |
| +const AtomicString& ScreenOrientation::orientationToString(ScreenOrientationValue orientation) |
| +{ |
| + unsigned length = 0; |
| + ScreenOrientationInfo* orientationMap = allowedOrientationsMap(length); |
| + for (unsigned i = 0; i < length; ++i) { |
| + if (orientationMap[i].orientation == orientation) |
| + return orientationMap[i].name; |
| + } |
| + // We do no handle OrientationInvalid and OrientationAny but this is fine be cause screen.orientation |
| + // should never return these and WebScreenOrientation does not define those values. |
| + ASSERT_NOT_REACHED(); |
| + return nullAtom; |
| +} |
| + |
| +const AtomicString& ScreenOrientation::orientation(Screen* screen) |
| +{ |
| + ScreenOrientation* screenOrientation = ScreenOrientation::from(screen); |
| + ASSERT(screenOrientation); |
| + |
| + ScreenOrientationController* controller = ScreenOrientationController::from(screenOrientation->page()); |
| + if (!controller) |
| + return orientationToString(OrientationPortraitPrimary); |
| + |
| + return orientationToString(controller->orientation()); |
| } |
| bool ScreenOrientation::lockOrientation(Screen* screen, const Vector<String>& orientations) |
| @@ -69,4 +120,17 @@ void ScreenOrientation::unlockOrientation(Screen* screen) |
| // FIXME: Implement. |
| } |
| +void ScreenOrientation::orientationChanged() |
| +{ |
| + ASSERT(screen()); |
| + screen()->dispatchEvent(Event::create(EventTypeNames::orientationchange)); |
| +} |
| + |
| +Page* ScreenOrientation::page() const |
| +{ |
| + Frame* frame = this->frame(); |
| + ASSERT(frame); |
| + return frame->page(); |
| +} |
| + |
| } // namespace WebCore |