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