summaryrefslogtreecommitdiff
path: root/Source/WebCore/page/PointerLockController.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-07-16 14:51:15 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-07-16 14:51:15 +0200
commit4e6b3a206fa4ad8bb0b664f7674c9a70376d6e26 (patch)
tree7bb9ad7e31c24d1cf1707e03e6f1a80f6d033951 /Source/WebCore/page/PointerLockController.cpp
parent3977e3d2f72f7fe2c887c1ec0e0c342e1d169f42 (diff)
downloadqtwebkit-4e6b3a206fa4ad8bb0b664f7674c9a70376d6e26.tar.gz
Imported WebKit commit 953baa67aa07087b6ecd4199351ec554c724e27d (http://svn.webkit.org/repository/webkit/trunk@122676)
Diffstat (limited to 'Source/WebCore/page/PointerLockController.cpp')
-rw-r--r--Source/WebCore/page/PointerLockController.cpp40
1 files changed, 31 insertions, 9 deletions
diff --git a/Source/WebCore/page/PointerLockController.cpp b/Source/WebCore/page/PointerLockController.cpp
index c250cb7be..abbfc80f4 100644
--- a/Source/WebCore/page/PointerLockController.cpp
+++ b/Source/WebCore/page/PointerLockController.cpp
@@ -48,15 +48,12 @@ PassOwnPtr<PointerLockController> PointerLockController::create(Page* page)
void PointerLockController::requestPointerLock(Element* target, PassRefPtr<VoidCallback> successCallback, PassRefPtr<VoidCallback> failureCallback)
{
- if (!target)
- return;
-
- if (!target->inDocument()) {
+ if (!target || !target->inDocument() || m_documentOfRemovedElementWhileWaitingForUnlock) {
enqueueEvent(eventNames().webkitpointerlockerrorEvent, target);
return;
}
- if (isLocked()) {
+ if (m_element) {
// FIXME: Keep enqueueEvent usage. (https://bugs.webkit.org/show_bug.cgi?id=84402)
enqueueEvent(eventNames().webkitpointerlockchangeEvent, target);
if (m_element->document() != target->document())
@@ -91,6 +88,25 @@ void PointerLockController::requestPointerUnlock()
return m_page->chrome()->client()->requestPointerUnlock();
}
+void PointerLockController::elementRemoved(Element* element)
+{
+ if (m_element == element) {
+ m_documentOfRemovedElementWhileWaitingForUnlock = m_element->document();
+ // Set element null immediately to block any future interaction with it
+ // including mouse events received before the unlock completes.
+ m_element = 0;
+ requestPointerUnlock();
+ }
+}
+
+void PointerLockController::documentDetached(Document* document)
+{
+ if (m_element && m_element->document() == document) {
+ m_element = 0;
+ requestPointerUnlock();
+ }
+}
+
bool PointerLockController::isLocked()
{
return m_page->chrome()->client()->isPointerLocked();
@@ -136,11 +152,12 @@ void PointerLockController::didLosePointerLock(bool sendChangeEvent)
{
// FIXME: Keep enqueueEvent usage. (https://bugs.webkit.org/show_bug.cgi?id=84402)
if (sendChangeEvent)
- enqueueEvent(eventNames().webkitpointerlockchangeEvent, m_element.get());
+ enqueueEvent(eventNames().webkitpointerlockchangeEvent, m_element ? m_element->document() : m_documentOfRemovedElementWhileWaitingForUnlock.get());
// FIXME: Remove callback usage. (https://bugs.webkit.org/show_bug.cgi?id=84402)
RefPtr<Element> elementToNotify(m_element);
m_element = 0;
+ m_documentOfRemovedElementWhileWaitingForUnlock = 0;
m_successCallback = 0;
m_failureCallback = 0;
if (elementToNotify && elementToNotify->document()->frame())
@@ -161,9 +178,14 @@ void PointerLockController::dispatchLockedMouseEvent(const PlatformMouseEvent& e
void PointerLockController::enqueueEvent(const AtomicString& type, Element* element)
{
- if (!element)
- return;
- element->document()->enqueueDocumentEvent(Event::create(type, true, false));
+ if (element)
+ enqueueEvent(type, element->document());
+}
+
+void PointerLockController::enqueueEvent(const AtomicString& type, Document* document)
+{
+ if (document)
+ document->enqueueDocumentEvent(Event::create(type, true, false));
}
} // namespace WebCore