DataDetectors' menu items aren't presented in the telephone number menu
authortimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 11 Nov 2014 20:12:02 +0000 (20:12 +0000)
committertimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 11 Nov 2014 20:12:02 +0000 (20:12 +0000)
https://bugs.webkit.org/show_bug.cgi?id=138602
<rdar://problem/18866308>

Reviewed by Beth Dakin.

We currently round-trip the DataDetectors telephone number NSMenuItems
through the very-lossy WebContextMenuItemData, for no real reason.
We should avoid this so that DataDetectors' actual NSMenuItems are
presented in the final menu, so that they can adjust their items after
providing them to us.

* Platform/mac/MenuUtilities.h:
* Platform/mac/MenuUtilities.mm:
(WebKit::menuItemTitleForTelephoneNumber): Deleted.
Stop adjusting the menu item titles, as they come correct now.

(WebKit::menuItemsForTelephoneNumber): Deleted.
(WebKit::menuForTelephoneNumber):
Return a fully-formed menu for the single telephone number case.

* UIProcess/mac/WebPageProxyMac.mm:
(WebKit::WebPageProxy::showTelephoneNumberMenu):
Present the fully-formed menu, without round-tripping through
WebContextMenuItemData, because we do not need to hand the items to
the context menu client (and indeed, were not), and because this
allows us to use the exact items returned by DataDetectors, so they
can keep ahold of the items that we actually present.

* UIProcess/PageClient.h:
* UIProcess/mac/PageClientImpl.h:
* UIProcess/mac/PageClientImpl.mm:
(WebKit::PageClientImpl::showPlatformContextMenu):
Add a Mac-only PageClient function for presenting a NSMenu at a
WKView-relative point.

* English.lproj/Localizable.strings:
Remove a now-unused localized string.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@175966 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/English.lproj/Localizable.strings
Source/WebKit2/ChangeLog
Source/WebKit2/Platform/mac/MenuUtilities.h
Source/WebKit2/Platform/mac/MenuUtilities.mm
Source/WebKit2/UIProcess/PageClient.h
Source/WebKit2/UIProcess/mac/PageClientImpl.h
Source/WebKit2/UIProcess/mac/PageClientImpl.mm
Source/WebKit2/UIProcess/mac/WebPageProxyMac.mm

index 3c13de36eee43cc181685488a086b73027b381b4..eb6f59786b564eaf0c4369ee639647a3a69ce133 100644 (file)
@@ -1,3 +1,14 @@
+2014-11-11  Tim Horton  <timothy_horton@apple.com>
+
+        DataDetectors' menu items aren't presented in the telephone number menu
+        https://bugs.webkit.org/show_bug.cgi?id=138602
+        <rdar://problem/18866308>
+
+        Reviewed by Beth Dakin.
+
+        * English.lproj/Localizable.strings:
+        Remove a now-unused localized string.
+
 2014-11-11  Daniel Bates  <dabates@apple.com>
 
         [Frame Flattening] ASSERT(transaction->view == &view()) fails in RenderBlock::removeFromUpdateScrollInfoAfterLayoutTransaction()
index 011f41faf3ed361f631f0d10241b94d1fa9eb3a0..ddd6000dad96b9d9a82ae513bb01e0db46a3cc7c 100644 (file)
 /* menu item title for phone number */
 "Call Using iPhone:" = "Call Using iPhone:";
 
-/* menu item for making a telephone call to a telephone number */
-"Call “%@” Using iPhone" = "Call “%@” Using iPhone";
-
 /* File Upload alert sheet button string to cancel */
 "Cancel (file upload action sheet)" = "Cancel";
 
