5ee3daec6661690cdfdb01d70178b89f06094e4a
[WebKit-https.git] / WebCore / platform / qt / FrameQt.cpp
1 /*
2  * Copyright (C) 2006 Dirk Mueller <mueller@kde.org>
3  * Copyright (C) 2006 Zack Rusin <zack@kde.org>
4  * Copyright (C) 2006 George Staikos <staikos@kde.org>
5  * Copyright (C) 2006 Simon Hausmann <hausmann@kde.org>
6  * Copyright (C) 2006 Rob Buis <buis@kde.org>
7  * Copyright (C) 2006 Nikolas Zimmermann <zimmermann@kde.org>
8  *
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  *
20  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
21  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
28  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32
33 #include "config.h"
34 #include "FrameQt.h"
35
36 #include "Element.h"
37 #include "RenderObject.h"
38 #include "RenderWidget.h"
39 #include "RenderLayer.h"
40 #include "Page.h"
41 #include "Document.h"
42 #include "HTMLElement.h"
43 #include "DOMWindow.h"
44 #include "FrameLoadRequest.h"
45 #include "FrameLoaderClientQt.h"
46 #include "DOMImplementation.h"
47 #include "ResourceHandleInternal.h"
48 #include "Document.h"
49 #include "Settings.h"
50 #include "Plugin.h"
51 #include "FrameView.h"
52 #include "FramePrivate.h"
53 #include "GraphicsContext.h"
54 #include "HTMLDocument.h"
55 #include "ResourceHandle.h"
56 #include "FrameLoader.h"
57 #include "PlatformMouseEvent.h"
58 #include "PlatformKeyboardEvent.h"
59 #include "PlatformWheelEvent.h"
60 #include "MouseEventWithHitTestResults.h"
61 #include "SelectionController.h"
62 #include "kjs_proxy.h"
63 #include "TypingCommand.h"
64 #include "JSLock.h"
65 #include "kjs_window.h"
66 #include "runtime_root.h"
67 #include <QScrollArea>
68
69 #define notImplemented() do { fprintf(stderr, "FIXME: UNIMPLEMENTED: %s:%d (%s)\n", \
70            __FILE__, __LINE__, __FUNCTION__); } while(0)
71
72 namespace WebCore {
73
74 // FIXME: Turned this off to fix buildbot. This function be either deleted or used.
75 #if 0
76 static void doScroll(const RenderObject* r, bool isHorizontal, int multiplier)
77 {
78     // FIXME: The scrolling done here should be done in the default handlers
79     // of the elements rather than here in the part.
80     if (!r)
81         return;
82
83     //broken since it calls scroll on scrollbars
84     //and we have none now
85     //r->scroll(direction, KWQScrollWheel, multiplier);
86     if (!r->layer())
87         return;
88
89     int x = r->layer()->scrollXOffset();
90     int y = r->layer()->scrollYOffset();
91     if (isHorizontal)
92         x += multiplier;
93     else
94         y += multiplier;
95
96     r->layer()->scrollToOffset(x, y, true, true);
97 }
98 #endif
99
100 FrameQt::FrameQt(Page* page, HTMLFrameOwnerElement* ownerElement,
101                  FrameQtClient* frameClient, FrameLoaderClient* frameLoader)
102     : Frame(page, ownerElement, frameLoader)
103     , m_bindingRoot(0)
104 {
105     Settings* settings = new Settings;
106     settings->setAutoLoadImages(true);
107     settings->setMinFontSize(5);
108     settings->setMinLogicalFontSize(5);
109     settings->setShouldPrintBackgrounds(true);
110     settings->setIsJavaScriptEnabled(true);
111
112     settings->setMediumFixedFontSize(14);
113     settings->setMediumFontSize(14);
114     settings->setSerifFontName("Times New Roman");
115     settings->setSansSerifFontName("Arial");
116     settings->setFixedFontName("Courier");
117     settings->setStdFontName("Arial");
118
119     setSettings(settings);
120
121     m_client = frameClient;
122     m_client->setFrame(this);
123 }
124
125 FrameQt::~FrameQt()
126 {
127     setView(0);
128     loader()->clearRecordedFormValues();
129
130     loader()->cancelAndClear();
131 }
132
133 bool FrameQt::passMouseDownEventToWidget(Widget*)
134 {
135     notImplemented();
136     return false;
137 }
138
139 bool FrameQt::isLoadTypeReload()
140 {
141     notImplemented();
142     return false;
143 }
144
145 Range* FrameQt::markedTextRange() const
146 {
147     // FIXME: Handle selections.
148     return 0;
149 }
150
151 String FrameQt::mimeTypeForFileName(const String&) const
152 {
153     notImplemented();
154     return String();
155 }
156
157 void FrameQt::scheduleClose()
158 {
159     // no-op
160 }
161
162 void FrameQt::unfocusWindow()
163 {
164     if (!view())
165         return;
166
167     if (!tree()->parent())
168         view()->qwidget()->clearFocus();
169 }
170
171 void FrameQt::focusWindow()
172 {
173     if (!view())
174         return;
175
176     if (!tree()->parent())
177         view()->qwidget()->setFocus();
178 }
179
180 KJS::Bindings::Instance* FrameQt::getEmbedInstanceForWidget(Widget*)
181 {
182     notImplemented();
183     return 0;
184 }
185
186 KJS::Bindings::Instance* FrameQt::getObjectInstanceForWidget(Widget*)
187 {
188     notImplemented();
189     return 0;
190 }
191
192 KJS::Bindings::Instance* FrameQt::getAppletInstanceForWidget(Widget*)
193 {
194     notImplemented();
195     return 0;
196 }
197
198 void FrameQt::issueCutCommand()
199 {
200     notImplemented();
201 }
202
203 void FrameQt::issueCopyCommand()
204 {
205     notImplemented();
206 }
207
208 void FrameQt::issuePasteCommand()
209 {
210     notImplemented();
211 }
212
213 void FrameQt::issuePasteAndMatchStyleCommand()
214 {
215     notImplemented();
216 }
217
218 void FrameQt::issueTransposeCommand()
219 {
220     notImplemented();
221 }
222
223 void FrameQt::respondToChangedSelection(const Selection& oldSelection, bool closeTyping)
224 {
225     // TODO: If we want continous spell checking, we need to implement this.
226 }
227
228 bool FrameQt::shouldChangeSelection(const Selection& oldSelection, const Selection& newSelection, EAffinity affinity, bool stillSelecting) const
229 {
230     // no-op
231     return true;
232 }
233
234 void FrameQt::print()
235 {
236     notImplemented();
237 }
238
239 bool FrameQt::shouldInterruptJavaScript()
240 {
241     notImplemented();
242     return false;
243 }
244
245 bool FrameQt::keyEvent(const PlatformKeyboardEvent& keyEvent)
246 {
247     bool result;
248
249     // Check for cases where we are too early for events -- possible unmatched key up
250     // from pressing return in the location bar.
251     Document* doc = document();
252     if (!doc)
253         return false;
254
255     Node* node = doc->focusedNode();
256     if (!node) {
257         if (doc->isHTMLDocument())
258             node = doc->body();
259         else
260             node = doc->documentElement();
261
262         if (!node)
263             return false;
264     }
265
266 #ifdef MULTIPLE_FORM_SUBMISSION_PROTECTION
267     if (!keyEvent.isKeyUp())
268         loader()->resetMultipleFormSubmissionProtection();
269 #endif
270     
271     result = !EventTargetNodeCast(node)->dispatchKeyEvent(keyEvent);
272
273     // FIXME: FrameMac has a keyDown/keyPress hack here which we are not copying.
274     return result;
275 }
276
277 void FrameQt::setFrameGeometry(const IntRect& r)
278 {
279     setFrameGeometry(QRect(r));
280 }
281
282 FrameQtClient* FrameQt::client() const
283 {
284     return m_client;
285 }
286
287 void FrameQt::createNewWindow(const FrameLoadRequest& request, const WindowFeatures& args, Frame*& frame)
288 {
289     notImplemented();
290 }
291
292 void FrameQt::goBackOrForward(int)
293 {
294     notImplemented();
295 }
296
297 KURL FrameQt::historyURL(int distance)
298 {
299     notImplemented();
300     return KURL();
301 }
302
303 void FrameQt::runJavaScriptAlert(const String& message) 
304 {
305     notImplemented();
306
307  
308 bool FrameQt::runJavaScriptConfirm(const String& message) 
309 {
310     notImplemented();
311 }
312
313 bool FrameQt::runJavaScriptPrompt(const String& message, const String& defaultValue, String& result) 
314 {
315     notImplemented();
316 }
317
318 KJS::Bindings::RootObject* FrameQt::bindingRootObject() 
319 {
320     ASSERT(javaScriptEnabled()); 
321     notImplemented();
322     return 0;
323 }
324
325 }
326 // vim: ts=4 sw=4 et