Reviewed by Mitz.
[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 "FrameLoadRequest.h"
44 #include "DOMImplementation.h"
45 #include "BrowserExtensionQt.h"
46 #include "ResourceLoaderInternal.h"
47 #include "Document.h"
48 #include "Settings.h"
49 #include "Plugin.h"
50 #include "FramePrivate.h"
51 #include "GraphicsContext.h"
52 #include "HTMLDocument.h"
53 #include "ResourceLoader.h"
54 #include "PlatformMouseEvent.h"
55 #include "PlatformKeyboardEvent.h"
56 #include "PlatformWheelEvent.h"
57 #include "MouseEventWithHitTestResults.h"
58 #include "SelectionController.h"
59 #include "TypingCommand.h"
60
61 #include <QScrollArea>
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 FrameLoadRequest& frameLoadRequest)
132 {
133     ResourceRequest request = frameLoadRequest.m_request;
134
135     // FIXME: this is a hack inherited from FrameMac, and should be pushed into Frame
136     if (d->m_submittedFormURL == request.url())
137         return;
138
139     d->m_submittedFormURL = request.url();
140
141     if (m_client)
142         m_client->submitForm(request.doPost() ? "POST" : "GET", request.url(), &request.postData);
143
144     clearRecordedFormValues();
145 }
146
147 void FrameQt::urlSelected(const FrameLoadRequest& frameLoadRequest)
148 {
149     ResourceRequest request = frameLoadRequest.m_request;
150
151     if (!m_client)
152         return;
153
154     m_client->openURL(request.url());
155 }
156
157 String FrameQt::userAgent() const
158 {
159     return "Mozilla/5.0 (PC; U; Intel; Linux; en) AppleWebKit/420+ (KHTML, like Gecko)";
160 }
161
162 void FrameQt::runJavaScriptAlert(String const& message)
163 {
164     m_client->runJavaScriptAlert(message);
165 }
166
167 bool FrameQt::runJavaScriptConfirm(String const& message)
168 {
169     notImplemented();
170     return true;
171 }
172
173 bool FrameQt::locationbarVisible()
174 {
175     notImplemented();
176     return true;
177 }
178
179 void FrameQt::setTitle(const String& title)
180 {
181     if (view() && view()->parentWidget())
182         view()->parentWidget()->setWindowTitle(title);
183 }
184
185 Frame* FrameQt::createFrame(const KURL&, const String& name, Element*, const String& referrer)
186 {
187     notImplemented();
188     return 0;
189 }
190
191 bool FrameQt::passWheelEventToChildWidget(Node*)
192 {
193     notImplemented();
194     return false;
195 }
196
197 bool FrameQt::passSubframeEventToSubframe(MouseEventWithHitTestResults& mev, Frame*)
198 {
199     if (mev.targetNode() == 0)
200         return true;
201  
202     return false;
203 }
204
205 ObjectContentType FrameQt::objectContentType(const KURL&, const String& mimeType)
206 {
207     notImplemented();
208     return ObjectContentType();
209 }
210
211 Plugin* FrameQt::createPlugin(Element*, const KURL&, const Vector<String>&, const Vector<String>&, const String&)
212 {
213     notImplemented();
214     return 0;
215 }
216
217 bool FrameQt::passMouseDownEventToWidget(Widget*)
218 {
219     notImplemented();
220     return false;
221 }
222
223 bool FrameQt::isLoadTypeReload()
224 {
225     notImplemented();
226     return false;
227 }
228
229 bool FrameQt::menubarVisible()
230 {
231     notImplemented();
232     return true;
233 }
234
235 bool FrameQt::personalbarVisible()
236 {
237     notImplemented();
238     return true;
239 }
240
241 bool FrameQt::statusbarVisible()
242 {
243     notImplemented();
244     return true;
245 }
246
247 bool FrameQt::toolbarVisible()
248 {
249     notImplemented();
250     return true;
251 }
252
253 void FrameQt::createEmptyDocument()
254 {
255     // FIXME: Implement like described in this comment from FrameMac:
256     //
257     // Although it's not completely clear from the name of this function,
258     // it does nothing if we already have a document, and just creates an
259     // empty one if we have no document at all.
260 }
261
262 Range* FrameQt::markedTextRange() const
263 {
264     // notImplemented();
265     return 0;
266 }
267
268 String FrameQt::incomingReferrer() const
269 {
270     notImplemented();
271     return String();
272 }
273
274 String FrameQt::mimeTypeForFileName(const String&) const
275 {
276     notImplemented();
277     return String();
278 }
279
280 void FrameQt::markMisspellingsInAdjacentWords(const VisiblePosition&)
281 {
282     notImplemented();
283 }
284
285 void FrameQt::markMisspellings(const Selection&)
286 {
287     notImplemented();
288 }
289
290 bool FrameQt::lastEventIsMouseUp() const
291 {
292     notImplemented();
293     return false;
294 }
295
296 void FrameQt::saveDocumentState()
297 {
298     // FIXME: Implement this as soon a KPart is created...
299 }
300
301 void FrameQt::restoreDocumentState()
302 {
303     // FIXME: Implement this as soon a KPart is created...
304 }
305
306 void FrameQt::openURLRequest(const FrameLoadRequest&)
307 {
308     notImplemented();
309 }
310
311 void FrameQt::scheduleClose()
312 {
313     notImplemented();
314 }
315
316 void FrameQt::unfocusWindow()
317 {
318     notImplemented();
319 }
320
321 void FrameQt::focusWindow()
322 {
323     notImplemented();
324 }
325
326 String FrameQt::overrideMediaType() const
327 {
328     return String();
329 }
330
331 void FrameQt::addMessageToConsole(const String& message, unsigned lineNumber, const String& sourceID)
332 {
333     qDebug("[FrameQt::addMessageToConsole] message=%s lineNumber=%d sourceID=%s",
334            qPrintable(QString(message)), lineNumber, qPrintable(QString(sourceID)));
335 }
336
337 bool FrameQt::runJavaScriptPrompt(const String& message, const String& defaultValue, String& result)
338 {
339     notImplemented();
340     return false;
341 }
342
343 KJS::Bindings::Instance* FrameQt::getEmbedInstanceForWidget(Widget*)
344 {
345     notImplemented();
346     return 0;
347 }
348
349 KJS::Bindings::Instance* FrameQt::getObjectInstanceForWidget(Widget*)
350 {
351     notImplemented();
352     return 0;
353 }
354
355 KJS::Bindings::Instance* FrameQt::getAppletInstanceForWidget(Widget*)
356 {
357     notImplemented();
358     return 0;
359 }
360
361 KJS::Bindings::RootObject* FrameQt::bindingRootObject()
362 {
363     notImplemented();
364     return 0;
365 }
366
367 Widget* FrameQt::createJavaAppletWidget(const IntSize&, Element*, const HashMap<String, String>&)
368 {
369     notImplemented();
370     return 0; 
371 }
372
373 void FrameQt::registerCommandForUndo(PassRefPtr<EditCommand>)
374 {
375     notImplemented();
376 }
377
378 void FrameQt::registerCommandForRedo(PassRefPtr<EditCommand>)
379 {
380     notImplemented();
381 }
382
383 void FrameQt::clearUndoRedoOperations()
384 {
385     // FIXME: Implement this as soon a KPart is created...
386 }
387
388 void FrameQt::issueUndoCommand()
389 {
390     notImplemented();
391 }
392
393 void FrameQt::issueRedoCommand()
394 {
395     notImplemented();
396 }
397
398 void FrameQt::issueCutCommand()
399 {
400     notImplemented();
401 }
402
403 void FrameQt::issueCopyCommand()
404 {
405     notImplemented();
406 }
407
408 void FrameQt::issuePasteCommand()
409 {
410     notImplemented();
411 }
412
413 void FrameQt::issuePasteAndMatchStyleCommand()
414 {
415     notImplemented();
416 }
417
418 void FrameQt::issueTransposeCommand()
419 {
420     notImplemented();
421 }
422
423 void FrameQt::respondToChangedSelection(const Selection& oldSelection, bool closeTyping)
424 {
425     notImplemented();
426 }
427
428 void FrameQt::respondToChangedContents(const Selection& endingSelection)
429 {
430     notImplemented();
431 }
432
433 bool FrameQt::shouldChangeSelection(const Selection& oldSelection, const Selection& newSelection, EAffinity affinity, bool stillSelecting) const
434 {
435     notImplemented();
436     return true;
437 }
438
439 void FrameQt::partClearedInBegin()
440 {
441     // FIXME: This is only related to the js debugger.
442     // See WebCoreSupport/WebFrameBridge.m "windowObjectCleared",
443     // which is called by FrameMac::partClearedInBegin() ...
444 }
445
446 bool FrameQt::canGoBackOrForward(int distance) const
447 {
448     notImplemented();
449     return false;
450 }
451
452 void FrameQt::handledOnloadEvents()
453 {
454     // TODO: FrameMac doesn't need that - it seems.
455     // It must be handled differently, can't figure it out.
456     // If we won't call this here doc->parsing() remains 'true'
457     // all the time. Calling document.open(); document.write(...)
458     // from JavaScript leaves the parsing state 'true', and DRT will
459     // hang on these tests (fast/dom/Document/document-reopen.html for instance)
460     endIfNotLoading();
461 }
462
463 bool FrameQt::canPaste() const
464 {
465     notImplemented();
466     return false;
467 }
468
469 bool FrameQt::canRedo() const
470 {
471     notImplemented();
472     return false;
473 }
474
475 bool FrameQt::canUndo() const
476 {
477     notImplemented();
478     return false;
479 }
480
481 void FrameQt::print()
482 {
483     notImplemented();
484 }
485
486 bool FrameQt::shouldInterruptJavaScript()
487 {
488     notImplemented();
489     return false;
490 }
491
492 KURL FrameQt::originalRequestURL() const
493 {
494     notImplemented();
495     return KURL();
496 }
497
498 bool FrameQt::keyEvent(const PlatformKeyboardEvent& keyEvent)
499 {
500     bool result;
501
502     // Check for cases where we are too early for events -- possible unmatched key up
503     // from pressing return in the location bar.
504     Document* doc = document();
505     if (!doc)
506         return false;
507
508     Node* node = doc->focusNode();
509     if (!node) {
510         if (doc->isHTMLDocument())
511             node = doc->body();
512         else
513             node = doc->documentElement();
514
515         if (!node)
516             return false;
517     }
518
519     if (!keyEvent.isKeyUp())
520         prepareForUserAction();
521
522     result = !EventTargetNodeCast(node)->dispatchKeyEvent(keyEvent);
523
524     // FIXME: FrameMac has a keyDown/keyPress hack here which we are not copying.
525     return result;
526 }
527
528 void FrameQt::setFrameGeometry(const IntRect& r)
529 {
530     setFrameGeometry(QRect(r));
531 }
532
533 void FrameQt::tokenizerProcessedData()
534 {
535     if (d->m_doc)
536         checkCompleted();
537 }
538
539 }
540
541 // vim: ts=4 sw=4 et