Use the system string for telephone number menu
[WebKit-https.git] / Source / WebKit2 / Platform / mac / MenuUtilities.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 "MenuUtilities.h"
28
29 #import "StringUtilities.h"
30 #import <WebCore/LocalizedStrings.h>
31 #import <WebCore/SoftLinking.h>
32 #import <WebCore/TUCallSPI.h>
33 #import <objc/runtime.h>
34
35 #if ENABLE(TELEPHONE_NUMBER_DETECTION) && PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101000
36 SOFT_LINK_PRIVATE_FRAMEWORK(DataDetectors)
37 SOFT_LINK_CLASS(DataDetectors, DDAction)
38 SOFT_LINK_CLASS(DataDetectors, DDActionsManager)
39 SOFT_LINK_CONSTANT(DataDetectors, DDBinderPhoneNumberKey, CFStringRef)
40
41 @interface DDAction : NSObject
42 @property (readonly) NSString *actionUTI;
43 @end
44
45 typedef void* DDActionContext;
46
47 @interface DDActionsManager : NSObject
48 + (DDActionsManager *)sharedManager;
49 - (NSArray *)menuItemsForValue:(NSString *)value type:(CFStringRef)type service:(NSString *)service context:(DDActionContext *)context;
50 @end
51 #endif
52
53 namespace WebKit {
54
55 #if ENABLE(TELEPHONE_NUMBER_DETECTION) && PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101000
56
57 NSString *menuItemTitleForTelephoneNumberGroup()
58 {
59     if ([getTUCallClass() respondsToSelector:@selector(supplementalDialTelephonyCallString)])
60         return [getTUCallClass() supplementalDialTelephonyCallString];
61     return WEB_UI_STRING("Call Using iPhone:", "menu item title for phone number");
62 }
63
64 NSMenuItem *menuItemForTelephoneNumber(const String& telephoneNumber)
65 {
66     NSArray *proposedMenu = [[getDDActionsManagerClass() sharedManager] menuItemsForValue:(NSString *)telephoneNumber type:getDDBinderPhoneNumberKey() service:nil context:nil];
67     for (NSMenuItem *item in proposedMenu) {
68         NSDictionary *representedObject = item.representedObject;
69         if (![representedObject isKindOfClass:[NSDictionary class]])
70             continue;
71
72         DDAction *actionObject = [representedObject objectForKey:@"DDAction"];
73         if (![actionObject isKindOfClass:getDDActionClass()])
74             continue;
75
76         if ([actionObject.actionUTI hasPrefix:@"com.apple.dial"]) {
77             item.title = formattedPhoneNumberString(telephoneNumber);
78             return item;
79         }
80     }
81
82     return nil;
83 }
84
85 RetainPtr<NSMenu> menuForTelephoneNumber(const String& telephoneNumber)
86 {
87     RetainPtr<NSMenu> menu = adoptNS([[NSMenu alloc] init]);
88     NSMutableArray *faceTimeItems = [NSMutableArray array];
89     NSMenuItem *dialItem = nil;
90
91     NSArray *proposedMenu = [[getDDActionsManagerClass() sharedManager] menuItemsForValue:(NSString *)telephoneNumber type:getDDBinderPhoneNumberKey() service:nil context:nil];
92     for (NSMenuItem *item in proposedMenu) {
93         NSDictionary *representedObject = item.representedObject;
94         if (![representedObject isKindOfClass:[NSDictionary class]])
95             continue;
96
97         DDAction *actionObject = [representedObject objectForKey:@"DDAction"];
98         if (![actionObject isKindOfClass:getDDActionClass()])
99             continue;
100
101         if ([actionObject.actionUTI hasPrefix:@"com.apple.dial"]) {
102             dialItem = item;
103             continue;
104         }
105
106         if ([actionObject.actionUTI hasPrefix:@"com.apple.facetime"])
107             [faceTimeItems addObject:item];
108     }
109
110     if (dialItem)
111         [menu addItem:dialItem];
112
113     if (faceTimeItems.count) {
114         if ([menu numberOfItems])
115             [menu addItem:[NSMenuItem separatorItem]];
116         for (NSMenuItem *item in faceTimeItems)
117             [menu addItem:item];
118     }
119
120     return menu;
121 }
122 #endif
123
124 } // namespace WebKit