cc41034f744c22ddd9841f3078e966dc634961ee
[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 #include "Spinneret.h"
32
33 #include "Document.h"
34 #include "FrameView.h"
35 #include "FrameWin.h"
36 #include "GraphicsContext.h"
37 #include "Page.h"
38 #include "render_frames.h"
39 #include "cairo.h"
40 #include "cairo-win32.h"
41 #include "TransferJob.h"
42
43 #include <io.h>
44 #include <fcntl.h>
45 #include <direct.h>
46
47 using namespace WebCore;
48
49 namespace WebKit {
50
51 class WebFrame::WebFramePrivate {
52 public:
53     WebFramePrivate() { }
54     ~WebFramePrivate() { }
55
56     Frame* frame;
57     FrameView* frameView;
58     WebView* webView;
59 };
60
61 WebFrame::WebFrame(char* name, WebView* view)
62 : d(new WebFrame::WebFramePrivate)
63 {
64     d->webView = view;
65     Page *page = new Page();
66     d->frame = new FrameWin(page, 0, this);
67     page->setMainFrame(d->frame);
68     d->frameView = new FrameView(d->frame);
69     d->frame->setView(d->frameView);
70     d->frameView->setWindowHandle(view->windowHandle());
71 }
72
73 void WebFrame::loadFilePath(char* path)
74 {
75     char URL[2048];
76     strcpy(URL, "file://localhost/");
77     strncat(URL, path, 2020);
78
79     d->frame->didOpenURL(URL);
80     d->frame->begin(URL);
81     HANDLE fileHandle = CreateFileA(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
82      
83     bool result = false;
84     DWORD bytesRead = 0;
85     
86     do {
87       const int bufferSize = 8193;
88       char buffer[bufferSize];
89       result = ReadFile(fileHandle, &buffer, bufferSize - 1, &bytesRead, NULL); 
90       buffer[bytesRead] = '\0';
91       d->frame->write(buffer);
92       // Check for end of file. 
93     } while (result && bytesRead);
94
95     CloseHandle(fileHandle);
96     
97     d->frame->end();
98 }
99
100 void WebFrame::loadHTMLString(char *html, char *baseURL)
101 {
102     d->frame->begin();
103     d->frame->write(html);
104     d->frame->end();
105 }
106
107 void WebFrame::openURL(const DeprecatedString& str)
108 {
109    updateLocationBar(str.ascii());
110    loadURL(str.ascii());
111 }
112
113 void WebFrame::submitForm(const String& method, const KURL& url, const FormData* submitFormData)
114 {
115     // FIXME: This is a dumb implementation, doesn't handle subframes, etc.
116     d->frame->didOpenURL(url);
117     d->frame->begin(url);
118     TransferJob* job;
119     if (method == "GET" || !submitFormData)
120         job = new TransferJob(this, method, url);
121     else
122         job = new TransferJob(this, method, url, *submitFormData);
123     job->start(d->frame->document()->docLoader());
124 }
125
126 void WebFrame::loadURL(const char* URL)
127 {
128     d->frame->didOpenURL(URL);
129     d->frame->begin(URL);
130     WebCore::TransferJob* job = new TransferJob(this, "GET", URL);
131     job->start(d->frame->document()->docLoader());
132 }
133     
134 void WebFrame::receivedData(WebCore::TransferJob*, const char* data, int length)
135 {
136     d->frame->write(data, length);
137 }
138
139 void WebFrame::receivedAllData(WebCore::TransferJob* job, WebCore::PlatformData)
140 {
141     d->frame->end();
142 }
143
144 void WebFrame::paint()
145 {
146     d->frameView->layout();
147
148     PAINTSTRUCT ps;
149     HDC hdc = BeginPaint(d->webView->windowHandle(), &ps);
150     cairo_surface_t* finalSurface = cairo_win32_surface_create(hdc);
151     cairo_surface_t* surface = cairo_surface_create_similar(finalSurface,
152                                                             CAIRO_CONTENT_COLOR_ALPHA,
153                                                             ps.rcPaint.right, ps.rcPaint.bottom);
154
155     cairo_t* context = cairo_create(surface);
156     GraphicsContext gc(context);
157     
158     IntRect documentDirtyRect = ps.rcPaint;
159     documentDirtyRect.move(d->frameView->contentsX(), d->frameView->contentsY());
160
161     // FIXME: We have to set the transform using both cairo and GDI until we use cairo for text.
162     HDC surfaceDC = cairo_win32_surface_get_dc(surface);
163     SaveDC(surfaceDC);
164     OffsetViewportOrgEx(surfaceDC, -d->frameView->contentsX(), -d->frameView->contentsY(), 0);
165     cairo_translate(context, -d->frameView->contentsX(), -d->frameView->contentsY());
166     d->frame->paint(&gc, documentDirtyRect);
167     RestoreDC(surfaceDC, -1);
168
169     cairo_destroy(context);
170     context = cairo_create(finalSurface);
171     cairo_set_operator(context, CAIRO_OPERATOR_SOURCE);
172     cairo_set_source_surface(context, surface, 0, 0);
173     cairo_rectangle(context, 0, 0, ps.rcPaint.right, ps.rcPaint.bottom);
174     cairo_fill(context);
175     cairo_destroy(context);
176
177     cairo_surface_destroy(surface);
178     cairo_surface_destroy(finalSurface);
179
180     EndPaint(d->webView->windowHandle(), &ps);
181 }
182
183 WebCore::Frame* WebFrame::impl()
184 {
185     return d->frame;
186 }
187
188 }
189