index 7f00c79b2e88b94a6e36d3ec8437f3477a15b50b..3b34a2037d8d541561464fa1ac84ae9dbb68ce9a 100644 (file)
@@ -1,3 +1,41 @@
+2014-11-11  Tim Horton  <timothy_horton@apple.com>
+
+        DataDetectors' menu items aren't presented in the telephone number menu
+        https://bugs.webkit.org/show_bug.cgi?id=138602
+        <rdar://problem/18866308>
+
+        Reviewed by Beth Dakin.
+
+        We currently round-trip the DataDetectors telephone number NSMenuItems
+        through the very-lossy WebContextMenuItemData, for no real reason.
+        We should avoid this so that DataDetectors' actual NSMenuItems are
+        presented in the final menu, so that they can adjust their items after
+        providing them to us.
+
+        * Platform/mac/MenuUtilities.h:
+        * Platform/mac/MenuUtilities.mm:
+        (WebKit::menuItemTitleForTelephoneNumber): Deleted.
+        Stop adjusting the menu item titles, as they come correct now.
+
+        (WebKit::menuItemsForTelephoneNumber): Deleted.
+        (WebKit::menuForTelephoneNumber):
+        Return a fully-formed menu for the single telephone number case.
+
+        * UIProcess/mac/WebPageProxyMac.mm:
+        (WebKit::WebPageProxy::showTelephoneNumberMenu):
+        Present the fully-formed menu, without round-tripping through
+        WebContextMenuItemData, because we do not need to hand the items to
+        the context menu client (and indeed, were not), and because this
+        allows us to use the exact items returned by DataDetectors, so they
+        can keep ahold of the items that we actually present.
+
+        * UIProcess/PageClient.h:
+        * UIProcess/mac/PageClientImpl.h:
+        * UIProcess/mac/PageClientImpl.mm:
+        (WebKit::PageClientImpl::showPlatformContextMenu):
+        Add a Mac-only PageClient function for presenting a NSMenu at a
+        WKView-relative point.
+
 2014-11-11  Tim Horton  <timothy_horton@apple.com>
 
         Adopt DDActionContext menu type SPI
