70e6e7cbddc51bde2811d564acfb39fc46c62eda
[WebKit-https.git] / Source / WebKit2 / UIProcess / win / WebView.h
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 <ShlObj.h>
34 #include <WebCore/COMPtr.h>
35 #include <WebCore/DragActions.h>
36 #include <WebCore/DragData.h>
37 #include <WebCore/WindowMessageListener.h>
38 #include <wtf/Forward.h>
39 #include <wtf/PassRefPtr.h>
40 #include <wtf/RefPtr.h>
41
42 interface IDropTargetHelper;
43
44 namespace WebKit {
45
46 class DrawingAreaProxy;
47
48 class WebView : public APIObject, public PageClient, WebCore::WindowMessageListener, public IDropTarget {
49 public:
50     static PassRefPtr<WebView> create(RECT rect, WebContext* context, WebPageGroup* pageGroup, HWND parentWindow)
51     {
52         RefPtr<WebView> webView = adoptRef(new WebView(rect, context, pageGroup, parentWindow));
53         webView->initialize();
54         return webView;
55     }
56     ~WebView();
57
58     HWND window() const { return m_window; }
59     void setParentWindow(HWND);
60     void windowAncestryDidChange();
61     void setIsInWindow(bool);
62     void setOverrideCursor(HCURSOR);
63     void setInitialFocus(bool forward);
64     void setFindIndicatorCallback(WKViewFindIndicatorCallback, void*);
65     WKViewFindIndicatorCallback getFindIndicatorCallback(void**);
66     void initialize();
67
68     // IUnknown
69     virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
70     virtual ULONG STDMETHODCALLTYPE AddRef(void);
71     virtual ULONG STDMETHODCALLTYPE Release(void);
72
73     // IDropTarget
74     virtual HRESULT STDMETHODCALLTYPE DragEnter(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect);
75     virtual HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState, POINTL pt, DWORD* pdwEffect);
76     virtual HRESULT STDMETHODCALLTYPE DragLeave();
77     virtual HRESULT STDMETHODCALLTYPE Drop(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect);
78
79     WebPageProxy* page() const { return m_page.get(); }
80
81 private:
82     WebView(RECT, WebContext*, WebPageGroup*, HWND parentWindow);
83
84     virtual Type type() const { return TypeView; }
85
86     static bool registerWebViewWindowClass();
87     static LRESULT CALLBACK WebViewWndProc(HWND, UINT, WPARAM, LPARAM);
88     LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
89
90     void setWasActivatedByMouseEvent(bool flag) { m_wasActivatedByMouseEvent = flag; }
91     LRESULT onMouseEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
92     LRESULT onWheelEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
93     LRESULT onKeyEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
94     LRESULT onPaintEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
95     LRESULT onPrintClientEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
96     LRESULT onSizeEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
97     LRESULT onWindowPositionChangedEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
98     LRESULT onSetFocusEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
99     LRESULT onKillFocusEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
100     LRESULT onTimerEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
101     LRESULT onShowWindowEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
102     LRESULT onSetCursor(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
103     bool onIMEStartComposition();
104     bool onIMEComposition(LPARAM);
105     bool onIMEEndComposition();
106     LRESULT onIMERequest(WPARAM, LPARAM);
107     bool onIMESelect(WPARAM, LPARAM);
108     bool onIMESetContext(WPARAM, LPARAM);
109     void resetIME();
110     void setInputMethodState(bool);
111     HIMC getIMMContext();
112     void prepareCandidateWindow(HIMC);
113     LRESULT onIMERequestCharPosition(IMECHARPOSITION*);
114     LRESULT onIMERequestReconvertString(RECONVERTSTRING*);
115
116     void updateActiveState();
117     void updateActiveStateSoon();
118
119     void initializeToolTipWindow();
120
121     void startTrackingMouseLeave();
122     void stopTrackingMouseLeave();
123
124     void close();
125
126     HCURSOR cursorToShow() const;
127     void updateNativeCursor();
128
129     // PageClient
130     virtual PassOwnPtr<DrawingAreaProxy> createDrawingAreaProxy();
131     virtual void setViewNeedsDisplay(const WebCore::IntRect&);
132     virtual void displayView();
133     virtual void scrollView(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset);
134     
135     virtual WebCore::IntSize viewSize();
136     virtual bool isViewWindowActive();
137     virtual bool isViewFocused();
138     virtual bool isViewVisible();
139     virtual bool isViewInWindow();
140     virtual void processDidCrash();
141     virtual void didRelaunchProcess();
142     virtual void pageClosed();
143     virtual void takeFocus(bool direction);
144     virtual void toolTipChanged(const WTF::String&, const WTF::String&);
145     virtual void setCursor(const WebCore::Cursor&);
146     virtual void setViewportArguments(const WebCore::ViewportArguments&);
147     virtual void registerEditCommand(PassRefPtr<WebEditCommandProxy>, WebPageProxy::UndoOrRedo);
148     virtual void clearAllEditCommands();
149     virtual void setEditCommandState(const WTF::String&, bool, int);
150     virtual WebCore::FloatRect convertToDeviceSpace(const WebCore::FloatRect&);
151     virtual WebCore::FloatRect convertToUserSpace(const WebCore::FloatRect&);
152     virtual void didNotHandleKeyEvent(const NativeWebKeyboardEvent&);
153     virtual void compositionSelectionChanged(bool);
154     virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy(WebPageProxy*);
155     virtual PassRefPtr<WebContextMenuProxy> createContextMenuProxy(WebPageProxy*);
156     virtual void setFindIndicator(PassRefPtr<FindIndicator>, bool fadeOut);
157
158 #if USE(ACCELERATED_COMPOSITING)
159     virtual void pageDidEnterAcceleratedCompositing();
160     virtual void pageDidLeaveAcceleratedCompositing();
161     void switchToDrawingAreaTypeIfNecessary(DrawingAreaInfo::Type);
162 #endif
163
164     void didCommitLoadForMainFrame(bool useCustomRepresentation);
165     void didFinishLoadingDataForCustomRepresentation(const CoreIPC::DataReference&);
166     virtual double customRepresentationZoomFactor();
167     virtual void setCustomRepresentationZoomFactor(double);
168     WebCore::DragOperation keyStateToDragOperation(DWORD grfKeyState) const;
169
170     virtual HWND nativeWindow();
171
172     // WebCore::WindowMessageListener
173     virtual void windowReceivedMessage(HWND, UINT message, WPARAM, LPARAM);
174
175     HWND m_window;
176     HWND m_topLevelParentWindow;
177     HWND m_toolTipWindow;
178
179     HCURSOR m_lastCursorSet;
180     HCURSOR m_webCoreCursor;
181     HCURSOR m_overrideCursor;
182
183     bool m_isInWindow;
184     bool m_isVisible;
185     bool m_wasActivatedByMouseEvent;
186     bool m_trackingMouseLeave;
187     bool m_isBeingDestroyed;
188
189     RefPtr<WebPageProxy> m_page;
190
191     unsigned m_inIMEComposition;
192
193     WKViewFindIndicatorCallback m_findIndicatorCallback;
194     void* m_findIndicatorCallbackContext;
195
196     COMPtr<IDataObject> m_dragData;
197     COMPtr<IDropTargetHelper> m_dropTargetHelper;
198     // FIXME: This variable is part of a workaround. The drop effect (pdwEffect) passed to Drop is incorrect. 
199     // We set this variable in DragEnter and DragOver so that it can be used in Drop to set the correct drop effect. 
200     // Thus, on return from DoDragDrop we have the correct pdwEffect for the drag-and-drop operation.
201     // (see https://bugs.webkit.org/show_bug.cgi?id=29264)
202     DWORD m_lastDropEffect;
203 };
204
205 } // namespace WebKit
206
207 #endif // WebView_h