109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// found in the LICENSE file. 409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "config.h" 609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "modules/screen_orientation/ScreenOrientation.h" 709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 8197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptPromise.h" 9197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptPromiseResolver.h" 10d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/dom/DOMException.h" 11d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/dom/Document.h" 12d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/dom/ExceptionCode.h" 13d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 14197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "modules/EventTargetModules.h" 15d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "modules/screen_orientation/LockOrientationCallback.h" 16d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "modules/screen_orientation/ScreenOrientationController.h" 176f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include "public/platform/WebScreenOrientationType.h" 1809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 196f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch// This code assumes that WebScreenOrientationType values are included in WebScreenOrientationLockType. 206f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#define COMPILE_ASSERT_MATCHING_ENUM(enum1, enum2) \ 216f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch COMPILE_ASSERT(static_cast<unsigned>(blink::enum1) == static_cast<unsigned>(blink::enum2), mismatching_types) 226f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochCOMPILE_ASSERT_MATCHING_ENUM(WebScreenOrientationPortraitPrimary, WebScreenOrientationLockPortraitPrimary); 236f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochCOMPILE_ASSERT_MATCHING_ENUM(WebScreenOrientationPortraitSecondary, WebScreenOrientationLockPortraitSecondary); 246f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochCOMPILE_ASSERT_MATCHING_ENUM(WebScreenOrientationLandscapePrimary, WebScreenOrientationLockLandscapePrimary); 256f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochCOMPILE_ASSERT_MATCHING_ENUM(WebScreenOrientationLandscapeSecondary, WebScreenOrientationLockLandscapeSecondary); 2609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 27c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 28d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 29d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)struct ScreenOrientationInfo { 30d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const AtomicString& name; 316f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch unsigned orientation; 32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}; 33d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static ScreenOrientationInfo* orientationsMap(unsigned& length) 3509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) DEFINE_STATIC_LOCAL(const AtomicString, portraitPrimary, ("portrait-primary", AtomicString::ConstructFromLiteral)); 37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) DEFINE_STATIC_LOCAL(const AtomicString, portraitSecondary, ("portrait-secondary", AtomicString::ConstructFromLiteral)); 38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) DEFINE_STATIC_LOCAL(const AtomicString, landscapePrimary, ("landscape-primary", AtomicString::ConstructFromLiteral)); 39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) DEFINE_STATIC_LOCAL(const AtomicString, landscapeSecondary, ("landscape-secondary", AtomicString::ConstructFromLiteral)); 406f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch DEFINE_STATIC_LOCAL(const AtomicString, any, ("any", AtomicString::ConstructFromLiteral)); 416f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch DEFINE_STATIC_LOCAL(const AtomicString, portrait, ("portrait", AtomicString::ConstructFromLiteral)); 426f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch DEFINE_STATIC_LOCAL(const AtomicString, landscape, ("landscape", AtomicString::ConstructFromLiteral)); 43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch DEFINE_STATIC_LOCAL(const AtomicString, natural, ("natural", AtomicString::ConstructFromLiteral)); 44d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) static ScreenOrientationInfo orientationMap[] = { 46e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) { portraitPrimary, WebScreenOrientationLockPortraitPrimary }, 47e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) { portraitSecondary, WebScreenOrientationLockPortraitSecondary }, 48e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) { landscapePrimary, WebScreenOrientationLockLandscapePrimary }, 49e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) { landscapeSecondary, WebScreenOrientationLockLandscapeSecondary }, 50e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) { any, WebScreenOrientationLockAny }, 51e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) { portrait, WebScreenOrientationLockPortrait }, 52e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) { landscape, WebScreenOrientationLockLandscape }, 53e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) { natural, WebScreenOrientationLockNatural } 54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) }; 55d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) length = WTF_ARRAY_LENGTH(orientationMap); 566f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return orientationMap; 5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 60e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)const AtomicString& ScreenOrientation::orientationTypeToString(WebScreenOrientationType orientation) 6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) unsigned length = 0; 63d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ScreenOrientationInfo* orientationMap = orientationsMap(length); 64d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) for (unsigned i = 0; i < length; ++i) { 656f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch if (static_cast<unsigned>(orientation) == orientationMap[i].orientation) 66d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return orientationMap[i].name; 67d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 686f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 69d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT_NOT_REACHED(); 70d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullAtom; 7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 73e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)static WebScreenOrientationLockType stringToOrientationLock(const AtomicString& orientationLockString) 7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 75d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) unsigned length = 0; 76d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ScreenOrientationInfo* orientationMap = orientationsMap(length); 77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) for (unsigned i = 0; i < length; ++i) { 786f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch if (orientationMap[i].name == orientationLockString) 79e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return static_cast<WebScreenOrientationLockType>(orientationMap[i].orientation); 8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 816f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 826f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch ASSERT_NOT_REACHED(); 83e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return WebScreenOrientationLockDefault; 8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 86197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// static 87197021e6b966cfb06891637935ef33fff06433d1Ben MurdochScreenOrientation* ScreenOrientation::create(LocalFrame* frame) 8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 89197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ASSERT(frame); 90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ScreenOrientation* orientation = adoptRefCountedGarbageCollectedWillBeNoop(new ScreenOrientation(frame)); 92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ASSERT(orientation->controller()); 93197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // FIXME: ideally, we would like to provide the ScreenOrientationController 94197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // the case where it is not defined but for the moment, it is eagerly 95197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // created when the LocalFrame is created so we shouldn't be in that 967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // situation. 97197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // In order to create the ScreenOrientationController lazily, we would need 98197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // to be able to access WebFrameClient from modules/. 99197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch orientation->controller()->setOrientation(orientation); 101197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return orientation; 10209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 10309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 104197021e6b966cfb06891637935ef33fff06433d1Ben MurdochScreenOrientation::ScreenOrientation(LocalFrame* frame) 105197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch : DOMWindowProperty(frame) 106e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) , m_type(WebScreenOrientationUndefined) 107197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch , m_angle(0) 108d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 109d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 110d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 111197021e6b966cfb06891637935ef33fff06433d1Ben MurdochScreenOrientation::~ScreenOrientation() 112197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 113197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 114197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 115197021e6b966cfb06891637935ef33fff06433d1Ben Murdochconst WTF::AtomicString& ScreenOrientation::interfaceName() const 116d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 117197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return EventTargetNames::ScreenOrientation; 118197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 119197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 120197021e6b966cfb06891637935ef33fff06433d1Ben MurdochExecutionContext* ScreenOrientation::executionContext() const 121197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 122197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!m_frame) 123d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return 0; 124197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return m_frame->document(); 125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 126d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 127197021e6b966cfb06891637935ef33fff06433d1Ben MurdochString ScreenOrientation::type() const 128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 129197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return orientationTypeToString(m_type); 130d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 132197021e6b966cfb06891637935ef33fff06433d1Ben Murdochunsigned short ScreenOrientation::angle() const 13309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 134197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return m_angle; 13509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 13609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 137e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void ScreenOrientation::setType(WebScreenOrientationType type) 13809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 139197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_type = type; 14009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 14109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 142197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid ScreenOrientation::setAngle(unsigned short angle) 14309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 144197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_angle = angle; 145197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 146197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 147197021e6b966cfb06891637935ef33fff06433d1Ben MurdochScriptPromise ScreenOrientation::lock(ScriptState* state, const AtomicString& lockString) 148197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 149197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(state); 150d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ScriptPromise promise = resolver->promise(); 151d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 152197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Document* document = m_frame ? m_frame->document() : 0; 153d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 154197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!document || !controller()) { 155d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RefPtrWillBeRawPtr<DOMException> exception = DOMException::create(InvalidStateError, "The object is no longer associated to a document."); 156d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) resolver->reject(exception); 157d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return promise; 158d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 159d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 160d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (document->isSandboxed(SandboxOrientationLock)) { 161d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RefPtrWillBeRawPtr<DOMException> exception = DOMException::create(SecurityError, "The document is sandboxed and lacks the 'allow-orientation-lock' flag."); 162d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) resolver->reject(exception); 163d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return promise; 164d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 165d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 166197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch controller()->lock(stringToOrientationLock(lockString), new LockOrientationCallback(resolver)); 167d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return promise; 16809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 16909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 170197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid ScreenOrientation::unlock() 17109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 172197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!controller()) 173f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return; 174f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 175197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch controller()->unlock(); 176197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 177197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 178197021e6b966cfb06891637935ef33fff06433d1Ben MurdochScreenOrientationController* ScreenOrientation::controller() 179197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 180197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!m_frame) 181197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return 0; 182197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 183197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return ScreenOrientationController::from(*m_frame); 184197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 185197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 186197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid ScreenOrientation::trace(Visitor* visitor) 187197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 188197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch EventTargetWithInlineData::trace(visitor); 1897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DOMWindowProperty::trace(visitor); 19009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 19109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 192c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 193