index d2d42a71e018efb575756abed72a83b395bf8aee..0805eb451bfd2d62627d119999b92c404685407c 100644 (file)
@@ -32,8 +32,8 @@
 namespace WebKit {
 
 #if ENABLE(TELEPHONE_NUMBER_DETECTION) && PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101000
-NSMenuItem *menuItemForTelephoneNumber(const String& telephoneNumberString);
-NSArray *menuItemsForTelephoneNumber(const String& telephoneNumber);
+NSMenuItem *menuItemForTelephoneNumber(const String& telephoneNumber);
+RetainPtr<NSMenu> menuForTelephoneNumber(const String& telephoneNumber);
 NSString *menuItemTitleForTelephoneNumberGroup();
 #endif
 
index 3dabc68bf5329daeb8d15d5f934062daecd46bc6..6d750d9e7170532e96db3df6f2bd0c97333d24f4 100644 (file)
@@ -53,11 +53,6 @@ namespace WebKit {
 
 #if ENABLE(TELEPHONE_NUMBER_DETECTION) && PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101000
 
-static NSString *menuItemTitleForTelephoneNumber(const String& telephoneNumber)
-{
-    return [NSString stringWithFormat:WEB_UI_STRING("Call “%@” Using iPhone", "menu item for making a telephone call to a telephone number"), formattedPhoneNumberString(telephoneNumber)];
-}
-
 NSString *menuItemTitleForTelephoneNumberGroup()
 {
     return WEB_UI_STRING("Call Using iPhone:", "menu item title for phone number");
@@ -84,9 +79,9 @@ NSMenuItem *menuItemForTelephoneNumber(const String& telephoneNumber)
     return nil;
 }
 
-NSArray *menuItemsForTelephoneNumber(const String& telephoneNumber)
+RetainPtr<NSMenu> menuForTelephoneNumber(const String& telephoneNumber)
 {
-    NSMutableArray *items = [NSMutableArray array];
+    RetainPtr<NSMenu> menu = adoptNS([[NSMenu alloc] init]);
     NSMutableArray *faceTimeItems = [NSMutableArray array];
     NSMenuItem *dialItem = nil;
 
@@ -101,7 +96,6 @@ NSArray *menuItemsForTelephoneNumber(const String& telephoneNumber)
             continue;
 
         if ([actionObject.actionUTI hasPrefix:@"com.apple.dial"]) {
-            item.title = menuItemTitleForTelephoneNumber(telephoneNumber);
             dialItem = item;
             continue;
         }
@@ -111,15 +105,16 @@ NSArray *menuItemsForTelephoneNumber(const String& telephoneNumber)
     }
 
     if (dialItem)
-        [items addObject:dialItem];
+        [menu addItem:dialItem];
 
     if (faceTimeItems.count) {
-        if (items.count)
-            [items addObject:[NSMenuItem separatorItem]];
-        [items addObjectsFromArray:faceTimeItems];
+        if ([menu numberOfItems])
+            [menu addItem:[NSMenuItem separatorItem]];
+        for (NSMenuItem *item in faceTimeItems)
+            [menu addItem:item];
     }
 
-    return items.count ? items : nil;
+    return menu;
 }
 #endif
 
index f09eeaf37968d2ece2a1ff5f0182f9128b19e6b5..f7b0be5fd11cc06ca83f46296da1467a82d20a7c 100644 (file)
@@ -237,6 +237,8 @@ public:
 
     virtual ColorSpaceData colorSpace() = 0;
 
+    virtual void showPlatformContextMenu(NSMenu *, WebCore::IntPoint) = 0;
+
 #if USE(APPKIT)
     virtual WKView* wkView() const = 0;
     virtual void intrinsicContentSizeDidChange(const WebCore::IntSize& intrinsicContentSize) = 0;
index 32cdb58e662e56af5ee6c9ad37e43af60b7acd9e..d25839b810bc7a163189700705faed2e5478780f 100644 (file)
@@ -188,6 +188,7 @@ private:
     virtual void removeNavigationGestureSnapshot() override;
 
     virtual void didPerformActionMenuHitTest(const ActionMenuHitTestResult&, API::Object*) override;
+    virtual void showPlatformContextMenu(NSMenu *, WebCore::IntPoint) override;
 
     WKView *m_wkView;
     WKWebView *m_webView;
index 01a7479eb5508baa4ce8189c8f65e414c8e20e69..68beebe9977c9d6d7d5fa3b12c921a12ad815807 100644 (file)
@@ -766,6 +766,12 @@ void PageClientImpl::didPerformActionMenuHitTest(const ActionMenuHitTestResult&
 #endif
 }
 
+void PageClientImpl::showPlatformContextMenu(NSMenu *menu, IntPoint location)
+{
+    [menu popUpMenuPositioningItem:nil atLocation:location inView:m_wkView];
+}
+
+
 } // namespace WebKit
 
 #endif // PLATFORM(MAC)
index 1c3fed6d7c224bf2069070c61658723c25f66d83..e29ee5681b2127df7fe626ff42e22b616377e149 100644 (file)
@@ -643,21 +643,8 @@ void WebPageProxy::openPDFFromTemporaryFolderWithNativeApplication(const String&
 #if ENABLE(TELEPHONE_NUMBER_DETECTION)
 void WebPageProxy::showTelephoneNumberMenu(const String& telephoneNumber, const WebCore::IntPoint& point)
 {
-    NSArray *menuItems = menuItemsForTelephoneNumber(telephoneNumber);
-
-    Vector<WebContextMenuItemData> items;
-    for (NSMenuItem *item in menuItems) {
-        RetainPtr<NSMenuItem> retainedItem = item;
-        std::function<void()> handler = [retainedItem]() {
-            NSMenuItem *item = retainedItem.get();
-            [[item target] performSelector:[item action] withObject:item];
-        };
-        
-        items.append(WebContextMenuItemData(ContextMenuItem(item), handler));
-    }
-    
-    ContextMenuContextData contextData(TelephoneNumberContext);
-    internalShowContextMenu(point, contextData, items, ContextMenuClientEligibility::NotEligibleForClient, nullptr);
+    RetainPtr<NSMenu> menu = menuForTelephoneNumber(telephoneNumber);
+    m_pageClient.showPlatformContextMenu(menu.get(), point);
 }
 #endif