Changeset 106134 in webkit


Ignore:
Timestamp:
Jan 27, 2012, 11:06:41 AM (13 years ago)
Author:
scheib@chromium.org
Message:

Pointer Lock: Implement pointer interface
https://bugs.webkit.org/show_bug.cgi?id=75762

Source/WebCore:

Reviewed by Julien Chaffraix.

Implement the navigator.pointer interface via a new
PointerLockController class, as per
http://dvcs.w3.org/hg/webevents/raw-file/default/mouse-lock.html.

The implementation is being made in steps, the feature is still behind
compile-time and run-time flags, 'webkit' prefixed, and not yet enabled
in any browser. (Chromium has a developer flag required.) Follow-up
work will include handling DOM elements being removed, making all
callbacks asynchronous, iframe permissions (similar to Full Screen),
etc.

PointerLockController maintains state of which Element is the current
lock target and the success and failure callbacks. ChromeClient has
methods added to expose the required state change requests.

Tests: pointer-lock/lock-already-locked.html

pointer-lock/lock-fail-responses.html
pointer-lock/mouse-event-delivery.html
pointer-lock/pointerlocklost-event.html

  • WebCore.gypi:
  • dom/EventNames.h:
  • page/ChromeClient.h:

(WebCore::ChromeClient::requestPointerLock):
(WebCore::ChromeClient::requestPointerUnlock):
(WebCore::ChromeClient::isPointerLocked):

  • page/Navigator.cpp:

(WebCore::Navigator::webkitPointer):

  • page/Page.cpp:

(WebCore::Page::Page):

  • page/Page.h:

(WebCore::Page::pointerLockController):

  • page/PointerLock.cpp:

(WebCore::PointerLock::PointerLock):
(WebCore::PointerLock::create):
(WebCore::PointerLock::lock):
(WebCore::PointerLock::unlock):
(WebCore::PointerLock::isLocked):

  • page/PointerLock.h:

(WebCore::PointerLock::create):

  • page/PointerLockController.cpp: Added.

(WebCore::PointerLockController::PointerLockController):
(WebCore::PointerLockController::requestPointerLock):
(WebCore::PointerLockController::requestPointerUnlock):
(WebCore::PointerLockController::isLocked):
(WebCore::PointerLockController::didAcquirePointerLock):
(WebCore::PointerLockController::didNotAcquirePointerLock):
(WebCore::PointerLockController::didLosePointerLock):
(WebCore::PointerLockController::dispatchLockedMouseEvent):

  • page/PointerLockController.h: Copied from Source/WebCore/page/PointerLock.h.

Source/WebKit/chromium:

Add calls to the PointerLockController added in this patch to WebCore.

  • src/WebViewImpl.cpp:

(WebKit::WebViewImpl::close):
(WebKit::WebViewImpl::didAcquirePointerLock):
(WebKit::WebViewImpl::didNotAcquirePointerLock):
(WebKit::WebViewImpl::didLosePointerLock):
(WebKit::WebViewImpl::pointerLockMouseEvent):

LayoutTests:

Reviewed by Julien Chaffraix.

  • pointer-lock/lock-already-locked-expected.txt: Added.
  • pointer-lock/lock-already-locked.html: Added.
  • pointer-lock/lock-fail-responses-expected.txt: Added.
  • pointer-lock/lock-fail-responses.html: Added.
  • pointer-lock/mouse-event-delivery-expected.txt: Added.
  • pointer-lock/mouse-event-delivery.html: Added.
  • pointer-lock/pointerlocklost-event-expected.txt: Added.
  • pointer-lock/pointerlocklost-event.html: Added.
