Changeset 127606 in webkit


Ignore:
Timestamp:
Sep 5, 2012 10:31:32 AM (12 years ago)
Author:
scheib@chromium.org
Message:

webkitPointerLockElement returns null when pointer lock request is pending.
https://bugs.webkit.org/show_bug.cgi?id=91186

Reviewed by Dimitri Glazkov.

Source/WebCore:

Script should wait for a pointerlockchange event before detecting
if it has acquired lock. However, if a script attempted to poll
pointerLockElement it could be confused when lock was still pending.
This change ensures that if lock is not yet acquired then
pointerLockElement will return null.

Test: pointer-lock/pointerlockelement-null-when-pending.html

  • dom/Document.cpp:

(WebCore::Document::webkitPointerLockElement):

  • page/PointerLockController.cpp:

(WebCore::PointerLockController::requestPointerLock):
(WebCore::PointerLockController::elementRemoved):
(WebCore::PointerLockController::documentDetached):
(WebCore::PointerLockController::lockPending):
(WebCore):
(WebCore::PointerLockController::didAcquirePointerLock):
(WebCore::PointerLockController::didNotAcquirePointerLock):
(WebCore::PointerLockController::didLosePointerLock):
(WebCore::PointerLockController::clearElement):

  • page/PointerLockController.h:

(PointerLockController):

LayoutTests:

  • pointer-lock/locked-element-iframe-removed-from-dom-expected.txt:
  • pointer-lock/locked-element-iframe-removed-from-dom.html:

Updated to reflect new behavior of null returned when lock is pending.

  • pointer-lock/pointerlockelement-null-when-pending-expected.txt: Added.
  • pointer-lock/pointerlockelement-null-when-pending.html: Added.

New test specifically for testing null return when lock is pending.

