2c8ddfddd6d70b0cbcd507842f9becddc74f4363
[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 NSMutableDictionary;
65 @class NSResponder;
66 @class NSString;
67 @class NSView;
68 @class WebCoreFrameBridge;
69 @class WebScriptObject;
70
71 #else
72
73 // Avoid clashes with KJS::DOMElement in KHTML code.
74 class ObjCDOMElement;
75
76 class WebCorePageState;
77 class NSArray;
78 class NSAttributedString;
79 class NSColor;
80 class NSDictionary;
81 class NSEvent;
82 class NSFileWrapper;
83 class NSFont;
84 class NSImage;
85 class NSMutableDictionary;
86 class NSResponder;
87 class NSString;
88 class NSView;
89 class WebCoreFrameBridge;
90 class WebScriptObject;
91
92 typedef int NSWritingDirection;
93
94 #endif
95
96 namespace WebCore {
97
98 class DocumentFragment;
99 class FramePrivate;
100 class HTMLTableCellElement;
101 class RenderObject;
102 class RenderStyle;
103 class VisiblePosition;
104
105 struct DashboardRegionValue;
106
107 enum SelectionDirection {
108     SelectingNext,
109     SelectingPrevious
110 };
111
112 class FrameMac : public Frame
113 {
114 public:
115     FrameMac(Page*, Element*);
116     ~FrameMac();
117     
118     void clear();
119
120     void setBridge(WebCoreFrameBridge* p);
121     WebCoreFrameBridge* bridge() const { return _bridge; }
122     virtual void setView(FrameView*);
123     virtual void frameDetached();
124
125     virtual bool openURL(const KURL&);
126     
127     virtual void openURLRequest(const ResourceRequest&);
128     virtual void submitForm(const ResourceRequest&);
129
130     String advanceToNextMisspelling(bool startBeforeSelection = false);
131     
132     virtual void setTitle(const String&);
133     virtual void setStatusBarText(const String&);
134
135     virtual void urlSelected(const ResourceRequest&);
136
137     virtual ObjectContentType objectContentType(const KURL& url, const String& mimeType);
138     virtual Plugin* createPlugin(Element* element, const KURL& url, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType);
139     virtual void redirectDataToPlugin(Widget* pluginWidget);
140
141     virtual Frame* createFrame(const KURL& url, const String& name, Element* ownerElement, const String& referrer);
142
143     virtual void scheduleClose();
144
145     virtual void focusWindow();
146     virtual void unfocusWindow();
147     
148     void openURLFromPageCache(WebCorePageState*);
149
150     virtual void saveDocumentState();
151     virtual void restoreDocumentState();
152     
153     virtual void addMessageToConsole(const String& message,  unsigned int lineNumber, const String& sourceID);
154     
155     NSView* nextKeyView(Node* startingPoint, SelectionDirection);
156     NSView* nextKeyViewInFrameHierarchy(Node* startingPoint, SelectionDirection);
157     static NSView* nextKeyViewForWidget(Widget* startingPoint, SelectionDirection);
158     static bool currentEventIsKeyboardOptionTab();
159     static bool handleKeyboardOptionTabInView(NSView* view);
160     
161     virtual bool tabsToLinks() const;
162     virtual bool tabsToAllControls() const;
163     
164     static bool currentEventIsMouseDownInWidget(Widget* candidate);
165     
166     virtual void runJavaScriptAlert(const String&);
167     virtual bool runJavaScriptConfirm(const String&);
168     virtual bool runJavaScriptPrompt(const String& message, const String& defaultValue, String& result);
169     virtual bool shouldInterruptJavaScript();    
170     virtual bool locationbarVisible();
171     virtual bool menubarVisible();
172     virtual bool personalbarVisible();
173     virtual bool statusbarVisible();
174     virtual bool toolbarVisible();
175
176     bool shouldClose();
177
178     virtual void createEmptyDocument();
179
180     static WebCoreFrameBridge* bridgeForWidget(const Widget*);
181     
182     virtual String incomingReferrer() const;
183     virtual String userAgent() const;
184
185     virtual String mimeTypeForFileName(const String&) const;
186
187     NSImage* selectionImage(bool forceWhiteText = false) const;
188     NSImage* snapshotDragImage(Node* node, NSRect* imageRect, NSRect* elementRect) const;
189
190     bool dispatchDragSrcEvent(const AtomicString &eventType, const PlatformMouseEvent&) const;
191
192     NSFont* fontForSelection(bool* hasMultipleFonts) const;
193     NSDictionary* fontAttributesForSelectionStart() const;
194     
195     NSWritingDirection baseWritingDirectionForSelectionStart() const;
196
197     virtual void markMisspellingsInAdjacentWords(const VisiblePosition&);
198     virtual void markMisspellings(const Selection&);
199
200     NSFileWrapper* fileWrapperForElement(Element*);
201     NSAttributedString* attributedString(Node* startNode, int startOffset, Node* endNode, int endOffset);
202
203     void mouseDown(NSEvent*);
204     void mouseDragged(NSEvent*);
205     void mouseUp(NSEvent*);
206     void mouseMoved(NSEvent*);
207     bool keyEvent(NSEvent*);
208     bool wheelEvent(NSEvent*);
209
210     void sendFakeEventsAfterWidgetTracking(NSEvent* initiatingEvent);
211
212     virtual bool lastEventIsMouseUp() const;
213     void setActivationEventNumber(int num) { _activationEventNumber = num; }
214
215     bool dragHysteresisExceeded(float dragLocationX, float dragLocationY) const;
216     bool eventMayStartDrag(NSEvent*) const;
217     void dragSourceMovedTo(const PlatformMouseEvent&);
218     void dragSourceEndedAt(const PlatformMouseEvent&, NSDragOperation);
219
220     bool mayDHTMLCut();
221     bool mayDHTMLCopy();
222     bool mayDHTMLPaste();
223     bool tryDHTMLCut();
224     bool tryDHTMLCopy();
225     bool tryDHTMLPaste();
226     
227     bool sendContextMenuEvent(NSEvent*);
228
229     bool passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults&);
230     bool passWidgetMouseDownEventToWidget(RenderWidget*);
231     bool passMouseDownEventToWidget(Widget*);
232     bool passSubframeEventToSubframe(MouseEventWithHitTestResults&, Frame* subframePart);
233     bool passWheelEventToWidget(Widget*);
234     
235     NSString* searchForLabelsAboveCell(RegularExpression* regExp, HTMLTableCellElement* cell);
236     NSString* searchForLabelsBeforeElement(NSArray* labels, Element* element);
237     NSString* matchLabelsAgainstElement(NSArray* labels, Element* element);
238
239     virtual void tokenizerProcessedData();
240
241     virtual String overrideMediaType() const;
242     
243     NSColor* bodyBackgroundColor() const;
244     
245     WebCoreKeyboardUIMode keyboardUIMode() const;
246
247     void didTellBridgeAboutLoad(const String& URL);
248     bool haveToldBridgeAboutLoad(const String& URL);
249
250     virtual KJS::Bindings::Instance* getEmbedInstanceForWidget(Widget*);
251     virtual KJS::Bindings::Instance* getObjectInstanceForWidget(Widget*);
252     virtual KJS::Bindings::Instance* getAppletInstanceForWidget(Widget*);
253     virtual KJS::Bindings::RootObject* bindingRootObject();
254     virtual Widget* createJavaAppletWidget(const IntSize&, Element*, const HashMap<String, String>& args);
255
256     void addPluginRootObject(KJS::Bindings::RootObject* root);
257     
258     virtual void registerCommandForUndo(PassRefPtr<EditCommand>);
259     virtual void registerCommandForRedo(PassRefPtr<EditCommand>);
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 Selection& oldSelection, bool closeTyping);
269     virtual void respondToChangedContents(const Selection&);
270     virtual bool isContentEditable() const;
271     virtual bool shouldChangeSelection(const Selection& oldSelection, const Selection& newSelection, EAffinity affinity, bool stillSelecting) const;
272     virtual bool shouldDeleteSelection(const Selection&) const;
273     virtual bool shouldBeginEditing(const Range*) const;
274     virtual bool shouldEndEditing(const Range*) const;
275     virtual void didBeginEditing() const;
276     virtual void didEndEditing() const;
277     
278     virtual void textFieldDidBeginEditing(Element*);
279     virtual void textFieldDidEndEditing(Element*);
280     virtual void textDidChangeInTextField(Element*);
281     virtual bool doTextFieldCommandFromEvent(Element*, const PlatformKeyboardEvent*);
282     virtual void textWillBeDeletedInTextField(Element*);
283     virtual void textDidChangeInTextArea(Element*);
284     
285     virtual bool inputManagerHasMarkedText() const;
286     
287     virtual void setSecureKeyboardEntry(bool);
288     virtual bool isSecureKeyboardEntry();
289
290     KJS::Bindings::RootObject* executionContextForDOM();
291     
292     WebScriptObject* windowScriptObject();
293     NPObject* windowScriptNPObject();
294     
295     virtual void partClearedInBegin();
296     
297     // Implementation of CSS property -webkit-user-drag == auto
298     virtual bool shouldDragAutoNode(Node*, const IntPoint&) const;
299
300     void setMarkedTextRange(const Range* , NSArray* attributes, NSArray* ranges);
301     virtual Range* markedTextRange() const { return m_markedTextRange.get(); }
302
303     virtual bool canGoBackOrForward(int distance) const;
304
305     virtual void didFirstLayout();
306     
307     NSMutableDictionary* dashboardRegionsDictionary();
308     void dashboardRegionsChanged();
309     
310     virtual bool isCharacterSmartReplaceExempt(UChar, bool);
311     
312     virtual bool mouseDownMayStartSelect() const { return _mouseDownMayStartSelect; }
313     
314     virtual void handledOnloadEvents();
315
316     virtual bool canPaste() const;
317     virtual bool canRedo() const;
318     virtual bool canUndo() const;
319     virtual void print();
320
321     FloatRect customHighlightLineRect(const AtomicString& type, const FloatRect& lineRect);
322     void paintCustomHighlight(const AtomicString& type, const FloatRect& boxRect, const FloatRect& lineRect, bool text, bool line);
323     
324     NSEvent* currentEvent() { return _currentEvent; }
325     virtual KURL originalRequestURL() const;
326     
327 protected:
328     virtual void startRedirectionTimer();
329     virtual void stopRedirectionTimer();
330     virtual void cleanupPluginObjects();
331     virtual bool isLoadTypeReload();
332     
333 private:
334     virtual void handleMousePressEvent(const MouseEventWithHitTestResults&);
335     virtual void handleMouseMoveEvent(const MouseEventWithHitTestResults&);
336     virtual void handleMouseReleaseEvent(const MouseEventWithHitTestResults&);
337       
338     NSView* mouseDownViewIfStillGood();
339
340     NSView* nextKeyViewInFrame(Node* startingPoint, SelectionDirection, bool* focusCallResultedInViewBeingCreated = 0);
341     static NSView* documentViewForNode(Node*);
342     
343     bool dispatchCPPEvent(const AtomicString &eventType, ClipboardMac::AccessPolicy policy);
344
345     NSImage* imageFromRect(NSRect) const;
346
347     void freeClipboard();
348
349     void registerCommandForUndoOrRedo(PassRefPtr<EditCommand>, bool isRedo);
350
351     WebCoreFrameBridge* _bridge;
352     
353     NSView* _mouseDownView;
354     bool _mouseDownWasInSubframe;
355     bool _sendingEventToSubview;
356     bool _mouseDownMayStartSelect;
357     PlatformMouseEvent m_mouseDown;
358     // in our view's coords
359     IntPoint m_mouseDownPos;
360     float _mouseDownTimestamp;
361     int _activationEventNumber;
362     
363     static NSEvent* _currentEvent;
364
365     bool _haveUndoRedoOperations;
366     
367     HashSet<String> urlsBridgeKnowsAbout;
368
369     friend class Frame;
370
371     KJS::Bindings::RootObject* _bindingRoot;  // The root object used for objects
372                                             // bound outside the context of a plugin.
373     Vector<KJS::Bindings::RootObject*> m_rootObjects;
374     WebScriptObject* _windowScriptObject;
375     NPObject* _windowScriptNPObject;
376     
377     RefPtr<Node> _dragSrc;     // element that may be a drag source, for the current mouse gesture
378     bool _dragSrcIsLink;
379     bool _dragSrcIsImage;
380     bool _dragSrcInSelection;
381     bool _dragSrcMayBeDHTML, _dragSrcMayBeUA;   // Are DHTML and/or the UserAgent allowed to drag out?
382     bool _dragSrcIsDHTML;
383     RefPtr<ClipboardMac> _dragClipboard;   // used on only the source side of dragging
384     
385     RefPtr<Range> m_markedTextRange;
386 };
387
388 inline FrameMac* Mac(Frame* frame) { return static_cast<FrameMac*>(frame); }
389 inline const FrameMac* Mac(const Frame* frame) { return static_cast<const FrameMac*>(frame); }
390
391 }
392
393 #endif