1/*
2 * Copyright (C) 2010 Patrick Gansterer <paroga@paroga.com>
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 AND ITS CONTRIBUTORS "AS IS" AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 */
24
25#ifndef WebView_h
26#define WebView_h
27
28#include "IntRect.h"
29#include <windows.h>
30#include <wtf/PassRefPtr.h>
31#include <wtf/win/GDIObject.h>
32
33namespace WTF {
34class String;
35}
36
37namespace WebCore {
38class Frame;
39class Page;
40class FrameView;
41class HTMLFrameOwnerElement;
42class URL;
43class ResourceRequest;
44}
45
46class WebView {
47public:
48    enum Features {
49        NoFeature = 0,
50        EnableDoubleBuffering = 1 << 0
51    };
52
53    WebView(HWND hwnd, unsigned features = EnableDoubleBuffering);
54    ~WebView();
55
56    static void initialize(HINSTANCE instanceHandle);
57    static void cleanup();
58
59    HWND windowHandle() const { return m_windowHandle; }
60    WebCore::Frame* frame() const { return m_frame; }
61    WebCore::Page* page() const { return m_page; }
62    WebCore::FrameView* view() const;
63
64    void load(LPCWSTR url);
65    void load(const WTF::String &url);
66    void load(const WebCore::ResourceRequest &request);
67    void reload();
68    void stop();
69
70    void frameRect(RECT* rect) const;
71
72    PassRefPtr<WebCore::Frame> createFrame(const WebCore::URL&, const WTF::String& name, WebCore::HTMLFrameOwnerElement*,
73        const WTF::String& referrer, bool allowScrolling, int marginWidth, int marginHeight, WebCore::Frame* parentFrame);
74
75    // JavaScript Dialog
76    void runJavaScriptAlert(const WTF::String& message);
77    bool runJavaScriptConfirm(const WTF::String& message);
78    bool runJavaScriptPrompt(const WTF::String& message, const WTF::String& defaultValue, WTF::String& result);
79
80private:
81    static LRESULT CALLBACK webViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
82    LRESULT wndProc(HWND, UINT, WPARAM, LPARAM);
83
84    bool handlePaint(HWND hWnd);
85    bool handleMouseEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
86    bool handleMouseWheel(HWND hWnd, WPARAM wParam, LPARAM lParam, bool isHorizontal);
87    bool handleKeyDown(WPARAM virtualKeyCode, LPARAM keyData, bool systemKeyDown);
88    bool handleKeyPress(WPARAM charCode, LPARAM keyData, bool systemKeyDown);
89    bool handleKeyUp(WPARAM virtualKeyCode, LPARAM keyData, bool systemKeyDown);
90
91    void paint(HDC hDC, const WebCore::IntRect& clipRect);
92
93    WebCore::Frame* m_frame;
94    WebCore::Page* m_page;
95    HWND m_parentWindowHandle;
96    HWND m_windowHandle;
97    bool m_enableDoubleBuffer;
98    GDIObject<HDC> m_doubleBufferDC;
99    GDIObject<HBITMAP> m_doubleBufferBitmap;
100};
101
102#endif // WebView_h
103