5499ce4078d849ed65bbf99853668fed1ea61f62
[WebKit-https.git] / WebKitTools / Spinneret / Spinneret / WebView.cpp
1 /*
2  * Copyright (C) 2006 Apple Computer, 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 COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "stdafx.h"
27 #include "config.h"
28
29 #include "WebView.h"
30 #include "Resource.h"
31
32 #include "FrameWin.h"
33 #include "FrameView.h"
34 #include "Page.h"
35 #include "render_frames.h"
36 #include "GraphicsContext.h"
37
38
39 using namespace WebCore;
40
41 namespace WebKit {
42
43 // FIXME: we need to hang a pointer off the HWND
44 WebView* gSharedWebViewHack = 0;
45
46 class WebView::WebViewPrivate {
47 public:
48     WebViewPrivate() {}
49     ~WebViewPrivate()
50     {
51         delete frame;
52     }
53
54     FrameWin* frame;
55     HWND windowHandle;
56 };
57
58 const LPCWSTR kWebViewWindowClassName = L"WebViewWindowClass";
59
60 LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
61
62 static ATOM registerWebViewWithInstance(HINSTANCE hInstance)
63 {
64     static bool haveRegisteredWindowClass = false;
65     if (haveRegisteredWindowClass)
66         return true;
67
68     WNDCLASSEX wcex;
69
70     wcex.cbSize = sizeof(WNDCLASSEX);
71
72     wcex.style          = CS_HREDRAW | CS_VREDRAW; // CS_DBLCLKS?
73     wcex.lpfnWndProc    = WndProc;
74     wcex.cbClsExtra     = 0;
75     wcex.cbWndExtra     = 0;
76     wcex.hInstance      = hInstance;
77     wcex.hIcon          = 0;
78     wcex.hCursor        = LoadCursor(0, IDC_ARROW);
79     wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
80     wcex.lpszMenuName   = 0;
81     wcex.lpszClassName  = kWebViewWindowClassName;
82     wcex.hIconSm        = 0;
83
84     return RegisterClassEx(&wcex);
85 }
86
87 // FIXME: This should eventually just use the DLL instance, I think.
88 WebView* WebView::createWebView(HINSTANCE hInstance, HWND parent)
89 {
90    registerWebViewWithInstance(hInstance);
91
92    HWND hWnd = CreateWindow(kWebViewWindowClassName, 0, WS_CHILD | WS_BORDER,
93        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, parent, 0, hInstance, 0);
94    
95    if (!hWnd)
96       return 0;
97
98    gSharedWebViewHack = new WebView(hWnd);
99    return gSharedWebViewHack;
100 }
101
102 WebView::WebView(HWND hWnd)
103 {
104     d = new WebViewPrivate();
105     d->windowHandle = hWnd;
106
107     Page *page = new Page();
108     d->frame = new FrameWin(page, 0);
109     FrameView *frameView = new FrameView(d->frame);
110     d->frame->setView(frameView);
111
112     d->frame->begin();
113     d->frame->write("<img src=\"data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAwAAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFzByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSpa/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJlZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uisF81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PHhhx4dbgYKAAA7\" alt=\"Larry\"><div style=\"border: 1px black\">foo</div><ul><li>foo<li>bar<li>baz</ul>");
114     d->frame->end();
115 }
116
117 WebView::~WebView()
118 {
119     delete d;
120 }
121
122 void WebView::drawRect(const PAINTSTRUCT& ps)
123 {
124     GraphicsContext context(ps.hdc);
125     d->frame->paint(&context, ps.rcPaint);
126 }
127
128 HWND WebView::windowHandle()
129 {
130     return d->windowHandle;
131 }
132
133 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
134 {
135     int wmId, wmEvent;
136     HDC hdc;
137
138     switch (message)
139     {
140     case WM_COMMAND:
141         wmId    = LOWORD(wParam);
142         wmEvent = HIWORD(wParam);
143         // Parse the menu selections:
144         switch (wmId)
145         {
146         case IDM_EXIT:
147             DestroyWindow(hWnd);
148             break;
149         default:
150             return DefWindowProc(hWnd, message, wParam, lParam);
151         }
152         break;
153     case WM_PAINT:
154         PAINTSTRUCT ps;
155         hdc = BeginPaint(hWnd, &ps);
156         // TODO: Add any drawing code here...
157         gSharedWebViewHack->drawRect(ps);
158         EndPaint(hWnd, &ps);
159         break;
160     case WM_DESTROY:
161         // Do nothing?
162         break;
163     default:
164         return DefWindowProc(hWnd, message, wParam, lParam);
165     }
166     return 0;
167 }
168
169
170 };