Reviewed by John.
[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/npruntime.h>
42 #include <JavaScriptCore/NP_jsobject.h>
43 #include <JavaScriptCore/runtime.h>
44
45 #include "KWQDict.h"
46 #include "KWQClipboard.h"
47
48 class KHTMLPartPrivate;
49 class KWQClipboard;
50 class KWQWindowWidget;
51
52 namespace khtml {
53     class RenderObject;
54 }
55
56 namespace KJS {
57     class SavedProperties;
58     class SavedBuiltins;
59     class ScheduledAction;
60 }
61
62 #ifdef __OBJC__
63
64 // Avoid clashes with KJS::DOMElement in KHTML code.
65 @class DOMElement;
66 typedef DOMElement ObjCDOMElement;
67
68 @class KWQPageState;
69 @class NSArray;
70 @class NSAttributedString;
71 @class NSColor;
72 @class NSEvent;
73 @class NSFileWrapper;
74 @class NSFont;
75 @class NSImage;
76 @class NSMutableDictionary;
77 @class NSResponder;
78 @class NSString;
79 @class NSView;
80 @class WebCoreBridge;
81 @class WebScriptObject;
82
83 #else
84
85 // Avoid clashes with KJS::DOMElement in KHTML code.
86 class ObjCDOMElement;
87
88 class KWQPageState;
89 class NSArray;
90 class NSAttributedString;
91 class NSColor;
92 class NSEvent;
93 class NSFileWrapper;
94 class NSFont;
95 class NSImage;
96 class NSMutableDictionary;
97 class NSResponder;
98 class NSString;
99 class NSView;
100 class WebCoreBridge;
101 class WebScriptObject;
102
103 #endif
104
105 enum KWQSelectionDirection {
106     KWQSelectingNext,
107     KWQSelectingPrevious
108 };
109
110 class KWQKHTMLPart : public KHTMLPart
111 {
112 public:
113     KWQKHTMLPart();
114     ~KWQKHTMLPart();
115     
116     void clear();
117
118     void setBridge(WebCoreBridge *p);
119     WebCoreBridge *bridge() const { return _bridge; }
120     void setView(KHTMLView *view);
121     KHTMLView *view() const;
122
123     void provisionalLoadStarted();
124
125     virtual bool openURL(const KURL &);
126     virtual bool closeURL();
127     void didNotOpenURL(const KURL &);
128     
129     void openURLRequest(const KURL &, const KParts::URLArgs &);
130     void submitForm(const KURL &, const KParts::URLArgs &);
131
132     void scheduleHistoryNavigation( int steps );
133     
134     void scrollToAnchor(const KURL &);
135     void jumpToSelection();
136     QString advanceToNextMisspelling();
137     
138     void setEncoding(const QString &encoding, bool userChosen);
139     void addData(const char *bytes, int length);
140
141     void setTitle(const DOM::DOMString &);
142     void setStatusBarText(const QString &status);
143
144     void urlSelected(const KURL &url, int button, int state, const KParts::URLArgs &args);
145     bool requestObject(khtml::RenderPart *frame, const QString &url, const QString &serviceType, const QStringList &args);
146     KParts::ReadOnlyPart *createPart(const khtml::ChildFrame &child, const KURL &url, const QString &mimeType);
147
148     void scheduleClose();
149
150     void unfocusWindow();
151
152     QMap<int, KJS::ScheduledAction*> *pauseActions(const void *key);
153     void resumeActions(QMap<int, KJS::ScheduledAction*> *actions, const void *key);
154     
155     bool canCachePage();
156     void saveWindowProperties(KJS::SavedProperties *windowProperties);
157     void saveLocationProperties(KJS::SavedProperties *locationProperties);
158     void restoreWindowProperties(KJS::SavedProperties *windowProperties);
159     void restoreLocationProperties(KJS::SavedProperties *locationProperties);
160     void saveInterpreterBuiltins(KJS::SavedBuiltins &interpreterBuiltins);
161     void restoreInterpreterBuiltins(const KJS::SavedBuiltins &interpreterBuiltins);
162
163     void openURLFromPageCache(KWQPageState *state);
164
165     void saveDocumentState();
166     void restoreDocumentState();
167     
168     bool isFrameSet() const;
169
170     void updatePolicyBaseURL();
171
172     NSView *nextKeyView(DOM::NodeImpl *startingPoint, KWQSelectionDirection);
173     NSView *nextKeyViewInFrameHierarchy(DOM::NodeImpl *startingPoint, KWQSelectionDirection);
174     static NSView *nextKeyViewForWidget(QWidget *startingPoint, KWQSelectionDirection);
175     static bool currentEventIsKeyboardOptionTab();
176     static bool handleKeyboardOptionTabInView(NSView *view);
177     
178     virtual bool tabsToLinks() const;
179     virtual bool tabsToAllControls() const;
180     
181     static bool currentEventIsMouseDownInWidget(QWidget *candidate);
182     
183     static void setDocumentFocus(QWidget *);
184     static void clearDocumentFocus(QWidget *);
185     
186     void runJavaScriptAlert(const QString &message);
187     bool runJavaScriptConfirm(const QString &message);
188     bool runJavaScriptPrompt(const QString &message, const QString &defaultValue, QString &result);
189     bool locationbarVisible();
190     bool menubarVisible();
191     bool personalbarVisible();
192     bool scrollbarsVisible();
193     bool statusbarVisible();
194     bool toolbarVisible();
195
196     void KWQKHTMLPart::addMessageToConsole(const QString &message,  unsigned int lineNumber, const QString &sourceID);
197     using KHTMLPart::xmlDocImpl;
198     khtml::RenderObject *renderer();
199     void forceLayout();
200     void forceLayoutWithPageWidthRange(float minPageWidth, float maxPageWidth);
201     void sendResizeEvent();
202     void sendScrollEvent();
203     void paint(QPainter *, const QRect &);
204
205     void adjustPageHeight(float *newBottom, float oldTop, float oldBottom, float bottomLimit);
206
207     void createEmptyDocument();
208
209     static WebCoreBridge *bridgeForWidget(const QWidget *);
210     static KWQKHTMLPart *partForWidget(const QWidget *);
211     
212     QString requestedURLString() const;
213     QString incomingReferrer() const;
214     QString userAgent() const;
215
216     QString mimeTypeForFileName(const QString &) const;
217     
218     DOM::NodeImpl *selectionStart() const;
219     int selectionStartOffset() const;
220     DOM::NodeImpl *selectionEnd() const;
221     int selectionEndOffset() const;
222
223     QRect selectionRect() const;
224     NSRect visibleSelectionRect() const;
225     NSImage *selectionImage() const;
226     NSImage *snapshotDragImage(DOM::Node node, NSRect *imageRect, NSRect *elementRect) const;
227
228     NSFont *fontForCurrentPosition() const;
229     void markMisspellingsInSelection(const DOM::Selection &selection);
230     void updateSpellChecking();
231
232     NSFileWrapper *fileWrapperForElement(DOM::ElementImpl *);
233     NSAttributedString *attributedString(DOM::NodeImpl *startNode, int startOffset, DOM::NodeImpl *endNode, int endOffset);
234
235     void addMetaData(const QString &key, const QString &value);
236
237     void mouseDown(NSEvent *);
238     void mouseDragged(NSEvent *);
239     void mouseUp(NSEvent *);
240     void sendFakeEventsAfterWidgetTracking(NSEvent *initiatingEvent);
241     void mouseMoved(NSEvent *);
242     bool keyEvent(NSEvent *);
243     bool lastEventIsMouseUp();
244     void setActivationEventNumber(int num) { _activationEventNumber = num; }
245
246     bool eventMayStartDrag(NSEvent *);
247     void dragSourceMovedTo(const QPoint &loc);
248     void dragSourceEndedAt(const QPoint &loc, NSDragOperation operation);
249
250     bool mayCut();
251     bool mayCopy();
252     bool mayPaste();
253     bool tryCut();
254     bool tryCopy();
255     bool tryPaste();
256     
257     bool sendContextMenuEvent(NSEvent *);
258
259     void clearTimers();
260     static void clearTimers(KHTMLView *);
261     
262     bool passSubframeEventToSubframe(DOM::NodeImpl::MouseEvent &);
263     
264     void redirectionTimerStartedOrStopped();
265     
266     static const QPtrList<KWQKHTMLPart> &instances() { return mutableInstances(); }
267
268     void clearRecordedFormValues();
269     void recordFormValue(const QString &name, const QString &value, DOM::HTMLFormElementImpl *element);
270     DOM::HTMLFormElementImpl *currentForm() const;
271
272     NSString *searchForLabelsAboveCell(QRegExp *regExp, DOM::HTMLTableCellElementImpl *cell);
273     NSString *searchForLabelsBeforeElement(NSArray *labels, DOM::ElementImpl *element);
274     NSString *matchLabelsAgainstElement(NSArray *labels, DOM::ElementImpl *element);
275
276     bool findString(NSString *str, bool forward, bool caseFlag, bool wrapFlag);
277
278     void setSettings(KHTMLSettings *);
279
280     KWQWindowWidget *topLevelWidget();
281     
282     QString overrideMediaType();
283     
284     void setMediaType(const QString &);
285
286     void setDisplaysWithFocusAttributes(bool flag);
287     bool displaysWithFocusAttributes() const { return _displaysWithFocusAttributes; }
288     
289     // Convenience, to avoid repeating the code to dig down to get this.
290     QChar backslashAsCurrencySymbol() const;
291
292     NSColor *bodyBackgroundColor() const;
293     
294     WebCoreKeyboardUIMode keyboardUIMode() const;
295
296     void setName(const QString &name);
297
298     void didTellBridgeAboutLoad(const QString &urlString);
299     bool haveToldBridgeAboutLoad(const QString &urlString);
300
301     KJS::Bindings::Instance *getEmbedInstanceForView (NSView *aView);
302     KJS::Bindings::Instance *getAppletInstanceForView (NSView *aView);
303     void addPluginRootObject(const KJS::Bindings::RootObject *root);
304     void cleanupPluginRootObjects();
305     
306     void registerCommandForUndo(const khtml::EditCommand &);
307     void registerCommandForRedo(const khtml::EditCommand &);
308     void clearUndoRedoOperations();
309     void issueUndoCommand();
310     void issueRedoCommand();
311     void issueCutCommand();
312     void issueCopyCommand();
313     void issuePasteCommand();
314     void respondToChangedSelection();
315     void respondToChangedContents();
316     bool isContentEditable() const;
317     bool shouldBeginEditing(const DOM::Range &) const;
318     bool shouldEndEditing(const DOM::Range &) const;
319
320     KJS::Bindings::RootObject *bindingRootObject();
321     
322     WebScriptObject *windowScriptObject();
323     NPObject *KWQKHTMLPart::windowScriptNPObject();
324     
325     void partClearedInBegin();
326     
327     // Implementation of CSS property -khtml-user-drag == auto
328     bool shouldDragAutoNode(DOM::NodeImpl*, int x, int y) const;
329
330     DOM::Range markedRange() const;
331     void setMarkedRange(const DOM::Range &);
332
333     bool canGoBackOrForward(int distance);
334 private:
335     virtual void khtmlMousePressEvent(khtml::MousePressEvent *);
336     virtual void khtmlMouseDoubleClickEvent(khtml::MouseDoubleClickEvent *);
337     virtual void khtmlMouseMoveEvent(khtml::MouseMoveEvent *);
338     virtual void khtmlMouseReleaseEvent(khtml::MouseReleaseEvent *);
339     
340     bool passWidgetMouseDownEventToWidget(khtml::MouseEvent *);
341     bool passWidgetMouseDownEventToWidget(khtml::RenderWidget *);
342     bool passWidgetMouseDownEventToWidget(QWidget *);
343     
344     void setPolicyBaseURL(const DOM::DOMString &);
345     
346     NSView *mouseDownViewIfStillGood();
347
348     QString generateFrameName();
349
350     NSView *nextKeyViewInFrame(DOM::NodeImpl *startingPoint, KWQSelectionDirection);
351     static DOM::NodeImpl *nodeForWidget(const QWidget *);
352     static KWQKHTMLPart *partForNode(DOM::NodeImpl *);
353     static NSView *documentViewForNode(DOM::NodeImpl *);
354     
355     bool dragHysteresisExceeded(float dragLocationX, float dragLocationY) const;
356     bool dispatchCPPEvent(int eventId, KWQClipboard::AccessPolicy policy);
357     bool dispatchDragSrcEvent(int eventId, const QPoint &loc) const;
358
359     NSImage *imageFromRect(NSRect rect) const;
360
361     void freeClipboard();
362
363     WebCoreBridge *_bridge;
364     
365     KWQSignal _started;
366     KWQSignal _completed;
367     KWQSignal _completedWithBool;
368     
369     NSView *_mouseDownView;
370     bool _mouseDownWasInSubframe;
371     bool _sendingEventToSubview;
372     bool _mouseDownMayStartDrag;
373     bool _mouseDownMayStartSelect;
374     // in our window's coords
375     int _mouseDownWinX, _mouseDownWinY;
376     // in our view's coords
377     int _mouseDownX, _mouseDownY;
378     float _mouseDownTimestamp;
379     int _activationEventNumber;
380     
381     static NSEvent *_currentEvent;
382     static NSResponder *_firstResponderAtMouseDownTime;
383
384     KURL _submittedFormURL;
385
386     NSMutableDictionary *_formValuesAboutToBeSubmitted;
387     ObjCDOMElement *_formAboutToBeSubmitted;
388
389     static QPtrList<KWQKHTMLPart> &mutableInstances();
390
391     KWQWindowWidget *_windowWidget;
392
393     bool _displaysWithFocusAttributes;
394     mutable bool _drawSelectionOnly;
395     bool _haveUndoRedoOperations;
396     
397     QDict<char> urlsBridgeKnowsAbout;
398
399     friend class KHTMLPart;
400
401     KJS::Bindings::RootObject *_bindingRoot;  // The root object used for objects
402                                             // bound outside the context of a plugin.
403     QPtrList<KJS::Bindings::RootObject> rootObjects;
404     WebScriptObject *_windowScriptObject;
405     NPObject *_windowScriptNPObject;
406     
407     DOM::Node _dragSrc;     // element that may be a drag source, for the current mouse gesture
408     bool _dragSrcIsLink;
409     bool _dragSrcIsImage;
410     bool _dragSrcInSelection;
411     bool _dragSrcMayBeDHTML, _dragSrcMayBeUA;   // Are DHTML and/or the UserAgent allowed to drag out?
412     bool _dragSrcIsDHTML;
413     KWQClipboard *_dragClipboard;   // used on only the source side of dragging
414     
415     mutable DOM::Node _elementToDraw;
416
417     DOM::Range m_markedRange;
418 };
419
420 inline KWQKHTMLPart *KWQ(KHTMLPart *part) { return static_cast<KWQKHTMLPart *>(part); }
421 inline const KWQKHTMLPart *KWQ(const KHTMLPart *part) { return static_cast<const KWQKHTMLPart *>(part); }
422
423 #endif