Unreviewed, rolling out r240630.
[WebKit-https.git] / Source / WebKit / UIProcess / API / Cocoa / _WKElementAction.mm
1 /*
2  * Copyright (C) 2014 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 "config.h"
27 #import "_WKElementActionInternal.h"
28
29 #if WK_API_ENABLED
30
31 #if PLATFORM(IOS_FAMILY)
32
33 #import "GestureTypes.h"
34 #import "WKActionSheetAssistant.h"
35 #import "WKContentViewInteraction.h"
36 #import "_WKActivatedElementInfoInternal.h"
37 #import <WebCore/LocalizedStrings.h>
38 #import <wtf/RetainPtr.h>
39 #import <wtf/SoftLinking.h>
40 #import <wtf/WeakObjCPtr.h>
41 #import <wtf/text/WTFString.h>
42
43 #if HAVE(SAFARI_SERVICES_FRAMEWORK)
44 #import <SafariServices/SSReadingList.h>
45 SOFT_LINK_FRAMEWORK(SafariServices);
46 SOFT_LINK_CLASS(SafariServices, SSReadingList);
47 #endif
48
49 typedef void (^WKElementActionHandlerInternal)(WKActionSheetAssistant *, _WKActivatedElementInfo *);
50
51 @implementation _WKElementAction  {
52     RetainPtr<NSString> _title;
53     WKElementActionHandlerInternal _actionHandler;
54     WKElementActionDismissalHandler _dismissalHandler;
55     WeakObjCPtr<WKActionSheetAssistant> _defaultActionSheetAssistant;
56 }
57
58 - (id)_initWithTitle:(NSString *)title actionHandler:(WKElementActionHandlerInternal)handler type:(_WKElementActionType)type assistant:(WKActionSheetAssistant *)assistant
59 {
60     if (!(self = [super init]))
61         return nil;
62
63     _title = adoptNS([title copy]);
64     _type = type;
65     _actionHandler = [handler copy];
66     _defaultActionSheetAssistant = assistant;
67     return self;
68 }
69
70 - (void)dealloc
71 {
72     [_actionHandler release];
73     [_dismissalHandler release];
74
75     [super dealloc];
76 }
77
78 + (instancetype)elementActionWithTitle:(NSString *)title actionHandler:(WKElementActionHandler)handler
79 {
80     return [[[self alloc] _initWithTitle:title actionHandler:^(WKActionSheetAssistant *, _WKActivatedElementInfo *actionInfo) { handler(actionInfo); }
81         type:_WKElementActionTypeCustom assistant:nil] autorelease];
82 }
83
84 #if HAVE(SAFARI_SERVICES_FRAMEWORK)
85 static void addToReadingList(NSURL *targetURL, NSString *title)
86 {
87     if (!title || [title length] == 0)
88         title = [targetURL absoluteString];
89
90     [[getSSReadingListClass() defaultReadingList] addReadingListItemWithURL:targetURL title:title previewText:nil error:nil];
91 }
92 #endif
93
94 + (instancetype)_elementActionWithType:(_WKElementActionType)type title:(NSString *)title actionHandler:(WKElementActionHandler)actionHandler
95 {
96     WKElementActionHandlerInternal handler = ^(WKActionSheetAssistant *, _WKActivatedElementInfo *actionInfo) { actionHandler(actionInfo); };
97     return [[[self alloc] _initWithTitle:title actionHandler:handler type:type assistant:nil] autorelease];
98 }
99
100 + (instancetype)_elementActionWithType:(_WKElementActionType)type customTitle:(NSString *)customTitle assistant:(WKActionSheetAssistant *)assistant
101 {
102     NSString *title;
103     WKElementActionHandlerInternal handler;
104     switch (type) {
105     case _WKElementActionTypeCopy:
106         title = WEB_UI_STRING_KEY("Copy", "Copy (ActionSheet)", "Title for Copy Link or Image action button");
107         handler = ^(WKActionSheetAssistant *assistant, _WKActivatedElementInfo *actionInfo) {
108             [assistant.delegate actionSheetAssistant:assistant performAction:WebKit::SheetAction::Copy];
109         };
110         break;
111     case _WKElementActionTypeOpen:
112         title = WEB_UI_STRING("Open", "Title for Open Link action button");
113         handler = ^(WKActionSheetAssistant *assistant, _WKActivatedElementInfo *actionInfo) {
114             [assistant.delegate actionSheetAssistant:assistant openElementAtLocation:actionInfo._interactionLocation];
115         };
116         break;
117     case _WKElementActionTypeSaveImage:
118         title = WEB_UI_STRING("Save Image", "Title for Save Image action button");
119         handler = ^(WKActionSheetAssistant *assistant, _WKActivatedElementInfo *actionInfo) {
120             [assistant.delegate actionSheetAssistant:assistant performAction:WebKit::SheetAction::SaveImage];
121         };
122         break;
123 #if HAVE(SAFARI_SERVICES_FRAMEWORK)
124     case _WKElementActionTypeAddToReadingList:
125         title = WEB_UI_STRING("Add to Reading List", "Title for Add to Reading List action button");
126         handler = ^(WKActionSheetAssistant *, _WKActivatedElementInfo *actionInfo) {
127             addToReadingList(actionInfo.URL, actionInfo.title);
128         };
129         break;
130 #endif
131     case _WKElementActionTypeShare:
132         title = WEB_UI_STRING("Share…", "Title for Share action button");
133         handler = ^(WKActionSheetAssistant *assistant, _WKActivatedElementInfo *actionInfo) {
134             [assistant.delegate actionSheetAssistant:assistant shareElementWithURL:actionInfo.URL rect:actionInfo.boundingRect];
135         };
136         break;
137     default:
138         [NSException raise:NSInvalidArgumentException format:@"There is no standard web element action of type %ld.", (long)type];
139         return nil;
140     }
141
142     return [[[self alloc] _initWithTitle:(customTitle ? customTitle : title) actionHandler:handler type:type assistant:assistant] autorelease];
143 }
144
145 + (instancetype)_elementActionWithType:(_WKElementActionType)type assistant:(WKActionSheetAssistant *)assistant
146 {
147     return [self _elementActionWithType:type customTitle:nil assistant:assistant];
148 }
149
150 + (instancetype)elementActionWithType:(_WKElementActionType)type customTitle:(NSString *)customTitle
151 {
152     return [self _elementActionWithType:type customTitle:customTitle assistant:nil];
153 }
154
155 + (instancetype)elementActionWithType:(_WKElementActionType)type
156 {
157     return [self elementActionWithType:type customTitle:nil];
158 }
159
160 - (NSString *)title
161 {
162     return _title.get();
163 }
164
165 - (void)_runActionWithElementInfo:(_WKActivatedElementInfo *)info forActionSheetAssistant:(WKActionSheetAssistant *)assistant
166 {
167     _actionHandler(assistant, info);
168 }
169
170 - (void)runActionWithElementInfo:(_WKActivatedElementInfo *)info
171 {
172     [self _runActionWithElementInfo:info forActionSheetAssistant:_defaultActionSheetAssistant.get().get()];
173 }
174
175 @end
176
177 #endif // PLATFORM(IOS_FAMILY)
178
179 #endif // WK_API_ENABLED