Location:
trunk
Files:
9 added
14 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r106131 r106134  
     12012-01-24  Vincent Scheib  <scheib@chromium.org>
     2
     3        Pointer Lock: Implement pointer interface
     4        https://bugs.webkit.org/show_bug.cgi?id=75762
     5
     6        Reviewed by Julien Chaffraix.
     7
     8        * pointer-lock/lock-already-locked-expected.txt: Added.
     9        * pointer-lock/lock-already-locked.html: Added.
     10        * pointer-lock/lock-fail-responses-expected.txt: Added.
     11        * pointer-lock/lock-fail-responses.html: Added.
     12        * pointer-lock/mouse-event-delivery-expected.txt: Added.
     13        * pointer-lock/mouse-event-delivery.html: Added.
     14        * pointer-lock/pointerlocklost-event-expected.txt: Added.
     15        * pointer-lock/pointerlocklost-event.html: Added.
     16
    1172012-01-27  Levi Weintraub  <leviw@chromium.org>
    218
  • trunk/LayoutTests/pointer-lock/mouse-event-api.html

    r101025 r106134  
    1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
     1<!DOCTYPE HTML>
    22<html>
    33<head>
  • trunk/LayoutTests/pointer-lock/pointer-lock-api.html

    r105011 r106134  
    1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
     1<!DOCTYPE HTML>
    22<html>
    33<head>
  • trunk/Source/WebCore/ChangeLog

    r106130 r106134  
     12012-01-24  Vincent Scheib  <scheib@chromium.org>
     2
     3        Pointer Lock: Implement pointer interface
     4        https://bugs.webkit.org/show_bug.cgi?id=75762
     5
     6        Reviewed by Julien Chaffraix.
     7
     8        Implement the navigator.pointer interface via a new
     9        PointerLockController class, as per
     10        http://dvcs.w3.org/hg/webevents/raw-file/default/mouse-lock.html.
     11
     12        The implementation is being made in steps, the feature is still behind
     13        compile-time and run-time flags, 'webkit' prefixed, and not yet enabled
     14        in any browser. (Chromium has a developer flag required.) Follow-up
     15        work will include handling DOM elements being removed, making all
     16        callbacks asynchronous, iframe permissions (similar to Full Screen),
     17        etc.
     18
     19        PointerLockController maintains state of which Element is the current
     20        lock target and the success and failure callbacks. ChromeClient has
     21        methods added to expose the required state change requests.
     22
     23        Tests: pointer-lock/lock-already-locked.html
     24               pointer-lock/lock-fail-responses.html
     25               pointer-lock/mouse-event-delivery.html
     26               pointer-lock/pointerlocklost-event.html
     27
     28        * WebCore.gypi:
     29        * dom/EventNames.h:
     30        * page/ChromeClient.h:
     31        (WebCore::ChromeClient::requestPointerLock):
     32        (WebCore::ChromeClient::requestPointerUnlock):
     33        (WebCore::ChromeClient::isPointerLocked):
     34        * page/Navigator.cpp:
     35        (WebCore::Navigator::webkitPointer):
     36        * page/Page.cpp:
     37        (WebCore::Page::Page):
     38        * page/Page.h:
     39        (WebCore::Page::pointerLockController):
     40        * page/PointerLock.cpp:
     41        (WebCore::PointerLock::PointerLock):
     42        (WebCore::PointerLock::create):
     43        (WebCore::PointerLock::lock):
     44        (WebCore::PointerLock::unlock):
     45        (WebCore::PointerLock::isLocked):
     46        * page/PointerLock.h:
     47        (WebCore::PointerLock::create):
     48        * page/PointerLockController.cpp: Added.
     49        (WebCore::PointerLockController::PointerLockController):
     50        (WebCore::PointerLockController::requestPointerLock):
     51        (WebCore::PointerLockController::requestPointerUnlock):
     52        (WebCore::PointerLockController::isLocked):
     53        (WebCore::PointerLockController::didAcquirePointerLock):
     54        (WebCore::PointerLockController::didNotAcquirePointerLock):
     55        (WebCore::PointerLockController::didLosePointerLock):
     56        (WebCore::PointerLockController::dispatchLockedMouseEvent):
     57        * page/PointerLockController.h: Copied from Source/WebCore/page/PointerLock.h.
     58
    1592012-01-27  Abhishek Arya  <inferno@chromium.org>
    260
  • trunk/Source/WebCore/WebCore.gypi

    r105962 r106134  
    26482648            'page/PointerLock.cpp',
    26492649            'page/PointerLock.h',
     2650            'page/PointerLockController.cpp',
     2651            'page/PointerLockController.h',
    26502652            'page/PrintContext.cpp',
    26512653            'page/Screen.cpp',
  • trunk/Source/WebCore/dom/EventNames.h

    r104838 r106134  
    198198    macro(show) \
    199199    \
     200    macro(webkitpointerlocklost) \
     201    \
    200202
    201203// end of DOM_EVENT_NAMES_FOR_EACH
  • trunk/Source/WebCore/page/ChromeClient.h

    r104347 r106134  
    329329        virtual bool isSVGImageChromeClient() const { return false; }
    330330
     331#if ENABLE(POINTER_LOCK)
     332        virtual bool requestPointerLock() { return false; }
     333        virtual void requestPointerUnlock() { }
     334        virtual bool isPointerLocked() { return false; }
     335#endif
     336
    331337    protected:
    332338        virtual ~ChromeClient() { }
  • trunk/Source/WebCore/page/Navigator.cpp

    r104380 r106134  
    162162PointerLock* Navigator::webkitPointer() const
    163163{
    164     if (!m_pointer)
    165         m_pointer = PointerLock::create();
     164    if (!m_pointer && m_frame && m_frame->page())
     165        m_pointer = PointerLock::create(m_frame);
    166166    return m_pointer.get();
    167167}
  • trunk/Source/WebCore/page/Page.cpp

    r103365 r106134  
    6060#include "PluginView.h"
    6161#include "PluginViewBase.h"
     62#include "PointerLockController.h"
    6263#include "ProgressTracker.h"
    6364#include "RenderTheme.h"
     
    146147#if ENABLE(NOTIFICATIONS)
    147148    , m_notificationController(NotificationController::create(this, pageClients.notificationClient))
     149#endif
     150#if ENABLE(POINTER_LOCK)
     151    , m_pointerLockController(PointerLockController::create(this))
    148152#endif
    149153#if ENABLE(INPUT_SPEECH)
  • trunk/Source/WebCore/page/Page.h

    r103007 r106134  
    7777    class PageGroup;
    7878    class PluginData;
     79    class PointerLockController;
    7980    class ProgressTracker;
    8081    class Range;
     
    191192        NotificationController* notificationController() const { return m_notificationController.get(); }
    192193#endif
     194#if ENABLE(POINTER_LOCK)
     195        PointerLockController* pointerLockController() const { return m_pointerLockController.get(); }
     196#endif
    193197#if ENABLE(INPUT_SPEECH)
    194198        SpeechInput* speechInput();
     
    387391        OwnPtr<NotificationController> m_notificationController;
    388392#endif
     393#if ENABLE(POINTER_LOCK)
     394        OwnPtr<PointerLockController> m_pointerLockController;
     395#endif
    389396#if ENABLE(INPUT_SPEECH)
    390397        SpeechInputClient* m_speechInputClient;
  • trunk/Source/WebCore/page/PointerLock.cpp

    r100373 r106134  
    2626#include "PointerLock.h"
    2727
     28#include "Frame.h"
     29#include "Page.h"
     30#include "PointerLockController.h"
     31
    2832#if ENABLE(POINTER_LOCK)
    2933
    3034namespace WebCore {
    3135
    32 PointerLock::PointerLock()
     36PointerLock::PointerLock(Frame* frame)
     37    : DOMWindowProperty(frame)
     38    , m_controller(0)
    3339{
     40    ASSERT(m_frame);
     41    m_controller = frame->page()->pointerLockController();
    3442}
    3543
    3644PointerLock::~PointerLock()
    3745{
     46    ASSERT(!m_controller);
     47}
     48
     49void PointerLock::disconnectFrame()
     50{
     51    DOMWindowProperty::disconnectFrame();
     52    m_controller = 0;
    3853}
    3954
    4055void PointerLock::lock(Element* target, PassRefPtr<VoidCallback> successCallback, PassRefPtr<VoidCallback> failureCallback)
    4156{
    42     // FIXME: Implement
     57    if (m_controller)
     58        m_controller->requestPointerLock(target, successCallback, failureCallback);
    4359}
    4460
    4561void PointerLock::unlock()
    4662{
    47     // FIXME: Implement
     63    if (m_controller)
     64        m_controller->requestPointerUnlock();
    4865}
    4966
    5067bool PointerLock::isLocked()
    5168{
    52     // FIXME: Implement
    53     return false;
     69    return m_controller && m_controller->isLocked();
    5470}
    5571
  • trunk/Source/WebCore/page/PointerLock.h

    r100373 r106134  
    2828#if ENABLE(POINTER_LOCK)
    2929
     30#include "DOMWindowProperty.h"
    3031#include "VoidCallback.h"
    3132#include <wtf/PassRefPtr.h>
     
    3536
    3637class Element;
     38class Frame;
     39class PointerLockController;
    3740
    38 class PointerLock : public RefCounted<PointerLock> {
     41class PointerLock : public RefCounted<PointerLock>, public DOMWindowProperty {
    3942public:
    40     static PassRefPtr<PointerLock> create() { return adoptRef(new PointerLock()); }
     43    static PassRefPtr<PointerLock> create(Frame* frame) { return adoptRef(new PointerLock(frame)); }
    4144
    4245    ~PointerLock();
     46
     47    // DOMWindowProperty Interface
     48    virtual void disconnectFrame() OVERRIDE;
    4349
    4450    void lock(Element* target, PassRefPtr<VoidCallback> successCallback, PassRefPtr<VoidCallback> failureCallback);
     
    4753
    4854private:
    49     PointerLock();
     55    explicit PointerLock(Frame*);
     56
     57    PointerLockController* m_controller;
    5058};
    5159
  • trunk/Source/WebCore/page/PointerLockController.h

    r106132 r106134  
    11/*
    2  * Copyright (C) 2011 Google Inc. All rights reserved.
     2 * Copyright (C) 2012 Google Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2323 */
    2424
    25 #ifndef PointerLock_h
    26 #define PointerLock_h
     25#ifndef PointerLockController_h
     26#define PointerLockController_h
    2727
    2828#if ENABLE(POINTER_LOCK)
    2929
    30 #include "VoidCallback.h"
    31 #include <wtf/PassRefPtr.h>
    32 #include <wtf/RefCounted.h>
     30#include <wtf/RefPtr.h>
     31#include <wtf/text/AtomicString.h>
    3332
    3433namespace WebCore {
    3534
    3635class Element;
     36class Page;
     37class PlatformMouseEvent;
     38class VoidCallback;
    3739
    38 class PointerLock : public RefCounted<PointerLock> {
     40class PointerLockController {
     41    WTF_MAKE_NONCOPYABLE(PointerLockController);
     42    WTF_MAKE_FAST_ALLOCATED;
    3943public:
    40     static PassRefPtr<PointerLock> create() { return adoptRef(new PointerLock()); }
     44    static PassOwnPtr<PointerLockController> create(Page*);
    4145
    42     ~PointerLock();
    43 
    44     void lock(Element* target, PassRefPtr<VoidCallback> successCallback, PassRefPtr<VoidCallback> failureCallback);
    45     void unlock();
     46    void requestPointerLock(Element* target, PassRefPtr<VoidCallback> successCallback, PassRefPtr<VoidCallback> failureCallback);
     47    void requestPointerUnlock();
    4648    bool isLocked();
    4749
     50    void didAcquirePointerLock();
     51    void didNotAcquirePointerLock();
     52    void didLosePointerLock();
     53    void dispatchLockedMouseEvent(const PlatformMouseEvent&, const AtomicString& eventType);
     54
    4855private:
    49     PointerLock();
     56    explicit PointerLockController(Page*);
     57    Page* m_page;
     58    RefPtr<Element> m_element;
     59    RefPtr<VoidCallback> m_successCallback;
     60    RefPtr<VoidCallback> m_failureCallback;
    5061};
    5162
     
    5465#endif // ENABLE(POINTER_LOCK)
    5566
    56 #endif // PointerLock_h
    57 
     67#endif // PointerLockController_h
  • trunk/Source/WebKit/chromium/ChangeLog

    r106084 r106134  
     12012-01-24  Vincent Scheib  <scheib@chromium.org>
     2
     3        Pointer Lock: Implement pointer interface
     4        https://bugs.webkit.org/show_bug.cgi?id=75762
     5
     6        Add calls to the PointerLockController added in this patch to WebCore.
     7
     8        * src/WebViewImpl.cpp:
     9        (WebKit::WebViewImpl::close):
     10        (WebKit::WebViewImpl::didAcquirePointerLock):
     11        (WebKit::WebViewImpl::didNotAcquirePointerLock):
     12        (WebKit::WebViewImpl::didLosePointerLock):
     13        (WebKit::WebViewImpl::pointerLockMouseEvent):
     14
    1152012-01-26  Kent Tamura  <tkent@chromium.org>
    216
  • trunk/Source/WebKit/chromium/src/WebViewImpl.cpp

    r106063 r106134  
    9090#include "PlatformThemeChromiumLinux.h"
    9191#include "PlatformWheelEvent.h"
     92#include "PointerLock.h"
     93#include "PointerLockController.h"
    9294#include "PopupContainer.h"
    9395#include "PopupMenuClient.h"
     
    17531755void WebViewImpl::didAcquirePointerLock()
    17541756{
    1755     // FIXME: Implement when PointerLockController lands.
     1757#if ENABLE(POINTER_LOCK)
     1758    if (page())
     1759        page()->pointerLockController()->didAcquirePointerLock();
     1760#endif
    17561761}
    17571762
    17581763void WebViewImpl::didNotAcquirePointerLock()
    17591764{
    1760     // FIXME: Implement when PointerLockController lands.
     1765#if ENABLE(POINTER_LOCK)
     1766    if (page())
     1767        page()->pointerLockController()->didNotAcquirePointerLock();
     1768#endif
    17611769}
    17621770
    17631771void WebViewImpl::didLosePointerLock()
    17641772{
    1765     // FIXME: Implement when PointerLockController lands.
     1773#if ENABLE(POINTER_LOCK)
     1774    if (page())
     1775        page()->pointerLockController()->didLosePointerLock();
     1776#endif
    17661777}
    17671778
     
    32123223void WebViewImpl::pointerLockMouseEvent(const WebInputEvent& event)
    32133224{
    3214     // FIXME: Implement when PointerLockController lands.
     3225    AtomicString eventType;
     3226    switch (event.type) {
     3227    case WebInputEvent::MouseDown:
     3228        eventType = eventNames().mousedownEvent;
     3229        break;
     3230    case WebInputEvent::MouseUp:
     3231        eventType = eventNames().mouseupEvent;
     3232        break;
     3233    case WebInputEvent::MouseMove:
     3234        eventType = eventNames().mousemoveEvent;
     3235        break;
     3236    default:
     3237        ASSERT_NOT_REACHED();
     3238    }
     3239
     3240    const WebMouseEvent& mouseEvent = static_cast<const WebMouseEvent&>(event);
     3241
     3242    if (page())
     3243        page()->pointerLockController()->dispatchLockedMouseEvent(
     3244            PlatformMouseEventBuilder(mainFrameImpl()->frameView(), mouseEvent),
     3245            eventType);
    32153246}
    32163247#endif
Note: See TracChangeset for help on using the changeset viewer.