diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-07-16 14:51:15 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-07-16 14:51:15 +0200 |
commit | 4e6b3a206fa4ad8bb0b664f7674c9a70376d6e26 (patch) | |
tree | 7bb9ad7e31c24d1cf1707e03e6f1a80f6d033951 /Source/WebCore/page/PointerLockController.cpp | |
parent | 3977e3d2f72f7fe2c887c1ec0e0c342e1d169f42 (diff) | |
download | qtwebkit-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.cpp | 40 |
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 |