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