715ed7e2b48622f80ad1f57dc334fd274b2afea2
[WebKit-https.git] / WebKit2 / UIProcess / API / mac / PageClientImpl.mm
1 /*
2  * Copyright (C) 2010 Apple 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 INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "NativeWebKeyboardEvent.h"
27 #import "PageClientImpl.h"
28
29 #import "FindIndicator.h"
30 #import "WKAPICast.h"
31 #import "WKStringCF.h"
32 #import "WKViewInternal.h"
33 #import "WebContextMenuProxyMac.h"
34 #import "WebEditCommandProxy.h"
35 #import "WebPopupMenuProxyMac.h"
36 #import <WebCore/Cursor.h>
37 #import <WebCore/FloatRect.h>
38 #import <WebCore/FoundationExtras.h>
39 #import <WebCore/KeyboardEvent.h>
40 #import <wtf/PassOwnPtr.h>
41 #import <wtf/text/CString.h>
42 #import <wtf/text/WTFString.h>
43
44 using namespace WebCore;
45
46 @interface WebEditCommandObjC : NSObject
47 {
48     RefPtr<WebKit::WebEditCommandProxy> m_command;
49 }
50
51 - (id)initWithWebEditCommandProxy:(PassRefPtr<WebKit::WebEditCommandProxy>)command;
52 - (WebKit::WebEditCommandProxy*)command;
53
54 @end
55
56 @implementation WebEditCommandObjC
57
58 - (id)initWithWebEditCommandProxy:(PassRefPtr<WebKit::WebEditCommandProxy>)command
59 {
60     self = [super init];
61     if (!self)
62         return nil;
63
64     m_command = command;
65     return self;
66 }
67
68 - (WebKit::WebEditCommandProxy*)command
69 {
70     return m_command.get();
71 }
72
73 @end
74
75 @interface WebEditorUndoTargetObjC : NSObject
76
77 - (void)undoEditing:(id)sender;
78 - (void)redoEditing:(id)sender;
79
80 @end
81
82 @implementation WebEditorUndoTargetObjC
83
84 - (void)undoEditing:(id)sender
85 {
86     ASSERT([sender isKindOfClass:[WebEditCommandObjC class]]);
87     [sender command]->unapply();
88 }
89
90 - (void)redoEditing:(id)sender
91 {
92     ASSERT([sender isKindOfClass:[WebEditCommandObjC class]]);
93     [sender command]->reapply();
94 }
95
96 @end
97
98 namespace WebKit {
99
100 NSString* nsStringFromWebCoreString(const String& string)
101 {
102     return string.impl() ? HardAutorelease(WKStringCopyCFString(0, toAPI(string.impl()))) : @"";
103 }
104
105 PassOwnPtr<PageClientImpl> PageClientImpl::create(WKView* wkView)
106 {
107     return adoptPtr(new PageClientImpl(wkView));
108 }
109
110 PageClientImpl::PageClientImpl(WKView* wkView)
111     : m_wkView(wkView)
112     , m_undoTarget(AdoptNS, [[WebEditorUndoTargetObjC alloc] init])
113 {
114 }
115
116 PageClientImpl::~PageClientImpl()
117 {
118 }
119
120 void PageClientImpl::processDidCrash()
121 {
122     [m_wkView _processDidCrash];
123 }
124
125 void PageClientImpl::didRelaunchProcess()
126 {
127     [m_wkView _didRelaunchProcess];
128 }
129
130 void PageClientImpl::takeFocus(bool direction)
131 {
132     [m_wkView _takeFocus:direction];
133 }
134
135 void PageClientImpl::toolTipChanged(const String& oldToolTip, const String& newToolTip)
136 {
137     [m_wkView _toolTipChangedFrom:nsStringFromWebCoreString(oldToolTip) to:nsStringFromWebCoreString(newToolTip)];
138 }
139
140 void PageClientImpl::setCursor(const WebCore::Cursor& cursor)
141 {
142     [m_wkView _setCursor:cursor.platformCursor()];
143 }
144
145 void PageClientImpl::setViewportArguments(const WebCore::ViewportArguments&)
146 {
147
148 }
149
150 static NSString* nameForEditAction(EditAction editAction)
151 {
152     // FIXME: Use localized strings.
153     // FIXME: Move this to a platform independent location.
154
155     switch (editAction) {
156     case EditActionUnspecified: return nil;
157     case EditActionSetColor: return @"Set Color";
158     case EditActionSetBackgroundColor: return @"Set Background Color";
159     case EditActionTurnOffKerning: return @"Turn Off Kerning";
160     case EditActionTightenKerning: return @"Tighten Kerning";
161     case EditActionLoosenKerning: return @"Loosen Kerning";
162     case EditActionUseStandardKerning: return @"Use Standard Kerning";
163     case EditActionTurnOffLigatures: return @"Turn Off Ligatures";
164     case EditActionUseStandardLigatures: return @"Use Standard Ligatures";
165     case EditActionUseAllLigatures: return @"Use All Ligatures";
166     case EditActionRaiseBaseline: return @"Raise Baseline";
167     case EditActionLowerBaseline: return @"Lower Baseline";
168     case EditActionSetTraditionalCharacterShape: return @"Set Traditional Character Shape";
169     case EditActionSetFont: return @"Set Font";
170     case EditActionChangeAttributes: return @"Change Attributes";
171     case EditActionAlignLeft: return @"Align Left";
172     case EditActionAlignRight: return @"Align Right";
173     case EditActionCenter: return @"Center";
174     case EditActionJustify: return @"Justify";
175     case EditActionSetWritingDirection: return @"Set Writing Direction";
176     case EditActionSubscript: return @"Subscript";
177     case EditActionSuperscript: return @"Superscript";
178     case EditActionUnderline: return @"Underline";
179     case EditActionOutline: return @"Outline";
180     case EditActionUnscript: return @"Unscript";
181     case EditActionDrag: return @"Drag";
182     case EditActionCut: return @"Cut";
183     case EditActionPaste: return @"Paste";
184     case EditActionPasteFont: return @"Paste Font";
185     case EditActionPasteRuler: return @"Paste Ruler";
186     case EditActionTyping: return @"Typing";
187     case EditActionCreateLink: return @"Create Link";
188     case EditActionUnlink: return @"Unlink";
189     case EditActionInsertList: return @"Insert List";
190     case EditActionFormatBlock: return @"Formatting";
191     case EditActionIndent: return @"Indent";
192     case EditActionOutdent: return @"Outdent";
193     }
194     return nil;
195 }
196
197 void PageClientImpl::registerEditCommand(PassRefPtr<WebEditCommandProxy> prpCommand, WebPageProxy::UndoOrRedo undoOrRedo)
198 {
199     RefPtr<WebEditCommandProxy> command = prpCommand;
200
201     RetainPtr<WebEditCommandObjC> commandObjC(AdoptNS, [[WebEditCommandObjC alloc] initWithWebEditCommandProxy:command]);
202     NSString *actionName = nameForEditAction(command->editAction());
203
204     NSUndoManager *undoManager = [m_wkView undoManager];
205     [undoManager registerUndoWithTarget:m_undoTarget.get() selector:((undoOrRedo == WebPageProxy::Undo) ? @selector(undoEditing:) : @selector(redoEditing:)) object:commandObjC.get()];
206     if (actionName)
207         [undoManager setActionName:actionName];
208 }
209
210 void PageClientImpl::clearAllEditCommands()
211 {
212     [[m_wkView undoManager] removeAllActionsWithTarget:m_undoTarget.get()];
213 }
214
215 void PageClientImpl::setEditCommandState(const String& commandName, bool isEnabled, int newState)
216 {
217     [m_wkView _setUserInterfaceItemState:nsStringFromWebCoreString(commandName) enabled:isEnabled state:newState];
218 }
219
220 void PageClientImpl::interceptKeyEvent(const NativeWebKeyboardEvent& event, Vector<WebCore::KeypressCommand>& commandsList, uint32_t selectionStart, uint32_t selectionEnd, Vector<WebCore::CompositionUnderline>& underlines)
221 {
222     commandsList = [m_wkView _interceptKeyEvent:event.nativeEvent()];
223     [m_wkView _getTextInputState:selectionStart selectionEnd:selectionEnd underlines:underlines];
224 }
225
226 FloatRect PageClientImpl::convertToDeviceSpace(const FloatRect& rect)
227 {
228     return [m_wkView _convertToDeviceSpace:rect];
229 }
230
231 FloatRect PageClientImpl::convertToUserSpace(const FloatRect& rect)
232 {
233     return [m_wkView _convertToUserSpace:rect];
234 }
235
236 void PageClientImpl::didNotHandleKeyEvent(const NativeWebKeyboardEvent& event)
237 {
238     NSEvent* nativeEvent = event.nativeEvent();
239     if ([nativeEvent type] == NSKeyDown) {
240         [m_wkView _setEventBeingResent:nativeEvent];
241         [[NSApplication sharedApplication] sendEvent:nativeEvent];
242     }
243 }
244
245 PassRefPtr<WebPopupMenuProxy> PageClientImpl::createPopupMenuProxy(WebPageProxy* page)
246 {
247     return WebPopupMenuProxyMac::create(m_wkView, page);
248 }
249
250 PassRefPtr<WebContextMenuProxy> PageClientImpl::createContextMenuProxy(WebPageProxy* page)
251 {
252     return WebContextMenuProxyMac::create(m_wkView, page);
253 }
254
255 void PageClientImpl::setFindIndicator(PassRefPtr<FindIndicator> findIndicator, bool fadeOut)
256 {
257     [m_wkView _setFindIndicator:findIndicator fadeOut:fadeOut];
258 }
259
260 #if USE(ACCELERATED_COMPOSITING)
261 void PageClientImpl::pageDidEnterAcceleratedCompositing()
262 {
263     [m_wkView _pageDidEnterAcceleratedCompositing];
264 }
265
266 void PageClientImpl::pageDidLeaveAcceleratedCompositing()
267 {
268     [m_wkView _pageDidLeaveAcceleratedCompositing];
269 }
270 #endif // USE(ACCELERATED_COMPOSITING)
271
272 void PageClientImpl::setComplexTextInputEnabled(uint64_t pluginComplexTextInputIdentifier, bool complexTextInputEnabled)
273 {
274     [m_wkView _setComplexTextInputEnabled:complexTextInputEnabled pluginComplexTextInputIdentifier:pluginComplexTextInputIdentifier];
275 }
276
277 void PageClientImpl::didCommitLoadForMainFrame(bool useCustomRepresentation)
278 {
279     [m_wkView _setPageHasCustomRepresentation:useCustomRepresentation];
280 }
281
282 void PageClientImpl::didFinishLoadingDataForCustomRepresentation(const CoreIPC::DataReference& dataReference)
283 {
284     [m_wkView _didFinishLoadingDataForCustomRepresentation:dataReference];
285 }
286
287 } // namespace WebKit