⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eventhandler.h

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 H
字号:
/* * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */#ifndef EventHandler_h#define EventHandler_h#include "DragActions.h"#include "FocusDirection.h"#include "PlatformMouseEvent.h"#include "ScrollTypes.h"#include "Timer.h"#include <wtf/Forward.h>#include <wtf/Noncopyable.h>#include <wtf/Platform.h>#include <wtf/RefPtr.h>#if PLATFORM(MAC)#include "WebCoreKeyboardUIMode.h"#ifndef __OBJC__class NSEvent;class NSView;#endif#endifnamespace WebCore {class AtomicString;class Clipboard;class Cursor;class Event;class FloatPoint;class FloatRect;class Frame;class HitTestRequest;class HitTestResult;class HTMLFrameSetElement;class KeyboardEvent;class MouseEventWithHitTestResults;class Node;class PlatformKeyboardEvent;class PlatformWheelEvent;class RenderLayer;class RenderObject;class RenderWidget;class Scrollbar;class String;class SVGElementInstance;class TextEvent;class VisiblePosition;class Widget;    extern const int LinkDragHysteresis;extern const int ImageDragHysteresis;extern const int TextDragHysteresis;extern const int GeneralDragHysteresis;class EventHandler : Noncopyable {public:    EventHandler(Frame*);    ~EventHandler();    void clear();    void updateSelectionForMouseDrag();    Node* mousePressNode() const;    void setMousePressNode(PassRefPtr<Node>);    bool panScrollInProgress() { return m_panScrollInProgress; }    void setPanScrollInProgress(bool inProgress) { m_panScrollInProgress = inProgress; }    void stopAutoscrollTimer(bool rendererIsBeingDestroyed = false);    RenderObject* autoscrollRenderer() const;    void updateAutoscrollRenderer();    HitTestResult hitTestResultAtPoint(const IntPoint&, bool allowShadowContent, bool ignoreClipping = false);    bool mousePressed() const { return m_mousePressed; }    void setMousePressed(bool pressed) { m_mousePressed = pressed; }    void setCapturingMouseEventsNode(PassRefPtr<Node>);    bool updateDragAndDrop(const PlatformMouseEvent&, Clipboard*);    void cancelDragAndDrop(const PlatformMouseEvent&, Clipboard*);    bool performDragAndDrop(const PlatformMouseEvent&, Clipboard*);    void scheduleHoverStateUpdate();    void setResizingFrameSet(HTMLFrameSetElement*);    void resizeLayerDestroyed();    IntPoint currentMousePosition() const;    void setIgnoreWheelEvents(bool);    bool scrollOverflow(ScrollDirection, ScrollGranularity);    bool shouldDragAutoNode(Node*, const IntPoint&) const; // -webkit-user-drag == auto    bool tabsToLinks(KeyboardEvent*) const;    bool tabsToAllControls(KeyboardEvent*) const;    bool mouseDownMayStartSelect() const { return m_mouseDownMayStartSelect; }    bool mouseMoved(const PlatformMouseEvent&);    bool handleMousePressEvent(const PlatformMouseEvent&);    bool handleMouseMoveEvent(const PlatformMouseEvent&, HitTestResult* hoveredNode = 0);    bool handleMouseReleaseEvent(const PlatformMouseEvent&);    bool handleWheelEvent(PlatformWheelEvent&);    bool sendContextMenuEvent(const PlatformMouseEvent&);    void setMouseDownMayStartAutoscroll() { m_mouseDownMayStartAutoscroll = true; }    bool needsKeyboardEventDisambiguationQuirks() const;    static unsigned accessKeyModifiers();    bool handleAccessKey(const PlatformKeyboardEvent&);    bool keyEvent(const PlatformKeyboardEvent&);    void defaultKeyboardEventHandler(KeyboardEvent*);    bool handleTextInputEvent(const String& text, Event* underlyingEvent = 0,        bool isLineBreak = false, bool isBackTab = false);    void defaultTextInputEventHandler(TextEvent*);    bool eventMayStartDrag(const PlatformMouseEvent&) const;        void dragSourceMovedTo(const PlatformMouseEvent&);    void dragSourceEndedAt(const PlatformMouseEvent&, DragOperation);    void focusDocumentView();    void capsLockStateMayHaveChanged();        unsigned pendingFrameUnloadEventCount();    void addPendingFrameUnloadEventCount();    void removePendingFrameUnloadEventCount();    void clearPendingFrameUnloadEventCount();    unsigned pendingFrameBeforeUnloadEventCount();    void addPendingFrameBeforeUnloadEventCount();    void removePendingFrameBeforeUnloadEventCount();    void clearPendingFrameBeforeUnloadEventCount();    void sendResizeEvent();    void sendScrollEvent();    #if PLATFORM(MAC)    PassRefPtr<KeyboardEvent> currentKeyboardEvent() const;    void mouseDown(NSEvent*);    void mouseDragged(NSEvent*);    void mouseUp(NSEvent*);    void mouseMoved(NSEvent*);    bool keyEvent(NSEvent*);    bool wheelEvent(NSEvent*);    void sendFakeEventsAfterWidgetTracking(NSEvent* initiatingEvent);    void setActivationEventNumber(int num) { m_activationEventNumber = num; }    NSEvent *currentNSEvent();#endifprivate:    struct EventHandlerDragState {        RefPtr<Node> m_dragSrc; // element that may be a drag source, for the current mouse gesture        bool m_dragSrcIsLink;        bool m_dragSrcIsImage;        bool m_dragSrcInSelection;        bool m_dragSrcMayBeDHTML;        bool m_dragSrcMayBeUA; // Are DHTML and/or the UserAgent allowed to drag out?        bool m_dragSrcIsDHTML;        RefPtr<Clipboard> m_dragClipboard; // used on only the source side of dragging    };    static EventHandlerDragState& dragState();    static const double TextDragDelay;        PassRefPtr<Clipboard> createDraggingClipboard() const;        bool eventActivatedView(const PlatformMouseEvent&) const;    void selectClosestWordFromMouseEvent(const MouseEventWithHitTestResults& event);    void selectClosestWordOrLinkFromMouseEvent(const MouseEventWithHitTestResults& event);    bool handleMouseDoubleClickEvent(const PlatformMouseEvent&);    bool handleMousePressEvent(const MouseEventWithHitTestResults&);    bool handleMousePressEventSingleClick(const MouseEventWithHitTestResults&);    bool handleMousePressEventDoubleClick(const MouseEventWithHitTestResults&);    bool handleMousePressEventTripleClick(const MouseEventWithHitTestResults&);    bool handleMouseDraggedEvent(const MouseEventWithHitTestResults&);    bool handleMouseReleaseEvent(const MouseEventWithHitTestResults&);    void handleKeyboardSelectionMovement(KeyboardEvent*);        Cursor selectCursor(const MouseEventWithHitTestResults&, Scrollbar*);#if ENABLE(PAN_SCROLLING)    void setPanScrollCursor();#endif    void hoverTimerFired(Timer<EventHandler>*);    static bool canMouseDownStartSelect(Node*);    static bool canMouseDragExtendSelect(Node*);    void handleAutoscroll(RenderObject*);    void startAutoscrollTimer();    void setAutoscrollRenderer(RenderObject*);    void autoscrollTimerFired(Timer<EventHandler>*);    void invalidateClick();    Node* nodeUnderMouse() const;        void updateMouseEventTargetNode(Node*, const PlatformMouseEvent&, bool fireMouseOverOut);    void fireMouseOverOut(bool fireMouseOver = true, bool fireMouseOut = true, bool updateLastNodeUnderMouse = true);        MouseEventWithHitTestResults prepareMouseEvent(const HitTestRequest&, const PlatformMouseEvent&);    bool dispatchMouseEvent(const AtomicString& eventType, Node* target, bool cancelable, int clickCount, const PlatformMouseEvent&, bool setUnder);    bool dispatchDragEvent(const AtomicString& eventType, Node* target, const PlatformMouseEvent&, Clipboard*);    void freeClipboard();    bool handleDrag(const MouseEventWithHitTestResults&);    bool handleMouseUp(const MouseEventWithHitTestResults&);    void clearDragState();    bool dispatchDragSrcEvent(const AtomicString& eventType, const PlatformMouseEvent&);    bool dragHysteresisExceeded(const FloatPoint&) const;    bool dragHysteresisExceeded(const IntPoint&) const;    bool passMousePressEventToSubframe(MouseEventWithHitTestResults&, Frame* subframe);    bool passMouseMoveEventToSubframe(MouseEventWithHitTestResults&, Frame* subframe, HitTestResult* hoveredNode = 0);    bool passMouseReleaseEventToSubframe(MouseEventWithHitTestResults&, Frame* subframe);    bool passSubframeEventToSubframe(MouseEventWithHitTestResults&, Frame* subframe, HitTestResult* hoveredNode = 0);    bool passMousePressEventToScrollbar(MouseEventWithHitTestResults&, Scrollbar*);    bool passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults&);    bool passWidgetMouseDownEventToWidget(RenderWidget*);    bool passMouseDownEventToWidget(Widget*);    bool passWheelEventToWidget(PlatformWheelEvent&, Widget*);    void defaultSpaceEventHandler(KeyboardEvent*);    void defaultTabEventHandler(KeyboardEvent*);    void allowDHTMLDrag(bool& flagDHTML, bool& flagUA) const;    // The following are called at the beginning of handleMouseUp and handleDrag.      // If they return true it indicates that they have consumed the event.#if PLATFORM(MAC)    bool eventLoopHandleMouseUp(const MouseEventWithHitTestResults&);    bool eventLoopHandleMouseDragged(const MouseEventWithHitTestResults&);    NSView *mouseDownViewIfStillGood();#else    bool eventLoopHandleMouseUp(const MouseEventWithHitTestResults&) { return false; }    bool eventLoopHandleMouseDragged(const MouseEventWithHitTestResults&) { return false; }#endif    bool invertSenseOfTabsToLinks(KeyboardEvent*) const;    void updateSelectionForMouseDrag(Node* targetNode, const IntPoint& localPoint);    bool capturesDragging() const { return m_capturesDragging; }    Frame* m_frame;    bool m_mousePressed;    bool m_capturesDragging;    RefPtr<Node> m_mousePressNode;    bool m_mouseDownMayStartSelect;    bool m_mouseDownMayStartDrag;    bool m_mouseDownWasSingleClickInSelection;    bool m_beganSelectingText;    IntPoint m_dragStartPos;    IntPoint m_panScrollStartPos;    bool m_panScrollInProgress;    Timer<EventHandler> m_hoverTimer;        Timer<EventHandler> m_autoscrollTimer;    RenderObject* m_autoscrollRenderer;    bool m_autoscrollInProgress;    bool m_mouseDownMayStartAutoscroll;    bool m_mouseDownWasInSubframe;#if ENABLE(SVG)    bool m_svgPan;    RefPtr<SVGElementInstance> m_instanceUnderMouse;    RefPtr<SVGElementInstance> m_lastInstanceUnderMouse;#endif    RenderLayer* m_resizeLayer;    RefPtr<Node> m_capturingMouseEventsNode;        RefPtr<Node> m_nodeUnderMouse;    RefPtr<Node> m_lastNodeUnderMouse;    RefPtr<Frame> m_lastMouseMoveEventSubframe;    RefPtr<Scrollbar> m_lastScrollbarUnderMouse;    int m_clickCount;    RefPtr<Node> m_clickNode;    RefPtr<Node> m_dragTarget;        RefPtr<HTMLFrameSetElement> m_frameSetBeingResized;    IntSize m_offsetFromResizeCorner;   // in the coords of m_resizeLayer        IntPoint m_currentMousePosition;    IntPoint m_mouseDownPos; // in our view's coords    double m_mouseDownTimestamp;    PlatformMouseEvent m_mouseDown;        unsigned m_pendingFrameUnloadEventCount;    unsigned m_pendingFrameBeforeUnloadEventCount;#if PLATFORM(MAC)    NSView *m_mouseDownView;    bool m_sendingEventToSubview;    int m_activationEventNumber;#endif};} // namespace WebCore#endif // EventHandler_h

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -