Changeset 122626 in webkit
- Timestamp:
- Jul 13, 2012 1:37:50 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r122625 r122626 1 2012-07-13 Vincent Scheib <scheib@chromium.org> 2 3 Pointer Lock handles disconnected DOM elements 4 https://bugs.webkit.org/show_bug.cgi?id=77029 5 6 Reviewed by Adrienne Walker. 7 8 Two new tests that verify pointer lock is released when the target 9 is removed from the document. 10 11 * pointer-lock/locked-element-iframe-removed-from-dom-expected.txt: Added. 12 * pointer-lock/locked-element-iframe-removed-from-dom.html: Added. 13 * pointer-lock/locked-element-removed-from-dom-expected.txt: Added. 14 * pointer-lock/locked-element-removed-from-dom.html: Added. 15 1 16 2012-07-13 W. James MacLean <wjmaclean@chromium.org> 2 17 -
trunk/Source/WebCore/ChangeLog
r122621 r122626 1 2012-07-13 Vincent Scheib <scheib@chromium.org> 2 3 Pointer Lock handles disconnected DOM elements 4 https://bugs.webkit.org/show_bug.cgi?id=77029 5 6 Reviewed by Adrienne Walker. 7 8 Pointer Lock Controller now checks when elements or documents are 9 removed, and unlocks if the target element is being removed. 10 11 Tests: pointer-lock/locked-element-iframe-removed-from-dom.html 12 pointer-lock/locked-element-removed-from-dom.html 13 14 * dom/Document.cpp: 15 (WebCore::Document::detach): 16 * dom/Element.cpp: 17 (WebCore::Element::removedFrom): 18 (WebCore::Element::webkitRequestPointerLock): 19 * page/PointerLockController.cpp: 20 (WebCore::PointerLockController::requestPointerLock): 21 (WebCore::PointerLockController::elementRemoved): 22 (WebCore): 23 (WebCore::PointerLockController::documentDetached): 24 (WebCore::PointerLockController::didLosePointerLock): 25 (WebCore::PointerLockController::enqueueEvent): 26 * page/PointerLockController.h: 27 (WebCore): 28 (PointerLockController): 29 1 30 2012-07-13 Ryosuke Niwa <rniwa@webkit.org> 2 31 -
trunk/Source/WebCore/dom/Document.cpp
r122621 r122626 2081 2081 ASSERT(!m_inPageCache); 2082 2082 2083 #if ENABLE(POINTER_LOCK) 2084 if (page()) 2085 page()->pointerLockController()->documentDetached(this); 2086 #endif 2087 2083 2088 if (this == topDocument()) 2084 2089 clearAXObjectCache(); -
trunk/Source/WebCore/dom/Element.cpp
r122600 r122626 914 914 setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(false); 915 915 #endif 916 #if ENABLE(POINTER_LOCK) 917 if (document()->page()) 918 document()->page()->pointerLockController()->elementRemoved(this); 919 #endif 916 920 917 921 setSavedLayerScrollOffset(IntSize()); … … 1891 1895 void Element::webkitRequestPointerLock() 1892 1896 { 1893 document()->frame()->page()->pointerLockController()->requestPointerLock(this, 0, 0); 1897 if (document()->page()) 1898 document()->page()->pointerLockController()->requestPointerLock(this, 0, 0); 1894 1899 } 1895 1900 #endif -
trunk/Source/WebCore/page/PointerLockController.cpp
r122169 r122626 49 49 void PointerLockController::requestPointerLock(Element* target, PassRefPtr<VoidCallback> successCallback, PassRefPtr<VoidCallback> failureCallback) 50 50 { 51 if (!target) 52 return; 53 54 if (!target->inDocument()) { 51 if (!target || !target->inDocument() || m_documentOfRemovedElementWhileWaitingForUnlock) { 55 52 enqueueEvent(eventNames().webkitpointerlockerrorEvent, target); 56 53 return; 57 54 } 58 55 59 if ( isLocked()) {56 if (m_element) { 60 57 // FIXME: Keep enqueueEvent usage. (https://bugs.webkit.org/show_bug.cgi?id=84402) 61 58 enqueueEvent(eventNames().webkitpointerlockchangeEvent, target); … … 90 87 { 91 88 return m_page->chrome()->client()->requestPointerUnlock(); 89 } 90 91 void PointerLockController::elementRemoved(Element* element) 92 { 93 if (m_element == element) { 94 m_documentOfRemovedElementWhileWaitingForUnlock = m_element->document(); 95 // Set element null immediately to block any future interaction with it 96 // including mouse events received before the unlock completes. 97 m_element = 0; 98 requestPointerUnlock(); 99 } 100 } 101 102 void PointerLockController::documentDetached(Document* document) 103 { 104 if (m_element && m_element->document() == document) { 105 m_element = 0; 106 requestPointerUnlock(); 107 } 92 108 } 93 109 … … 137 153 // FIXME: Keep enqueueEvent usage. (https://bugs.webkit.org/show_bug.cgi?id=84402) 138 154 if (sendChangeEvent) 139 enqueueEvent(eventNames().webkitpointerlockchangeEvent, m_element .get());155 enqueueEvent(eventNames().webkitpointerlockchangeEvent, m_element ? m_element->document() : m_documentOfRemovedElementWhileWaitingForUnlock.get()); 140 156 141 157 // FIXME: Remove callback usage. (https://bugs.webkit.org/show_bug.cgi?id=84402) 142 158 RefPtr<Element> elementToNotify(m_element); 143 159 m_element = 0; 160 m_documentOfRemovedElementWhileWaitingForUnlock = 0; 144 161 m_successCallback = 0; 145 162 m_failureCallback = 0; … … 162 179 void PointerLockController::enqueueEvent(const AtomicString& type, Element* element) 163 180 { 164 if (!element) 165 return; 166 element->document()->enqueueDocumentEvent(Event::create(type, true, false)); 181 if (element) 182 enqueueEvent(type, element->document()); 183 } 184 185 void PointerLockController::enqueueEvent(const AtomicString& type, Document* document) 186 { 187 if (document) 188 document->enqueueDocumentEvent(Event::create(type, true, false)); 167 189 } 168 190 -
trunk/Source/WebCore/page/PointerLockController.h
r120248 r122626 34 34 35 35 class Element; 36 class Document; 36 37 class Page; 37 38 class PlatformMouseEvent; … … 46 47 void requestPointerLock(Element* target, PassRefPtr<VoidCallback> successCallback, PassRefPtr<VoidCallback> failureCallback); 47 48 void requestPointerUnlock(); 48 bool isLocked(); 49 void elementRemoved(Element*); 50 void documentDetached(Document*); 51 bool isLocked(); // FIXME: Rename to isClientLocked and move to private when removing old API. (https://bugs.webkit.org/show_bug.cgi?id=84402) 49 52 Element* element() const; 50 53 … … 57 60 explicit PointerLockController(Page*); 58 61 void enqueueEvent(const AtomicString& type, Element*); 62 void enqueueEvent(const AtomicString& type, Document*); 59 63 Page* m_page; 60 64 RefPtr<Element> m_element; 65 RefPtr<Document> m_documentOfRemovedElementWhileWaitingForUnlock; 61 66 62 67 // FIXME: Remove callback usage. (https://bugs.webkit.org/show_bug.cgi?id=84402)
Note: See TracChangeset
for help on using the changeset viewer.