2006-10-09 Nikolas Zimmermann <zimmermann@kde.org>
[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 #include "Element.h"
36 #include "RenderObject.h"
37 #include "RenderWidget.h"
38 #include "RenderLayer.h"
39 #include "Page.h"
40 #include "Document.h"
41 #include "HTMLElement.h"
42 #include "DOMWindow.h"
43 #include "DOMImplementation.h"
44 #include "BrowserExtensionQt.h"
45 #include "ResourceLoaderInternal.h"
46 #include "Document.h"
47 #include "Settings.h"
48 #include "Plugin.h"
49 #include "FramePrivate.h"
50 #include "GraphicsContext.h"
51 #include "HTMLDocument.h"
52 #include "ResourceLoader.h"
53 #include "PlatformMouseEvent.h"
54 #include "PlatformKeyboardEvent.h"
55 #include "PlatformWheelEvent.h"
56 #include "MouseEventWithHitTestResults.h"
57 #include "SelectionController.h"
58 #include "TypingCommand.h"
59
60 #include <QScrollArea>
61 #include <QMessageBox>
62
63 #define notImplemented() do { fprintf(stderr, "FIXME: UNIMPLEMENTED: %s:%d\n", __FILE__, __LINE__); } while(0)
64
65 namespace WebCore {
66
67 static void doScroll(const RenderObject* r, bool isHorizontal, int multiplier)
68 {
69     // FIXME: The scrolling done here should be done in the default handlers
70     // of the elements rather than here in the part.
71     if (!r)
72         return;
73
74     //broken since it calls scroll on scrollbars
75     //and we have none now
76     //r->scroll(direction, KWQScrollWheel, multiplier);
77     if (!r->layer())
78         return;
79
80     int x = r->layer()->scrollXOffset();
81     int y = r->layer()->scrollYOffset();
82     if (isHorizontal)
83         x += multiplier;
84     else
85         y += multiplier;
86
87     r->layer()->scrollToOffset(x, y, true, true);
88 }
89
90 FrameQt::FrameQt(Page* page, Element* ownerElement, FrameQtClient* client)
91     : Frame(page, ownerElement)
92 {
93     d->m_extension = new BrowserExtensionQt(this);
94     Settings* settings = new Settings;
95     settings->setAutoLoadImages(true);
96     settings->setMinFontSize(5);
97     settings->setMinLogicalFontSize(5);
98     settings->setShouldPrintBackgrounds(true);
99     settings->setIsJavaScriptEnabled(true);
100  
101     settings->setMediumFixedFontSize(14);
102     settings->setMediumFontSize(14);
103     settings->setSerifFontName("Times New Roman");
104     settings->setSansSerifFontName("Arial");
105     settings->setFixedFontName("Courier");
106     settings->setStdFontName("Arial");
107
108     setSettings(settings);
109
110     m_client = client;
111     m_client->setFrame(this);
112 }
113
114 FrameQt::~FrameQt()
115 {
116     closeURL();
117
118     setView(0);
119     clearRecordedFormValues();
120 }
121
122 bool FrameQt::openURL(const KURL& url)
123 {
124     if (!m_client)
125         return false;
126
127     m_client->openURL(url);
128     return true;
129 }
130
131 void FrameQt::submitForm(const ResourceRequest& request)
132 {
133     // FIXME: this is a hack inherited from FrameMac, and should be pushed into Frame
134     if (d->m_submittedFormURL == request.url())
135         return;
136
137     d->m_submittedFormURL = request.url();
138
139     if (m_client)
140         m_client->submitForm(request.doPost() ? "POST" : "GET", request.url(), &request.postData);
141
142     clearRecordedFormValues();
143 }
144
145 void FrameQt::urlSelected(const ResourceRequest& request)
146 {
147     if (!m_client)
148         return;
149
150     m_client->openURL(request.url());
151 }
152
153 String FrameQt::userAgent() const
154 {
155     return "Mozilla/5.0 (PC; U; Intel; Linux; en) AppleWebKit/420+ (KHTML, like Gecko)";
156 }
157
158 void FrameQt::runJavaScriptAlert(String const& message)
159 {
160     QMessageBox::information(view()->qwidget(), "JavaScript", message);
161 }
162
163 bool FrameQt::runJavaScriptConfirm(String const& message)
164 {
165     notImplemented();
166     return true;
167 }
168
169 bool FrameQt::locationbarVisible()
170 {
171     notImplemented();
172     return true;
173 }
174
175 void FrameQt::setTitle(const String& title)
176 {
177     if (view() && view()->parentWidget())
178         view()->parentWidget()->setWindowTitle(title);
179 }
180
181 Frame* FrameQt::createFrame(const KURL&, const String& name, Element*, const String& referrer)
182 {
183     notImplemented();
184     return 0;
185 }
186
187 bool FrameQt::passWheelEventToChildWidget(Node*)
188 {
189     notImplemented();
190     return false;
191 }
192
193 bool FrameQt::passSubframeEventToSubframe(MouseEventWithHitTestResults& mev, Frame*)
194 {
195     if (mev.targetNode() == 0)
196         return true;
197  
198     return false;
199 }
200
201 ObjectContentType FrameQt::objectContentType(const KURL&, const String& mimeType)
202 {
203     notImplemented();
204     return ObjectContentType();
205 }
206
207 Plugin* FrameQt::createPlugin(Element*, const KURL&, const Vector<String>&, const Vector<String>&, const String&)
208 {
209     notImplemented();
210     return 0;
211 }
212
213 bool FrameQt::passMouseDownEventToWidget(Widget*)
214 {
215     notImplemented();
216     return false;
217 }
218
219 bool FrameQt::isLoadTypeReload()
220 {
221     notImplemented();
222     return false;
223 }
224
225 bool FrameQt::menubarVisible()
226 {
227     notImplemented();
228     return true;
229 }
230
231 bool FrameQt::personalbarVisible()
232 {
233     notImplemented();
234     return true;
235 }
236
237 bool FrameQt::statusbarVisible()
238 {
239     notImplemented();
240     return true;
241 }
242
243 bool FrameQt::toolbarVisible()
244 {
245     notImplemented();
246     return true;
247 }
248
249 void FrameQt::createEmptyDocument()
250 {
251     // FIXME: Implement like described in this comment from FrameMac:
252     //
253     // Although it's not completely clear from the name of this function,
254     // it does nothing if we already have a document, and just creates an
255     // empty one if we have no document at all.
256 }
257
258 Range* FrameQt::markedTextRange() const
259 {
260     // notImplemented();
261     return 0;
262 }
263
264 String FrameQt::incomingReferrer() const
265 {
266     notImplemented();
267     return String();
268 }
269
270 String FrameQt::mimeTypeForFileName(const String&) const
271 {
272     notImplemented();
273     return String();
274 }
275
276 void FrameQt::markMisspellingsInAdjacentWords(const VisiblePosition&)
277 {
278     notImplemented();
279 }
280
281 void FrameQt::markMisspellings(const Selection&)
282 {
283     notImplemented();
284 }
285
286 bool FrameQt::lastEventIsMouseUp() const
287 {
288     notImplemented();
289     return false;
290 }
291
292 void FrameQt::saveDocumentState()
293 {
294     // FIXME: Implement this as soon a KPart is created...
295 }
296
297 void FrameQt::restoreDocumentState()
298 {
299     // FIXME: Implement this as soon a KPart is created...
300 }
301
302 void FrameQt::openURLRequest(const ResourceRequest&)
303 {
304     notImplemented();
305 }
306
307 void FrameQt::scheduleClose()
308 {
309     notImplemented();
310 }
311
312 void FrameQt::unfocusWindow()
313 {
314     notImplemented();
315 }
316
317 void FrameQt::focusWindow()
318 {
319     notImplemented();
320 }
321
322 String FrameQt::overrideMediaType() const
323 {
324     return String();
325 }
326
327 void FrameQt::addMessageToConsole(const String& message, unsigned lineNumber, const String& sourceID)
328 {
329     qDebug("[FrameQt::addMessageToConsole] message=%s lineNumber=%d sourceID=%s",
330            qPrintable(QString(message)), lineNumber, qPrintable(QString(sourceID)));
331 }
332
333 bool FrameQt::runJavaScriptPrompt(const String& message, const String& defaultValue, String& result)
334 {
335     notImplemented();
336     return false;
337 }
338
339 KJS::Bindings::Instance* FrameQt::getEmbedInstanceForWidget(Widget*)
340 {
341     notImplemented();
342     return 0;
343 }
344
345 KJS::Bindings::Instance* FrameQt::getObjectInstanceForWidget(Widget*)
346 {
347     notImplemented();
348     return 0;
349 }
350
351 KJS::Bindings::Instance* FrameQt::getAppletInstanceForWidget(Widget*)
352 {
353     notImplemented();
354     return 0;
355 }
356
357 KJS::Bindings::RootObject* FrameQt::bindingRootObject()
358 {
359     notImplemented();
360     return 0;
361 }
362
363 Widget* FrameQt::createJavaAppletWidget(const IntSize&, Element*, const HashMap<String, String>&)
364 {
365     notImplemented();
366     return 0; 
367 }
368
369 void FrameQt::registerCommandForUndo(PassRefPtr<EditCommand>)
370 {
371     notImplemented();
372 }
373
374 void FrameQt::registerCommandForRedo(PassRefPtr<EditCommand>)
375 {
376     notImplemented();
377 }
378
379 void FrameQt::clearUndoRedoOperations()
380 {
381     // FIXME: Implement this as soon a KPart is created...
382 }
383
384 void FrameQt::issueUndoCommand()
385 {
386     notImplemented();
387 }
388
389 void FrameQt::issueRedoCommand()
390 {
391     notImplemented();
392 }
393
394 void FrameQt::issueCutCommand()
395 {
396     notImplemented();
397 }
398
399 void FrameQt::issueCopyCommand()
400 {
401     notImplemented();
402 }
403
404 void FrameQt::issuePasteCommand()
405 {
406     notImplemented();
407 }
408
409 void FrameQt::issuePasteAndMatchStyleCommand()
410 {
411     notImplemented();
412 }
413
414 void FrameQt::issueTransposeCommand()
415 {
416     notImplemented();
417 }
418
419 void FrameQt::respondToChangedSelection(const Selection& oldSelection, bool closeTyping)
420 {
421     notImplemented();
422 }
423
424 void FrameQt::respondToChangedContents(const Selection& endingSelection)
425 {
426     notImplemented();
427 }
428
429 bool FrameQt::shouldChangeSelection(const Selection& oldSelection, const Selection& newSelection, EAffinity affinity, bool stillSelecting) const
430 {
431     notImplemented();
432     return true;
433 }
434
435 void FrameQt::partClearedInBegin()
436 {
437     // FIXME: This is only related to the js debugger.
438     // See WebCoreSupport/WebFrameBridge.m "windowObjectCleared",
439     // which is called by FrameMac::partClearedInBegin() ...
440 }
441
442 bool FrameQt::canGoBackOrForward(int distance) const
443 {
444     notImplemented();
445     return false;
446 }
447
448 void FrameQt::handledOnloadEvents()
449 {
450     // no-op
451 }
452
453 bool FrameQt::canPaste() const
454 {
455     notImplemented();
456     return false;
457 }
458
459 bool FrameQt::canRedo() const
460 {
461     notImplemented();
462     return false;
463 }
464
465 bool FrameQt::canUndo() const
466 {
467     notImplemented();
468     return false;
469 }
470
471 void FrameQt::print()
472 {
473     notImplemented();
474 }
475
476 bool FrameQt::shouldInterruptJavaScript()
477 {
478     notImplemented();
479     return false;
480 }
481
482 KURL FrameQt::originalRequestURL() const
483 {
484     notImplemented();
485     return KURL();
486 }
487
488 bool FrameQt::keyEvent(const PlatformKeyboardEvent& keyEvent)
489 {
490     bool result;
491
492     // Check for cases where we are too early for events -- possible unmatched key up
493     // from pressing return in the location bar.
494     Document* doc = document();
495     if (!doc)
496         return false;
497
498     Node* node = doc->focusNode();
499     if (!node) {
500         if (doc->isHTMLDocument())
501             node = doc->body();
502         else
503             node = doc->documentElement();
504
505         if (!node)
506             return false;
507     }
508
509     if (!keyEvent.isKeyUp())
510         prepareForUserAction();
511
512     result = !EventTargetNodeCast(node)->dispatchKeyEvent(keyEvent);
513
514     // FIXME: FrameMac has a keyDown/keyPress hack here which we are not copying.
515     return result;
516 }
517
518 void FrameQt::setFrameGeometry(const IntRect& r)
519 {
520     setFrameGeometry(QRect(r));
521 }
522
523 }
524
525 // vim: ts=4 sw=4 et