LayoutTests:
[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 FrameMac_h
27 #define FrameMac_h
28
29 #import "ClipboardAccessPolicy.h"
30 #import "Frame.h"
31 #import "PlatformMouseEvent.h"
32 #import "WebCoreKeyboardAccess.h"
33
34 class NPObject;
35
36 namespace KJS {
37     namespace Bindings {
38         class Instance;
39         class RootObject;
40     }
41 }
42
43 #ifdef __OBJC__
44
45 @class NSArray;
46 @class NSDictionary;
47 @class NSEvent;
48 @class NSFont;
49 @class NSImage;
50 @class NSMenu;
51 @class NSMutableDictionary;
52 @class NSString;
53 @class NSView;
54 @class WebCoreFrameBridge;
55 @class WebScriptObject;
56
57 #else
58
59 class NSArray;
60 class NSDictionary;
61 class NSEvent;
62 class NSFont;
63 class NSImage;
64 class NSMenu;
65 class NSMutableDictionary;
66 class NSString;
67 class NSView;
68 class WebCoreFrameBridge;
69 class WebScriptObject;
70
71 typedef unsigned int NSDragOperation;
72 typedef int NSWritingDirection;
73
74 #endif
75
76 namespace WebCore {
77
78 class ClipboardMac;
79 class HTMLTableCellElement;
80 class RenderWidget;
81
82 enum SelectionDirection {
83     SelectingNext,
84     SelectingPrevious
85 };
86
87 class FrameMac : public Frame {
88     friend class Frame;
89
90 public:
91     FrameMac(Page*, Element*, PassRefPtr<EditorClient>);
92     ~FrameMac();
93
94     void setBridge(WebCoreFrameBridge*);
95     WebCoreFrameBridge* bridge() const { return _bridge; }
96
97 private:    
98     WebCoreFrameBridge* _bridge;
99
100 // === undecided, may or may not belong here
101
102 public:
103     virtual void setView(FrameView*);
104     
105     static WebCoreFrameBridge* bridgeForWidget(const Widget*);
106
107     NSString* searchForLabelsAboveCell(RegularExpression*, HTMLTableCellElement*);
108     NSString* searchForLabelsBeforeElement(NSArray* labels, Element*);
109     NSString* matchLabelsAgainstElement(NSArray* labels, Element*);
110
111     virtual KJS::Bindings::Instance* getEmbedInstanceForWidget(Widget*);
112     virtual KJS::Bindings::Instance* getObjectInstanceForWidget(Widget*);
113     virtual KJS::Bindings::Instance* getAppletInstanceForWidget(Widget*);
114     virtual KJS::Bindings::RootObject* bindingRootObject();
115
116     void addPluginRootObject(KJS::Bindings::RootObject*);
117
118     KJS::Bindings::RootObject* executionContextForDOM();
119     
120     WebScriptObject* windowScriptObject();
121     NPObject* windowScriptNPObject();
122     
123     NSMutableDictionary* dashboardRegionsDictionary();
124     void dashboardRegionsChanged();
125
126     void willPopupMenu(NSMenu *);
127
128     void cleanupPluginObjects();
129     bool shouldClose();
130
131 private:    
132     KJS::Bindings::RootObject* _bindingRoot; // The root object used for objects bound outside the context of a plugin.
133     Vector<KJS::Bindings::RootObject*> m_rootObjects;
134     WebScriptObject* _windowScriptObject;
135     NPObject* _windowScriptNPObject;
136
137 // === to be moved into Chrome
138
139 public:
140     virtual void setStatusBarText(const String&);
141
142     virtual void focusWindow();
143     virtual void unfocusWindow();
144
145     virtual void addMessageToConsole(const String& message, unsigned int lineNumber, const String& sourceID);
146     
147     virtual void runJavaScriptAlert(const String&);
148     virtual bool runJavaScriptConfirm(const String&);
149     virtual bool runJavaScriptPrompt(const String& message, const String& defaultValue, String& result);
150     virtual bool shouldInterruptJavaScript();    
151
152     FloatRect customHighlightLineRect(const AtomicString& type, const FloatRect& lineRect);
153     void paintCustomHighlight(const AtomicString& type, const FloatRect& boxRect, const FloatRect& lineRect, bool text, bool line);
154
155     virtual void print();
156
157     virtual void scheduleClose();
158
159 // === to be moved into Editor
160
161 public:
162     void advanceToNextMisspelling(bool startBeforeSelection = false);
163
164     NSFont* fontForSelection(bool* hasMultipleFonts) const;
165     NSDictionary* fontAttributesForSelectionStart() const;
166     
167     NSWritingDirection baseWritingDirectionForSelectionStart() const;
168
169     virtual void markMisspellingsInAdjacentWords(const VisiblePosition&);
170     virtual void markMisspellings(const Selection&);
171
172     virtual bool canRedo() const;
173     virtual bool canUndo() const;
174
175     bool canDHTMLCut();
176     bool canDHTMLCopy();
177     bool canDHTMLPaste();
178     bool tryDHTMLCut();
179     bool tryDHTMLCopy();
180     bool tryDHTMLPaste();
181     
182     virtual void registerCommandForUndo(PassRefPtr<EditCommand>);
183     virtual void registerCommandForRedo(PassRefPtr<EditCommand>);
184     virtual void clearUndoRedoOperations();
185     virtual void issueUndoCommand();
186     virtual void issueRedoCommand();
187     virtual void issueCutCommand();
188     virtual void issueCopyCommand();
189     virtual void issuePasteCommand();
190     virtual void issuePasteAndMatchStyleCommand();
191     virtual void issueTransposeCommand();
192     virtual void respondToChangedSelection(const Selection& oldSelection, bool closeTyping);
193     virtual void respondToChangedContents(const Selection&);
194     virtual bool isContentEditable() const;
195     virtual bool shouldChangeSelection(const Selection& oldSelection, const Selection& newSelection, EAffinity affinity, bool stillSelecting) const;
196     virtual bool shouldDeleteSelection(const Selection&) const;
197     
198     virtual void setSecureKeyboardEntry(bool);
199     virtual bool isSecureKeyboardEntry();
200
201     void setMarkedTextRange(const Range* , NSArray* attributes, NSArray* ranges);
202     virtual Range* markedTextRange() const { return m_markedTextRange.get(); }
203
204     virtual void textFieldDidBeginEditing(Element*);
205     virtual void textFieldDidEndEditing(Element*);
206     virtual void textDidChangeInTextField(Element*);
207     virtual bool doTextFieldCommandFromEvent(Element*, KeyboardEvent*);
208     virtual void textWillBeDeletedInTextField(Element*);
209     virtual void textDidChangeInTextArea(Element*);
210     
211 private:
212     bool dispatchCPPEvent(const AtomicString& eventType, ClipboardAccessPolicy);
213
214     void freeClipboard();
215
216     void registerCommandForUndoOrRedo(PassRefPtr<EditCommand>, bool isRedo);
217
218     bool _haveUndoRedoOperations;
219     RefPtr<Range> m_markedTextRange;
220     
221 // === to be moved into EventHandler
222
223 public:
224     NSView* nextKeyView(Node* startingPoint, SelectionDirection);
225     NSView* nextKeyViewInFrameHierarchy(Node* startingPoint, SelectionDirection);
226     static NSView* nextKeyViewForWidget(Widget* startingPoint, SelectionDirection);
227
228     PassRefPtr<KeyboardEvent> currentKeyboardEvent() const;
229
230     virtual bool tabsToLinks(KeyboardEvent*) const;
231     virtual bool tabsToAllControls(KeyboardEvent*) const;
232     
233     static bool currentEventIsMouseDownInWidget(Widget* candidate);
234
235     NSImage* selectionImage(bool forceWhiteText = false) const;
236     NSImage* snapshotDragImage(Node* node, NSRect* imageRect, NSRect* elementRect) const;
237
238     bool dispatchDragSrcEvent(const AtomicString &eventType, const PlatformMouseEvent&) const;
239
240     void mouseDown(NSEvent*);
241     void mouseDragged(NSEvent*);
242     void mouseUp(NSEvent*);
243     void mouseMoved(NSEvent*);
244     bool keyEvent(NSEvent*);
245     bool wheelEvent(NSEvent*);
246
247     void sendFakeEventsAfterWidgetTracking(NSEvent* initiatingEvent);
248
249     virtual bool lastEventIsMouseUp() const;
250     void setActivationEventNumber(int num) { _activationEventNumber = num; }
251
252     bool dragHysteresisExceeded(float dragLocationX, float dragLocationY) const;
253     bool eventMayStartDrag(NSEvent*) const;
254     void dragSourceMovedTo(const PlatformMouseEvent&);
255     void dragSourceEndedAt(const PlatformMouseEvent&, NSDragOperation);
256
257     bool sendContextMenuEvent(NSEvent*);
258
259     bool passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults&);
260     bool passWidgetMouseDownEventToWidget(RenderWidget*);
261     bool passMouseDownEventToWidget(Widget*);
262     bool passSubframeEventToSubframe(MouseEventWithHitTestResults&, Frame* subframePart);
263     bool passWheelEventToWidget(Widget*);
264     
265     WebCoreKeyboardUIMode keyboardUIMode() const;
266
267     virtual bool inputManagerHasMarkedText() const;
268     
269     virtual bool shouldDragAutoNode(Node*, const IntPoint&) const; // -webkit-user-drag == auto
270
271     virtual bool mouseDownMayStartSelect() const { return _mouseDownMayStartSelect; }
272     
273     NSEvent* currentEvent() { return _currentEvent; }
274
275 private:
276     virtual void handleMousePressEvent(const MouseEventWithHitTestResults&);
277     virtual void handleMouseMoveEvent(const MouseEventWithHitTestResults&);
278     virtual void handleMouseReleaseEvent(const MouseEventWithHitTestResults&);
279       
280     NSView* mouseDownViewIfStillGood();
281
282     NSView* nextKeyViewInFrame(Node* startingPoint, SelectionDirection, bool* focusCallResultedInViewBeingCreated = 0);
283     static NSView* documentViewForNode(Node*);
284
285     NSImage* imageFromRect(NSRect) const;
286
287     NSView* _mouseDownView;
288     bool _mouseDownWasInSubframe;
289     bool _sendingEventToSubview;
290     bool _mouseDownMayStartSelect;
291     PlatformMouseEvent m_mouseDown;
292     // in our view's coords
293     IntPoint m_mouseDownPos;
294     float _mouseDownTimestamp;
295     int _activationEventNumber;
296     
297     static NSEvent* _currentEvent;
298
299 // === to be moved into the Platform directory
300
301 public:
302     virtual String mimeTypeForFileName(const String&) const;
303     virtual bool isCharacterSmartReplaceExempt(UChar, bool);
304     
305 };
306
307 inline FrameMac* Mac(Frame* frame) { return static_cast<FrameMac*>(frame); }
308 inline const FrameMac* Mac(const Frame* frame) { return static_cast<const FrameMac*>(frame); }
309
310 }
311
312 #endif