1705612321fa600936e116abbca4abe5e3f9c579
[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 void FrameQt::registerCommandForUndo(PassRefPtr<EditCommand>)
364 {
365     notImplemented();
366 }
367
368 void FrameQt::registerCommandForRedo(PassRefPtr<EditCommand>)
369 {
370     notImplemented();
371 }
372
373 void FrameQt::clearUndoRedoOperations()
374 {
375     // FIXME: Implement this as soon a KPart is created...
376 }
377
378 void FrameQt::issueUndoCommand()
379 {
380     notImplemented();
381 }
382
383 void FrameQt::issueRedoCommand()
384 {
385     notImplemented();
386 }
387
388 void FrameQt::issueCutCommand()
389 {
390     notImplemented();
391 }
392
393 void FrameQt::issueCopyCommand()
394 {
395     notImplemented();
396 }
397
398 void FrameQt::issuePasteCommand()
399 {
400     notImplemented();
401 }
402
403 void FrameQt::issuePasteAndMatchStyleCommand()
404 {
405     notImplemented();
406 }
407
408 void FrameQt::issueTransposeCommand()
409 {
410     notImplemented();
411 }
412
413 void FrameQt::respondToChangedSelection(const Selection& oldSelection, bool closeTyping)
414 {
415     notImplemented();
416 }
417
418 void FrameQt::respondToChangedContents(const Selection& endingSelection)
419 {
420     notImplemented();
421 }
422
423 bool FrameQt::shouldChangeSelection(const Selection& oldSelection, const Selection& newSelection, EAffinity affinity, bool stillSelecting) const
424 {
425     notImplemented();
426     return true;
427 }
428
429 void FrameQt::partClearedInBegin()
430 {
431     // FIXME: This is only related to the js debugger.
432     // See WebCoreSupport/WebFrameBridge.m "windowObjectCleared",
433     // which is called by FrameMac::partClearedInBegin() ...
434 }
435
436 bool FrameQt::canGoBackOrForward(int distance) const
437 {
438     notImplemented();
439     return false;
440 }
441
442 void FrameQt::handledOnloadEvents()
443 {
444     // no-op
445 }
446
447 bool FrameQt::canPaste() const
448 {
449     notImplemented();
450     return false;
451 }
452
453 bool FrameQt::canRedo() const
454 {
455     notImplemented();
456     return false;
457 }
458
459 bool FrameQt::canUndo() const
460 {
461     notImplemented();
462     return false;
463 }
464
465 void FrameQt::print()
466 {
467     notImplemented();
468 }
469
470 bool FrameQt::shouldInterruptJavaScript()
471 {
472     notImplemented();
473     return false;
474 }
475
476 KURL FrameQt::originalRequestURL() const
477 {
478     notImplemented();
479     return KURL();
480 }
481
482 bool FrameQt::keyEvent(const PlatformKeyboardEvent& keyEvent)
483 {
484     bool result;
485
486     // Check for cases where we are too early for events -- possible unmatched key up
487     // from pressing return in the location bar.
488     Document* doc = document();
489     if (!doc)
490         return false;
491
492     Node* node = doc->focusNode();
493     if (!node) {
494         if (doc->isHTMLDocument())
495             node = doc->body();
496         else
497             node = doc->documentElement();
498
499         if (!node)
500             return false;
501     }
502
503     if (!keyEvent.isKeyUp())
504         prepareForUserAction();
505
506     result = !EventTargetNodeCast(node)->dispatchKeyEvent(keyEvent);
507
508     // FIXME: FrameMac has a keyDown/keyPress hack here which we are not copying.
509     return result;
510 }
511
512 void FrameQt::setFrameGeometry(const IntRect& r)
513 {
514     setFrameGeometry(QRect(r));
515 }
516
517 }
518
519 // vim: ts=4 sw=4 et