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