3bd9662a738274a0bd8e46d5259c7626e7717576
[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 "ClipboardMac.h"
30 #import "Frame.h"
31 #import "IntRect.h"
32 #import "PlatformMouseEvent.h"
33 #import "StringHash.h"
34 #import "WebCoreKeyboardAccess.h"
35
36 class NPObject;
37
38 namespace KJS {
39     class PausedTimeouts;
40     class SavedProperties;
41     class SavedBuiltins;
42     class ScheduledAction;
43     namespace Bindings {
44         class Instance;
45         class RootObject;
46     }
47 }
48
49 #ifdef __OBJC__
50
51 // Avoid clashes with KJS::DOMElement in KHTML code.
52 @class DOMElement;
53 typedef DOMElement ObjCDOMElement;
54
55 @class WebCorePageState;
56 @class NSArray;
57 @class NSAttributedString;
58 @class NSColor;
59 @class NSDictionary;
60 @class NSEvent;
61 @class NSFileWrapper;
62 @class NSFont;
63 @class NSImage;
64 @class NSMenu;
65 @class NSMutableDictionary;
66 @class NSResponder;
67 @class NSString;
68 @class NSView;
69 @class WebCoreFrameBridge;
70 @class WebScriptObject;
71
72 #else
73
74 // Avoid clashes with KJS::DOMElement in KHTML code.
75 class ObjCDOMElement;
76
77 class WebCorePageState;
78 class NSArray;
79 class NSAttributedString;
80 class NSColor;
81 class NSDictionary;
82 class NSEvent;
83 class NSFileWrapper;
84 class NSFont;
85 class NSImage;
86 class NSMenu;
87 class NSMutableDictionary;
88 class NSResponder;
89 class NSString;
90 class NSView;
91 class WebCoreFrameBridge;
92 class WebScriptObject;
93
94 typedef int NSWritingDirection;
95
96 #endif
97
98 namespace WebCore {
99
100 class DocumentFragment;
101 class FramePrivate;
102 class HTMLTableCellElement;
103 class RenderObject;
104 class RenderStyle;
105 class VisiblePosition;
106
107 struct DashboardRegionValue;
108
109 enum SelectionDirection {
110     SelectingNext,
111     SelectingPrevious
112 };
113
114 class FrameMac : public Frame
115 {
116 public:
117     FrameMac(Page*, Element*);
118     ~FrameMac();
119     
120     void clear();
121
122     void setBridge(WebCoreFrameBridge* p);
123     WebCoreFrameBridge* bridge() const { return _bridge; }
124     virtual void setView(FrameView*);
125     virtual void frameDetached();
126
127     virtual bool openURL(const KURL&);
128     
129     virtual void openURLRequest(const ResourceRequest&);
130     virtual void submitForm(const ResourceRequest&);
131
132     String advanceToNextMisspelling(bool startBeforeSelection = false);
133     
134     virtual void setTitle(const String&);
135     virtual void setStatusBarText(const String&);
136
137     virtual void urlSelected(const ResourceRequest&);
138
139     virtual ObjectContentType objectContentType(const KURL& url, const String& mimeType);
140     virtual Plugin* createPlugin(Element* element, const KURL& url, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType);
141     virtual void redirectDataToPlugin(Widget* pluginWidget);
142
143     virtual Frame* createFrame(const KURL& url, const String& name, Element* ownerElement, const String& referrer);
144
145     virtual void scheduleClose();
146
147     virtual void focusWindow();
148     virtual void unfocusWindow();
149     
150     void openURLFromPageCache(WebCorePageState*);
151
152     virtual void saveDocumentState();
153     virtual void restoreDocumentState();
154     
155     virtual void addMessageToConsole(const String& message,  unsigned int lineNumber, const String& sourceID);
156     
157     NSView* nextKeyView(Node* startingPoint, SelectionDirection);
158     NSView* nextKeyViewInFrameHierarchy(Node* startingPoint, SelectionDirection);
159     static NSView* nextKeyViewForWidget(Widget* startingPoint, SelectionDirection);
160     static bool currentEventIsKeyboardOptionTab();
161     static bool handleKeyboardOptionTabInView(NSView* view);
162     
163     virtual bool tabsToLinks() const;
164     virtual bool tabsToAllControls() const;
165     
166     static bool currentEventIsMouseDownInWidget(Widget* candidate);
167     
168     virtual void runJavaScriptAlert(const String&);
169     virtual bool runJavaScriptConfirm(const String&);
170     virtual bool runJavaScriptPrompt(const String& message, const String& defaultValue, String& result);
171     virtual bool shouldInterruptJavaScript();    
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(bool forceWhiteText = false) 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 Selection&);
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 mayDHTMLCut();
223     bool mayDHTMLCopy();
224     bool mayDHTMLPaste();
225     bool tryDHTMLCut();
226     bool tryDHTMLCopy();
227     bool tryDHTMLPaste();
228     
229     bool sendContextMenuEvent(NSEvent*);
230
231     bool passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults&);
232     bool passWidgetMouseDownEventToWidget(RenderWidget*);
233     bool passMouseDownEventToWidget(Widget*);
234     bool passSubframeEventToSubframe(MouseEventWithHitTestResults&, Frame* subframePart);
235     bool passWheelEventToWidget(Widget*);
236     
237     NSString* searchForLabelsAboveCell(RegularExpression* regExp, HTMLTableCellElement* cell);
238     NSString* searchForLabelsBeforeElement(NSArray* labels, Element* element);
239     NSString* matchLabelsAgainstElement(NSArray* labels, Element* element);
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     virtual KJS::Bindings::RootObject* bindingRootObject();
256     virtual Widget* createJavaAppletWidget(const IntSize&, Element*, const HashMap<String, String>& args);
257
258     void addPluginRootObject(KJS::Bindings::RootObject* root);
259     
260     virtual void registerCommandForUndo(PassRefPtr<EditCommand>);
261     virtual void registerCommandForRedo(PassRefPtr<EditCommand>);
262     virtual void clearUndoRedoOperations();
263     virtual void issueUndoCommand();
264     virtual void issueRedoCommand();
265     virtual void issueCutCommand();
266     virtual void issueCopyCommand();
267     virtual void issuePasteCommand();
268     virtual void issuePasteAndMatchStyleCommand();
269     virtual void issueTransposeCommand();
270     virtual void respondToChangedSelection(const Selection& oldSelection, bool closeTyping);
271     virtual void respondToChangedContents(const Selection&);
272     virtual bool isContentEditable() const;
273     virtual bool shouldChangeSelection(const Selection& oldSelection, const Selection& newSelection, EAffinity affinity, bool stillSelecting) const;
274     virtual bool shouldDeleteSelection(const Selection&) const;
275     virtual bool shouldBeginEditing(const Range*) const;
276     virtual bool shouldEndEditing(const Range*) const;
277     virtual void didBeginEditing() const;
278     virtual void didEndEditing() const;
279     
280     virtual void textFieldDidBeginEditing(Element*);
281     virtual void textFieldDidEndEditing(Element*);
282     virtual void textDidChangeInTextField(Element*);
283     virtual bool doTextFieldCommandFromEvent(Element*, const PlatformKeyboardEvent*);
284     virtual void textWillBeDeletedInTextField(Element*);
285     virtual void textDidChangeInTextArea(Element*);
286     
287     virtual bool inputManagerHasMarkedText() const;
288     
289     virtual void setSecureKeyboardEntry(bool);
290     virtual bool isSecureKeyboardEntry();
291
292     KJS::Bindings::RootObject* executionContextForDOM();
293     
294     WebScriptObject* windowScriptObject();
295     NPObject* windowScriptNPObject();
296     
297     virtual void partClearedInBegin();
298     
299     // Implementation of CSS property -webkit-user-drag == auto
300     virtual bool shouldDragAutoNode(Node*, const IntPoint&) const;
301
302     void setMarkedTextRange(const Range* , NSArray* attributes, NSArray* ranges);
303     virtual Range* markedTextRange() const { return m_markedTextRange.get(); }
304
305     virtual bool canGoBackOrForward(int distance) const;
306
307     virtual void didFirstLayout();
308     
309     NSMutableDictionary* dashboardRegionsDictionary();
310     void dashboardRegionsChanged();
311
312     void willPopupMenu(NSMenu *);
313     
314     virtual bool isCharacterSmartReplaceExempt(UChar, bool);
315     
316     virtual bool mouseDownMayStartSelect() const { return _mouseDownMayStartSelect; }
317     
318     virtual void handledOnloadEvents();
319
320     virtual bool canPaste() const;
321     virtual bool canRedo() const;
322     virtual bool canUndo() const;
323     virtual void print();
324
325     FloatRect customHighlightLineRect(const AtomicString& type, const FloatRect& lineRect);
326     void paintCustomHighlight(const AtomicString& type, const FloatRect& boxRect, const FloatRect& lineRect, bool text, bool line);
327     
328     NSEvent* currentEvent() { return _currentEvent; }
329     virtual KURL originalRequestURL() const;
330     
331 protected:
332     virtual void startRedirectionTimer();
333     virtual void stopRedirectionTimer();
334     virtual void cleanupPluginObjects();
335     virtual bool isLoadTypeReload();
336     
337 private:
338     virtual void handleMousePressEvent(const MouseEventWithHitTestResults&);
339     virtual void handleMouseMoveEvent(const MouseEventWithHitTestResults&);
340     virtual void handleMouseReleaseEvent(const MouseEventWithHitTestResults&);
341       
342     NSView* mouseDownViewIfStillGood();
343
344     NSView* nextKeyViewInFrame(Node* startingPoint, SelectionDirection, bool* focusCallResultedInViewBeingCreated = 0);
345     static NSView* documentViewForNode(Node*);
346     
347     bool dispatchCPPEvent(const AtomicString &eventType, ClipboardMac::AccessPolicy policy);
348
349     NSImage* imageFromRect(NSRect) const;
350
351     void freeClipboard();
352
353     void registerCommandForUndoOrRedo(PassRefPtr<EditCommand>, bool isRedo);
354
355     WebCoreFrameBridge* _bridge;
356     
357     NSView* _mouseDownView;
358     bool _mouseDownWasInSubframe;
359     bool _sendingEventToSubview;
360     bool _mouseDownMayStartSelect;
361     PlatformMouseEvent m_mouseDown;
362     // in our view's coords
363     IntPoint m_mouseDownPos;
364     float _mouseDownTimestamp;
365     int _activationEventNumber;
366     
367     static NSEvent* _currentEvent;
368
369     bool _haveUndoRedoOperations;
370     
371     HashSet<String> urlsBridgeKnowsAbout;
372
373     friend class Frame;
374
375     KJS::Bindings::RootObject* _bindingRoot;  // The root object used for objects
376                                             // bound outside the context of a plugin.
377     Vector<KJS::Bindings::RootObject*> m_rootObjects;
378     WebScriptObject* _windowScriptObject;
379     NPObject* _windowScriptNPObject;
380     
381     RefPtr<Node> _dragSrc;     // element that may be a drag source, for the current mouse gesture
382     bool _dragSrcIsLink;
383     bool _dragSrcIsImage;
384     bool _dragSrcInSelection;
385     bool _dragSrcMayBeDHTML, _dragSrcMayBeUA;   // Are DHTML and/or the UserAgent allowed to drag out?
386     bool _dragSrcIsDHTML;
387     RefPtr<ClipboardMac> _dragClipboard;   // used on only the source side of dragging
388     
389     RefPtr<Range> m_markedTextRange;
390 };
391
392 inline FrameMac* Mac(Frame* frame) { return static_cast<FrameMac*>(frame); }
393 inline const FrameMac* Mac(const Frame* frame) { return static_cast<const FrameMac*>(frame); }
394
395 }
396
397 #endif