15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef PointerLockController_h
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define PointerLockController_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "platform/heap/Handle.h"
290019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "wtf/RefPtr.h"
300019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "wtf/text/AtomicString.h"
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Element;
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Document;
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Page;
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class PlatformMouseEvent;
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)class PointerLockController FINAL : public NoBaseWillBeGarbageCollected<PointerLockController> {
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(PointerLockController);
415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    static PassOwnPtrWillBeRawPtr<PointerLockController> create(Page*);
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void requestPointerLock(Element* target);
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void requestPointerUnlock();
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void elementRemoved(Element*);
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void documentDetached(Document*);
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool lockPending() const;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* element() const;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void didAcquirePointerLock();
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void didNotAcquirePointerLock();
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void didLosePointerLock();
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void dispatchLockedMouseEvent(const PlatformMouseEvent&, const AtomicString& eventType);
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void trace(Visitor*);
585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    explicit PointerLockController(Page*);
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearElement();
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void enqueueEvent(const AtomicString& type, Element*);
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void enqueueEvent(const AtomicString& type, Document*);
64d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RawPtrWillBeMember<Page> m_page;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_lockPending;
675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Element> m_element;
685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Document> m_documentOfRemovedElementWhileWaitingForUnlock;
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
71c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // PointerLockController_h
74