Changeset 207689 in webkit


Ignore:
Timestamp:
Oct 21, 2016 11:45:39 AM (8 years ago)
Author:
commit-queue@webkit.org
Message:

Implement basic pointer lock behavior for WebKit and WebKit2.
https://bugs.webkit.org/show_bug.cgi?id=162745

Patch by Jeremy Jones <jeremyj@apple.com> on 2016-10-21
Reviewed by Simon Fraser.

Source/WebCore:

When ENABLE_POINTER_LOCK is enabled, these tests now pass with DumpRenderTree.
LayoutTests/pointer-lock/lock-already-locked.html
LayoutTests/pointer-lock/lock-element-not-in-dom.html
LayoutTests/pointer-lock/locked-element-iframe-removed-from-dom.html
LayoutTests/pointer-lock/mouse-event-api.html

Export pointer lock symbols and cancel pointer lock on "escape".

  • dom/Document.h: Export symbols.
  • dom/Element.h: Export symbols.
  • page/EventHandler.cpp:

(WebCore::EventHandler::keyEvent): Cancel pointer lock on "escape".

  • page/PointerLockController.cpp: Add missing include.
  • page/PointerLockController.h: Export symbols.

Source/WebKit/mac:

Add basic pointer lock functionality. User permission is not yet implemented.

  • WebCoreSupport/WebChromeClient.h:
  • WebCoreSupport/WebChromeClient.mm:

(WebChromeClient::requestPointerLock):
(WebChromeClient::requestPointerUnlock):

Source/WebKit2:

Enable basic pointer lock functionality by plumbing requests through WebPage IPC.
Pass through mouse movement deltas.
Unlock pointer when view is no longer visible.

  • Shared/WebEventConversion.cpp:

(WebKit::WebKit2PlatformMouseEvent::WebKit2PlatformMouseEvent): Pass along mouse movement.

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::dispatchViewStateChange): Unlock pointer when page is not visible.
(WebKit::WebPageProxy::requestPointerLock): Hide and disassociate pointer.
(WebKit::WebPageProxy::requestPointerUnlock): Show and associate pointer.

  • UIProcess/WebPageProxy.h:
  • UIProcess/WebPageProxy.messages.in: Add methods.
  • WebProcess/WebCoreSupport/WebChromeClient.cpp:

(WebKit::WebChromeClient::requestPointerLock): Pass along to web page.
(WebKit::WebChromeClient::requestPointerUnlock): Ditto.

  • WebProcess/WebCoreSupport/WebChromeClient.h:
  • WebProcess/WebPage/WebPage.cpp:

(WebKit::WebPage::didAcquirePointerLock): Forward to PointerLockController.
(WebKit::WebPage::didNotAcquirePointerLock): Ditto.
(WebKit::WebPage::didLosePointerLock): Ditto.

  • WebProcess/WebPage/WebPage.h:
  • WebProcess/WebPage/WebPage.messages.in: Add methods.
