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