a5ef847db58a9353139530b6ec9454938d408583
[WebKit-https.git] / WebCore / bridge / mac / FrameMac.h
1 /*
2  * Copyright (C) 2004, 2005, 2006 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 MacFrame_H
27 #define MacFrame_H
28
29 #include "Frame.h"
30 #include "IntRect.h"
31 #include "ClipboardMac.h"
32 #include "KWQScrollBar.h"
33 #include "PlatformMouseEvent.h"
34 #include "Node.h"
35 #include "WebCoreKeyboardAccess.h"
36 #include "TextAffinity.h"
37 #include <kxmlcore/HashSet.h>
38
39 #import <CoreFoundation/CoreFoundation.h>
40
41 class NPObject;
42
43 namespace KJS {
44     class PausedTimeouts;
45     class SavedProperties;
46     class SavedBuiltins;
47     class ScheduledAction;
48     namespace Bindings {
49         class Instance;
50         class RootObject;
51     }
52 }
53
54 #ifdef __OBJC__
55
56 // Avoid clashes with KJS::DOMElement in KHTML code.
57 @class DOMElement;
58 typedef DOMElement ObjCDOMElement;
59
60 @class KWQPageState;
61 @class NSArray;
62 @class NSAttributedString;
63 @class NSColor;
64 @class NSDictionary;
65 @class NSEvent;
66 @class NSFileWrapper;
67 @class NSFont;
68 @class NSImage;
69 @class NSMutableDictionary;
70 @class NSResponder;
71 @class NSString;
72 @class NSView;
73 @class WebCoreFrameBridge;
74 @class WebScriptObject;
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 NSDictionary;
86 class NSEvent;
87 class NSFileWrapper;
88 class NSFont;
89 class NSImage;
90 class NSMutableDictionary;
91 class NSResponder;
92 class NSString;
93 class NSView;
94 class WebCoreFrameBridge;
95 class WebScriptObject;
96
97 typedef int NSWritingDirection;
98
99 #endif
100
101 namespace WebCore {
102
103 class DocumentFragment;
104 class FramePrivate;
105 class HTMLTableCellElement;
106 class RenderObject;
107 class RenderStyle;
108 class VisiblePosition;
109
110 struct DashboardRegionValue;
111
112 enum KWQSelectionDirection {
113     KWQSelectingNext,
114     KWQSelectingPrevious
115 };
116
117 class FrameMac : public Frame
118 {
119 public:
120     FrameMac(Page*, RenderPart*);
121     ~FrameMac();
122     
123     void clear();
124
125     void setBridge(WebCoreFrameBridge* p);
126     WebCoreFrameBridge* bridge() const { return _bridge; }
127     virtual void setView(FrameView*);
128     virtual void frameDetached();
129
130     virtual bool openURL(const KURL&);
131     
132     virtual void openURLRequest(const ResourceRequest&);
133     virtual void submitForm(const ResourceRequest&);
134
135     String advanceToNextMisspelling(bool startBeforeSelection = false);
136     
137     virtual void setTitle(const String&);
138     virtual void setStatusBarText(const String&);
139
140     virtual void urlSelected(const ResourceRequest&);
141
142     virtual ObjectContentType objectContentType(const KURL& url, const String& mimeType);
143     virtual Plugin* createPlugin(const KURL& url, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType);
144     virtual Frame* createFrame(const KURL& url, const String& name, RenderPart* renderer, const String& referrer);
145
146     virtual void scheduleClose();
147
148     virtual void unfocusWindow();
149     
150     void openURLFromPageCache(KWQPageState* state);
151
152     virtual void saveDocumentState();
153     virtual void restoreDocumentState();
154     
155     virtual void addMessageToConsole(const String& message,  unsigned int lineNumber, const String& sourceID);
156     virtual void setDisplaysWithFocusAttributes(bool flag);
157     
158     NSView* nextKeyView(Node* startingPoint, KWQSelectionDirection);
159     NSView* nextKeyViewInFrameHierarchy(Node* startingPoint, KWQSelectionDirection);
160     static NSView* nextKeyViewForWidget(Widget* startingPoint, KWQSelectionDirection);
161     static bool currentEventIsKeyboardOptionTab();
162     static bool handleKeyboardOptionTabInView(NSView* view);
163     
164     virtual bool tabsToLinks() const;
165     virtual bool tabsToAllControls() const;
166     
167     static bool currentEventIsMouseDownInWidget(Widget* candidate);
168     
169     virtual void runJavaScriptAlert(const String& message);
170     virtual bool runJavaScriptConfirm(const String& message);
171     virtual bool runJavaScriptPrompt(const String& message, const String& defaultValue, String& result);
172     virtual bool locationbarVisible();
173     virtual bool menubarVisible();
174     virtual bool personalbarVisible();
175     virtual bool statusbarVisible();
176     virtual bool toolbarVisible();
177
178     bool shouldClose();
179
180     virtual void createEmptyDocument();
181
182     static WebCoreFrameBridge* bridgeForWidget(const Widget*);
183     
184     virtual String incomingReferrer() const;
185     virtual String userAgent() const;
186
187     virtual String mimeTypeForFileName(const String&) const;
188
189     NSImage* selectionImage() const;
190     NSImage* snapshotDragImage(Node* node, NSRect* imageRect, NSRect* elementRect) const;
191
192     bool dispatchDragSrcEvent(const AtomicString &eventType, const PlatformMouseEvent&) const;
193
194     NSFont* fontForSelection(bool* hasMultipleFonts) const;
195     NSDictionary* fontAttributesForSelectionStart() const;
196     
197     NSWritingDirection baseWritingDirectionForSelectionStart() const;
198
199     virtual void markMisspellingsInAdjacentWords(const VisiblePosition&);
200     virtual void markMisspellings(const SelectionController&);
201
202     NSFileWrapper* fileWrapperForElement(Element*);
203     NSAttributedString* attributedString(Node* startNode, int startOffset, Node* endNode, int endOffset);
204
205     void mouseDown(NSEvent*);
206     void mouseDragged(NSEvent*);
207     void mouseUp(NSEvent*);
208     void mouseMoved(NSEvent*);
209     bool keyEvent(NSEvent*);
210     bool wheelEvent(NSEvent*);
211
212     void sendFakeEventsAfterWidgetTracking(NSEvent* initiatingEvent);
213
214     virtual bool lastEventIsMouseUp() const;
215     void setActivationEventNumber(int num) { _activationEventNumber = num; }
216
217     bool dragHysteresisExceeded(float dragLocationX, float dragLocationY) const;
218     bool eventMayStartDrag(NSEvent*) const;
219     void dragSourceMovedTo(const PlatformMouseEvent&);
220     void dragSourceEndedAt(const PlatformMouseEvent&, NSDragOperation);
221
222     bool mayCut();
223     bool mayCopy();
224     bool mayPaste();
225     bool tryCut();
226     bool tryCopy();
227     bool tryPaste();
228     
229     bool sendContextMenuEvent(NSEvent*);
230
231     virtual bool passMouseDownEventToWidget(Widget*);
232     virtual bool passSubframeEventToSubframe(MouseEventWithHitTestResults&, Frame* subframePart);
233     virtual bool passWheelEventToChildWidget(Node*);
234     
235     NSString* searchForLabelsAboveCell(RegularExpression* regExp, HTMLTableCellElement* cell);
236     NSString* searchForLabelsBeforeElement(NSArray* labels, Element* element);
237     NSString* matchLabelsAgainstElement(NSArray* labels, Element* element);
238
239     bool findString(NSString* str, bool forward, bool caseFlag, bool wrapFlag);
240
241     virtual void tokenizerProcessedData();
242
243     virtual String overrideMediaType() const;
244     
245     NSColor* bodyBackgroundColor() const;
246     
247     WebCoreKeyboardUIMode keyboardUIMode() const;
248
249     void didTellBridgeAboutLoad(const String& URL);
250     bool haveToldBridgeAboutLoad(const String& URL);
251
252     virtual KJS::Bindings::Instance* getEmbedInstanceForWidget(Widget*);
253     virtual KJS::Bindings::Instance* getObjectInstanceForWidget(Widget*);
254     virtual KJS::Bindings::Instance* getAppletInstanceForWidget(Widget*);
255     void addPluginRootObject(const KJS::Bindings::RootObject* root);
256     void cleanupPluginRootObjects();
257     
258     virtual void registerCommandForUndo(const EditCommandPtr&);
259     virtual void registerCommandForRedo(const EditCommandPtr&);
260     virtual void clearUndoRedoOperations();
261     virtual void issueUndoCommand();
262     virtual void issueRedoCommand();
263     virtual void issueCutCommand();
264     virtual void issueCopyCommand();
265     virtual void issuePasteCommand();
266     virtual void issuePasteAndMatchStyleCommand();
267     virtual void issueTransposeCommand();
268     virtual void respondToChangedSelection(const SelectionController &oldSelection, bool closeTyping);
269     virtual void respondToChangedContents();
270     virtual bool isContentEditable() const;
271     virtual bool shouldChangeSelection(const SelectionController &oldSelection, const SelectionController &newSelection, EAffinity affinity, bool stillSelecting) const;
272     virtual bool shouldBeginEditing(const Range*) const;
273     virtual bool shouldEndEditing(const Range*) const;
274     virtual void didBeginEditing() const;
275     virtual void didEndEditing() const;
276
277     KJS::Bindings::RootObject* executionContextForDOM();
278     KJS::Bindings::RootObject* bindingRootObject();
279     
280     WebScriptObject* windowScriptObject();
281     NPObject* windowScriptNPObject();
282     
283     virtual void partClearedInBegin();
284     
285     // Implementation of CSS property -khtml-user-drag == auto
286     virtual bool shouldDragAutoNode(Node*, int x, int y) const;
287
288     void setMarkedTextRange(const Range* , NSArray* attributes, NSArray* ranges);
289     virtual Range* markedTextRange() const { return m_markedTextRange.get(); }
290
291     virtual bool canGoBackOrForward(int distance) const;
292
293     virtual void didFirstLayout();
294     
295     NSMutableDictionary* dashboardRegionsDictionary();
296     void dashboardRegionsChanged();
297     
298     virtual bool isCharacterSmartReplaceExempt(const QChar &, bool);
299     
300     virtual bool mouseDownMayStartSelect() const { return _mouseDownMayStartSelect; }
301     
302     virtual void handledOnloadEvents();
303
304     virtual bool canPaste() const;
305     virtual bool canRedo() const;
306     virtual bool canUndo() const;
307     virtual void print();
308
309 protected:
310     virtual void startRedirectionTimer();
311     virtual void stopRedirectionTimer();
312     virtual void redirectionTimerFired(Timer<Frame>*);
313
314 private:
315     virtual void handleMousePressEvent(const MouseEventWithHitTestResults&);
316     virtual void handleMouseMoveEvent(const MouseEventWithHitTestResults&);
317     virtual void handleMouseReleaseEvent(const MouseEventWithHitTestResults&);
318     
319     NSView* mouseDownViewIfStillGood();
320
321     NSView* nextKeyViewInFrame(Node* startingPoint, KWQSelectionDirection);
322     static NSView* documentViewForNode(Node*);
323     
324     bool dispatchCPPEvent(const AtomicString &eventType, ClipboardMac::AccessPolicy policy);
325
326     NSImage* imageFromRect(NSRect rect) const;
327
328     void freeClipboard();
329
330     void registerCommandForUndoOrRedo(const EditCommandPtr &cmd, bool isRedo);
331
332     virtual void detachFromView();
333
334     WebCoreFrameBridge* _bridge;
335     
336     NSView* _mouseDownView;
337     bool _mouseDownWasInSubframe;
338     bool _sendingEventToSubview;
339     bool _mouseDownMayStartDrag;
340     bool _mouseDownMayStartSelect;
341     PlatformMouseEvent m_mouseDown;
342     // in our view's coords
343     int _mouseDownX, _mouseDownY;
344     float _mouseDownTimestamp;
345     int _activationEventNumber;
346     
347     static NSEvent* _currentEvent;
348
349     NSMutableDictionary* _formValuesAboutToBeSubmitted;
350     ObjCDOMElement* _formAboutToBeSubmitted;
351
352     bool _haveUndoRedoOperations;
353     
354     HashSet<RefPtr<StringImpl> > urlsBridgeKnowsAbout;
355
356     friend class Frame;
357
358     KJS::Bindings::RootObject* _bindingRoot;  // The root object used for objects
359                                             // bound outside the context of a plugin.
360     DeprecatedPtrList<KJS::Bindings::RootObject> rootObjects;
361     WebScriptObject* _windowScriptObject;
362     NPObject* _windowScriptNPObject;
363     
364     RefPtr<Node> _dragSrc;     // element that may be a drag source, for the current mouse gesture
365     bool _dragSrcIsLink;
366     bool _dragSrcIsImage;
367     bool _dragSrcInSelection;
368     bool _dragSrcMayBeDHTML, _dragSrcMayBeUA;   // Are DHTML and/or the UserAgent allowed to drag out?
369     bool _dragSrcIsDHTML;
370     RefPtr<ClipboardMac> _dragClipboard;   // used on only the source side of dragging
371     
372     RefPtr<Range> m_markedTextRange;
373 };
374
375 inline FrameMac* Mac(Frame* frame) { return static_cast<FrameMac*>(frame); }
376 inline const FrameMac* Mac(const Frame* frame) { return static_cast<const FrameMac*>(frame); }
377
378 }
379
380 #endif