Changeset 122626 in webkit


Ignore:
Timestamp:
Jul 13, 2012 1:37:50 PM (12 years ago)
Author:
scheib@chromium.org
Message:

Pointer Lock handles disconnected DOM elements
https://bugs.webkit.org/show_bug.cgi?id=77029

Reviewed by Adrienne Walker.

Source/WebCore:

Pointer Lock Controller now checks when elements or documents are
removed, and unlocks if the target element is being removed.

Tests: pointer-lock/locked-element-iframe-removed-from-dom.html

pointer-lock/locked-element-removed-from-dom.html

  • dom/Document.cpp:

(WebCore::Document::detach):

  • dom/Element.cpp:

(WebCore::Element::removedFrom):
(WebCore::Element::webkitRequestPointerLock):

  • page/PointerLockController.cpp:

(WebCore::PointerLockController::requestPointerLock):
(WebCore::PointerLockController::elementRemoved):
(WebCore):
(WebCore::PointerLockController::documentDetached):
(WebCore::PointerLockController::didLosePointerLock):
(WebCore::PointerLockController::enqueueEvent):

  • page/PointerLockController.h:

(WebCore):
(PointerLockController):

LayoutTests:

Two new tests that verify pointer lock is released when the target
is removed from the document.

  • pointer-lock/locked-element-iframe-removed-from-dom-expected.txt: Added.
  • pointer-lock/locked-element-iframe-removed-from-dom.html: Added.
  • pointer-lock/locked-element-removed-from-dom-expected.txt: Added.
  • pointer-lock/locked-element-removed-from-dom.html: Added.
Location:
trunk
Files:
4 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r122625 r122626  
     12012-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
    1162012-07-13  W. James MacLean  <wjmaclean@chromium.org>
    217
  • trunk/Source/WebCore/ChangeLog

    r122621 r122626  
     12012-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
    1302012-07-13  Ryosuke Niwa  <rniwa@webkit.org>
    231
  • trunk/Source/WebCore/dom/Document.cpp

    r122621 r122626  
    20812081    ASSERT(!m_inPageCache);
    20822082
     2083#if ENABLE(POINTER_LOCK)
     2084    if (page())
     2085        page()->pointerLockController()->documentDetached(this);
     2086#endif
     2087
    20832088    if (this == topDocument())
    20842089        clearAXObjectCache();
  • trunk/Source/WebCore/dom/Element.cpp

    r122600 r122626  
    914914        setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(false);
    915915#endif
     916#if ENABLE(POINTER_LOCK)
     917    if (document()->page())
     918        document()->page()->pointerLockController()->elementRemoved(this);
     919#endif
    916920
    917921    setSavedLayerScrollOffset(IntSize());
     
    18911895void Element::webkitRequestPointerLock()
    18921896{
    1893     document()->frame()->page()->pointerLockController()->requestPointerLock(this, 0, 0);
     1897    if (document()->page())
     1898        document()->page()->pointerLockController()->requestPointerLock(this, 0, 0);
    18941899}
    18951900#endif
  • trunk/Source/WebCore/page/PointerLockController.cpp

    r122169 r122626  
    4949void PointerLockController::requestPointerLock(Element* target, PassRefPtr<VoidCallback> successCallback, PassRefPtr<VoidCallback> failureCallback)
    5050{
    51     if (!target)
    52         return;
    53 
    54     if (!target->inDocument()) {
     51    if (!target || !target->inDocument() || m_documentOfRemovedElementWhileWaitingForUnlock) {
    5552        enqueueEvent(eventNames().webkitpointerlockerrorEvent, target);
    5653        return;
    5754    }
    5855
    59     if (isLocked()) {
     56    if (m_element) {
    6057        // FIXME: Keep enqueueEvent usage. (https://bugs.webkit.org/show_bug.cgi?id=84402)
    6158        enqueueEvent(eventNames().webkitpointerlockchangeEvent, target);
     
    9087{
    9188    return m_page->chrome()->client()->requestPointerUnlock();
     89}
     90
     91void 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
     102void PointerLockController::documentDetached(Document* document)
     103{
     104    if (m_element && m_element->document() == document) {
     105        m_element = 0;
     106        requestPointerUnlock();
     107    }
    92108}
    93109
     
    137153    // FIXME: Keep enqueueEvent usage. (https://bugs.webkit.org/show_bug.cgi?id=84402)
    138154    if (sendChangeEvent)
    139         enqueueEvent(eventNames().webkitpointerlockchangeEvent, m_element.get());
     155        enqueueEvent(eventNames().webkitpointerlockchangeEvent, m_element ? m_element->document() : m_documentOfRemovedElementWhileWaitingForUnlock.get());
    140156
    141157    // FIXME: Remove callback usage. (https://bugs.webkit.org/show_bug.cgi?id=84402)
    142158    RefPtr<Element> elementToNotify(m_element);
    143159    m_element = 0;
     160    m_documentOfRemovedElementWhileWaitingForUnlock = 0;
    144161    m_successCallback = 0;
    145162    m_failureCallback = 0;
     
    162179void PointerLockController::enqueueEvent(const AtomicString& type, Element* element)
    163180{
    164     if (!element)
    165         return;
    166     element->document()->enqueueDocumentEvent(Event::create(type, true, false));
     181    if (element)
     182        enqueueEvent(type, element->document());
     183}
     184
     185void PointerLockController::enqueueEvent(const AtomicString& type, Document* document)
     186{
     187    if (document)
     188        document->enqueueDocumentEvent(Event::create(type, true, false));
    167189}
    168190
  • trunk/Source/WebCore/page/PointerLockController.h

    r120248 r122626  
    3434
    3535class Element;
     36class Document;
    3637class Page;
    3738class PlatformMouseEvent;
     
    4647    void requestPointerLock(Element* target, PassRefPtr<VoidCallback> successCallback, PassRefPtr<VoidCallback> failureCallback);
    4748    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)
    4952    Element* element() const;
    5053
     
    5760    explicit PointerLockController(Page*);
    5861    void enqueueEvent(const AtomicString& type, Element*);
     62    void enqueueEvent(const AtomicString& type, Document*);
    5963    Page* m_page;
    6064    RefPtr<Element> m_element;
     65    RefPtr<Document> m_documentOfRemovedElementWhileWaitingForUnlock;
    6166
    6267    // FIXME: Remove callback usage. (https://bugs.webkit.org/show_bug.cgi?id=84402)
Note: See TracChangeset for help on using the changeset viewer.