Home | History | Annotate | Download | only in win
      1 /*
      2  * Copyright (C) 2010 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
     14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
     17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     23  * THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #ifndef WebView_h
     27 #define WebView_h
     28 
     29 #include "APIObject.h"
     30 #include "PageClient.h"
     31 #include "WKView.h"
     32 #include "WebPageProxy.h"
     33 #include "WebUndoClient.h"
     34 #include <ShlObj.h>
     35 #include <WebCore/COMPtr.h>
     36 #include <WebCore/DragActions.h>
     37 #include <WebCore/DragData.h>
     38 #include <WebCore/WindowMessageListener.h>
     39 #include <wtf/Forward.h>
     40 #include <wtf/PassRefPtr.h>
     41 #include <wtf/RefPtr.h>
     42 
     43 interface IDropTargetHelper;
     44 
     45 namespace WebKit {
     46 
     47 class DrawingAreaProxy;
     48 
     49 class WebView : public APIObject, public PageClient, WebCore::WindowMessageListener, public IDropTarget {
     50 public:
     51     static PassRefPtr<WebView> create(RECT rect, WebContext* context, WebPageGroup* pageGroup, HWND parentWindow)
     52     {
     53         RefPtr<WebView> webView = adoptRef(new WebView(rect, context, pageGroup, parentWindow));
     54         webView->initialize();
     55         return webView;
     56     }
     57     ~WebView();
     58 
     59     HWND window() const { return m_window; }
     60     void setParentWindow(HWND);
     61     void windowAncestryDidChange();
     62     void setIsInWindow(bool);
     63     void setIsVisible(bool);
     64     void setOverrideCursor(HCURSOR);
     65     void setInitialFocus(bool forward);
     66     void setScrollOffsetOnNextResize(const WebCore::IntSize&);
     67     void setFindIndicatorCallback(WKViewFindIndicatorCallback, void*);
     68     WKViewFindIndicatorCallback getFindIndicatorCallback(void**);
     69     void initialize();
     70 
     71     void initializeUndoClient(const WKViewUndoClient*);
     72     void reapplyEditCommand(WebEditCommandProxy*);
     73     void unapplyEditCommand(WebEditCommandProxy*);
     74 
     75     // IUnknown
     76     virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
     77     virtual ULONG STDMETHODCALLTYPE AddRef(void);
     78     virtual ULONG STDMETHODCALLTYPE Release(void);
     79 
     80     // IDropTarget
     81     virtual HRESULT STDMETHODCALLTYPE DragEnter(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect);
     82     virtual HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState, POINTL pt, DWORD* pdwEffect);
     83     virtual HRESULT STDMETHODCALLTYPE DragLeave();
     84     virtual HRESULT STDMETHODCALLTYPE Drop(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect);
     85 
     86     WebPageProxy* page() const { return m_page.get(); }
     87 
     88 private:
     89     WebView(RECT, WebContext*, WebPageGroup*, HWND parentWindow);
     90 
     91     virtual Type type() const { return TypeView; }
     92 
     93     static bool registerWebViewWindowClass();
     94     static LRESULT CALLBACK WebViewWndProc(HWND, UINT, WPARAM, LPARAM);
     95     LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
     96 
     97     LRESULT onMouseEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
     98     LRESULT onWheelEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
     99     LRESULT onHorizontalScroll(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
    100     LRESULT onVerticalScroll(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
    101     LRESULT onGestureNotify(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
    102     LRESULT onGesture(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
    103     LRESULT onKeyEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
    104     LRESULT onPaintEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
    105     LRESULT onPrintClientEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
    106     LRESULT onSizeEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
    107     LRESULT onWindowPositionChangedEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
    108     LRESULT onSetFocusEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
    109     LRESULT onKillFocusEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
    110     LRESULT onTimerEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
    111     LRESULT onShowWindowEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
    112     LRESULT onSetCursor(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
    113 
    114     void paint(HDC, const WebCore::IntRect& dirtyRect);
    115     void setWasActivatedByMouseEvent(bool flag) { m_wasActivatedByMouseEvent = flag; }
    116     bool onIMEStartComposition();
    117     bool onIMEComposition(LPARAM);
    118     bool onIMEEndComposition();
    119     LRESULT onIMERequest(WPARAM, LPARAM);
    120     bool onIMESelect(WPARAM, LPARAM);
    121     bool onIMESetContext(WPARAM, LPARAM);
    122     void resetIME();
    123     void setInputMethodState(bool);
    124     HIMC getIMMContext();
    125     void prepareCandidateWindow(HIMC);
    126     LRESULT onIMERequestCharPosition(IMECHARPOSITION*);
    127     LRESULT onIMERequestReconvertString(RECONVERTSTRING*);
    128 
    129     void updateActiveState();
    130     void updateActiveStateSoon();
    131 
    132     void initializeToolTipWindow();
    133 
    134     void startTrackingMouseLeave();
    135     void stopTrackingMouseLeave();
    136 
    137     bool shouldInitializeTrackPointHack();
    138 
    139     void close();
    140 
    141     HCURSOR cursorToShow() const;
    142     void updateNativeCursor();
    143 
    144     // PageClient
    145     virtual PassOwnPtr<DrawingAreaProxy> createDrawingAreaProxy();
    146     virtual void setViewNeedsDisplay(const WebCore::IntRect&);
    147     virtual void displayView();
    148     virtual void scrollView(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset);
    149     virtual void flashBackingStoreUpdates(const Vector<WebCore::IntRect>& updateRects);
    150     virtual float userSpaceScaleFactor() const { return 1; }
    151 
    152     virtual WebCore::IntSize viewSize();
    153     virtual bool isViewWindowActive();
    154     virtual bool isViewFocused();
    155     virtual bool isViewVisible();
    156     virtual bool isViewInWindow();
    157     virtual void processDidCrash();
    158     virtual void didRelaunchProcess();
    159     virtual void pageClosed();
    160     virtual void toolTipChanged(const WTF::String&, const WTF::String&);
    161     virtual void setCursor(const WebCore::Cursor&);
    162     virtual void setViewportArguments(const WebCore::ViewportArguments&);
    163     virtual void registerEditCommand(PassRefPtr<WebEditCommandProxy>, WebPageProxy::UndoOrRedo);
    164     virtual void clearAllEditCommands();
    165     virtual bool canUndoRedo(WebPageProxy::UndoOrRedo);
    166     virtual void executeUndoRedo(WebPageProxy::UndoOrRedo);
    167     virtual WebCore::FloatRect convertToDeviceSpace(const WebCore::FloatRect&);
    168     virtual WebCore::FloatRect convertToUserSpace(const WebCore::FloatRect&);
    169     virtual WebCore::IntRect windowToScreen(const WebCore::IntRect&);
    170     virtual void doneWithKeyEvent(const NativeWebKeyboardEvent&, bool wasEventHandled);
    171     virtual void compositionSelectionChanged(bool);
    172     virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy(WebPageProxy*);
    173     virtual PassRefPtr<WebContextMenuProxy> createContextMenuProxy(WebPageProxy*);
    174     virtual void setFindIndicator(PassRefPtr<FindIndicator>, bool fadeOut);
    175 
    176 #if USE(ACCELERATED_COMPOSITING)
    177     virtual void enterAcceleratedCompositingMode(const LayerTreeContext&);
    178     virtual void exitAcceleratedCompositingMode();
    179 #endif
    180 
    181     void didCommitLoadForMainFrame(bool useCustomRepresentation);
    182     void didFinishLoadingDataForCustomRepresentation(const String& suggestedFilename, const CoreIPC::DataReference&);
    183     virtual double customRepresentationZoomFactor();
    184     virtual void setCustomRepresentationZoomFactor(double);
    185     WebCore::DragOperation keyStateToDragOperation(DWORD grfKeyState) const;
    186     virtual void didChangeScrollbarsForMainFrame() const;
    187 
    188     virtual void findStringInCustomRepresentation(const String&, FindOptions, unsigned maxMatchCount);
    189     virtual void countStringMatchesInCustomRepresentation(const String&, FindOptions, unsigned maxMatchCount);
    190 
    191     virtual HWND nativeWindow();
    192 
    193     virtual void setGestureReachedScrollingLimit(bool limitReached) { m_gestureReachedScrollingLimit = limitReached; }
    194 
    195     // WebCore::WindowMessageListener
    196     virtual void windowReceivedMessage(HWND, UINT message, WPARAM, LPARAM);
    197 
    198     HWND m_window;
    199     HWND m_topLevelParentWindow;
    200     HWND m_toolTipWindow;
    201 
    202     WebCore::IntSize m_nextResizeScrollOffset;
    203 
    204     HCURSOR m_lastCursorSet;
    205     HCURSOR m_webCoreCursor;
    206     HCURSOR m_overrideCursor;
    207 
    208     bool m_isInWindow;
    209     bool m_isVisible;
    210     bool m_wasActivatedByMouseEvent;
    211     bool m_trackingMouseLeave;
    212     bool m_isBeingDestroyed;
    213 
    214     RefPtr<WebPageProxy> m_page;
    215 
    216     unsigned m_inIMEComposition;
    217 
    218     WebUndoClient m_undoClient;
    219 
    220     WKViewFindIndicatorCallback m_findIndicatorCallback;
    221     void* m_findIndicatorCallbackContext;
    222 
    223     COMPtr<IDataObject> m_dragData;
    224     COMPtr<IDropTargetHelper> m_dropTargetHelper;
    225     // FIXME: This variable is part of a workaround. The drop effect (pdwEffect) passed to Drop is incorrect.
    226     // We set this variable in DragEnter and DragOver so that it can be used in Drop to set the correct drop effect.
    227     // Thus, on return from DoDragDrop we have the correct pdwEffect for the drag-and-drop operation.
    228     // (see https://bugs.webkit.org/show_bug.cgi?id=29264)
    229     DWORD m_lastDropEffect;
    230 
    231     int m_lastPanX;
    232     int m_lastPanY;
    233 
    234     int m_overPanY;
    235 
    236     bool m_gestureReachedScrollingLimit;
    237 };
    238 
    239 } // namespace WebKit
    240 
    241 #endif // WebView_h
    242