247e89e931676c681d5a140da1473d46bcc49308
[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
76 #else
77
78 // Avoid clashes with KJS::DOMElement in KHTML code.
79 class ObjCDOMElement;
80
81 class KWQPageState;
82 class NSArray;
83 class NSAttributedString;
84 class NSColor;
85 class NSEvent;
86 class NSFileWrapper;
87 class NSMutableDictionary;
88 class NSResponder;
89 class NSString;
90 class NSView;
91 class WebCoreBridge;
92
93 #endif
94
95 enum KWQSelectionDirection {
96     KWQSelectingNext,
97     KWQSelectingPrevious
98 };
99
100 class KWQKHTMLPart : public KHTMLPart
101 {
102 public:
103     KWQKHTMLPart();
104     ~KWQKHTMLPart();
105     
106     void clear();
107
108     void setBridge(WebCoreBridge *p);
109     WebCoreBridge *bridge() const { return _bridge; }
110     void setView(KHTMLView *view);
111     KHTMLView *view() const;
112
113     void provisionalLoadStarted();
114
115     virtual bool openURL(const KURL &);
116     virtual bool closeURL();
117     void didNotOpenURL(const KURL &);
118     
119     void openURLRequest(const KURL &, const KParts::URLArgs &);
120     void submitForm(const KURL &, const KParts::URLArgs &);
121
122     void scheduleHistoryNavigation( int steps );
123     
124     void scrollToAnchor(const KURL &);
125     void jumpToSelection();
126     
127     void setEncoding(const QString &encoding, bool userChosen);
128     void addData(const char *bytes, int length);
129
130     void setTitle(const DOM::DOMString &);
131     void setStatusBarText(const QString &status);
132
133     void urlSelected(const KURL &url, int button, int state, const KParts::URLArgs &args);
134     bool requestObject(khtml::RenderPart *frame, const QString &url, const QString &serviceType, const QStringList &args);
135     KParts::ReadOnlyPart *createPart(const khtml::ChildFrame &child, const KURL &url, const QString &mimeType);
136
137     void scheduleClose();
138
139     void unfocusWindow();
140
141     QMap<int, KJS::ScheduledAction*> *pauseActions(const void *key);
142     void resumeActions(QMap<int, KJS::ScheduledAction*> *actions, const void *key);
143     
144     bool canCachePage();
145     void saveWindowProperties(KJS::SavedProperties *windowProperties);
146     void saveLocationProperties(KJS::SavedProperties *locationProperties);
147     void restoreWindowProperties(KJS::SavedProperties *windowProperties);
148     void restoreLocationProperties(KJS::SavedProperties *locationProperties);
149     void saveInterpreterBuiltins(KJS::SavedBuiltins &interpreterBuiltins);
150     void restoreInterpreterBuiltins(const KJS::SavedBuiltins &interpreterBuiltins);
151
152     void openURLFromPageCache(KWQPageState *state);
153
154     void saveDocumentState();
155     void restoreDocumentState();
156     
157     bool isFrameSet() const;
158
159     void updatePolicyBaseURL();
160
161     NSView *nextKeyView(DOM::NodeImpl *startingPoint, KWQSelectionDirection);
162     NSView *nextKeyViewInFrameHierarchy(DOM::NodeImpl *startingPoint, KWQSelectionDirection);
163     static NSView *nextKeyViewForWidget(QWidget *startingPoint, KWQSelectionDirection);
164     static bool currentEventIsKeyboardOptionTab();
165     static bool handleKeyboardOptionTabInView(NSView *view);
166     
167     virtual bool tabsToLinks() const;
168     virtual bool tabsToAllControls() const;
169     
170     static bool currentEventIsMouseDownInWidget(QWidget *candidate);
171     
172     static void setDocumentFocus(QWidget *);
173     static void clearDocumentFocus(QWidget *);
174     
175     void runJavaScriptAlert(const QString &message);
176     bool runJavaScriptConfirm(const QString &message);
177     bool runJavaScriptPrompt(const QString &message, const QString &defaultValue, QString &result);
178
179     using KHTMLPart::xmlDocImpl;
180     khtml::RenderObject *renderer();
181     void forceLayout();
182     void forceLayoutWithPageWidthRange(float minPageWidth, float maxPageWidth);
183     void sendResizeEvent();
184     void sendScrollEvent();
185     void paint(QPainter *, const QRect &);
186     void paintSelectionOnly(QPainter *p, const QRect &rect);
187
188     void adjustPageHeight(float *newBottom, float oldTop, float oldBottom, float bottomLimit);
189
190     void createEmptyDocument();
191
192     static WebCoreBridge *bridgeForWidget(const QWidget *);
193     static KWQKHTMLPart *partForWidget(const QWidget *);
194     
195     QString requestedURLString() const;
196     QString incomingReferrer() const;
197     QString userAgent() const;
198
199     QString mimeTypeForFileName(const QString &) const;
200     
201     DOM::NodeImpl *selectionStart() const;
202     int selectionStartOffset() const;
203     DOM::NodeImpl *selectionEnd() const;
204     int selectionEndOffset() const;
205
206     QRect selectionRect() const;
207
208     NSFileWrapper *fileWrapperForElement(DOM::ElementImpl *);
209     NSAttributedString *attributedString(DOM::NodeImpl *startNode, int startOffset, DOM::NodeImpl *endNode, int endOffset);
210
211     void addMetaData(const QString &key, const QString &value);
212
213     void mouseDown(NSEvent *);
214     void mouseDragged(NSEvent *);
215     void mouseUp(NSEvent *);
216     void sendFakeEventsAfterWidgetTracking(NSEvent *initiatingEvent);
217     void mouseMoved(NSEvent *);
218     bool keyEvent(NSEvent *);
219     bool lastEventIsMouseUp();
220
221     bool sendContextMenuEvent(NSEvent *);
222
223     void clearTimers();
224     static void clearTimers(KHTMLView *);
225     
226     bool passSubframeEventToSubframe(DOM::NodeImpl::MouseEvent &);
227     
228     void redirectionTimerStartedOrStopped();
229     
230     static const QPtrList<KWQKHTMLPart> &instances() { return mutableInstances(); }
231
232     void clearRecordedFormValues();
233     void recordFormValue(const QString &name, const QString &value, DOM::HTMLFormElementImpl *element);
234     DOM::HTMLFormElementImpl *currentForm() const;
235
236     NSString *searchForLabelsAboveCell(QRegExp *regExp, DOM::HTMLTableCellElementImpl *cell);
237     NSString *searchForLabelsBeforeElement(NSArray *labels, DOM::ElementImpl *element);
238     NSString *matchLabelsAgainstElement(NSArray *labels, DOM::ElementImpl *element);
239
240     bool findString(NSString *str, bool forward, bool caseFlag, bool wrapFlag);
241
242     void setSettings(KHTMLSettings *);
243
244     KWQWindowWidget *topLevelWidget();
245     
246     QString overrideMediaType();
247     
248     void setMediaType(const QString &);
249
250     void setUsesInactiveTextBackgroundColor(bool u) { _usesInactiveTextBackgroundColor = u; }
251     bool usesInactiveTextBackgroundColor() const { return _usesInactiveTextBackgroundColor; }
252
253     void setShowsFirstResponder(bool flag);
254     bool showsFirstResponder() const { return _showsFirstResponder; }
255     
256     // Convenience, to avoid repeating the code to dig down to get this.
257     QChar backslashAsCurrencySymbol() const;
258
259     NSColor *bodyBackgroundColor() const;
260     
261     WebCoreKeyboardUIMode keyboardUIMode() const;
262
263     void setName(const QString &name);
264
265     void didTellBridgeAboutLoad(const QString &urlString);
266     bool haveToldBridgeAboutLoad(const QString &urlString);
267     void print();
268
269     KJS::Bindings::Instance *getAppletInstanceForView (NSView *aView);
270     void addPluginRootObject(const KJS::Bindings::RootObject *root);
271     void cleanupPluginRootObjects();
272     
273     void registerCommandForUndo(const khtml::EditCommand &);
274     void registerCommandForRedo(const khtml::EditCommand &);
275     void clearUndoRedoOperations();
276     void editingKeyEvent();
277     void issueUndoCommand();
278     void issueRedoCommand();
279     void issueCutCommand();
280     void issueCopyCommand();
281     void issuePasteCommand();
282     void postDidChangeSelectionNotification();
283     void postDidChangeNotification();
284
285     void bindObject(void *object, QString name);
286     
287 private:
288     virtual void khtmlMousePressEvent(khtml::MousePressEvent *);
289     virtual void khtmlMouseDoubleClickEvent(khtml::MouseDoubleClickEvent *);
290     virtual void khtmlMouseMoveEvent(khtml::MouseMoveEvent *);
291     virtual void khtmlMouseReleaseEvent(khtml::MouseReleaseEvent *);
292     
293     bool passWidgetMouseDownEventToWidget(khtml::MouseEvent *);
294     bool passWidgetMouseDownEventToWidget(khtml::RenderWidget *);
295     bool passWidgetMouseDownEventToWidget(QWidget *);
296     
297     void setPolicyBaseURL(const DOM::DOMString &);
298     
299     NSView *mouseDownViewIfStillGood();
300
301     QString generateFrameName();
302
303     NSView *nextKeyViewInFrame(DOM::NodeImpl *startingPoint, KWQSelectionDirection);
304     static DOM::NodeImpl *nodeForWidget(const QWidget *);
305     static KWQKHTMLPart *partForNode(DOM::NodeImpl *);
306     static NSView *documentViewForNode(DOM::NodeImpl *);
307     
308     WebCoreBridge *_bridge;
309     
310     KWQSignal _started;
311     KWQSignal _completed;
312     KWQSignal _completedWithBool;
313     
314     NSView *_mouseDownView;
315     bool _mouseDownWasInSubframe;
316     bool _sendingEventToSubview;
317     bool _mouseDownMayStartDrag;
318     bool _mouseDownMayStartSelect;
319     
320     static NSEvent *_currentEvent;
321     static NSResponder *_firstResponderAtMouseDownTime;
322
323     KURL _submittedFormURL;
324
325     NSMutableDictionary *_formValuesAboutToBeSubmitted;
326     ObjCDOMElement *_formAboutToBeSubmitted;
327
328     static QPtrList<KWQKHTMLPart> &mutableInstances();
329
330     KWQWindowWidget *_windowWidget;
331
332     bool _usesInactiveTextBackgroundColor;
333     bool _showsFirstResponder;
334
335     QDict<char> urlsBridgeKnowsAbout;
336
337     friend class KHTMLPart;
338
339     QPtrList<KJS::Bindings::RootObject> rootObjects;
340 };
341
342 inline KWQKHTMLPart *KWQ(KHTMLPart *part) { return static_cast<KWQKHTMLPart *>(part); }
343 inline const KWQKHTMLPart *KWQ(const KHTMLPart *part) { return static_cast<const KWQKHTMLPart *>(part); }
344
345 #endif