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 "OwnPtr.h"
30#include "PassRefPtr.h"
31
32namespace WTF {
33class String;
34}
35
36namespace WebCore {
37class Frame;
38class Page;
39class FrameView;
40class HTMLFrameOwnerElement;
41class KURL;
42class ResourceRequest;
43}
44
45class WebView {
46public:
47    enum Features {
48        NoFeature = 0,
49        EnableDoubleBuffering = 1 << 0
50    };
51
52    WebView(HWND hwnd, unsigned features = EnableDoubleBuffering);
53    ~WebView();
54
55    static void initialize(HINSTANCE instanceHandle);
56    static void cleanup();
57
58    HWND windowHandle() const { return m_windowHandle; }
59    WebCore::Frame* frame() const { return m_frame; }
60    WebCore::Page* page() const { return m_page; }
61    WebCore::FrameView* view() const;
62
63    void load(LPCWSTR url);
64    void load(const WTF::String &url);
65    void load(const WebCore::ResourceRequest &request);
66    void reload();
67    void stop();
68
69    void frameRect(RECT* rect) const;
70
71    PassRefPtr<WebCore::Frame> createFrame(const WebCore::KURL&, const WTF::String&, WebCore::HTMLFrameOwnerElement*, const WTF::String&, bool, int, int);
72
73    // JavaScript Dialog
74    void runJavaScriptAlert(const WTF::String& message);
75    bool runJavaScriptConfirm(const WTF::String& message);
76    bool runJavaScriptPrompt(const WTF::String& message, const WTF::String& defaultValue, WTF::String& result);
77
78private:
79    static LRESULT CALLBACK webViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
80    LRESULT wndProc(HWND, UINT, WPARAM, LPARAM);
81
82    bool handlePaint(HWND hWnd);
83    bool handleMouseEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
84    bool handleMouseWheel(HWND hWnd, WPARAM wParam, LPARAM lParam, bool isHorizontal);
85    bool handleKeyDown(WPARAM virtualKeyCode, LPARAM keyData, bool systemKeyDown);
86    bool handleKeyPress(WPARAM charCode, LPARAM keyData, bool systemKeyDown);
87    bool handleKeyUp(WPARAM virtualKeyCode, LPARAM keyData, bool systemKeyDown);
88
89    void paint(HDC hDC, const WebCore::IntRect& clipRect);
90
91    WebCore::Frame* m_frame;
92    WebCore::Page* m_page;
93    HWND m_parentWindowHandle;
94    HWND m_windowHandle;
95    bool m_enableDoubleBuffer;
96    OwnPtr<HDC> m_doubleBufferDC;
97    OwnPtr<HBITMAP> m_doubleBufferBitmap;
98};
99
100#endif // WebView_h
101