2006-12-18 Ada Chan <adachan@apple.com>
[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::unfocusWindow()
158 {
159     if (!view())
160         return;
161
162     if (!tree()->parent())
163         view()->qwidget()->clearFocus();
164 }
165
166 void FrameQt::focusWindow()
167 {
168     if (!view())
169         return;
170
171     if (!tree()->parent())
172         view()->qwidget()->setFocus();
173 }
174
175 KJS::Bindings::Instance* FrameQt::getEmbedInstanceForWidget(Widget*)
176 {
177     notImplemented();
178     return 0;
179 }
180
181 KJS::Bindings::Instance* FrameQt::getObjectInstanceForWidget(Widget*)
182 {
183     notImplemented();
184     return 0;
185 }
186
187 KJS::Bindings::Instance* FrameQt::getAppletInstanceForWidget(Widget*)
188 {
189     notImplemented();
190     return 0;
191 }
192
193 void FrameQt::issueCutCommand()
194 {
195     notImplemented();
196 }
197
198 void FrameQt::issueCopyCommand()
199 {
200     notImplemented();
201 }
202
203 void FrameQt::issuePasteCommand()
204 {
205     notImplemented();
206 }
207
208 void FrameQt::issuePasteAndMatchStyleCommand()
209 {
210     notImplemented();
211 }
212
213 void FrameQt::issueTransposeCommand()
214 {
215     notImplemented();
216 }
217
218 void FrameQt::respondToChangedSelection(const Selection& oldSelection, bool closeTyping)
219 {
220     // TODO: If we want continous spell checking, we need to implement this.
221 }
222
223 bool FrameQt::shouldChangeSelection(const Selection& oldSelection, const Selection& newSelection, EAffinity affinity, bool stillSelecting) const
224 {
225     // no-op
226     return true;
227 }
228
229 void FrameQt::print()
230 {
231     notImplemented();
232 }
233
234 bool FrameQt::shouldInterruptJavaScript()
235 {
236     notImplemented();
237     return false;
238 }
239
240 bool FrameQt::keyEvent(const PlatformKeyboardEvent& keyEvent)
241 {
242     bool result;
243
244     // Check for cases where we are too early for events -- possible unmatched key up
245     // from pressing return in the location bar.
246     Document* doc = document();
247     if (!doc)
248         return false;
249
250     Node* node = doc->focusedNode();
251     if (!node) {
252         if (doc->isHTMLDocument())
253             node = doc->body();
254         else
255             node = doc->documentElement();
256
257         if (!node)
258             return false;
259     }
260
261 #ifdef MULTIPLE_FORM_SUBMISSION_PROTECTION
262     if (!keyEvent.isKeyUp())
263         loader()->resetMultipleFormSubmissionProtection();
264 #endif
265     
266     result = !EventTargetNodeCast(node)->dispatchKeyEvent(keyEvent);
267
268     // FIXME: FrameMac has a keyDown/keyPress hack here which we are not copying.
269     return result;
270 }
271
272 void FrameQt::setFrameGeometry(const IntRect& r)
273 {
274     setFrameGeometry(QRect(r));
275 }
276
277 FrameQtClient* FrameQt::client() const
278 {
279     return m_client;
280 }
281
282 void FrameQt::createNewWindow(const FrameLoadRequest& request, const WindowFeatures& args, Frame*& frame)
283 {
284     notImplemented();
285 }
286
287 void FrameQt::goBackOrForward(int)
288 {
289     notImplemented();
290 }
291
292 KURL FrameQt::historyURL(int distance)
293 {
294     notImplemented();
295     return KURL();
296 }
297
298 void FrameQt::runJavaScriptAlert(const String& message) 
299 {
300     notImplemented();
301
302  
303 bool FrameQt::runJavaScriptConfirm(const String& message) 
304 {
305     notImplemented();
306 }
307
308 bool FrameQt::runJavaScriptPrompt(const String& message, const String& defaultValue, String& result) 
309 {
310     notImplemented();
311 }
312
313 KJS::Bindings::RootObject* FrameQt::bindingRootObject() 
314 {
315     ASSERT(javaScriptEnabled()); 
316     notImplemented();
317     return 0;
318 }
319
320 }
321 // vim: ts=4 sw=4 et