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