diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-03 09:55:33 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-03 09:55:33 +0100 |
commit | cd44dc59cdfc39534aef4d417e9f3c412e3be139 (patch) | |
tree | 8d89889ba95ed6ec9322e733846cc9cce9d7dff1 /Source/WebCore/page/PointerLockController.cpp | |
parent | d11f84f5b5cdc0d92a08af01b13472fdd5f9acb9 (diff) | |
download | qtwebkit-cd44dc59cdfc39534aef4d417e9f3c412e3be139.tar.gz |
Imported WebKit commit fce473cb4d55aa9fe9d0b0322a2fffecb731b961 (http://svn.webkit.org/repository/webkit/trunk@106560)
Diffstat (limited to 'Source/WebCore/page/PointerLockController.cpp')
-rw-r--r-- | Source/WebCore/page/PointerLockController.cpp | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/Source/WebCore/page/PointerLockController.cpp b/Source/WebCore/page/PointerLockController.cpp new file mode 100644 index 000000000..b8ad968e3 --- /dev/null +++ b/Source/WebCore/page/PointerLockController.cpp @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2012 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "PointerLockController.h" + +#include "Chrome.h" +#include "ChromeClient.h" +#include "Element.h" +#include "Page.h" +#include "PlatformMouseEvent.h" +#include "VoidCallback.h" + +#if ENABLE(POINTER_LOCK) + +namespace WebCore { + +PointerLockController::PointerLockController(Page* page) + : m_page(page) +{ +} + +PassOwnPtr<PointerLockController> PointerLockController::create(Page* page) +{ + return adoptPtr(new PointerLockController(page)); +} + +void PointerLockController::requestPointerLock(Element* target, PassRefPtr<VoidCallback> successCallback, PassRefPtr<VoidCallback> failureCallback) +{ + if (isLocked()) { + if (m_element == target) { + if (successCallback) + successCallback->handleEvent(); + } else { + didLosePointerLock(); + m_element = target; + if (successCallback) + successCallback->handleEvent(); + } + } else if (m_page->chrome()->client()->requestPointerLock()) { + m_element = target; + m_successCallback = successCallback; + m_failureCallback = failureCallback; + } else if (failureCallback) + failureCallback->handleEvent(); +} + +void PointerLockController::requestPointerUnlock() +{ + return m_page->chrome()->client()->requestPointerUnlock(); +} + +bool PointerLockController::isLocked() +{ + return m_page->chrome()->client()->isPointerLocked(); +} + +void PointerLockController::didAcquirePointerLock() +{ + RefPtr<Element> elementToNotify(m_element); + RefPtr<VoidCallback> callbackToIssue(m_successCallback); + m_successCallback = 0; + m_failureCallback = 0; + + if (callbackToIssue && elementToNotify && elementToNotify->document()->frame()) + callbackToIssue->handleEvent(); +} + +void PointerLockController::didNotAcquirePointerLock() +{ + RefPtr<Element> elementToNotify(m_element); + RefPtr<VoidCallback> callbackToIssue(m_failureCallback); + m_element = 0; + m_successCallback = 0; + m_failureCallback = 0; + + if (callbackToIssue && elementToNotify && elementToNotify->document()->frame()) + callbackToIssue->handleEvent(); +} + +void PointerLockController::didLosePointerLock() +{ + RefPtr<Element> elementToNotify(m_element); + m_element = 0; + m_successCallback = 0; + m_failureCallback = 0; + if (elementToNotify && elementToNotify->document()->frame()) + elementToNotify->dispatchEvent(Event::create(eventNames().webkitpointerlocklostEvent, true, false)); +} + +void PointerLockController::dispatchLockedMouseEvent(const PlatformMouseEvent& event, const AtomicString& eventType) +{ + if (!m_element || !m_element->document()->frame()) + return; + + m_element->dispatchMouseEvent(event, eventType, event.clickCount()); + + // Create click events + if (eventType == eventNames().mouseupEvent) + m_element->dispatchMouseEvent(event, eventNames().clickEvent, event.clickCount()); +} + +} // namespace WebCore + +#endif // ENABLE(POINTER_LOCK) |