28aedd68cb4dc3c7fe0d93394ee48c94d271408a
[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     LRESULT onMouseEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
91     LRESULT onWheelEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
92     LRESULT onKeyEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
93     LRESULT onPaintEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
94     LRESULT onPrintClientEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
95     LRESULT onSizeEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
96     LRESULT onWindowPositionChangedEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
97     LRESULT onSetFocusEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
98     LRESULT onKillFocusEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
99     LRESULT onTimerEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
100     LRESULT onShowWindowEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
101     LRESULT onSetCursor(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
102
103     void paint(HDC, const WebCore::IntRect& dirtyRect);
104     void setWasActivatedByMouseEvent(bool flag) { m_wasActivatedByMouseEvent = flag; }
105     bool onIMEStartComposition();
106     bool onIMEComposition(LPARAM);
107     bool onIMEEndComposition();
108     LRESULT onIMERequest(WPARAM, LPARAM);
109     bool onIMESelect(WPARAM, LPARAM);
110     bool onIMESetContext(WPARAM, LPARAM);
111     void resetIME();
112     void setInputMethodState(bool);
113     HIMC getIMMContext();
114     void prepareCandidateWindow(HIMC);
115     LRESULT onIMERequestCharPosition(IMECHARPOSITION*);
116     LRESULT onIMERequestReconvertString(RECONVERTSTRING*);
117
118     void updateActiveState();
119     void updateActiveStateSoon();
120
121     void initializeToolTipWindow();
122
123     void startTrackingMouseLeave();
124     void stopTrackingMouseLeave();
125
126     void close();
127
128     HCURSOR cursorToShow() const;
129     void updateNativeCursor();
130
131     // PageClient
132     virtual PassOwnPtr<DrawingAreaProxy> createDrawingAreaProxy();
133     virtual void setViewNeedsDisplay(const WebCore::IntRect&);
134     virtual void displayView();
135     virtual void scrollView(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset);
136     virtual void flashBackingStoreUpdates(const Vector<WebCore::IntRect>& updateRects);
137     
138     virtual WebCore::IntSize viewSize();
139     virtual bool isViewWindowActive();
140     virtual bool isViewFocused();
141     virtual bool isViewVisible();
142     virtual bool isViewInWindow();
143     virtual void processDidCrash();
144     virtual void didRelaunchProcess();
145     virtual void pageClosed();
146     virtual void takeFocus(bool direction);
147     virtual void toolTipChanged(const WTF::String&, const WTF::String&);
148     virtual void setCursor(const WebCore::Cursor&);
149     virtual void setViewportArguments(const WebCore::ViewportArguments&);
150     virtual void registerEditCommand(PassRefPtr<WebEditCommandProxy>, WebPageProxy::UndoOrRedo);
151     virtual void clearAllEditCommands();
152     virtual WebCore::FloatRect convertToDeviceSpace(const WebCore::FloatRect&);
153     virtual WebCore::FloatRect convertToUserSpace(const WebCore::FloatRect&);
154     virtual void doneWithKeyEvent(const NativeWebKeyboardEvent&, bool wasEventHandled);
155     virtual void compositionSelectionChanged(bool);
156     virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy(WebPageProxy*);
157     virtual PassRefPtr<WebContextMenuProxy> createContextMenuProxy(WebPageProxy*);
158     virtual void setFindIndicator(PassRefPtr<FindIndicator>, bool fadeOut);
159
160 #if USE(ACCELERATED_COMPOSITING)
161     virtual void enterAcceleratedCompositingMode(const LayerTreeContext&);
162     virtual void exitAcceleratedCompositingMode();
163 #endif
164
165     void didCommitLoadForMainFrame(bool useCustomRepresentation);
166     void didFinishLoadingDataForCustomRepresentation(const String& suggestedFilename, const CoreIPC::DataReference&);
167     virtual double customRepresentationZoomFactor();
168     virtual void setCustomRepresentationZoomFactor(double);
169     WebCore::DragOperation keyStateToDragOperation(DWORD grfKeyState) const;
170     virtual void didChangeScrollbarsForMainFrame() const;
171
172     virtual HWND nativeWindow();
173
174     // WebCore::WindowMessageListener
175     virtual void windowReceivedMessage(HWND, UINT message, WPARAM, LPARAM);
176
177     HWND m_window;
178     HWND m_topLevelParentWindow;
179     HWND m_toolTipWindow;
180
181     HCURSOR m_lastCursorSet;
182     HCURSOR m_webCoreCursor;
183     HCURSOR m_overrideCursor;
184
185     bool m_isInWindow;
186     bool m_isVisible;
187     bool m_wasActivatedByMouseEvent;
188     bool m_trackingMouseLeave;
189     bool m_isBeingDestroyed;
190
191     RefPtr<WebPageProxy> m_page;
192
193     unsigned m_inIMEComposition;
194
195     WKViewFindIndicatorCallback m_findIndicatorCallback;
196     void* m_findIndicatorCallbackContext;
197
198     COMPtr<IDataObject> m_dragData;
199     COMPtr<IDropTargetHelper> m_dropTargetHelper;
200     // FIXME: This variable is part of a workaround. The drop effect (pdwEffect) passed to Drop is incorrect. 
201     // We set this variable in DragEnter and DragOver so that it can be used in Drop to set the correct drop effect. 
202     // Thus, on return from DoDragDrop we have the correct pdwEffect for the drag-and-drop operation.
203     // (see https://bugs.webkit.org/show_bug.cgi?id=29264)
204     DWORD m_lastDropEffect;
205 };
206
207 } // namespace WebKit
208
209 #endif // WebView_h