43ec5897cbd0e20dcc87451263fe9658c6225b6f
[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     PAINTSTRUCT ps;
106     HDC hdc = BeginPaint(d->webView->windowHandle(), &ps);   
107     cairo_surface_t* finalSurface = cairo_win32_surface_create(hdc);
108     cairo_surface_t* surface = cairo_surface_create_similar(finalSurface,
109                                                             CAIRO_CONTENT_COLOR_ALPHA,
110                                                             ps.rcPaint.right, ps.rcPaint.bottom);
111
112     cairo_t* context = cairo_create(surface);
113     GraphicsContext gc(context);
114     
115     d->frame->paint(&gc, ps.rcPaint);
116
117     cairo_destroy(context);
118     context = cairo_create(finalSurface);
119     cairo_set_operator(context, CAIRO_OPERATOR_SOURCE);
120     cairo_set_source_surface(context, surface, 0, 0);
121     cairo_rectangle(context, 0, 0, ps.rcPaint.right, ps.rcPaint.bottom);
122     cairo_fill(context);
123     cairo_destroy(context);
124
125     cairo_surface_destroy(surface);
126     cairo_surface_destroy(finalSurface);
127
128     EndPaint(d->webView->windowHandle(), &ps);
129 }
130
131 WebCore::Frame* WebFrame::impl()
132 {
133     return d->frame;
134 }
135
136 WebCore::FrameView* WebFrame::viewImpl()
137 {
138     return d->frameView;
139 }
140
141 }
142