2 * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
29 #import "ClipboardMac.h"
32 #import "PlatformMouseEvent.h"
33 #import "StringHash.h"
34 #import "WebCoreKeyboardAccess.h"
40 class SavedProperties;
42 class ScheduledAction;
51 // Avoid clashes with KJS::DOMElement in KHTML code.
53 typedef DOMElement ObjCDOMElement;
55 @class WebCorePageState;
57 @class NSAttributedString;
65 @class NSMutableDictionary;
69 @class WebCoreFrameBridge;
70 @class WebScriptObject;
74 // Avoid clashes with KJS::DOMElement in KHTML code.
77 class WebCorePageState;
79 class NSAttributedString;
87 class NSMutableDictionary;
91 class WebCoreFrameBridge;
92 class WebScriptObject;
94 typedef int NSWritingDirection;
100 class DocumentFragment;
102 class HTMLTableCellElement;
105 class VisiblePosition;
107 struct DashboardRegionValue;
109 enum SelectionDirection {
114 class FrameMac : public Frame
117 FrameMac(Page*, Element*);
122 void setBridge(WebCoreFrameBridge* p);
123 WebCoreFrameBridge* bridge() const { return _bridge; }
124 virtual void setView(FrameView*);
125 virtual void frameDetached();
127 virtual bool openURL(const KURL&);
130 String advanceToNextMisspelling(bool startBeforeSelection = false);
132 virtual void setTitle(const String&);
133 virtual void setStatusBarText(const String&);
135 virtual void submitForm(const FrameLoadRequest&);
136 virtual void openURLRequest(const FrameLoadRequest&);
137 virtual void urlSelected(const FrameLoadRequest&);
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);
143 virtual Frame* createFrame(const KURL& url, const String& name, Element* ownerElement, const String& referrer);
145 virtual void scheduleClose();
147 virtual void focusWindow();
148 virtual void unfocusWindow();
150 void openURLFromPageCache(WebCorePageState*);
152 virtual void saveDocumentState();
153 virtual void restoreDocumentState();
155 virtual void addMessageToConsole(const String& message, unsigned int lineNumber, const String& sourceID);
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);
163 virtual bool tabsToLinks() const;
164 virtual bool tabsToAllControls() const;
166 static bool currentEventIsMouseDownInWidget(Widget* candidate);
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();
180 virtual void createEmptyDocument();
182 static WebCoreFrameBridge* bridgeForWidget(const Widget*);
184 virtual String incomingReferrer() const;
185 virtual String userAgent() const;
187 virtual String mimeTypeForFileName(const String&) const;
189 NSImage* selectionImage(bool forceWhiteText = false) const;
190 NSImage* snapshotDragImage(Node* node, NSRect* imageRect, NSRect* elementRect) const;
192 bool dispatchDragSrcEvent(const AtomicString &eventType, const PlatformMouseEvent&) const;
194 NSFont* fontForSelection(bool* hasMultipleFonts) const;
195 NSDictionary* fontAttributesForSelectionStart() const;
197 NSWritingDirection baseWritingDirectionForSelectionStart() const;
199 virtual void markMisspellingsInAdjacentWords(const VisiblePosition&);
200 virtual void markMisspellings(const Selection&);
202 NSFileWrapper* fileWrapperForElement(Element*);
203 NSAttributedString* attributedString(Node* startNode, int startOffset, Node* endNode, int endOffset);
205 void mouseDown(NSEvent*);
206 void mouseDragged(NSEvent*);
207 void mouseUp(NSEvent*);
208 void mouseMoved(NSEvent*);
209 bool keyEvent(NSEvent*);
210 bool wheelEvent(NSEvent*);
212 void sendFakeEventsAfterWidgetTracking(NSEvent* initiatingEvent);
214 virtual bool lastEventIsMouseUp() const;
215 void setActivationEventNumber(int num) { _activationEventNumber = num; }
217 bool dragHysteresisExceeded(float dragLocationX, float dragLocationY) const;
218 bool eventMayStartDrag(NSEvent*) const;
219 void dragSourceMovedTo(const PlatformMouseEvent&);
220 void dragSourceEndedAt(const PlatformMouseEvent&, NSDragOperation);
224 bool mayDHTMLPaste();
227 bool tryDHTMLPaste();
229 bool sendContextMenuEvent(NSEvent*);
231 bool passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults&);
232 bool passWidgetMouseDownEventToWidget(RenderWidget*);
233 bool passMouseDownEventToWidget(Widget*);
234 bool passSubframeEventToSubframe(MouseEventWithHitTestResults&, Frame* subframePart);
235 bool passWheelEventToWidget(Widget*);
237 NSString* searchForLabelsAboveCell(RegularExpression* regExp, HTMLTableCellElement* cell);
238 NSString* searchForLabelsBeforeElement(NSArray* labels, Element* element);
239 NSString* matchLabelsAgainstElement(NSArray* labels, Element* element);
241 virtual void tokenizerProcessedData();
243 virtual String overrideMediaType() const;
245 NSColor* bodyBackgroundColor() const;
247 WebCoreKeyboardUIMode keyboardUIMode() const;
249 void didTellBridgeAboutLoad(const String& URL);
250 bool haveToldBridgeAboutLoad(const String& URL);
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);
258 void addPluginRootObject(KJS::Bindings::RootObject* root);
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;
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*);
287 virtual bool inputManagerHasMarkedText() const;
289 virtual void setSecureKeyboardEntry(bool);
290 virtual bool isSecureKeyboardEntry();
292 KJS::Bindings::RootObject* executionContextForDOM();
294 WebScriptObject* windowScriptObject();
295 NPObject* windowScriptNPObject();
297 virtual void partClearedInBegin();
299 // Implementation of CSS property -webkit-user-drag == auto
300 virtual bool shouldDragAutoNode(Node*, const IntPoint&) const;
302 void setMarkedTextRange(const Range* , NSArray* attributes, NSArray* ranges);
303 virtual Range* markedTextRange() const { return m_markedTextRange.get(); }
305 virtual bool canGoBackOrForward(int distance) const;
307 virtual void didFirstLayout();
309 NSMutableDictionary* dashboardRegionsDictionary();
310 void dashboardRegionsChanged();
312 void willPopupMenu(NSMenu *);
314 virtual bool isCharacterSmartReplaceExempt(UChar, bool);
316 virtual bool mouseDownMayStartSelect() const { return _mouseDownMayStartSelect; }
318 virtual void handledOnloadEvents();
320 virtual bool canPaste() const;
321 virtual bool canRedo() const;
322 virtual bool canUndo() const;
323 virtual void print();
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);
328 NSEvent* currentEvent() { return _currentEvent; }
329 virtual KURL originalRequestURL() const;
332 virtual void startRedirectionTimer();
333 virtual void stopRedirectionTimer();
334 virtual void cleanupPluginObjects();
335 virtual bool isLoadTypeReload();
338 virtual void handleMousePressEvent(const MouseEventWithHitTestResults&);
339 virtual void handleMouseMoveEvent(const MouseEventWithHitTestResults&);
340 virtual void handleMouseReleaseEvent(const MouseEventWithHitTestResults&);
342 NSView* mouseDownViewIfStillGood();
344 NSView* nextKeyViewInFrame(Node* startingPoint, SelectionDirection, bool* focusCallResultedInViewBeingCreated = 0);
345 static NSView* documentViewForNode(Node*);
347 bool dispatchCPPEvent(const AtomicString &eventType, ClipboardMac::AccessPolicy policy);
349 NSImage* imageFromRect(NSRect) const;
351 void freeClipboard();
353 void registerCommandForUndoOrRedo(PassRefPtr<EditCommand>, bool isRedo);
355 WebCoreFrameBridge* _bridge;
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;
367 static NSEvent* _currentEvent;
369 bool _haveUndoRedoOperations;
371 HashSet<String> urlsBridgeKnowsAbout;
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;
381 RefPtr<Node> _dragSrc; // element that may be a drag source, for the current mouse gesture
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
389 RefPtr<Range> m_markedTextRange;
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); }