2006-03-06 Eric Seidel <eseidel@apple.com>
[WebKit-https.git] / WebKitTools / Spinneret / Spinneret / WebFrame.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 "WebFrame.h"
30 #include "WebView.h"
31
32 #include "FrameView.h"
33 #include "FrameWin.h"
34 #include "GraphicsContext.h"
35 #include "Page.h"
36 #include "render_frames.h"
37 #include "cairo.h"
38 #include "cairo-win32.h"
39
40 #include <io.h>
41 #include <fcntl.h>
42 #include <direct.h>
43
44 using namespace WebCore;
45
46 namespace WebKit {
47
48 class WebFrame::WebFramePrivate {
49 public:
50     WebFramePrivate() { }
51     ~WebFramePrivate() { }
52
53     Frame* frame;
54     FrameView* frameView;
55     WebView* webView;
56 };
57
58 WebFrame::WebFrame(char* name, WebView* view)
59 : d(new WebFrame::WebFramePrivate)
60 {
61     d->webView = view;
62     Page *page = new Page();
63     d->frame = new FrameWin(page, 0);
64     d->frameView = new FrameView(d->frame);
65     d->frame->setView(d->frameView);
66     d->frameView->setWindowHandle(view->windowHandle());
67 }
68
69 void WebFrame::loadFilePath(char* path)
70 {
71     char URL[2048];
72     strcpy(URL, "file://localhost/");
73     strncat(URL, path, 2020);
74
75     d->frame->didOpenURL(URL);
76     d->frame->begin(URL);
77     HANDLE fileHandle = CreateFileA(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
78      
79     bool result = false;
80     DWORD bytesRead = 0;
81     
82     do {
83       const int bufferSize = 8193;
84       char buffer[bufferSize];
85       result = ReadFile(fileHandle, &buffer, bufferSize - 1, &bytesRead, NULL); 
86       buffer[bytesRead] = '\0';
87       d->frame->write(buffer);
88       // Check for end of file. 
89     } while (result && bytesRead);
90
91     CloseHandle(fileHandle);
92     
93     d->frame->end();
94 }
95
96 void WebFrame::loadHTMLString(char *html, char *baseURL)
97 {
98     d->frame->begin();
99     d->frame->write(html);
100     d->frame->end();
101 }
102
103 void WebFrame::paint()
104 {
105     d->frameView->layout();
106
107     PAINTSTRUCT ps;
108     HDC hdc = BeginPaint(d->webView->windowHandle(), &ps);   
109     cairo_surface_t* finalSurface = cairo_win32_surface_create(hdc);
110     cairo_surface_t* surface = cairo_surface_create_similar(finalSurface,
111                                                             CAIRO_CONTENT_COLOR_ALPHA,
112                                                             ps.rcPaint.right, ps.rcPaint.bottom);
113
114     cairo_t* context = cairo_create(surface);
115     GraphicsContext gc(context);
116     
117     d->frame->paint(&gc, ps.rcPaint);
118
119     cairo_destroy(context);
120     context = cairo_create(finalSurface);
121     cairo_set_operator(context, CAIRO_OPERATOR_SOURCE);
122     cairo_set_source_surface(context, surface, 0, 0);
123     cairo_rectangle(context, 0, 0, ps.rcPaint.right, ps.rcPaint.bottom);
124     cairo_fill(context);
125     cairo_destroy(context);
126
127     cairo_surface_destroy(surface);
128     cairo_surface_destroy(finalSurface);
129
130     EndPaint(d->webView->windowHandle(), &ps);
131 }
132
133 WebCore::Frame* WebFrame::impl()
134 {
135     return d->frame;
136 }
137
138 WebCore::FrameView* WebFrame::viewImpl()
139 {
140     return d->frameView;
141 }
142
143 }
144