WebKit:
[WebKit-https.git] / WebCore / kwq / KWQKHTMLPart.h
1 /*
2  * Copyright (C) 2003 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef KWQKHTMLPart_H
27 #define KWQKHTMLPart_H
28
29 #include "khtml_part.h"
30
31 #include "dom_nodeimpl.h"
32 #include "html_formimpl.h"
33 #include "html_tableimpl.h"
34
35 #import "WebCoreKeyboardAccess.h"
36
37 #include <CoreFoundation/CoreFoundation.h>
38
39 #include <JavaVM/jni.h>
40 #include <JavaScriptCore/jni_jsobject.h>
41 #include <JavaScriptCore/runtime.h>
42
43 #include "KWQDict.h"
44
45 class KHTMLPartPrivate;
46 class KWQWindowWidget;
47
48 namespace khtml {
49     class RenderObject;
50 }
51
52 namespace KJS {
53     class SavedProperties;
54     class SavedBuiltins;
55     class ScheduledAction;
56 }
57
58 #ifdef __OBJC__
59
60 // Avoid clashes with KJS::DOMElement in KHTML code.
61 @class DOMElement;
62 typedef DOMElement ObjCDOMElement;
63
64 @class KWQPageState;
65 @class NSArray;
66 @class NSAttributedString;
67 @class NSColor;
68 @class NSEvent;
69 @class NSFileWrapper;
70 @class NSMutableDictionary;
71 @class NSResponder;
72 @class NSString;
73 @class NSView;
74 @class WebCoreBridge;
75 @class WebScriptObject;
76
77 #else
78
79 // Avoid clashes with KJS::DOMElement in KHTML code.
80 class ObjCDOMElement;
81
82 class KWQPageState;
83 class NSArray;
84 class NSAttributedString;
85 class NSColor;
86 class NSEvent;
87 class NSFileWrapper;
88 class NSMutableDictionary;
89 class NSResponder;
90 class NSString;
91 class NSView;
92 class WebCoreBridge;
93 class WebScriptObject;
94
95 #endif
96
97 enum KWQSelectionDirection {
98     KWQSelectingNext,
99     KWQSelectingPrevious
100 };
101
102 class KWQKHTMLPart : public KHTMLPart
103 {
104 public:
105     KWQKHTMLPart();
106     ~KWQKHTMLPart();
107     
108     void clear();
109
110     void setBridge(WebCoreBridge *p);
111     WebCoreBridge *bridge() const { return _bridge; }
112     void setView(KHTMLView *view);
113     KHTMLView *view() const;
114
115     void provisionalLoadStarted();
116
117     virtual bool openURL(const KURL &);
118     virtual bool closeURL();
119     void didNotOpenURL(const KURL &);
120     
121     void openURLRequest(const KURL &, const KParts::URLArgs &);
122     void submitForm(const KURL &, const KParts::URLArgs &);
123
124     void scheduleHistoryNavigation( int steps );
125     
126     void scrollToAnchor(const KURL &);
127     void jumpToSelection();
128     
129     void setEncoding(const QString &encoding, bool userChosen);
130     void addData(const char *bytes, int length);
131
132     void setTitle(const DOM::DOMString &);
133     void setStatusBarText(const QString &status);
134
135     void urlSelected(const KURL &url, int button, int state, const KParts::URLArgs &args);
136     bool requestObject(khtml::RenderPart *frame, const QString &url, const QString &serviceType, const QStringList &args);
137     KParts::ReadOnlyPart *createPart(const khtml::ChildFrame &child, const KURL &url, const QString &mimeType);
138
139     void scheduleClose();
140
141     void unfocusWindow();
142
143     QMap<int, KJS::ScheduledAction*> *pauseActions(const void *key);
144     void resumeActions(QMap<int, KJS::ScheduledAction*> *actions, const void *key);
145     
146     bool canCachePage();
147     void saveWindowProperties(KJS::SavedProperties *windowProperties);
148     void saveLocationProperties(KJS::SavedProperties *locationProperties);
149     void restoreWindowProperties(KJS::SavedProperties *windowProperties);
150     void restoreLocationProperties(KJS::SavedProperties *locationProperties);
151     void saveInterpreterBuiltins(KJS::SavedBuiltins &interpreterBuiltins);
152     void restoreInterpreterBuiltins(const KJS::SavedBuiltins &interpreterBuiltins);
153
154     void openURLFromPageCache(KWQPageState *state);
155
156     void saveDocumentState();
157     void restoreDocumentState();
158     
159     bool isFrameSet() const;
160
161     void updatePolicyBaseURL();
162
163     NSView *nextKeyView(DOM::NodeImpl *startingPoint, KWQSelectionDirection);
164     NSView *nextKeyViewInFrameHierarchy(DOM::NodeImpl *startingPoint, KWQSelectionDirection);
165     static NSView *nextKeyViewForWidget(QWidget *startingPoint, KWQSelectionDirection);
166     static bool currentEventIsKeyboardOptionTab();
167     static bool handleKeyboardOptionTabInView(NSView *view);
168     
169     virtual bool tabsToLinks() const;
170     virtual bool tabsToAllControls() const;
171     
172     static bool currentEventIsMouseDownInWidget(QWidget *candidate);
173     
174     static void setDocumentFocus(QWidget *);
175     static void clearDocumentFocus(QWidget *);
176     
177     void runJavaScriptAlert(const QString &message);
178     bool runJavaScriptConfirm(const QString &message);
179     bool runJavaScriptPrompt(const QString &message, const QString &defaultValue, QString &result);
180
181     using KHTMLPart::xmlDocImpl;
182     khtml::RenderObject *renderer();
183     void forceLayout();
184     void forceLayoutWithPageWidthRange(float minPageWidth, float maxPageWidth);
185     void sendResizeEvent();
186     void sendScrollEvent();
187     void paint(QPainter *, const QRect &);
188     void paintSelectionOnly(QPainter *p, const QRect &rect);
189
190     void adjustPageHeight(float *newBottom, float oldTop, float oldBottom, float bottomLimit);
191
192     void createEmptyDocument();
193
194     static WebCoreBridge *bridgeForWidget(const QWidget *);
195     static KWQKHTMLPart *partForWidget(const QWidget *);
196     
197     QString requestedURLString() const;
198     QString incomingReferrer() const;
199     QString userAgent() const;
200
201     QString mimeTypeForFileName(const QString &) const;
202     
203     DOM::NodeImpl *selectionStart() const;
204     int selectionStartOffset() const;
205     DOM::NodeImpl *selectionEnd() const;
206     int selectionEndOffset() const;
207
208     QRect selectionRect() const;
209
210     NSFileWrapper *fileWrapperForElement(DOM::ElementImpl *);
211     NSAttributedString *attributedString(DOM::NodeImpl *startNode, int startOffset, DOM::NodeImpl *endNode, int endOffset);
212
213     void addMetaData(const QString &key, const QString &value);
214
215     void mouseDown(NSEvent *);
216     void mouseDragged(NSEvent *);
217     void mouseUp(NSEvent *);
218     void sendFakeEventsAfterWidgetTracking(NSEvent *initiatingEvent);
219     void mouseMoved(NSEvent *);
220     bool keyEvent(NSEvent *);
221     bool lastEventIsMouseUp();
222
223     bool sendContextMenuEvent(NSEvent *);
224
225     void clearTimers();
226     static void clearTimers(KHTMLView *);
227     
228     bool passSubframeEventToSubframe(DOM::NodeImpl::MouseEvent &);
229     
230     void redirectionTimerStartedOrStopped();
231     
232     static const QPtrList<KWQKHTMLPart> &instances() { return mutableInstances(); }
233
234     void clearRecordedFormValues();
235     void recordFormValue(const QString &name, const QString &value, DOM::HTMLFormElementImpl *element);
236     DOM::HTMLFormElementImpl *currentForm() const;
237
238     NSString *searchForLabelsAboveCell(QRegExp *regExp, DOM::HTMLTableCellElementImpl *cell);
239     NSString *searchForLabelsBeforeElement(NSArray *labels, DOM::ElementImpl *element);
240     NSString *matchLabelsAgainstElement(NSArray *labels, DOM::ElementImpl *element);
241
242     bool findString(NSString *str, bool forward, bool caseFlag, bool wrapFlag);
243
244     void setSettings(KHTMLSettings *);
245
246     KWQWindowWidget *topLevelWidget();
247     
248     QString overrideMediaType();
249     
250     void setMediaType(const QString &);
251
252     void setUsesInactiveTextBackgroundColor(bool u) { _usesInactiveTextBackgroundColor = u; }
253     bool usesInactiveTextBackgroundColor() const { return _usesInactiveTextBackgroundColor; }
254
255     void setShowsFirstResponder(bool flag);
256     bool showsFirstResponder() const { return _showsFirstResponder; }
257     
258     // Convenience, to avoid repeating the code to dig down to get this.
259     QChar backslashAsCurrencySymbol() const;
260
261     NSColor *bodyBackgroundColor() const;
262     
263     WebCoreKeyboardUIMode keyboardUIMode() const;
264
265     void setName(const QString &name);
266
267     void didTellBridgeAboutLoad(const QString &urlString);
268     bool haveToldBridgeAboutLoad(const QString &urlString);
269     void print();
270
271     KJS::Bindings::Instance *getAppletInstanceForView (NSView *aView);
272     void addPluginRootObject(const KJS::Bindings::RootObject *root);
273     void cleanupPluginRootObjects();
274     
275     void registerCommandForUndo(const khtml::EditCommand &);
276     void registerCommandForRedo(const khtml::EditCommand &);
277     void clearUndoRedoOperations();
278     void editingKeyEvent();
279     void issueUndoCommand();
280     void issueRedoCommand();
281     void issueCutCommand();
282     void issueCopyCommand();
283     void issuePasteCommand();
284     void postDidChangeSelectionNotification();
285     void postDidChangeNotification();
286
287     WebScriptObject *windowScriptObject();
288     void bindObject(void *object, QString name);
289     
290     void partClearedInBegin();
291     
292 private:
293     virtual void khtmlMousePressEvent(khtml::MousePressEvent *);
294     virtual void khtmlMouseDoubleClickEvent(khtml::MouseDoubleClickEvent *);
295     virtual void khtmlMouseMoveEvent(khtml::MouseMoveEvent *);
296     virtual void khtmlMouseReleaseEvent(khtml::MouseReleaseEvent *);
297     
298     bool passWidgetMouseDownEventToWidget(khtml::MouseEvent *);
299     bool passWidgetMouseDownEventToWidget(khtml::RenderWidget *);
300     bool passWidgetMouseDownEventToWidget(QWidget *);
301     
302     void setPolicyBaseURL(const DOM::DOMString &);
303     
304     NSView *mouseDownViewIfStillGood();
305
306     QString generateFrameName();
307
308     NSView *nextKeyViewInFrame(DOM::NodeImpl *startingPoint, KWQSelectionDirection);
309     static DOM::NodeImpl *nodeForWidget(const QWidget *);
310     static KWQKHTMLPart *partForNode(DOM::NodeImpl *);
311     static NSView *documentViewForNode(DOM::NodeImpl *);
312     
313     WebCoreBridge *_bridge;
314     
315     KWQSignal _started;
316     KWQSignal _completed;
317     KWQSignal _completedWithBool;
318     
319     NSView *_mouseDownView;
320     bool _mouseDownWasInSubframe;
321     bool _sendingEventToSubview;
322     bool _mouseDownMayStartDrag;
323     bool _mouseDownMayStartSelect;
324     
325     static NSEvent *_currentEvent;
326     static NSResponder *_firstResponderAtMouseDownTime;
327
328     KURL _submittedFormURL;
329
330     NSMutableDictionary *_formValuesAboutToBeSubmitted;
331     ObjCDOMElement *_formAboutToBeSubmitted;
332
333     static QPtrList<KWQKHTMLPart> &mutableInstances();
334
335     KWQWindowWidget *_windowWidget;
336
337     bool _usesInactiveTextBackgroundColor;
338     bool _showsFirstResponder;
339
340     QDict<char> urlsBridgeKnowsAbout;
341
342     friend class KHTMLPart;
343
344     QPtrList<KJS::Bindings::RootObject> rootObjects;
345 };
346
347 inline KWQKHTMLPart *KWQ(KHTMLPart *part) { return static_cast<KWQKHTMLPart *>(part); }
348 inline const KWQKHTMLPart *KWQ(const KHTMLPart *part) { return static_cast<const KWQKHTMLPart *>(part); }
349
350 #endif