/*
* Copyright (C) 2010 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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 WebView_h
#define WebView_h
#include "APIObject.h"
#include "PageClient.h"
#include "WKView.h"
#include "WebPageProxy.h"
#include "WebUndoClient.h"
#include <ShlObj.h>
#include <WebCore/COMPtr.h>
#include <WebCore/DragActions.h>
#include <WebCore/DragData.h>
#include <WebCore/WindowMessageListener.h>
#include <wtf/Forward.h>
#include <wtf/PassRefPtr.h>
#include <wtf/RefPtr.h>
interface IDropTargetHelper;
namespace WebKit {
class DrawingAreaProxy;
class WebView : public APIObject, public PageClient, WebCore::WindowMessageListener, public IDropTarget {
public:
static PassRefPtr<WebView> create(RECT rect, WebContext* context, WebPageGroup* pageGroup, HWND parentWindow)
{
RefPtr<WebView> webView = adoptRef(new WebView(rect, context, pageGroup, parentWindow));
webView->initialize();
return webView;
}
~WebView();
HWND window() const { return m_window; }
void setParentWindow(HWND);
void windowAncestryDidChange();
void setIsInWindow(bool);
void setIsVisible(bool);
void setOverrideCursor(HCURSOR);
void setInitialFocus(bool forward);
void setScrollOffsetOnNextResize(const WebCore::IntSize&);
void setFindIndicatorCallback(WKViewFindIndicatorCallback, void*);
WKViewFindIndicatorCallback getFindIndicatorCallback(void**);
void initialize();
void initializeUndoClient(const WKViewUndoClient*);
void reapplyEditCommand(WebEditCommandProxy*);
void unapplyEditCommand(WebEditCommandProxy*);
// IUnknown
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
virtual ULONG STDMETHODCALLTYPE AddRef(void);
virtual ULONG STDMETHODCALLTYPE Release(void);
// IDropTarget
virtual HRESULT STDMETHODCALLTYPE DragEnter(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect);
virtual HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState, POINTL pt, DWORD* pdwEffect);
virtual HRESULT STDMETHODCALLTYPE DragLeave();
virtual HRESULT STDMETHODCALLTYPE Drop(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect);
WebPageProxy* page() const { return m_page.get(); }
private:
WebView(RECT, WebContext*, WebPageGroup*, HWND parentWindow);
virtual Type type() const { return TypeView; }
static bool registerWebViewWindowClass();
static LRESULT CALLBACK WebViewWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT onMouseEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onWheelEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onHorizontalScroll(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onVerticalScroll(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onGestureNotify(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onGesture(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onKeyEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onPaintEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onPrintClientEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onSizeEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onWindowPositionChangedEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onSetFocusEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onKillFocusEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onTimerEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onShowWindowEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
LRESULT onSetCursor(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
void paint(HDC, const WebCore::IntRect& dirtyRect);
void setWasActivatedByMouseEvent(bool flag) { m_wasActivatedByMouseEvent = flag; }
bool onIMEStartComposition();
bool onIMEComposition(LPARAM);
bool onIMEEndComposition();
LRESULT onIMERequest(WPARAM, LPARAM);
bool onIMESelect(WPARAM, LPARAM);
bool onIMESetContext(WPARAM, LPARAM);
void resetIME();
void setInputMethodState(bool);
HIMC getIMMContext();
void prepareCandidateWindow(HIMC);
LRESULT onIMERequestCharPosition(IMECHARPOSITION*);
LRESULT onIMERequestReconvertString(RECONVERTSTRING*);
void updateActiveState();
void updateActiveStateSoon();
void initializeToolTipWindow();
void startTrackingMouseLeave();
void stopTrackingMouseLeave();
bool shouldInitializeTrackPointHack();
void close();
HCURSOR cursorToShow() const;
void updateNativeCursor();
// PageClient
virtual PassOwnPtr<DrawingAreaProxy> createDrawingAreaProxy();
virtual void setViewNeedsDisplay(const WebCore::IntRect&);
virtual void displayView();
virtual void scrollView(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset);
virtual void flashBackingStoreUpdates(const Vector<WebCore::IntRect>& updateRects);
virtual float userSpaceScaleFactor() const { return 1; }
virtual WebCore::IntSize viewSize();
virtual bool isViewWindowActive();
virtual bool isViewFocused();
virtual bool isViewVisible();
virtual bool isViewInWindow();
virtual void processDidCrash();
virtual void didRelaunchProcess();
virtual void pageClosed();
virtual void toolTipChanged(const WTF::String&, const WTF::String&);
virtual void setCursor(const WebCore::Cursor&);
virtual void setViewportArguments(const WebCore::ViewportArguments&);
virtual void registerEditCommand(PassRefPtr<WebEditCommandProxy>, WebPageProxy::UndoOrRedo);
virtual void clearAllEditCommands();
virtual bool canUndoRedo(WebPageProxy::UndoOrRedo);
virtual void executeUndoRedo(WebPageProxy::UndoOrRedo);
virtual WebCore::FloatRect convertToDeviceSpace(const WebCore::FloatRect&);
virtual WebCore::FloatRect convertToUserSpace(const WebCore::FloatRect&);
virtual WebCore::IntRect windowToScreen(const WebCore::IntRect&);
virtual void doneWithKeyEvent(const NativeWebKeyboardEvent&, bool wasEventHandled);
virtual void compositionSelectionChanged(bool);
virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy(WebPageProxy*);
virtual PassRefPtr<WebContextMenuProxy> createContextMenuProxy(WebPageProxy*);
virtual void setFindIndicator(PassRefPtr<FindIndicator>, bool fadeOut);
#if USE(ACCELERATED_COMPOSITING)
virtual void enterAcceleratedCompositingMode(const LayerTreeContext&);
virtual void exitAcceleratedCompositingMode();
#endif
void didCommitLoadForMainFrame(bool useCustomRepresentation);
void didFinishLoadingDataForCustomRepresentation(const String& suggestedFilename, const CoreIPC::DataReference&);
virtual double customRepresentationZoomFactor();
virtual void setCustomRepresentationZoomFactor(double);
WebCore::DragOperation keyStateToDragOperation(DWORD grfKeyState) const;
virtual void didChangeScrollbarsForMainFrame() const;
virtual void findStringInCustomRepresentation(const String&, FindOptions, unsigned maxMatchCount);
virtual void countStringMatchesInCustomRepresentation(const String&, FindOptions, unsigned maxMatchCount);
virtual HWND nativeWindow();
virtual void setGestureReachedScrollingLimit(bool limitReached) { m_gestureReachedScrollingLimit = limitReached; }
// WebCore::WindowMessageListener
virtual void windowReceivedMessage(HWND, UINT message, WPARAM, LPARAM);
HWND m_window;
HWND m_topLevelParentWindow;
HWND m_toolTipWindow;
WebCore::IntSize m_nextResizeScrollOffset;
HCURSOR m_lastCursorSet;
HCURSOR m_webCoreCursor;
HCURSOR m_overrideCursor;
bool m_isInWindow;
bool m_isVisible;
bool m_wasActivatedByMouseEvent;
bool m_trackingMouseLeave;
bool m_isBeingDestroyed;
RefPtr<WebPageProxy> m_page;
unsigned m_inIMEComposition;
WebUndoClient m_undoClient;
WKViewFindIndicatorCallback m_findIndicatorCallback;
void* m_findIndicatorCallbackContext;
COMPtr<IDataObject> m_dragData;
COMPtr<IDropTargetHelper> m_dropTargetHelper;
// FIXME: This variable is part of a workaround. The drop effect (pdwEffect) passed to Drop is incorrect.
// We set this variable in DragEnter and DragOver so that it can be used in Drop to set the correct drop effect.
// Thus, on return from DoDragDrop we have the correct pdwEffect for the drag-and-drop operation.
// (see https://bugs.webkit.org/show_bug.cgi?id=29264)
DWORD m_lastDropEffect;
int m_lastPanX;
int m_lastPanY;
int m_overPanY;
bool m_gestureReachedScrollingLimit;
};
} // namespace WebKit
#endif // WebView_h