Location:
trunk
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r127602 r127606  
     12012-09-05  Vincent Scheib  <scheib@chromium.org>
     2
     3        webkitPointerLockElement returns null when pointer lock request is pending.
     4        https://bugs.webkit.org/show_bug.cgi?id=91186
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        * pointer-lock/locked-element-iframe-removed-from-dom-expected.txt:
     9        * pointer-lock/locked-element-iframe-removed-from-dom.html:
     10             Updated to reflect new behavior of null returned when lock is pending.
     11        * pointer-lock/pointerlockelement-null-when-pending-expected.txt: Added.
     12        * pointer-lock/pointerlockelement-null-when-pending.html: Added.
     13             New test specifically for testing null return when lock is pending.
     14
    1152012-09-05  Christophe Dumez  <christophe.dumez@intel.com>
    216
  • trunk/LayoutTests/pointer-lock/locked-element-iframe-removed-from-dom-expected.txt

    r123343 r127606  
    1111     Remove iframe & immediately lock target2. (main document handler)
    1212     Remove iframe & immediately lock target2. (iframe handler)
    13 PASS document.webkitPointerLockElement is targetDiv2
     13PASS document.webkitPointerLockElement is null
    1414PASS onwebkitpointerlockchange received after: Remove iframe & immediately lock target2. (main document handler)
    1515PASS successfullyParsed is true
  • trunk/LayoutTests/pointer-lock/locked-element-iframe-removed-from-dom.html

    r123343 r127606  
    3939            targetIframe1.parentElement.removeChild(targetIframe1);
    4040            targetDiv2.webkitRequestPointerLock();
    41             shouldBe("document.webkitPointerLockElement", "targetDiv2");
     41            shouldBe("document.webkitPointerLockElement", "null");
    4242            // doNextStep called by event handler.
    4343        },
  • trunk/Source/WebCore/ChangeLog

    r127605 r127606  
     12012-09-05  Vincent Scheib  <scheib@chromium.org>
     2
     3        webkitPointerLockElement returns null when pointer lock request is pending.
     4        https://bugs.webkit.org/show_bug.cgi?id=91186
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        Script should wait for a pointerlockchange event before detecting
     9        if it has acquired lock. However, if a script attempted to poll
     10        pointerLockElement it could be confused when lock was still pending.
     11        This change ensures that if lock is not yet acquired then
     12        pointerLockElement will return null.
     13
     14        Test: pointer-lock/pointerlockelement-null-when-pending.html
     15
     16        * dom/Document.cpp:
     17        (WebCore::Document::webkitPointerLockElement):
     18        * page/PointerLockController.cpp:
     19        (WebCore::PointerLockController::requestPointerLock):
     20        (WebCore::PointerLockController::elementRemoved):
     21        (WebCore::PointerLockController::documentDetached):
     22        (WebCore::PointerLockController::lockPending):
     23        (WebCore):
     24        (WebCore::PointerLockController::didAcquirePointerLock):
     25        (WebCore::PointerLockController::didNotAcquirePointerLock):
     26        (WebCore::PointerLockController::didLosePointerLock):
     27        (WebCore::PointerLockController::clearElement):
     28        * page/PointerLockController.h:
     29        (PointerLockController):
     30
    1312012-09-05  Sami Kyostila  <skyostil@chromium.org>
    232
  • trunk/Source/WebCore/dom/Document.cpp

    r127593 r127606  
    58735873Element* Document::webkitPointerLockElement() const
    58745874{
    5875     if (!page())
     5875    if (!page() || page()->pointerLockController()->lockPending())
    58765876        return 0;
    58775877    if (Element* element = page()->pointerLockController()->element()) {
  • trunk/Source/WebCore/page/PointerLockController.cpp

    r124535 r127606  
    6363        m_element = target;
    6464    } else if (m_page->chrome()->client()->requestPointerLock()) {
     65        m_lockPending = true;
    6566        m_element = target;
    6667    } else {
     
    8081        // Set element null immediately to block any future interaction with it
    8182        // including mouse events received before the unlock completes.
    82         m_element = 0;
     83        clearElement();
    8384        requestPointerUnlock();
    8485    }
     
    8889{
    8990    if (m_element && m_element->document() == document) {
    90         m_element = 0;
     91        clearElement();
    9192        requestPointerUnlock();
    9293    }
     94}
     95
     96bool PointerLockController::lockPending() const
     97{
     98    return m_lockPending;
    9399}
    94100
     
    101107{
    102108    enqueueEvent(eventNames().webkitpointerlockchangeEvent, m_element.get());
     109    m_lockPending = false;
    103110}
    104111
     
    106113{
    107114    enqueueEvent(eventNames().webkitpointerlockerrorEvent, m_element.get());
    108     m_element = 0;
     115    clearElement();
    109116}
    110117
     
    112119{
    113120    enqueueEvent(eventNames().webkitpointerlockchangeEvent, m_element ? m_element->document() : m_documentOfRemovedElementWhileWaitingForUnlock.get());
    114     m_element = 0;
     121    clearElement();
    115122    m_documentOfRemovedElementWhileWaitingForUnlock = 0;
    116123}
     
    126133    if (eventType == eventNames().mouseupEvent)
    127134        m_element->dispatchMouseEvent(event, eventNames().clickEvent, event.clickCount());
     135}
     136
     137void PointerLockController::clearElement()
     138{
     139    m_lockPending = false;
     140    m_element = 0;
    128141}
    129142
  • trunk/Source/WebCore/page/PointerLockController.h

    r124535 r127606  
    4949    void elementRemoved(Element*);
    5050    void documentDetached(Document*);
     51    bool lockPending() const;
    5152    Element* element() const;
    5253
     
    5859private:
    5960    explicit PointerLockController(Page*);
     61    void clearElement();
    6062    void enqueueEvent(const AtomicString& type, Element*);
    6163    void enqueueEvent(const AtomicString& type, Document*);
    6264    Page* m_page;
     65    bool m_lockPending;
    6366    RefPtr<Element> m_element;
    6467    RefPtr<Document> m_documentOfRemovedElementWhileWaitingForUnlock;
Note: See TracChangeset for help on using the changeset viewer.