- Revision
- 169170
- Author
- beid...@apple.com
- Date
- 2014-05-21 10:37:48 -0700 (Wed, 21 May 2014)
Log Message
Special handling of telephone number detection menu.
<rdar://problem/16967971> and https://bugs.webkit.org/show_bug.cgi?id=133143
Reviewed by Geoff Garen.
Add a bool to ContextMenuContextData to represent telephone number menus:
* Shared/ContextMenuContextData.cpp:
(WebKit::ContextMenuContextData::ContextMenuContextData):
(WebKit::ContextMenuContextData::operator=):
(WebKit::ContextMenuContextData::encode):
(WebKit::ContextMenuContextData::decode):
* Shared/ContextMenuContextData.h:
(WebKit::ContextMenuContextData::ContextMenuContextData):
(WebKit::ContextMenuContextData::isTelephoneNumberContext):
* UIProcess/mac/WebContextMenuProxyMac.mm:
(WebKit::WebContextMenuProxyMac::showContextMenu): If the menu is a telephone
number menu then display it using a specific AppKit API.
* UIProcess/mac/WebPageProxyMac.mm:
(WebKit::WebPageProxy::showTelephoneNumberMenu): Filter the array of menu items
through a new WKSI call, and then show it using a telephone number context.
Modified Paths
Diff
Modified: trunk/Source/WebKit2/ChangeLog (169169 => 169170)
--- trunk/Source/WebKit2/ChangeLog 2014-05-21 17:30:33 UTC (rev 169169)
+++ trunk/Source/WebKit2/ChangeLog 2014-05-21 17:37:48 UTC (rev 169170)
@@ -1,3 +1,28 @@
+2014-05-21 Brady Eidson <beid...@apple.com>
+
+ Special handling of telephone number detection menu.
+ <rdar://problem/16967971> and https://bugs.webkit.org/show_bug.cgi?id=133143
+
+ Reviewed by Geoff Garen.
+
+ Add a bool to ContextMenuContextData to represent telephone number menus:
+ * Shared/ContextMenuContextData.cpp:
+ (WebKit::ContextMenuContextData::ContextMenuContextData):
+ (WebKit::ContextMenuContextData::operator=):
+ (WebKit::ContextMenuContextData::encode):
+ (WebKit::ContextMenuContextData::decode):
+ * Shared/ContextMenuContextData.h:
+ (WebKit::ContextMenuContextData::ContextMenuContextData):
+ (WebKit::ContextMenuContextData::isTelephoneNumberContext):
+
+ * UIProcess/mac/WebContextMenuProxyMac.mm:
+ (WebKit::WebContextMenuProxyMac::showContextMenu): If the menu is a telephone
+ number menu then display it using a specific AppKit API.
+
+ * UIProcess/mac/WebPageProxyMac.mm:
+ (WebKit::WebPageProxy::showTelephoneNumberMenu): Filter the array of menu items
+ through a new WKSI call, and then show it using a telephone number context.
+
2014-05-21 Alexey Proskuryakov <a...@apple.com>
[Mac] REGRESSION (Async text input): Asian text input doesn't work in Flash
Modified: trunk/Source/WebKit2/Shared/ContextMenuContextData.cpp (169169 => 169170)
--- trunk/Source/WebKit2/Shared/ContextMenuContextData.cpp 2014-05-21 17:30:33 UTC (rev 169169)
+++ trunk/Source/WebKit2/Shared/ContextMenuContextData.cpp 2014-05-21 17:37:48 UTC (rev 169170)
@@ -38,14 +38,24 @@
namespace WebKit {
ContextMenuContextData::ContextMenuContextData()
+ : m_isTelephoneNumberContext(false)
#if ENABLE(SERVICE_CONTROLS)
- : m_selectionIsEditable(false)
+ , m_selectionIsEditable(false)
#endif
{
}
+ContextMenuContextData::ContextMenuContextData(TelephoneNumberContextTag)
+ : m_isTelephoneNumberContext(true)
+#if ENABLE(SERVICE_CONTROLS)
+ , m_selectionIsEditable(false)
+#endif
+{
+}
+
ContextMenuContextData::ContextMenuContextData(const ContextMenuContext& context)
: m_webHitTestResultData(WebHitTestResult::Data(context.hitTestResult()))
+ , m_isTelephoneNumberContext(false)
#if ENABLE(SERVICE_CONTROLS)
, m_selectionIsEditable(false)
#endif
@@ -69,6 +79,8 @@
ContextMenuContextData& ContextMenuContextData::operator=(const ContextMenuContextData& other)
{
m_webHitTestResultData = other.m_webHitTestResultData;
+ m_isTelephoneNumberContext = other.m_isTelephoneNumberContext;
+
#if ENABLE(SERVICE_CONTROLS)
m_controlledImageHandle.clear();
@@ -76,6 +88,8 @@
RefPtr<ShareableBitmap> bitmap = ShareableBitmap::create(other.m_controlledImageHandle);
bitmap->createHandle(m_controlledImageHandle);
}
+
+ m_selectionIsEditable = other.m_selectionIsEditable;
#endif
return *this;
@@ -84,6 +98,11 @@
void ContextMenuContextData::encode(IPC::ArgumentEncoder& encoder) const
{
encoder << m_webHitTestResultData;
+
+#if ENABLE(TELEPHONE_NUMBER_DETECTION)
+ encoder << m_isTelephoneNumberContext;
+#endif
+
#if ENABLE(SERVICE_CONTROLS)
encoder << m_controlledImageHandle;
#endif
@@ -93,7 +112,12 @@
{
if (!decoder.decode(contextMenuContextData.m_webHitTestResultData))
return false;
-
+
+#if ENABLE(TELEPHONE_NUMBER_DETECTION)
+ if (!decoder.decode(contextMenuContextData.m_isTelephoneNumberContext))
+ return false;
+#endif
+
#if ENABLE(SERVICE_CONTROLS)
if (!decoder.decode(contextMenuContextData.m_controlledImageHandle))
return false;
Modified: trunk/Source/WebKit2/Shared/ContextMenuContextData.h (169169 => 169170)
--- trunk/Source/WebKit2/Shared/ContextMenuContextData.h 2014-05-21 17:30:33 UTC (rev 169169)
+++ trunk/Source/WebKit2/Shared/ContextMenuContextData.h 2014-05-21 17:37:48 UTC (rev 169170)
@@ -43,9 +43,12 @@
namespace WebKit {
+enum TelephoneNumberContextTag { TelephoneNumberContext };
+
class ContextMenuContextData {
public:
ContextMenuContextData();
+ ContextMenuContextData(TelephoneNumberContextTag);
ContextMenuContextData(const WebCore::ContextMenuContext&);
ContextMenuContextData(const ContextMenuContextData&);
@@ -55,7 +58,8 @@
#if ENABLE(SERVICE_CONTROLS)
ContextMenuContextData(const Vector<uint8_t>& selectionData, bool isEditable)
- : m_controlledSelectionData(selectionData)
+ : m_isTelephoneNumberContext(false)
+ , m_controlledSelectionData(selectionData)
, m_selectionIsEditable(isEditable)
{ }
@@ -66,12 +70,17 @@
bool needsServicesMenu() const { return !m_controlledImageHandle.isNull() || !m_controlledSelectionData.isEmpty(); }
#endif
+#if ENABLE(TELEPHONE_NUMBER_DETECTION)
+ bool isTelephoneNumberContext() const { return m_isTelephoneNumberContext; }
+#endif
+
void encode(IPC::ArgumentEncoder&) const;
static bool decode(IPC::ArgumentDecoder&, ContextMenuContextData&);
private:
WebHitTestResult::Data m_webHitTestResultData;
+ bool m_isTelephoneNumberContext;
#if ENABLE(SERVICE_CONTROLS)
ShareableBitmap::Handle m_controlledImageHandle;
Modified: trunk/Source/WebKit2/UIProcess/mac/WebContextMenuProxyMac.mm (169169 => 169170)
--- trunk/Source/WebKit2/UIProcess/mac/WebContextMenuProxyMac.mm 2014-05-21 17:30:33 UTC (rev 169169)
+++ trunk/Source/WebKit2/UIProcess/mac/WebContextMenuProxyMac.mm 2014-05-21 17:37:48 UTC (rev 169170)
@@ -457,6 +457,17 @@
[m_popup attachPopUpWithFrame:menuRect inView:m_webView];
NSMenu *menu = m_servicesMenu ? m_servicesMenu.get() : [m_popup menu];
+
+ // Telephone number menus must use the [NSMenu popUpMenuPositioningItem:atLocation:inView:] API.
+ // FIXME: That API is better than WKPopupContextMenu. In the future all menus should use either it
+ // or the [NSMenu popUpContextMenu:withEvent:forView:] API, depending on the menu type.
+ // Then we could get rid of NSPopUpButtonCell, custom metrics, and WKPopupContextMenu.
+ if (context.isTelephoneNumberContext()) {
+ [menu popUpMenuPositioningItem:nil atLocation:menuLocation inView:m_webView];
+ hideContextMenu();
+ return;
+ }
+
#else
[m_popup attachPopUpWithFrame:menuRect inView:m_webView];
Modified: trunk/Source/WebKit2/UIProcess/mac/WebPageProxyMac.mm (169169 => 169170)
--- trunk/Source/WebKit2/UIProcess/mac/WebPageProxyMac.mm 2014-05-21 17:30:33 UTC (rev 169169)
+++ trunk/Source/WebKit2/UIProcess/mac/WebPageProxyMac.mm 2014-05-21 17:37:48 UTC (rev 169170)
@@ -63,8 +63,6 @@
SOFT_LINK_PRIVATE_FRAMEWORK_OPTIONAL(DataDetectors)
SOFT_LINK_CLASS(DataDetectors, DDActionsManager)
-SOFT_LINK_CLASS(DataDetectors, DDAction)
-SOFT_LINK_CLASS(DataDetectors, DDSeparatorAction)
SOFT_LINK_CONSTANT(DataDetectors, DDBinderPhoneNumberKey, CFStringRef)
typedef void* DDActionContext;
@@ -74,10 +72,6 @@
- (NSArray *) menuItemsForValue:(NSString *)value type:(CFStringRef)type service:(NSString *)service context:(DDActionContext *)context;
@end
-@interface DDAction : NSObject
-@property (readonly) NSString *actionUTI;
-@end
-
#define MESSAGE_CHECK(assertion) MESSAGE_CHECK_BASE(assertion, process().connection())
using namespace WebCore;
@@ -663,25 +657,10 @@
void WebPageProxy::showTelephoneNumberMenu(const String& telephoneNumber, const WebCore::IntPoint& point)
{
NSArray *menuItems = [[getDDActionsManagerClass() sharedManager] menuItemsForValue:(NSString *)telephoneNumber type:getDDBinderPhoneNumberKey() service:nil context:nil];
+ menuItems = WKTelephoneNumberMenuFromProposedMenu(menuItems, telephoneNumber);
Vector<WebContextMenuItemData> items;
for (NSMenuItem *item in menuItems) {
- NSDictionary *representedObject = [item representedObject];
- if (![representedObject isKindOfClass:[NSDictionary class]])
- continue;
-
- DDAction *actionObject = [representedObject objectForKey:@"DDAction"];
- if (![actionObject isKindOfClass:getDDActionClass()])
- continue;
-
- // Skip menu items whose actions have anything to do with contacts.
- if ([[actionObject actionUTI] hasPrefix:@"com.apple.contact."])
- continue;
-
- // Skip seperator items.
- if ([actionObject isKindOfClass:getDDSeparatorActionClass()])
- continue;
-
RetainPtr<NSMenuItem> retainedItem = item;
std::function<void()> handler = [retainedItem]() {
NSMenuItem *item = retainedItem.get();
@@ -691,7 +670,7 @@
items.append(WebContextMenuItemData(ContextMenuItem(item), handler));
}
- ContextMenuContextData contextData;
+ ContextMenuContextData contextData(TelephoneNumberContext);
internalShowContextMenu(point, contextData, items, ContextMenuClientEligibility::NotEligibleForClient, nullptr);
}
#endif