45b18d5d498ce852284355efaf33078ed310be57
[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     NSImage *selectionImage() const;
230     NSImage *snapshotDragImage(DOM::Node node, NSRect *imageRect, NSRect *elementRect) const;
231
232     NSFont *fontForSelection(bool *hasMultipleFonts) const;
233     void markMisspellingsInAdjacentWords(const khtml::VisiblePosition &);
234     void markMisspellings(const khtml::Selection &);
235
236     NSFileWrapper *fileWrapperForElement(DOM::ElementImpl *);
237     NSAttributedString *attributedString(DOM::NodeImpl *startNode, int startOffset, DOM::NodeImpl *endNode, int endOffset);
238
239     void addMetaData(const QString &key, const QString &value);
240
241     void mouseDown(NSEvent *);
242     void mouseDragged(NSEvent *);
243     void mouseUp(NSEvent *);
244     void sendFakeEventsAfterWidgetTracking(NSEvent *initiatingEvent);
245     void mouseMoved(NSEvent *);
246     bool keyEvent(NSEvent *);
247
248     bool lastEventIsMouseUp() const;
249     void setActivationEventNumber(int num) { _activationEventNumber = num; }
250
251     bool eventMayStartDrag(NSEvent *) const;
252     void dragSourceMovedTo(const QPoint &loc);
253     void dragSourceEndedAt(const QPoint &loc, NSDragOperation operation);
254
255     bool mayCut();
256     bool mayCopy();
257     bool mayPaste();
258     bool tryCut();
259     bool tryCopy();
260     bool tryPaste();
261     
262     bool sendContextMenuEvent(NSEvent *);
263
264     // Call this method before handling a new user action, like on a mouse down or key down.
265     // Currently, all this does is clear the "don't submit form twice" data member.
266     void prepareForUserAction();
267
268     void clearTimers();
269     static void clearTimers(KHTMLView *);
270     
271     bool passSubframeEventToSubframe(DOM::NodeImpl::MouseEvent &);
272     
273     void redirectionTimerStartedOrStopped();
274     
275     static const QPtrList<KWQKHTMLPart> &instances() { return mutableInstances(); }
276
277     void clearRecordedFormValues();
278     void recordFormValue(const QString &name, const QString &value, DOM::HTMLFormElementImpl *element);
279     DOM::HTMLFormElementImpl *currentForm() const;
280
281     NSString *searchForLabelsAboveCell(QRegExp *regExp, DOM::HTMLTableCellElementImpl *cell);
282     NSString *searchForLabelsBeforeElement(NSArray *labels, DOM::ElementImpl *element);
283     NSString *matchLabelsAgainstElement(NSArray *labels, DOM::ElementImpl *element);
284
285     bool findString(NSString *str, bool forward, bool caseFlag, bool wrapFlag);
286
287     void setSettings(KHTMLSettings *);
288
289     KWQWindowWidget *topLevelWidget();
290     
291     QString overrideMediaType() const;
292     
293     void setMediaType(const QString &);
294
295     void setSelectionFromNone();
296     void setDisplaysWithFocusAttributes(bool flag);
297     bool displaysWithFocusAttributes() const;
298     
299     // Convenience, to avoid repeating the code to dig down to get this.
300     QChar backslashAsCurrencySymbol() const;
301
302     NSColor *bodyBackgroundColor() const;
303     
304     WebCoreKeyboardUIMode keyboardUIMode() const;
305
306     void setName(const QString &name);
307
308     void didTellBridgeAboutLoad(const QString &urlString);
309     bool haveToldBridgeAboutLoad(const QString &urlString);
310
311     KJS::Bindings::Instance *getEmbedInstanceForView (NSView *aView);
312     KJS::Bindings::Instance *getAppletInstanceForView (NSView *aView);
313     void addPluginRootObject(const KJS::Bindings::RootObject *root);
314     void cleanupPluginRootObjects();
315     
316     DOM::DocumentFragmentImpl *documentFragmentWithText(NSString *text);
317     
318     void registerCommandForUndo(const khtml::EditCommandPtr &);
319     void registerCommandForRedo(const khtml::EditCommandPtr &);
320     void clearUndoRedoOperations();
321     void issueUndoCommand();
322     void issueRedoCommand();
323     void issueCutCommand();
324     void issueCopyCommand();
325     void issuePasteCommand();
326     void respondToChangedSelection(const khtml::Selection &oldSelection, bool closeTyping);
327     void respondToChangedContents();
328     bool isContentEditable() const;
329     bool shouldBeginEditing(const DOM::Range &) const;
330     bool shouldEndEditing(const DOM::Range &) const;
331
332     KJS::Bindings::RootObject *bindingRootObject();
333     
334     WebScriptObject *windowScriptObject();
335     NPObject *KWQKHTMLPart::windowScriptNPObject();
336     
337     void partClearedInBegin();
338     
339     // Implementation of CSS property -khtml-user-drag == auto
340     bool shouldDragAutoNode(DOM::NodeImpl*, int x, int y) const;
341
342     DOM::Range markedTextRange() const;
343     void setMarkedTextRange(const DOM::Range &);
344
345     bool canGoBackOrForward(int distance) const;
346
347     void didFirstLayout();
348     
349     NSMutableDictionary *dashboardRegionsDictionary();
350     void dashboardRegionsChanged();
351     
352 private:
353     virtual void khtmlMousePressEvent(khtml::MousePressEvent *);
354     virtual void khtmlMouseDoubleClickEvent(khtml::MouseDoubleClickEvent *);
355     virtual void khtmlMouseMoveEvent(khtml::MouseMoveEvent *);
356     virtual void khtmlMouseReleaseEvent(khtml::MouseReleaseEvent *);
357     
358     bool passWidgetMouseDownEventToWidget(khtml::MouseEvent *);
359     bool passWidgetMouseDownEventToWidget(khtml::RenderWidget *);
360     bool passWidgetMouseDownEventToWidget(QWidget *);
361     
362     void setPolicyBaseURL(const DOM::DOMString &);
363     
364     NSView *mouseDownViewIfStillGood();
365
366     QString generateFrameName();
367
368     NSView *nextKeyViewInFrame(DOM::NodeImpl *startingPoint, KWQSelectionDirection);
369     static DOM::NodeImpl *nodeForWidget(const QWidget *);
370     static KWQKHTMLPart *partForNode(DOM::NodeImpl *);
371     static NSView *documentViewForNode(DOM::NodeImpl *);
372     
373     bool dragHysteresisExceeded(float dragLocationX, float dragLocationY) const;
374     bool dispatchCPPEvent(int eventId, KWQClipboard::AccessPolicy policy);
375     bool dispatchDragSrcEvent(int eventId, const QPoint &loc) const;
376
377     NSImage *imageFromRect(NSRect rect) const;
378
379     void freeClipboard();
380
381     WebCoreBridge *_bridge;
382     
383     KWQSignal _started;
384     KWQSignal _completed;
385     KWQSignal _completedWithBool;
386     
387     NSView *_mouseDownView;
388     bool _mouseDownWasInSubframe;
389     bool _sendingEventToSubview;
390     bool _mouseDownMayStartDrag;
391     bool _mouseDownMayStartSelect;
392     // in our window's coords
393     int _mouseDownWinX, _mouseDownWinY;
394     // in our view's coords
395     int _mouseDownX, _mouseDownY;
396     float _mouseDownTimestamp;
397     int _activationEventNumber;
398     
399     static NSEvent *_currentEvent;
400     static NSResponder *_firstResponderAtMouseDownTime;
401
402     KURL _submittedFormURL;
403
404     NSMutableDictionary *_formValuesAboutToBeSubmitted;
405     ObjCDOMElement *_formAboutToBeSubmitted;
406
407     static QPtrList<KWQKHTMLPart> &mutableInstances();
408
409     KWQWindowWidget *_windowWidget;
410
411     mutable bool _drawSelectionOnly;
412     bool _haveUndoRedoOperations;
413     
414     QDict<char> urlsBridgeKnowsAbout;
415
416     friend class KHTMLPart;
417
418     KJS::Bindings::RootObject *_bindingRoot;  // The root object used for objects
419                                             // bound outside the context of a plugin.
420     QPtrList<KJS::Bindings::RootObject> rootObjects;
421     WebScriptObject *_windowScriptObject;
422     NPObject *_windowScriptNPObject;
423     
424     DOM::Node _dragSrc;     // element that may be a drag source, for the current mouse gesture
425     bool _dragSrcIsLink;
426     bool _dragSrcIsImage;
427     bool _dragSrcInSelection;
428     bool _dragSrcMayBeDHTML, _dragSrcMayBeUA;   // Are DHTML and/or the UserAgent allowed to drag out?
429     bool _dragSrcIsDHTML;
430     KWQClipboard *_dragClipboard;   // used on only the source side of dragging
431     
432     mutable DOM::Node _elementToDraw;
433
434     DOM::Range m_markedTextRange;
435 };
436
437 inline KWQKHTMLPart *KWQ(KHTMLPart *part) { return static_cast<KWQKHTMLPart *>(part); }
438 inline const KWQKHTMLPart *KWQ(const KHTMLPart *part) { return static_cast<const KWQKHTMLPart *>(part); }
439
440 #endif