Location:
trunk/Source
Files:
21 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r207688 r207689  
     12016-10-21  Jeremy Jones  <jeremyj@apple.com>
     2
     3        Implement basic pointer lock behavior for WebKit and WebKit2.
     4        https://bugs.webkit.org/show_bug.cgi?id=162745
     5
     6        Reviewed by Simon Fraser.
     7
     8        When ENABLE_POINTER_LOCK is enabled, these tests now pass with DumpRenderTree.
     9        LayoutTests/pointer-lock/lock-already-locked.html
     10        LayoutTests/pointer-lock/lock-element-not-in-dom.html
     11        LayoutTests/pointer-lock/locked-element-iframe-removed-from-dom.html
     12        LayoutTests/pointer-lock/mouse-event-api.html
     13
     14        Export pointer lock symbols and cancel pointer lock on "escape".
     15
     16        * dom/Document.h: Export symbols.
     17        * dom/Element.h: Export symbols.
     18        * page/EventHandler.cpp:
     19        (WebCore::EventHandler::keyEvent): Cancel pointer lock on "escape".
     20        * page/PointerLockController.cpp: Add missing include.
     21        * page/PointerLockController.h: Export symbols.
     22
    1232016-10-21  Jer Noble  <jer.noble@apple.com>
    224
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r207687 r207689  
    15161516                3FBC4AF3189881560046EE38 /* WebVideoFullscreenInterfaceAVKit.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3FBC4AF1189881560046EE38 /* WebVideoFullscreenInterfaceAVKit.mm */; };
    15171517                3FBC4AF4189881560046EE38 /* WebVideoFullscreenInterfaceAVKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 3FBC4AF2189881560046EE38 /* WebVideoFullscreenInterfaceAVKit.h */; settings = {ATTRIBUTES = (Private, ); }; };
     1518                3FF813A71DBA8640009BF001 /* PointerLockController.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CFC434F192406A900A0D3B5 /* PointerLockController.h */; settings = {ATTRIBUTES = (Private, ); }; };
    15181519                3FFFF9A8159D9A550020BBD5 /* WebKitCSSViewportRule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3FFFF9A6159D9A550020BBD5 /* WebKitCSSViewportRule.cpp */; };
    15191520                3FFFF9A9159D9A550020BBD5 /* WebKitCSSViewportRule.h in Headers */ = {isa = PBXBuildFile; fileRef = 3FFFF9A7159D9A550020BBD5 /* WebKitCSSViewportRule.h */; };
     
    2649326494                                BCBB8ABB13F1AFB000734DF0 /* PODRedBlackTree.h in Headers */,
    2649426495                                B2B1F7170D00CAA8004AEA64 /* PointerEventsHitRules.h in Headers */,
     26496                                3FF813A71DBA8640009BF001 /* PointerLockController.h in Headers */,
    2649526497                                84730D921248F0B300D3A9C9 /* PointLightSource.h in Headers */,
    2649626498                                97059978107D975200A50A7C /* PolicyCallback.h in Headers */,
  • trunk/Source/WebCore/dom/Document.h

    r207669 r207689  
    11241124
    11251125#if ENABLE(POINTER_LOCK)
    1126     void exitPointerLock();
    1127     Element* pointerLockElement() const;
     1126    WEBCORE_EXPORT void exitPointerLock();
     1127    WEBCORE_EXPORT Element* pointerLockElement() const;
    11281128#endif
    11291129
  • trunk/Source/WebCore/dom/Element.h

    r207521 r207689  
    478478
    479479#if ENABLE(POINTER_LOCK)
    480     void requestPointerLock();
     480    WEBCORE_EXPORT void requestPointerLock();
    481481#endif
    482482
  • trunk/Source/WebCore/page/ChromeClient.h

    r202425 r207689  
    406406    virtual bool requestPointerLock() { return false; }
    407407    virtual void requestPointerUnlock() { }
    408     virtual bool isPointerLocked() { return false; }
    409408#endif
    410409
  • trunk/Source/WebCore/page/EventHandler.cpp

    r206941 r207689  
    7474#include "PlatformWheelEvent.h"
    7575#include "PluginDocument.h"
     76#include "PointerLockController.h"
    7677#include "RenderFrameSet.h"
    7778#include "RenderLayer.h"
     
    30633064    LOG(Editing, "EventHandler %p keyEvent (text %s keyIdentifier %s)", this, initialKeyEvent.text().utf8().data(), initialKeyEvent.keyIdentifier().utf8().data());
    30643065
     3066#if ENABLE(POINTER_LOCK)
     3067    if (initialKeyEvent.type() == PlatformEvent::KeyDown && initialKeyEvent.windowsVirtualKeyCode() == VK_ESCAPE && m_frame.page()->pointerLockController().element()) {
     3068        m_frame.page()->pointerLockController().requestPointerUnlock();
     3069        return true;
     3070    }
     3071#endif
     3072
    30653073#if ENABLE(FULLSCREEN_API)
    30663074    if (m_frame.document()->webkitIsFullScreen() && !isKeyEventAllowedInFullScreen(initialKeyEvent))
  • trunk/Source/WebCore/page/PointerLockController.cpp

    r190456 r207689  
    3232#include "Element.h"
    3333#include "Event.h"
     34#include "EventNames.h"
    3435#include "Page.h"
    3536#include "PlatformMouseEvent.h"
     
    6465            return;
    6566        }
     67        m_element = target;
    6668        enqueueEvent(eventNames().pointerlockchangeEvent, target);
    67         m_element = target;
    68     } else if (m_page.chrome().client().requestPointerLock()) {
     69    } else {
    6970        m_lockPending = true;
    7071        m_element = target;
    71     } else
    72         enqueueEvent(eventNames().pointerlockerrorEvent, target);
     72        if (!m_page.chrome().client().requestPointerLock()) {
     73            m_element = nullptr;
     74            m_lockPending = false;
     75            enqueueEvent(eventNames().pointerlockerrorEvent, target);
     76        }
     77    }
    7378}
    7479
  • trunk/Source/WebCore/page/PointerLockController.h

    r166679 r207689  
    5151    Element* element() const;
    5252
    53     void didAcquirePointerLock();
    54     void didNotAcquirePointerLock();
    55     void didLosePointerLock();
     53    WEBCORE_EXPORT void didAcquirePointerLock();
     54    WEBCORE_EXPORT void didNotAcquirePointerLock();
     55    WEBCORE_EXPORT void didLosePointerLock();
    5656    void dispatchLockedMouseEvent(const PlatformMouseEvent&, const AtomicString& eventType);
    5757
  • trunk/Source/WebKit/mac/ChangeLog

    r207642 r207689  
     12016-10-21  Jeremy Jones  <jeremyj@apple.com>
     2
     3        Implement basic pointer lock behavior for WebKit and WebKit2.
     4        https://bugs.webkit.org/show_bug.cgi?id=162745
     5
     6        Reviewed by Simon Fraser.
     7
     8        Add basic pointer lock functionality. User permission is not yet implemented.
     9
     10        * WebCoreSupport/WebChromeClient.h:
     11        * WebCoreSupport/WebChromeClient.mm:
     12        (WebChromeClient::requestPointerLock):
     13        (WebChromeClient::requestPointerUnlock):
     14
    1152016-10-19  Myles C. Maxfield  <mmaxfield@apple.com>
    216
  • trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.h

    r202425 r207689  
    136136    std::unique_ptr<WebCore::ColorChooser> createColorChooser(WebCore::ColorChooserClient*, const WebCore::Color&) override;
    137137#endif
     138   
     139#if ENABLE(POINTER_LOCK)
     140    bool requestPointerLock() override;
     141    void requestPointerUnlock() override;
     142#endif
    138143
    139144    WebCore::KeyboardUIMode keyboardUIMode() override;
  • trunk/Source/WebKit/mac/WebCoreSupport/WebChromeClient.mm

    r202425 r207689  
    7878#import <WebCore/Page.h>
    7979#import <WebCore/PlatformScreen.h>
     80#import <WebCore/PointerLockController.h>
    8081#import <WebCore/ResourceRequest.h>
    8182#import <WebCore/SerializedCryptoKeyWrap.h>
     
    710711#endif
    711712
     713#if ENABLE(POINTER_LOCK)
     714bool WebChromeClient::requestPointerLock()
     715{
     716#if PLATFORM(MAC)
     717    if (![m_webView page])
     718        return false;
     719
     720    CGDisplayHideCursor(CGMainDisplayID());
     721    CGAssociateMouseAndMouseCursorPosition(false);
     722    [m_webView page]->pointerLockController().didAcquirePointerLock();
     723   
     724    return true;
     725#else
     726    return false;
     727#endif
     728}
     729
     730void WebChromeClient::requestPointerUnlock()
     731{
     732#if PLATFORM(MAC)
     733    CGDisplayShowCursor(CGMainDisplayID());
     734    CGAssociateMouseAndMouseCursorPosition(true);
     735    if ([m_webView page])
     736        [m_webView page]->pointerLockController().didLosePointerLock();
     737#endif
     738}
     739#endif
     740
    712741void WebChromeClient::runOpenPanel(Frame*, PassRefPtr<FileChooser> chooser)
    713742{
  • trunk/Source/WebKit2/ChangeLog

    r207670 r207689  
     12016-10-21  Jeremy Jones  <jeremyj@apple.com>
     2
     3        Implement basic pointer lock behavior for WebKit and WebKit2.
     4        https://bugs.webkit.org/show_bug.cgi?id=162745
     5
     6        Reviewed by Simon Fraser.
     7
     8        Enable basic pointer lock functionality by plumbing requests through WebPage IPC.
     9        Pass through mouse movement deltas.
     10        Unlock pointer when view is no longer visible.
     11
     12        * Shared/WebEventConversion.cpp:
     13        (WebKit::WebKit2PlatformMouseEvent::WebKit2PlatformMouseEvent): Pass along mouse movement.
     14        * UIProcess/WebPageProxy.cpp:
     15        (WebKit::WebPageProxy::dispatchViewStateChange): Unlock pointer when page is not visible.
     16        (WebKit::WebPageProxy::requestPointerLock): Hide and disassociate pointer.
     17        (WebKit::WebPageProxy::requestPointerUnlock): Show and associate pointer.
     18        * UIProcess/WebPageProxy.h:
     19        * UIProcess/WebPageProxy.messages.in: Add methods.
     20        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
     21        (WebKit::WebChromeClient::requestPointerLock): Pass along to web page.
     22        (WebKit::WebChromeClient::requestPointerUnlock): Ditto.
     23        * WebProcess/WebCoreSupport/WebChromeClient.h:
     24        * WebProcess/WebPage/WebPage.cpp:
     25        (WebKit::WebPage::didAcquirePointerLock): Forward to PointerLockController.
     26        (WebKit::WebPage::didNotAcquirePointerLock): Ditto.
     27        (WebKit::WebPage::didLosePointerLock): Ditto.
     28        * WebProcess/WebPage/WebPage.h:
     29        * WebProcess/WebPage/WebPage.messages.in: Add methods.
     30
    1312016-10-21  Wenson Hsieh  <wenson_hsieh@apple.com>
    232
  • trunk/Source/WebKit2/Shared/WebEventConversion.cpp

    r206828 r207689  
    101101
    102102        m_position = webEvent.position();
     103#if ENABLE(POINTER_LOCK)
     104        m_movementDelta = WebCore::IntPoint(webEvent.deltaX(), webEvent.deltaY());
     105#endif
    103106        m_globalPosition = webEvent.globalPosition();
    104107        m_clickCount = webEvent.clickCount();
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r207648 r207689  
    15501550        m_process->responsivenessTimer().stop();
    15511551
     1552#if ENABLE(POINTER_LOCK)
     1553    if ((changed & ViewState::IsVisible) && !isViewVisible())
     1554        requestPointerUnlock();
     1555#endif
     1556
    15521557    if (changed & ViewState::IsInWindow) {
    15531558        if (isInWindow())
     
    66216626    m_process->send(Messages::WebPage::SetUserInterfaceLayoutDirection(static_cast<uint32_t>(userInterfaceLayoutDirection)), m_pageID);
    66226627}
     6628   
     6629#if ENABLE(POINTER_LOCK)
     6630void WebPageProxy::requestPointerLock()
     6631{
     6632    if (!isViewVisible()) {
     6633        m_process->send(Messages::WebPage::DidNotAcquirePointerLock(), m_pageID);
     6634        return;
     6635    }
     6636
     6637    didAllowPointerLock();
     6638}
     6639   
     6640void WebPageProxy::didAllowPointerLock()
     6641{
     6642    CGDisplayHideCursor(CGMainDisplayID());
     6643    CGAssociateMouseAndMouseCursorPosition(false);
     6644    m_process->send(Messages::WebPage::DidAcquirePointerLock(), m_pageID);
     6645}
     6646   
     6647void WebPageProxy::didDenyPointerLock()
     6648{
     6649    m_process->send(Messages::WebPage::DidNotAcquirePointerLock(), m_pageID);
     6650}
     6651
     6652void WebPageProxy::requestPointerUnlock()
     6653{
     6654    CGDisplayShowCursor(CGMainDisplayID());
     6655    CGAssociateMouseAndMouseCursorPosition(true);
     6656    m_process->send(Messages::WebPage::DidLosePointerLock(), m_pageID);
     6657}
     6658#endif
     6659
    66236660
    66246661} // namespace WebKit
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r207463 r207689  
    947947    void setVolumeOfMediaElement(double, uint64_t);
    948948#endif
     949       
     950#if ENABLE(POINTER_LOCK)
     951    void didAllowPointerLock();
     952    void didDenyPointerLock();
     953#endif
    949954
    950955    // WebPopupMenuProxy::Client
     
    11671172#if PLATFORM(GTK)
    11681173    void failedToShowPopupMenu() override;
     1174#endif
     1175
     1176#if ENABLE(POINTER_LOCK)
     1177    void requestPointerLock();
     1178    void requestPointerUnlock();
    11691179#endif
    11701180
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in

    r207463 r207689  
    459459#endif
    460460
     461#if ENABLE(POINTER_LOCK)
     462    RequestPointerLock()
     463    RequestPointerUnlock()
     464#endif
     465
    461466    ImageOrMediaDocumentSizeChanged(WebCore::IntSize newSize)
    462467
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp

    r206132 r207689  
    456456}
    457457
     458#if ENABLE(POINTER_LOCK)
     459bool WebChromeClient::requestPointerLock()
     460{
     461    m_page->send(Messages::WebPageProxy::RequestPointerLock());
     462    return true;
     463}
     464
     465void WebChromeClient::requestPointerUnlock()
     466{
     467    m_page->send(Messages::WebPageProxy::RequestPointerUnlock());
     468}
     469#endif
     470
    458471void WebChromeClient::invalidateRootView(const IntRect&)
    459472{
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h

    r203312 r207689  
    192192    void scheduleAnimation() override;
    193193#endif
     194   
     195#if ENABLE(POINTER_LOCK)
     196    bool requestPointerLock() override;
     197    void requestPointerUnlock() override;
     198#endif
    194199
    195200    void didAssociateFormControls(const Vector<RefPtr<WebCore::Element>>&) override;
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp

    r207670 r207689  
    153153#include <WebCore/PlatformKeyboardEvent.h>
    154154#include <WebCore/PluginDocument.h>
     155#include <WebCore/PointerLockController.h>
    155156#include <WebCore/PrintContext.h>
    156157#include <WebCore/Range.h>
     
    56145615#endif
    56155616
     5617#if ENABLE(POINTER_LOCK)
     5618void WebPage::didAcquirePointerLock()
     5619{
     5620    corePage()->pointerLockController().didAcquirePointerLock();
     5621}
     5622
     5623void WebPage::didNotAcquirePointerLock()
     5624{
     5625    corePage()->pointerLockController().didNotAcquirePointerLock();
     5626}
     5627
     5628void WebPage::didLosePointerLock()
     5629{
     5630    corePage()->pointerLockController().didLosePointerLock();
     5631}
     5632#endif
     5633
    56165634} // namespace WebKit
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h

    r207563 r207689  
    962962    void gamepadActivity(const Vector<GamepadData>&);
    963963#endif
     964   
     965#if ENABLE(POINTER_LOCK)
     966    void didAcquirePointerLock();
     967    void didNotAcquirePointerLock();
     968    void didLosePointerLock();
     969#endif
    964970
    965971private:
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in

    r207463 r207689  
    429429#endif
    430430
     431#if ENABLE(POINTER_LOCK)
     432    DidAcquirePointerLock()
     433    DidNotAcquirePointerLock()
     434    DidLosePointerLock()
     435#endif
     436
    431437    ClearWheelEventTestTrigger()
    432438    SetShouldScaleViewToFitDocument(bool shouldScaleViewToFitDocument)
Note: See TracChangeset for help on using the changeset viewer.